/ Hex Artifact Content
Login

Artifact f4a9ac8396395a9e281e182dd32fc9b3b19f6762a9eef468137369def3ad9a2c:


0000: 2f 2a 0a 2a 2a 20 32 30 31 38 20 4d 61 79 20 30  /*.** 2018 May 0
0010: 38 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  8.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
0180: 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 6e  liteInt.h"..#ifn
0190: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
01a0: 57 49 4e 44 4f 57 46 55 4e 43 0a 0a 2f 2a 0a 2a  WINDOWFUNC../*.*
01b0: 2a 20 53 45 4c 45 43 54 20 52 45 57 52 49 54 49  * SELECT REWRITI
01c0: 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 41 6e 79 20 53  NG.**.**   Any S
01d0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
01e0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  that contains on
01f0: 65 20 6f 72 20 6d 6f 72 65 20 77 69 6e 64 6f 77  e or more window
0200: 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 0a 2a 2a   functions in.**
0210: 20 20 20 65 69 74 68 65 72 20 74 68 65 20 73 65     either the se
0220: 6c 65 63 74 20 6c 69 73 74 20 6f 72 20 4f 52 44  lect list or ORD
0230: 45 52 20 42 59 20 63 6c 61 75 73 65 20 28 74 68  ER BY clause (th
0240: 65 20 6f 6e 6c 79 20 74 77 6f 20 70 6c 61 63 65  e only two place
0250: 73 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20 66 75  s window.**   fu
0260: 6e 63 74 69 6f 6e 73 20 6d 61 79 20 62 65 20 75  nctions may be u
0270: 73 65 64 29 20 69 73 20 74 72 61 6e 73 66 6f 72  sed) is transfor
0280: 6d 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20  med by function 
0290: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 52 65 77  sqlite3WindowRew
02a0: 72 69 74 65 28 29 0a 2a 2a 20 20 20 69 6e 20 6f  rite().**   in o
02b0: 72 64 65 72 20 74 6f 20 73 75 70 70 6f 72 74 20  rder to support 
02c0: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
02d0: 70 72 6f 63 65 73 73 69 6e 67 2e 20 46 6f 72 20  processing. For 
02e0: 65 78 61 6d 70 6c 65 2c 20 77 69 74 68 20 74 68  example, with th
02f0: 65 0a 2a 2a 20 20 20 73 63 68 65 6d 61 3a 0a 2a  e.**   schema:.*
0300: 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20  *.**     CREATE 
0310: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63  TABLE t1(a, b, c
0320: 2c 20 64 2c 20 65 2c 20 66 2c 20 67 29 3b 0a 2a  , d, e, f, g);.*
0330: 2a 0a 2a 2a 20 20 20 74 68 65 20 73 74 61 74 65  *.**   the state
0340: 6d 65 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment:.**.**     
0350: 53 45 4c 45 43 54 20 61 2b 31 2c 20 6d 61 78 28  SELECT a+1, max(
0360: 62 29 20 4f 56 45 52 20 28 50 41 52 54 49 54 49  b) OVER (PARTITI
0370: 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20 42 59  ON BY c ORDER BY
0380: 20 64 29 20 46 52 4f 4d 20 74 31 20 4f 52 44 45   d) FROM t1 ORDE
0390: 52 20 42 59 20 65 3b 0a 2a 2a 0a 2a 2a 20 20 20  R BY e;.**.**   
03a0: 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74  is transformed t
03b0: 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  o:.**.**     SEL
03c0: 45 43 54 20 61 2b 31 2c 20 6d 61 78 28 62 29 20  ECT a+1, max(b) 
03d0: 4f 56 45 52 20 28 50 41 52 54 49 54 49 4f 4e 20  OVER (PARTITION 
03e0: 42 59 20 63 20 4f 52 44 45 52 20 42 59 20 64 29  BY c ORDER BY d)
03f0: 20 46 52 4f 4d 20 28 0a 2a 2a 20 20 20 20 20 20   FROM (.**      
0400: 20 20 20 53 45 4c 45 43 54 20 61 2c 20 65 2c 20     SELECT a, e, 
0410: 63 2c 20 64 2c 20 62 20 46 52 4f 4d 20 74 31 20  c, d, b FROM t1 
0420: 4f 52 44 45 52 20 42 59 20 63 2c 20 64 0a 2a 2a  ORDER BY c, d.**
0430: 20 20 20 20 20 29 20 4f 52 44 45 52 20 42 59 20       ) ORDER BY 
0440: 65 3b 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66  e;.**.**   The f
0450: 6c 61 74 74 65 6e 69 6e 67 20 6f 70 74 69 6d 69  lattening optimi
0460: 7a 61 74 69 6f 6e 20 69 73 20 64 69 73 61 62 6c  zation is disabl
0470: 65 64 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69  ed when processi
0480: 6e 67 20 74 68 69 73 20 74 72 61 6e 73 66 6f 72  ng this transfor
0490: 6d 65 64 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  med.**   SELECT 
04a0: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
04b0: 61 6c 6c 6f 77 73 20 74 68 65 20 69 6d 70 6c 65  allows the imple
04c0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
04d0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
04e0: 0a 2a 2a 20 20 20 28 69 6e 20 74 68 69 73 20 63  .**   (in this c
04f0: 61 73 65 20 6d 61 78 28 29 29 20 74 6f 20 70 72  ase max()) to pr
0500: 6f 63 65 73 73 20 72 6f 77 73 20 73 6f 72 74 65  ocess rows sorte
0510: 64 20 69 6e 20 6f 72 64 65 72 20 6f 66 20 28 63  d in order of (c
0520: 2c 20 64 29 2c 20 77 68 69 63 68 0a 2a 2a 20 20  , d), which.**  
0530: 20 6d 61 6b 65 73 20 74 68 69 6e 67 73 20 65 61   makes things ea
0540: 73 69 65 72 20 66 6f 72 20 6f 62 76 69 6f 75 73  sier for obvious
0550: 20 72 65 61 73 6f 6e 73 2e 20 4d 6f 72 65 20 67   reasons. More g
0560: 65 6e 65 72 61 6c 6c 79 3a 0a 2a 2a 0a 2a 2a 20  enerally:.**.** 
0570: 20 20 20 20 2a 20 46 52 4f 4d 2c 20 57 48 45 52      * FROM, WHER
0580: 45 2c 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20  E, GROUP BY and 
0590: 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73 20 61  HAVING clauses a
05a0: 72 65 20 61 6c 6c 20 6d 6f 76 65 64 20 74 6f 20  re all moved to 
05b0: 0a 2a 2a 20 20 20 20 20 20 20 74 68 65 20 73 75  .**       the su
05c0: 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  b-query..**.**  
05d0: 20 20 20 2a 20 4f 52 44 45 52 20 42 59 2c 20 4c     * ORDER BY, L
05e0: 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
05f0: 72 65 6d 61 69 6e 20 70 61 72 74 20 6f 66 20 74  remain part of t
0600: 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 2e  he parent query.
0610: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 65 72  .**.**     * Ter
0620: 6d 69 6e 61 6c 73 20 66 72 6f 6d 20 65 61 63 68  minals from each
0630: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
0640: 6f 6e 20 74 72 65 65 73 20 74 68 61 74 20 6d 61  on trees that ma
0650: 6b 65 20 75 70 20 74 68 65 20 0a 2a 2a 20 20 20  ke up the .**   
0660: 20 20 20 20 73 65 6c 65 63 74 2d 6c 69 73 74 20      select-list 
0670: 61 6e 64 20 4f 52 44 45 52 20 42 59 20 65 78 70  and ORDER BY exp
0680: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20  ressions in the 
0690: 70 61 72 65 6e 74 20 71 75 65 72 79 20 61 72 65  parent query are
06a0: 0a 2a 2a 20 20 20 20 20 20 20 73 65 6c 65 63 74  .**       select
06b0: 65 64 20 62 79 20 74 68 65 20 73 75 62 2d 71 75  ed by the sub-qu
06c0: 65 72 79 2e 20 46 6f 72 20 74 68 65 20 70 75 72  ery. For the pur
06d0: 70 6f 73 65 73 20 6f 66 20 74 68 65 20 74 72 61  poses of the tra
06e0: 6e 73 66 6f 72 6d 61 74 69 6f 6e 2c 0a 2a 2a 20  nsformation,.** 
06f0: 20 20 20 20 20 20 74 65 72 6d 69 6e 61 6c 73 20        terminals 
0700: 61 72 65 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72  are column refer
0710: 65 6e 63 65 73 20 61 6e 64 20 61 67 67 72 65 67  ences and aggreg
0720: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  ate functions..*
0730: 2a 0a 2a 2a 20 20 20 49 66 20 74 68 65 72 65 20  *.**   If there 
0740: 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  is more than one
0750: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
0760: 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 74   in the SELECT t
0770: 68 61 74 20 75 73 65 73 0a 2a 2a 20 20 20 74 68  hat uses.**   th
0780: 65 20 73 61 6d 65 20 77 69 6e 64 6f 77 20 64 65  e same window de
0790: 63 6c 61 72 61 74 69 6f 6e 20 28 74 68 65 20 4f  claration (the O
07a0: 56 45 52 20 62 69 74 29 2c 20 74 68 65 6e 20 61  VER bit), then a
07b0: 20 73 69 6e 67 6c 65 20 73 63 61 6e 20 6d 61 79   single scan may
07c0: 0a 2a 2a 20 20 20 62 65 20 75 73 65 64 20 74 6f  .**   be used to
07d0: 20 70 72 6f 63 65 73 73 20 6d 6f 72 65 20 74 68   process more th
07e0: 61 6e 20 6f 6e 65 20 77 69 6e 64 6f 77 20 66 75  an one window fu
07f0: 6e 63 74 69 6f 6e 2e 20 46 6f 72 20 65 78 61 6d  nction. For exam
0800: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ple:.**.**     S
0810: 45 4c 45 43 54 20 6d 61 78 28 62 29 20 4f 56 45  ELECT max(b) OVE
0820: 52 20 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20  R (PARTITION BY 
0830: 63 20 4f 52 44 45 52 20 42 59 20 64 29 2c 20 0a  c ORDER BY d), .
0840: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 6d 69  **            mi
0850: 6e 28 65 29 20 4f 56 45 52 20 28 50 41 52 54 49  n(e) OVER (PARTI
0860: 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20  TION BY c ORDER 
0870: 42 59 20 64 29 20 0a 2a 2a 20 20 20 20 20 46 52  BY d) .**     FR
0880: 4f 4d 20 74 31 3b 0a 2a 2a 0a 2a 2a 20 20 20 69  OM t1;.**.**   i
0890: 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  s transformed in
08a0: 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73   the same way as
08b0: 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f   the example abo
08c0: 76 65 2e 20 48 6f 77 65 76 65 72 3a 0a 2a 2a 0a  ve. However:.**.
08d0: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 6d 61  **     SELECT ma
08e0: 78 28 62 29 20 4f 56 45 52 20 28 50 41 52 54 49  x(b) OVER (PARTI
08f0: 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20  TION BY c ORDER 
0900: 42 59 20 64 29 2c 20 0a 2a 2a 20 20 20 20 20 20  BY d), .**      
0910: 20 20 20 20 20 20 6d 69 6e 28 65 29 20 4f 56 45        min(e) OVE
0920: 52 20 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20  R (PARTITION BY 
0930: 61 20 4f 52 44 45 52 20 42 59 20 62 29 20 0a 2a  a ORDER BY b) .*
0940: 2a 20 20 20 20 20 46 52 4f 4d 20 74 31 3b 0a 2a  *     FROM t1;.*
0950: 2a 0a 2a 2a 20 20 20 4d 75 73 74 20 62 65 20 74  *.**   Must be t
0960: 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 2a  ransformed to:.*
0970: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
0980: 6d 61 78 28 62 29 20 4f 56 45 52 20 28 50 41 52  max(b) OVER (PAR
0990: 54 49 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45  TITION BY c ORDE
09a0: 52 20 42 59 20 64 29 20 46 52 4f 4d 20 28 0a 2a  R BY d) FROM (.*
09b0: 2a 20 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  *         SELECT
09c0: 20 65 2c 20 6d 69 6e 28 65 29 20 4f 56 45 52 20   e, min(e) OVER 
09d0: 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20 61 20  (PARTITION BY a 
09e0: 4f 52 44 45 52 20 42 59 20 62 29 2c 20 63 2c 20  ORDER BY b), c, 
09f0: 64 2c 20 62 20 46 52 4f 4d 0a 2a 2a 20 20 20 20  d, b FROM.**    
0a00: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 2c         SELECT a,
0a10: 20 65 2c 20 63 2c 20 64 2c 20 62 20 46 52 4f 4d   e, c, d, b FROM
0a20: 20 74 31 20 4f 52 44 45 52 20 42 59 20 61 2c 20   t1 ORDER BY a, 
0a30: 62 0a 2a 2a 20 20 20 20 20 20 20 20 20 29 20 4f  b.**         ) O
0a40: 52 44 45 52 20 42 59 20 63 2c 20 64 0a 2a 2a 20  RDER BY c, d.** 
0a50: 20 20 20 20 29 20 4f 52 44 45 52 20 42 59 20 65      ) ORDER BY e
0a60: 3b 0a 2a 2a 0a 2a 2a 20 20 20 73 6f 20 74 68 61  ;.**.**   so tha
0a70: 74 20 62 6f 74 68 20 6d 69 6e 28 29 20 61 6e 64  t both min() and
0a80: 20 6d 61 78 28 29 20 6d 61 79 20 70 72 6f 63 65   max() may proce
0a90: 73 73 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6f  ss rows in the o
0aa0: 72 64 65 72 20 64 65 66 69 6e 65 64 20 62 79 0a  rder defined by.
0ab0: 2a 2a 20 20 20 74 68 65 69 72 20 72 65 73 70 65  **   their respe
0ac0: 63 74 69 76 65 20 77 69 6e 64 6f 77 20 64 65 63  ctive window dec
0ad0: 6c 61 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  larations..**.**
0ae0: 20 49 4e 54 45 52 46 41 43 45 20 57 49 54 48 20   INTERFACE WITH 
0af0: 53 45 4c 45 43 54 2e 43 0a 2a 2a 0a 2a 2a 20 20  SELECT.C.**.**  
0b00: 20 57 68 65 6e 20 70 72 6f 63 65 73 73 69 6e 67   When processing
0b10: 20 74 68 65 20 72 65 77 72 69 74 74 65 6e 20 53   the rewritten S
0b20: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
0b30: 20 63 6f 64 65 20 69 6e 20 73 65 6c 65 63 74 2e   code in select.
0b40: 63 20 63 61 6c 6c 73 0a 2a 2a 20 20 20 73 71 6c  c calls.**   sql
0b50: 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
0b60: 20 74 6f 20 62 65 67 69 6e 20 69 74 65 72 61 74   to begin iterat
0b70: 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68 65 20  ing through the 
0b80: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 0a 2a  results of the.*
0b90: 2a 20 20 20 73 75 62 2d 71 75 65 72 79 2c 20 77  *   sub-query, w
0ba0: 68 69 63 68 20 69 73 20 61 6c 77 61 79 73 20 69  hich is always i
0bb0: 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
0bc0: 63 6f 2d 72 6f 75 74 69 6e 65 2e 20 49 74 20 74  co-routine. It t
0bd0: 68 65 6e 20 63 61 6c 6c 73 0a 2a 2a 20 20 20 73  hen calls.**   s
0be0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65  qlite3WindowCode
0bf0: 53 74 65 70 28 29 20 74 6f 20 70 72 6f 63 65 73  Step() to proces
0c00: 73 20 72 6f 77 73 20 61 6e 64 20 66 69 6e 69 73  s rows and finis
0c10: 68 20 74 68 65 20 73 63 61 6e 20 62 79 20 63 61  h the scan by ca
0c20: 6c 6c 69 6e 67 0a 2a 2a 20 20 20 73 71 6c 69 74  lling.**   sqlit
0c30: 65 33 57 68 65 72 65 45 6e 64 28 29 2e 0a 2a 2a  e3WhereEnd()..**
0c40: 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 57 69 6e  .**   sqlite3Win
0c50: 64 6f 77 43 6f 64 65 53 74 65 70 28 29 20 67 65  dowCodeStep() ge
0c60: 6e 65 72 61 74 65 73 20 56 4d 20 63 6f 64 65 20  nerates VM code 
0c70: 73 6f 20 74 68 61 74 2c 20 66 6f 72 20 65 61 63  so that, for eac
0c80: 68 20 72 6f 77 20 72 65 74 75 72 6e 65 64 0a 2a  h row returned.*
0c90: 2a 20 20 20 62 79 20 74 68 65 20 73 75 62 2d 71  *   by the sub-q
0ca0: 75 65 72 79 20 61 20 73 75 62 2d 72 6f 75 74 69  uery a sub-routi
0cb0: 6e 65 20 28 4f 50 5f 47 6f 73 75 62 29 20 63 6f  ne (OP_Gosub) co
0cc0: 64 65 64 20 62 79 20 73 65 6c 65 63 74 2e 63 20  ded by select.c 
0cd0: 69 73 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2a 20 20  is invoked..**  
0ce0: 20 57 68 65 6e 20 74 68 65 20 73 75 62 2d 72 6f   When the sub-ro
0cf0: 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64  utine is invoked
0d00: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 68  :.**.**     * Th
0d10: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 61 6c 6c  e results of all
0d20: 20 77 69 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e   window-function
0d30: 73 20 66 6f 72 20 74 68 65 20 72 6f 77 20 61 72  s for the row ar
0d40: 65 20 73 74 6f 72 65 64 0a 2a 2a 20 20 20 20 20  e stored.**     
0d50: 20 20 69 6e 20 74 68 65 20 61 73 73 6f 63 69 61    in the associa
0d60: 74 65 64 20 57 69 6e 64 6f 77 2e 72 65 67 52 65  ted Window.regRe
0d70: 73 75 6c 74 20 72 65 67 69 73 74 65 72 73 2e 0a  sult registers..
0d80: 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 68 65 20  **.**     * The 
0d90: 72 65 71 75 69 72 65 64 20 74 65 72 6d 69 6e 61  required termina
0da0: 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f  l values are sto
0db0: 72 65 64 20 69 6e 20 74 68 65 20 63 75 72 72 65  red in the curre
0dc0: 6e 74 20 72 6f 77 20 6f 66 0a 2a 2a 20 20 20 20  nt row of.**    
0dd0: 20 20 20 74 65 6d 70 20 74 61 62 6c 65 20 57 69     temp table Wi
0de0: 6e 64 6f 77 2e 69 45 70 68 43 73 72 2e 0a 2a 2a  ndow.iEphCsr..**
0df0: 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 63 61  .**   In some ca
0e00: 73 65 73 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  ses, depending o
0e10: 6e 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61  n the window fra
0e20: 6d 65 20 61 6e 64 20 74 68 65 20 73 70 65 63 69  me and the speci
0e30: 66 69 63 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20  fic window.**   
0e40: 66 75 6e 63 74 69 6f 6e 73 20 69 6e 76 6f 6b 65  functions invoke
0e50: 64 2c 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  d, sqlite3Window
0e60: 43 6f 64 65 53 74 65 70 28 29 20 63 61 63 68 65  CodeStep() cache
0e70: 73 20 65 61 63 68 20 65 6e 74 69 72 65 20 70 61  s each entire pa
0e80: 72 74 69 74 69 6f 6e 0a 2a 2a 20 20 20 69 6e 20  rtition.**   in 
0e90: 61 20 74 65 6d 70 20 74 61 62 6c 65 20 62 65 66  a temp table bef
0ea0: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 61 6e  ore returning an
0eb0: 79 20 72 6f 77 73 2e 20 49 6e 20 6f 74 68 65 72  y rows. In other
0ec0: 20 63 61 73 65 73 20 69 74 20 64 6f 65 73 20 6e   cases it does n
0ed0: 6f 74 2e 0a 2a 2a 20 20 20 54 68 69 73 20 64 65  ot..**   This de
0ee0: 74 61 69 6c 20 69 73 20 65 6e 63 61 70 73 75 6c  tail is encapsul
0ef0: 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 69 73  ated within this
0f00: 20 66 69 6c 65 2c 20 74 68 65 20 63 6f 64 65 20   file, the code 
0f10: 67 65 6e 65 72 61 74 65 64 20 62 79 0a 2a 2a 20  generated by.** 
0f20: 20 20 73 65 6c 65 63 74 2e 63 20 69 73 20 74 68    select.c is th
0f30: 65 20 73 61 6d 65 20 69 6e 20 65 69 74 68 65 72  e same in either
0f40: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 55 49   case..**.** BUI
0f50: 4c 54 2d 49 4e 20 57 49 4e 44 4f 57 20 46 55 4e  LT-IN WINDOW FUN
0f60: 43 54 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 54  CTIONS.**.**   T
0f70: 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  his implementati
0f80: 6f 6e 20 66 65 61 74 75 72 65 73 20 74 68 65 20  on features the 
0f90: 66 6f 6c 6c 6f 77 69 6e 67 20 62 75 69 6c 74 2d  following built-
0fa0: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
0fb0: 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72  ons:.**.**     r
0fc0: 6f 77 5f 6e 75 6d 62 65 72 28 29 0a 2a 2a 20 20  ow_number().**  
0fd0: 20 20 20 72 61 6e 6b 28 29 0a 2a 2a 20 20 20 20     rank().**    
0fe0: 20 64 65 6e 73 65 5f 72 61 6e 6b 28 29 0a 2a 2a   dense_rank().**
0ff0: 20 20 20 20 20 70 65 72 63 65 6e 74 5f 72 61 6e       percent_ran
1000: 6b 28 29 0a 2a 2a 20 20 20 20 20 63 75 6d 65 5f  k().**     cume_
1010: 64 69 73 74 28 29 0a 2a 2a 20 20 20 20 20 6e 74  dist().**     nt
1020: 69 6c 65 28 4e 29 0a 2a 2a 20 20 20 20 20 6c 65  ile(N).**     le
1030: 61 64 28 65 78 70 72 20 5b 2c 20 6f 66 66 73 65  ad(expr [, offse
1040: 74 20 5b 2c 20 64 65 66 61 75 6c 74 5d 5d 29 0a  t [, default]]).
1050: 2a 2a 20 20 20 20 20 6c 61 67 28 65 78 70 72 20  **     lag(expr 
1060: 5b 2c 20 6f 66 66 73 65 74 20 5b 2c 20 64 65 66  [, offset [, def
1070: 61 75 6c 74 5d 5d 29 0a 2a 2a 20 20 20 20 20 66  ault]]).**     f
1080: 69 72 73 74 5f 76 61 6c 75 65 28 65 78 70 72 29  irst_value(expr)
1090: 0a 2a 2a 20 20 20 20 20 6c 61 73 74 5f 76 61 6c  .**     last_val
10a0: 75 65 28 65 78 70 72 29 0a 2a 2a 20 20 20 20 20  ue(expr).**     
10b0: 6e 74 68 5f 76 61 6c 75 65 28 65 78 70 72 2c 20  nth_value(expr, 
10c0: 4e 29 0a 2a 2a 20 20 20 0a 2a 2a 20 20 20 54 68  N).**   .**   Th
10d0: 65 73 65 20 61 72 65 20 74 68 65 20 73 61 6d 65  ese are the same
10e0: 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77   built-in window
10f0: 20 66 75 6e 63 74 69 6f 6e 73 20 73 75 70 70 6f   functions suppo
1100: 72 74 65 64 20 62 79 20 50 6f 73 74 67 72 65 73  rted by Postgres
1110: 2e 20 0a 2a 2a 20 20 20 41 6c 74 68 6f 75 67 68  . .**   Although
1120: 20 74 68 65 20 62 65 68 61 76 69 6f 75 72 20 6f   the behaviour o
1130: 66 20 61 67 67 72 65 67 61 74 65 20 77 69 6e 64  f aggregate wind
1140: 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 28 66 75  ow functions (fu
1150: 6e 63 74 69 6f 6e 73 20 74 68 61 74 0a 2a 2a 20  nctions that.** 
1160: 20 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 73    can be used as
1170: 20 65 69 74 68 65 72 20 61 67 67 72 65 67 61 74   either aggregat
1180: 65 73 20 6f 72 20 77 69 6e 64 6f 77 20 66 75 6e  es or window fun
1190: 74 69 6f 6e 73 29 20 61 6c 6c 6f 77 73 20 74 68  tions) allows th
11a0: 65 6d 20 74 6f 0a 2a 2a 20 20 20 62 65 20 69 6d  em to.**   be im
11b0: 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20  plemented using 
11c0: 61 6e 20 41 50 49 2c 20 62 75 69 6c 74 2d 69 6e  an API, built-in
11d0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
11e0: 73 20 61 72 65 20 6d 75 63 68 20 6d 6f 72 65 0a  s are much more.
11f0: 2a 2a 20 20 20 65 73 6f 74 65 72 69 63 2e 20 41  **   esoteric. A
1200: 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 73 6f 6d  dditionally, som
1210: 65 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  e window functio
1220: 6e 73 20 28 65 2e 67 2e 20 6e 74 68 5f 76 61 6c  ns (e.g. nth_val
1230: 75 65 28 29 29 20 0a 2a 2a 20 20 20 6d 61 79 20  ue()) .**   may 
1240: 6f 6e 6c 79 20 62 65 20 69 6d 70 6c 65 6d 65 6e  only be implemen
1250: 74 65 64 20 62 79 20 63 61 63 68 69 6e 67 20 74  ted by caching t
1260: 68 65 20 65 6e 74 69 72 65 20 70 61 72 74 69 74  he entire partit
1270: 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a  ion in memory..*
1280: 2a 20 20 20 41 73 20 73 75 63 68 2c 20 73 6f 6d  *   As such, som
1290: 65 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  e built-in windo
12a0: 77 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 20  w functions use 
12b0: 74 68 65 20 73 61 6d 65 20 41 50 49 20 61 73 20  the same API as 
12c0: 61 67 67 72 65 67 61 74 65 0a 2a 2a 20 20 20 77  aggregate.**   w
12d0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
12e0: 61 6e 64 20 73 6f 6d 65 20 61 72 65 20 69 6d 70  and some are imp
12f0: 6c 65 6d 65 6e 74 65 64 20 64 69 72 65 63 74 6c  lemented directl
1300: 79 20 75 73 69 6e 67 20 56 44 42 45 20 0a 2a 2a  y using VDBE .**
1310: 20 20 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e     instructions.
1320: 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 66   Additionally, f
1330: 6f 72 20 74 68 6f 73 65 20 66 75 6e 63 74 69 6f  or those functio
1340: 6e 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20  ns that use the 
1350: 41 50 49 2c 20 74 68 65 0a 2a 2a 20 20 20 77 69  API, the.**   wi
1360: 6e 64 6f 77 20 66 72 61 6d 65 20 69 73 20 73 6f  ndow frame is so
1370: 6d 65 74 69 6d 65 73 20 6d 6f 64 69 66 69 65 64  metimes modified
1380: 20 62 65 66 6f 72 65 20 74 68 65 20 53 45 4c 45   before the SELE
1390: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a  CT statement is.
13a0: 2a 2a 20 20 20 72 65 77 72 69 74 74 65 6e 2e 20  **   rewritten. 
13b0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 72 65 67  For example, reg
13c0: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 73  ardless of the s
13d0: 70 65 63 69 66 69 65 64 20 77 69 6e 64 6f 77 20  pecified window 
13e0: 66 72 61 6d 65 2c 20 74 68 65 0a 2a 2a 20 20 20  frame, the.**   
13f0: 72 6f 77 5f 6e 75 6d 62 65 72 28 29 20 66 75 6e  row_number() fun
1400: 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 75 73 65  ction always use
1410: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 4f 57  s:.**.**     ROW
1420: 53 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e  S BETWEEN UNBOUN
1430: 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e  DED PRECEDING AN
1440: 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a  D CURRENT ROW.**
1450: 0a 2a 2a 20 20 20 53 65 65 20 73 71 6c 69 74 65  .**   See sqlite
1460: 33 57 69 6e 64 6f 77 55 70 64 61 74 65 28 29 20  3WindowUpdate() 
1470: 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  for details..**.
1480: 2a 2a 20 20 20 41 73 20 77 65 6c 6c 20 61 73 20  **   As well as 
1490: 73 6f 6d 65 20 6f 66 20 74 68 65 20 62 75 69 6c  some of the buil
14a0: 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63  t-in window func
14b0: 74 69 6f 6e 73 2c 20 61 67 67 72 65 67 61 74 65  tions, aggregate
14c0: 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20 66 75 6e   window.**   fun
14d0: 63 74 69 6f 6e 73 20 6d 69 6e 28 29 20 61 6e 64  ctions min() and
14e0: 20 6d 61 78 28 29 20 61 72 65 20 69 6d 70 6c 65   max() are imple
14f0: 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 56 44 42  mented using VDB
1500: 45 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 69  E instructions i
1510: 66 0a 2a 2a 20 20 20 74 68 65 20 73 74 61 72 74  f.**   the start
1520: 20 6f 66 20 74 68 65 20 77 69 6e 64 6f 77 20 66   of the window f
1530: 72 61 6d 65 20 69 73 20 64 65 63 6c 61 72 65 64  rame is declared
1540: 20 61 73 20 61 6e 79 74 68 69 6e 67 20 6f 74 68   as anything oth
1550: 65 72 20 74 68 61 6e 20 0a 2a 2a 20 20 20 55 4e  er than .**   UN
1560: 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e  BOUNDED PRECEDIN
1570: 47 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  G..*/../*.** Imp
1580: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 62  lementation of b
1590: 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66  uilt-in window f
15a0: 75 6e 63 74 69 6f 6e 20 72 6f 77 5f 6e 75 6d 62  unction row_numb
15b0: 65 72 28 29 2e 20 41 73 73 75 6d 65 73 20 74 68  er(). Assumes th
15c0: 61 74 20 74 68 65 0a 2a 2a 20 77 69 6e 64 6f 77  at the.** window
15d0: 20 66 72 61 6d 65 20 68 61 73 20 62 65 65 6e 20   frame has been 
15e0: 63 6f 65 72 63 65 64 20 74 6f 3a 0a 2a 2a 0a 2a  coerced to:.**.*
15f0: 2a 20 20 20 52 4f 57 53 20 42 45 54 57 45 45 4e  *   ROWS BETWEEN
1600: 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45   UNBOUNDED PRECE
1610: 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54  DING AND CURRENT
1620: 20 52 4f 57 0a 2a 2f 0a 73 74 61 74 69 63 20 76   ROW.*/.static v
1630: 6f 69 64 20 72 6f 77 5f 6e 75 6d 62 65 72 53 74  oid row_numberSt
1640: 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  epFunc(.  sqlite
1650: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
1660: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
1670: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
1680: 61 70 41 72 67 0a 29 7b 0a 20 20 69 36 34 20 2a  apArg.){.  i64 *
1690: 70 20 3d 20 28 69 36 34 2a 29 73 71 6c 69 74 65  p = (i64*)sqlite
16a0: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
16b0: 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66  ext(pCtx, sizeof
16c0: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29  (*p));.  if( p )
16d0: 20 28 2a 70 29 2b 2b 3b 0a 20 20 55 4e 55 53 45   (*p)++;.  UNUSE
16e0: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72 67  D_PARAMETER(nArg
16f0: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1700: 4d 45 54 45 52 28 61 70 41 72 67 29 3b 0a 7d 0a  METER(apArg);.}.
1710: 73 74 61 74 69 63 20 76 6f 69 64 20 72 6f 77 5f  static void row_
1720: 6e 75 6d 62 65 72 56 61 6c 75 65 46 75 6e 63 28  numberValueFunc(
1730: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1740: 2a 70 43 74 78 29 7b 0a 20 20 69 36 34 20 2a 70  *pCtx){.  i64 *p
1750: 20 3d 20 28 69 36 34 2a 29 73 71 6c 69 74 65 33   = (i64*)sqlite3
1760: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
1770: 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28  xt(pCtx, sizeof(
1780: 2a 70 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  *p));.  sqlite3_
1790: 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74  result_int64(pCt
17a0: 78 2c 20 28 70 20 3f 20 2a 70 20 3a 20 30 29 29  x, (p ? *p : 0))
17b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65  ;.}../*.** Conte
17c0: 78 74 20 6f 62 6a 65 63 74 20 74 79 70 65 20 75  xt object type u
17d0: 73 65 64 20 62 79 20 72 61 6e 6b 28 29 2c 20 64  sed by rank(), d
17e0: 65 6e 73 65 5f 72 61 6e 6b 28 29 2c 20 70 65 72  ense_rank(), per
17f0: 63 65 6e 74 5f 72 61 6e 6b 28 29 20 61 6e 64 0a  cent_rank() and.
1800: 2a 2a 20 63 75 6d 65 5f 64 69 73 74 28 29 2e 0a  ** cume_dist()..
1810: 2a 2f 0a 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  */.struct CallCo
1820: 75 6e 74 20 7b 0a 20 20 69 36 34 20 6e 56 61 6c  unt {.  i64 nVal
1830: 75 65 3b 0a 20 20 69 36 34 20 6e 53 74 65 70 3b  ue;.  i64 nStep;
1840: 0a 20 20 69 36 34 20 6e 54 6f 74 61 6c 3b 0a 7d  .  i64 nTotal;.}
1850: 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  ;../*.** Impleme
1860: 6e 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74  ntation of built
1870: 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  -in window funct
1880: 69 6f 6e 20 64 65 6e 73 65 5f 72 61 6e 6b 28 29  ion dense_rank()
1890: 2e 20 41 73 73 75 6d 65 73 20 74 68 61 74 0a 2a  . Assumes that.*
18a0: 2a 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61  * the window fra
18b0: 6d 65 20 68 61 73 20 62 65 65 6e 20 73 65 74 20  me has been set 
18c0: 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e 47  to:.**.**   RANG
18d0: 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e  E BETWEEN UNBOUN
18e0: 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e  DED PRECEDING AN
18f0: 44 20 43 55 52 52 45 4e 54 20 52 4f 57 20 0a 2a  D CURRENT ROW .*
1900: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65  /.static void de
1910: 6e 73 65 5f 72 61 6e 6b 53 74 65 70 46 75 6e 63  nse_rankStepFunc
1920: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
1930: 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e  ext *pCtx, .  in
1940: 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65  t nArg,.  sqlite
1950: 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a  3_value **apArg.
1960: 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61 6c 6c  ){.  struct Call
1970: 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70 20 3d 20  Count *p;.  p = 
1980: 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e  (struct CallCoun
1990: 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65  t*)sqlite3_aggre
19a0: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74  gate_context(pCt
19b0: 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  x, sizeof(*p));.
19c0: 20 20 69 66 28 20 70 20 29 20 70 2d 3e 6e 53 74    if( p ) p->nSt
19d0: 65 70 20 3d 20 31 3b 0a 20 20 55 4e 55 53 45 44  ep = 1;.  UNUSED
19e0: 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72 67 29  _PARAMETER(nArg)
19f0: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1a00: 45 54 45 52 28 61 70 41 72 67 29 3b 0a 7d 0a 73  ETER(apArg);.}.s
1a10: 74 61 74 69 63 20 76 6f 69 64 20 64 65 6e 73 65  tatic void dense
1a20: 5f 72 61 6e 6b 56 61 6c 75 65 46 75 6e 63 28 73  _rankValueFunc(s
1a30: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1a40: 70 43 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20  pCtx){.  struct 
1a50: 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20  CallCount *p;.  
1a60: 70 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c  p = (struct Call
1a70: 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61  Count*)sqlite3_a
1a80: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
1a90: 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70  (pCtx, sizeof(*p
1aa0: 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ));.  if( p ){. 
1ab0: 20 20 20 69 66 28 20 70 2d 3e 6e 53 74 65 70 20     if( p->nStep 
1ac0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61 6c  ){.      p->nVal
1ad0: 75 65 2b 2b 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  ue++;.      p->n
1ae0: 53 74 65 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Step = 0;.    }.
1af0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
1b00: 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 70  lt_int64(pCtx, p
1b10: 2d 3e 6e 56 61 6c 75 65 29 3b 0a 20 20 7d 0a 7d  ->nValue);.  }.}
1b20: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
1b30: 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74 2d  tation of built-
1b40: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
1b50: 6f 6e 20 72 61 6e 6b 28 29 2e 20 41 73 73 75 6d  on rank(). Assum
1b60: 65 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 77  es that.** the w
1b70: 69 6e 64 6f 77 20 66 72 61 6d 65 20 68 61 73 20  indow frame has 
1b80: 62 65 65 6e 20 73 65 74 20 74 6f 3a 0a 2a 2a 0a  been set to:.**.
1b90: 2a 2a 20 20 20 52 41 4e 47 45 20 42 45 54 57 45  **   RANGE BETWE
1ba0: 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  EN UNBOUNDED PRE
1bb0: 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45  CEDING AND CURRE
1bc0: 4e 54 20 52 4f 57 20 0a 2a 2f 0a 73 74 61 74 69  NT ROW .*/.stati
1bd0: 63 20 76 6f 69 64 20 72 61 6e 6b 53 74 65 70 46  c void rankStepF
1be0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
1bf0: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
1c00: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
1c10: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41  ite3_value **apA
1c20: 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 43  rg.){.  struct C
1c30: 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70  allCount *p;.  p
1c40: 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43   = (struct CallC
1c50: 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67  ount*)sqlite3_ag
1c60: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
1c70: 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29  pCtx, sizeof(*p)
1c80: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
1c90: 20 20 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 20 20    p->nStep++;.  
1ca0: 20 20 69 66 28 20 70 2d 3e 6e 56 61 6c 75 65 3d    if( p->nValue=
1cb0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  =0 ){.      p->n
1cc0: 56 61 6c 75 65 20 3d 20 70 2d 3e 6e 53 74 65 70  Value = p->nStep
1cd0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 55 4e  ;.    }.  }.  UN
1ce0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
1cf0: 41 72 67 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  Arg);.  UNUSED_P
1d00: 41 52 41 4d 45 54 45 52 28 61 70 41 72 67 29 3b  ARAMETER(apArg);
1d10: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  .}.static void r
1d20: 61 6e 6b 56 61 6c 75 65 46 75 6e 63 28 73 71 6c  ankValueFunc(sql
1d30: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
1d40: 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61  tx){.  struct Ca
1d50: 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70 20  llCount *p;.  p 
1d60: 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  = (struct CallCo
1d70: 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67  unt*)sqlite3_agg
1d80: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70  regate_context(p
1d90: 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  Ctx, sizeof(*p))
1da0: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
1db0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1dc0: 69 6e 74 36 34 28 70 43 74 78 2c 20 70 2d 3e 6e  int64(pCtx, p->n
1dd0: 56 61 6c 75 65 29 3b 0a 20 20 20 20 70 2d 3e 6e  Value);.    p->n
1de0: 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d  Value = 0;.  }.}
1df0: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
1e00: 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74 2d  tation of built-
1e10: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
1e20: 6f 6e 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b 28  on percent_rank(
1e30: 29 2e 20 41 73 73 75 6d 65 73 20 74 68 61 74 0a  ). Assumes that.
1e40: 2a 2a 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72  ** the window fr
1e50: 61 6d 65 20 68 61 73 20 62 65 65 6e 20 73 65 74  ame has been set
1e60: 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e   to:.**.**   RAN
1e70: 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55  GE BETWEEN UNBOU
1e80: 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41  NDED PRECEDING A
1e90: 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 20 0a  ND CURRENT ROW .
1ea0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
1eb0: 65 72 63 65 6e 74 5f 72 61 6e 6b 53 74 65 70 46  ercent_rankStepF
1ec0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
1ed0: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
1ee0: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
1ef0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41  ite3_value **apA
1f00: 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 43  rg.){.  struct C
1f10: 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 55  allCount *p;.  U
1f20: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1f30: 6e 41 72 67 29 3b 20 61 73 73 65 72 74 28 20 6e  nArg); assert( n
1f40: 41 72 67 3d 3d 31 20 29 3b 0a 0a 20 20 70 20 3d  Arg==1 );..  p =
1f50: 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75   (struct CallCou
1f60: 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72  nt*)sqlite3_aggr
1f70: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43  egate_context(pC
1f80: 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b  tx, sizeof(*p));
1f90: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
1fa0: 69 66 28 20 70 2d 3e 6e 54 6f 74 61 6c 3d 3d 30  if( p->nTotal==0
1fb0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 54 6f   ){.      p->nTo
1fc0: 74 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  tal = sqlite3_va
1fd0: 6c 75 65 5f 69 6e 74 36 34 28 61 70 41 72 67 5b  lue_int64(apArg[
1fe0: 30 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  0]);.    }.    p
1ff0: 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 20 20 20 20 69  ->nStep++;.    i
2000: 66 28 20 70 2d 3e 6e 56 61 6c 75 65 3d 3d 30 20  f( p->nValue==0 
2010: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61 6c  ){.      p->nVal
2020: 75 65 20 3d 20 70 2d 3e 6e 53 74 65 70 3b 0a 20  ue = p->nStep;. 
2030: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69     }.  }.}.stati
2040: 63 20 76 6f 69 64 20 70 65 72 63 65 6e 74 5f 72  c void percent_r
2050: 61 6e 6b 56 61 6c 75 65 46 75 6e 63 28 73 71 6c  ankValueFunc(sql
2060: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
2070: 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61  tx){.  struct Ca
2080: 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70 20  llCount *p;.  p 
2090: 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  = (struct CallCo
20a0: 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67  unt*)sqlite3_agg
20b0: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70  regate_context(p
20c0: 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  Ctx, sizeof(*p))
20d0: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
20e0: 20 69 66 28 20 70 2d 3e 6e 54 6f 74 61 6c 3e 31   if( p->nTotal>1
20f0: 20 29 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65   ){.      double
2100: 20 72 20 3d 20 28 64 6f 75 62 6c 65 29 28 70 2d   r = (double)(p-
2110: 3e 6e 56 61 6c 75 65 2d 31 29 20 2f 20 28 64 6f  >nValue-1) / (do
2120: 75 62 6c 65 29 28 70 2d 3e 6e 54 6f 74 61 6c 2d  uble)(p->nTotal-
2130: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
2140: 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28  3_result_double(
2150: 70 43 74 78 2c 20 72 29 3b 0a 20 20 20 20 7d 65  pCtx, r);.    }e
2160: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
2170: 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65  e3_result_double
2180: 28 70 43 74 78 2c 20 30 2e 30 29 3b 0a 20 20 20  (pCtx, 0.0);.   
2190: 20 7d 0a 20 20 20 20 70 2d 3e 6e 56 61 6c 75 65   }.    p->nValue
21a0: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
21b0: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
21c0: 6e 20 6f 66 20 62 75 69 6c 74 2d 69 6e 20 77 69  n of built-in wi
21d0: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 63 75  ndow function cu
21e0: 6d 65 5f 64 69 73 74 28 29 2e 20 41 73 73 75 6d  me_dist(). Assum
21f0: 65 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 77  es that.** the w
2200: 69 6e 64 6f 77 20 66 72 61 6d 65 20 68 61 73 20  indow frame has 
2210: 62 65 65 6e 20 73 65 74 20 74 6f 3a 0a 2a 2a 0a  been set to:.**.
2220: 2a 2a 20 20 20 52 41 4e 47 45 20 42 45 54 57 45  **   RANGE BETWE
2230: 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  EN UNBOUNDED PRE
2240: 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45  CEDING AND CURRE
2250: 4e 54 20 52 4f 57 20 0a 2a 2f 0a 73 74 61 74 69  NT ROW .*/.stati
2260: 63 20 76 6f 69 64 20 63 75 6d 65 5f 64 69 73 74  c void cume_dist
2270: 53 74 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69  StepFunc(.  sqli
2280: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
2290: 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  x, .  int nArg,.
22a0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
22b0: 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72  **apArg.){.  str
22c0: 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 20 2a 70  uct CallCount *p
22d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 41 72 67  ;.  assert( nArg
22e0: 3d 3d 31 20 29 3b 20 55 4e 55 53 45 44 5f 50 41  ==1 ); UNUSED_PA
22f0: 52 41 4d 45 54 45 52 28 6e 41 72 67 29 3b 0a 0a  RAMETER(nArg);..
2300: 20 20 70 20 3d 20 28 73 74 72 75 63 74 20 43 61    p = (struct Ca
2310: 6c 6c 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33  llCount*)sqlite3
2320: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
2330: 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28  xt(pCtx, sizeof(
2340: 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b  *p));.  if( p ){
2350: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 54 6f 74  .    if( p->nTot
2360: 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  al==0 ){.      p
2370: 2d 3e 6e 54 6f 74 61 6c 20 3d 20 73 71 6c 69 74  ->nTotal = sqlit
2380: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61  e3_value_int64(a
2390: 70 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 7d 0a  pArg[0]);.    }.
23a0: 20 20 20 20 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a      p->nStep++;.
23b0: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
23c0: 64 20 63 75 6d 65 5f 64 69 73 74 56 61 6c 75 65  d cume_distValue
23d0: 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Func(sqlite3_con
23e0: 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20 20 73  text *pCtx){.  s
23f0: 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 20  truct CallCount 
2400: 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63  *p;.  p = (struc
2410: 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29 73 71 6c  t CallCount*)sql
2420: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
2430: 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a  ontext(pCtx, siz
2440: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20  eof(*p));.  if( 
2450: 70 20 26 26 20 70 2d 3e 6e 54 6f 74 61 6c 20 29  p && p->nTotal )
2460: 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d  {.    double r =
2470: 20 28 64 6f 75 62 6c 65 29 28 70 2d 3e 6e 53 74   (double)(p->nSt
2480: 65 70 29 20 2f 20 28 64 6f 75 62 6c 65 29 28 70  ep) / (double)(p
2490: 2d 3e 6e 54 6f 74 61 6c 29 3b 0a 20 20 20 20 73  ->nTotal);.    s
24a0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f  qlite3_result_do
24b0: 75 62 6c 65 28 70 43 74 78 2c 20 72 29 3b 0a 20  uble(pCtx, r);. 
24c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74   }.}../*.** Cont
24d0: 65 78 74 20 6f 62 6a 65 63 74 20 66 6f 72 20 6e  ext object for n
24e0: 74 69 6c 65 28 29 20 77 69 6e 64 6f 77 20 66 75  tile() window fu
24f0: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 72 75 63  nction..*/.struc
2500: 74 20 4e 74 69 6c 65 43 74 78 20 7b 0a 20 20 69  t NtileCtx {.  i
2510: 36 34 20 6e 54 6f 74 61 6c 3b 20 20 20 20 20 20  64 nTotal;      
2520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2530: 2a 20 54 6f 74 61 6c 20 72 6f 77 73 20 69 6e 20  * Total rows in 
2540: 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 20 20 69  partition */.  i
2550: 36 34 20 6e 50 61 72 61 6d 3b 20 20 20 20 20 20  64 nParam;      
2560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2570: 2a 20 50 61 72 61 6d 65 74 65 72 20 70 61 73 73  * Parameter pass
2580: 65 64 20 74 6f 20 6e 74 69 6c 65 28 4e 29 20 2a  ed to ntile(N) *
2590: 2f 0a 20 20 69 36 34 20 69 52 6f 77 3b 20 20 20  /.  i64 iRow;   
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72      /* Current r
25c0: 6f 77 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ow */.};../*.** 
25d0: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
25e0: 66 20 6e 74 69 6c 65 28 29 2e 20 54 68 69 73 20  f ntile(). This 
25f0: 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65  assumes that the
2600: 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 20 68 61   window frame ha
2610: 73 0a 2a 2a 20 62 65 65 6e 20 63 6f 65 72 63 65  s.** been coerce
2620: 64 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 4f  d to:.**.**   RO
2630: 57 53 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  WS UNBOUNDED PRE
2640: 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45  CEDING AND CURRE
2650: 4e 54 20 52 4f 57 0a 2a 2f 0a 73 74 61 74 69 63  NT ROW.*/.static
2660: 20 76 6f 69 64 20 6e 74 69 6c 65 53 74 65 70 46   void ntileStepF
2670: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
2680: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
2690: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
26a0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41  ite3_value **apA
26b0: 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 4e  rg.){.  struct N
26c0: 74 69 6c 65 43 74 78 20 2a 70 3b 0a 20 20 61 73  tileCtx *p;.  as
26d0: 73 65 72 74 28 20 6e 41 72 67 3d 3d 32 20 29 3b  sert( nArg==2 );
26e0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
26f0: 52 28 6e 41 72 67 29 3b 0a 20 20 70 20 3d 20 28  R(nArg);.  p = (
2700: 73 74 72 75 63 74 20 4e 74 69 6c 65 43 74 78 2a  struct NtileCtx*
2710: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
2720: 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c  te_context(pCtx,
2730: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
2740: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  if( p ){.    if(
2750: 20 70 2d 3e 6e 54 6f 74 61 6c 3d 3d 30 20 29 7b   p->nTotal==0 ){
2760: 0a 20 20 20 20 20 20 70 2d 3e 6e 50 61 72 61 6d  .      p->nParam
2770: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
2780: 5f 69 6e 74 36 34 28 61 70 41 72 67 5b 30 5d 29  _int64(apArg[0])
2790: 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 54 6f 74 61  ;.      p->nTota
27a0: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  l = sqlite3_valu
27b0: 65 5f 69 6e 74 36 34 28 61 70 41 72 67 5b 31 5d  e_int64(apArg[1]
27c0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
27d0: 6e 50 61 72 61 6d 3c 3d 30 20 29 7b 0a 20 20 20  nParam<=0 ){.   
27e0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
27f0: 75 6c 74 5f 65 72 72 6f 72 28 0a 20 20 20 20 20  ult_error(.     
2800: 20 20 20 20 20 20 20 70 43 74 78 2c 20 22 61 72         pCtx, "ar
2810: 67 75 6d 65 6e 74 20 6f 66 20 6e 74 69 6c 65 20  gument of ntile 
2820: 6d 75 73 74 20 62 65 20 61 20 70 6f 73 69 74 69  must be a positi
2830: 76 65 20 69 6e 74 65 67 65 72 22 2c 20 2d 31 0a  ve integer", -1.
2840: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
2850: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e   }.    }.    p->
2860: 69 52 6f 77 2b 2b 3b 0a 20 20 7d 0a 7d 0a 73 74  iRow++;.  }.}.st
2870: 61 74 69 63 20 76 6f 69 64 20 6e 74 69 6c 65 56  atic void ntileV
2880: 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33  alueFunc(sqlite3
2890: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b  _context *pCtx){
28a0: 0a 20 20 73 74 72 75 63 74 20 4e 74 69 6c 65 43  .  struct NtileC
28b0: 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74  tx *p;.  p = (st
28c0: 72 75 63 74 20 4e 74 69 6c 65 43 74 78 2a 29 73  ruct NtileCtx*)s
28d0: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
28e0: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
28f0: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
2900: 28 20 70 20 26 26 20 70 2d 3e 6e 50 61 72 61 6d  ( p && p->nParam
2910: 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53  >0 ){.    int nS
2920: 69 7a 65 20 3d 20 28 70 2d 3e 6e 54 6f 74 61 6c  ize = (p->nTotal
2930: 20 2f 20 70 2d 3e 6e 50 61 72 61 6d 29 3b 0a 20   / p->nParam);. 
2940: 20 20 20 69 66 28 20 6e 53 69 7a 65 3d 3d 30 20     if( nSize==0 
2950: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2960: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43  _result_int64(pC
2970: 74 78 2c 20 70 2d 3e 69 52 6f 77 29 3b 0a 20 20  tx, p->iRow);.  
2980: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
2990: 36 34 20 6e 4c 61 72 67 65 20 3d 20 70 2d 3e 6e  64 nLarge = p->n
29a0: 54 6f 74 61 6c 20 2d 20 70 2d 3e 6e 50 61 72 61  Total - p->nPara
29b0: 6d 2a 6e 53 69 7a 65 3b 0a 20 20 20 20 20 20 69  m*nSize;.      i
29c0: 36 34 20 69 53 6d 61 6c 6c 20 3d 20 6e 4c 61 72  64 iSmall = nLar
29d0: 67 65 2a 28 6e 53 69 7a 65 2b 31 29 3b 0a 20 20  ge*(nSize+1);.  
29e0: 20 20 20 20 69 36 34 20 69 52 6f 77 20 3d 20 70      i64 iRow = p
29f0: 2d 3e 69 52 6f 77 2d 31 3b 0a 0a 20 20 20 20 20  ->iRow-1;..     
2a00: 20 61 73 73 65 72 74 28 20 28 6e 4c 61 72 67 65   assert( (nLarge
2a10: 2a 28 6e 53 69 7a 65 2b 31 29 20 2b 20 28 70 2d  *(nSize+1) + (p-
2a20: 3e 6e 50 61 72 61 6d 2d 6e 4c 61 72 67 65 29 2a  >nParam-nLarge)*
2a30: 6e 53 69 7a 65 29 3d 3d 70 2d 3e 6e 54 6f 74 61  nSize)==p->nTota
2a40: 6c 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  l );..      if( 
2a50: 69 52 6f 77 3c 69 53 6d 61 6c 6c 20 29 7b 0a 20  iRow<iSmall ){. 
2a60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
2a70: 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78  esult_int64(pCtx
2a80: 2c 20 31 20 2b 20 69 52 6f 77 2f 28 6e 53 69 7a  , 1 + iRow/(nSiz
2a90: 65 2b 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  e+1));.      }el
2aa0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
2ab0: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
2ac0: 28 70 43 74 78 2c 20 31 20 2b 20 6e 4c 61 72 67  (pCtx, 1 + nLarg
2ad0: 65 20 2b 20 28 69 52 6f 77 2d 69 53 6d 61 6c 6c  e + (iRow-iSmall
2ae0: 29 2f 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  )/nSize);.      
2af0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
2b00: 2a 0a 2a 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a  *.** Context obj
2b10: 65 63 74 20 66 6f 72 20 6c 61 73 74 5f 76 61 6c  ect for last_val
2b20: 75 65 28 29 20 77 69 6e 64 6f 77 20 66 75 6e 63  ue() window func
2b30: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  tion..*/.struct 
2b40: 4c 61 73 74 56 61 6c 75 65 43 74 78 20 7b 0a 20  LastValueCtx {. 
2b50: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
2b60: 70 56 61 6c 3b 0a 20 20 69 6e 74 20 6e 56 61 6c  pVal;.  int nVal
2b70: 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  ;.};../*.** Impl
2b80: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6c 61  ementation of la
2b90: 73 74 5f 76 61 6c 75 65 28 29 2e 0a 2a 2f 0a 73  st_value()..*/.s
2ba0: 74 61 74 69 63 20 76 6f 69 64 20 6c 61 73 74 5f  tatic void last_
2bb0: 76 61 6c 75 65 53 74 65 70 46 75 6e 63 28 0a 20  valueStepFunc(. 
2bc0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
2bd0: 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
2be0: 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
2bf0: 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a  alue **apArg.){.
2c00: 20 20 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c    struct LastVal
2c10: 75 65 43 74 78 20 2a 70 3b 0a 20 20 55 4e 55 53  ueCtx *p;.  UNUS
2c20: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72  ED_PARAMETER(nAr
2c30: 67 29 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63  g);.  p = (struc
2c40: 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 2a 29  t LastValueCtx*)
2c50: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
2c60: 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20  e_context(pCtx, 
2c70: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69  sizeof(*p));.  i
2c80: 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( p ){.    sqli
2c90: 74 65 33 5f 76 61 6c 75 65 5f 66 72 65 65 28 70  te3_value_free(p
2ca0: 2d 3e 70 56 61 6c 29 3b 0a 20 20 20 20 70 2d 3e  ->pVal);.    p->
2cb0: 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76  pVal = sqlite3_v
2cc0: 61 6c 75 65 5f 64 75 70 28 61 70 41 72 67 5b 30  alue_dup(apArg[0
2cd0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  ]);.    if( p->p
2ce0: 56 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Val==0 ){.      
2cf0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
2d00: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29  rror_nomem(pCtx)
2d10: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2d20: 20 20 20 70 2d 3e 6e 56 61 6c 2b 2b 3b 0a 20 20     p->nVal++;.  
2d30: 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63    }.  }.}.static
2d40: 20 76 6f 69 64 20 6c 61 73 74 5f 76 61 6c 75 65   void last_value
2d50: 49 6e 76 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  InvFunc(.  sqlit
2d60: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
2d70: 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  , .  int nArg,. 
2d80: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
2d90: 2a 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72 75  *apArg.){.  stru
2da0: 63 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 20  ct LastValueCtx 
2db0: 2a 70 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  *p;.  UNUSED_PAR
2dc0: 41 4d 45 54 45 52 28 6e 41 72 67 29 3b 0a 20 20  AMETER(nArg);.  
2dd0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2de0: 28 61 70 41 72 67 29 3b 0a 20 20 70 20 3d 20 28  (apArg);.  p = (
2df0: 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75 65  struct LastValue
2e00: 43 74 78 2a 29 73 71 6c 69 74 65 33 5f 61 67 67  Ctx*)sqlite3_agg
2e10: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70  regate_context(p
2e20: 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  Ctx, sizeof(*p))
2e30: 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
2e40: 29 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 6c  ) ){.    p->nVal
2e50: 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  --;.    if( p->n
2e60: 56 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Val==0 ){.      
2e70: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 66 72  sqlite3_value_fr
2e80: 65 65 28 70 2d 3e 70 56 61 6c 29 3b 0a 20 20 20  ee(p->pVal);.   
2e90: 20 20 20 70 2d 3e 70 56 61 6c 20 3d 20 30 3b 0a     p->pVal = 0;.
2ea0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74      }.  }.}.stat
2eb0: 69 63 20 76 6f 69 64 20 6c 61 73 74 5f 76 61 6c  ic void last_val
2ec0: 75 65 56 61 6c 75 65 46 75 6e 63 28 73 71 6c 69  ueValueFunc(sqli
2ed0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
2ee0: 78 29 7b 0a 20 20 73 74 72 75 63 74 20 4c 61 73  x){.  struct Las
2ef0: 74 56 61 6c 75 65 43 74 78 20 2a 70 3b 0a 20 20  tValueCtx *p;.  
2f00: 70 20 3d 20 28 73 74 72 75 63 74 20 4c 61 73 74  p = (struct Last
2f10: 56 61 6c 75 65 43 74 78 2a 29 73 71 6c 69 74 65  ValueCtx*)sqlite
2f20: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
2f30: 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66  ext(pCtx, sizeof
2f40: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 26  (*p));.  if( p &
2f50: 26 20 70 2d 3e 70 56 61 6c 20 29 7b 0a 20 20 20  & p->pVal ){.   
2f60: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2f70: 76 61 6c 75 65 28 70 43 74 78 2c 20 70 2d 3e 70  value(pCtx, p->p
2f80: 56 61 6c 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  Val);.  }.}.stat
2f90: 69 63 20 76 6f 69 64 20 6c 61 73 74 5f 76 61 6c  ic void last_val
2fa0: 75 65 46 69 6e 61 6c 69 7a 65 46 75 6e 63 28 73  ueFinalizeFunc(s
2fb0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
2fc0: 70 43 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20  pCtx){.  struct 
2fd0: 4c 61 73 74 56 61 6c 75 65 43 74 78 20 2a 70 3b  LastValueCtx *p;
2fe0: 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74 20 4c  .  p = (struct L
2ff0: 61 73 74 56 61 6c 75 65 43 74 78 2a 29 73 71 6c  astValueCtx*)sql
3000: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
3010: 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a  ontext(pCtx, siz
3020: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20  eof(*p));.  if( 
3030: 70 20 26 26 20 70 2d 3e 70 56 61 6c 20 29 7b 0a  p && p->pVal ){.
3040: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
3050: 6c 74 5f 76 61 6c 75 65 28 70 43 74 78 2c 20 70  lt_value(pCtx, p
3060: 2d 3e 70 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c  ->pVal);.    sql
3070: 69 74 65 33 5f 76 61 6c 75 65 5f 66 72 65 65 28  ite3_value_free(
3080: 70 2d 3e 70 56 61 6c 29 3b 0a 20 20 20 20 70 2d  p->pVal);.    p-
3090: 3e 70 56 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 7d  >pVal = 0;.  }.}
30a0: 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 74 69 63 20 6e  ../*.** Static n
30b0: 61 6d 65 73 20 66 6f 72 20 74 68 65 20 62 75 69  ames for the bui
30c0: 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e  lt-in window fun
30d0: 63 74 69 6f 6e 20 6e 61 6d 65 73 2e 20 20 54 68  ction names.  Th
30e0: 65 73 65 20 73 74 61 74 69 63 0a 2a 2a 20 6e 61  ese static.** na
30f0: 6d 65 73 20 61 72 65 20 75 73 65 64 2c 20 72 61  mes are used, ra
3100: 74 68 65 72 20 74 68 61 6e 20 73 74 72 69 6e 67  ther than string
3110: 20 6c 69 74 65 72 61 6c 73 2c 20 73 6f 20 74 68   literals, so th
3120: 61 74 20 46 75 6e 63 44 65 66 20 6f 62 6a 65 63  at FuncDef objec
3130: 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 61 73 73  ts.** can be ass
3140: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 70  ociated with a p
3150: 61 72 74 69 63 75 6c 61 72 20 77 69 6e 64 6f 77  articular window
3160: 20 66 75 6e 63 74 69 6f 6e 20 62 79 20 64 69 72   function by dir
3170: 65 63 74 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f  ect.** compariso
3180: 6e 20 6f 66 20 74 68 65 20 7a 4e 61 6d 65 20 70  n of the zName p
3190: 6f 69 6e 74 65 72 2e 20 20 45 78 61 6d 70 6c 65  ointer.  Example
31a0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 66  :.**.**       if
31b0: 28 20 70 46 75 6e 63 44 65 66 2d 3e 7a 4e 61 6d  ( pFuncDef->zNam
31c0: 65 3d 3d 72 6f 77 5f 76 61 6c 75 65 4e 61 6d 65  e==row_valueName
31d0: 20 29 7b 20 2e 2e 2e 20 7d 0a 2a 2f 0a 73 74 61   ){ ... }.*/.sta
31e0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 72  tic const char r
31f0: 6f 77 5f 6e 75 6d 62 65 72 4e 61 6d 65 5b 5d 20  ow_numberName[] 
3200: 3d 20 20 20 22 72 6f 77 5f 6e 75 6d 62 65 72 22  =   "row_number"
3210: 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  ;.static const c
3220: 68 61 72 20 64 65 6e 73 65 5f 72 61 6e 6b 4e 61  har dense_rankNa
3230: 6d 65 5b 5d 20 3d 20 20 20 22 64 65 6e 73 65 5f  me[] =   "dense_
3240: 72 61 6e 6b 22 3b 0a 73 74 61 74 69 63 20 63 6f  rank";.static co
3250: 6e 73 74 20 63 68 61 72 20 72 61 6e 6b 4e 61 6d  nst char rankNam
3260: 65 5b 5d 20 3d 20 20 20 20 20 20 20 20 20 22 72  e[] =         "r
3270: 61 6e 6b 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e  ank";.static con
3280: 73 74 20 63 68 61 72 20 70 65 72 63 65 6e 74 5f  st char percent_
3290: 72 61 6e 6b 4e 61 6d 65 5b 5d 20 3d 20 22 70 65  rankName[] = "pe
32a0: 72 63 65 6e 74 5f 72 61 6e 6b 22 3b 0a 73 74 61  rcent_rank";.sta
32b0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 63  tic const char c
32c0: 75 6d 65 5f 64 69 73 74 4e 61 6d 65 5b 5d 20 3d  ume_distName[] =
32d0: 20 20 20 20 22 63 75 6d 65 5f 64 69 73 74 22 3b      "cume_dist";
32e0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
32f0: 61 72 20 6e 74 69 6c 65 4e 61 6d 65 5b 5d 20 3d  ar ntileName[] =
3300: 20 20 20 20 20 20 20 20 22 6e 74 69 6c 65 22 3b          "ntile";
3310: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
3320: 61 72 20 6c 61 73 74 5f 76 61 6c 75 65 4e 61 6d  ar last_valueNam
3330: 65 5b 5d 20 3d 20 20 20 22 6c 61 73 74 5f 76 61  e[] =   "last_va
3340: 6c 75 65 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e  lue";.static con
3350: 73 74 20 63 68 61 72 20 6e 74 68 5f 76 61 6c 75  st char nth_valu
3360: 65 4e 61 6d 65 5b 5d 20 3d 20 20 20 20 22 6e 74  eName[] =    "nt
3370: 68 5f 76 61 6c 75 65 22 3b 0a 73 74 61 74 69 63  h_value";.static
3380: 20 63 6f 6e 73 74 20 63 68 61 72 20 66 69 72 73   const char firs
3390: 74 5f 76 61 6c 75 65 4e 61 6d 65 5b 5d 20 3d 20  t_valueName[] = 
33a0: 20 22 66 69 72 73 74 5f 76 61 6c 75 65 22 3b 0a   "first_value";.
33b0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
33c0: 72 20 6c 65 61 64 4e 61 6d 65 5b 5d 20 3d 20 20  r leadName[] =  
33d0: 20 20 20 20 20 20 20 22 6c 65 61 64 22 3b 0a 73         "lead";.s
33e0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
33f0: 20 6c 61 67 4e 61 6d 65 5b 5d 20 3d 20 20 20 20   lagName[] =    
3400: 20 20 20 20 20 20 22 6c 61 67 22 3b 0a 0a 2f 2a        "lag";../*
3410: 0a 2a 2a 20 4e 6f 2d 6f 70 20 69 6d 70 6c 65 6d  .** No-op implem
3420: 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 78 53 74  entations of xSt
3430: 65 70 28 29 20 61 6e 64 20 78 46 69 6e 61 6c 69  ep() and xFinali
3440: 7a 65 28 29 2e 20 20 55 73 65 64 20 61 73 20 70  ze().  Used as p
3450: 6c 61 63 65 2d 68 6f 6c 64 65 72 73 0a 2a 2a 20  lace-holders.** 
3460: 66 6f 72 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e  for built-in win
3470: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  dow functions th
3480: 61 74 20 6e 65 76 65 72 20 63 61 6c 6c 20 74 68  at never call th
3490: 6f 73 65 20 69 6e 74 65 72 66 61 63 65 73 2e 0a  ose interfaces..
34a0: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 6f 6f 70 56 61  **.** The noopVa
34b0: 6c 75 65 46 75 6e 63 28 29 20 69 73 20 63 61 6c  lueFunc() is cal
34c0: 6c 65 64 20 62 75 74 20 69 73 20 65 78 70 65 63  led but is expec
34d0: 74 65 64 20 74 6f 20 64 6f 20 6e 6f 74 68 69 6e  ted to do nothin
34e0: 67 2e 20 20 54 68 65 0a 2a 2a 20 6e 6f 6f 70 53  g.  The.** noopS
34f0: 74 65 70 46 75 6e 63 28 29 20 69 73 20 6e 65 76  tepFunc() is nev
3500: 65 72 20 63 61 6c 6c 65 64 2c 20 61 6e 64 20 73  er called, and s
3510: 6f 20 69 74 20 69 73 20 6d 61 72 6b 65 64 20 77  o it is marked w
3520: 69 74 68 20 4e 4f 5f 54 45 53 54 20 74 6f 0a 2a  ith NO_TEST to.*
3530: 2a 20 6c 65 74 20 74 68 65 20 74 65 73 74 20 63  * let the test c
3540: 6f 76 65 72 61 67 65 20 72 6f 75 74 69 6e 65 20  overage routine 
3550: 6b 6e 6f 77 20 6e 6f 74 20 74 6f 20 65 78 70 65  know not to expe
3560: 63 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ct this function
3570: 20 74 6f 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65   to be.** invoke
3580: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
3590: 64 20 6e 6f 6f 70 53 74 65 70 46 75 6e 63 28 20  d noopStepFunc( 
35a0: 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20     /*NO_TEST*/. 
35b0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
35c0: 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 4e 4f   *p,        /*NO
35d0: 5f 54 45 53 54 2a 2f 0a 20 20 69 6e 74 20 6e 2c  _TEST*/.  int n,
35e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35f0: 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f       /*NO_TEST*/
3600: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
3610: 20 2a 2a 61 20 20 20 20 20 20 20 20 20 20 2f 2a   **a          /*
3620: 4e 4f 5f 54 45 53 54 2a 2f 0a 29 7b 20 20 20 20  NO_TEST*/.){    
3630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3640: 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54         /*NO_TEST
3650: 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  */.  UNUSED_PARA
3660: 4d 45 54 45 52 28 70 29 3b 20 20 20 20 20 20 20  METER(p);       
3670: 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 55 4e  /*NO_TEST*/.  UN
3680: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
3690: 29 3b 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45  );       /*NO_TE
36a0: 53 54 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41  ST*/.  UNUSED_PA
36b0: 52 41 4d 45 54 45 52 28 61 29 3b 20 20 20 20 20  RAMETER(a);     
36c0: 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20    /*NO_TEST*/.  
36d0: 61 73 73 65 72 74 28 30 29 3b 20 20 20 20 20 20  assert(0);      
36e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f             /*NO_
36f0: 54 45 53 54 2a 2f 0a 7d 20 20 20 20 20 20 20 20  TEST*/.}        
3700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3710: 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a      /*NO_TEST*/.
3720: 73 74 61 74 69 63 20 76 6f 69 64 20 6e 6f 6f 70  static void noop
3730: 56 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74 65  ValueFunc(sqlite
3740: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 29 7b 20 55  3_context *p){ U
3750: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
3760: 70 29 3b 20 2f 2a 6e 6f 2d 6f 70 2a 2f 20 7d 0a  p); /*no-op*/ }.
3770: 0a 2f 2a 20 57 69 6e 64 6f 77 20 66 75 6e 63 74  ./* Window funct
3780: 69 6f 6e 73 20 74 68 61 74 20 75 73 65 20 61 6c  ions that use al
3790: 6c 20 77 69 6e 64 6f 77 20 69 6e 74 65 72 66 61  l window interfa
37a0: 63 65 73 3a 20 78 53 74 65 70 2c 20 78 46 69 6e  ces: xStep, xFin
37b0: 61 6c 2c 0a 2a 2a 20 78 56 61 6c 75 65 2c 20 61  al,.** xValue, a
37c0: 6e 64 20 78 49 6e 76 65 72 73 65 20 2a 2f 0a 23  nd xInverse */.#
37d0: 64 65 66 69 6e 65 20 57 49 4e 44 4f 57 46 55 4e  define WINDOWFUN
37e0: 43 41 4c 4c 28 6e 61 6d 65 2c 6e 41 72 67 2c 65  CALL(name,nArg,e
37f0: 78 74 72 61 29 20 7b 20 20 20 20 20 20 20 20 20  xtra) {         
3800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3810: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6e 41            \.  nA
3820: 72 67 2c 20 28 53 51 4c 49 54 45 5f 55 54 46 38  rg, (SQLITE_UTF8
3830: 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e  |SQLITE_FUNC_WIN
3840: 44 4f 57 7c 65 78 74 72 61 29 2c 20 30 2c 20 30  DOW|extra), 0, 0
3850: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3860: 20 20 20 20 20 20 20 5c 0a 20 20 6e 61 6d 65 20         \.  name 
3870: 23 23 20 53 74 65 70 46 75 6e 63 2c 20 6e 61 6d  ## StepFunc, nam
3880: 65 20 23 23 20 46 69 6e 61 6c 69 7a 65 46 75 6e  e ## FinalizeFun
3890: 63 2c 20 6e 61 6d 65 20 23 23 20 56 61 6c 75 65  c, name ## Value
38a0: 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Func,           
38b0: 20 20 20 20 5c 0a 20 20 6e 61 6d 65 20 23 23 20      \.  name ## 
38c0: 49 6e 76 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23  InvFunc, name ##
38d0: 20 4e 61 6d 65 2c 20 7b 30 7d 20 20 20 20 20 20   Name, {0}      
38e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3900: 20 5c 0a 7d 0a 0a 2f 2a 20 57 69 6e 64 6f 77 20   \.}../* Window 
3910: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 61  functions that a
3920: 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75  re implemented u
3930: 73 69 6e 67 20 62 79 74 65 63 6f 64 65 20 61 6e  sing bytecode an
3940: 64 20 74 68 75 73 20 68 61 76 65 0a 2a 2a 20 6e  d thus have.** n
3950: 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 73 20 66 6f  o-op routines fo
3960: 72 20 74 68 65 69 72 20 6d 65 74 68 6f 64 73 20  r their methods 
3970: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 44 4f  */.#define WINDO
3980: 57 46 55 4e 43 4e 4f 4f 50 28 6e 61 6d 65 2c 6e  WFUNCNOOP(name,n
3990: 41 72 67 2c 65 78 74 72 61 29 20 7b 20 20 20 20  Arg,extra) {    
39a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
39c0: 20 20 6e 41 72 67 2c 20 28 53 51 4c 49 54 45 5f    nArg, (SQLITE_
39d0: 55 54 46 38 7c 53 51 4c 49 54 45 5f 46 55 4e 43  UTF8|SQLITE_FUNC
39e0: 5f 57 49 4e 44 4f 57 7c 65 78 74 72 61 29 2c 20  _WINDOW|extra), 
39f0: 30 2c 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  0, 0,           
3a00: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6e             \.  n
3a10: 6f 6f 70 53 74 65 70 46 75 6e 63 2c 20 6e 6f 6f  oopStepFunc, noo
3a20: 70 56 61 6c 75 65 46 75 6e 63 2c 20 6e 6f 6f 70  pValueFunc, noop
3a30: 56 61 6c 75 65 46 75 6e 63 2c 20 20 20 20 20 20  ValueFunc,      
3a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a50: 20 20 20 20 20 20 20 20 5c 0a 20 20 6e 6f 6f 70          \.  noop
3a60: 53 74 65 70 46 75 6e 63 2c 20 6e 61 6d 65 20 23  StepFunc, name #
3a70: 23 20 4e 61 6d 65 2c 20 7b 30 7d 20 20 20 20 20  # Name, {0}     
3a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3aa0: 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 20 57 69 6e       \.}../* Win
3ab0: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  dow functions th
3ac0: 61 74 20 75 73 65 20 61 6c 6c 20 77 69 6e 64 6f  at use all windo
3ad0: 77 20 69 6e 74 65 72 66 61 63 65 73 3a 20 78 53  w interfaces: xS
3ae0: 74 65 70 2c 20 74 68 65 0a 2a 2a 20 73 61 6d 65  tep, the.** same
3af0: 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 78 46 69   routine for xFi
3b00: 6e 61 6c 69 7a 65 20 61 6e 64 20 78 56 61 6c 75  nalize and xValu
3b10: 65 20 61 6e 64 20 77 68 69 63 68 20 6e 65 76 65  e and which neve
3b20: 72 20 63 61 6c 6c 0a 2a 2a 20 78 49 6e 76 65 72  r call.** xInver
3b30: 73 65 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  se. */.#define W
3b40: 49 4e 44 4f 57 46 55 4e 43 58 28 6e 61 6d 65 2c  INDOWFUNCX(name,
3b50: 6e 41 72 67 2c 65 78 74 72 61 29 20 7b 20 20 20  nArg,extra) {   
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b80: 20 20 5c 0a 20 20 6e 41 72 67 2c 20 28 53 51 4c    \.  nArg, (SQL
3b90: 49 54 45 5f 55 54 46 38 7c 53 51 4c 49 54 45 5f  ITE_UTF8|SQLITE_
3ba0: 46 55 4e 43 5f 57 49 4e 44 4f 57 7c 65 78 74 72  FUNC_WINDOW|extr
3bb0: 61 29 2c 20 30 2c 20 30 2c 20 20 20 20 20 20 20  a), 0, 0,       
3bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
3bd0: 0a 20 20 6e 61 6d 65 20 23 23 20 53 74 65 70 46  .  name ## StepF
3be0: 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20 56 61 6c  unc, name ## Val
3bf0: 75 65 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20  ueFunc, name ## 
3c00: 56 61 6c 75 65 46 75 6e 63 2c 20 20 20 20 20 20  ValueFunc,      
3c10: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
3c20: 6e 6f 6f 70 53 74 65 70 46 75 6e 63 2c 20 6e 61  noopStepFunc, na
3c30: 6d 65 20 23 23 20 4e 61 6d 65 2c 20 7b 30 7d 20  me ## Name, {0} 
3c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c60: 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 0a 2f           \.}.../
3c70: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 74 68  *.** Register th
3c80: 6f 73 65 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e  ose built-in win
3c90: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  dow functions th
3ca0: 61 74 20 61 72 65 20 6e 6f 74 20 61 6c 73 6f 20  at are not also 
3cb0: 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2f 0a 76  aggregates..*/.v
3cc0: 6f 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f  oid sqlite3Windo
3cd0: 77 46 75 6e 63 74 69 6f 6e 73 28 76 6f 69 64 29  wFunctions(void)
3ce0: 7b 0a 20 20 73 74 61 74 69 63 20 46 75 6e 63 44  {.  static FuncD
3cf0: 65 66 20 61 57 69 6e 64 6f 77 46 75 6e 63 73 5b  ef aWindowFuncs[
3d00: 5d 20 3d 20 7b 0a 20 20 20 20 57 49 4e 44 4f 57  ] = {.    WINDOW
3d10: 46 55 4e 43 58 28 72 6f 77 5f 6e 75 6d 62 65 72  FUNCX(row_number
3d20: 2c 20 30 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e  , 0, 0),.    WIN
3d30: 44 4f 57 46 55 4e 43 58 28 64 65 6e 73 65 5f 72  DOWFUNCX(dense_r
3d40: 61 6e 6b 2c 20 30 2c 20 30 29 2c 0a 20 20 20 20  ank, 0, 0),.    
3d50: 57 49 4e 44 4f 57 46 55 4e 43 58 28 72 61 6e 6b  WINDOWFUNCX(rank
3d60: 2c 20 30 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e  , 0, 0),.    WIN
3d70: 44 4f 57 46 55 4e 43 58 28 70 65 72 63 65 6e 74  DOWFUNCX(percent
3d80: 5f 72 61 6e 6b 2c 20 30 2c 20 53 51 4c 49 54 45  _rank, 0, SQLITE
3d90: 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 5f 53 49 5a  _FUNC_WINDOW_SIZ
3da0: 45 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46 55  E),.    WINDOWFU
3db0: 4e 43 58 28 63 75 6d 65 5f 64 69 73 74 2c 20 30  NCX(cume_dist, 0
3dc0: 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49  , SQLITE_FUNC_WI
3dd0: 4e 44 4f 57 5f 53 49 5a 45 29 2c 0a 20 20 20 20  NDOW_SIZE),.    
3de0: 57 49 4e 44 4f 57 46 55 4e 43 58 28 6e 74 69 6c  WINDOWFUNCX(ntil
3df0: 65 2c 20 31 2c 20 53 51 4c 49 54 45 5f 46 55 4e  e, 1, SQLITE_FUN
3e00: 43 5f 57 49 4e 44 4f 57 5f 53 49 5a 45 29 2c 0a  C_WINDOW_SIZE),.
3e10: 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 41 4c      WINDOWFUNCAL
3e20: 4c 28 6c 61 73 74 5f 76 61 6c 75 65 2c 20 31 2c  L(last_value, 1,
3e30: 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46   0),.    WINDOWF
3e40: 55 4e 43 4e 4f 4f 50 28 6e 74 68 5f 76 61 6c 75  UNCNOOP(nth_valu
3e50: 65 2c 20 32 2c 20 30 29 2c 0a 20 20 20 20 57 49  e, 2, 0),.    WI
3e60: 4e 44 4f 57 46 55 4e 43 4e 4f 4f 50 28 66 69 72  NDOWFUNCNOOP(fir
3e70: 73 74 5f 76 61 6c 75 65 2c 20 31 2c 20 30 29 2c  st_value, 1, 0),
3e80: 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e  .    WINDOWFUNCN
3e90: 4f 4f 50 28 6c 65 61 64 2c 20 31 2c 20 30 29 2c  OOP(lead, 1, 0),
3ea0: 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e  .    WINDOWFUNCN
3eb0: 4f 4f 50 28 6c 65 61 64 2c 20 32 2c 20 30 29 2c  OOP(lead, 2, 0),
3ec0: 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e  .    WINDOWFUNCN
3ed0: 4f 4f 50 28 6c 65 61 64 2c 20 33 2c 20 30 29 2c  OOP(lead, 3, 0),
3ee0: 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e  .    WINDOWFUNCN
3ef0: 4f 4f 50 28 6c 61 67 2c 20 31 2c 20 30 29 2c 0a  OOP(lag, 1, 0),.
3f00: 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f      WINDOWFUNCNO
3f10: 4f 50 28 6c 61 67 2c 20 32 2c 20 30 29 2c 0a 20  OP(lag, 2, 0),. 
3f20: 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f 4f     WINDOWFUNCNOO
3f30: 50 28 6c 61 67 2c 20 33 2c 20 30 29 2c 0a 20 20  P(lag, 3, 0),.  
3f40: 7d 3b 0a 20 20 73 71 6c 69 74 65 33 49 6e 73 65  };.  sqlite3Inse
3f50: 72 74 42 75 69 6c 74 69 6e 46 75 6e 63 73 28 61  rtBuiltinFuncs(a
3f60: 57 69 6e 64 6f 77 46 75 6e 63 73 2c 20 41 72 72  WindowFuncs, Arr
3f70: 61 79 53 69 7a 65 28 61 57 69 6e 64 6f 77 46 75  aySize(aWindowFu
3f80: 6e 63 73 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ncs));.}../*.** 
3f90: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
3fa0: 20 63 61 6c 6c 65 64 20 69 6d 6d 65 64 69 61 74   called immediat
3fb0: 65 6c 79 20 61 66 74 65 72 20 72 65 73 6f 6c 76  ely after resolv
3fc0: 69 6e 67 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ing the function
3fd0: 20 6e 61 6d 65 0a 2a 2a 20 66 6f 72 20 61 20 77   name.** for a w
3fe0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 77  indow function w
3ff0: 69 74 68 69 6e 20 61 20 53 45 4c 45 43 54 20 73  ithin a SELECT s
4000: 74 61 74 65 6d 65 6e 74 2e 20 41 72 67 75 6d 65  tatement. Argume
4010: 6e 74 20 70 4c 69 73 74 20 69 73 20 61 0a 2a 2a  nt pList is a.**
4020: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
4030: 57 49 4e 44 4f 57 20 64 65 66 69 6e 69 74 69 6f  WINDOW definitio
4040: 6e 73 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ns for the curre
4050: 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  nt SELECT statem
4060: 65 6e 74 2e 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ent..** Argument
4070: 20 70 46 75 6e 63 20 69 73 20 74 68 65 20 66 75   pFunc is the fu
4080: 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f  nction definitio
4090: 6e 20 6a 75 73 74 20 72 65 73 6f 6c 76 65 64 20  n just resolved 
40a0: 61 6e 64 20 70 57 69 6e 0a 2a 2a 20 69 73 20 74  and pWin.** is t
40b0: 68 65 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74  he Window object
40c0: 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68   representing th
40d0: 65 20 61 73 73 6f 63 69 61 74 65 64 20 4f 56 45  e associated OVE
40e0: 52 20 63 6c 61 75 73 65 2e 20 54 68 69 73 0a 2a  R clause. This.*
40f0: 2a 20 66 75 6e 63 74 69 6f 6e 20 75 70 64 61 74  * function updat
4100: 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  es the contents 
4110: 6f 66 20 70 57 69 6e 20 61 73 20 66 6f 6c 6c 6f  of pWin as follo
4120: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66  ws:.**.**   * If
4130: 20 74 68 65 20 4f 56 45 52 20 63 6c 61 75 73 65   the OVER clause
4140: 20 72 65 66 65 72 65 64 20 74 6f 20 61 20 6e 61   refered to a na
4150: 6d 65 64 20 77 69 6e 64 6f 77 20 28 61 73 20 69  med window (as i
4160: 6e 20 22 6d 61 78 28 78 29 20 4f 56 45 52 20 77  n "max(x) OVER w
4170: 69 6e 22 29 2c 0a 2a 2a 20 20 20 20 20 73 65 61  in"),.**     sea
4180: 72 63 68 20 6c 69 73 74 20 70 4c 69 73 74 20 66  rch list pList f
4190: 6f 72 20 61 20 6d 61 74 63 68 69 6e 67 20 57 49  or a matching WI
41a0: 4e 44 4f 57 20 64 65 66 69 6e 69 74 69 6f 6e 2c  NDOW definition,
41b0: 20 61 6e 64 20 75 70 64 61 74 65 20 70 57 69 6e   and update pWin
41c0: 0a 2a 2a 20 20 20 20 20 61 63 63 6f 72 64 69 6e  .**     accordin
41d0: 67 6c 79 2e 20 49 66 20 6e 6f 20 73 75 63 68 20  gly. If no such 
41e0: 57 49 4e 44 4f 57 20 63 6c 61 75 73 65 20 63 61  WINDOW clause ca
41f0: 6e 20 62 65 20 66 6f 75 6e 64 2c 20 6c 65 61 76  n be found, leav
4200: 65 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 20 20  e an error.**   
4210: 20 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2a 0a    in pParse..**.
4220: 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 66 75  **   * If the fu
4230: 6e 63 74 69 6f 6e 20 69 73 20 61 20 62 75 69 6c  nction is a buil
4240: 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63  t-in window func
4250: 74 69 6f 6e 20 74 68 61 74 20 72 65 71 75 69 72  tion that requir
4260: 65 73 20 74 68 65 0a 2a 2a 20 20 20 20 20 77 69  es the.**     wi
4270: 6e 64 6f 77 20 74 6f 20 62 65 20 63 6f 65 72 63  ndow to be coerc
4280: 65 64 20 28 73 65 65 20 22 42 55 49 4c 54 2d 49  ed (see "BUILT-I
4290: 4e 20 57 49 4e 44 4f 57 20 46 55 4e 43 54 49 4f  N WINDOW FUNCTIO
42a0: 4e 53 22 20 61 74 20 74 68 65 20 74 6f 70 0a 2a  NS" at the top.*
42b0: 2a 20 20 20 20 20 6f 66 20 74 68 69 73 20 66 69  *     of this fi
42c0: 6c 65 29 2c 20 70 57 69 6e 20 69 73 20 75 70 64  le), pWin is upd
42d0: 61 74 65 64 20 68 65 72 65 2e 0a 2a 2f 0a 76 6f  ated here..*/.vo
42e0: 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  id sqlite3Window
42f0: 55 70 64 61 74 65 28 0a 20 20 50 61 72 73 65 20  Update(.  Parse 
4300: 2a 70 50 61 72 73 65 2c 20 0a 20 20 57 69 6e 64  *pParse, .  Wind
4310: 6f 77 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  ow *pList,      
4320: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
4330: 69 73 74 20 6f 66 20 6e 61 6d 65 64 20 77 69 6e  ist of named win
4340: 64 6f 77 73 20 66 6f 72 20 74 68 69 73 20 53 45  dows for this SE
4350: 4c 45 43 54 20 2a 2f 0a 20 20 57 69 6e 64 6f 77  LECT */.  Window
4360: 20 2a 70 57 69 6e 2c 20 20 20 20 20 20 20 20 20   *pWin,         
4370: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6e            /* Win
4380: 64 6f 77 20 66 72 61 6d 65 20 74 6f 20 75 70 64  dow frame to upd
4390: 61 74 65 20 2a 2f 0a 20 20 46 75 6e 63 44 65 66  ate */.  FuncDef
43a0: 20 2a 70 46 75 6e 63 20 20 20 20 20 20 20 20 20   *pFunc         
43b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6e 64           /* Wind
43c0: 6f 77 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69  ow function defi
43d0: 6e 69 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69  nition */.){.  i
43e0: 66 28 20 70 57 69 6e 2d 3e 7a 4e 61 6d 65 20 26  f( pWin->zName &
43f0: 26 20 70 57 69 6e 2d 3e 65 54 79 70 65 3d 3d 30  & pWin->eType==0
4400: 20 29 7b 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a   ){.    Window *
4410: 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69  p;.    for(p=pLi
4420: 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  st; p; p=p->pNex
4430: 74 57 69 6e 29 7b 0a 20 20 20 20 20 20 69 66 28  tWin){.      if(
4440: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
4450: 70 2d 3e 7a 4e 61 6d 65 2c 20 70 57 69 6e 2d 3e  p->zName, pWin->
4460: 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61  zName)==0 ) brea
4470: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
4480: 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73   p==0 ){.      s
4490: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
44a0: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
44b0: 77 69 6e 64 6f 77 3a 20 25 73 22 2c 20 70 57 69  window: %s", pWi
44c0: 6e 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  n->zName);.     
44d0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
44e0: 20 20 20 70 57 69 6e 2d 3e 70 50 61 72 74 69 74     pWin->pPartit
44f0: 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ion = sqlite3Exp
4500: 72 4c 69 73 74 44 75 70 28 70 50 61 72 73 65 2d  rListDup(pParse-
4510: 3e 64 62 2c 20 70 2d 3e 70 50 61 72 74 69 74 69  >db, p->pPartiti
4520: 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 70 57 69 6e  on, 0);.    pWin
4530: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c  ->pOrderBy = sql
4540: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
4550: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70  pParse->db, p->p
4560: 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 20 20 20  OrderBy, 0);.   
4570: 20 70 57 69 6e 2d 3e 70 53 74 61 72 74 20 3d 20   pWin->pStart = 
4580: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
4590: 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 53  Parse->db, p->pS
45a0: 74 61 72 74 2c 20 30 29 3b 0a 20 20 20 20 70 57  tart, 0);.    pW
45b0: 69 6e 2d 3e 70 45 6e 64 20 3d 20 73 71 6c 69 74  in->pEnd = sqlit
45c0: 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65  e3ExprDup(pParse
45d0: 2d 3e 64 62 2c 20 70 2d 3e 70 45 6e 64 2c 20 30  ->db, p->pEnd, 0
45e0: 29 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 65 53 74  );.    pWin->eSt
45f0: 61 72 74 20 3d 20 70 2d 3e 65 53 74 61 72 74 3b  art = p->eStart;
4600: 0a 20 20 20 20 70 57 69 6e 2d 3e 65 45 6e 64 20  .    pWin->eEnd 
4610: 3d 20 70 2d 3e 65 45 6e 64 3b 0a 20 20 20 20 70  = p->eEnd;.    p
4620: 57 69 6e 2d 3e 65 54 79 70 65 20 3d 20 70 2d 3e  Win->eType = p->
4630: 65 54 79 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28  eType;.  }.  if(
4640: 20 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67   pFunc->funcFlag
4650: 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
4660: 57 49 4e 44 4f 57 20 29 7b 0a 20 20 20 20 73 71  WINDOW ){.    sq
4670: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
4680: 73 65 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28 20  se->db;.    if( 
4690: 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72 20 29 7b  pWin->pFilter ){
46a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
46b0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
46c0: 20 20 20 20 20 20 20 20 20 20 22 46 49 4c 54 45            "FILTE
46d0: 52 20 63 6c 61 75 73 65 20 6d 61 79 20 6f 6e 6c  R clause may onl
46e0: 79 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61  y be used with a
46f0: 67 67 72 65 67 61 74 65 20 77 69 6e 64 6f 77 20  ggregate window 
4700: 66 75 6e 63 74 69 6f 6e 73 22 0a 20 20 20 20 20  functions".     
4710: 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 20 20   );.    }else.  
4720: 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 7a 4e 61    if( pFunc->zNa
4730: 6d 65 3d 3d 72 6f 77 5f 6e 75 6d 62 65 72 4e 61  me==row_numberNa
4740: 6d 65 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61  me || pFunc->zNa
4750: 6d 65 3d 3d 6e 74 69 6c 65 4e 61 6d 65 20 29 7b  me==ntileName ){
4760: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
4770: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 57 69  prDelete(db, pWi
4780: 6e 2d 3e 70 53 74 61 72 74 29 3b 0a 20 20 20 20  n->pStart);.    
4790: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
47a0: 65 74 65 28 64 62 2c 20 70 57 69 6e 2d 3e 70 45  ete(db, pWin->pE
47b0: 6e 64 29 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d  nd);.      pWin-
47c0: 3e 70 53 74 61 72 74 20 3d 20 70 57 69 6e 2d 3e  >pStart = pWin->
47d0: 70 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  pEnd = 0;.      
47e0: 70 57 69 6e 2d 3e 65 54 79 70 65 20 3d 20 54 4b  pWin->eType = TK
47f0: 5f 52 4f 57 53 3b 0a 20 20 20 20 20 20 70 57 69  _ROWS;.      pWi
4800: 6e 2d 3e 65 53 74 61 72 74 20 3d 20 54 4b 5f 55  n->eStart = TK_U
4810: 4e 42 4f 55 4e 44 45 44 3b 0a 20 20 20 20 20 20  NBOUNDED;.      
4820: 70 57 69 6e 2d 3e 65 45 6e 64 20 3d 20 54 4b 5f  pWin->eEnd = TK_
4830: 43 55 52 52 45 4e 54 3b 0a 20 20 20 20 7d 65 6c  CURRENT;.    }el
4840: 73 65 0a 0a 20 20 20 20 69 66 28 20 70 46 75 6e  se..    if( pFun
4850: 63 2d 3e 7a 4e 61 6d 65 3d 3d 64 65 6e 73 65 5f  c->zName==dense_
4860: 72 61 6e 6b 4e 61 6d 65 20 7c 7c 20 70 46 75 6e  rankName || pFun
4870: 63 2d 3e 7a 4e 61 6d 65 3d 3d 72 61 6e 6b 4e 61  c->zName==rankNa
4880: 6d 65 0a 20 20 20 20 20 7c 7c 20 70 46 75 6e 63  me.     || pFunc
4890: 2d 3e 7a 4e 61 6d 65 3d 3d 70 65 72 63 65 6e 74  ->zName==percent
48a0: 5f 72 61 6e 6b 4e 61 6d 65 20 7c 7c 20 70 46 75  _rankName || pFu
48b0: 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 63 75 6d 65 5f  nc->zName==cume_
48c0: 64 69 73 74 4e 61 6d 65 0a 20 20 20 20 29 7b 0a  distName.    ){.
48d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
48e0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 57 69 6e  rDelete(db, pWin
48f0: 2d 3e 70 53 74 61 72 74 29 3b 0a 20 20 20 20 20  ->pStart);.     
4900: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
4910: 74 65 28 64 62 2c 20 70 57 69 6e 2d 3e 70 45 6e  te(db, pWin->pEn
4920: 64 29 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e  d);.      pWin->
4930: 70 53 74 61 72 74 20 3d 20 70 57 69 6e 2d 3e 70  pStart = pWin->p
4940: 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  End = 0;.      p
4950: 57 69 6e 2d 3e 65 54 79 70 65 20 3d 20 54 4b 5f  Win->eType = TK_
4960: 52 41 4e 47 45 3b 0a 20 20 20 20 20 20 70 57 69  RANGE;.      pWi
4970: 6e 2d 3e 65 53 74 61 72 74 20 3d 20 54 4b 5f 55  n->eStart = TK_U
4980: 4e 42 4f 55 4e 44 45 44 3b 0a 20 20 20 20 20 20  NBOUNDED;.      
4990: 70 57 69 6e 2d 3e 65 45 6e 64 20 3d 20 54 4b 5f  pWin->eEnd = TK_
49a0: 43 55 52 52 45 4e 54 3b 0a 20 20 20 20 7d 0a 20  CURRENT;.    }. 
49b0: 20 7d 0a 20 20 70 57 69 6e 2d 3e 70 46 75 6e 63   }.  pWin->pFunc
49c0: 20 3d 20 70 46 75 6e 63 3b 0a 7d 0a 0a 2f 2a 0a   = pFunc;.}../*.
49d0: 2a 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63  ** Context objec
49e0: 74 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  t passed through
49f0: 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
4a00: 4c 69 73 74 28 29 20 74 6f 0a 2a 2a 20 73 65 6c  List() to.** sel
4a10: 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65  ectWindowRewrite
4a20: 45 78 70 72 43 62 28 29 20 62 79 20 73 65 6c 65  ExprCb() by sele
4a30: 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65 45  ctWindowRewriteE
4a40: 4c 69 73 74 28 29 2e 0a 2a 2f 0a 74 79 70 65 64  List()..*/.typed
4a50: 65 66 20 73 74 72 75 63 74 20 57 69 6e 64 6f 77  ef struct Window
4a60: 52 65 77 72 69 74 65 20 57 69 6e 64 6f 77 52 65  Rewrite WindowRe
4a70: 77 72 69 74 65 3b 0a 73 74 72 75 63 74 20 57 69  write;.struct Wi
4a80: 6e 64 6f 77 52 65 77 72 69 74 65 20 7b 0a 20 20  ndowRewrite {.  
4a90: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20  Window *pWin;.  
4aa0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20  SrcList *pSrc;. 
4ab0: 20 45 78 70 72 4c 69 73 74 20 2a 70 53 75 62 3b   ExprList *pSub;
4ac0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 53  .  Select *pSubS
4ad0: 65 6c 65 63 74 3b 20 20 20 20 20 20 20 20 20 20  elect;          
4ae0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 75     /* Current su
4af0: 62 2d 73 65 6c 65 63 74 2c 20 69 66 20 61 6e 79  b-select, if any
4b00: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61   */.};../*.** Ca
4b10: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
4b20: 75 73 65 64 20 62 79 20 73 65 6c 65 63 74 57 69  used by selectWi
4b30: 6e 64 6f 77 52 65 77 72 69 74 65 45 4c 69 73 74  ndowRewriteEList
4b40: 28 29 2e 20 49 66 20 6e 65 63 65 73 73 61 72 79  (). If necessary
4b50: 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  ,.** this functi
4b60: 6f 6e 20 61 70 70 65 6e 64 73 20 74 6f 20 74 68  on appends to th
4b70: 65 20 6f 75 74 70 75 74 20 65 78 70 72 65 73 73  e output express
4b80: 69 6f 6e 2d 6c 69 73 74 20 61 6e 64 20 75 70 64  ion-list and upd
4b90: 61 74 65 73 20 0a 2a 2a 20 65 78 70 72 65 73 73  ates .** express
4ba0: 69 6f 6e 20 28 2a 70 70 45 78 70 72 29 20 69 6e  ion (*ppExpr) in
4bb0: 20 70 6c 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69   place..*/.stati
4bc0: 63 20 69 6e 74 20 73 65 6c 65 63 74 57 69 6e 64  c int selectWind
4bd0: 6f 77 52 65 77 72 69 74 65 45 78 70 72 43 62 28  owRewriteExprCb(
4be0: 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
4bf0: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
4c00: 20 73 74 72 75 63 74 20 57 69 6e 64 6f 77 52 65   struct WindowRe
4c10: 77 72 69 74 65 20 2a 70 20 3d 20 70 57 61 6c 6b  write *p = pWalk
4c20: 65 72 2d 3e 75 2e 70 52 65 77 72 69 74 65 3b 0a  er->u.pRewrite;.
4c30: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
4c40: 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
4c50: 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  e;..  /* If this
4c60: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69   function is bei
4c70: 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77  ng called from w
4c80: 69 74 68 69 6e 20 61 20 73 63 61 6c 61 72 20 73  ithin a scalar s
4c90: 75 62 2d 73 65 6c 65 63 74 0a 20 20 2a 2a 20 74  ub-select.  ** t
4ca0: 68 61 74 20 75 73 65 64 20 62 79 20 74 68 65 20  hat used by the 
4cb0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
4cc0: 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64   being processed
4cd0: 2c 20 6f 6e 6c 79 20 70 72 6f 63 65 73 73 0a 20  , only process. 
4ce0: 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 20 65 78   ** TK_COLUMN ex
4cf0: 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72  pressions that r
4d00: 65 66 65 72 20 74 6f 20 69 74 20 28 74 68 65 20  efer to it (the 
4d10: 6f 75 74 65 72 20 53 45 4c 45 43 54 29 2e 20 44  outer SELECT). D
4d20: 6f 0a 20 20 2a 2a 20 6e 6f 74 20 70 72 6f 63 65  o.  ** not proce
4d30: 73 73 20 61 67 67 72 65 67 61 74 65 73 20 6f 72  ss aggregates or
4d40: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
4d50: 73 20 61 74 20 61 6c 6c 2c 20 61 73 20 74 68 65  s at all, as the
4d60: 79 20 62 65 6c 6f 6e 67 0a 20 20 2a 2a 20 74 6f  y belong.  ** to
4d70: 20 74 68 65 20 73 63 61 6c 61 72 20 73 75 62 2d   the scalar sub-
4d80: 73 65 6c 65 63 74 2e 20 20 2a 2f 0a 20 20 69 66  select.  */.  if
4d90: 28 20 70 2d 3e 70 53 75 62 53 65 6c 65 63 74 20  ( p->pSubSelect 
4da0: 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  ){.    if( pExpr
4db0: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
4dc0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
4dd0: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
4de0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
4df0: 6e 74 20 6e 53 72 63 20 3d 20 70 2d 3e 70 53 72  nt nSrc = p->pSr
4e00: 63 2d 3e 6e 53 72 63 3b 0a 20 20 20 20 20 20 69  c->nSrc;.      i
4e10: 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
4e20: 69 3d 30 3b 20 69 3c 6e 53 72 63 3b 20 69 2b 2b  i=0; i<nSrc; i++
4e30: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
4e40: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 2d  Expr->iTable==p-
4e50: 3e 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72  >pSrc->a[i].iCur
4e60: 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  sor ) break;.   
4e70: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
4e80: 3d 3d 6e 53 72 63 20 29 20 72 65 74 75 72 6e 20  ==nSrc ) return 
4e90: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
4ea0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63    }.  }..  switc
4eb0: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
4ec0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
4ed0: 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28  CTION:.      if(
4ee0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
4ef0: 79 28 70 45 78 70 72 2c 20 45 50 5f 57 69 6e 46  y(pExpr, EP_WinF
4f00: 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  unc) ){.        
4f10: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c  break;.      }el
4f20: 73 65 7b 0a 20 20 20 20 20 20 20 20 57 69 6e 64  se{.        Wind
4f30: 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 20 20 20 20  ow *pWin;.      
4f40: 20 20 66 6f 72 28 70 57 69 6e 3d 70 2d 3e 70 57    for(pWin=p->pW
4f50: 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70  in; pWin; pWin=p
4f60: 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a  Win->pNextWin){.
4f70: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
4f80: 78 70 72 2d 3e 79 2e 70 57 69 6e 3d 3d 70 57 69  xpr->y.pWin==pWi
4f90: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
4fa0: 20 61 73 73 65 72 74 28 20 70 57 69 6e 2d 3e 70   assert( pWin->p
4fb0: 4f 77 6e 65 72 3d 3d 70 45 78 70 72 20 29 3b 0a  Owner==pExpr );.
4fc0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
4fd0: 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
4fe0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4ff0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
5000: 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67    /* Fall throug
5010: 68 2e 20 20 2a 2f 0a 0a 20 20 20 20 63 61 73 65  h.  */..    case
5020: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
5030: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
5040: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78  LUMN: {.      Ex
5050: 70 72 20 2a 70 44 75 70 20 3d 20 73 71 6c 69 74  pr *pDup = sqlit
5060: 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65  e3ExprDup(pParse
5070: 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b  ->db, pExpr, 0);
5080: 0a 20 20 20 20 20 20 70 2d 3e 70 53 75 62 20 3d  .      p->pSub =
5090: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
50a0: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
50b0: 2d 3e 70 53 75 62 2c 20 70 44 75 70 29 3b 0a 20  ->pSub, pDup);. 
50c0: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 53 75 62       if( p->pSub
50d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
50e0: 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  rt( ExprHasPrope
50f0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 74  rty(pExpr, EP_St
5100: 61 74 69 63 29 3d 3d 30 20 29 3b 0a 20 20 20 20  atic)==0 );.    
5110: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
5120: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 74  rty(pExpr, EP_St
5130: 61 74 69 63 29 3b 0a 20 20 20 20 20 20 20 20 73  atic);.        s
5140: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
5150: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78  (pParse->db, pEx
5160: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70  pr);.        Exp
5170: 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 70  rClearProperty(p
5180: 45 78 70 72 2c 20 45 50 5f 53 74 61 74 69 63 29  Expr, EP_Static)
5190: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ;.        memset
51a0: 28 70 45 78 70 72 2c 20 30 2c 20 73 69 7a 65 6f  (pExpr, 0, sizeo
51b0: 66 28 45 78 70 72 29 29 3b 0a 0a 20 20 20 20 20  f(Expr));..     
51c0: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
51d0: 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20  K_COLUMN;.      
51e0: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
51f0: 20 3d 20 70 2d 3e 70 53 75 62 2d 3e 6e 45 78 70   = p->pSub->nExp
5200: 72 2d 31 3b 0a 20 20 20 20 20 20 20 20 70 45 78  r-1;.        pEx
5210: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 2d 3e  pr->iTable = p->
5220: 70 57 69 6e 2d 3e 69 45 70 68 43 73 72 3b 0a 20  pWin->iEphCsr;. 
5230: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62 72       }..      br
5240: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
5250: 64 65 66 61 75 6c 74 3a 20 2f 2a 20 6e 6f 2d 6f  default: /* no-o
5260: 70 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  p */.      break
5270: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
5280: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
5290: 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63  static int selec
52a0: 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65 53 65  tWindowRewriteSe
52b0: 6c 65 63 74 43 62 28 57 61 6c 6b 65 72 20 2a 70  lectCb(Walker *p
52c0: 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
52d0: 70 53 65 6c 65 63 74 29 7b 0a 20 20 73 74 72 75  pSelect){.  stru
52e0: 63 74 20 57 69 6e 64 6f 77 52 65 77 72 69 74 65  ct WindowRewrite
52f0: 20 2a 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75   *p = pWalker->u
5300: 2e 70 52 65 77 72 69 74 65 3b 0a 20 20 53 65 6c  .pRewrite;.  Sel
5310: 65 63 74 20 2a 70 53 61 76 65 20 3d 20 70 2d 3e  ect *pSave = p->
5320: 70 53 75 62 53 65 6c 65 63 74 3b 0a 20 20 69 66  pSubSelect;.  if
5330: 28 20 70 53 61 76 65 3d 3d 70 53 65 6c 65 63 74  ( pSave==pSelect
5340: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   ){.    return W
5350: 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d  RC_Continue;.  }
5360: 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 70 53 75  else{.    p->pSu
5370: 62 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63  bSelect = pSelec
5380: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61  t;.    sqlite3Wa
5390: 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
53a0: 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  , pSelect);.    
53b0: 70 2d 3e 70 53 75 62 53 65 6c 65 63 74 20 3d 20  p->pSubSelect = 
53c0: 70 53 61 76 65 3b 0a 20 20 7d 0a 20 20 72 65 74  pSave;.  }.  ret
53d0: 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 7d  urn WRC_Prune;.}
53e0: 0a 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 65  .../*.** Iterate
53f0: 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78   through each ex
5400: 70 72 65 73 73 69 6f 6e 20 69 6e 20 65 78 70 72  pression in expr
5410: 65 73 73 69 6f 6e 2d 6c 69 73 74 20 70 45 4c 69  ession-list pELi
5420: 73 74 2e 20 46 6f 72 20 65 61 63 68 3a 0a 2a 2a  st. For each:.**
5430: 0a 2a 2a 20 20 20 2a 20 54 4b 5f 43 4f 4c 55 4d  .**   * TK_COLUM
5440: 4e 2c 0a 2a 2a 20 20 20 2a 20 61 67 67 72 65 67  N,.**   * aggreg
5450: 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 72  ate function, or
5460: 0a 2a 2a 20 20 20 2a 20 77 69 6e 64 6f 77 20 66  .**   * window f
5470: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 61 20 57  unction with a W
5480: 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 74 68 61  indow object tha
5490: 74 20 69 73 20 6e 6f 74 20 61 20 6d 65 6d 62 65  t is not a membe
54a0: 72 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20 20  r of the .**    
54b0: 20 57 69 6e 64 6f 77 20 6c 69 73 74 20 70 61 73   Window list pas
54c0: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
54d0: 64 20 61 72 67 75 6d 65 6e 74 20 28 70 57 69 6e  d argument (pWin
54e0: 29 2e 0a 2a 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  )..**.** Append 
54f0: 74 68 65 20 6e 6f 64 65 20 74 6f 20 6f 75 74 70  the node to outp
5500: 75 74 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69  ut expression-li
5510: 73 74 20 28 2a 70 70 53 75 62 29 2e 20 41 6e 64  st (*ppSub). And
5520: 20 72 65 70 6c 61 63 65 20 69 74 0a 2a 2a 20 77   replace it.** w
5530: 69 74 68 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20  ith a TK_COLUMN 
5540: 74 68 61 74 20 72 65 61 64 73 20 74 68 65 20 28  that reads the (
5550: 4e 2d 31 29 74 68 20 65 6c 65 6d 65 6e 74 20 6f  N-1)th element o
5560: 66 20 74 61 62 6c 65 20 0a 2a 2a 20 70 57 69 6e  f table .** pWin
5570: 2d 3e 69 45 70 68 43 73 72 2c 20 77 68 65 72 65  ->iEphCsr, where
5580: 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   N is the number
5590: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
55a0: 28 2a 70 70 53 75 62 29 20 61 66 74 65 72 0a 2a  (*ppSub) after.*
55b0: 2a 20 61 70 70 65 6e 64 69 6e 67 20 74 68 65 20  * appending the 
55c0: 6e 65 77 20 6f 6e 65 2e 0a 2a 2f 0a 73 74 61 74  new one..*/.stat
55d0: 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 57 69  ic void selectWi
55e0: 6e 64 6f 77 52 65 77 72 69 74 65 45 4c 69 73 74  ndowRewriteEList
55f0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
5600: 65 2c 20 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57  e, .  Window *pW
5610: 69 6e 2c 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  in,.  SrcList *p
5620: 53 72 63 2c 0a 20 20 45 78 70 72 4c 69 73 74 20  Src,.  ExprList 
5630: 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 20  *pEList,        
5640: 20 20 20 20 20 20 20 2f 2a 20 52 65 77 72 69 74         /* Rewrit
5650: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  e expressions in
5660: 20 74 68 69 73 20 6c 69 73 74 20 2a 2f 0a 20 20   this list */.  
5670: 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 53 75 62  ExprList **ppSub
5680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5690: 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 75 62 2d 73  /* IN/OUT: Sub-s
56a0: 65 6c 65 63 74 20 65 78 70 72 65 73 73 69 6f 6e  elect expression
56b0: 2d 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 57 61  -list */.){.  Wa
56c0: 6c 6b 65 72 20 73 57 61 6c 6b 65 72 3b 0a 20 20  lker sWalker;.  
56d0: 57 69 6e 64 6f 77 52 65 77 72 69 74 65 20 73 52  WindowRewrite sR
56e0: 65 77 72 69 74 65 3b 0a 0a 20 20 6d 65 6d 73 65  ewrite;..  memse
56f0: 74 28 26 73 57 61 6c 6b 65 72 2c 20 30 2c 20 73  t(&sWalker, 0, s
5700: 69 7a 65 6f 66 28 57 61 6c 6b 65 72 29 29 3b 0a  izeof(Walker));.
5710: 20 20 6d 65 6d 73 65 74 28 26 73 52 65 77 72 69    memset(&sRewri
5720: 74 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57 69  te, 0, sizeof(Wi
5730: 6e 64 6f 77 52 65 77 72 69 74 65 29 29 3b 0a 0a  ndowRewrite));..
5740: 20 20 73 52 65 77 72 69 74 65 2e 70 53 75 62 20    sRewrite.pSub 
5750: 3d 20 2a 70 70 53 75 62 3b 0a 20 20 73 52 65 77  = *ppSub;.  sRew
5760: 72 69 74 65 2e 70 57 69 6e 20 3d 20 70 57 69 6e  rite.pWin = pWin
5770: 3b 0a 20 20 73 52 65 77 72 69 74 65 2e 70 53 72  ;.  sRewrite.pSr
5780: 63 20 3d 20 70 53 72 63 3b 0a 0a 20 20 73 57 61  c = pSrc;..  sWa
5790: 6c 6b 65 72 2e 70 50 61 72 73 65 20 3d 20 70 50  lker.pParse = pP
57a0: 61 72 73 65 3b 0a 20 20 73 57 61 6c 6b 65 72 2e  arse;.  sWalker.
57b0: 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
57c0: 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72  selectWindowRewr
57d0: 69 74 65 45 78 70 72 43 62 3b 0a 20 20 73 57 61  iteExprCb;.  sWa
57e0: 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c  lker.xSelectCall
57f0: 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 57 69 6e  back = selectWin
5800: 64 6f 77 52 65 77 72 69 74 65 53 65 6c 65 63 74  dowRewriteSelect
5810: 43 62 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 75 2e  Cb;.  sWalker.u.
5820: 70 52 65 77 72 69 74 65 20 3d 20 26 73 52 65 77  pRewrite = &sRew
5830: 72 69 74 65 3b 0a 0a 20 20 28 76 6f 69 64 29 73  rite;..  (void)s
5840: 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69  qlite3WalkExprLi
5850: 73 74 28 26 73 57 61 6c 6b 65 72 2c 20 70 45 4c  st(&sWalker, pEL
5860: 69 73 74 29 3b 0a 0a 20 20 2a 70 70 53 75 62 20  ist);..  *ppSub 
5870: 3d 20 73 52 65 77 72 69 74 65 2e 70 53 75 62 3b  = sRewrite.pSub;
5880: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
5890: 20 61 20 63 6f 70 79 20 6f 66 20 65 61 63 68 20   a copy of each 
58a0: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 65 78  expression in ex
58b0: 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 70 41  pression-list pA
58c0: 70 70 65 6e 64 20 74 6f 0a 2a 2a 20 65 78 70 72  ppend to.** expr
58d0: 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 4c 69 73  ession list pLis
58e0: 74 2e 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  t. Return a poin
58f0: 74 65 72 20 74 6f 20 74 68 65 20 72 65 73 75 6c  ter to the resul
5900: 74 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  t list..*/.stati
5910: 63 20 45 78 70 72 4c 69 73 74 20 2a 65 78 70 72  c ExprList *expr
5920: 4c 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28 0a  ListAppendList(.
5930: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
5940: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
5950: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
5960: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
5970: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  t,        /* Lis
5980: 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70  t to which to ap
5990: 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e  pend. Might be N
59a0: 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
59b0: 74 20 2a 70 41 70 70 65 6e 64 20 20 20 20 20 20  t *pAppend      
59c0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75   /* List of valu
59d0: 65 73 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69  es to append. Mi
59e0: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29  ght be NULL */.)
59f0: 7b 0a 20 20 69 66 28 20 70 41 70 70 65 6e 64 20  {.  if( pAppend 
5a00: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
5a10: 20 20 69 6e 74 20 6e 49 6e 69 74 20 3d 20 70 4c    int nInit = pL
5a20: 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78  ist ? pList->nEx
5a30: 70 72 20 3a 20 30 3b 0a 20 20 20 20 66 6f 72 28  pr : 0;.    for(
5a40: 69 3d 30 3b 20 69 3c 70 41 70 70 65 6e 64 2d 3e  i=0; i<pAppend->
5a50: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
5a60: 20 20 20 45 78 70 72 20 2a 70 44 75 70 20 3d 20     Expr *pDup = 
5a70: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
5a80: 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 70 70 65  Parse->db, pAppe
5a90: 6e 64 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  nd->a[i].pExpr, 
5aa0: 30 29 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 20  0);.      pList 
5ab0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
5ac0: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
5ad0: 70 4c 69 73 74 2c 20 70 44 75 70 29 3b 0a 20 20  pList, pDup);.  
5ae0: 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 20      if( pList ) 
5af0: 70 4c 69 73 74 2d 3e 61 5b 6e 49 6e 69 74 2b 69  pList->a[nInit+i
5b00: 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 41  ].sortOrder = pA
5b10: 70 70 65 6e 64 2d 3e 61 5b 69 5d 2e 73 6f 72 74  ppend->a[i].sort
5b20: 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  Order;.    }.  }
5b30: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
5b40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
5b50: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
5b60: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
5b70: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
5b80: 64 6f 65 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 0a  does not invoke.
5b90: 2a 2a 20 61 6e 79 20 53 51 4c 20 77 69 6e 64 6f  ** any SQL windo
5ba0: 77 20 66 75 6e 63 74 69 6f 6e 73 2c 20 74 68 69  w functions, thi
5bb0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
5bc0: 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
5bd0: 2c 20 69 74 20 0a 2a 2a 20 72 65 77 72 69 74 65  , it .** rewrite
5be0: 73 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  s the SELECT sta
5bf0: 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77  tement so that w
5c00: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 78  indow function x
5c10: 53 74 65 70 20 66 75 6e 63 74 69 6f 6e 73 0a 2a  Step functions.*
5c20: 2a 20 61 72 65 20 69 6e 76 6f 6b 65 64 20 69 6e  * are invoked in
5c30: 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64   the correct ord
5c40: 65 72 20 61 73 20 64 65 73 63 72 69 62 65 64 20  er as described 
5c50: 75 6e 64 65 72 20 22 53 45 4c 45 43 54 20 52 45  under "SELECT RE
5c60: 57 52 49 54 49 4e 47 22 0a 2a 2a 20 61 74 20 74  WRITING".** at t
5c70: 68 65 20 74 6f 70 20 6f 66 20 74 68 69 73 20 66  he top of this f
5c80: 69 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ile..*/.int sqli
5c90: 74 65 33 57 69 6e 64 6f 77 52 65 77 72 69 74 65  te3WindowRewrite
5ca0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
5cb0: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e  Select *p){.  in
5cc0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
5cd0: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 57 69 6e 20  ;.  if( p->pWin 
5ce0: 26 26 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  && p->pPrior==0 
5cf0: 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  ){.    Vdbe *v =
5d00: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
5d10: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 73 71 6c  pParse);.    sql
5d20: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
5d30: 65 2d 3e 64 62 3b 0a 20 20 20 20 53 65 6c 65 63  e->db;.    Selec
5d40: 74 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20  t *pSub = 0;    
5d50: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
5d60: 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  subquery */.    
5d70: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20  SrcList *pSrc = 
5d80: 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 45 78 70  p->pSrc;.    Exp
5d90: 72 20 2a 70 57 68 65 72 65 20 3d 20 70 2d 3e 70  r *pWhere = p->p
5da0: 57 68 65 72 65 3b 0a 20 20 20 20 45 78 70 72 4c  Where;.    ExprL
5db0: 69 73 74 20 2a 70 47 72 6f 75 70 42 79 20 3d 20  ist *pGroupBy = 
5dc0: 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  p->pGroupBy;.   
5dd0: 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 20 3d   Expr *pHaving =
5de0: 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 20   p->pHaving;.   
5df0: 20 45 78 70 72 4c 69 73 74 20 2a 70 53 6f 72 74   ExprList *pSort
5e00: 20 3d 20 30 3b 0a 0a 20 20 20 20 45 78 70 72 4c   = 0;..    ExprL
5e10: 69 73 74 20 2a 70 53 75 62 6c 69 73 74 20 3d 20  ist *pSublist = 
5e20: 30 3b 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72  0;       /* Expr
5e30: 65 73 73 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20  ession list for 
5e40: 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 20  sub-query */.   
5e50: 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d   Window *pMWin =
5e60: 20 70 2d 3e 70 57 69 6e 3b 20 20 20 20 20 20 2f   p->pWin;      /
5e70: 2a 20 4d 61 73 74 65 72 20 77 69 6e 64 6f 77 20  * Master window 
5e80: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 57 69  object */.    Wi
5e90: 6e 64 6f 77 20 2a 70 57 69 6e 3b 20 20 20 20 20  ndow *pWin;     
5ea0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
5eb0: 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 69 74 65  indow object ite
5ec0: 72 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 70 2d  rator */..    p-
5ed0: 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 70  >pSrc = 0;.    p
5ee0: 2d 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20  ->pWhere = 0;.  
5ef0: 20 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20    p->pGroupBy = 
5f00: 30 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e  0;.    p->pHavin
5f10: 67 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43  g = 0;..    /* C
5f20: 72 65 61 74 65 20 74 68 65 20 4f 52 44 45 52 20  reate the ORDER 
5f30: 42 59 20 63 6c 61 75 73 65 20 66 6f 72 20 74 68  BY clause for th
5f40: 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 54 68  e sub-select. Th
5f50: 69 73 20 69 73 20 74 68 65 20 63 6f 6e 63 61 74  is is the concat
5f60: 65 6e 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6f  enation.    ** o
5f70: 66 20 74 68 65 20 77 69 6e 64 6f 77 20 50 41 52  f the window PAR
5f80: 54 49 54 49 4f 4e 20 61 6e 64 20 4f 52 44 45 52  TITION and ORDER
5f90: 20 42 59 20 63 6c 61 75 73 65 73 2e 20 54 68 65   BY clauses. The
5fa0: 6e 2c 20 69 66 20 74 68 69 73 20 6d 61 6b 65 73  n, if this makes
5fb0: 20 69 74 0a 20 20 20 20 2a 2a 20 72 65 64 75 6e   it.    ** redun
5fc0: 64 61 6e 74 2c 20 72 65 6d 6f 76 65 20 74 68 65  dant, remove the
5fd0: 20 4f 52 44 45 52 20 42 59 20 66 72 6f 6d 20 74   ORDER BY from t
5fe0: 68 65 20 70 61 72 65 6e 74 20 53 45 4c 45 43 54  he parent SELECT
5ff0: 2e 20 20 2a 2f 0a 20 20 20 20 70 53 6f 72 74 20  .  */.    pSort 
6000: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
6010: 74 44 75 70 28 64 62 2c 20 70 4d 57 69 6e 2d 3e  tDup(db, pMWin->
6020: 70 50 61 72 74 69 74 69 6f 6e 2c 20 30 29 3b 0a  pPartition, 0);.
6030: 20 20 20 20 70 53 6f 72 74 20 3d 20 65 78 70 72      pSort = expr
6040: 4c 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28 70  ListAppendList(p
6050: 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 4d  Parse, pSort, pM
6060: 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  Win->pOrderBy);.
6070: 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 26 26      if( pSort &&
6080: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
6090: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
60a0: 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65  3ExprListCompare
60b0: 28 70 53 6f 72 74 2c 20 70 2d 3e 70 4f 72 64 65  (pSort, p->pOrde
60c0: 72 42 79 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20  rBy, -1)==0 ){. 
60d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
60e0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
60f0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
6100: 20 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72         p->pOrder
6110: 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  By = 0;.      }.
6120: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 73      }..    /* As
6130: 73 69 67 6e 20 61 20 63 75 72 73 6f 72 20 6e 75  sign a cursor nu
6140: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 65 70 68  mber for the eph
6150: 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 75 73 65  emeral table use
6160: 64 20 74 6f 20 62 75 66 66 65 72 20 72 6f 77 73  d to buffer rows
6170: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 4f 70 65  ..    ** The Ope
6180: 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72  nEphemeral instr
6190: 75 63 74 69 6f 6e 20 69 73 20 63 6f 64 65 64 20  uction is coded 
61a0: 6c 61 74 65 72 2c 20 61 66 74 65 72 20 69 74 20  later, after it 
61b0: 69 73 20 6b 6e 6f 77 6e 20 68 6f 77 0a 20 20 20  is known how.   
61c0: 20 2a 2a 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73   ** many columns
61d0: 20 74 68 65 20 74 61 62 6c 65 20 77 69 6c 6c 20   the table will 
61e0: 68 61 76 65 2e 20 20 2a 2f 0a 20 20 20 20 70 4d  have.  */.    pM
61f0: 57 69 6e 2d 3e 69 45 70 68 43 73 72 20 3d 20 70  Win->iEphCsr = p
6200: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 0a  Parse->nTab++;..
6210: 20 20 20 20 73 65 6c 65 63 74 57 69 6e 64 6f 77      selectWindow
6220: 52 65 77 72 69 74 65 45 4c 69 73 74 28 70 50 61  RewriteEList(pPa
6230: 72 73 65 2c 20 70 4d 57 69 6e 2c 20 70 53 72 63  rse, pMWin, pSrc
6240: 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 26 70 53  , p->pEList, &pS
6250: 75 62 6c 69 73 74 29 3b 0a 20 20 20 20 73 65 6c  ublist);.    sel
6260: 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65  ectWindowRewrite
6270: 45 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4d  EList(pParse, pM
6280: 57 69 6e 2c 20 70 53 72 63 2c 20 70 2d 3e 70 4f  Win, pSrc, p->pO
6290: 72 64 65 72 42 79 2c 20 26 70 53 75 62 6c 69 73  rderBy, &pSublis
62a0: 74 29 3b 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 6e  t);.    pMWin->n
62b0: 42 75 66 66 65 72 43 6f 6c 20 3d 20 28 70 53 75  BufferCol = (pSu
62c0: 62 6c 69 73 74 20 3f 20 70 53 75 62 6c 69 73 74  blist ? pSublist
62d0: 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 0a 20  ->nExpr : 0);.. 
62e0: 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65     /* Append the
62f0: 20 50 41 52 54 49 54 49 4f 4e 20 42 59 20 61 6e   PARTITION BY an
6300: 64 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65  d ORDER BY expre
6310: 73 73 69 6f 6e 73 20 74 6f 20 74 68 65 20 74 6f  ssions to the to
6320: 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 75 62   the .    ** sub
6330: 2d 73 65 6c 65 63 74 20 65 78 70 72 65 73 73 69  -select expressi
6340: 6f 6e 20 6c 69 73 74 2e 20 54 68 65 79 20 61 72  on list. They ar
6350: 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 66 69  e required to fi
6360: 67 75 72 65 20 6f 75 74 20 77 68 65 72 65 20 0a  gure out where .
6370: 20 20 20 20 2a 2a 20 62 6f 75 6e 64 61 72 69 65      ** boundarie
6380: 73 20 66 6f 72 20 70 61 72 74 69 74 69 6f 6e 73  s for partitions
6390: 20 61 6e 64 20 73 65 74 73 20 6f 66 20 70 65 65   and sets of pee
63a0: 72 20 72 6f 77 73 20 6c 69 65 2e 20 20 2a 2f 0a  r rows lie.  */.
63b0: 20 20 20 20 70 53 75 62 6c 69 73 74 20 3d 20 65      pSublist = e
63c0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 4c 69 73  xprListAppendLis
63d0: 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 6c 69  t(pParse, pSubli
63e0: 73 74 2c 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74  st, pMWin->pPart
63f0: 69 74 69 6f 6e 29 3b 0a 20 20 20 20 70 53 75 62  ition);.    pSub
6400: 6c 69 73 74 20 3d 20 65 78 70 72 4c 69 73 74 41  list = exprListA
6410: 70 70 65 6e 64 4c 69 73 74 28 70 50 61 72 73 65  ppendList(pParse
6420: 2c 20 70 53 75 62 6c 69 73 74 2c 20 70 4d 57 69  , pSublist, pMWi
6430: 6e 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 0a 20  n->pOrderBy);.. 
6440: 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65     /* Append the
6450: 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65   arguments passe
6460: 64 20 74 6f 20 65 61 63 68 20 77 69 6e 64 6f 77  d to each window
6470: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 74 68 65   function to the
6480: 0a 20 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65  .    ** sub-sele
6490: 63 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ct expression li
64a0: 73 74 2e 20 41 6c 73 6f 20 61 6c 6c 6f 63 61 74  st. Also allocat
64b0: 65 20 74 77 6f 20 72 65 67 69 73 74 65 72 73 20  e two registers 
64c0: 66 6f 72 20 65 61 63 68 0a 20 20 20 20 2a 2a 20  for each.    ** 
64d0: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
64e0: 2d 20 6f 6e 65 20 66 6f 72 20 74 68 65 20 61 63  - one for the ac
64f0: 63 75 6d 75 6c 61 74 6f 72 2c 20 61 6e 6f 74 68  cumulator, anoth
6500: 65 72 20 66 6f 72 20 69 6e 74 65 72 69 6d 0a 20  er for interim. 
6510: 20 20 20 2a 2a 20 72 65 73 75 6c 74 73 2e 20 20     ** results.  
6520: 2a 2f 0a 20 20 20 20 66 6f 72 28 70 57 69 6e 3d  */.    for(pWin=
6530: 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69  pMWin; pWin; pWi
6540: 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e  n=pWin->pNextWin
6550: 29 7b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 69  ){.      pWin->i
6560: 41 72 67 43 6f 6c 20 3d 20 28 70 53 75 62 6c 69  ArgCol = (pSubli
6570: 73 74 20 3f 20 70 53 75 62 6c 69 73 74 2d 3e 6e  st ? pSublist->n
6580: 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 20  Expr : 0);.     
6590: 20 70 53 75 62 6c 69 73 74 20 3d 20 65 78 70 72   pSublist = expr
65a0: 4c 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28 70  ListAppendList(p
65b0: 50 61 72 73 65 2c 20 70 53 75 62 6c 69 73 74 2c  Parse, pSublist,
65c0: 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78   pWin->pOwner->x
65d0: 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 69  .pList);.      i
65e0: 66 28 20 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72  f( pWin->pFilter
65f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72   ){.        Expr
6600: 20 2a 70 46 69 6c 74 65 72 20 3d 20 73 71 6c 69   *pFilter = sqli
6610: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
6620: 57 69 6e 2d 3e 70 46 69 6c 74 65 72 2c 20 30 29  Win->pFilter, 0)
6630: 3b 0a 20 20 20 20 20 20 20 20 70 53 75 62 6c 69  ;.        pSubli
6640: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
6650: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
6660: 65 2c 20 70 53 75 62 6c 69 73 74 2c 20 70 46 69  e, pSublist, pFi
6670: 6c 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lter);.      }. 
6680: 20 20 20 20 20 70 57 69 6e 2d 3e 72 65 67 41 63       pWin->regAc
6690: 63 75 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  cum = ++pParse->
66a0: 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 57 69 6e  nMem;.      pWin
66b0: 2d 3e 72 65 67 52 65 73 75 6c 74 20 3d 20 2b 2b  ->regResult = ++
66c0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
66d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
66e0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
66f0: 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63  , 0, pWin->regAc
6700: 63 75 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  cum);.    }..   
6710: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
6720: 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20 50  no ORDER BY or P
6730: 41 52 54 49 54 49 4f 4e 20 42 59 20 63 6c 61 75  ARTITION BY clau
6740: 73 65 2c 20 61 6e 64 20 74 68 65 20 77 69 6e 64  se, and the wind
6750: 6f 77 0a 20 20 20 20 2a 2a 20 66 75 6e 63 74 69  ow.    ** functi
6760: 6f 6e 20 61 63 63 65 70 74 73 20 7a 65 72 6f 20  on accepts zero 
6770: 61 72 67 75 6d 65 6e 74 73 2c 20 61 6e 64 20 74  arguments, and t
6780: 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 74 68 65  here are no othe
6790: 72 20 63 6f 6c 75 6d 6e 73 0a 20 20 20 20 2a 2a  r columns.    **
67a0: 20 73 65 6c 65 63 74 65 64 20 28 65 2e 67 2e 20   selected (e.g. 
67b0: 22 53 45 4c 45 43 54 20 72 6f 77 5f 6e 75 6d 62  "SELECT row_numb
67c0: 65 72 28 29 20 4f 56 45 52 20 28 29 20 46 52 4f  er() OVER () FRO
67d0: 4d 20 74 31 22 29 2c 20 69 74 20 69 73 20 70 6f  M t1"), it is po
67e0: 73 73 69 62 6c 65 0a 20 20 20 20 2a 2a 20 74 68  ssible.    ** th
67f0: 61 74 20 70 53 75 62 6c 69 73 74 20 69 73 20 73  at pSublist is s
6800: 74 69 6c 6c 20 4e 55 4c 4c 20 68 65 72 65 2e 20  till NULL here. 
6810: 41 64 64 20 61 20 63 6f 6e 73 74 61 6e 74 20 65  Add a constant e
6820: 78 70 72 65 73 73 69 6f 6e 20 68 65 72 65 20 74  xpression here t
6830: 6f 20 0a 20 20 20 20 2a 2a 20 6b 65 65 70 20 65  o .    ** keep e
6840: 76 65 72 79 74 68 69 6e 67 20 6c 65 67 61 6c 20  verything legal 
6850: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 0a 20  in this case. . 
6860: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53     */.    if( pS
6870: 75 62 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  ublist==0 ){.   
6880: 20 20 20 70 53 75 62 6c 69 73 74 20 3d 20 73 71     pSublist = sq
6890: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
68a0: 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 0a  end(pParse, 0, .
68b0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
68c0: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
68d0: 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73 71 6c 69  K_INTEGER, &sqli
68e0: 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 30 5d 2c  te3IntTokens[0],
68f0: 20 30 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20   0).      );.   
6900: 20 7d 0a 0a 20 20 20 20 70 53 75 62 20 3d 20 73   }..    pSub = s
6910: 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28  qlite3SelectNew(
6920: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c  .        pParse,
6930: 20 70 53 75 62 6c 69 73 74 2c 20 70 53 72 63 2c   pSublist, pSrc,
6940: 20 70 57 68 65 72 65 2c 20 70 47 72 6f 75 70 42   pWhere, pGroupB
6950: 79 2c 20 70 48 61 76 69 6e 67 2c 20 70 53 6f 72  y, pHaving, pSor
6960: 74 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20  t, 0, 0.    );. 
6970: 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 73 71 6c     p->pSrc = sql
6980: 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
6990: 64 28 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  d(db, 0, 0, 0);.
69a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
69b0: 53 72 63 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Src || db->mallo
69c0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69  cFailed );.    i
69d0: 66 28 20 70 2d 3e 70 53 72 63 20 29 7b 0a 20 20  f( p->pSrc ){.  
69e0: 20 20 20 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30      p->pSrc->a[0
69f0: 5d 2e 70 53 65 6c 65 63 74 20 3d 20 70 53 75 62  ].pSelect = pSub
6a00: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
6a10: 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
6a20: 6f 72 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ors(pParse, p->p
6a30: 53 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Src);.      if( 
6a40: 73 71 6c 69 74 65 33 45 78 70 61 6e 64 53 75 62  sqlite3ExpandSub
6a50: 71 75 65 72 79 28 70 50 61 72 73 65 2c 20 26 70  query(pParse, &p
6a60: 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 29 20 29 7b  ->pSrc->a[0]) ){
6a70: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
6a80: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
6a90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6aa0: 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
6ab0: 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a  |= SF_Expanded;.
6ac0: 20 20 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c          p->selFl
6ad0: 61 67 73 20 26 3d 20 7e 53 46 5f 41 67 67 72 65  ags &= ~SF_Aggre
6ae0: 67 61 74 65 3b 0a 20 20 20 20 20 20 20 20 73 71  gate;.        sq
6af0: 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28  lite3SelectPrep(
6b00: 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 30 29  pParse, pSub, 0)
6b10: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
6b20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6b30: 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
6b40: 65 6d 65 72 61 6c 2c 20 70 4d 57 69 6e 2d 3e 69  emeral, pMWin->i
6b50: 45 70 68 43 73 72 2c 20 70 53 75 62 6c 69 73 74  EphCsr, pSublist
6b60: 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 7d 65  ->nExpr);.    }e
6b70: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
6b80: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
6b90: 62 2c 20 70 53 75 62 29 3b 0a 20 20 20 20 7d 0a  b, pSub);.    }.
6ba0: 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
6bb0: 6f 63 46 61 69 6c 65 64 20 29 20 72 63 20 3d 20  ocFailed ) rc = 
6bc0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
6bd0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
6be0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  }../*.** Free th
6bf0: 65 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20  e Window object 
6c00: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
6c10: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
6c20: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69  /.void sqlite3Wi
6c30: 6e 64 6f 77 44 65 6c 65 74 65 28 73 71 6c 69 74  ndowDelete(sqlit
6c40: 65 33 20 2a 64 62 2c 20 57 69 6e 64 6f 77 20 2a  e3 *db, Window *
6c50: 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  p){.  if( p ){. 
6c60: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
6c70: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 46 69 6c  lete(db, p->pFil
6c80: 74 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ter);.    sqlite
6c90: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
6ca0: 64 62 2c 20 70 2d 3e 70 50 61 72 74 69 74 69 6f  db, p->pPartitio
6cb0: 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  n);.    sqlite3E
6cc0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
6cd0: 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  , p->pOrderBy);.
6ce0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
6cf0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 45 6e  elete(db, p->pEn
6d00: 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  d);.    sqlite3E
6d10: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
6d20: 3e 70 53 74 61 72 74 29 3b 0a 20 20 20 20 73 71  >pStart);.    sq
6d30: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
6d40: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  p->zName);.    s
6d50: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
6d60: 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   p);.  }.}../*.*
6d70: 2a 20 46 72 65 65 20 74 68 65 20 6c 69 6e 6b 65  * Free the linke
6d80: 64 20 6c 69 73 74 20 6f 66 20 57 69 6e 64 6f 77  d list of Window
6d90: 20 6f 62 6a 65 63 74 73 20 73 74 61 72 74 69 6e   objects startin
6da0: 67 20 61 74 20 74 68 65 20 73 65 63 6f 6e 64 20  g at the second 
6db0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  argument..*/.voi
6dc0: 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4c  d sqlite3WindowL
6dd0: 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65  istDelete(sqlite
6de0: 33 20 2a 64 62 2c 20 57 69 6e 64 6f 77 20 2a 70  3 *db, Window *p
6df0: 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  ){.  while( p ){
6e00: 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a 70 4e 65  .    Window *pNe
6e10: 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 57 69 6e  xt = p->pNextWin
6e20: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e  ;.    sqlite3Win
6e30: 64 6f 77 44 65 6c 65 74 65 28 64 62 2c 20 70 29  dowDelete(db, p)
6e40: 3b 0a 20 20 20 20 70 20 3d 20 70 4e 65 78 74 3b  ;.    p = pNext;
6e50: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
6e60: 65 20 61 72 67 75 6d 65 6e 74 20 65 78 70 72 65  e argument expre
6e70: 73 73 69 6f 6e 20 69 73 20 61 6e 20 50 52 45 43  ssion is an PREC
6e80: 45 44 49 4e 47 20 6f 72 20 46 4f 4c 4c 4f 57 49  EDING or FOLLOWI
6e90: 4e 47 20 6f 66 66 73 65 74 2e 20 20 54 68 65 0a  NG offset.  The.
6ea0: 2a 2a 20 76 61 6c 75 65 20 73 68 6f 75 6c 64 20  ** value should 
6eb0: 62 65 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  be a non-negativ
6ec0: 65 20 69 6e 74 65 67 65 72 2e 20 20 49 66 20 74  e integer.  If t
6ed0: 68 65 20 76 61 6c 75 65 20 69 73 20 6e 6f 74 20  he value is not 
6ee0: 61 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 2c 20 63  a.** constant, c
6ef0: 68 61 6e 67 65 20 69 74 20 74 6f 20 4e 55 4c 4c  hange it to NULL
6f00: 2e 20 20 54 68 65 20 66 61 63 74 20 74 68 61 74  .  The fact that
6f10: 20 69 74 20 69 73 20 74 68 65 6e 20 61 20 6e 6f   it is then a no
6f20: 6e 2d 6e 65 67 61 74 69 76 65 0a 2a 2a 20 69 6e  n-negative.** in
6f30: 74 65 67 65 72 20 77 69 6c 6c 20 62 65 20 63 61  teger will be ca
6f40: 75 67 68 74 20 6c 61 74 65 72 2e 20 20 42 75 74  ught later.  But
6f50: 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   it is important
6f60: 20 6e 6f 74 20 74 6f 20 6c 65 61 76 65 0a 2a 2a   not to leave.**
6f70: 20 76 61 72 69 61 62 6c 65 20 76 61 6c 75 65 73   variable values
6f80: 20 69 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   in the expressi
6f90: 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74  on tree..*/.stat
6fa0: 69 63 20 45 78 70 72 20 2a 73 71 6c 69 74 65 33  ic Expr *sqlite3
6fb0: 57 69 6e 64 6f 77 4f 66 66 73 65 74 45 78 70 72  WindowOffsetExpr
6fc0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
6fd0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
6fe0: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 45 78  if( 0==sqlite3Ex
6ff0: 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 78  prIsConstant(pEx
7000: 70 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pr) ){.    sqlit
7010: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61  e3ExprDelete(pPa
7020: 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 29 3b  rse->db, pExpr);
7030: 0a 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c  .    pExpr = sql
7040: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50  ite3ExprAlloc(pP
7050: 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 4e 55 4c  arse->db, TK_NUL
7060: 4c 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  L, 0, 0);.  }.  
7070: 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a  return pExpr;.}.
7080: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
7090: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 6e 65 77  and return a new
70a0: 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 64   Window object d
70b0: 65 73 63 72 69 62 69 6e 67 20 61 20 57 69 6e 64  escribing a Wind
70c0: 6f 77 20 44 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a  ow Definition..*
70d0: 2f 0a 57 69 6e 64 6f 77 20 2a 73 71 6c 69 74 65  /.Window *sqlite
70e0: 33 57 69 6e 64 6f 77 41 6c 6c 6f 63 28 0a 20 20  3WindowAlloc(.  
70f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
7100: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
7110: 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 65 54  text */.  int eT
7120: 79 70 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 46  ype,        /* F
7130: 72 61 6d 65 20 74 79 70 65 2e 20 54 4b 5f 52 41  rame type. TK_RA
7140: 4e 47 45 20 6f 72 20 54 4b 5f 52 4f 57 53 20 2a  NGE or TK_ROWS *
7150: 2f 0a 20 20 69 6e 74 20 65 53 74 61 72 74 2c 20  /.  int eStart, 
7160: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 74        /* Start t
7170: 79 70 65 3a 20 43 55 52 52 45 4e 54 2c 20 50 52  ype: CURRENT, PR
7180: 45 43 45 44 49 4e 47 2c 20 46 4f 4c 4c 4f 57 49  ECEDING, FOLLOWI
7190: 4e 47 2c 20 55 4e 42 4f 55 4e 44 45 44 20 2a 2f  NG, UNBOUNDED */
71a0: 0a 20 20 45 78 70 72 20 2a 70 53 74 61 72 74 2c  .  Expr *pStart,
71b0: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 77 69       /* Start wi
71c0: 6e 64 6f 77 20 73 69 7a 65 20 69 66 20 54 4b 5f  ndow size if TK_
71d0: 50 52 45 43 45 44 49 4e 47 20 6f 72 20 46 4f 4c  PRECEDING or FOL
71e0: 4c 4f 57 49 4e 47 20 2a 2f 0a 20 20 69 6e 74 20  LOWING */.  int 
71f0: 65 45 6e 64 2c 20 20 20 20 20 20 20 20 20 2f 2a  eEnd,         /*
7200: 20 45 6e 64 20 74 79 70 65 3a 20 43 55 52 52 45   End type: CURRE
7210: 4e 54 2c 20 46 4f 4c 4c 4f 57 49 4e 47 2c 20 54  NT, FOLLOWING, T
7220: 4b 5f 55 4e 42 4f 55 4e 44 45 44 2c 20 50 52 45  K_UNBOUNDED, PRE
7230: 43 45 44 49 4e 47 20 2a 2f 0a 20 20 45 78 70 72  CEDING */.  Expr
7240: 20 2a 70 45 6e 64 20 20 20 20 20 20 20 20 2f 2a   *pEnd        /*
7250: 20 45 6e 64 20 77 69 6e 64 6f 77 20 73 69 7a 65   End window size
7260: 20 69 66 20 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47   if TK_FOLLOWING
7270: 20 6f 72 20 50 52 45 43 45 44 49 4e 47 20 2a 2f   or PRECEDING */
7280: 0a 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57  .){.  Window *pW
7290: 69 6e 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 50 61  in = 0;..  /* Pa
72a0: 72 73 65 72 20 61 73 73 75 72 65 73 20 74 68 65  rser assures the
72b0: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20 2a 2f 0a 20   following: */. 
72c0: 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
72d0: 54 4b 5f 52 41 4e 47 45 20 7c 7c 20 65 54 79 70  TK_RANGE || eTyp
72e0: 65 3d 3d 54 4b 5f 52 4f 57 53 20 29 3b 0a 20 20  e==TK_ROWS );.  
72f0: 61 73 73 65 72 74 28 20 65 53 74 61 72 74 3d 3d  assert( eStart==
7300: 54 4b 5f 43 55 52 52 45 4e 54 20 7c 7c 20 65 53  TK_CURRENT || eS
7310: 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49  tart==TK_PRECEDI
7320: 4e 47 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  NG.           ||
7330: 20 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f   eStart==TK_UNBO
7340: 55 4e 44 45 44 20 7c 7c 20 65 53 74 61 72 74 3d  UNDED || eStart=
7350: 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 3b  =TK_FOLLOWING );
7360: 0a 20 20 61 73 73 65 72 74 28 20 65 45 6e 64 3d  .  assert( eEnd=
7370: 3d 54 4b 5f 43 55 52 52 45 4e 54 20 7c 7c 20 65  =TK_CURRENT || e
7380: 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e  End==TK_FOLLOWIN
7390: 47 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  G.           || 
73a0: 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44  eEnd==TK_UNBOUND
73b0: 45 44 20 7c 7c 20 65 45 6e 64 3d 3d 54 4b 5f 50  ED || eEnd==TK_P
73c0: 52 45 43 45 44 49 4e 47 20 29 3b 0a 20 20 61 73  RECEDING );.  as
73d0: 73 65 72 74 28 20 28 65 53 74 61 72 74 3d 3d 54  sert( (eStart==T
73e0: 4b 5f 50 52 45 43 45 44 49 4e 47 20 7c 7c 20 65  K_PRECEDING || e
73f0: 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57  Start==TK_FOLLOW
7400: 49 4e 47 29 3d 3d 28 70 53 74 61 72 74 21 3d 30  ING)==(pStart!=0
7410: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ) );.  assert( (
7420: 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49  eEnd==TK_FOLLOWI
7430: 4e 47 20 7c 7c 20 65 45 6e 64 3d 3d 54 4b 5f 50  NG || eEnd==TK_P
7440: 52 45 43 45 44 49 4e 47 29 3d 3d 28 70 45 6e 64  RECEDING)==(pEnd
7450: 21 3d 30 29 20 29 3b 0a 0a 0a 20 20 2f 2a 20 49  !=0) );...  /* I
7460: 66 20 61 20 66 72 61 6d 65 20 69 73 20 64 65 63  f a frame is dec
7470: 6c 61 72 65 64 20 22 52 41 4e 47 45 22 20 28 6e  lared "RANGE" (n
7480: 6f 74 20 22 52 4f 57 53 22 29 2c 20 74 68 65 6e  ot "ROWS"), then
7490: 20 69 74 20 6d 61 79 20 6e 6f 74 20 75 73 65 0a   it may not use.
74a0: 20 20 2a 2a 20 65 69 74 68 65 72 20 22 3c 65 78    ** either "<ex
74b0: 70 72 3e 20 50 52 45 43 45 44 49 4e 47 22 20 6f  pr> PRECEDING" o
74c0: 72 20 22 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57  r "<expr> FOLLOW
74d0: 49 4e 47 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ING"..  */.  if(
74e0: 20 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45   eType==TK_RANGE
74f0: 20 26 26 20 28 70 53 74 61 72 74 21 3d 30 20 7c   && (pStart!=0 |
7500: 7c 20 70 45 6e 64 21 3d 30 29 20 29 7b 0a 20 20  | pEnd!=0) ){.  
7510: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
7520: 67 28 70 50 61 72 73 65 2c 20 22 52 41 4e 47 45  g(pParse, "RANGE
7530: 20 6d 75 73 74 20 75 73 65 20 6f 6e 6c 79 20 55   must use only U
7540: 4e 42 4f 55 4e 44 45 44 20 6f 72 20 43 55 52 52  NBOUNDED or CURR
7550: 45 4e 54 20 52 4f 57 22 29 3b 0a 20 20 20 20 67  ENT ROW");.    g
7560: 6f 74 6f 20 77 69 6e 64 6f 77 41 6c 6c 6f 63 45  oto windowAllocE
7570: 72 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64  rr;.  }..  /* Ad
7580: 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 0a  ditionally, the.
7590: 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 62 6f    ** starting bo
75a0: 75 6e 64 61 72 79 20 74 79 70 65 20 6d 61 79 20  undary type may 
75b0: 6e 6f 74 20 6f 63 63 75 72 20 65 61 72 6c 69 65  not occur earlie
75c0: 72 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  r in the followi
75d0: 6e 67 20 6c 69 73 74 20 74 68 61 6e 0a 20 20 2a  ng list than.  *
75e0: 2a 20 74 68 65 20 65 6e 64 69 6e 67 20 62 6f 75  * the ending bou
75f0: 6e 64 61 72 79 20 74 79 70 65 3a 0a 20 20 2a 2a  ndary type:.  **
7600: 0a 20 20 2a 2a 20 20 20 55 4e 42 4f 55 4e 44 45  .  **   UNBOUNDE
7610: 44 20 50 52 45 43 45 44 49 4e 47 0a 20 20 2a 2a  D PRECEDING.  **
7620: 20 20 20 3c 65 78 70 72 3e 20 50 52 45 43 45 44     <expr> PRECED
7630: 49 4e 47 0a 20 20 2a 2a 20 20 20 43 55 52 52 45  ING.  **   CURRE
7640: 4e 54 20 52 4f 57 0a 20 20 2a 2a 20 20 20 3c 65  NT ROW.  **   <e
7650: 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 20  xpr> FOLLOWING. 
7660: 20 2a 2a 20 20 20 55 4e 42 4f 55 4e 44 45 44 20   **   UNBOUNDED 
7670: 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20 2a 2a 0a 20  FOLLOWING.  **. 
7680: 20 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 65   ** The parser e
7690: 6e 73 75 72 65 73 20 74 68 61 74 20 22 55 4e 42  nsures that "UNB
76a0: 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47  OUNDED PRECEDING
76b0: 22 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  " cannot be used
76c0: 20 61 73 20 61 6e 20 65 6e 64 69 6e 67 0a 20 20   as an ending.  
76d0: 2a 2a 20 62 6f 75 6e 64 61 72 79 2c 20 61 6e 64  ** boundary, and
76e0: 20 74 68 61 6e 20 22 55 4e 42 4f 55 4e 44 45 44   than "UNBOUNDED
76f0: 20 46 4f 4c 4c 4f 57 49 4e 47 22 20 63 61 6e 6e   FOLLOWING" cann
7700: 6f 74 20 62 65 20 75 73 65 64 20 61 73 20 61 20  ot be used as a 
7710: 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 66 72  starting.  ** fr
7720: 61 6d 65 20 62 6f 75 6e 64 61 72 79 2e 0a 20 20  ame boundary..  
7730: 2a 2f 0a 20 20 69 66 28 20 28 65 53 74 61 72 74  */.  if( (eStart
7740: 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 26 26 20  ==TK_CURRENT && 
7750: 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49  eEnd==TK_PRECEDI
7760: 4e 47 29 0a 20 20 20 7c 7c 20 28 65 53 74 61 72  NG).   || (eStar
7770: 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  t==TK_FOLLOWING 
7780: 26 26 20 28 65 45 6e 64 3d 3d 54 4b 5f 50 52 45  && (eEnd==TK_PRE
7790: 43 45 44 49 4e 47 20 7c 7c 20 65 45 6e 64 3d 3d  CEDING || eEnd==
77a0: 54 4b 5f 43 55 52 52 45 4e 54 29 29 0a 20 20 29  TK_CURRENT)).  )
77b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
77c0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
77d0: 6e 73 75 70 70 6f 72 74 65 64 20 66 72 61 6d 65  nsupported frame
77e0: 20 64 65 6c 69 6d 69 74 65 72 20 66 6f 72 20 52   delimiter for R
77f0: 4f 57 53 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  OWS");.    goto 
7800: 77 69 6e 64 6f 77 41 6c 6c 6f 63 45 72 72 3b 0a  windowAllocErr;.
7810: 20 20 7d 0a 0a 20 20 70 57 69 6e 20 3d 20 28 57    }..  pWin = (W
7820: 69 6e 64 6f 77 2a 29 73 71 6c 69 74 65 33 44 62  indow*)sqlite3Db
7830: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73  MallocZero(pPars
7840: 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 57 69  e->db, sizeof(Wi
7850: 6e 64 6f 77 29 29 3b 0a 20 20 69 66 28 20 70 57  ndow));.  if( pW
7860: 69 6e 3d 3d 30 20 29 20 67 6f 74 6f 20 77 69 6e  in==0 ) goto win
7870: 64 6f 77 41 6c 6c 6f 63 45 72 72 3b 0a 20 20 70  dowAllocErr;.  p
7880: 57 69 6e 2d 3e 65 54 79 70 65 20 3d 20 65 54 79  Win->eType = eTy
7890: 70 65 3b 0a 20 20 70 57 69 6e 2d 3e 65 53 74 61  pe;.  pWin->eSta
78a0: 72 74 20 3d 20 65 53 74 61 72 74 3b 0a 20 20 70  rt = eStart;.  p
78b0: 57 69 6e 2d 3e 65 45 6e 64 20 3d 20 65 45 6e 64  Win->eEnd = eEnd
78c0: 3b 0a 20 20 70 57 69 6e 2d 3e 70 45 6e 64 20 3d  ;.  pWin->pEnd =
78d0: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4f 66   sqlite3WindowOf
78e0: 66 73 65 74 45 78 70 72 28 70 50 61 72 73 65 2c  fsetExpr(pParse,
78f0: 20 70 45 6e 64 29 3b 0a 20 20 70 57 69 6e 2d 3e   pEnd);.  pWin->
7900: 70 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  pStart = sqlite3
7910: 57 69 6e 64 6f 77 4f 66 66 73 65 74 45 78 70 72  WindowOffsetExpr
7920: 28 70 50 61 72 73 65 2c 20 70 53 74 61 72 74 29  (pParse, pStart)
7930: 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 69 6e 3b  ;.  return pWin;
7940: 0a 0a 77 69 6e 64 6f 77 41 6c 6c 6f 63 45 72 72  ..windowAllocErr
7950: 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  :.  sqlite3ExprD
7960: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
7970: 2c 20 70 45 6e 64 29 3b 0a 20 20 73 71 6c 69 74  , pEnd);.  sqlit
7980: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61  e3ExprDelete(pPa
7990: 72 73 65 2d 3e 64 62 2c 20 70 53 74 61 72 74 29  rse->db, pStart)
79a0: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
79b0: 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20 77 69  ./*.** Attach wi
79c0: 6e 64 6f 77 20 6f 62 6a 65 63 74 20 70 57 69 6e  ndow object pWin
79d0: 20 74 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 70   to expression p
79e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
79f0: 33 57 69 6e 64 6f 77 41 74 74 61 63 68 28 50 61  3WindowAttach(Pa
7a00: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
7a10: 72 20 2a 70 2c 20 57 69 6e 64 6f 77 20 2a 70 57  r *p, Window *pW
7a20: 69 6e 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  in){.  if( p ){.
7a30: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f      assert( p->o
7a40: 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29  p==TK_FUNCTION )
7a50: 3b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f  ;.    /* This ro
7a60: 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61  utine is only ca
7a70: 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 70 61 72  lled for the par
7a80: 73 65 72 2e 20 20 49 66 20 70 57 69 6e 20 77 61  ser.  If pWin wa
7a90: 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 6c 6c  s not.    ** all
7aa0: 6f 63 61 74 65 64 20 64 75 65 20 74 6f 20 61 6e  ocated due to an
7ab0: 20 4f 4f 4d 2c 20 74 68 65 6e 20 74 68 65 20 70   OOM, then the p
7ac0: 61 72 73 65 72 20 77 6f 75 6c 64 20 66 61 69 6c  arser would fail
7ad0: 20 62 65 66 6f 72 65 20 65 76 65 72 0a 20 20 20   before ever.   
7ae0: 20 2a 2a 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69   ** invoking thi
7af0: 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20  s routine */.   
7b00: 20 69 66 28 20 41 4c 57 41 59 53 28 70 57 69 6e   if( ALWAYS(pWin
7b10: 29 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 79 2e  ) ){.      p->y.
7b20: 70 57 69 6e 20 3d 20 70 57 69 6e 3b 0a 20 20 20  pWin = pWin;.   
7b30: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
7b40: 74 79 28 70 2c 20 45 50 5f 57 69 6e 46 75 6e 63  ty(p, EP_WinFunc
7b50: 29 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 70  );.      pWin->p
7b60: 4f 77 6e 65 72 20 3d 20 70 3b 0a 20 20 20 20 20  Owner = p;.     
7b70: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20   if( p->flags & 
7b80: 45 50 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  EP_Distinct ){. 
7b90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
7ba0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
7bb0: 20 20 20 20 20 20 20 20 20 20 22 44 49 53 54 49            "DISTI
7bc0: 4e 43 54 20 69 73 20 6e 6f 74 20 73 75 70 70 6f  NCT is not suppo
7bd0: 72 74 65 64 20 66 6f 72 20 77 69 6e 64 6f 77 20  rted for window 
7be0: 66 75 6e 63 74 69 6f 6e 73 22 29 3b 0a 20 20 20  functions");.   
7bf0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
7c00: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 57  se{.    sqlite3W
7c10: 69 6e 64 6f 77 44 65 6c 65 74 65 28 70 50 61 72  indowDelete(pPar
7c20: 73 65 2d 3e 64 62 2c 20 70 57 69 6e 29 3b 0a 20  se->db, pWin);. 
7c30: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
7c40: 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 20  rn 0 if the two 
7c50: 77 69 6e 64 6f 77 20 6f 62 6a 65 63 74 73 20 61  window objects a
7c60: 72 65 20 69 64 65 6e 74 69 63 61 6c 2c 20 6f 72  re identical, or
7c70: 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 74 68 65 72 77   non-zero otherw
7c80: 69 73 65 2e 0a 2a 2a 20 49 64 65 6e 74 69 63 61  ise..** Identica
7c90: 6c 20 77 69 6e 64 6f 77 20 6f 62 6a 65 63 74 73  l window objects
7ca0: 20 63 61 6e 20 62 65 20 70 72 6f 63 65 73 73 65   can be processe
7cb0: 64 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 73 63  d in a single sc
7cc0: 61 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  an..*/.int sqlit
7cd0: 65 33 57 69 6e 64 6f 77 43 6f 6d 70 61 72 65 28  e3WindowCompare(
7ce0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 57  Parse *pParse, W
7cf0: 69 6e 64 6f 77 20 2a 70 31 2c 20 57 69 6e 64 6f  indow *p1, Windo
7d00: 77 20 2a 70 32 29 7b 0a 20 20 69 66 28 20 70 31  w *p2){.  if( p1
7d10: 2d 3e 65 54 79 70 65 21 3d 70 32 2d 3e 65 54 79  ->eType!=p2->eTy
7d20: 70 65 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  pe ) return 1;. 
7d30: 20 69 66 28 20 70 31 2d 3e 65 53 74 61 72 74 21   if( p1->eStart!
7d40: 3d 70 32 2d 3e 65 53 74 61 72 74 20 29 20 72 65  =p2->eStart ) re
7d50: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 31  turn 1;.  if( p1
7d60: 2d 3e 65 45 6e 64 21 3d 70 32 2d 3e 65 45 6e 64  ->eEnd!=p2->eEnd
7d70: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
7d80: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
7d90: 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 31  mpare(pParse, p1
7da0: 2d 3e 70 53 74 61 72 74 2c 20 70 32 2d 3e 70 53  ->pStart, p2->pS
7db0: 74 61 72 74 2c 20 2d 31 29 20 29 20 72 65 74 75  tart, -1) ) retu
7dc0: 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 1;.  if( sqli
7dd0: 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
7de0: 50 61 72 73 65 2c 20 70 31 2d 3e 70 45 6e 64 2c  Parse, p1->pEnd,
7df0: 20 70 32 2d 3e 70 45 6e 64 2c 20 2d 31 29 20 29   p2->pEnd, -1) )
7e00: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
7e10: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
7e20: 43 6f 6d 70 61 72 65 28 70 31 2d 3e 70 50 61 72  Compare(p1->pPar
7e30: 74 69 74 69 6f 6e 2c 20 70 32 2d 3e 70 50 61 72  tition, p2->pPar
7e40: 74 69 74 69 6f 6e 2c 20 2d 31 29 20 29 20 72 65  tition, -1) ) re
7e50: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
7e60: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d  lite3ExprListCom
7e70: 70 61 72 65 28 70 31 2d 3e 70 4f 72 64 65 72 42  pare(p1->pOrderB
7e80: 79 2c 20 70 32 2d 3e 70 4f 72 64 65 72 42 79 2c  y, p2->pOrderBy,
7e90: 20 2d 31 29 20 29 20 72 65 74 75 72 6e 20 31 3b   -1) ) return 1;
7ea0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
7eb0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63  ./*.** This is c
7ec0: 61 6c 6c 65 64 20 62 79 20 63 6f 64 65 20 69 6e  alled by code in
7ed0: 20 73 65 6c 65 63 74 2e 63 20 62 65 66 6f 72 65   select.c before
7ee0: 20 69 74 20 63 61 6c 6c 73 20 73 71 6c 69 74 65   it calls sqlite
7ef0: 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a  3WhereBegin().**
7f00: 20 74 6f 20 62 65 67 69 6e 20 69 74 65 72 61 74   to begin iterat
7f10: 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68 65 20  ing through the 
7f20: 73 75 62 2d 71 75 65 72 79 20 72 65 73 75 6c 74  sub-query result
7f30: 73 2e 20 49 74 20 69 73 20 75 73 65 64 20 74 6f  s. It is used to
7f40: 20 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 61 6e 64   allocate.** and
7f50: 20 69 6e 69 74 69 61 6c 69 7a 65 20 72 65 67 69   initialize regi
7f60: 73 74 65 72 73 20 61 6e 64 20 63 75 72 73 6f 72  sters and cursor
7f70: 73 20 75 73 65 64 20 62 79 20 73 71 6c 69 74 65  s used by sqlite
7f80: 33 57 69 6e 64 6f 77 43 6f 64 65 53 74 65 70 28  3WindowCodeStep(
7f90: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
7fa0: 65 33 57 69 6e 64 6f 77 43 6f 64 65 49 6e 69 74  e3WindowCodeInit
7fb0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
7fc0: 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 29 7b 0a  Window *pMWin){.
7fd0: 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a    Window *pWin;.
7fe0: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
7ff0: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
8000: 65 29 3b 0a 20 20 69 6e 74 20 6e 50 61 72 74 20  e);.  int nPart 
8010: 3d 20 28 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69  = (pMWin->pParti
8020: 74 69 6f 6e 20 3f 20 70 4d 57 69 6e 2d 3e 70 50  tion ? pMWin->pP
8030: 61 72 74 69 74 69 6f 6e 2d 3e 6e 45 78 70 72 20  artition->nExpr 
8040: 3a 20 30 29 3b 0a 20 20 6e 50 61 72 74 20 2b 3d  : 0);.  nPart +=
8050: 20 28 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42   (pMWin->pOrderB
8060: 79 20 3f 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65  y ? pMWin->pOrde
8070: 72 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b  rBy->nExpr : 0);
8080: 0a 20 20 69 66 28 20 6e 50 61 72 74 20 29 7b 0a  .  if( nPart ){.
8090: 20 20 20 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61      pMWin->regPa
80a0: 72 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  rt = pParse->nMe
80b0: 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
80c0: 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 61 72 74 3b 0a  >nMem += nPart;.
80d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
80e0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp3(v, OP_Null
80f0: 2c 20 30 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50  , 0, pMWin->regP
8100: 61 72 74 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50  art, pMWin->regP
8110: 61 72 74 2b 6e 50 61 72 74 2d 31 29 3b 0a 20 20  art+nPart-1);.  
8120: 7d 0a 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d  }..  for(pWin=pM
8130: 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d  Win; pWin; pWin=
8140: 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b  pWin->pNextWin){
8150: 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 20  .    FuncDef *p 
8160: 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20  = pWin->pFunc;. 
8170: 20 20 20 69 66 28 20 28 70 2d 3e 66 75 6e 63 46     if( (p->funcF
8180: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
8190: 4e 43 5f 4d 49 4e 4d 41 58 29 20 26 26 20 70 57  NC_MINMAX) && pW
81a0: 69 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b 5f 55  in->eStart!=TK_U
81b0: 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20 20  NBOUNDED ){.    
81c0: 20 20 2f 2a 20 54 68 65 20 69 6e 6c 69 6e 65 20    /* The inline 
81d0: 76 65 72 73 69 6f 6e 73 20 6f 66 20 6d 69 6e 28  versions of min(
81e0: 29 20 61 6e 64 20 6d 61 78 28 29 20 72 65 71 75  ) and max() requ
81f0: 69 72 65 20 61 20 73 69 6e 67 6c 65 20 65 70 68  ire a single eph
8200: 65 6d 65 72 61 6c 0a 20 20 20 20 20 20 2a 2a 20  emeral.      ** 
8210: 74 61 62 6c 65 20 61 6e 64 20 33 20 72 65 67 69  table and 3 regi
8220: 73 74 65 72 73 2e 20 54 68 65 20 72 65 67 69 73  sters. The regis
8230: 74 65 72 73 20 61 72 65 20 75 73 65 64 20 61 73  ters are used as
8240: 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20   follows:.      
8250: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 72 65  **.      **   re
8260: 67 41 70 70 2b 30 3a 20 73 6c 6f 74 20 74 6f 20  gApp+0: slot to 
8270: 63 6f 70 79 20 6d 69 6e 28 29 2f 6d 61 78 28 29  copy min()/max()
8280: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 66 6f 72   argument to for
8290: 20 4d 61 6b 65 52 65 63 6f 72 64 0a 20 20 20 20   MakeRecord.    
82a0: 20 20 2a 2a 20 20 20 72 65 67 41 70 70 2b 31 3a    **   regApp+1:
82b0: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 75   integer value u
82c0: 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 6b 65  sed to ensure ke
82d0: 79 73 20 61 72 65 20 75 6e 69 71 75 65 0a 20 20  ys are unique.  
82e0: 20 20 20 20 2a 2a 20 20 20 72 65 67 41 70 70 2b      **   regApp+
82f0: 32 3a 20 6f 75 74 70 75 74 20 6f 66 20 4d 61 6b  2: output of Mak
8300: 65 52 65 63 6f 72 64 0a 20 20 20 20 20 20 2a 2f  eRecord.      */
8310: 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
8320: 2a 70 4c 69 73 74 20 3d 20 70 57 69 6e 2d 3e 70  *pList = pWin->p
8330: 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  Owner->x.pList;.
8340: 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
8350: 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
8360: 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  3KeyInfoFromExpr
8370: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69  List(pParse, pLi
8380: 73 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  st, 0, 0);.     
8390: 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 20 3d 20   pWin->csrApp = 
83a0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
83b0: 20 20 20 20 20 20 70 57 69 6e 2d 3e 72 65 67 41        pWin->regA
83c0: 70 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  pp = pParse->nMe
83d0: 6d 2b 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73  m+1;.      pPars
83e0: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 33 3b 0a 20 20  e->nMem += 3;.  
83f0: 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
8400: 20 26 26 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2d   && pWin->pFunc-
8410: 3e 7a 4e 61 6d 65 5b 31 5d 3d 3d 27 69 27 20 29  >zName[1]=='i' )
8420: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
8430: 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
8440: 74 4f 72 64 65 72 5b 30 5d 3d 3d 30 20 29 3b 0a  tOrder[0]==0 );.
8450: 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f          pKeyInfo
8460: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 20  ->aSortOrder[0] 
8470: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
8480: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8490: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
84a0: 70 68 65 6d 65 72 61 6c 2c 20 70 57 69 6e 2d 3e  phemeral, pWin->
84b0: 63 73 72 41 70 70 2c 20 32 29 3b 0a 20 20 20 20  csrApp, 2);.    
84c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70    sqlite3VdbeApp
84d0: 65 6e 64 50 34 28 76 2c 20 70 4b 65 79 49 6e 66  endP4(v, pKeyInf
84e0: 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
84f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8500: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
8510: 74 65 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d 3e  teger, 0, pWin->
8520: 72 65 67 41 70 70 2b 31 29 3b 0a 20 20 20 20 7d  regApp+1);.    }
8530: 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 2d  .    else if( p-
8540: 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75  >zName==nth_valu
8550: 65 4e 61 6d 65 20 7c 7c 20 70 2d 3e 7a 4e 61 6d  eName || p->zNam
8560: 65 3d 3d 66 69 72 73 74 5f 76 61 6c 75 65 4e 61  e==first_valueNa
8570: 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  me ){.      /* A
8580: 6c 6c 6f 63 61 74 65 20 74 77 6f 20 72 65 67 69  llocate two regi
8590: 73 74 65 72 73 20 61 74 20 70 57 69 6e 2d 3e 72  sters at pWin->r
85a0: 65 67 41 70 70 2e 20 54 68 65 73 65 20 77 69 6c  egApp. These wil
85b0: 6c 20 62 65 20 75 73 65 64 20 74 6f 0a 20 20 20  l be used to.   
85c0: 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20     ** store the 
85d0: 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 69 6e  start and end in
85e0: 64 65 78 20 6f 66 20 74 68 65 20 63 75 72 72 65  dex of the curre
85f0: 6e 74 20 66 72 61 6d 65 2e 20 20 2a 2f 0a 20 20  nt frame.  */.  
8600: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 57 69      assert( pMWi
8610: 6e 2d 3e 69 45 70 68 43 73 72 20 29 3b 0a 20 20  n->iEphCsr );.  
8620: 20 20 20 20 70 57 69 6e 2d 3e 72 65 67 41 70 70      pWin->regApp
8630: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
8640: 31 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 63  1;.      pWin->c
8650: 73 72 41 70 70 20 3d 20 70 50 61 72 73 65 2d 3e  srApp = pParse->
8660: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 50  nTab++;.      pP
8670: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 32 3b  arse->nMem += 2;
8680: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8690: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
86a0: 70 65 6e 44 75 70 2c 20 70 57 69 6e 2d 3e 63 73  penDup, pWin->cs
86b0: 72 41 70 70 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  rApp, pMWin->iEp
86c0: 68 43 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hCsr);.    }.   
86d0: 20 65 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4e 61   else if( p->zNa
86e0: 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65 20 7c 7c 20  me==leadName || 
86f0: 70 2d 3e 7a 4e 61 6d 65 3d 3d 6c 61 67 4e 61 6d  p->zName==lagNam
8700: 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e ){.      asser
8710: 74 28 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  t( pMWin->iEphCs
8720: 72 20 29 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d  r );.      pWin-
8730: 3e 63 73 72 41 70 70 20 3d 20 70 50 61 72 73 65  >csrApp = pParse
8740: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
8750: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8760: 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c  2(v, OP_OpenDup,
8770: 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20 70   pWin->csrApp, p
8780: 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a  MWin->iEphCsr);.
8790: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
87a0: 2a 2a 20 41 20 22 50 52 45 43 45 44 49 4e 47 20  ** A "PRECEDING 
87b0: 3c 65 78 70 72 3e 22 20 28 65 43 6f 6e 64 3d 3d  <expr>" (eCond==
87c0: 30 29 20 6f 72 20 22 46 4f 4c 4c 4f 57 49 4e 47  0) or "FOLLOWING
87d0: 20 3c 65 78 70 72 3e 22 20 28 65 43 6f 6e 64 3d   <expr>" (eCond=
87e0: 3d 31 29 20 6f 72 20 74 68 65 0a 2a 2a 20 76 61  =1) or the.** va
87f0: 6c 75 65 20 6f 66 20 74 68 65 20 73 65 63 6f 6e  lue of the secon
8800: 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6e 74  d argument to nt
8810: 68 5f 76 61 6c 75 65 28 29 20 28 65 43 6f 6e 64  h_value() (eCond
8820: 3d 3d 32 29 20 68 61 73 20 6a 75 73 74 20 62 65  ==2) has just be
8830: 65 6e 0a 2a 2a 20 65 76 61 6c 75 61 74 65 64 20  en.** evaluated 
8840: 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 20 6c  and the result l
8850: 65 66 74 20 69 6e 20 72 65 67 69 73 74 65 72 20  eft in register 
8860: 72 65 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69  reg. This functi
8870: 6f 6e 20 67 65 6e 65 72 61 74 65 73 20 56 4d 0a  on generates VM.
8880: 2a 2a 20 63 6f 64 65 20 74 6f 20 63 68 65 63 6b  ** code to check
8890: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20   that the value 
88a0: 69 73 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  is a non-negativ
88b0: 65 20 69 6e 74 65 67 65 72 20 61 6e 64 20 74 68  e integer and th
88c0: 72 6f 77 73 20 61 6e 0a 2a 2a 20 65 78 63 65 70  rows an.** excep
88d0: 74 69 6f 6e 20 69 66 20 69 74 20 69 73 20 6e 6f  tion if it is no
88e0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
88f0: 64 20 77 69 6e 64 6f 77 43 68 65 63 6b 49 6e 74  d windowCheckInt
8900: 56 61 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61  Value(Parse *pPa
8910: 72 73 65 2c 20 69 6e 74 20 72 65 67 2c 20 69 6e  rse, int reg, in
8920: 74 20 65 43 6f 6e 64 29 7b 0a 20 20 73 74 61 74  t eCond){.  stat
8930: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  ic const char *a
8940: 7a 45 72 72 5b 5d 20 3d 20 7b 0a 20 20 20 20 22  zErr[] = {.    "
8950: 66 72 61 6d 65 20 73 74 61 72 74 69 6e 67 20 6f  frame starting o
8960: 66 66 73 65 74 20 6d 75 73 74 20 62 65 20 61 20  ffset must be a 
8970: 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74  non-negative int
8980: 65 67 65 72 22 2c 0a 20 20 20 20 22 66 72 61 6d  eger",.    "fram
8990: 65 20 65 6e 64 69 6e 67 20 6f 66 66 73 65 74 20  e ending offset 
89a0: 6d 75 73 74 20 62 65 20 61 20 6e 6f 6e 2d 6e 65  must be a non-ne
89b0: 67 61 74 69 76 65 20 69 6e 74 65 67 65 72 22 2c  gative integer",
89c0: 0a 20 20 20 20 22 73 65 63 6f 6e 64 20 61 72 67  .    "second arg
89d0: 75 6d 65 6e 74 20 74 6f 20 6e 74 68 5f 76 61 6c  ument to nth_val
89e0: 75 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 73  ue must be a pos
89f0: 69 74 69 76 65 20 69 6e 74 65 67 65 72 22 0a 20  itive integer". 
8a00: 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74   };.  static int
8a10: 20 61 4f 70 5b 5d 20 3d 20 7b 20 4f 50 5f 47 65   aOp[] = { OP_Ge
8a20: 2c 20 4f 50 5f 47 65 2c 20 4f 50 5f 47 74 20 7d  , OP_Ge, OP_Gt }
8a30: 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  ;.  Vdbe *v = sq
8a40: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
8a50: 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 65 67 5a  rse);.  int regZ
8a60: 65 72 6f 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ero = sqlite3Get
8a70: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
8a80: 0a 20 20 61 73 73 65 72 74 28 20 65 43 6f 6e 64  .  assert( eCond
8a90: 3d 3d 30 20 7c 7c 20 65 43 6f 6e 64 3d 3d 31 20  ==0 || eCond==1 
8aa0: 7c 7c 20 65 43 6f 6e 64 3d 3d 32 20 29 3b 0a 20  || eCond==2 );. 
8ab0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8ac0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
8ad0: 2c 20 30 2c 20 72 65 67 5a 65 72 6f 29 3b 0a 20  , 0, regZero);. 
8ae0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8af0: 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p2(v, OP_MustBeI
8b00: 6e 74 2c 20 72 65 67 2c 20 73 71 6c 69 74 65 33  nt, reg, sqlite3
8b10: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
8b20: 76 29 2b 32 29 3b 0a 20 20 56 64 62 65 43 6f 76  v)+2);.  VdbeCov
8b30: 65 72 61 67 65 49 66 28 76 2c 20 65 43 6f 6e 64  erageIf(v, eCond
8b40: 3d 3d 30 29 3b 0a 20 20 56 64 62 65 43 6f 76 65  ==0);.  VdbeCove
8b50: 72 61 67 65 49 66 28 76 2c 20 65 43 6f 6e 64 3d  rageIf(v, eCond=
8b60: 3d 31 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72  =1);.  VdbeCover
8b70: 61 67 65 49 66 28 76 2c 20 65 43 6f 6e 64 3d 3d  ageIf(v, eCond==
8b80: 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  2);.  sqlite3Vdb
8b90: 65 41 64 64 4f 70 33 28 76 2c 20 61 4f 70 5b 65  eAddOp3(v, aOp[e
8ba0: 43 6f 6e 64 5d 2c 20 72 65 67 5a 65 72 6f 2c 20  Cond], regZero, 
8bb0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
8bc0: 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 72 65 67  ntAddr(v)+2, reg
8bd0: 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67  );.  VdbeCoverag
8be0: 65 4e 65 76 65 72 4e 75 6c 6c 49 66 28 76 2c 20  eNeverNullIf(v, 
8bf0: 65 43 6f 6e 64 3d 3d 30 29 3b 0a 20 20 56 64 62  eCond==0);.  Vdb
8c00: 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72 4e 75  eCoverageNeverNu
8c10: 6c 6c 49 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 31  llIf(v, eCond==1
8c20: 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67  );.  VdbeCoverag
8c30: 65 4e 65 76 65 72 4e 75 6c 6c 49 66 28 76 2c 20  eNeverNullIf(v, 
8c40: 65 43 6f 6e 64 3d 3d 32 29 3b 0a 20 20 73 71 6c  eCond==2);.  sql
8c50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
8c60: 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54  , OP_Halt, SQLIT
8c70: 45 5f 45 52 52 4f 52 2c 20 4f 45 5f 41 62 6f 72  E_ERROR, OE_Abor
8c80: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  t);.  sqlite3Vdb
8c90: 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28 76 6f  eAppendP4(v, (vo
8ca0: 69 64 2a 29 61 7a 45 72 72 5b 65 43 6f 6e 64 5d  id*)azErr[eCond]
8cb0: 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P4_STATIC);.  
8cc0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
8cd0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
8ce0: 67 5a 65 72 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  gZero);.}../*.**
8cf0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
8d00: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
8d10: 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 77 69  passed to the wi
8d20: 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e 20 61 73  ndow-function as
8d30: 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
8d40: 20 74 68 65 20 6f 62 6a 65 63 74 20 70 61 73 73   the object pass
8d50: 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ed as the only a
8d60: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
8d70: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
8d80: 74 69 63 20 69 6e 74 20 77 69 6e 64 6f 77 41 72  tic int windowAr
8d90: 67 43 6f 75 6e 74 28 57 69 6e 64 6f 77 20 2a 70  gCount(Window *p
8da0: 57 69 6e 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  Win){.  ExprList
8db0: 20 2a 70 4c 69 73 74 20 3d 20 70 57 69 6e 2d 3e   *pList = pWin->
8dc0: 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 3b  pOwner->x.pList;
8dd0: 0a 20 20 72 65 74 75 72 6e 20 28 70 4c 69 73 74  .  return (pList
8de0: 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20   ? pList->nExpr 
8df0: 3a 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  : 0);.}../*.** G
8e00: 65 6e 65 72 61 74 65 20 56 4d 20 63 6f 64 65 20  enerate VM code 
8e10: 74 6f 20 69 6e 76 6f 6b 65 20 65 69 74 68 65 72  to invoke either
8e20: 20 78 53 74 65 70 28 29 20 28 69 66 20 62 49 6e   xStep() (if bIn
8e30: 76 65 72 73 65 20 69 73 20 30 29 20 6f 72 20 0a  verse is 0) or .
8e40: 2a 2a 20 78 49 6e 76 65 72 73 65 20 28 69 66 20  ** xInverse (if 
8e50: 62 49 6e 76 65 72 73 65 20 69 73 20 6e 6f 6e 2d  bInverse is non-
8e60: 7a 65 72 6f 29 20 66 6f 72 20 65 61 63 68 20 77  zero) for each w
8e70: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 69  indow function i
8e80: 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64  n the .** linked
8e90: 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67 20 61   list starting a
8ea0: 74 20 70 4d 57 69 6e 2e 20 4f 72 2c 20 66 6f 72  t pMWin. Or, for
8eb0: 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77   built-in window
8ec0: 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 74 68   functions.** th
8ed0: 61 74 20 64 6f 20 6e 6f 74 20 75 73 65 20 74 68  at do not use th
8ee0: 65 20 73 74 61 6e 64 61 72 64 20 66 75 6e 63 74  e standard funct
8ef0: 69 6f 6e 20 41 50 49 2c 20 67 65 6e 65 72 61 74  ion API, generat
8f00: 65 20 74 68 65 20 72 65 71 75 69 72 65 64 0a 2a  e the required.*
8f10: 2a 20 69 6e 6c 69 6e 65 20 56 4d 20 63 6f 64 65  * inline VM code
8f20: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ..**.** If argum
8f30: 65 6e 74 20 63 73 72 20 69 73 20 67 72 65 61 74  ent csr is great
8f40: 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
8f50: 20 74 6f 20 30 2c 20 74 68 65 6e 20 61 72 67 75   to 0, then argu
8f60: 6d 65 6e 74 20 72 65 67 20 69 73 0a 2a 2a 20 74  ment reg is.** t
8f70: 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
8f80: 72 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  r in an array of
8f90: 20 72 65 67 69 73 74 65 72 73 20 67 75 61 72 61   registers guara
8fa0: 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 61 72 67  nteed to be larg
8fb0: 65 0a 2a 2a 20 65 6e 6f 75 67 68 20 74 6f 20 68  e.** enough to h
8fc0: 6f 6c 64 20 74 68 65 20 61 72 72 61 79 20 6f 66  old the array of
8fd0: 20 61 72 67 75 6d 65 6e 74 73 20 66 6f 72 20 65   arguments for e
8fe0: 61 63 68 20 66 75 6e 63 74 69 6f 6e 2e 20 49 6e  ach function. In
8ff0: 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20 74 68   this case.** th
9000: 65 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20  e arguments are 
9010: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
9020: 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f  he current row o
9030: 66 20 63 73 72 20 69 6e 74 6f 20 74 68 65 0a 2a  f csr into the.*
9040: 2a 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73  * array of regis
9050: 74 65 72 73 20 62 65 66 6f 72 65 20 69 6e 76 6f  ters before invo
9060: 6b 69 6e 67 20 4f 50 5f 41 67 67 53 74 65 70 20  king OP_AggStep 
9070: 6f 72 20 4f 50 5f 41 67 67 49 6e 76 65 72 73 65  or OP_AggInverse
9080: 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 63 73  .**.** Or, if cs
9090: 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  r is less than z
90a0: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 61 72  ero, then the ar
90b0: 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
90c0: 20 61 74 20 72 65 67 20 69 73 0a 2a 2a 20 61 6c   at reg is.** al
90d0: 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64 20  ready populated 
90e0: 77 69 74 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  with all columns
90f0: 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
9100: 74 20 72 6f 77 20 6f 66 20 74 68 65 20 73 75 62  t row of the sub
9110: 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  -query..**.** If
9120: 20 61 72 67 75 6d 65 6e 74 20 72 65 67 50 61 72   argument regPar
9130: 74 53 69 7a 65 20 69 73 20 6e 6f 6e 2d 7a 65 72  tSize is non-zer
9140: 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61 20  o, then it is a 
9150: 72 65 67 69 73 74 65 72 20 63 6f 6e 74 61 69 6e  register contain
9160: 69 6e 67 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65  ing the.** numbe
9170: 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
9180: 20 63 75 72 72 65 6e 74 20 70 61 72 74 69 74 69   current partiti
9190: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
91a0: 69 64 20 77 69 6e 64 6f 77 41 67 67 53 74 65 70  id windowAggStep
91b0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
91c0: 65 2c 20 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d  e, .  Window *pM
91d0: 57 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  Win,            
91e0: 20 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20        /* Linked 
91f0: 6c 69 73 74 20 6f 66 20 77 69 6e 64 6f 77 20 66  list of window f
9200: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  unctions */.  in
9210: 74 20 63 73 72 2c 20 20 20 20 20 20 20 20 20 20  t csr,          
9220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9230: 20 52 65 61 64 20 61 72 67 75 6d 65 6e 74 73 20   Read arguments 
9240: 66 72 6f 6d 20 74 68 69 73 20 63 75 72 73 6f 72  from this cursor
9250: 20 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 76 65 72   */.  int bInver
9260: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
9270: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
9280: 20 69 6e 76 6f 6b 65 20 78 49 6e 76 65 72 73 65   invoke xInverse
9290: 20 69 6e 73 74 65 61 64 20 6f 66 20 78 53 74 65   instead of xSte
92a0: 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 2c 20  p */.  int reg, 
92b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92c0: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
92d0: 6f 66 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a  of registers */.
92e0: 20 20 69 6e 74 20 72 65 67 50 61 72 74 53 69 7a    int regPartSiz
92f0: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
9300: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 63 6f    /* Register co
9310: 6e 74 61 69 6e 69 6e 67 20 73 69 7a 65 20 6f 66  ntaining size of
9320: 20 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 29 7b   partition */.){
9330: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
9340: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
9350: 73 65 29 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70  se);.  Window *p
9360: 57 69 6e 3b 0a 20 20 66 6f 72 28 70 57 69 6e 3d  Win;.  for(pWin=
9370: 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69  pMWin; pWin; pWi
9380: 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e  n=pWin->pNextWin
9390: 29 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  ){.    int flags
93a0: 20 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e   = pWin->pFunc->
93b0: 66 75 6e 63 46 6c 61 67 73 3b 0a 20 20 20 20 69  funcFlags;.    i
93c0: 6e 74 20 72 65 67 41 72 67 3b 0a 20 20 20 20 69  nt regArg;.    i
93d0: 6e 74 20 6e 41 72 67 20 3d 20 77 69 6e 64 6f 77  nt nArg = window
93e0: 41 72 67 43 6f 75 6e 74 28 70 57 69 6e 29 3b 0a  ArgCount(pWin);.
93f0: 0a 20 20 20 20 69 66 28 20 63 73 72 3e 3d 30 20  .    if( csr>=0 
9400: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
9410: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
9420: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
9430: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9440: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
9450: 75 6d 6e 2c 20 63 73 72 2c 20 70 57 69 6e 2d 3e  umn, csr, pWin->
9460: 69 41 72 67 43 6f 6c 2b 69 2c 20 72 65 67 2b 69  iArgCol+i, reg+i
9470: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
9480: 20 72 65 67 41 72 67 20 3d 20 72 65 67 3b 0a 20   regArg = reg;. 
9490: 20 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26       if( flags &
94a0: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e   SQLITE_FUNC_WIN
94b0: 44 4f 57 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20  DOW_SIZE ){.    
94c0: 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 30 20      if( nArg==0 
94d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 67  ){.          reg
94e0: 41 72 67 20 3d 20 72 65 67 50 61 72 74 53 69 7a  Arg = regPartSiz
94f0: 65 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  e;.        }else
9500: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
9510: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
9520: 20 4f 50 5f 53 43 6f 70 79 2c 20 72 65 67 50 61   OP_SCopy, regPa
9530: 72 74 53 69 7a 65 2c 20 72 65 67 2b 6e 41 72 67  rtSize, reg+nArg
9540: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
9550: 20 20 20 20 20 6e 41 72 67 2b 2b 3b 0a 20 20 20       nArg++;.   
9560: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
9570: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28        assert( !(
9580: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
9590: 55 4e 43 5f 57 49 4e 44 4f 57 5f 53 49 5a 45 29  UNC_WINDOW_SIZE)
95a0: 20 29 3b 0a 20 20 20 20 20 20 72 65 67 41 72 67   );.      regArg
95b0: 20 3d 20 72 65 67 20 2b 20 70 57 69 6e 2d 3e 69   = reg + pWin->i
95c0: 41 72 67 43 6f 6c 3b 0a 20 20 20 20 7d 0a 0a 20  ArgCol;.    }.. 
95d0: 20 20 20 69 66 28 20 28 70 57 69 6e 2d 3e 70 46     if( (pWin->pF
95e0: 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  unc->funcFlags &
95f0: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e   SQLITE_FUNC_MIN
9600: 4d 41 58 29 20 0a 20 20 20 20 20 20 26 26 20 70  MAX) .      && p
9610: 57 69 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b 5f  Win->eStart!=TK_
9620: 55 4e 42 4f 55 4e 44 45 44 20 0a 20 20 20 20 29  UNBOUNDED .    )
9630: 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
9640: 49 73 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33  IsNull = sqlite3
9650: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
9660: 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 41 72 67 29  _IsNull, regArg)
9670: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
9680: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 69  rage(v);.      i
9690: 66 28 20 62 49 6e 76 65 72 73 65 3d 3d 30 20 29  f( bInverse==0 )
96a0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
96b0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
96c0: 50 5f 41 64 64 49 6d 6d 2c 20 70 57 69 6e 2d 3e  P_AddImm, pWin->
96d0: 72 65 67 41 70 70 2b 31 2c 20 31 29 3b 0a 20 20  regApp+1, 1);.  
96e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
96f0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
9700: 6f 70 79 2c 20 72 65 67 41 72 67 2c 20 70 57 69  opy, regArg, pWi
9710: 6e 2d 3e 72 65 67 41 70 70 29 3b 0a 20 20 20 20  n->regApp);.    
9720: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9730: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
9740: 52 65 63 6f 72 64 2c 20 70 57 69 6e 2d 3e 72 65  Record, pWin->re
9750: 67 41 70 70 2c 20 32 2c 20 70 57 69 6e 2d 3e 72  gApp, 2, pWin->r
9760: 65 67 41 70 70 2b 32 29 3b 0a 20 20 20 20 20 20  egApp+2);.      
9770: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9780: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
9790: 65 72 74 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70  ert, pWin->csrAp
97a0: 70 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b  p, pWin->regApp+
97b0: 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  2);.      }else{
97c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
97d0: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
97e0: 20 4f 50 5f 53 65 65 6b 47 45 2c 20 70 57 69 6e   OP_SeekGE, pWin
97f0: 2d 3e 63 73 72 41 70 70 2c 20 30 2c 20 72 65 67  ->csrApp, 0, reg
9800: 41 72 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  Arg, 1);.       
9810: 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76   VdbeCoverageNev
9820: 65 72 54 61 6b 65 6e 28 76 29 3b 0a 20 20 20 20  erTaken(v);.    
9830: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9840: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65  ddOp1(v, OP_Dele
9850: 74 65 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70  te, pWin->csrApp
9860: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
9870: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
9880: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
9890: 72 65 6e 74 41 64 64 72 28 76 29 2d 32 29 3b 0a  rentAddr(v)-2);.
98a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
98b0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
98c0: 65 28 76 2c 20 61 64 64 72 49 73 4e 75 6c 6c 29  e(v, addrIsNull)
98d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
98e0: 70 57 69 6e 2d 3e 72 65 67 41 70 70 20 29 7b 0a  pWin->regApp ){.
98f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57        assert( pW
9900: 69 6e 2d 3e 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65  in->pFunc->zName
9910: 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 0a  ==nth_valueName.
9920: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 57             || pW
9930: 69 6e 2d 3e 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65  in->pFunc->zName
9940: 3d 3d 66 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d  ==first_valueNam
9950: 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  e.      );.     
9960: 20 61 73 73 65 72 74 28 20 62 49 6e 76 65 72 73   assert( bInvers
9970: 65 3d 3d 30 20 7c 7c 20 62 49 6e 76 65 72 73 65  e==0 || bInverse
9980: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==1 );.      sql
9990: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
99a0: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 57 69  , OP_AddImm, pWi
99b0: 6e 2d 3e 72 65 67 41 70 70 2b 31 2d 62 49 6e 76  n->regApp+1-bInv
99c0: 65 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 7d 65  erse, 1);.    }e
99d0: 6c 73 65 20 69 66 28 20 70 57 69 6e 2d 3e 70 46  lse if( pWin->pF
99e0: 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64  unc->zName==lead
99f0: 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 20  Name.           
9a00: 7c 7c 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e  || pWin->pFunc->
9a10: 7a 4e 61 6d 65 3d 3d 6c 61 67 4e 61 6d 65 0a 20  zName==lagName. 
9a20: 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e     ){.      /* n
9a30: 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  o-op */.    }els
9a40: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  e{.      int add
9a50: 72 49 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  rIf = 0;.      i
9a60: 66 28 20 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72  f( pWin->pFilter
9a70: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
9a80: 72 65 67 54 6d 70 3b 0a 20 20 20 20 20 20 20 20  regTmp;.        
9a90: 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 30 20  assert( nArg==0 
9aa0: 7c 7c 20 6e 41 72 67 3d 3d 70 57 69 6e 2d 3e 70  || nArg==pWin->p
9ab0: 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  Owner->x.pList->
9ac0: 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 20  nExpr );.       
9ad0: 20 61 73 73 65 72 74 28 20 6e 41 72 67 20 7c 7c   assert( nArg ||
9ae0: 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78   pWin->pOwner->x
9af0: 2e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20  .pList==0 );.   
9b00: 20 20 20 20 20 69 66 28 20 63 73 72 3e 30 20 29       if( csr>0 )
9b10: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 67 54  {.          regT
9b20: 6d 70 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  mp = sqlite3GetT
9b30: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
9b40: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
9b50: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
9b60: 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20 70  P_Column, csr, p
9b70: 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 6e 41 72  Win->iArgCol+nAr
9b80: 67 2c 72 65 67 54 6d 70 29 3b 0a 20 20 20 20 20  g,regTmp);.     
9b90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9ba0: 20 20 20 20 72 65 67 54 6d 70 20 3d 20 72 65 67      regTmp = reg
9bb0: 41 72 67 20 2b 20 6e 41 72 67 3b 0a 20 20 20 20  Arg + nArg;.    
9bc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64      }.        ad
9bd0: 64 72 49 66 20 3d 20 73 71 6c 69 74 65 33 56 64  drIf = sqlite3Vd
9be0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
9bf0: 66 4e 6f 74 2c 20 72 65 67 54 6d 70 2c 20 30 2c  fNot, regTmp, 0,
9c00: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62   1);.        Vdb
9c10: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
9c20: 20 20 20 20 20 20 69 66 28 20 63 73 72 3e 30 20        if( csr>0 
9c30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
9c40: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
9c50: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 54 6d  eg(pParse, regTm
9c60: 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  p);.        }.  
9c70: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
9c80: 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e  pWin->pFunc->fun
9c90: 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
9ca0: 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b  FUNC_NEEDCOLL ){
9cb0: 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  .        CollSeq
9cc0: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20   *pColl;.       
9cd0: 20 61 73 73 65 72 74 28 20 6e 41 72 67 3e 30 20   assert( nArg>0 
9ce0: 29 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  );.        pColl
9cf0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4e 4e   = sqlite3ExprNN
9d00: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
9d10: 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e  pWin->pOwner->x.
9d20: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
9d30: 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
9d40: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
9d50: 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 30   OP_CollSeq, 0,0
9d60: 2c 30 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  ,0, (const char*
9d70: 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53  )pColl, P4_COLLS
9d80: 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  EQ);.      }.   
9d90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9da0: 64 4f 70 33 28 76 2c 20 62 49 6e 76 65 72 73 65  dOp3(v, bInverse
9db0: 3f 20 4f 50 5f 41 67 67 49 6e 76 65 72 73 65 20  ? OP_AggInverse 
9dc0: 3a 20 4f 50 5f 41 67 67 53 74 65 70 2c 20 0a 20  : OP_AggStep, . 
9dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9de0: 20 20 20 20 20 20 20 62 49 6e 76 65 72 73 65 2c         bInverse,
9df0: 20 72 65 67 41 72 67 2c 20 70 57 69 6e 2d 3e 72   regArg, pWin->r
9e00: 65 67 41 63 63 75 6d 29 3b 0a 20 20 20 20 20 20  egAccum);.      
9e10: 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e  sqlite3VdbeAppen
9e20: 64 50 34 28 76 2c 20 70 57 69 6e 2d 3e 70 46 75  dP4(v, pWin->pFu
9e30: 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  nc, P4_FUNCDEF);
9e40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
9e50: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75  beChangeP5(v, (u
9e60: 38 29 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 69  8)nArg);.      i
9e70: 66 28 20 61 64 64 72 49 66 20 29 20 73 71 6c 69  f( addrIf ) sqli
9e80: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
9e90: 76 2c 20 61 64 64 72 49 66 29 3b 0a 20 20 20 20  v, addrIf);.    
9ea0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  }.  }.}../*.** G
9eb0: 65 6e 65 72 61 74 65 20 56 4d 20 63 6f 64 65 20  enerate VM code 
9ec0: 74 6f 20 69 6e 76 6f 6b 65 20 65 69 74 68 65 72  to invoke either
9ed0: 20 78 56 61 6c 75 65 28 29 20 28 62 46 69 6e 61   xValue() (bFina
9ee0: 6c 3d 3d 30 29 20 6f 72 20 78 46 69 6e 61 6c 69  l==0) or xFinali
9ef0: 7a 65 28 29 0a 2a 2a 20 28 62 46 69 6e 61 6c 3d  ze().** (bFinal=
9f00: 3d 31 29 20 66 6f 72 20 65 61 63 68 20 77 69 6e  =1) for each win
9f10: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20  dow function in 
9f20: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
9f30: 73 74 61 72 74 69 6e 67 20 61 74 0a 2a 2a 20 70  starting at.** p
9f40: 4d 57 69 6e 2e 20 4f 72 2c 20 66 6f 72 20 62 75  MWin. Or, for bu
9f50: 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 2d 66 75  ilt-in window-fu
9f60: 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 64 6f 20  nctions that do 
9f70: 6e 6f 74 20 75 73 65 20 74 68 65 20 73 74 61 6e  not use the stan
9f80: 64 61 72 64 0a 2a 2a 20 41 50 49 2c 20 67 65 6e  dard.** API, gen
9f90: 65 72 61 74 65 20 74 68 65 20 65 71 75 69 76 61  erate the equiva
9fa0: 6c 65 6e 74 20 56 4d 20 63 6f 64 65 2e 0a 2a 2f  lent VM code..*/
9fb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
9fc0: 64 6f 77 41 67 67 46 69 6e 61 6c 28 50 61 72 73  dowAggFinal(Pars
9fd0: 65 20 2a 70 50 61 72 73 65 2c 20 57 69 6e 64 6f  e *pParse, Windo
9fe0: 77 20 2a 70 4d 57 69 6e 2c 20 69 6e 74 20 62 46  w *pMWin, int bF
9ff0: 69 6e 61 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76  inal){.  Vdbe *v
a000: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
a010: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 57 69 6e  e(pParse);.  Win
a020: 64 6f 77 20 2a 70 57 69 6e 3b 0a 0a 20 20 66 6f  dow *pWin;..  fo
a030: 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57  r(pWin=pMWin; pW
a040: 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70  in; pWin=pWin->p
a050: 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 69 66  NextWin){.    if
a060: 28 20 28 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e  ( (pWin->pFunc->
a070: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
a080: 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 20  TE_FUNC_MINMAX) 
a090: 0a 20 20 20 20 20 26 26 20 70 57 69 6e 2d 3e 65  .     && pWin->e
a0a0: 53 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e  Start!=TK_UNBOUN
a0b0: 44 45 44 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  DED .    ){.    
a0c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a0d0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
a0e0: 30 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75  0, pWin->regResu
a0f0: 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lt);.      sqlit
a100: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
a110: 4f 50 5f 4c 61 73 74 2c 20 70 57 69 6e 2d 3e 63  OP_Last, pWin->c
a120: 73 72 41 70 70 29 3b 0a 20 20 20 20 20 20 56 64  srApp);.      Vd
a130: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
a140: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a150: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
a160: 75 6d 6e 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70  umn, pWin->csrAp
a170: 70 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 52  p, 0, pWin->regR
a180: 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 73 71  esult);.      sq
a190: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
a1a0: 65 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65  e(v, sqlite3Vdbe
a1b0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 32  CurrentAddr(v)-2
a1c0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 46 69  );.      if( bFi
a1d0: 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  nal ){.        s
a1e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
a1f0: 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74  (v, OP_ResetSort
a200: 65 72 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70  er, pWin->csrApp
a210: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
a220: 65 6c 73 65 20 69 66 28 20 70 57 69 6e 2d 3e 72  else if( pWin->r
a230: 65 67 41 70 70 20 29 7b 0a 20 20 20 20 7d 65 6c  egApp ){.    }el
a240: 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 62 46  se{.      if( bF
a250: 69 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  inal ){.        
a260: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a270: 32 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c  2(v, OP_AggFinal
a280: 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d  , pWin->regAccum
a290: 2c 20 77 69 6e 64 6f 77 41 72 67 43 6f 75 6e 74  , windowArgCount
a2a0: 28 70 57 69 6e 29 29 3b 0a 20 20 20 20 20 20 20  (pWin));.       
a2b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65   sqlite3VdbeAppe
a2c0: 6e 64 50 34 28 76 2c 20 70 57 69 6e 2d 3e 70 46  ndP4(v, pWin->pF
a2d0: 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  unc, P4_FUNCDEF)
a2e0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
a2f0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a300: 50 5f 43 6f 70 79 2c 20 70 57 69 6e 2d 3e 72 65  P_Copy, pWin->re
a310: 67 41 63 63 75 6d 2c 20 70 57 69 6e 2d 3e 72 65  gAccum, pWin->re
a320: 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20  gResult);.      
a330: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a340: 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
a350: 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75  0, pWin->regAccu
a360: 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  m);.      }else{
a370: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a380: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
a390: 5f 41 67 67 56 61 6c 75 65 2c 20 70 57 69 6e 2d  _AggValue, pWin-
a3a0: 3e 72 65 67 41 63 63 75 6d 2c 20 77 69 6e 64 6f  >regAccum, windo
a3b0: 77 41 72 67 43 6f 75 6e 74 28 70 57 69 6e 29 2c  wArgCount(pWin),
a3c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57                pW
a3e0: 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a  in->regResult);.
a3f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
a400: 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70  dbeAppendP4(v, p
a410: 57 69 6e 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46  Win->pFunc, P4_F
a420: 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 7d  UNCDEF);.      }
a430: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
a440: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
a450: 6e 20 67 65 6e 65 72 61 74 65 73 20 56 4d 20 63  n generates VM c
a460: 6f 64 65 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  ode to invoke th
a470: 65 20 73 75 62 2d 72 6f 75 74 69 6e 65 20 61 74  e sub-routine at
a480: 20 61 64 64 72 65 73 73 0a 2a 2a 20 6c 62 6c 46   address.** lblF
a490: 6c 75 73 68 50 61 72 74 20 6f 6e 63 65 20 66 6f  lushPart once fo
a4a0: 72 20 65 61 63 68 20 70 61 72 74 69 74 69 6f 6e  r each partition
a4b0: 20 77 69 74 68 20 74 68 65 20 65 6e 74 69 72 65   with the entire
a4c0: 20 70 61 72 74 69 74 69 6f 6e 20 63 61 63 68 65   partition cache
a4d0: 64 20 69 6e 0a 2a 2a 20 74 68 65 20 57 69 6e 64  d in.** the Wind
a4e0: 6f 77 2e 69 45 70 68 43 73 72 20 74 65 6d 70 20  ow.iEphCsr temp 
a4f0: 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
a500: 20 76 6f 69 64 20 77 69 6e 64 6f 77 50 61 72 74   void windowPart
a510: 69 74 69 6f 6e 43 61 63 68 65 28 0a 20 20 50 61  itionCache(.  Pa
a520: 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 53  rse *pParse,.  S
a530: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
a540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a550: 2a 20 54 68 65 20 72 65 77 72 69 74 74 65 6e 20  * The rewritten 
a560: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
a570: 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20   */.  WhereInfo 
a580: 2a 70 57 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  *pWInfo,        
a590: 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 49 6e        /* WhereIn
a5a0: 66 6f 20 74 6f 20 63 61 6c 6c 20 57 68 65 72 65  fo to call Where
a5b0: 45 6e 64 28 29 20 6f 6e 20 2a 2f 0a 20 20 69 6e  End() on */.  in
a5c0: 74 20 72 65 67 46 6c 75 73 68 50 61 72 74 2c 20  t regFlushPart, 
a5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a5e0: 20 52 65 67 69 73 74 65 72 20 74 6f 20 75 73 65   Register to use
a5f0: 20 77 69 74 68 20 47 6f 73 75 62 20 6c 62 6c 46   with Gosub lblF
a600: 6c 75 73 68 50 61 72 74 20 2a 2f 0a 20 20 69 6e  lushPart */.  in
a610: 74 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 2c 20  t lblFlushPart, 
a620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a630: 20 53 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 47   Subroutine to G
a640: 6f 73 75 62 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  osub to */.  int
a650: 20 2a 70 52 65 67 53 69 7a 65 20 20 20 20 20 20   *pRegSize      
a660: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a670: 4f 55 54 3a 20 52 65 67 69 73 74 65 72 20 63 6f  OUT: Register co
a680: 6e 74 61 69 6e 69 6e 67 20 70 61 72 74 69 74 69  ntaining partiti
a690: 6f 6e 20 73 69 7a 65 20 2a 2f 0a 29 7b 0a 20 20  on size */.){.  
a6a0: 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20  Window *pMWin = 
a6b0: 70 2d 3e 70 57 69 6e 3b 0a 20 20 56 64 62 65 20  p->pWin;.  Vdbe 
a6c0: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
a6d0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
a6e0: 6e 74 20 69 53 75 62 43 73 72 20 3d 20 70 2d 3e  nt iSubCsr = p->
a6f0: 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73  pSrc->a[0].iCurs
a700: 6f 72 3b 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d  or;.  int nSub =
a710: 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
a720: 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 69 6e 74  Tab->nCol;.  int
a730: 20 6b 3b 0a 0a 20 20 69 6e 74 20 72 65 67 20 3d   k;..  int reg =
a740: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
a750: 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64  .  int regRecord
a760: 20 3d 20 72 65 67 2b 6e 53 75 62 3b 0a 20 20 69   = reg+nSub;.  i
a770: 6e 74 20 72 65 67 52 6f 77 69 64 20 3d 20 72 65  nt regRowid = re
a780: 67 52 65 63 6f 72 64 2b 31 3b 0a 0a 20 20 2a 70  gRecord+1;..  *p
a790: 52 65 67 53 69 7a 65 20 3d 20 72 65 67 52 6f 77  RegSize = regRow
a7a0: 69 64 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d  id;.  pParse->nM
a7b0: 65 6d 20 2b 3d 20 6e 53 75 62 20 2b 20 32 3b 0a  em += nSub + 2;.
a7c0: 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 63  .  /* Load the c
a7d0: 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 66 6f 72  olumn values for
a7e0: 20 74 68 65 20 72 6f 77 20 72 65 74 75 72 6e 65   the row returne
a7f0: 64 20 62 79 20 74 68 65 20 73 75 62 2d 73 65 6c  d by the sub-sel
a800: 65 63 74 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 6e  ect.  ** into an
a810: 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   array of regist
a820: 65 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  ers starting at 
a830: 72 65 67 2e 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d  reg. */.  for(k=
a840: 30 3b 20 6b 3c 6e 53 75 62 3b 20 6b 2b 2b 29 7b  0; k<nSub; k++){
a850: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a860: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
a870: 75 6d 6e 2c 20 69 53 75 62 43 73 72 2c 20 6b 2c  umn, iSubCsr, k,
a880: 20 72 65 67 2b 6b 29 3b 0a 20 20 7d 0a 20 20 73   reg+k);.  }.  s
a890: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
a8a0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
a8b0: 64 2c 20 72 65 67 2c 20 6e 53 75 62 2c 20 72 65  d, reg, nSub, re
a8c0: 67 52 65 63 6f 72 64 29 3b 0a 0a 20 20 2f 2a 20  gRecord);..  /* 
a8d0: 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 69 73  Check if this is
a8e0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20   the start of a 
a8f0: 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 2e 20 49  new partition. I
a900: 66 20 73 6f 2c 20 63 61 6c 6c 20 74 68 65 0a 20  f so, call the. 
a910: 20 2a 2a 20 66 6c 75 73 68 5f 70 61 72 74 69 74   ** flush_partit
a920: 69 6f 6e 20 73 75 62 2d 72 6f 75 74 69 6e 65 2e  ion sub-routine.
a930: 20 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e    */.  if( pMWin
a940: 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 29 7b 0a  ->pPartition ){.
a950: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
a960: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 50 61 72    ExprList *pPar
a970: 74 20 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74  t = pMWin->pPart
a980: 69 74 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 6e  ition;.    int n
a990: 50 61 72 74 20 3d 20 70 50 61 72 74 2d 3e 6e 45  Part = pPart->nE
a9a0: 78 70 72 3b 0a 20 20 20 20 69 6e 74 20 72 65 67  xpr;.    int reg
a9b0: 4e 65 77 50 61 72 74 20 3d 20 72 65 67 20 2b 20  NewPart = reg + 
a9c0: 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f  pMWin->nBufferCo
a9d0: 6c 3b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  l;.    KeyInfo *
a9e0: 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
a9f0: 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  e3KeyInfoFromExp
aa00: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 50  rList(pParse, pP
aa10: 61 72 74 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20  art, 0, 0);..   
aa20: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
aa30: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
aa40: 43 6f 6d 70 61 72 65 2c 20 72 65 67 4e 65 77 50  Compare, regNewP
aa50: 61 72 74 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50  art, pMWin->regP
aa60: 61 72 74 2c 6e 50 61 72 74 29 3b 0a 20 20 20 20  art,nPart);.    
aa70: 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e  sqlite3VdbeAppen
aa80: 64 50 34 28 76 2c 20 28 76 6f 69 64 2a 29 70 4b  dP4(v, (void*)pK
aa90: 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
aaa0: 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  FO);.    sqlite3
aab0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
aac0: 5f 4a 75 6d 70 2c 20 61 64 64 72 2b 32 2c 20 61  _Jump, addr+2, a
aad0: 64 64 72 2b 34 2c 20 61 64 64 72 2b 32 29 3b 0a  ddr+4, addr+2);.
aae0: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
aaf0: 45 71 4e 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  EqNe(v);.    sql
ab00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
ab10: 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4e 65  , OP_Copy, regNe
ab20: 77 50 61 72 74 2c 20 70 4d 57 69 6e 2d 3e 72 65  wPart, pMWin->re
ab30: 67 50 61 72 74 2c 20 6e 50 61 72 74 2d 31 29 3b  gPart, nPart-1);
ab40: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
ab50: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
ab60: 75 62 2c 20 72 65 67 46 6c 75 73 68 50 61 72 74  ub, regFlushPart
ab70: 2c 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 29 3b  , lblFlushPart);
ab80: 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
ab90: 28 28 76 2c 20 22 63 61 6c 6c 20 66 6c 75 73 68  ((v, "call flush
aba0: 5f 70 61 72 74 69 74 69 6f 6e 22 29 29 3b 0a 20  _partition"));. 
abb0: 20 7d 0a 0a 20 20 2f 2a 20 42 75 66 66 65 72 20   }..  /* Buffer 
abc0: 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
abd0: 69 6e 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  in the ephemeral
abe0: 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c   table. */.  sql
abf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
ac00: 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70  , OP_NewRowid, p
ac10: 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 72  MWin->iEphCsr, r
ac20: 65 67 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69  egRowid);.  sqli
ac30: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
ac40: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 4d 57 69   OP_Insert, pMWi
ac50: 6e 2d 3e 69 45 70 68 43 73 72 2c 20 72 65 67 52  n->iEphCsr, regR
ac60: 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 69 64 29  ecord, regRowid)
ac70: 3b 0a 0a 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74  ;..  /* End of t
ac80: 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f  he input loop */
ac90: 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  .  sqlite3WhereE
aca0: 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a 20 20 2f  nd(pWInfo);..  /
acb0: 2a 20 49 6e 76 6f 6b 65 20 22 66 6c 75 73 68 5f  * Invoke "flush_
acc0: 70 61 72 74 69 74 69 6f 6e 22 20 74 6f 20 64 65  partition" to de
acd0: 61 6c 20 77 69 74 68 20 74 68 65 20 66 69 6e 61  al with the fina
ace0: 6c 20 28 6f 72 20 6f 6e 6c 79 29 20 70 61 72 74  l (or only) part
acf0: 69 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  ition */.  sqlit
ad00: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
ad10: 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 46 6c 75  OP_Gosub, regFlu
ad20: 73 68 50 61 72 74 2c 20 6c 62 6c 46 6c 75 73 68  shPart, lblFlush
ad30: 50 61 72 74 29 3b 0a 20 20 56 64 62 65 43 6f 6d  Part);.  VdbeCom
ad40: 6d 65 6e 74 28 28 76 2c 20 22 63 61 6c 6c 20 66  ment((v, "call f
ad50: 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 29  lush_partition")
ad60: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  );.}../*.** Invo
ad70: 6b 65 20 74 68 65 20 73 75 62 2d 72 6f 75 74 69  ke the sub-routi
ad80: 6e 65 20 61 74 20 72 65 67 47 6f 73 75 62 20 28  ne at regGosub (
ad90: 67 65 6e 65 72 61 74 65 64 20 62 79 20 63 6f 64  generated by cod
ada0: 65 20 69 6e 20 73 65 6c 65 63 74 2e 63 29 20 74  e in select.c) t
adb0: 6f 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20  o.** return the 
adc0: 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 57  current row of W
add0: 69 6e 64 6f 77 2e 69 45 70 68 43 73 72 2e 20 49  indow.iEphCsr. I
ade0: 66 20 61 6c 6c 20 77 69 6e 64 6f 77 20 66 75 6e  f all window fun
adf0: 63 74 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 61 67  ctions are.** ag
ae00: 67 72 65 67 61 74 65 20 77 69 6e 64 6f 77 20 66  gregate window f
ae10: 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 75 73  unctions that us
ae20: 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 41  e the standard A
ae30: 50 49 2c 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20  PI, a single.** 
ae40: 4f 50 5f 47 6f 73 75 62 20 69 6e 73 74 72 75 63  OP_Gosub instruc
ae50: 74 69 6f 6e 20 69 73 20 61 6c 6c 20 74 68 61 74  tion is all that
ae60: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   this routine ge
ae70: 6e 65 72 61 74 65 73 2e 20 45 78 74 72 61 20 56  nerates. Extra V
ae80: 4d 20 63 6f 64 65 0a 2a 2a 20 66 6f 72 20 70 65  M code.** for pe
ae90: 72 2d 72 6f 77 20 70 72 6f 63 65 73 73 69 6e 67  r-row processing
aea0: 20 69 73 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74   is only generat
aeb0: 65 64 20 66 6f 72 20 74 68 65 20 66 6f 6c 6c 6f  ed for the follo
aec0: 77 69 6e 67 20 62 75 69 6c 74 2d 69 6e 20 77 69  wing built-in wi
aed0: 6e 64 6f 77 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ndow.** function
aee0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6e 74 68 5f 76  s:.**.**   nth_v
aef0: 61 6c 75 65 28 29 0a 2a 2a 20 20 20 66 69 72 73  alue().**   firs
af00: 74 5f 76 61 6c 75 65 28 29 0a 2a 2a 20 20 20 6c  t_value().**   l
af10: 61 67 28 29 0a 2a 2a 20 20 20 6c 65 61 64 28 29  ag().**   lead()
af20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
af30: 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52  windowReturnOneR
af40: 6f 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ow(.  Parse *pPa
af50: 72 73 65 2c 0a 20 20 57 69 6e 64 6f 77 20 2a 70  rse,.  Window *p
af60: 4d 57 69 6e 2c 0a 20 20 69 6e 74 20 72 65 67 47  MWin,.  int regG
af70: 6f 73 75 62 2c 0a 20 20 69 6e 74 20 61 64 64 72  osub,.  int addr
af80: 47 6f 73 75 62 0a 29 7b 0a 20 20 56 64 62 65 20  Gosub.){.  Vdbe 
af90: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
afa0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 57  dbe(pParse);.  W
afb0: 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 66  indow *pWin;.  f
afc0: 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70  or(pWin=pMWin; p
afd0: 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e  Win; pWin=pWin->
afe0: 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 46  pNextWin){.    F
aff0: 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20 3d 20  uncDef *pFunc = 
b000: 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20 20  pWin->pFunc;.   
b010: 20 69 66 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d   if( pFunc->zNam
b020: 65 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65  e==nth_valueName
b030: 0a 20 20 20 20 20 7c 7c 20 70 46 75 6e 63 2d 3e  .     || pFunc->
b040: 7a 4e 61 6d 65 3d 3d 66 69 72 73 74 5f 76 61 6c  zName==first_val
b050: 75 65 4e 61 6d 65 0a 20 20 20 20 29 7b 0a 20 20  ueName.    ){.  
b060: 20 20 20 20 69 6e 74 20 63 73 72 20 3d 20 70 57      int csr = pW
b070: 69 6e 2d 3e 63 73 72 41 70 70 3b 0a 20 20 20 20  in->csrApp;.    
b080: 20 20 69 6e 74 20 6c 62 6c 20 3d 20 73 71 6c 69    int lbl = sqli
b090: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
b0a0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
b0b0: 69 6e 74 20 74 6d 70 52 65 67 20 3d 20 73 71 6c  int tmpReg = sql
b0c0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
b0d0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
b0e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
b0f0: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70  v, OP_Null, 0, p
b100: 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b  Win->regResult);
b110: 0a 0a 20 20 20 20 20 20 69 66 28 20 70 46 75 6e  ..      if( pFun
b120: 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61  c->zName==nth_va
b130: 6c 75 65 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  lueName ){.     
b140: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b150: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
b160: 6e 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  n, pMWin->iEphCs
b170: 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c  r, pWin->iArgCol
b180: 2b 31 2c 74 6d 70 52 65 67 29 3b 0a 20 20 20 20  +1,tmpReg);.    
b190: 20 20 20 20 77 69 6e 64 6f 77 43 68 65 63 6b 49      windowCheckI
b1a0: 6e 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20  ntValue(pParse, 
b1b0: 74 6d 70 52 65 67 2c 20 32 29 3b 0a 20 20 20 20  tmpReg, 2);.    
b1c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b1d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b1e0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
b1f0: 2c 20 31 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20  , 1, tmpReg);.  
b200: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
b210: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
b220: 20 4f 50 5f 41 64 64 2c 20 74 6d 70 52 65 67 2c   OP_Add, tmpReg,
b230: 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2c 20 74   pWin->regApp, t
b240: 6d 70 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71  mpReg);.      sq
b250: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
b260: 76 2c 20 4f 50 5f 47 74 2c 20 70 57 69 6e 2d 3e  v, OP_Gt, pWin->
b270: 72 65 67 41 70 70 2b 31 2c 20 6c 62 6c 2c 20 74  regApp+1, lbl, t
b280: 6d 70 52 65 67 29 3b 0a 20 20 20 20 20 20 56 64  mpReg);.      Vd
b290: 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72 4e  beCoverageNeverN
b2a0: 75 6c 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ull(v);.      sq
b2b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
b2c0: 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c  v, OP_SeekRowid,
b2d0: 20 63 73 72 2c 20 30 2c 20 74 6d 70 52 65 67 29   csr, 0, tmpReg)
b2e0: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
b2f0: 72 61 67 65 4e 65 76 65 72 54 61 6b 65 6e 28 76  rageNeverTaken(v
b300: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b310: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
b320: 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20 70 57  _Column, csr, pW
b330: 69 6e 2d 3e 69 41 72 67 43 6f 6c 2c 20 70 57 69  in->iArgCol, pWi
b340: 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20  n->regResult);. 
b350: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b360: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
b370: 6c 62 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lbl);.      sqli
b380: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
b390: 67 28 70 50 61 72 73 65 2c 20 74 6d 70 52 65 67  g(pParse, tmpReg
b3a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73  );.    }.    els
b3b0: 65 20 69 66 28 20 70 46 75 6e 63 2d 3e 7a 4e 61  e if( pFunc->zNa
b3c0: 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65 20 7c 7c 20  me==leadName || 
b3d0: 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 61  pFunc->zName==la
b3e0: 67 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 69  gName ){.      i
b3f0: 6e 74 20 6e 41 72 67 20 3d 20 70 57 69 6e 2d 3e  nt nArg = pWin->
b400: 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 2d  pOwner->x.pList-
b410: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e  >nExpr;.      in
b420: 74 20 69 45 70 68 20 3d 20 70 4d 57 69 6e 2d 3e  t iEph = pMWin->
b430: 69 45 70 68 43 73 72 3b 0a 20 20 20 20 20 20 69  iEphCsr;.      i
b440: 6e 74 20 63 73 72 20 3d 20 70 57 69 6e 2d 3e 63  nt csr = pWin->c
b450: 73 72 41 70 70 3b 0a 20 20 20 20 20 20 69 6e 74  srApp;.      int
b460: 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33 56 64   lbl = sqlite3Vd
b470: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
b480: 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 74  se);.      int t
b490: 6d 70 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47  mpReg = sqlite3G
b4a0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
b4b0: 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 41  );..      if( nA
b4c0: 72 67 3c 33 20 29 7b 0a 20 20 20 20 20 20 20 20  rg<3 ){.        
b4d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b4e0: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
b4f0: 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74   pWin->regResult
b500: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
b510: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b520: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
b530: 43 6f 6c 75 6d 6e 2c 20 69 45 70 68 2c 20 70 57  Column, iEph, pW
b540: 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 32 2c 20 70  in->iArgCol+2, p
b550: 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b  Win->regResult);
b560: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
b570: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
b580: 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 45  (v, OP_Rowid, iE
b590: 70 68 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20  ph, tmpReg);.   
b5a0: 20 20 20 69 66 28 20 6e 41 72 67 3c 32 20 29 7b     if( nArg<2 ){
b5b0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 76 61 6c  .        int val
b5c0: 20 3d 20 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65   = (pFunc->zName
b5d0: 3d 3d 6c 65 61 64 4e 61 6d 65 20 3f 20 31 20 3a  ==leadName ? 1 :
b5e0: 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71   -1);.        sq
b5f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
b600: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 6d  v, OP_AddImm, tm
b610: 70 52 65 67 2c 20 76 61 6c 29 3b 0a 20 20 20 20  pReg, val);.    
b620: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b630: 20 69 6e 74 20 6f 70 20 3d 20 28 70 46 75 6e 63   int op = (pFunc
b640: 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d  ->zName==leadNam
b650: 65 20 3f 20 4f 50 5f 41 64 64 20 3a 20 4f 50 5f  e ? OP_Add : OP_
b660: 53 75 62 74 72 61 63 74 29 3b 0a 20 20 20 20 20  Subtract);.     
b670: 20 20 20 69 6e 74 20 74 6d 70 52 65 67 32 20 3d     int tmpReg2 =
b680: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
b690: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
b6a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b6b0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
b6c0: 6d 6e 2c 20 69 45 70 68 2c 20 70 57 69 6e 2d 3e  mn, iEph, pWin->
b6d0: 69 41 72 67 43 6f 6c 2b 31 2c 20 74 6d 70 52 65  iArgCol+1, tmpRe
b6e0: 67 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  g2);.        sql
b6f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
b700: 2c 20 6f 70 2c 20 74 6d 70 52 65 67 32 2c 20 74  , op, tmpReg2, t
b710: 6d 70 52 65 67 2c 20 74 6d 70 52 65 67 29 3b 0a  mpReg, tmpReg);.
b720: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
b730: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
b740: 61 72 73 65 2c 20 74 6d 70 52 65 67 32 29 3b 0a  arse, tmpReg2);.
b750: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73        }..      s
b760: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
b770: 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64  (v, OP_SeekRowid
b780: 2c 20 63 73 72 2c 20 6c 62 6c 2c 20 74 6d 70 52  , csr, lbl, tmpR
b790: 65 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  eg);.      VdbeC
b7a0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
b7b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b7c0: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
b7d0: 2c 20 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72  , csr, pWin->iAr
b7e0: 67 43 6f 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 52  gCol, pWin->regR
b7f0: 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 73 71  esult);.      sq
b800: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
b810: 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20  Label(v, lbl);. 
b820: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
b830: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
b840: 65 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20  e, tmpReg);.    
b850: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  }.  }.  sqlite3V
b860: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b870: 47 6f 73 75 62 2c 20 72 65 67 47 6f 73 75 62 2c  Gosub, regGosub,
b880: 20 61 64 64 72 47 6f 73 75 62 29 3b 0a 7d 0a 0a   addrGosub);.}..
b890: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
b8a0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
b8b0: 62 79 20 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f  by windowReturnO
b8c0: 6e 65 52 6f 77 28 29 20 61 6e 64 2c 20 6f 70 74  neRow() and, opt
b8d0: 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 0a 2a 2a 20  ionally, the.** 
b8e0: 78 49 6e 76 65 72 73 65 28 29 20 66 75 6e 63 74  xInverse() funct
b8f0: 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 77 69 6e  ion for each win
b900: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 2c 20 66 6f  dow function, fo
b910: 72 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 72 6f  r one or more ro
b920: 77 73 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 57  ws.** from the W
b930: 69 6e 64 6f 77 2e 69 45 70 68 43 73 72 20 74 65  indow.iEphCsr te
b940: 6d 70 20 74 61 62 6c 65 2e 20 54 68 69 73 20 72  mp table. This r
b950: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
b960: 20 56 4d 20 63 6f 64 65 0a 2a 2a 20 73 69 6d 69   VM code.** simi
b970: 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20  lar to:.**.**   
b980: 77 68 69 6c 65 28 20 72 65 67 43 74 72 3e 30 20  while( regCtr>0 
b990: 29 7b 0a 2a 2a 20 20 20 20 20 72 65 67 43 74 72  ){.**     regCtr
b9a0: 2d 2d 3b 0a 2a 2a 20 20 20 20 20 77 69 6e 64 6f  --;.**     windo
b9b0: 77 52 65 74 75 72 6e 4f 6e 65 52 6f 77 28 29 0a  wReturnOneRow().
b9c0: 2a 2a 20 20 20 20 20 69 66 28 20 62 49 6e 76 65  **     if( bInve
b9d0: 72 73 65 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  rse ){.**       
b9e0: 41 67 67 49 6e 76 65 72 73 65 0a 2a 2a 20 20 20  AggInverse.**   
b9f0: 20 20 7d 0a 2a 2a 20 20 20 20 20 4e 65 78 74 20    }.**     Next 
ba00: 28 57 69 6e 64 6f 77 2e 69 45 70 68 43 73 72 29  (Window.iEphCsr)
ba10: 0a 2a 2a 20 20 20 7d 0a 2a 2f 0a 73 74 61 74 69  .**   }.*/.stati
ba20: 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 52 65 74  c void windowRet
ba30: 75 72 6e 52 6f 77 73 28 0a 20 20 50 61 72 73 65  urnRows(.  Parse
ba40: 20 2a 70 50 61 72 73 65 2c 0a 20 20 57 69 6e 64   *pParse,.  Wind
ba50: 6f 77 20 2a 70 4d 57 69 6e 2c 20 20 20 20 20 20  ow *pMWin,      
ba60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
ba70: 69 73 74 20 6f 66 20 77 69 6e 64 6f 77 20 66 75  ist of window fu
ba80: 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  nctions */.  int
ba90: 20 72 65 67 43 74 72 2c 20 20 20 20 20 20 20 20   regCtr,        
baa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bab0: 52 65 67 69 73 74 65 72 20 63 6f 6e 74 61 69 6e  Register contain
bac0: 69 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  ing number of ro
bad0: 77 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 47  ws */.  int regG
bae0: 6f 73 75 62 2c 20 20 20 20 20 20 20 20 20 20 20  osub,           
baf0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
bb00: 74 65 72 20 66 6f 72 20 47 6f 73 75 62 20 61 64  ter for Gosub ad
bb10: 64 72 47 6f 73 75 62 20 2a 2f 0a 20 20 69 6e 74  drGosub */.  int
bb20: 20 61 64 64 72 47 6f 73 75 62 2c 20 20 20 20 20   addrGosub,     
bb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bb40: 41 64 64 72 65 73 73 20 6f 66 20 73 75 62 2d 72  Address of sub-r
bb50: 6f 75 74 69 6e 65 20 66 6f 72 20 52 65 74 75 72  outine for Retur
bb60: 6e 4f 6e 65 52 6f 77 20 2a 2f 0a 20 20 69 6e 74  nOneRow */.  int
bb70: 20 72 65 67 49 6e 76 41 72 67 2c 20 20 20 20 20   regInvArg,     
bb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bb90: 41 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  Array of registe
bba0: 72 73 20 66 6f 72 20 78 49 6e 76 65 72 73 65 20  rs for xInverse 
bbb0: 61 72 67 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65  args */.  int re
bbc0: 67 49 6e 76 53 69 7a 65 20 20 20 20 20 20 20 20  gInvSize        
bbd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
bbe0: 69 73 74 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  ister containing
bbf0: 20 73 69 7a 65 20 6f 66 20 70 61 72 74 69 74 69   size of partiti
bc00: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  on */.){.  int a
bc10: 64 64 72 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ddr;.  Vdbe *v =
bc20: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
bc30: 70 50 61 72 73 65 29 3b 0a 20 20 77 69 6e 64 6f  pParse);.  windo
bc40: 77 41 67 67 46 69 6e 61 6c 28 70 50 61 72 73 65  wAggFinal(pParse
bc50: 2c 20 70 4d 57 69 6e 2c 20 30 29 3b 0a 20 20 61  , pMWin, 0);.  a
bc60: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
bc70: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
bc80: 50 6f 73 2c 20 72 65 67 43 74 72 2c 20 73 71 6c  Pos, regCtr, sql
bc90: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
bca0: 64 64 72 28 76 29 2b 32 20 2c 31 29 3b 0a 20 20  ddr(v)+2 ,1);.  
bcb0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
bcc0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
bcd0: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
bce0: 20 30 2c 20 30 29 3b 0a 20 20 77 69 6e 64 6f 77   0, 0);.  window
bcf0: 52 65 74 75 72 6e 4f 6e 65 52 6f 77 28 70 50 61  ReturnOneRow(pPa
bd00: 72 73 65 2c 20 70 4d 57 69 6e 2c 20 72 65 67 47  rse, pMWin, regG
bd10: 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29  osub, addrGosub)
bd20: 3b 0a 20 20 69 66 28 20 72 65 67 49 6e 76 41 72  ;.  if( regInvAr
bd30: 67 20 29 7b 0a 20 20 20 20 77 69 6e 64 6f 77 41  g ){.    windowA
bd40: 67 67 53 74 65 70 28 70 50 61 72 73 65 2c 20 70  ggStep(pParse, p
bd50: 4d 57 69 6e 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  MWin, pMWin->iEp
bd60: 68 43 73 72 2c 20 31 2c 20 72 65 67 49 6e 76 41  hCsr, 1, regInvA
bd70: 72 67 2c 20 72 65 67 49 6e 76 53 69 7a 65 29 3b  rg, regInvSize);
bd80: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
bd90: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
bda0: 65 78 74 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  ext, pMWin->iEph
bdb0: 43 73 72 2c 20 61 64 64 72 29 3b 0a 20 20 56 64  Csr, addr);.  Vd
bdc0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
bdd0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
bde0: 48 65 72 65 28 76 2c 20 61 64 64 72 2b 31 29 3b  Here(v, addr+1);
bdf0: 20 20 20 2f 2a 20 54 68 65 20 4f 50 5f 47 6f 74     /* The OP_Got
be00: 6f 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  o */.}../*.** Ge
be10: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73  nerate code to s
be20: 65 74 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  et the accumulat
be30: 6f 72 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  or register for 
be40: 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63  each window func
be50: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 6c  tion.** in the l
be60: 69 6e 6b 65 64 20 6c 69 73 74 20 70 61 73 73 65  inked list passe
be70: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
be80: 61 72 67 75 6d 65 6e 74 20 74 6f 20 4e 55 4c 4c  argument to NULL
be90: 2e 20 41 6e 64 20 70 65 72 66 6f 72 6d 0a 2a 2a  . And perform.**
bea0: 20 61 6e 79 20 65 71 75 69 76 61 6c 65 6e 74 20   any equivalent 
beb0: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 72  initialization r
bec0: 65 71 75 69 72 65 64 20 62 79 20 61 6e 79 20 62  equired by any b
bed0: 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66  uilt-in window f
bee0: 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 74  unctions.** in t
bef0: 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  he list..*/.stat
bf00: 69 63 20 69 6e 74 20 77 69 6e 64 6f 77 49 6e 69  ic int windowIni
bf10: 74 41 63 63 75 6d 28 50 61 72 73 65 20 2a 70 50  tAccum(Parse *pP
bf20: 61 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70 4d  arse, Window *pM
bf30: 57 69 6e 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  Win){.  Vdbe *v 
bf40: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
bf50: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
bf60: 72 65 67 41 72 67 3b 0a 20 20 69 6e 74 20 6e 41  regArg;.  int nA
bf70: 72 67 20 3d 20 30 3b 0a 20 20 57 69 6e 64 6f 77  rg = 0;.  Window
bf80: 20 2a 70 57 69 6e 3b 0a 20 20 66 6f 72 28 70 57   *pWin;.  for(pW
bf90: 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20  in=pMWin; pWin; 
bfa0: 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74  pWin=pWin->pNext
bfb0: 57 69 6e 29 7b 0a 20 20 20 20 46 75 6e 63 44 65  Win){.    FuncDe
bfc0: 66 20 2a 70 46 75 6e 63 20 3d 20 70 57 69 6e 2d  f *pFunc = pWin-
bfd0: 3e 70 46 75 6e 63 3b 0a 20 20 20 20 73 71 6c 69  >pFunc;.    sqli
bfe0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
bff0: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69   OP_Null, 0, pWi
c000: 6e 2d 3e 72 65 67 41 63 63 75 6d 29 3b 0a 20 20  n->regAccum);.  
c010: 20 20 6e 41 72 67 20 3d 20 4d 41 58 28 6e 41 72    nArg = MAX(nAr
c020: 67 2c 20 77 69 6e 64 6f 77 41 72 67 43 6f 75 6e  g, windowArgCoun
c030: 74 28 70 57 69 6e 29 29 3b 0a 20 20 20 20 69 66  t(pWin));.    if
c040: 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d  ( pFunc->zName==
c050: 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 0a 20 20  nth_valueName.  
c060: 20 20 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61     || pFunc->zNa
c070: 6d 65 3d 3d 66 69 72 73 74 5f 76 61 6c 75 65 4e  me==first_valueN
c080: 61 6d 65 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ame.    ){.     
c090: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c0a0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
c0b0: 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70  , 0, pWin->regAp
c0c0: 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
c0d0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
c0e0: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 57  P_Integer, 0, pW
c0f0: 69 6e 2d 3e 72 65 67 41 70 70 2b 31 29 3b 0a 20  in->regApp+1);. 
c100: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70     }..    if( (p
c110: 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20  Func->funcFlags 
c120: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49  & SQLITE_FUNC_MI
c130: 4e 4d 41 58 29 20 26 26 20 70 57 69 6e 2d 3e 63  NMAX) && pWin->c
c140: 73 72 41 70 70 20 29 7b 0a 20 20 20 20 20 20 61  srApp ){.      a
c150: 73 73 65 72 74 28 20 70 57 69 6e 2d 3e 65 53 74  ssert( pWin->eSt
c160: 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  art!=TK_UNBOUNDE
c170: 44 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  D );.      sqlit
c180: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
c190: 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20  OP_ResetSorter, 
c1a0: 70 57 69 6e 2d 3e 63 73 72 41 70 70 29 3b 0a 20  pWin->csrApp);. 
c1b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c1c0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
c1d0: 65 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d 3e 72  eger, 0, pWin->r
c1e0: 65 67 41 70 70 2b 31 29 3b 0a 20 20 20 20 7d 0a  egApp+1);.    }.
c1f0: 20 20 7d 0a 20 20 72 65 67 41 72 67 20 3d 20 70    }.  regArg = p
c200: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
c210: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
c220: 20 6e 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20   nArg;.  return 
c230: 72 65 67 41 72 67 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  regArg;.}.../*.*
c240: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
c250: 64 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 6f 66  does the work of
c260: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f   sqlite3WindowCo
c270: 64 65 53 74 65 70 28 29 20 66 6f 72 20 61 6c 6c  deStep() for all
c280: 20 22 52 4f 57 53 22 0a 2a 2a 20 77 69 6e 64 6f   "ROWS".** windo
c290: 77 20 66 72 61 6d 65 20 74 79 70 65 73 20 65 78  w frame types ex
c2a0: 63 65 70 74 20 66 6f 72 20 22 42 45 54 57 45 45  cept for "BETWEE
c2b0: 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43  N UNBOUNDED PREC
c2c0: 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e  EDING AND CURREN
c2d0: 54 0a 2a 2a 20 52 4f 57 22 2e 20 50 73 65 75 64  T.** ROW". Pseud
c2e0: 6f 2d 63 6f 64 65 20 66 6f 72 20 65 61 63 68 20  o-code for each 
c2f0: 66 6f 6c 6c 6f 77 73 2e 0a 2a 2a 0a 2a 2a 20 52  follows..**.** R
c300: 4f 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70  OWS BETWEEN <exp
c310: 72 31 3e 20 50 52 45 43 45 44 49 4e 47 20 41 4e  r1> PRECEDING AN
c320: 44 20 3c 65 78 70 72 32 3e 20 46 4f 4c 4c 4f 57  D <expr2> FOLLOW
c330: 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e  ING.**.**     ..
c340: 2e 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 6e  ..**       if( n
c350: 65 77 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a  ew partition ){.
c360: 2a 2a 20 20 20 20 20 20 20 20 20 47 6f 73 75 62  **         Gosub
c370: 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e   flush_partition
c380: 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  .**       }.**  
c390: 20 20 20 20 20 49 6e 73 65 72 74 20 28 72 65 63       Insert (rec
c3a0: 6f 72 64 20 69 6e 20 65 70 68 2d 74 61 62 6c 65  ord in eph-table
c3b0: 29 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ).**     sqlite3
c3c0: 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20  WhereEnd().**   
c3d0: 20 20 47 6f 73 75 62 20 66 6c 75 73 68 5f 70 61    Gosub flush_pa
c3e0: 72 74 69 74 69 6f 6e 0a 2a 2a 20 20 0a 2a 2a 20  rtition.**  .** 
c3f0: 20 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f    flush_partitio
c400: 6e 3a 0a 2a 2a 20 20 20 20 20 4f 6e 63 65 20 7b  n:.**     Once {
c410: 0a 2a 2a 20 20 20 20 20 20 20 4f 70 65 6e 44 75  .**       OpenDu
c420: 70 20 28 69 45 70 68 43 73 72 20 2d 3e 20 63 73  p (iEphCsr -> cs
c430: 72 53 74 61 72 74 29 0a 2a 2a 20 20 20 20 20 20  rStart).**      
c440: 20 4f 70 65 6e 44 75 70 20 28 69 45 70 68 43 73   OpenDup (iEphCs
c450: 72 20 2d 3e 20 63 73 72 45 6e 64 29 0a 2a 2a 20  r -> csrEnd).** 
c460: 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 72 65 67      }.**     reg
c470: 53 74 61 72 74 20 3d 20 3c 65 78 70 72 31 3e 20  Start = <expr1> 
c480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c490: 2f 20 50 52 45 43 45 44 49 4e 47 20 65 78 70 72  / PRECEDING expr
c4a0: 65 73 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 72 65  ession.**     re
c4b0: 67 45 6e 64 20 3d 20 3c 65 78 70 72 32 3e 20 20  gEnd = <expr2>  
c4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4d0: 2f 2f 20 46 4f 4c 4c 4f 57 49 4e 47 20 65 78 70  // FOLLOWING exp
c4e0: 72 65 73 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 69  ression.**     i
c4f0: 66 28 20 72 65 67 53 74 61 72 74 3c 30 20 7c 7c  f( regStart<0 ||
c500: 20 72 65 67 45 6e 64 3c 30 20 29 7b 20 65 72 72   regEnd<0 ){ err
c510: 6f 72 21 20 7d 0a 2a 2a 20 20 20 20 20 52 65 77  or! }.**     Rew
c520: 69 6e 64 20 28 63 73 72 2c 63 73 72 53 74 61 72  ind (csr,csrStar
c530: 74 2c 63 73 72 45 6e 64 29 20 20 20 20 20 20 2f  t,csrEnd)      /
c540: 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c  / if EOF goto fl
c550: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f  ush_partition_do
c560: 6e 65 0a 2a 2a 20 20 20 20 20 20 20 4e 65 78 74  ne.**       Next
c570: 28 63 73 72 45 6e 64 29 20 20 20 20 20 20 20 20  (csrEnd)        
c580: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 69              // i
c590: 66 20 45 4f 46 20 73 6b 69 70 20 41 67 67 73 74  f EOF skip Aggst
c5a0: 65 70 0a 2a 2a 20 20 20 20 20 20 20 41 67 67 73  ep.**       Aggs
c5b0: 74 65 70 20 28 63 73 72 45 6e 64 29 0a 2a 2a 20  tep (csrEnd).** 
c5c0: 20 20 20 20 20 20 69 66 28 20 28 72 65 67 45 6e        if( (regEn
c5d0: 64 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20  d--)<=0 ){.**   
c5e0: 20 20 20 20 20 20 41 67 67 46 69 6e 61 6c 20 28        AggFinal (
c5f0: 78 56 61 6c 75 65 29 0a 2a 2a 20 20 20 20 20 20  xValue).**      
c600: 20 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73     Gosub addrGos
c610: 75 62 0a 2a 2a 20 20 20 20 20 20 20 20 20 4e 65  ub.**         Ne
c620: 78 74 28 63 73 72 29 20 20 20 20 20 20 20 20 20  xt(csr)         
c630: 20 20 20 20 20 20 20 2f 2f 20 69 66 20 45 4f 46         // if EOF
c640: 20 67 6f 74 6f 20 66 6c 75 73 68 5f 70 61 72 74   goto flush_part
c650: 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20  ition_done.**   
c660: 20 20 20 20 20 20 69 66 28 20 28 72 65 67 53 74        if( (regSt
c670: 61 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20  art--)<=0 ){.** 
c680: 20 20 20 20 20 20 20 20 20 20 41 67 67 49 6e 76            AggInv
c690: 65 72 73 65 20 28 63 73 72 53 74 61 72 74 29 0a  erse (csrStart).
c6a0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 4e 65 78  **           Nex
c6b0: 74 28 63 73 72 53 74 61 72 74 29 0a 2a 2a 20 20  t(csrStart).**  
c6c0: 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
c6d0: 20 20 7d 0a 2a 2a 20 20 20 66 6c 75 73 68 5f 70    }.**   flush_p
c6e0: 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 3a 0a 2a  artition_done:.*
c6f0: 2a 20 20 20 20 20 52 65 73 65 74 53 6f 72 74 65  *     ResetSorte
c700: 72 20 28 63 73 72 29 0a 2a 2a 20 20 20 20 20 52  r (csr).**     R
c710: 65 74 75 72 6e 0a 2a 2a 0a 2a 2a 20 52 4f 57 53  eturn.**.** ROWS
c720: 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 3e 20   BETWEEN <expr> 
c730: 50 52 45 43 45 44 49 4e 47 20 20 20 20 41 4e 44  PRECEDING    AND
c740: 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a 20   CURRENT ROW.** 
c750: 52 4f 57 53 20 42 45 54 57 45 45 4e 20 43 55 52  ROWS BETWEEN CUR
c760: 52 45 4e 54 20 52 4f 57 20 20 20 20 20 20 20 20  RENT ROW        
c770: 20 41 4e 44 20 3c 65 78 70 72 3e 20 46 4f 4c 4c   AND <expr> FOLL
c780: 4f 57 49 4e 47 0a 2a 2a 20 52 4f 57 53 20 42 45  OWING.** ROWS BE
c790: 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20  TWEEN UNBOUNDED 
c7a0: 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 3c 65  PRECEDING AND <e
c7b0: 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a  xpr> FOLLOWING.*
c7c0: 2a 0a 2a 2a 20 20 20 54 68 65 73 65 20 61 72 65  *.**   These are
c7d0: 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 20   similar to the 
c7e0: 61 62 6f 76 65 2e 20 46 6f 72 20 22 43 55 52 52  above. For "CURR
c7f0: 45 4e 54 20 52 4f 57 22 2c 20 69 6e 74 69 61 6c  ENT ROW", intial
c800: 69 7a 65 20 74 68 65 0a 2a 2a 20 20 20 72 65 67  ize the.**   reg
c810: 69 73 74 65 72 20 74 6f 20 30 2e 20 46 6f 72 20  ister to 0. For 
c820: 22 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45  "UNBOUNDED PRECE
c830: 44 49 4e 47 22 20 74 6f 20 69 6e 66 69 6e 69 74  DING" to infinit
c840: 79 2e 0a 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42 45  y..**.** ROWS BE
c850: 54 57 45 45 4e 20 3c 65 78 70 72 3e 20 50 52 45  TWEEN <expr> PRE
c860: 43 45 44 49 4e 47 20 20 20 20 41 4e 44 20 55 4e  CEDING    AND UN
c870: 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e  BOUNDED FOLLOWIN
c880: 47 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57 45 45  G.** ROWS BETWEE
c890: 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20 20 20  N CURRENT ROW   
c8a0: 20 20 20 20 20 20 41 4e 44 20 55 4e 42 4f 55 4e        AND UNBOUN
c8b0: 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a  DED FOLLOWING.**
c8c0: 0a 2a 2a 20 20 20 20 20 52 65 77 69 6e 64 20 28  .**     Rewind (
c8d0: 63 73 72 2c 63 73 72 53 74 61 72 74 2c 63 73 72  csr,csrStart,csr
c8e0: 45 6e 64 29 20 20 20 20 2f 2f 20 69 66 20 45 4f  End)    // if EO
c8f0: 46 20 67 6f 74 6f 20 66 6c 75 73 68 5f 70 61 72  F goto flush_par
c900: 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20  tition_done.**  
c910: 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 2a     while( 1 ){.*
c920: 2a 20 20 20 20 20 20 20 4e 65 78 74 28 63 73 72  *       Next(csr
c930: 45 6e 64 29 20 20 20 20 20 20 20 20 20 20 20 20  End)            
c940: 20 20 20 20 20 20 2f 2f 20 45 78 69 74 20 77 68        // Exit wh
c950: 69 6c 65 28 31 29 20 61 74 20 45 4f 46 0a 2a 2a  ile(1) at EOF.**
c960: 20 20 20 20 20 20 20 41 67 67 73 74 65 70 20 28         Aggstep (
c970: 63 73 72 45 6e 64 29 0a 2a 2a 20 20 20 20 20 7d  csrEnd).**     }
c980: 0a 2a 2a 20 20 20 20 20 77 68 69 6c 65 28 20 31  .**     while( 1
c990: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67 67   ){.**       Agg
c9a0: 46 69 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a  Final (xValue).*
c9b0: 2a 20 20 20 20 20 20 20 47 6f 73 75 62 20 61 64  *       Gosub ad
c9c0: 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20  drGosub.**      
c9d0: 20 4e 65 78 74 28 63 73 72 29 20 20 20 20 20 20   Next(csr)      
c9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c9f0: 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c  / if EOF goto fl
ca00: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f  ush_partition_do
ca10: 6e 65 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20  ne.**       if( 
ca20: 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20  (regStart--)<=0 
ca30: 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 67  ){.**         Ag
ca40: 67 49 6e 76 65 72 73 65 20 28 63 73 72 53 74 61  gInverse (csrSta
ca50: 72 74 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 4e  rt).**         N
ca60: 65 78 74 28 63 73 72 53 74 61 72 74 29 0a 2a 2a  ext(csrStart).**
ca70: 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
ca80: 7d 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 74 68  }.**.**   For th
ca90: 65 20 22 43 55 52 52 45 4e 54 20 52 4f 57 20 41  e "CURRENT ROW A
caa0: 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c  ND UNBOUNDED FOL
cab0: 4c 4f 57 49 4e 47 22 20 63 61 73 65 2c 20 74 68  LOWING" case, th
cac0: 65 20 66 69 6e 61 6c 20 69 66 28 29 20 0a 2a 2a  e final if() .**
cad0: 20 20 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20     condition is 
cae0: 61 6c 77 61 79 73 20 74 72 75 65 20 28 61 73 20  always true (as 
caf0: 69 66 20 72 65 67 53 74 61 72 74 20 77 65 72 65  if regStart were
cb00: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
cb10: 30 29 2e 0a 2a 2a 0a 2a 2a 20 52 41 4e 47 45 20  0)..**.** RANGE 
cb20: 42 45 54 57 45 45 4e 20 43 55 52 52 45 4e 54 20  BETWEEN CURRENT 
cb30: 52 4f 57 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45  ROW AND UNBOUNDE
cb40: 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 20 0a  D FOLLOWING.** .
cb50: 2a 2a 20 20 20 54 68 69 73 20 69 73 20 74 68 65  **   This is the
cb60: 20 6f 6e 6c 79 20 52 41 4e 47 45 20 63 61 73 65   only RANGE case
cb70: 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68 69 73   handled by this
cb80: 20 72 6f 75 74 69 6e 65 2e 20 49 74 20 6d 6f 64   routine. It mod
cb90: 69 66 69 65 73 20 74 68 65 0a 2a 2a 20 20 20 73  ifies the.**   s
cba0: 65 63 6f 6e 64 20 77 68 69 6c 65 28 20 31 20 29  econd while( 1 )
cbb0: 20 6c 6f 6f 70 20 69 6e 20 22 52 4f 57 53 20 42   loop in "ROWS B
cbc0: 45 54 57 45 45 4e 20 43 55 52 52 45 4e 54 20 2e  ETWEEN CURRENT .
cbd0: 2e 2e 20 55 4e 42 4f 55 4e 44 45 44 2e 2e 2e 22  .. UNBOUNDED..."
cbe0: 20 74 6f 0a 2a 2a 20 20 20 62 65 3a 0a 2a 2a 0a   to.**   be:.**.
cbf0: 2a 2a 20 20 20 20 20 77 68 69 6c 65 28 20 31 20  **     while( 1 
cc00: 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67 67 46  ){.**       AggF
cc10: 69 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a  inal (xValue).**
cc20: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 31 20         while( 1 
cc30: 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 72 65  ){.**         re
cc40: 67 50 65 65 72 2b 2b 0a 2a 2a 20 20 20 20 20 20  gPeer++.**      
cc50: 20 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73     Gosub addrGos
cc60: 75 62 0a 2a 2a 20 20 20 20 20 20 20 20 20 4e 65  ub.**         Ne
cc70: 78 74 28 63 73 72 29 20 20 20 20 20 20 20 20 20  xt(csr)         
cc80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 69              // i
cc90: 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68  f EOF goto flush
cca0: 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a  _partition_done.
ccb0: 2a 2a 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  **         if( n
ccc0: 65 77 20 70 65 65 72 20 29 20 62 72 65 61 6b 3b  ew peer ) break;
ccd0: 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  .**       }.**  
cce0: 20 20 20 20 20 77 68 69 6c 65 28 20 28 72 65 67       while( (reg
ccf0: 50 65 65 72 2d 2d 29 3e 30 20 29 7b 0a 2a 2a 20  Peer--)>0 ){.** 
cd00: 20 20 20 20 20 20 20 20 41 67 67 49 6e 76 65 72          AggInver
cd10: 73 65 20 28 63 73 72 53 74 61 72 74 29 0a 2a 2a  se (csrStart).**
cd20: 20 20 20 20 20 20 20 20 20 4e 65 78 74 28 63 73           Next(cs
cd30: 72 53 74 61 72 74 29 0a 2a 2a 20 20 20 20 20 20  rStart).**      
cd40: 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a   }.**     }.**.*
cd50: 2a 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20 3c  * ROWS BETWEEN <
cd60: 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20  expr> FOLLOWING 
cd70: 20 20 20 41 4e 44 20 3c 65 78 70 72 3e 20 46 4f     AND <expr> FO
cd80: 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20  LLOWING.**.**   
cd90: 72 65 67 45 6e 64 20 3d 20 72 65 67 45 6e 64 20  regEnd = regEnd 
cda0: 2d 20 72 65 67 53 74 61 72 74 0a 2a 2a 20 20 20  - regStart.**   
cdb0: 52 65 77 69 6e 64 20 28 63 73 72 2c 63 73 72 53  Rewind (csr,csrS
cdc0: 74 61 72 74 2c 63 73 72 45 6e 64 29 20 20 20 2f  tart,csrEnd)   /
cdd0: 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c  / if EOF goto fl
cde0: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f  ush_partition_do
cdf0: 6e 65 0a 2a 2a 20 20 20 20 20 41 67 67 73 74 65  ne.**     Aggste
ce00: 70 20 28 63 73 72 45 6e 64 29 0a 2a 2a 20 20 20  p (csrEnd).**   
ce10: 20 20 4e 65 78 74 28 63 73 72 45 6e 64 29 20 20    Next(csrEnd)  
ce20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ce30: 2f 20 69 66 20 45 4f 46 20 66 61 6c 6c 2d 74 68  / if EOF fall-th
ce40: 72 6f 75 67 68 0a 2a 2a 20 20 20 20 20 69 66 28  rough.**     if(
ce50: 20 28 72 65 67 45 6e 64 2d 2d 29 3c 3d 30 20 29   (regEnd--)<=0 )
ce60: 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 28  {.**       if( (
ce70: 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20 29  regStart--)<=0 )
ce80: 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 67 67  {.**         Agg
ce90: 46 69 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a  Final (xValue).*
cea0: 2a 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20  *         Gosub 
ceb0: 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20  addrGosub.**    
cec0: 20 20 20 20 20 4e 65 78 74 28 63 73 72 29 20 20       Next(csr)  
ced0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 69              // i
cee0: 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68  f EOF goto flush
cef0: 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a  _partition_done.
cf00: 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20  **       }.**   
cf10: 20 20 20 20 41 67 67 49 6e 76 65 72 73 65 20 28      AggInverse (
cf20: 63 73 72 53 74 61 72 74 29 0a 2a 2a 20 20 20 20  csrStart).**    
cf30: 20 20 20 4e 65 78 74 20 28 63 73 72 53 74 61 72     Next (csrStar
cf40: 74 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a  t).**     }.**.*
cf50: 2a 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20 3c  * ROWS BETWEEN <
cf60: 65 78 70 72 3e 20 50 52 45 43 45 44 49 4e 47 20  expr> PRECEDING 
cf70: 20 20 20 41 4e 44 20 3c 65 78 70 72 3e 20 50 52     AND <expr> PR
cf80: 45 43 45 44 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20  ECEDING.**.**   
cf90: 52 65 70 6c 61 63 65 20 74 68 65 20 62 69 74 20  Replace the bit 
cfa0: 61 66 74 65 72 20 22 52 65 77 69 6e 64 22 20 69  after "Rewind" i
cfb0: 6e 20 74 68 65 20 61 62 6f 76 65 20 77 69 74 68  n the above with
cfc0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 69 66 28 20  :.**.**     if( 
cfd0: 28 72 65 67 45 6e 64 2d 2d 29 3c 3d 30 20 29 7b  (regEnd--)<=0 ){
cfe0: 0a 2a 2a 20 20 20 20 20 20 20 41 67 67 53 74 65  .**       AggSte
cff0: 70 20 28 63 73 72 45 6e 64 29 0a 2a 2a 20 20 20  p (csrEnd).**   
d000: 20 20 20 20 4e 65 78 74 20 28 63 73 72 45 6e 64      Next (csrEnd
d010: 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20  ).**     }.**   
d020: 20 20 41 67 67 46 69 6e 61 6c 20 28 78 56 61 6c    AggFinal (xVal
d030: 75 65 29 0a 2a 2a 20 20 20 20 20 47 6f 73 75 62  ue).**     Gosub
d040: 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20   addrGosub.**   
d050: 20 20 4e 65 78 74 28 63 73 72 29 20 20 20 20 20    Next(csr)     
d060: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
d070: 69 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c 75 73  if EOF goto flus
d080: 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65  h_partition_done
d090: 0a 2a 2a 20 20 20 20 20 69 66 28 20 28 72 65 67  .**     if( (reg
d0a0: 53 74 61 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a  Start--)<=0 ){.*
d0b0: 2a 20 20 20 20 20 20 20 41 67 67 49 6e 76 65 72  *       AggInver
d0c0: 73 65 20 28 63 73 72 32 29 0a 2a 2a 20 20 20 20  se (csr2).**    
d0d0: 20 20 20 4e 65 78 74 20 28 63 73 72 32 29 0a 2a     Next (csr2).*
d0e0: 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2f 0a 73 74  *     }.**.*/.st
d0f0: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77  atic void window
d100: 43 6f 64 65 52 6f 77 45 78 70 72 53 74 65 70 28  CodeRowExprStep(
d110: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
d120: 2c 20 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 0a  , .  Select *p,.
d130: 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
d140: 6e 66 6f 2c 0a 20 20 69 6e 74 20 72 65 67 47 6f  nfo,.  int regGo
d150: 73 75 62 2c 20 0a 20 20 69 6e 74 20 61 64 64 72  sub, .  int addr
d160: 47 6f 73 75 62 0a 29 7b 0a 20 20 57 69 6e 64 6f  Gosub.){.  Windo
d170: 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57  w *pMWin = p->pW
d180: 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  in;.  Vdbe *v = 
d190: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
d1a0: 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 65  Parse);.  int re
d1b0: 67 46 6c 75 73 68 50 61 72 74 3b 20 20 20 20 20  gFlushPart;     
d1c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
d1d0: 69 73 74 65 72 20 66 6f 72 20 22 47 6f 73 75 62  ister for "Gosub
d1e0: 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e   flush_partition
d1f0: 22 20 2a 2f 0a 20 20 69 6e 74 20 6c 62 6c 46 6c  " */.  int lblFl
d200: 75 73 68 50 61 72 74 3b 20 20 20 20 20 20 20 20  ushPart;        
d210: 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
d220: 66 6f 72 20 22 47 6f 73 75 62 20 66 6c 75 73 68  for "Gosub flush
d230: 5f 70 61 72 74 69 74 69 6f 6e 22 20 2a 2f 0a 20  _partition" */. 
d240: 20 69 6e 74 20 6c 62 6c 46 6c 75 73 68 44 6f 6e   int lblFlushDon
d250: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
d260: 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 22 47   /* Label for "G
d270: 6f 73 75 62 20 66 6c 75 73 68 5f 70 61 72 74 69  osub flush_parti
d280: 74 69 6f 6e 5f 64 6f 6e 65 22 20 2a 2f 0a 0a 20  tion_done" */.. 
d290: 20 69 6e 74 20 72 65 67 41 72 67 3b 0a 20 20 69   int regArg;.  i
d2a0: 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20 63  nt addr;.  int c
d2b0: 73 72 53 74 61 72 74 20 3d 20 70 50 61 72 73 65  srStart = pParse
d2c0: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 6e 74 20  ->nTab++;.  int 
d2d0: 63 73 72 45 6e 64 20 3d 20 70 50 61 72 73 65 2d  csrEnd = pParse-
d2e0: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 6e 74 20 72  >nTab++;.  int r
d2f0: 65 67 53 74 61 72 74 3b 20 20 20 20 20 20 20 20  egStart;        
d300: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
d310: 61 6c 75 65 20 6f 66 20 3c 65 78 70 72 3e 20 50  alue of <expr> P
d320: 52 45 43 45 44 49 4e 47 20 2a 2f 0a 20 20 69 6e  RECEDING */.  in
d330: 74 20 72 65 67 45 6e 64 3b 20 20 20 20 20 20 20  t regEnd;       
d340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d350: 2a 20 56 61 6c 75 65 20 6f 66 20 3c 65 78 70 72  * Value of <expr
d360: 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 2a 2f 0a 20  > FOLLOWING */. 
d370: 20 69 6e 74 20 61 64 64 72 47 6f 74 6f 3b 0a 20   int addrGoto;. 
d380: 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 0a 20 20   int addrTop;.  
d390: 69 6e 74 20 61 64 64 72 49 66 50 6f 73 31 20 3d  int addrIfPos1 =
d3a0: 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72 49 66   0;.  int addrIf
d3b0: 50 6f 73 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Pos2 = 0;.  int 
d3c0: 72 65 67 53 69 7a 65 20 3d 20 30 3b 0a 0a 20 20  regSize = 0;..  
d3d0: 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65  assert( pMWin->e
d3e0: 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44  Start==TK_PRECED
d3f0: 49 4e 47 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  ING .       || p
d400: 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
d410: 5f 43 55 52 52 45 4e 54 20 0a 20 20 20 20 20 20  _CURRENT .      
d420: 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72   || pMWin->eStar
d430: 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  t==TK_FOLLOWING 
d440: 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e  .       || pMWin
d450: 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42  ->eStart==TK_UNB
d460: 4f 55 4e 44 45 44 20 0a 20 20 29 3b 0a 20 20 61  OUNDED .  );.  a
d470: 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 45  ssert( pMWin->eE
d480: 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  nd==TK_FOLLOWING
d490: 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69   .       || pMWi
d4a0: 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52  n->eEnd==TK_CURR
d4b0: 45 4e 54 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  ENT .       || p
d4c0: 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55  MWin->eEnd==TK_U
d4d0: 4e 42 4f 55 4e 44 45 44 20 0a 20 20 20 20 20 20  NBOUNDED .      
d4e0: 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d   || pMWin->eEnd=
d4f0: 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 0a 20  =TK_PRECEDING . 
d500: 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   );..  /* Alloca
d510: 74 65 20 72 65 67 69 73 74 65 72 20 61 6e 64 20  te register and 
d520: 6c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 22 66  label for the "f
d530: 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 20  lush_partition" 
d540: 73 75 62 2d 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a  sub-routine. */.
d550: 20 20 72 65 67 46 6c 75 73 68 50 61 72 74 20 3d    regFlushPart =
d560: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
d570: 0a 20 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 20  .  lblFlushPart 
d580: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
d590: 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
d5a0: 20 20 6c 62 6c 46 6c 75 73 68 44 6f 6e 65 20 3d    lblFlushDone =
d5b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
d5c0: 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a  Label(pParse);..
d5d0: 20 20 72 65 67 53 74 61 72 74 20 3d 20 2b 2b 70    regStart = ++p
d5e0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
d5f0: 65 67 45 6e 64 20 3d 20 2b 2b 70 50 61 72 73 65  egEnd = ++pParse
d600: 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 77 69 6e 64 6f  ->nMem;..  windo
d610: 77 50 61 72 74 69 74 69 6f 6e 43 61 63 68 65 28  wPartitionCache(
d620: 70 50 61 72 73 65 2c 20 70 2c 20 70 57 49 6e 66  pParse, p, pWInf
d630: 6f 2c 20 72 65 67 46 6c 75 73 68 50 61 72 74 2c  o, regFlushPart,
d640: 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 2c 20 26   lblFlushPart, &
d650: 72 65 67 53 69 7a 65 29 3b 0a 0a 20 20 61 64 64  regSize);..  add
d660: 72 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33 56  rGoto = sqlite3V
d670: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
d680: 47 6f 74 6f 29 3b 0a 0a 20 20 2f 2a 20 53 74 61  Goto);..  /* Sta
d690: 72 74 20 6f 66 20 22 66 6c 75 73 68 5f 70 61 72  rt of "flush_par
d6a0: 74 69 74 69 6f 6e 22 20 2a 2f 0a 20 20 73 71 6c  tition" */.  sql
d6b0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
d6c0: 61 62 65 6c 28 76 2c 20 6c 62 6c 46 6c 75 73 68  abel(v, lblFlush
d6d0: 50 61 72 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  Part);.  sqlite3
d6e0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
d6f0: 5f 4f 6e 63 65 2c 20 30 2c 20 73 71 6c 69 74 65  _Once, 0, sqlite
d700: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
d710: 28 76 29 2b 33 29 3b 0a 20 20 56 64 62 65 43 6f  (v)+3);.  VdbeCo
d720: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 56 64 62  verage(v);.  Vdb
d730: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 46 6c  eComment((v, "Fl
d740: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 20 73 75  ush_partition su
d750: 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 73  broutine"));.  s
d760: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d770: 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20  (v, OP_OpenDup, 
d780: 63 73 72 53 74 61 72 74 2c 20 70 4d 57 69 6e 2d  csrStart, pMWin-
d790: 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 73 71 6c  >iEphCsr);.  sql
d7a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
d7b0: 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 63 73  , OP_OpenDup, cs
d7c0: 72 45 6e 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  rEnd, pMWin->iEp
d7d0: 68 43 73 72 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  hCsr);..  /* If 
d7e0: 65 69 74 68 65 72 20 72 65 67 53 74 61 72 74 20  either regStart 
d7f0: 6f 72 20 72 65 67 45 6e 64 20 61 72 65 20 6e 6f  or regEnd are no
d800: 74 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69  t non-negative i
d810: 6e 74 65 67 65 72 73 2c 20 74 68 72 6f 77 20 0a  ntegers, throw .
d820: 20 20 2a 2a 20 61 6e 20 65 78 63 65 70 74 69 6f    ** an exceptio
d830: 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57  n.  */.  if( pMW
d840: 69 6e 2d 3e 70 53 74 61 72 74 20 29 7b 0a 20 20  in->pStart ){.  
d850: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
d860: 65 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2d  e(pParse, pMWin-
d870: 3e 70 53 74 61 72 74 2c 20 72 65 67 53 74 61 72  >pStart, regStar
d880: 74 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43 68  t);.    windowCh
d890: 65 63 6b 49 6e 74 56 61 6c 75 65 28 70 50 61 72  eckIntValue(pPar
d8a0: 73 65 2c 20 72 65 67 53 74 61 72 74 2c 20 30 29  se, regStart, 0)
d8b0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d 57 69  ;.  }.  if( pMWi
d8c0: 6e 2d 3e 70 45 6e 64 20 29 7b 0a 20 20 20 20 73  n->pEnd ){.    s
d8d0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
d8e0: 50 61 72 73 65 2c 20 70 4d 57 69 6e 2d 3e 70 45  Parse, pMWin->pE
d8f0: 6e 64 2c 20 72 65 67 45 6e 64 29 3b 0a 20 20 20  nd, regEnd);.   
d900: 20 77 69 6e 64 6f 77 43 68 65 63 6b 49 6e 74 56   windowCheckIntV
d910: 61 6c 75 65 28 70 50 61 72 73 65 2c 20 72 65 67  alue(pParse, reg
d920: 45 6e 64 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20  End, 1);.  }..  
d930: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 22 52  /* If this is "R
d940: 4f 57 53 20 3c 65 78 70 72 31 3e 20 46 4f 4c 4c  OWS <expr1> FOLL
d950: 4f 57 49 4e 47 20 41 4e 44 20 52 4f 57 53 20 3c  OWING AND ROWS <
d960: 65 78 70 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47  expr2> FOLLOWING
d970: 22 2c 20 64 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ", do:.  **.  **
d980: 20 20 20 69 66 28 20 72 65 67 45 6e 64 3c 72 65     if( regEnd<re
d990: 67 53 74 61 72 74 20 29 7b 0a 20 20 2a 2a 20 20  gStart ){.  **  
d9a0: 20 20 20 2f 2f 20 54 68 65 20 66 72 61 6d 65 20     // The frame 
d9b0: 61 6c 77 61 79 73 20 63 6f 6e 73 69 73 74 73 20  always consists 
d9c0: 6f 66 20 30 20 72 6f 77 73 0a 20 20 2a 2a 20 20  of 0 rows.  **  
d9d0: 20 20 20 72 65 67 53 74 61 72 74 20 3d 20 72 65     regStart = re
d9e0: 67 53 69 7a 65 3b 0a 20 20 2a 2a 20 20 20 7d 0a  gSize;.  **   }.
d9f0: 20 20 2a 2a 20 20 20 72 65 67 45 6e 64 20 3d 20    **   regEnd = 
da00: 72 65 67 45 6e 64 20 2d 20 72 65 67 53 74 61 72  regEnd - regStar
da10: 74 3b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4d  t;.  */.  if( pM
da20: 57 69 6e 2d 3e 70 45 6e 64 20 26 26 20 70 4d 57  Win->pEnd && pMW
da30: 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46  in->eStart==TK_F
da40: 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20  OLLOWING ){.    
da50: 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 70  assert( pMWin->p
da60: 53 74 61 72 74 21 3d 30 20 29 3b 0a 20 20 20 20  Start!=0 );.    
da70: 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65  assert( pMWin->e
da80: 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e  End==TK_FOLLOWIN
da90: 47 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  G );.    sqlite3
daa0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
dab0: 5f 47 65 2c 20 72 65 67 53 74 61 72 74 2c 20 73  _Ge, regStart, s
dac0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
dad0: 74 41 64 64 72 28 76 29 2b 32 2c 20 72 65 67 45  tAddr(v)+2, regE
dae0: 6e 64 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  nd);.    VdbeCov
daf0: 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c 28 76  erageNeverNull(v
db00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
db10: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
db20: 6f 70 79 2c 20 72 65 67 53 69 7a 65 2c 20 72 65  opy, regSize, re
db30: 67 53 74 61 72 74 29 3b 0a 20 20 20 20 73 71 6c  gStart);.    sql
db40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
db50: 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72  , OP_Subtract, r
db60: 65 67 53 74 61 72 74 2c 20 72 65 67 45 6e 64 2c  egStart, regEnd,
db70: 20 72 65 67 45 6e 64 29 3b 0a 20 20 7d 0a 0a 20   regEnd);.  }.. 
db80: 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70 53 74 61   if( pMWin->pSta
db90: 72 74 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e  rt && pMWin->eEn
dba0: 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20  d==TK_PRECEDING 
dbb0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
dbc0: 4d 57 69 6e 2d 3e 70 45 6e 64 21 3d 30 20 29 3b  MWin->pEnd!=0 );
dbd0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 57  .    assert( pMW
dbe0: 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 50  in->eStart==TK_P
dbf0: 52 45 43 45 44 49 4e 47 20 29 3b 0a 20 20 20 20  RECEDING );.    
dc00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dc10: 33 28 76 2c 20 4f 50 5f 4c 65 2c 20 72 65 67 53  3(v, OP_Le, regS
dc20: 74 61 72 74 2c 20 73 71 6c 69 74 65 33 56 64 62  tart, sqlite3Vdb
dc30: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
dc40: 33 2c 20 72 65 67 45 6e 64 29 3b 0a 20 20 20 20  3, regEnd);.    
dc50: 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65  VdbeCoverageNeve
dc60: 72 4e 75 6c 6c 28 76 29 3b 0a 20 20 20 20 73 71  rNull(v);.    sq
dc70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
dc80: 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 53  v, OP_Copy, regS
dc90: 69 7a 65 2c 20 72 65 67 53 74 61 72 74 29 3b 0a  ize, regStart);.
dca0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
dcb0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp2(v, OP_Copy
dcc0: 2c 20 72 65 67 53 69 7a 65 2c 20 72 65 67 45 6e  , regSize, regEn
dcd0: 64 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e  d);.  }..  /* In
dce0: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61 63 63  itialize the acc
dcf0: 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65  umulator registe
dd00: 72 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f  r for each windo
dd10: 77 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 4e 55  w function to NU
dd20: 4c 4c 20 2a 2f 0a 20 20 72 65 67 41 72 67 20 3d  LL */.  regArg =
dd30: 20 77 69 6e 64 6f 77 49 6e 69 74 41 63 63 75 6d   windowInitAccum
dd40: 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 29 3b  (pParse, pMWin);
dd50: 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ..  sqlite3VdbeA
dd60: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
dd70: 6e 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43  nd, pMWin->iEphC
dd80: 73 72 2c 20 6c 62 6c 46 6c 75 73 68 44 6f 6e 65  sr, lblFlushDone
dd90: 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67  );.  VdbeCoverag
dda0: 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
ddb0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
ddc0: 52 65 77 69 6e 64 2c 20 63 73 72 53 74 61 72 74  Rewind, csrStart
ddd0: 2c 20 6c 62 6c 46 6c 75 73 68 44 6f 6e 65 29 3b  , lblFlushDone);
dde0: 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e  .  VdbeCoverageN
ddf0: 65 76 65 72 54 61 6b 65 6e 28 76 29 3b 0a 20 20  everTaken(v);.  
de00: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
de10: 65 50 35 28 76 2c 20 31 29 3b 0a 20 20 73 71 6c  eP5(v, 1);.  sql
de20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
de30: 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 63 73 72  , OP_Rewind, csr
de40: 45 6e 64 2c 20 6c 62 6c 46 6c 75 73 68 44 6f 6e  End, lblFlushDon
de50: 65 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61  e);.  VdbeCovera
de60: 67 65 4e 65 76 65 72 54 61 6b 65 6e 28 76 29 3b  geNeverTaken(v);
de70: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
de80: 61 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a 0a 20  angeP5(v, 1);.. 
de90: 20 2f 2a 20 49 6e 76 6f 6b 65 20 41 67 67 53 74   /* Invoke AggSt
dea0: 65 70 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  ep function for 
deb0: 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63  each window func
dec0: 74 69 6f 6e 20 75 73 69 6e 67 20 74 68 65 20 72  tion using the r
ded0: 6f 77 20 74 68 61 74 0a 20 20 2a 2a 20 63 73 72  ow that.  ** csr
dee0: 45 6e 64 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  End currently po
def0: 69 6e 74 73 20 74 6f 2e 20 4f 72 2c 20 69 66 20  ints to. Or, if 
df00: 63 73 72 45 6e 64 20 69 73 20 61 6c 72 65 61 64  csrEnd is alread
df10: 79 20 61 74 20 45 4f 46 2c 0a 20 20 2a 2a 20 64  y at EOF,.  ** d
df20: 6f 20 6e 6f 74 68 69 6e 67 2e 20 20 2a 2f 0a 20  o nothing.  */. 
df30: 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
df40: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
df50: 72 28 76 29 3b 0a 20 20 69 66 28 20 70 4d 57 69  r(v);.  if( pMWi
df60: 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43  n->eEnd==TK_PREC
df70: 45 44 49 4e 47 20 29 7b 0a 20 20 20 20 61 64 64  EDING ){.    add
df80: 72 49 66 50 6f 73 31 20 3d 20 73 71 6c 69 74 65  rIfPos1 = sqlite
df90: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
dfa0: 50 5f 49 66 50 6f 73 2c 20 72 65 67 45 6e 64 2c  P_IfPos, regEnd,
dfb0: 20 30 20 2c 20 31 29 3b 0a 20 20 20 20 56 64 62   0 , 1);.    Vdb
dfc0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
dfd0: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
dfe0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
dff0: 2c 20 63 73 72 45 6e 64 2c 20 73 71 6c 69 74 65  , csrEnd, sqlite
e000: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
e010: 28 76 29 2b 32 29 3b 0a 20 20 56 64 62 65 43 6f  (v)+2);.  VdbeCo
e020: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 61 64 64  verage(v);.  add
e030: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
e040: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp0(v, OP_Goto
e050: 29 3b 0a 20 20 77 69 6e 64 6f 77 41 67 67 53 74  );.  windowAggSt
e060: 65 70 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  ep(pParse, pMWin
e070: 2c 20 63 73 72 45 6e 64 2c 20 30 2c 20 72 65 67  , csrEnd, 0, reg
e080: 41 72 67 2c 20 72 65 67 53 69 7a 65 29 3b 0a 20  Arg, regSize);. 
e090: 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64   if( pMWin->eEnd
e0a0: 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29  ==TK_UNBOUNDED )
e0b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
e0c0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
e0d0: 74 6f 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b  to, 0, addrTop);
e0e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
e0f0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
e100: 29 3b 0a 20 20 20 20 61 64 64 72 54 6f 70 20 3d  );.    addrTop =
e110: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
e120: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 7d 65  entAddr(v);.  }e
e130: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
e140: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
e150: 61 64 64 72 29 3b 0a 20 20 20 20 69 66 28 20 70  addr);.    if( p
e160: 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50  MWin->eEnd==TK_P
e170: 52 45 43 45 44 49 4e 47 20 29 7b 0a 20 20 20 20  RECEDING ){.    
e180: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
e190: 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 66 50  pHere(v, addrIfP
e1a0: 6f 73 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  os1);.    }.  }.
e1b0: 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45  .  if( pMWin->eE
e1c0: 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  nd==TK_FOLLOWING
e1d0: 20 29 7b 0a 20 20 20 20 61 64 64 72 49 66 50 6f   ){.    addrIfPo
e1e0: 73 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  s1 = sqlite3Vdbe
e1f0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50  AddOp3(v, OP_IfP
e200: 6f 73 2c 20 72 65 67 45 6e 64 2c 20 30 20 2c 20  os, regEnd, 0 , 
e210: 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  1);.    VdbeCove
e220: 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69  rage(v);.  }.  i
e230: 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  f( pMWin->eStart
e240: 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29  ==TK_FOLLOWING )
e250: 7b 0a 20 20 20 20 61 64 64 72 49 66 50 6f 73 32  {.    addrIfPos2
e260: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
e270: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp3(v, OP_IfPos
e280: 2c 20 72 65 67 53 74 61 72 74 2c 20 30 20 2c 20  , regStart, 0 , 
e290: 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  1);.    VdbeCove
e2a0: 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 77  rage(v);.  }.  w
e2b0: 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 70 50  indowAggFinal(pP
e2c0: 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 30 29 3b  arse, pMWin, 0);
e2d0: 0a 20 20 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f  .  windowReturnO
e2e0: 6e 65 52 6f 77 28 70 50 61 72 73 65 2c 20 70 4d  neRow(pParse, pM
e2f0: 57 69 6e 2c 20 72 65 67 47 6f 73 75 62 2c 20 61  Win, regGosub, a
e300: 64 64 72 47 6f 73 75 62 29 3b 0a 20 20 73 71 6c  ddrGosub);.  sql
e310: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
e320: 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4d 57 69 6e  , OP_Next, pMWin
e330: 2d 3e 69 45 70 68 43 73 72 2c 20 73 71 6c 69 74  ->iEphCsr, sqlit
e340: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
e350: 72 28 76 29 2b 32 29 3b 0a 20 20 56 64 62 65 43  r(v)+2);.  VdbeC
e360: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
e370: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
e380: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c  v, OP_Goto, 0, l
e390: 62 6c 46 6c 75 73 68 44 6f 6e 65 29 3b 0a 20 20  blFlushDone);.  
e3a0: 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72  if( pMWin->eStar
e3b0: 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  t==TK_FOLLOWING 
e3c0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
e3d0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
e3e0: 64 72 49 66 50 6f 73 32 29 3b 0a 20 20 7d 0a 0a  drIfPos2);.  }..
e3f0: 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74    if( pMWin->eSt
e400: 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20  art==TK_CURRENT 
e410: 0a 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53  .   || pMWin->eS
e420: 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49  tart==TK_PRECEDI
e430: 4e 47 20 0a 20 20 20 7c 7c 20 70 4d 57 69 6e 2d  NG .   || pMWin-
e440: 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c  >eStart==TK_FOLL
e450: 4f 57 49 4e 47 20 0a 20 20 29 7b 0a 20 20 20 20  OWING .  ){.    
e460: 69 6e 74 20 6c 62 6c 53 6b 69 70 49 6e 76 65 72  int lblSkipInver
e470: 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  se = sqlite3Vdbe
e480: 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65  MakeLabel(pParse
e490: 29 3b 3b 0a 20 20 20 20 69 66 28 20 70 4d 57 69  );;.    if( pMWi
e4a0: 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 50 52  n->eStart==TK_PR
e4b0: 45 43 45 44 49 4e 47 20 29 7b 0a 20 20 20 20 20  ECEDING ){.     
e4c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e4d0: 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p3(v, OP_IfPos, 
e4e0: 72 65 67 53 74 61 72 74 2c 20 6c 62 6c 53 6b 69  regStart, lblSki
e4f0: 70 49 6e 76 65 72 73 65 2c 20 31 29 3b 0a 20 20  pInverse, 1);.  
e500: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
e510: 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  (v);.    }.    i
e520: 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  f( pMWin->eStart
e530: 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29  ==TK_FOLLOWING )
e540: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
e550: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
e560: 4e 65 78 74 2c 20 63 73 72 53 74 61 72 74 2c 20  Next, csrStart, 
e570: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
e580: 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20  ntAddr(v)+2);.  
e590: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
e5a0: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
e5b0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
e5c0: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 62 6c 53  OP_Goto, 0, lblS
e5d0: 6b 69 70 49 6e 76 65 72 73 65 29 3b 0a 20 20 20  kipInverse);.   
e5e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
e5f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
e600: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 63 73 72 53  v, OP_Next, csrS
e610: 74 61 72 74 2c 20 73 71 6c 69 74 65 33 56 64 62  tart, sqlite3Vdb
e620: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
e630: 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  1);.      VdbeCo
e640: 76 65 72 61 67 65 41 6c 77 61 79 73 54 61 6b 65  verageAlwaysTake
e650: 6e 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n(v);.    }.    
e660: 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28 70 50  windowAggStep(pP
e670: 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 63 73 72  arse, pMWin, csr
e680: 53 74 61 72 74 2c 20 31 2c 20 72 65 67 41 72 67  Start, 1, regArg
e690: 2c 20 72 65 67 53 69 7a 65 29 3b 0a 20 20 20 20  , regSize);.    
e6a0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
e6b0: 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 53 6b  veLabel(v, lblSk
e6c0: 69 70 49 6e 76 65 72 73 65 29 3b 0a 20 20 7d 0a  ipInverse);.  }.
e6d0: 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e    if( pMWin->eEn
e6e0: 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  d==TK_FOLLOWING 
e6f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
e700: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
e710: 64 72 49 66 50 6f 73 31 29 3b 0a 20 20 7d 0a 20  drIfPos1);.  }. 
e720: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e730: 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
e740: 2c 20 61 64 64 72 54 6f 70 29 3b 0a 0a 20 20 2f  , addrTop);..  /
e750: 2a 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f  * flush_partitio
e760: 6e 5f 64 6f 6e 65 3a 20 2a 2f 0a 20 20 73 71 6c  n_done: */.  sql
e770: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
e780: 61 62 65 6c 28 76 2c 20 6c 62 6c 46 6c 75 73 68  abel(v, lblFlush
e790: 44 6f 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Done);.  sqlite3
e7a0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
e7b0: 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20 70 4d  _ResetSorter, pM
e7c0: 57 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20  Win->iEphCsr);. 
e7d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e7e0: 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
e7f0: 20 72 65 67 46 6c 75 73 68 50 61 72 74 29 3b 0a   regFlushPart);.
e800: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
e810: 2c 20 22 65 6e 64 20 66 6c 75 73 68 5f 70 61 72  , "end flush_par
e820: 74 69 74 69 6f 6e 20 73 75 62 72 6f 75 74 69 6e  tition subroutin
e830: 65 22 29 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  e"));..  /* Jump
e840: 20 74 6f 20 68 65 72 65 20 74 6f 20 73 6b 69 70   to here to skip
e850: 20 6f 76 65 72 20 66 6c 75 73 68 5f 70 61 72 74   over flush_part
e860: 69 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  ition */.  sqlit
e870: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
e880: 2c 20 61 64 64 72 47 6f 74 6f 29 3b 0a 7d 0a 0a  , addrGoto);.}..
e890: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
e8a0: 69 6f 6e 20 64 6f 65 73 20 74 68 65 20 77 6f 72  ion does the wor
e8b0: 6b 20 6f 66 20 73 71 6c 69 74 65 33 57 69 6e 64  k of sqlite3Wind
e8c0: 6f 77 43 6f 64 65 53 74 65 70 28 29 20 66 6f 72  owCodeStep() for
e8d0: 20 63 61 73 65 73 20 74 68 61 74 0a 2a 2a 20 77   cases that.** w
e8e0: 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65  ould normally be
e8f0: 20 68 61 6e 64 6c 65 64 20 62 79 20 77 69 6e 64   handled by wind
e900: 6f 77 43 6f 64 65 44 65 66 61 75 6c 74 53 74 65  owCodeDefaultSte
e910: 70 28 29 20 77 68 65 6e 20 74 68 65 72 65 20 61  p() when there a
e920: 72 65 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f 72  re.** one or mor
e930: 65 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  e built-in windo
e940: 77 2d 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74  w-functions that
e950: 20 72 65 71 75 69 72 65 20 74 68 65 20 65 6e 74   require the ent
e960: 69 72 65 20 70 61 72 74 69 74 69 6f 6e 0a 2a 2a  ire partition.**
e970: 20 74 6f 20 62 65 20 63 61 63 68 65 64 20 69 6e   to be cached in
e980: 20 61 20 74 65 6d 70 20 74 61 62 6c 65 20 62 65   a temp table be
e990: 66 6f 72 65 20 61 6e 79 20 72 6f 77 73 20 63 61  fore any rows ca
e9a0: 6e 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 41  n be returned. A
e9b0: 64 64 69 74 69 6f 6e 61 6c 6c 79 2e 0a 2a 2a 20  dditionally..** 
e9c0: 22 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 43  "RANGE BETWEEN C
e9d0: 55 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 55  URRENT ROW AND U
e9e0: 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49  NBOUNDED FOLLOWI
e9f0: 4e 47 22 20 69 73 20 61 6c 77 61 79 73 20 68 61  NG" is always ha
ea00: 6e 64 6c 65 64 20 62 79 0a 2a 2a 20 74 68 69 73  ndled by.** this
ea10: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
ea20: 20 50 73 65 75 64 6f 2d 63 6f 64 65 20 63 6f 72   Pseudo-code cor
ea30: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
ea40: 65 20 56 4d 20 63 6f 64 65 20 67 65 6e 65 72 61  e VM code genera
ea50: 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
ea60: 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 65 61 63 68  tion.** for each
ea70: 20 74 79 70 65 20 6f 66 20 77 69 6e 64 6f 77 20   type of window 
ea80: 66 6f 6c 6c 6f 77 73 2e 0a 2a 2a 0a 2a 2a 20 52  follows..**.** R
ea90: 41 4e 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42  ANGE BETWEEN UNB
eaa0: 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47  OUNDED PRECEDING
eab0: 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57   AND CURRENT ROW
eac0: 0a 2a 2a 0a 2a 2a 20 20 20 66 6c 75 73 68 5f 70  .**.**   flush_p
ead0: 61 72 74 69 74 69 6f 6e 3a 0a 2a 2a 20 20 20 20  artition:.**    
eae0: 20 4f 6e 63 65 20 7b 0a 2a 2a 20 20 20 20 20 20   Once {.**      
eaf0: 20 4f 70 65 6e 44 75 70 20 28 69 45 70 68 43 73   OpenDup (iEphCs
eb00: 72 20 2d 3e 20 63 73 72 4c 65 61 64 29 0a 2a 2a  r -> csrLead).**
eb10: 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 49 6e       }.**     In
eb20: 74 65 67 65 72 20 63 74 72 20 30 0a 2a 2a 20 20  teger ctr 0.**  
eb30: 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 20 28     foreach row (
eb40: 63 73 72 4c 65 61 64 29 7b 0a 2a 2a 20 20 20 20  csrLead){.**    
eb50: 20 20 20 69 66 28 20 6e 65 77 20 70 65 65 72 20     if( new peer 
eb60: 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 67  ){.**         Ag
eb70: 67 46 69 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a  gFinal (xValue).
eb80: 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  **         for(i
eb90: 3d 30 3b 20 69 3c 63 74 72 3b 20 69 2b 2b 29 7b  =0; i<ctr; i++){
eba0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 47 6f  .**           Go
ebb0: 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a  sub addrGosub.**
ebc0: 20 20 20 20 20 20 20 20 20 20 20 4e 65 78 74 20             Next 
ebd0: 69 45 70 68 43 73 72 0a 2a 2a 20 20 20 20 20 20  iEphCsr.**      
ebe0: 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20     }.**         
ebf0: 49 6e 74 65 67 65 72 20 63 74 72 20 30 0a 2a 2a  Integer ctr 0.**
ec00: 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
ec10: 20 20 41 67 67 53 74 65 70 20 28 63 73 72 4c 65    AggStep (csrLe
ec20: 61 64 29 0a 2a 2a 20 20 20 20 20 20 20 49 6e 63  ad).**       Inc
ec30: 72 20 63 74 72 0a 2a 2a 20 20 20 20 20 7d 0a 2a  r ctr.**     }.*
ec40: 2a 0a 2a 2a 20 20 20 20 20 41 67 67 46 69 6e 61  *.**     AggFina
ec50: 6c 20 28 78 46 69 6e 61 6c 69 7a 65 29 0a 2a 2a  l (xFinalize).**
ec60: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
ec70: 63 74 72 3b 20 69 2b 2b 29 7b 0a 2a 2a 20 20 20  ctr; i++){.**   
ec80: 20 20 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f      Gosub addrGo
ec90: 73 75 62 0a 2a 2a 20 20 20 20 20 20 20 4e 65 78  sub.**       Nex
eca0: 74 20 69 45 70 68 43 73 72 0a 2a 2a 20 20 20 20  t iEphCsr.**    
ecb0: 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 73   }.**.**     Res
ecc0: 65 74 53 6f 72 74 65 72 20 28 63 73 72 29 0a 2a  etSorter (csr).*
ecd0: 2a 20 20 20 20 20 52 65 74 75 72 6e 0a 2a 2a 0a  *     Return.**.
ece0: 2a 2a 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20  ** ROWS BETWEEN 
ecf0: 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44  UNBOUNDED PRECED
ed00: 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54 20  ING AND CURRENT 
ed10: 52 4f 57 0a 2a 2a 0a 2a 2a 20 20 20 41 73 20 61  ROW.**.**   As a
ed20: 62 6f 76 65 2c 20 65 78 63 65 70 74 20 74 68 61  bove, except tha
ed30: 74 20 74 68 65 20 22 69 66 28 20 6e 65 77 20 70  t the "if( new p
ed40: 65 65 72 20 29 22 20 62 72 61 6e 63 68 20 69 73  eer )" branch is
ed50: 20 61 6c 77 61 79 73 20 74 61 6b 65 6e 2e 0a 2a   always taken..*
ed60: 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54 57 45  *.** RANGE BETWE
ed70: 45 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20 41  EN CURRENT ROW A
ed80: 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 20 0a  ND CURRENT ROW .
ed90: 2a 2a 0a 2a 2a 20 20 20 41 73 20 61 62 6f 76 65  **.**   As above
eda0: 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 65 61  , except that ea
edb0: 63 68 20 6f 66 20 74 68 65 20 66 6f 72 28 29 20  ch of the for() 
edc0: 6c 6f 6f 70 73 20 62 65 63 6f 6d 65 73 3a 0a 2a  loops becomes:.*
edd0: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72  *.**         for
ede0: 28 69 3d 30 3b 20 69 3c 63 74 72 3b 20 69 2b 2b  (i=0; i<ctr; i++
edf0: 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ){.**           
ee00: 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a  Gosub addrGosub.
ee10: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 67 67  **           Agg
ee20: 49 6e 76 65 72 73 65 20 28 69 45 70 68 43 73 72  Inverse (iEphCsr
ee30: 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 4e  ).**           N
ee40: 65 78 74 20 69 45 70 68 43 73 72 0a 2a 2a 20 20  ext iEphCsr.**  
ee50: 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 52         }.**.** R
ee60: 41 4e 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42  ANGE BETWEEN UNB
ee70: 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47  OUNDED PRECEDING
ee80: 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46   AND UNBOUNDED F
ee90: 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20  OLLOWING.**.**  
eea0: 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e   flush_partition
eeb0: 3a 0a 2a 2a 20 20 20 20 20 4f 6e 63 65 20 7b 0a  :.**     Once {.
eec0: 2a 2a 20 20 20 20 20 20 20 4f 70 65 6e 44 75 70  **       OpenDup
eed0: 20 28 69 45 70 68 43 73 72 20 2d 3e 20 63 73 72   (iEphCsr -> csr
eee0: 4c 65 61 64 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a  Lead).**     }.*
eef0: 2a 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f  *     foreach ro
ef00: 77 20 28 63 73 72 4c 65 61 64 29 20 7b 0a 2a 2a  w (csrLead) {.**
ef10: 20 20 20 20 20 20 20 41 67 67 53 74 65 70 20 28         AggStep (
ef20: 63 73 72 4c 65 61 64 29 0a 2a 2a 20 20 20 20 20  csrLead).**     
ef30: 7d 0a 2a 2a 20 20 20 20 20 66 6f 72 65 61 63 68  }.**     foreach
ef40: 20 72 6f 77 20 28 69 45 70 68 43 73 72 29 20 7b   row (iEphCsr) {
ef50: 0a 2a 2a 20 20 20 20 20 20 20 47 6f 73 75 62 20  .**       Gosub 
ef60: 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20  addrGosub.**    
ef70: 20 7d 0a 2a 2a 20 0a 2a 2a 20 52 41 4e 47 45 20   }.** .** RANGE 
ef80: 42 45 54 57 45 45 4e 20 43 55 52 52 45 4e 54 20  BETWEEN CURRENT 
ef90: 52 4f 57 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45  ROW AND UNBOUNDE
efa0: 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a  D FOLLOWING.**.*
efb0: 2a 20 20 20 66 6c 75 73 68 5f 70 61 72 74 69 74  *   flush_partit
efc0: 69 6f 6e 3a 0a 2a 2a 20 20 20 20 20 4f 6e 63 65  ion:.**     Once
efd0: 20 7b 0a 2a 2a 20 20 20 20 20 20 20 4f 70 65 6e   {.**       Open
efe0: 44 75 70 20 28 69 45 70 68 43 73 72 20 2d 3e 20  Dup (iEphCsr -> 
eff0: 63 73 72 4c 65 61 64 29 0a 2a 2a 20 20 20 20 20  csrLead).**     
f000: 7d 0a 2a 2a 20 20 20 20 20 66 6f 72 65 61 63 68  }.**     foreach
f010: 20 72 6f 77 20 28 63 73 72 4c 65 61 64 29 7b 0a   row (csrLead){.
f020: 2a 2a 20 20 20 20 20 20 20 41 67 67 53 74 65 70  **       AggStep
f030: 20 28 63 73 72 4c 65 61 64 29 0a 2a 2a 20 20 20   (csrLead).**   
f040: 20 20 7d 0a 2a 2a 20 20 20 20 20 52 65 77 69 6e    }.**     Rewin
f050: 64 20 28 63 73 72 4c 65 61 64 29 0a 2a 2a 20 20  d (csrLead).**  
f060: 20 20 20 49 6e 74 65 67 65 72 20 63 74 72 20 30     Integer ctr 0
f070: 0a 2a 2a 20 20 20 20 20 66 6f 72 65 61 63 68 20  .**     foreach 
f080: 72 6f 77 20 28 63 73 72 4c 65 61 64 29 7b 0a 2a  row (csrLead){.*
f090: 2a 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 20  *       if( new 
f0a0: 70 65 65 72 20 29 7b 0a 2a 2a 20 20 20 20 20 20  peer ){.**      
f0b0: 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78 56 61     AggFinal (xVa
f0c0: 6c 75 65 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  lue).**         
f0d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 63 74 72 3b 20  for(i=0; i<ctr; 
f0e0: 69 2b 2b 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  i++){.**        
f0f0: 20 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73     Gosub addrGos
f100: 75 62 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ub.**           
f110: 41 67 67 49 6e 76 65 72 73 65 20 28 69 45 70 68  AggInverse (iEph
f120: 43 73 72 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  Csr).**         
f130: 20 20 4e 65 78 74 20 69 45 70 68 43 73 72 0a 2a    Next iEphCsr.*
f140: 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  *         }.**  
f150: 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63         Integer c
f160: 74 72 20 30 0a 2a 2a 20 20 20 20 20 20 20 7d 0a  tr 0.**       }.
f170: 2a 2a 20 20 20 20 20 20 20 49 6e 63 72 20 63 74  **       Incr ct
f180: 72 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a  r.**     }.**.**
f190: 20 20 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78       AggFinal (x
f1a0: 46 69 6e 61 6c 69 7a 65 29 0a 2a 2a 20 20 20 20  Finalize).**    
f1b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 63 74 72 3b   for(i=0; i<ctr;
f1c0: 20 69 2b 2b 29 7b 0a 2a 2a 20 20 20 20 20 20 20   i++){.**       
f1d0: 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a  Gosub addrGosub.
f1e0: 2a 2a 20 20 20 20 20 20 20 4e 65 78 74 20 69 45  **       Next iE
f1f0: 70 68 43 73 72 0a 2a 2a 20 20 20 20 20 7d 0a 2a  phCsr.**     }.*
f200: 2a 0a 2a 2a 20 20 20 20 20 52 65 73 65 74 53 6f  *.**     ResetSo
f210: 72 74 65 72 20 28 63 73 72 29 0a 2a 2a 20 20 20  rter (csr).**   
f220: 20 20 52 65 74 75 72 6e 0a 2a 2f 0a 73 74 61 74    Return.*/.stat
f230: 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 43 6f  ic void windowCo
f240: 64 65 43 61 63 68 65 53 74 65 70 28 0a 20 20 50  deCacheStep(.  P
f250: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20  arse *pParse, . 
f260: 20 53 65 6c 65 63 74 20 2a 70 2c 0a 20 20 57 68   Select *p,.  Wh
f270: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
f280: 0a 20 20 69 6e 74 20 72 65 67 47 6f 73 75 62 2c  .  int regGosub,
f290: 20 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75   .  int addrGosu
f2a0: 62 0a 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70  b.){.  Window *p
f2b0: 4d 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b 0a  MWin = p->pWin;.
f2c0: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
f2d0: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
f2e0: 65 29 3b 0a 20 20 69 6e 74 20 6b 3b 0a 20 20 69  e);.  int k;.  i
f2f0: 6e 74 20 61 64 64 72 3b 0a 20 20 45 78 70 72 4c  nt addr;.  ExprL
f300: 69 73 74 20 2a 70 50 61 72 74 20 3d 20 70 4d 57  ist *pPart = pMW
f310: 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 3b 0a  in->pPartition;.
f320: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
f330: 65 72 42 79 20 3d 20 70 4d 57 69 6e 2d 3e 70 4f  erBy = pMWin->pO
f340: 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 6e 50  rderBy;.  int nP
f350: 65 65 72 20 3d 20 70 4f 72 64 65 72 42 79 20 3f  eer = pOrderBy ?
f360: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
f370: 20 3a 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 4e   : 0;.  int regN
f380: 65 77 50 65 65 72 3b 0a 0a 20 20 69 6e 74 20 61  ewPeer;..  int a
f390: 64 64 72 47 6f 74 6f 3b 20 20 20 20 20 20 20 20  ddrGoto;        
f3a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
f3b0: 64 72 65 73 73 20 6f 66 20 47 6f 74 6f 20 75 73  dress of Goto us
f3c0: 65 64 20 74 6f 20 6a 75 6d 70 20 66 6c 75 73 68  ed to jump flush
f3d0: 5f 70 61 72 2e 2e 20 2a 2f 0a 20 20 69 6e 74 20  _par.. */.  int 
f3e0: 61 64 64 72 4e 65 78 74 3b 20 20 20 20 20 20 20  addrNext;       
f3f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
f400: 75 6d 70 20 68 65 72 65 20 66 6f 72 20 6e 65 78  ump here for nex
f410: 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 6c  t iteration of l
f420: 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  oop */.  int reg
f430: 46 6c 75 73 68 50 61 72 74 3b 0a 20 20 69 6e 74  FlushPart;.  int
f440: 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 3b 0a 20   lblFlushPart;. 
f450: 20 69 6e 74 20 63 73 72 4c 65 61 64 3b 0a 20 20   int csrLead;.  
f460: 69 6e 74 20 72 65 67 43 74 72 3b 0a 20 20 69 6e  int regCtr;.  in
f470: 74 20 72 65 67 41 72 67 3b 20 20 20 20 20 20 20  t regArg;       
f480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f490: 20 52 65 67 69 73 74 65 72 20 61 72 72 61 79 20   Register array 
f4a0: 74 6f 20 6d 61 72 74 69 61 6c 20 66 75 6e 63 74  to martial funct
f4b0: 69 6f 6e 20 61 72 67 73 20 2a 2f 0a 20 20 69 6e  ion args */.  in
f4c0: 74 20 72 65 67 53 69 7a 65 3b 0a 20 20 69 6e 74  t regSize;.  int
f4d0: 20 6c 62 6c 45 6d 70 74 79 3b 0a 20 20 69 6e 74   lblEmpty;.  int
f4e0: 20 62 52 65 76 65 72 73 65 20 3d 20 70 4d 57 69   bReverse = pMWi
f4f0: 6e 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70  n->pOrderBy && p
f500: 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
f510: 5f 43 55 52 52 45 4e 54 20 0a 20 20 20 20 20 20  _CURRENT .      
f520: 20 20 20 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45      && pMWin->eE
f530: 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  nd==TK_UNBOUNDED
f540: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 4d  ;..  assert( (pM
f550: 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
f560: 55 4e 42 4f 55 4e 44 45 44 20 26 26 20 70 4d 57  UNBOUNDED && pMW
f570: 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55 52  in->eEnd==TK_CUR
f580: 52 45 4e 54 29 20 0a 20 20 20 20 20 20 20 7c 7c  RENT) .       ||
f590: 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d   (pMWin->eStart=
f5a0: 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 26 26  =TK_UNBOUNDED &&
f5b0: 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b   pMWin->eEnd==TK
f5c0: 5f 55 4e 42 4f 55 4e 44 45 44 29 20 0a 20 20 20  _UNBOUNDED) .   
f5d0: 20 20 20 20 7c 7c 20 28 70 4d 57 69 6e 2d 3e 65      || (pMWin->e
f5e0: 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e  Start==TK_CURREN
f5f0: 54 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64  T && pMWin->eEnd
f600: 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29 20 0a 20  ==TK_CURRENT) . 
f610: 20 20 20 20 20 20 7c 7c 20 28 70 4d 57 69 6e 2d        || (pMWin-
f620: 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52  >eStart==TK_CURR
f630: 45 4e 54 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45  ENT && pMWin->eE
f640: 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  nd==TK_UNBOUNDED
f650: 29 20 0a 20 20 29 3b 0a 0a 20 20 6c 62 6c 45 6d  ) .  );..  lblEm
f660: 70 74 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pty = sqlite3Vdb
f670: 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
f680: 65 29 3b 0a 20 20 72 65 67 4e 65 77 50 65 65 72  e);.  regNewPeer
f690: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
f6a0: 31 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  1;.  pParse->nMe
f6b0: 6d 20 2b 3d 20 6e 50 65 65 72 3b 0a 0a 20 20 2f  m += nPeer;..  /
f6c0: 2a 20 41 6c 6c 6f 63 61 74 65 20 72 65 67 69 73  * Allocate regis
f6d0: 74 65 72 20 61 6e 64 20 6c 61 62 65 6c 20 66 6f  ter and label fo
f6e0: 72 20 74 68 65 20 22 66 6c 75 73 68 5f 70 61 72  r the "flush_par
f6f0: 74 69 74 69 6f 6e 22 20 73 75 62 2d 72 6f 75 74  tition" sub-rout
f700: 69 6e 65 2e 20 2a 2f 0a 20 20 72 65 67 46 6c 75  ine. */.  regFlu
f710: 73 68 50 61 72 74 20 3d 20 2b 2b 70 50 61 72 73  shPart = ++pPars
f720: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6c 62 6c 46 6c  e->nMem;.  lblFl
f730: 75 73 68 50 61 72 74 20 3d 20 73 71 6c 69 74 65  ushPart = sqlite
f740: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70  3VdbeMakeLabel(p
f750: 50 61 72 73 65 29 3b 0a 0a 20 20 63 73 72 4c 65  Parse);..  csrLe
f760: 61 64 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ad = pParse->nTa
f770: 62 2b 2b 3b 0a 20 20 72 65 67 43 74 72 20 3d 20  b++;.  regCtr = 
f780: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
f790: 0a 20 20 77 69 6e 64 6f 77 50 61 72 74 69 74 69  .  windowPartiti
f7a0: 6f 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c 20  onCache(pParse, 
f7b0: 70 2c 20 70 57 49 6e 66 6f 2c 20 72 65 67 46 6c  p, pWInfo, regFl
f7c0: 75 73 68 50 61 72 74 2c 20 6c 62 6c 46 6c 75 73  ushPart, lblFlus
f7d0: 68 50 61 72 74 2c 20 26 72 65 67 53 69 7a 65 29  hPart, &regSize)
f7e0: 3b 0a 20 20 61 64 64 72 47 6f 74 6f 20 3d 20 73  ;.  addrGoto = s
f7f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
f800: 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 0a 20  (v, OP_Goto);.. 
f810: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 22 66 6c   /* Start of "fl
f820: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 20 2a  ush_partition" *
f830: 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
f840: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
f850: 62 6c 46 6c 75 73 68 50 61 72 74 29 3b 0a 20 20  blFlushPart);.  
f860: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f870: 32 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c 20 30 2c  2(v, OP_Once, 0,
f880: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
f890: 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20  entAddr(v)+2);. 
f8a0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
f8b0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
f8c0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
f8d0: 44 75 70 2c 20 63 73 72 4c 65 61 64 2c 20 70 4d  Dup, csrLead, pM
f8e0: 57 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 0a  Win->iEphCsr);..
f8f0: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
f900: 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
f910: 72 65 67 69 73 74 65 72 20 66 6f 72 20 65 61 63  register for eac
f920: 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  h window functio
f930: 6e 20 74 6f 20 4e 55 4c 4c 20 2a 2f 0a 20 20 72  n to NULL */.  r
f940: 65 67 41 72 67 20 3d 20 77 69 6e 64 6f 77 49 6e  egArg = windowIn
f950: 69 74 41 63 63 75 6d 28 70 50 61 72 73 65 2c 20  itAccum(pParse, 
f960: 70 4d 57 69 6e 29 3b 0a 0a 20 20 73 71 6c 69 74  pMWin);..  sqlit
f970: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
f980: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72  OP_Integer, 0, r
f990: 65 67 43 74 72 29 3b 0a 20 20 73 71 6c 69 74 65  egCtr);.  sqlite
f9a0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
f9b0: 50 5f 52 65 77 69 6e 64 2c 20 63 73 72 4c 65 61  P_Rewind, csrLea
f9c0: 64 2c 20 6c 62 6c 45 6d 70 74 79 29 3b 0a 20 20  d, lblEmpty);.  
f9d0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
f9e0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
f9f0: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
fa00: 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  d, pMWin->iEphCs
fa10: 72 2c 20 6c 62 6c 45 6d 70 74 79 29 3b 0a 20 20  r, lblEmpty);.  
fa20: 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65  VdbeCoverageNeve
fa30: 72 54 61 6b 65 6e 28 76 29 3b 0a 0a 20 20 69 66  rTaken(v);..  if
fa40: 28 20 62 52 65 76 65 72 73 65 20 29 7b 0a 20 20  ( bReverse ){.  
fa50: 20 20 69 6e 74 20 61 64 64 72 32 20 3d 20 73 71    int addr2 = sq
fa60: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
fa70: 41 64 64 72 28 76 29 3b 0a 20 20 20 20 77 69 6e  Addr(v);.    win
fa80: 64 6f 77 41 67 67 53 74 65 70 28 70 50 61 72 73  dowAggStep(pPars
fa90: 65 2c 20 70 4d 57 69 6e 2c 20 63 73 72 4c 65 61  e, pMWin, csrLea
faa0: 64 2c 20 30 2c 20 72 65 67 41 72 67 2c 20 72 65  d, 0, regArg, re
fab0: 67 53 69 7a 65 29 3b 0a 20 20 20 20 73 71 6c 69  gSize);.    sqli
fac0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
fad0: 20 4f 50 5f 4e 65 78 74 2c 20 63 73 72 4c 65 61   OP_Next, csrLea
fae0: 64 2c 20 61 64 64 72 32 29 3b 0a 20 20 20 20 56  d, addr2);.    V
faf0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
fb00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fb10: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
fb20: 6e 64 2c 20 63 73 72 4c 65 61 64 2c 20 6c 62 6c  nd, csrLead, lbl
fb30: 45 6d 70 74 79 29 3b 0a 20 20 20 20 56 64 62 65  Empty);.    Vdbe
fb40: 43 6f 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b  CoverageNeverTak
fb50: 65 6e 28 76 29 3b 0a 20 20 7d 0a 20 20 61 64 64  en(v);.  }.  add
fb60: 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56  rNext = sqlite3V
fb70: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
fb80: 29 3b 0a 0a 20 20 69 66 28 20 70 4f 72 64 65 72  );..  if( pOrder
fb90: 42 79 20 26 26 20 28 70 4d 57 69 6e 2d 3e 65 45  By && (pMWin->eE
fba0: 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 7c  nd==TK_CURRENT |
fbb0: 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d  | pMWin->eStart=
fbc0: 3d 54 4b 5f 43 55 52 52 45 4e 54 29 20 29 7b 0a  =TK_CURRENT) ){.
fbd0: 20 20 20 20 69 6e 74 20 62 43 75 72 72 65 6e 74      int bCurrent
fbe0: 20 3d 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72   = (pMWin->eStar
fbf0: 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29 3b 0a  t==TK_CURRENT);.
fc00: 20 20 20 20 69 6e 74 20 61 64 64 72 4a 75 6d 70      int addrJump
fc10: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
fc20: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
fc30: 4f 50 5f 4a 75 6d 70 20 62 65 6c 6f 77 20 2a 2f  OP_Jump below */
fc40: 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  .    if( pMWin->
fc50: 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 20  eType==TK_RANGE 
fc60: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4f 66  ){.      int iOf
fc70: 66 20 3d 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66  f = pMWin->nBuff
fc80: 65 72 43 6f 6c 20 2b 20 28 70 50 61 72 74 20 3f  erCol + (pPart ?
fc90: 20 70 50 61 72 74 2d 3e 6e 45 78 70 72 20 3a 20   pPart->nExpr : 
fca0: 30 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65  0);.      int re
fcb0: 67 50 65 65 72 20 3d 20 70 4d 57 69 6e 2d 3e 72  gPeer = pMWin->r
fcc0: 65 67 50 61 72 74 20 2b 20 28 70 50 61 72 74 20  egPart + (pPart 
fcd0: 3f 20 70 50 61 72 74 2d 3e 6e 45 78 70 72 20 3a  ? pPart->nExpr :
fce0: 20 30 29 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e   0);.      KeyIn
fcf0: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 73  fo *pKeyInfo = s
fd00: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f  qlite3KeyInfoFro
fd10: 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
fd20: 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 2c 20 30  , pOrderBy, 0, 0
fd30: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30  );.      for(k=0
fd40: 3b 20 6b 3c 6e 50 65 65 72 3b 20 6b 2b 2b 29 7b  ; k<nPeer; k++){
fd50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
fd60: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
fd70: 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 4c 65 61 64  _Column, csrLead
fd80: 2c 20 69 4f 66 66 2b 6b 2c 20 72 65 67 4e 65 77  , iOff+k, regNew
fd90: 50 65 65 72 2b 6b 29 3b 0a 20 20 20 20 20 20 7d  Peer+k);.      }
fda0: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
fdb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
fdc0: 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72  v, OP_Compare, r
fdd0: 65 67 4e 65 77 50 65 65 72 2c 20 72 65 67 50 65  egNewPeer, regPe
fde0: 65 72 2c 20 6e 50 65 65 72 29 3b 0a 20 20 20 20  er, nPeer);.    
fdf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70    sqlite3VdbeApp
fe00: 65 6e 64 50 34 28 76 2c 20 28 76 6f 69 64 2a 29  endP4(v, (void*)
fe10: 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
fe20: 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 61 64 64  INFO);.      add
fe30: 72 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33 56  rJump = sqlite3V
fe40: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
fe50: 4a 75 6d 70 2c 20 61 64 64 72 2b 32 2c 20 30 2c  Jump, addr+2, 0,
fe60: 20 61 64 64 72 2b 32 29 3b 0a 20 20 20 20 20 20   addr+2);.      
fe70: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
fe80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
fe90: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
fea0: 6f 70 79 2c 20 72 65 67 4e 65 77 50 65 65 72 2c  opy, regNewPeer,
feb0: 20 72 65 67 50 65 65 72 2c 20 6e 50 65 65 72 2d   regPeer, nPeer-
fec0: 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77  1);.    }..    w
fed0: 69 6e 64 6f 77 52 65 74 75 72 6e 52 6f 77 73 28  indowReturnRows(
fee0: 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 72  pParse, pMWin, r
fef0: 65 67 43 74 72 2c 20 72 65 67 47 6f 73 75 62 2c  egCtr, regGosub,
ff00: 20 61 64 64 72 47 6f 73 75 62 2c 20 0a 20 20 20   addrGosub, .   
ff10: 20 20 20 20 20 28 62 43 75 72 72 65 6e 74 20 3f       (bCurrent ?
ff20: 20 72 65 67 41 72 67 20 3a 20 30 29 2c 20 28 62   regArg : 0), (b
ff30: 43 75 72 72 65 6e 74 20 3f 20 72 65 67 53 69 7a  Current ? regSiz
ff40: 65 20 3a 20 30 29 0a 20 20 20 20 29 3b 0a 20 20  e : 0).    );.  
ff50: 20 20 69 66 28 20 61 64 64 72 4a 75 6d 70 20 29    if( addrJump )
ff60: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
ff70: 48 65 72 65 28 76 2c 20 61 64 64 72 4a 75 6d 70  Here(v, addrJump
ff80: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 52  );.  }..  if( bR
ff90: 65 76 65 72 73 65 3d 3d 30 20 29 7b 0a 20 20 20  everse==0 ){.   
ffa0: 20 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28 70   windowAggStep(p
ffb0: 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 63 73  Parse, pMWin, cs
ffc0: 72 4c 65 61 64 2c 20 30 2c 20 72 65 67 41 72 67  rLead, 0, regArg
ffd0: 2c 20 72 65 67 53 69 7a 65 29 3b 0a 20 20 7d 0a  , regSize);.  }.
ffe0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fff0: 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
10000 2c 20 72 65 67 43 74 72 2c 20 31 29 3b 0a 20 20  , regCtr, 1);.  
10010 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10020 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 63 73  2(v, OP_Next, cs
10030 72 4c 65 61 64 2c 20 61 64 64 72 4e 65 78 74 29  rLead, addrNext)
10040 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  ;.  VdbeCoverage
10050 28 76 29 3b 0a 0a 20 20 77 69 6e 64 6f 77 52 65  (v);..  windowRe
10060 74 75 72 6e 52 6f 77 73 28 70 50 61 72 73 65 2c  turnRows(pParse,
10070 20 70 4d 57 69 6e 2c 20 72 65 67 43 74 72 2c 20   pMWin, regCtr, 
10080 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f  regGosub, addrGo
10090 73 75 62 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 73  sub, 0, 0);..  s
100a0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
100b0 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 45 6d 70  eLabel(v, lblEmp
100c0 74 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ty);.  sqlite3Vd
100d0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
100e0 65 73 65 74 53 6f 72 74 65 72 2c 20 70 4d 57 69  esetSorter, pMWi
100f0 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 73  n->iEphCsr);.  s
10100 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
10110 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
10120 65 67 46 6c 75 73 68 50 61 72 74 29 3b 0a 0a 20  egFlushPart);.. 
10130 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65   /* Jump to here
10140 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 66 6c   to skip over fl
10150 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 20 2a 2f  ush_partition */
10160 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
10170 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 47 6f  mpHere(v, addrGo
10180 74 6f 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  to);.}.../*.** R
10190 41 4e 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42  ANGE BETWEEN UNB
101a0 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47  OUNDED PRECEDING
101b0 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57   AND CURRENT ROW
101c0 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 0a 2a 2a 20  .**.**   ....** 
101d0 20 20 20 20 69 66 28 20 6e 65 77 20 70 61 72 74      if( new part
101e0 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20  ition ){.**     
101f0 20 20 41 67 67 46 69 6e 61 6c 20 28 78 46 69 6e    AggFinal (xFin
10200 61 6c 69 7a 65 29 0a 2a 2a 20 20 20 20 20 20 20  alize).**       
10210 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a  Gosub addrGosub.
10220 2a 2a 20 20 20 20 20 20 20 52 65 73 65 74 53 6f  **       ResetSo
10230 72 74 65 72 20 65 70 68 2d 74 61 62 6c 65 0a 2a  rter eph-table.*
10240 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 65  *     }.**     e
10250 6c 73 65 20 69 66 28 20 6e 65 77 20 70 65 65 72  lse if( new peer
10260 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67 67   ){.**       Agg
10270 46 69 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a  Final (xValue).*
10280 2a 20 20 20 20 20 20 20 47 6f 73 75 62 20 61 64  *       Gosub ad
10290 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20  drGosub.**      
102a0 20 52 65 73 65 74 53 6f 72 74 65 72 20 65 70 68   ResetSorter eph
102b0 2d 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 7d 0a  -table.**     }.
102c0 2a 2a 20 20 20 20 20 41 67 67 53 74 65 70 0a 2a  **     AggStep.*
102d0 2a 20 20 20 20 20 49 6e 73 65 72 74 20 28 72 65  *     Insert (re
102e0 63 6f 72 64 20 69 6e 74 6f 20 65 70 68 2d 74 61  cord into eph-ta
102f0 62 6c 65 29 0a 2a 2a 20 20 20 73 71 6c 69 74 65  ble).**   sqlite
10300 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20  3WhereEnd().**  
10310 20 41 67 67 46 69 6e 61 6c 20 28 78 46 69 6e 61   AggFinal (xFina
10320 6c 69 7a 65 29 0a 2a 2a 20 20 20 47 6f 73 75 62  lize).**   Gosub
10330 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 0a 2a 2a   addrGosub.**.**
10340 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 55   RANGE BETWEEN U
10350 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49  NBOUNDED PRECEDI
10360 4e 47 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44  NG AND UNBOUNDED
10370 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a   FOLLOWING.**.**
10380 20 20 20 41 73 20 61 62 6f 76 65 2c 20 65 78 63     As above, exc
10390 65 70 74 20 74 61 6b 65 20 6e 6f 20 61 63 74 69  ept take no acti
103a0 6f 6e 20 66 6f 72 20 61 20 22 6e 65 77 20 70 65  on for a "new pe
103b0 65 72 22 2e 20 49 6e 76 6f 6b 65 0a 2a 2a 20 20  er". Invoke.**  
103c0 20 74 68 65 20 73 75 62 2d 72 6f 75 74 69 6e 65   the sub-routine
103d0 20 6f 6e 63 65 20 6f 6e 6c 79 20 66 6f 72 20 65   once only for e
103e0 61 63 68 20 70 61 72 74 69 74 69 6f 6e 2e 0a 2a  ach partition..*
103f0 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54 57 45  *.** RANGE BETWE
10400 45 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20 41  EN CURRENT ROW A
10410 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a  ND CURRENT ROW.*
10420 2a 0a 2a 2a 20 20 20 41 73 20 61 62 6f 76 65 2c  *.**   As above,
10430 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65   except that the
10440 20 22 6e 65 77 20 70 65 65 72 22 20 63 6f 6e 64   "new peer" cond
10450 69 74 69 6f 6e 20 69 73 20 68 61 6e 64 6c 65 64  ition is handled
10460 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 73 61 6d   in the.**   sam
10470 65 20 77 61 79 20 61 73 20 22 6e 65 77 20 70 61  e way as "new pa
10480 72 74 69 74 69 6f 6e 22 20 28 73 6f 20 74 68 65  rtition" (so the
10490 72 65 20 69 73 20 6e 6f 20 22 65 6c 73 65 20 69  re is no "else i
104a0 66 22 20 62 6c 6f 63 6b 29 2e 0a 2a 2a 0a 2a 2a  f" block)..**.**
104b0 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20 55 4e   ROWS BETWEEN UN
104c0 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e  BOUNDED PRECEDIN
104d0 47 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f  G AND CURRENT RO
104e0 57 0a 2a 2a 20 0a 2a 2a 20 20 20 41 73 20 61 62  W.** .**   As ab
104f0 6f 76 65 2c 20 65 78 63 65 70 74 20 61 73 73 75  ove, except assu
10500 6d 65 20 65 76 65 72 79 20 72 6f 77 20 69 73 20  me every row is 
10510 61 20 22 6e 65 77 20 70 65 65 72 22 2e 0a 2a 2f  a "new peer"..*/
10520 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
10530 64 6f 77 43 6f 64 65 44 65 66 61 75 6c 74 53 74  dowCodeDefaultSt
10540 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ep(.  Parse *pPa
10550 72 73 65 2c 20 0a 20 20 53 65 6c 65 63 74 20 2a  rse, .  Select *
10560 70 2c 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  p,.  WhereInfo *
10570 70 57 49 6e 66 6f 2c 0a 20 20 69 6e 74 20 72 65  pWInfo,.  int re
10580 67 47 6f 73 75 62 2c 20 0a 20 20 69 6e 74 20 61  gGosub, .  int a
10590 64 64 72 47 6f 73 75 62 0a 29 7b 0a 20 20 57 69  ddrGosub.){.  Wi
105a0 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d  ndow *pMWin = p-
105b0 3e 70 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76  >pWin;.  Vdbe *v
105c0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
105d0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  e(pParse);.  int
105e0 20 6b 3b 0a 20 20 69 6e 74 20 69 53 75 62 43 73   k;.  int iSubCs
105f0 72 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  r = p->pSrc->a[0
10600 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 69 6e 74  ].iCursor;.  int
10610 20 6e 53 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d   nSub = p->pSrc-
10620 3e 61 5b 30 5d 2e 70 54 61 62 2d 3e 6e 43 6f 6c  >a[0].pTab->nCol
10630 3b 0a 20 20 69 6e 74 20 72 65 67 20 3d 20 70 50  ;.  int reg = pP
10640 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
10650 69 6e 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20  int regRecord = 
10660 72 65 67 2b 6e 53 75 62 3b 0a 20 20 69 6e 74 20  reg+nSub;.  int 
10670 72 65 67 52 6f 77 69 64 20 3d 20 72 65 67 52 65  regRowid = regRe
10680 63 6f 72 64 2b 31 3b 0a 20 20 69 6e 74 20 61 64  cord+1;.  int ad
10690 64 72 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  dr;.  ExprList *
106a0 70 50 61 72 74 20 3d 20 70 4d 57 69 6e 2d 3e 70  pPart = pMWin->p
106b0 50 61 72 74 69 74 69 6f 6e 3b 0a 20 20 45 78 70  Partition;.  Exp
106c0 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
106d0 3d 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42  = pMWin->pOrderB
106e0 79 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4d  y;..  assert( pM
106f0 57 69 6e 2d 3e 65 54 79 70 65 3d 3d 54 4b 5f 52  Win->eType==TK_R
10700 41 4e 47 45 20 0a 20 20 20 20 20 20 7c 7c 20 28  ANGE .      || (
10710 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
10720 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 26 26 20 70  K_UNBOUNDED && p
10730 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43  MWin->eEnd==TK_C
10740 55 52 52 45 4e 54 29 0a 20 20 29 3b 0a 0a 20 20  URRENT).  );..  
10750 61 73 73 65 72 74 28 20 28 70 4d 57 69 6e 2d 3e  assert( (pMWin->
10760 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55  eStart==TK_UNBOU
10770 4e 44 45 44 20 26 26 20 70 4d 57 69 6e 2d 3e 65  NDED && pMWin->e
10780 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29  End==TK_CURRENT)
10790 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 4d 57 69  .       || (pMWi
107a0 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e  n->eStart==TK_UN
107b0 42 4f 55 4e 44 45 44 20 26 26 20 70 4d 57 69 6e  BOUNDED && pMWin
107c0 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55  ->eEnd==TK_UNBOU
107d0 4e 44 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20  NDED).       || 
107e0 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d  (pMWin->eStart==
107f0 54 4b 5f 43 55 52 52 45 4e 54 20 26 26 20 70 4d  TK_CURRENT && pM
10800 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55  Win->eEnd==TK_CU
10810 52 52 45 4e 54 29 0a 20 20 20 20 20 20 20 7c 7c  RRENT).       ||
10820 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d   (pMWin->eStart=
10830 3d 54 4b 5f 43 55 52 52 45 4e 54 20 26 26 20 70  =TK_CURRENT && p
10840 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55  MWin->eEnd==TK_U
10850 4e 42 4f 55 4e 44 45 44 20 26 26 20 21 70 4f 72  NBOUNDED && !pOr
10860 64 65 72 42 79 29 0a 20 20 29 3b 0a 0a 20 20 69  derBy).  );..  i
10870 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  f( pMWin->eEnd==
10880 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a  TK_UNBOUNDED ){.
10890 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30      pOrderBy = 0
108a0 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 72 73 65 2d  ;.  }..  pParse-
108b0 3e 6e 4d 65 6d 20 2b 3d 20 6e 53 75 62 20 2b 20  >nMem += nSub + 
108c0 32 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68  2;..  /* Load th
108d0 65 20 69 6e 64 69 76 69 64 75 61 6c 20 63 6f 6c  e individual col
108e0 75 6d 6e 20 76 61 6c 75 65 73 20 6f 66 20 74 68  umn values of th
108f0 65 20 72 6f 77 20 72 65 74 75 72 6e 65 64 20 62  e row returned b
10900 79 0a 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 73  y.  ** the sub-s
10910 65 6c 65 63 74 20 69 6e 74 6f 20 61 6e 20 61 72  elect into an ar
10920 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
10930 2e 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20  . */.  for(k=0; 
10940 6b 3c 6e 53 75 62 3b 20 6b 2b 2b 29 7b 0a 20 20  k<nSub; k++){.  
10950 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10960 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
10970 2c 20 69 53 75 62 43 73 72 2c 20 6b 2c 20 72 65  , iSubCsr, k, re
10980 67 2b 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  g+k);.  }..  /* 
10990 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 69 73  Check if this is
109a0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20   the start of a 
109b0 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 20 6f 72  new partition or
109c0 20 70 65 65 72 20 67 72 6f 75 70 2e 20 2a 2f 0a   peer group. */.
109d0 20 20 69 66 28 20 70 50 61 72 74 20 7c 7c 20 70    if( pPart || p
109e0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69  OrderBy ){.    i
109f0 6e 74 20 6e 50 61 72 74 20 3d 20 28 70 50 61 72  nt nPart = (pPar
10a00 74 20 3f 20 70 50 61 72 74 2d 3e 6e 45 78 70 72  t ? pPart->nExpr
10a10 20 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74 20 61   : 0);.    int a
10a20 64 64 72 47 6f 74 6f 20 3d 20 30 3b 0a 20 20 20  ddrGoto = 0;.   
10a30 20 69 6e 74 20 61 64 64 72 4a 75 6d 70 20 3d 20   int addrJump = 
10a40 30 3b 0a 20 20 20 20 69 6e 74 20 6e 50 65 65 72  0;.    int nPeer
10a50 20 3d 20 28 70 4f 72 64 65 72 42 79 20 3f 20 70   = (pOrderBy ? p
10a60 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 3a  OrderBy->nExpr :
10a70 20 30 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 50   0);..    if( pP
10a80 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  art ){.      int
10a90 20 72 65 67 4e 65 77 50 61 72 74 20 3d 20 72 65   regNewPart = re
10aa0 67 20 2b 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66  g + pMWin->nBuff
10ab0 65 72 43 6f 6c 3b 0a 20 20 20 20 20 20 4b 65 79  erCol;.      Key
10ac0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
10ad0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46   sqlite3KeyInfoF
10ae0 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
10af0 73 65 2c 20 70 50 61 72 74 2c 20 30 2c 20 30 29  se, pPart, 0, 0)
10b00 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
10b10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
10b20 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
10b30 72 65 67 4e 65 77 50 61 72 74 2c 20 70 4d 57 69  regNewPart, pMWi
10b40 6e 2d 3e 72 65 67 50 61 72 74 2c 6e 50 61 72 74  n->regPart,nPart
10b50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10b60 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20  VdbeAppendP4(v, 
10b70 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2c  (void*)pKeyInfo,
10b80 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
10b90 20 20 20 20 61 64 64 72 4a 75 6d 70 20 3d 20 73      addrJump = s
10ba0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
10bb0 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64  (v, OP_Jump, add
10bc0 72 2b 32 2c 20 30 2c 20 61 64 64 72 2b 32 29 3b  r+2, 0, addr+2);
10bd0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
10be0 61 67 65 45 71 4e 65 28 76 29 3b 0a 20 20 20 20  ageEqNe(v);.    
10bf0 20 20 77 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c    windowAggFinal
10c00 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20  (pParse, pMWin, 
10c10 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  1);.      if( pO
10c20 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
10c30 20 20 61 64 64 72 47 6f 74 6f 20 3d 20 73 71 6c    addrGoto = sql
10c40 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
10c50 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20  , OP_Goto);.    
10c60 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
10c70 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
10c80 20 20 20 20 20 69 6e 74 20 72 65 67 4e 65 77 50       int regNewP
10c90 65 65 72 20 3d 20 72 65 67 20 2b 20 70 4d 57 69  eer = reg + pMWi
10ca0 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 20 2b 20  n->nBufferCol + 
10cb0 6e 50 61 72 74 3b 0a 20 20 20 20 20 20 69 6e 74  nPart;.      int
10cc0 20 72 65 67 50 65 65 72 20 3d 20 70 4d 57 69 6e   regPeer = pMWin
10cd0 2d 3e 72 65 67 50 61 72 74 20 2b 20 6e 50 61 72  ->regPart + nPar
10ce0 74 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 61 64  t;..      if( ad
10cf0 64 72 4a 75 6d 70 20 29 20 73 71 6c 69 74 65 33  drJump ) sqlite3
10d00 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
10d10 61 64 64 72 4a 75 6d 70 29 3b 0a 20 20 20 20 20  addrJump);.     
10d20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 54 79 70   if( pMWin->eTyp
10d30 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 29 7b 0a 20  e==TK_RANGE ){. 
10d40 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a         KeyInfo *
10d50 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
10d60 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  e3KeyInfoFromExp
10d70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f  rList(pParse, pO
10d80 72 64 65 72 42 79 2c 20 30 2c 20 30 29 3b 0a 20  rderBy, 0, 0);. 
10d90 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71         addr = sq
10da0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
10db0 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72  v, OP_Compare, r
10dc0 65 67 4e 65 77 50 65 65 72 2c 20 72 65 67 50 65  egNewPeer, regPe
10dd0 65 72 2c 20 6e 50 65 65 72 29 3b 0a 20 20 20 20  er, nPeer);.    
10de0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10df0 70 70 65 6e 64 50 34 28 76 2c 20 28 76 6f 69 64  ppendP4(v, (void
10e00 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
10e10 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20  EYINFO);.       
10e20 20 61 64 64 72 4a 75 6d 70 20 3d 20 73 71 6c 69   addrJump = sqli
10e30 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
10e40 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 2b 32   OP_Jump, addr+2
10e50 2c 20 30 2c 20 61 64 64 72 2b 32 29 3b 0a 20 20  , 0, addr+2);.  
10e60 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
10e70 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ge(v);.      }el
10e80 73 65 7b 0a 20 20 20 20 20 20 20 20 61 64 64 72  se{.        addr
10e90 4a 75 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  Jump = 0;.      
10ea0 7d 0a 20 20 20 20 20 20 77 69 6e 64 6f 77 41 67  }.      windowAg
10eb0 67 46 69 6e 61 6c 28 70 50 61 72 73 65 2c 20 70  gFinal(pParse, p
10ec0 4d 57 69 6e 2c 20 70 4d 57 69 6e 2d 3e 65 53 74  MWin, pMWin->eSt
10ed0 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29  art==TK_CURRENT)
10ee0 3b 0a 20 20 20 20 20 20 69 66 28 20 61 64 64 72  ;.      if( addr
10ef0 47 6f 74 6f 20 29 20 73 71 6c 69 74 65 33 56 64  Goto ) sqlite3Vd
10f00 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
10f10 64 72 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a 0a  drGoto);.    }..
10f20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10f30 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
10f40 6e 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43  nd, pMWin->iEphC
10f50 73 72 2c 73 71 6c 69 74 65 33 56 64 62 65 43 75  sr,sqlite3VdbeCu
10f60 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b  rrentAddr(v)+3);
10f70 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
10f80 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
10f90 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10fa0 50 5f 47 6f 73 75 62 2c 20 72 65 67 47 6f 73 75  P_Gosub, regGosu
10fb0 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a 20  b, addrGosub);. 
10fc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10fd0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
10fe0 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c   pMWin->iEphCsr,
10ff0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
11000 65 6e 74 41 64 64 72 28 76 29 2d 31 29 3b 0a 20  entAddr(v)-1);. 
11010 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
11020 76 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  v);..    sqlite3
11030 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
11040 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20 70 4d  _ResetSorter, pM
11050 57 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20  Win->iEphCsr);. 
11060 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11070 64 4f 70 33 28 0a 20 20 20 20 20 20 20 20 76 2c  dOp3(.        v,
11080 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 2b 70 4d   OP_Copy, reg+pM
11090 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 2c  Win->nBufferCol,
110a0 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c   pMWin->regPart,
110b0 20 6e 50 61 72 74 2b 6e 50 65 65 72 2d 31 0a 20   nPart+nPeer-1. 
110c0 20 20 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 61     );..    if( a
110d0 64 64 72 4a 75 6d 70 20 29 20 73 71 6c 69 74 65  ddrJump ) sqlite
110e0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
110f0 20 61 64 64 72 4a 75 6d 70 29 3b 0a 20 20 7d 0a   addrJump);.  }.
11100 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 73 74 65  .  /* Invoke ste
11110 70 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 77  p function for w
11120 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
11130 2a 2f 0a 20 20 77 69 6e 64 6f 77 41 67 67 53 74  */.  windowAggSt
11140 65 70 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  ep(pParse, pMWin
11150 2c 20 2d 31 2c 20 30 2c 20 72 65 67 2c 20 30 29  , -1, 0, reg, 0)
11160 3b 0a 0a 20 20 2f 2a 20 42 75 66 66 65 72 20 74  ;..  /* Buffer t
11170 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69  he current row i
11180 6e 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20  n the ephemeral 
11190 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 69 66 28 20  table. */.  if( 
111a0 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f  pMWin->nBufferCo
111b0 6c 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  l>0 ){.    sqlit
111c0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
111d0 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
111e0 65 67 2c 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66  eg, pMWin->nBuff
111f0 65 72 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64  erCol, regRecord
11200 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
11210 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11220 32 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 30 2c  2(v, OP_Blob, 0,
11230 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20   regRecord);.   
11240 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65   sqlite3VdbeAppe
11250 6e 64 50 34 28 76 2c 20 28 76 6f 69 64 2a 29 22  ndP4(v, (void*)"
11260 22 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ", 0);.  }.  sql
11270 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11280 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70  , OP_NewRowid, p
11290 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 72  MWin->iEphCsr, r
112a0 65 67 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69  egRowid);.  sqli
112b0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
112c0 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 4d 57 69   OP_Insert, pMWi
112d0 6e 2d 3e 69 45 70 68 43 73 72 2c 20 72 65 67 52  n->iEphCsr, regR
112e0 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 69 64 29  ecord, regRowid)
112f0 3b 0a 0a 20 20 2f 2a 20 45 6e 64 20 74 68 65 20  ;..  /* End the 
11300 64 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f  database scan lo
11310 6f 70 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  op. */.  sqlite3
11320 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
11330 3b 0a 0a 20 20 77 69 6e 64 6f 77 41 67 67 46 69  ;..  windowAggFi
11340 6e 61 6c 28 70 50 61 72 73 65 2c 20 70 4d 57 69  nal(pParse, pMWi
11350 6e 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  n, 1);.  sqlite3
11360 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11370 5f 52 65 77 69 6e 64 2c 20 70 4d 57 69 6e 2d 3e  _Rewind, pMWin->
11380 69 45 70 68 43 73 72 2c 73 71 6c 69 74 65 33 56  iEphCsr,sqlite3V
11390 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
113a0 29 2b 33 29 3b 0a 20 20 56 64 62 65 43 6f 76 65  )+3);.  VdbeCove
113b0 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
113c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
113d0 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 47 6f 73  OP_Gosub, regGos
113e0 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a  ub, addrGosub);.
113f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11400 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
11410 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20  pMWin->iEphCsr, 
11420 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
11430 6e 74 41 64 64 72 28 76 29 2d 31 29 3b 0a 20 20  ntAddr(v)-1);.  
11440 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
11450 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
11460 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
11470 64 75 70 6c 69 63 61 74 65 20 6f 66 20 74 68 65  duplicate of the
11480 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 69   Window object i
11490 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65 0a  ndicated by the.
114a0 2a 2a 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  ** third argumen
114b0 74 2e 20 53 65 74 20 74 68 65 20 57 69 6e 64 6f  t. Set the Windo
114c0 77 2e 70 4f 77 6e 65 72 20 66 69 65 6c 64 20 6f  w.pOwner field o
114d0 66 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  f the new object
114e0 20 74 6f 0a 2a 2a 20 70 4f 77 6e 65 72 2e 0a 2a   to.** pOwner..*
114f0 2f 0a 57 69 6e 64 6f 77 20 2a 73 71 6c 69 74 65  /.Window *sqlite
11500 33 57 69 6e 64 6f 77 44 75 70 28 73 71 6c 69 74  3WindowDup(sqlit
11510 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4f  e3 *db, Expr *pO
11520 77 6e 65 72 2c 20 57 69 6e 64 6f 77 20 2a 70 29  wner, Window *p)
11530 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4e 65 77  {.  Window *pNew
11540 20 3d 20 30 3b 0a 20 20 69 66 28 20 41 4c 57 41   = 0;.  if( ALWA
11550 59 53 28 70 29 20 29 7b 0a 20 20 20 20 70 4e 65  YS(p) ){.    pNe
11560 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
11570 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
11580 6f 66 28 57 69 6e 64 6f 77 29 29 3b 0a 20 20 20  of(Window));.   
11590 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
115a0 20 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d     pNew->zName =
115b0 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
115c0 28 64 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a  (db, p->zName);.
115d0 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 46 69 6c        pNew->pFil
115e0 74 65 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ter = sqlite3Exp
115f0 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 46 69 6c  rDup(db, p->pFil
11600 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  ter, 0);.      p
11610 4e 65 77 2d 3e 70 46 75 6e 63 20 3d 20 70 2d 3e  New->pFunc = p->
11620 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 70 4e 65  pFunc;.      pNe
11630 77 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 3d 20  w->pPartition = 
11640 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
11650 75 70 28 64 62 2c 20 70 2d 3e 70 50 61 72 74 69  up(db, p->pParti
11660 74 69 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  tion, 0);.      
11670 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
11680 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
11690 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  Dup(db, p->pOrde
116a0 72 42 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  rBy, 0);.      p
116b0 4e 65 77 2d 3e 65 54 79 70 65 20 3d 20 70 2d 3e  New->eType = p->
116c0 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70 4e 65  eType;.      pNe
116d0 77 2d 3e 65 45 6e 64 20 3d 20 70 2d 3e 65 45 6e  w->eEnd = p->eEn
116e0 64 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 65  d;.      pNew->e
116f0 53 74 61 72 74 20 3d 20 70 2d 3e 65 53 74 61 72  Start = p->eStar
11700 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  t;.      pNew->p
11710 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 45  Start = sqlite3E
11720 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 53  xprDup(db, p->pS
11730 74 61 72 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  tart, 0);.      
11740 70 4e 65 77 2d 3e 70 45 6e 64 20 3d 20 73 71 6c  pNew->pEnd = sql
11750 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
11760 70 2d 3e 70 45 6e 64 2c 20 30 29 3b 0a 20 20 20  p->pEnd, 0);.   
11770 20 20 20 70 4e 65 77 2d 3e 70 4f 77 6e 65 72 20     pNew->pOwner 
11780 3d 20 70 4f 77 6e 65 72 3b 0a 20 20 20 20 7d 0a  = pOwner;.    }.
11790 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
117a0 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  w;.}../*.** Retu
117b0 72 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  rn a copy of the
117c0 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
117d0 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 73 20 70  Window objects p
117e0 61 73 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20  assed as the.** 
117f0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
11800 0a 2a 2f 0a 57 69 6e 64 6f 77 20 2a 73 71 6c 69  .*/.Window *sqli
11810 74 65 33 57 69 6e 64 6f 77 4c 69 73 74 44 75 70  te3WindowListDup
11820 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69  (sqlite3 *db, Wi
11830 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 57 69 6e 64  ndow *p){.  Wind
11840 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 57 69 6e 64  ow *pWin;.  Wind
11850 6f 77 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20  ow *pRet = 0;.  
11860 57 69 6e 64 6f 77 20 2a 2a 70 70 20 3d 20 26 70  Window **pp = &p
11870 52 65 74 3b 0a 0a 20 20 66 6f 72 28 70 57 69 6e  Ret;..  for(pWin
11880 3d 70 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70  =p; pWin; pWin=p
11890 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a  Win->pNextWin){.
118a0 20 20 20 20 2a 70 70 20 3d 20 73 71 6c 69 74 65      *pp = sqlite
118b0 33 57 69 6e 64 6f 77 44 75 70 28 64 62 2c 20 30  3WindowDup(db, 0
118c0 2c 20 70 57 69 6e 29 3b 0a 20 20 20 20 69 66 28  , pWin);.    if(
118d0 20 2a 70 70 3d 3d 30 20 29 20 62 72 65 61 6b 3b   *pp==0 ) break;
118e0 0a 20 20 20 20 70 70 20 3d 20 26 28 28 2a 70 70  .    pp = &((*pp
118f0 29 2d 3e 70 4e 65 78 74 57 69 6e 29 3b 0a 20 20  )->pNextWin);.  
11900 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  }..  return pRet
11910 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74  ;.}../*.** sqlit
11920 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 68  e3WhereBegin() h
11930 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
11940 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 53  called for the S
11950 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
11960 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74 68  .** passed as th
11970 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
11980 74 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  t when this func
11990 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 2e  tion is invoked.
119a0 20 49 74 20 67 65 6e 65 72 61 74 65 73 0a 2a 2a   It generates.**
119b0 20 63 6f 64 65 20 74 6f 20 70 6f 70 75 6c 61 74   code to populat
119c0 65 20 74 68 65 20 57 69 6e 64 6f 77 2e 72 65 67  e the Window.reg
119d0 52 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 20  Result register 
119e0 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77 20  for each window 
119f0 66 75 6e 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20  function and.** 
11a00 69 6e 76 6f 6b 65 20 74 68 65 20 73 75 62 2d 72  invoke the sub-r
11a10 6f 75 74 69 6e 65 20 61 74 20 69 6e 73 74 72 75  outine at instru
11a20 63 74 69 6f 6e 20 61 64 64 72 47 6f 73 75 62 20  ction addrGosub 
11a30 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 72 6f  once for each ro
11a40 77 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  w..** This funct
11a50 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c 69 74 65  ion calls sqlite
11a60 33 57 68 65 72 65 45 6e 64 28 29 20 62 65 66 6f  3WhereEnd() befo
11a70 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 0a 2a  re returning. .*
11a80 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69  /.void sqlite3Wi
11a90 6e 64 6f 77 43 6f 64 65 53 74 65 70 28 0a 20 20  ndowCodeStep(.  
11aa0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
11ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ac0 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
11ad0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
11ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11af0 20 20 20 20 20 20 2f 2a 20 52 65 77 72 69 74 74        /* Rewritt
11b00 65 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  en SELECT statem
11b10 65 6e 74 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ent */.  WhereIn
11b20 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 20  fo *pWInfo,     
11b30 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74           /* Cont
11b40 65 78 74 20 72 65 74 75 72 6e 65 64 20 62 79 20  ext returned by 
11b50 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
11b60 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  n() */.  int reg
11b70 47 6f 73 75 62 2c 20 20 20 20 20 20 20 20 20 20  Gosub,          
11b80 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
11b90 73 74 65 72 20 66 6f 72 20 4f 50 5f 47 6f 73 75  ster for OP_Gosu
11ba0 62 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 47  b */.  int addrG
11bb0 6f 73 75 62 20 20 20 20 20 20 20 20 20 20 20 20  osub            
11bc0 20 20 20 20 20 20 20 2f 2a 20 4f 50 5f 47 6f 73         /* OP_Gos
11bd0 75 62 20 68 65 72 65 20 74 6f 20 72 65 74 75 72  ub here to retur
11be0 6e 20 65 61 63 68 20 72 6f 77 20 2a 2f 0a 29 7b  n each row */.){
11bf0 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e  .  Window *pMWin
11c00 20 3d 20 70 2d 3e 70 57 69 6e 3b 0a 0a 20 20 2f   = p->pWin;..  /
11c10 2a 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65  * There are thre
11c20 65 20 64 69 66 66 65 72 65 6e 74 20 66 75 6e 63  e different func
11c30 74 69 6f 6e 73 20 74 68 61 74 20 6d 61 79 20 62  tions that may b
11c40 65 20 75 73 65 64 20 74 6f 20 64 6f 20 74 68 65  e used to do the
11c50 20 77 6f 72 6b 0a 20 20 2a 2a 20 6f 66 20 74 68   work.  ** of th
11c60 69 73 20 6f 6e 65 2c 20 64 65 70 65 6e 64 69 6e  is one, dependin
11c70 67 20 6f 6e 20 74 68 65 20 77 69 6e 64 6f 77 20  g on the window 
11c80 66 72 61 6d 65 20 61 6e 64 20 74 68 65 20 73 70  frame and the sp
11c90 65 63 69 66 69 63 20 62 75 69 6c 74 2d 69 6e 0a  ecific built-in.
11ca0 20 20 2a 2a 20 77 69 6e 64 6f 77 20 66 75 6e 63    ** window func
11cb0 74 69 6f 6e 73 20 75 73 65 64 20 28 69 66 20 61  tions used (if a
11cc0 6e 79 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77  ny)..  **.  ** w
11cd0 69 6e 64 6f 77 43 6f 64 65 52 6f 77 45 78 70 72  indowCodeRowExpr
11ce0 53 74 65 70 28 29 20 68 61 6e 64 6c 65 73 20 61  Step() handles a
11cf0 6c 6c 20 22 52 4f 57 53 22 20 77 69 6e 64 6f 77  ll "ROWS" window
11d00 20 66 72 61 6d 65 73 2c 20 65 78 63 65 70 74 20   frames, except 
11d10 66 6f 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  for:.  **.  **  
11d20 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20 55 4e   ROWS BETWEEN UN
11d30 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e  BOUNDED PRECEDIN
11d40 47 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f  G AND CURRENT RO
11d50 57 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  W.  **.  ** The 
11d60 65 78 63 65 70 74 69 6f 6e 20 69 73 20 62 65 63  exception is bec
11d70 61 75 73 65 20 77 69 6e 64 6f 77 43 6f 64 65 52  ause windowCodeR
11d80 6f 77 45 78 70 72 53 74 65 70 28 29 20 69 6d 70  owExprStep() imp
11d90 6c 65 6d 65 6e 74 73 20 61 6c 6c 20 77 69 6e 64  lements all wind
11da0 6f 77 0a 20 20 2a 2a 20 66 72 61 6d 65 20 74 79  ow.  ** frame ty
11db0 70 65 73 20 62 79 20 63 61 63 68 69 6e 67 20 74  pes by caching t
11dc0 68 65 20 65 6e 74 69 72 65 20 70 61 72 74 69 74  he entire partit
11dd0 69 6f 6e 20 69 6e 20 61 20 74 65 6d 70 20 74 61  ion in a temp ta
11de0 62 6c 65 2c 20 61 6e 64 0a 20 20 2a 2a 20 22 52  ble, and.  ** "R
11df0 4f 57 53 20 42 45 54 57 45 45 4e 20 55 4e 42 4f  OWS BETWEEN UNBO
11e00 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20  UNDED PRECEDING 
11e10 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 22  AND CURRENT ROW"
11e20 20 69 73 20 65 61 73 79 20 65 6e 6f 75 67 68 20   is easy enough 
11e30 74 6f 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e  to.  ** implemen
11e40 74 20 77 69 74 68 6f 75 74 20 73 75 63 68 20 61  t without such a
11e50 20 63 61 63 68 65 2e 0a 20 20 2a 2a 0a 20 20 2a   cache..  **.  *
11e60 2a 20 77 69 6e 64 6f 77 43 6f 64 65 43 61 63 68  * windowCodeCach
11e70 65 53 74 65 70 28 29 20 69 73 20 75 73 65 64 20  eStep() is used 
11e80 66 6f 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  for:.  **.  **  
11e90 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 43   RANGE BETWEEN C
11ea0 55 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 55  URRENT ROW AND U
11eb0 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49  NBOUNDED FOLLOWI
11ec0 4e 47 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 74 20  NG.  **.  ** It 
11ed0 69 73 20 61 6c 73 6f 20 75 73 65 64 20 66 6f 72  is also used for
11ee0 20 61 6e 79 74 68 69 6e 67 20 6e 6f 74 20 68 61   anything not ha
11ef0 6e 64 6c 65 64 20 62 79 20 77 69 6e 64 6f 77 43  ndled by windowC
11f00 6f 64 65 52 6f 77 45 78 70 72 53 74 65 70 28 29  odeRowExprStep()
11f10 20 0a 20 20 2a 2a 20 74 68 61 74 20 69 6e 76 6f   .  ** that invo
11f20 6b 65 73 20 61 20 62 75 69 6c 74 2d 69 6e 20 77  kes a built-in w
11f30 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 74  indow function t
11f40 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68 65  hat requires the
11f50 20 65 6e 74 69 72 65 20 0a 20 20 2a 2a 20 70 61   entire .  ** pa
11f60 72 74 69 74 69 6f 6e 20 74 6f 20 62 65 20 63 61  rtition to be ca
11f70 63 68 65 64 20 69 6e 20 61 20 74 65 6d 70 20 74  ched in a temp t
11f80 61 62 6c 65 20 62 65 66 6f 72 65 20 61 6e 79 20  able before any 
11f90 72 6f 77 73 20 61 72 65 20 72 65 74 75 72 6e 65  rows are returne
11fa0 64 0a 20 20 2a 2a 20 28 65 2e 67 2e 20 6e 74 68  d.  ** (e.g. nth
11fb0 5f 76 61 6c 75 65 28 29 20 6f 72 20 70 65 72 63  _value() or perc
11fc0 65 6e 74 5f 72 61 6e 6b 28 29 29 2e 0a 20 20 2a  ent_rank())..  *
11fd0 2a 0a 20 20 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20  *.  ** Finally, 
11fe0 61 73 73 75 6d 69 6e 67 20 74 68 65 72 65 20 69  assuming there i
11ff0 73 20 6e 6f 20 62 75 69 6c 74 2d 69 6e 20 77 69  s no built-in wi
12000 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 74 68  ndow function th
12010 61 74 20 72 65 71 75 69 72 65 73 0a 20 20 2a 2a  at requires.  **
12020 20 74 68 65 20 70 61 72 74 69 74 69 6f 6e 20 74   the partition t
12030 6f 20 62 65 20 63 61 63 68 65 64 2c 20 77 69 6e  o be cached, win
12040 64 6f 77 43 6f 64 65 44 65 66 61 75 6c 74 53 74  dowCodeDefaultSt
12050 65 70 28 29 20 69 73 20 75 73 65 64 20 66 6f 72  ep() is used for
12060 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 52 41  :.  **.  **   RA
12070 4e 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f  NGE BETWEEN UNBO
12080 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20  UNDED PRECEDING 
12090 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 20  AND CURRENT ROW 
120a0 0a 20 20 2a 2a 20 20 20 52 41 4e 47 45 20 42 45  .  **   RANGE BE
120b0 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20  TWEEN UNBOUNDED 
120c0 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 55 4e  PRECEDING AND UN
120d0 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e  BOUNDED FOLLOWIN
120e0 47 0a 20 20 2a 2a 20 20 20 52 41 4e 47 45 20 42  G.  **   RANGE B
120f0 45 54 57 45 45 4e 20 43 55 52 52 45 4e 54 20 52  ETWEEN CURRENT R
12100 4f 57 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52  OW AND CURRENT R
12110 4f 57 20 0a 20 20 2a 2a 20 20 20 52 4f 57 53 20  OW .  **   ROWS 
12120 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45  BETWEEN UNBOUNDE
12130 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20  D PRECEDING AND 
12140 43 55 52 52 45 4e 54 20 52 4f 57 0a 20 20 2a 2a  CURRENT ROW.  **
12150 0a 20 20 2a 2a 20 77 69 6e 64 6f 77 43 6f 64 65  .  ** windowCode
12160 44 65 66 61 75 6c 74 53 74 65 70 28 29 20 69 73  DefaultStep() is
12170 20 74 68 65 20 6f 6e 6c 79 20 6f 6e 65 20 6f 66   the only one of
12180 20 74 68 65 20 74 68 72 65 65 20 66 75 6e 63 74   the three funct
12190 69 6f 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 64  ions that.  ** d
121a0 6f 65 73 20 6e 6f 74 20 63 61 63 68 65 20 65 61  oes not cache ea
121b0 63 68 20 70 61 72 74 69 74 69 6f 6e 20 69 6e 20  ch partition in 
121c0 61 20 74 65 6d 70 20 74 61 62 6c 65 20 62 65 66  a temp table bef
121d0 6f 72 65 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f  ore beginning to
121e0 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 72 6f 77  .  ** return row
121f0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4d  s..  */.  if( pM
12200 57 69 6e 2d 3e 65 54 79 70 65 3d 3d 54 4b 5f 52  Win->eType==TK_R
12210 4f 57 53 20 0a 20 20 20 26 26 20 28 70 4d 57 69  OWS .   && (pMWi
12220 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b 5f 55 4e  n->eStart!=TK_UN
12230 42 4f 55 4e 44 45 44 7c 7c 70 4d 57 69 6e 2d 3e  BOUNDED||pMWin->
12240 65 45 6e 64 21 3d 54 4b 5f 43 55 52 52 45 4e 54  eEnd!=TK_CURRENT
12250 7c 7c 21 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72  ||!pMWin->pOrder
12260 42 79 29 0a 20 20 29 7b 0a 20 20 20 20 56 64 62  By).  ){.    Vdb
12270 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28  eModuleComment((
12280 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 22  pParse->pVdbe, "
12290 42 65 67 69 6e 20 52 6f 77 45 78 70 72 53 74 65  Begin RowExprSte
122a0 70 28 29 22 29 29 3b 0a 20 20 20 20 77 69 6e 64  p()"));.    wind
122b0 6f 77 43 6f 64 65 52 6f 77 45 78 70 72 53 74 65  owCodeRowExprSte
122c0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 57 49  p(pParse, p, pWI
122d0 6e 66 6f 2c 20 72 65 67 47 6f 73 75 62 2c 20 61  nfo, regGosub, a
122e0 64 64 72 47 6f 73 75 62 29 3b 0a 20 20 7d 65 6c  ddrGosub);.  }el
122f0 73 65 7b 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a  se{.    Window *
12300 70 57 69 6e 3b 0a 20 20 20 20 69 6e 74 20 62 43  pWin;.    int bC
12310 61 63 68 65 20 3d 20 30 3b 20 20 20 20 20 20 20  ache = 0;       
12320 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
12330 74 6f 20 75 73 65 20 43 61 63 68 65 53 74 65 70  to use CacheStep
12340 28 29 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70  () */..    if( p
12350 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
12360 5f 43 55 52 52 45 4e 54 20 26 26 20 70 4d 57 69  _CURRENT && pMWi
12370 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f  n->eEnd==TK_UNBO
12380 55 4e 44 45 44 20 29 7b 0a 20 20 20 20 20 20 62  UNDED ){.      b
12390 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 20 20 7d  Cache = 1;.    }
123a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28  else{.      for(
123b0 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e  pWin=pMWin; pWin
123c0 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65  ; pWin=pWin->pNe
123d0 78 74 57 69 6e 29 7b 0a 20 20 20 20 20 20 20 20  xtWin){.        
123e0 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20 3d  FuncDef *pFunc =
123f0 20 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20   pWin->pFunc;.  
12400 20 20 20 20 20 20 69 66 28 20 28 70 46 75 6e 63        if( (pFunc
12410 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
12420 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57  LITE_FUNC_WINDOW
12430 5f 53 49 5a 45 29 0a 20 20 20 20 20 20 20 20 20  _SIZE).         
12440 7c 7c 20 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65  || (pFunc->zName
12450 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 29  ==nth_valueName)
12460 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 46  .         || (pF
12470 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72 73  unc->zName==firs
12480 74 5f 76 61 6c 75 65 4e 61 6d 65 29 0a 20 20 20  t_valueName).   
12490 20 20 20 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d        || (pFunc-
124a0 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65  >zName==leadName
124b0 29 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70  ).         || (p
124c0 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 61 67  Func->zName==lag
124d0 4e 61 6d 65 29 0a 20 20 20 20 20 20 20 20 29 7b  Name).        ){
124e0 0a 20 20 20 20 20 20 20 20 20 20 62 43 61 63 68  .          bCach
124f0 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  e = 1;.         
12500 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
12510 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
12520 0a 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73  .    /* Otherwis
12530 65 2c 20 63 61 6c 6c 20 77 69 6e 64 6f 77 43 6f  e, call windowCo
12540 64 65 44 65 66 61 75 6c 74 53 74 65 70 28 29 2e  deDefaultStep().
12550 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 43 61    */.    if( bCa
12560 63 68 65 20 29 7b 0a 20 20 20 20 20 20 56 64 62  che ){.      Vdb
12570 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28  eModuleComment((
12580 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 22  pParse->pVdbe, "
12590 42 65 67 69 6e 20 43 61 63 68 65 53 74 65 70 28  Begin CacheStep(
125a0 29 22 29 29 3b 0a 20 20 20 20 20 20 77 69 6e 64  )"));.      wind
125b0 6f 77 43 6f 64 65 43 61 63 68 65 53 74 65 70 28  owCodeCacheStep(
125c0 70 50 61 72 73 65 2c 20 70 2c 20 70 57 49 6e 66  pParse, p, pWInf
125d0 6f 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64  o, regGosub, add
125e0 72 47 6f 73 75 62 29 3b 0a 20 20 20 20 7d 65 6c  rGosub);.    }el
125f0 73 65 7b 0a 20 20 20 20 20 20 56 64 62 65 4d 6f  se{.      VdbeMo
12600 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 70 50 61  duleComment((pPa
12610 72 73 65 2d 3e 70 56 64 62 65 2c 20 22 42 65 67  rse->pVdbe, "Beg
12620 69 6e 20 44 65 66 61 75 6c 74 53 74 65 70 28 29  in DefaultStep()
12630 22 29 29 3b 0a 20 20 20 20 20 20 77 69 6e 64 6f  "));.      windo
12640 77 43 6f 64 65 44 65 66 61 75 6c 74 53 74 65 70  wCodeDefaultStep
12650 28 70 50 61 72 73 65 2c 20 70 2c 20 70 57 49 6e  (pParse, p, pWIn
12660 66 6f 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64  fo, regGosub, ad
12670 64 72 47 6f 73 75 62 29 3b 0a 20 20 20 20 7d 0a  drGosub);.    }.
12680 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a    }.}..#endif /*
12690 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e   SQLITE_OMIT_WIN
126a0 44 4f 57 46 55 4e 43 20 2a 2f 0a                 DOWFUNC */.