/ Hex Artifact Content
Login

Artifact b444259848adb122bc991f73d74604a998ba96ec678a54e9ee9bd56bf10dc9b5:


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 7d 0a 73 74 61 74 69   (*p)++;.}.stati
16e0: 63 20 76 6f 69 64 20 72 6f 77 5f 6e 75 6d 62 65  c void row_numbe
16f0: 72 49 6e 76 46 75 6e 63 28 0a 20 20 73 71 6c 69  rInvFunc(.  sqli
1700: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
1710: 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  x, .  int nArg,.
1720: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
1730: 2a 2a 61 70 41 72 67 0a 29 7b 0a 7d 0a 73 74 61  **apArg.){.}.sta
1740: 74 69 63 20 76 6f 69 64 20 72 6f 77 5f 6e 75 6d  tic void row_num
1750: 62 65 72 56 61 6c 75 65 46 75 6e 63 28 73 71 6c  berValueFunc(sql
1760: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
1770: 74 78 29 7b 0a 20 20 69 36 34 20 2a 70 20 3d 20  tx){.  i64 *p = 
1780: 28 69 36 34 2a 29 73 71 6c 69 74 65 33 5f 61 67  (i64*)sqlite3_ag
1790: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
17a0: 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29  pCtx, sizeof(*p)
17b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
17c0: 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20  ult_int64(pCtx, 
17d0: 28 70 20 3f 20 2a 70 20 3a 20 30 29 29 3b 0a 7d  (p ? *p : 0));.}
17e0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65 78 74 20  ../*.** Context 
17f0: 6f 62 6a 65 63 74 20 74 79 70 65 20 75 73 65 64  object type used
1800: 20 62 79 20 72 61 6e 6b 28 29 2c 20 64 65 6e 73   by rank(), dens
1810: 65 5f 72 61 6e 6b 28 29 2c 20 70 65 72 63 65 6e  e_rank(), percen
1820: 74 5f 72 61 6e 6b 28 29 20 61 6e 64 0a 2a 2a 20  t_rank() and.** 
1830: 63 75 6d 65 5f 64 69 73 74 28 29 2e 0a 2a 2f 0a  cume_dist()..*/.
1840: 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74  struct CallCount
1850: 20 7b 0a 20 20 69 36 34 20 6e 56 61 6c 75 65 3b   {.  i64 nValue;
1860: 0a 20 20 69 36 34 20 6e 53 74 65 70 3b 0a 20 20  .  i64 nStep;.  
1870: 69 36 34 20 6e 54 6f 74 61 6c 3b 0a 7d 3b 0a 0a  i64 nTotal;.};..
1880: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
1890: 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74 2d 69 6e  tion of built-in
18a0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
18b0: 20 64 65 6e 73 65 5f 72 61 6e 6b 28 29 2e 20 41   dense_rank(). A
18c0: 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 74  ssumes that.** t
18d0: 68 65 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 20  he window frame 
18e0: 68 61 73 20 62 65 65 6e 20 73 65 74 20 74 6f 3a  has been set to:
18f0: 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e 47 45 20 42  .**.**   RANGE B
1900: 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44  ETWEEN UNBOUNDED
1910: 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 43   PRECEDING AND C
1920: 55 52 52 45 4e 54 20 52 4f 57 20 0a 2a 2f 0a 73  URRENT ROW .*/.s
1930: 74 61 74 69 63 20 76 6f 69 64 20 64 65 6e 73 65  tatic void dense
1940: 5f 72 61 6e 6b 53 74 65 70 46 75 6e 63 28 0a 20  _rankStepFunc(. 
1950: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
1960: 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
1970: 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
1980: 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a  alue **apArg.){.
1990: 20 20 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75    struct CallCou
19a0: 6e 74 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74  nt *p;.  p = (st
19b0: 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29  ruct CallCount*)
19c0: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
19d0: 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20  e_context(pCtx, 
19e0: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69  sizeof(*p));.  i
19f0: 66 28 20 70 20 29 20 70 2d 3e 6e 53 74 65 70 20  f( p ) p->nStep 
1a00: 3d 20 31 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  = 1;.}.static vo
1a10: 69 64 20 64 65 6e 73 65 5f 72 61 6e 6b 49 6e 76  id dense_rankInv
1a20: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
1a30: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
1a40: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
1a50: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
1a60: 41 72 67 0a 29 7b 0a 7d 0a 73 74 61 74 69 63 20  Arg.){.}.static 
1a70: 76 6f 69 64 20 64 65 6e 73 65 5f 72 61 6e 6b 56  void dense_rankV
1a80: 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33  alueFunc(sqlite3
1a90: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b  _context *pCtx){
1aa0: 0a 20 20 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  .  struct CallCo
1ab0: 75 6e 74 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73  unt *p;.  p = (s
1ac0: 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a  truct CallCount*
1ad0: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
1ae0: 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c  te_context(pCtx,
1af0: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
1b00: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  if( p ){.    if(
1b10: 20 70 2d 3e 6e 53 74 65 70 20 29 7b 0a 20 20 20   p->nStep ){.   
1b20: 20 20 20 70 2d 3e 6e 56 61 6c 75 65 2b 2b 3b 0a     p->nValue++;.
1b30: 20 20 20 20 20 20 70 2d 3e 6e 53 74 65 70 20 3d        p->nStep =
1b40: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   0;.    }.    sq
1b50: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
1b60: 36 34 28 70 43 74 78 2c 20 70 2d 3e 6e 56 61 6c  64(pCtx, p->nVal
1b70: 75 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ue);.  }.}../*.*
1b80: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
1b90: 20 6f 66 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e   of built-in win
1ba0: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 72 61 6e  dow function ran
1bb0: 6b 28 29 2e 20 41 73 73 75 6d 65 73 20 74 68 61  k(). Assumes tha
1bc0: 74 0a 2a 2a 20 74 68 65 20 77 69 6e 64 6f 77 20  t.** the window 
1bd0: 66 72 61 6d 65 20 68 61 73 20 62 65 65 6e 20 73  frame has been s
1be0: 65 74 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52  et to:.**.**   R
1bf0: 41 4e 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42  ANGE BETWEEN UNB
1c00: 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47  OUNDED PRECEDING
1c10: 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57   AND CURRENT ROW
1c20: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
1c30: 20 72 61 6e 6b 53 74 65 70 46 75 6e 63 28 0a 20   rankStepFunc(. 
1c40: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
1c50: 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
1c60: 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
1c70: 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a  alue **apArg.){.
1c80: 20 20 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75    struct CallCou
1c90: 6e 74 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74  nt *p;.  p = (st
1ca0: 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29  ruct CallCount*)
1cb0: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
1cc0: 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20  e_context(pCtx, 
1cd0: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69  sizeof(*p));.  i
1ce0: 66 28 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  f( p ){.    p->n
1cf0: 53 74 65 70 2b 2b 3b 0a 20 20 20 20 69 66 28 20  Step++;.    if( 
1d00: 70 2d 3e 6e 56 61 6c 75 65 3d 3d 30 20 29 7b 0a  p->nValue==0 ){.
1d10: 20 20 20 20 20 20 70 2d 3e 6e 56 61 6c 75 65 20        p->nValue 
1d20: 3d 20 70 2d 3e 6e 53 74 65 70 3b 0a 20 20 20 20  = p->nStep;.    
1d30: 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  }.  }.}.static v
1d40: 6f 69 64 20 72 61 6e 6b 49 6e 76 46 75 6e 63 28  oid rankInvFunc(
1d50: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
1d60: 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74  xt *pCtx, .  int
1d70: 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33   nArg,.  sqlite3
1d80: 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29  _value **apArg.)
1d90: 7b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  {.}.static void 
1da0: 72 61 6e 6b 56 61 6c 75 65 46 75 6e 63 28 73 71  rankValueFunc(sq
1db0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
1dc0: 43 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20 43  Ctx){.  struct C
1dd0: 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70  allCount *p;.  p
1de0: 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43   = (struct CallC
1df0: 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67  ount*)sqlite3_ag
1e00: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
1e10: 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29  pCtx, sizeof(*p)
1e20: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
1e30: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1e40: 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 70 2d 3e  _int64(pCtx, p->
1e50: 6e 56 61 6c 75 65 29 3b 0a 20 20 20 20 70 2d 3e  nValue);.    p->
1e60: 6e 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 7d 0a  nValue = 0;.  }.
1e70: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
1e80: 6e 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74  ntation of built
1e90: 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  -in window funct
1ea0: 69 6f 6e 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b  ion percent_rank
1eb0: 28 29 2e 20 41 73 73 75 6d 65 73 20 74 68 61 74  (). Assumes that
1ec0: 0a 2a 2a 20 74 68 65 20 77 69 6e 64 6f 77 20 66  .** the window f
1ed0: 72 61 6d 65 20 68 61 73 20 62 65 65 6e 20 73 65  rame has been se
1ee0: 74 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 41  t to:.**.**   RA
1ef0: 4e 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f  NGE BETWEEN UNBO
1f00: 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20  UNDED PRECEDING 
1f10: 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 20  AND CURRENT ROW 
1f20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1f30: 70 65 72 63 65 6e 74 5f 72 61 6e 6b 53 74 65 70  percent_rankStep
1f40: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
1f50: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
1f60: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
1f70: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
1f80: 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20  Arg.){.  struct 
1f90: 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20  CallCount *p;.  
1fa0: 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20  assert( nArg==1 
1fb0: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  );..  assert( sq
1fc0: 6c 69 74 65 33 56 64 62 65 41 73 73 65 72 74 41  lite3VdbeAssertA
1fd0: 67 67 43 6f 6e 74 65 78 74 28 70 43 74 78 29 20  ggContext(pCtx) 
1fe0: 29 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74  );.  p = (struct
1ff0: 20 43 61 6c 6c 43 6f 75 6e 74 2a 29 73 71 6c 69   CallCount*)sqli
2000: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
2010: 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65  ntext(pCtx, size
2020: 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 41  of(*p));.  if( A
2030: 4c 57 41 59 53 28 70 29 20 29 7b 0a 20 20 20 20  LWAYS(p) ){.    
2040: 69 66 28 20 70 2d 3e 6e 54 6f 74 61 6c 3d 3d 30  if( p->nTotal==0
2050: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 54 6f   ){.      p->nTo
2060: 74 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  tal = sqlite3_va
2070: 6c 75 65 5f 69 6e 74 36 34 28 61 70 41 72 67 5b  lue_int64(apArg[
2080: 30 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  0]);.    }.    p
2090: 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 20 20 20 20 69  ->nStep++;.    i
20a0: 66 28 20 70 2d 3e 6e 56 61 6c 75 65 3d 3d 30 20  f( p->nValue==0 
20b0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61 6c  ){.      p->nVal
20c0: 75 65 20 3d 20 70 2d 3e 6e 53 74 65 70 3b 0a 20  ue = p->nStep;. 
20d0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69     }.  }.}.stati
20e0: 63 20 76 6f 69 64 20 70 65 72 63 65 6e 74 5f 72  c void percent_r
20f0: 61 6e 6b 49 6e 76 46 75 6e 63 28 0a 20 20 73 71  ankInvFunc(.  sq
2100: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
2110: 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67  Ctx, .  int nArg
2120: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
2130: 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 7d 0a 73  e **apArg.){.}.s
2140: 74 61 74 69 63 20 76 6f 69 64 20 70 65 72 63 65  tatic void perce
2150: 6e 74 5f 72 61 6e 6b 56 61 6c 75 65 46 75 6e 63  nt_rankValueFunc
2160: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
2170: 20 2a 70 43 74 78 29 7b 0a 20 20 73 74 72 75 63   *pCtx){.  struc
2180: 74 20 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a  t CallCount *p;.
2190: 20 20 70 20 3d 20 28 73 74 72 75 63 74 20 43 61    p = (struct Ca
21a0: 6c 6c 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33  llCount*)sqlite3
21b0: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
21c0: 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28  xt(pCtx, sizeof(
21d0: 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b  *p));.  if( p ){
21e0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 54 6f 74  .    if( p->nTot
21f0: 61 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20 64 6f  al>1 ){.      do
2200: 75 62 6c 65 20 72 20 3d 20 28 64 6f 75 62 6c 65  uble r = (double
2210: 29 28 70 2d 3e 6e 56 61 6c 75 65 2d 31 29 20 2f  )(p->nValue-1) /
2220: 20 28 64 6f 75 62 6c 65 29 28 70 2d 3e 6e 54 6f   (double)(p->nTo
2230: 74 61 6c 2d 31 29 3b 0a 20 20 20 20 20 20 73 71  tal-1);.      sq
2240: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75  lite3_result_dou
2250: 62 6c 65 28 70 43 74 78 2c 20 72 29 3b 0a 20 20  ble(pCtx, r);.  
2260: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
2270: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f  qlite3_result_do
2280: 75 62 6c 65 28 70 43 74 78 2c 20 30 2e 30 29 3b  uble(pCtx, 0.0);
2290: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 56  .    }.    p->nV
22a0: 61 6c 75 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  alue = 0;.  }.}.
22b0: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
22c0: 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74 2d 69  ation of built-i
22d0: 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  n window functio
22e0: 6e 20 63 75 6d 65 5f 64 69 73 74 28 29 2e 20 41  n cume_dist(). A
22f0: 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 74  ssumes that.** t
2300: 68 65 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 20  he window frame 
2310: 68 61 73 20 62 65 65 6e 20 73 65 74 20 74 6f 3a  has been set to:
2320: 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e 47 45 20 42  .**.**   RANGE B
2330: 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44  ETWEEN UNBOUNDED
2340: 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 43   PRECEDING AND C
2350: 55 52 52 45 4e 54 20 52 4f 57 20 0a 2a 2f 0a 73  URRENT ROW .*/.s
2360: 74 61 74 69 63 20 76 6f 69 64 20 63 75 6d 65 5f  tatic void cume_
2370: 64 69 73 74 53 74 65 70 46 75 6e 63 28 0a 20 20  distStepFunc(.  
2380: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
2390: 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41  *pCtx, .  int nA
23a0: 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  rg,.  sqlite3_va
23b0: 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 20  lue **apArg.){. 
23c0: 20 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e   struct CallCoun
23d0: 74 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20  t *p;.  assert( 
23e0: 6e 41 72 67 3d 3d 31 20 29 3b 0a 0a 20 20 61 73  nArg==1 );..  as
23f0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62  sert( sqlite3Vdb
2400: 65 41 73 73 65 72 74 41 67 67 43 6f 6e 74 65 78  eAssertAggContex
2410: 74 28 70 43 74 78 29 20 29 3b 0a 20 20 70 20 3d  t(pCtx) );.  p =
2420: 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75   (struct CallCou
2430: 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72  nt*)sqlite3_aggr
2440: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43  egate_context(pC
2450: 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b  tx, sizeof(*p));
2460: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 29  .  if( ALWAYS(p)
2470: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e   ){.    if( p->n
2480: 54 6f 74 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  Total==0 ){.    
2490: 20 20 70 2d 3e 6e 54 6f 74 61 6c 20 3d 20 73 71    p->nTotal = sq
24a0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36  lite3_value_int6
24b0: 34 28 61 70 41 72 67 5b 30 5d 29 3b 0a 20 20 20  4(apArg[0]);.   
24c0: 20 7d 0a 20 20 20 20 70 2d 3e 6e 53 74 65 70 2b   }.    p->nStep+
24d0: 2b 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  +;.  }.}.static 
24e0: 76 6f 69 64 20 63 75 6d 65 5f 64 69 73 74 49 6e  void cume_distIn
24f0: 76 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  vFunc(.  sqlite3
2500: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20  _context *pCtx, 
2510: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73  .  int nArg,.  s
2520: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
2530: 70 41 72 67 0a 29 7b 0a 7d 0a 73 74 61 74 69 63  pArg.){.}.static
2540: 20 76 6f 69 64 20 63 75 6d 65 5f 64 69 73 74 56   void cume_distV
2550: 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33  alueFunc(sqlite3
2560: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b  _context *pCtx){
2570: 0a 20 20 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  .  struct CallCo
2580: 75 6e 74 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73  unt *p;.  p = (s
2590: 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a  truct CallCount*
25a0: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
25b0: 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c  te_context(pCtx,
25c0: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
25d0: 69 66 28 20 70 20 26 26 20 70 2d 3e 6e 54 6f 74  if( p && p->nTot
25e0: 61 6c 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65  al ){.    double
25f0: 20 72 20 3d 20 28 64 6f 75 62 6c 65 29 28 70 2d   r = (double)(p-
2600: 3e 6e 53 74 65 70 29 20 2f 20 28 64 6f 75 62 6c  >nStep) / (doubl
2610: 65 29 28 70 2d 3e 6e 54 6f 74 61 6c 29 3b 0a 20  e)(p->nTotal);. 
2620: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
2630: 74 5f 64 6f 75 62 6c 65 28 70 43 74 78 2c 20 72  t_double(pCtx, r
2640: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2650: 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 66  Context object f
2660: 6f 72 20 6e 74 69 6c 65 28 29 20 77 69 6e 64 6f  or ntile() windo
2670: 77 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  w function..*/.s
2680: 74 72 75 63 74 20 4e 74 69 6c 65 43 74 78 20 7b  truct NtileCtx {
2690: 0a 20 20 69 36 34 20 6e 54 6f 74 61 6c 3b 20 20  .  i64 nTotal;  
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b0: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 72 6f 77 73     /* Total rows
26c0: 20 69 6e 20 70 61 72 74 69 74 69 6f 6e 20 2a 2f   in partition */
26d0: 0a 20 20 69 36 34 20 6e 50 61 72 61 6d 3b 20 20  .  i64 nParam;  
26e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f0: 20 20 20 2f 2a 20 50 61 72 61 6d 65 74 65 72 20     /* Parameter 
2700: 70 61 73 73 65 64 20 74 6f 20 6e 74 69 6c 65 28  passed to ntile(
2710: 4e 29 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77  N) */.  i64 iRow
2720: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2730: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
2740: 6e 74 20 72 6f 77 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  nt row */.};../*
2750: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
2760: 6f 6e 20 6f 66 20 6e 74 69 6c 65 28 29 2e 20 54  on of ntile(). T
2770: 68 69 73 20 61 73 73 75 6d 65 73 20 74 68 61 74  his assumes that
2780: 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61 6d   the window fram
2790: 65 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 63 6f  e has.** been co
27a0: 65 72 63 65 64 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20  erced to:.**.** 
27b0: 20 20 52 4f 57 53 20 55 4e 42 4f 55 4e 44 45 44    ROWS UNBOUNDED
27c0: 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 43   PRECEDING AND C
27d0: 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2f 0a 73 74  URRENT ROW.*/.st
27e0: 61 74 69 63 20 76 6f 69 64 20 6e 74 69 6c 65 53  atic void ntileS
27f0: 74 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  tepFunc(.  sqlit
2800: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
2810: 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  , .  int nArg,. 
2820: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
2830: 2a 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72 75  *apArg.){.  stru
2840: 63 74 20 4e 74 69 6c 65 43 74 78 20 2a 70 3b 0a  ct NtileCtx *p;.
2850: 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d    assert( nArg==
2860: 32 20 29 3b 0a 20 20 70 20 3d 20 28 73 74 72 75  2 );.  p = (stru
2870: 63 74 20 4e 74 69 6c 65 43 74 78 2a 29 73 71 6c  ct NtileCtx*)sql
2880: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
2890: 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a  ontext(pCtx, siz
28a0: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20  eof(*p));.  if( 
28b0: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  p ){.    if( p->
28c0: 6e 54 6f 74 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  nTotal==0 ){.   
28d0: 20 20 20 70 2d 3e 6e 50 61 72 61 6d 20 3d 20 73     p->nParam = s
28e0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
28f0: 36 34 28 61 70 41 72 67 5b 30 5d 29 3b 0a 20 20  64(apArg[0]);.  
2900: 20 20 20 20 70 2d 3e 6e 54 6f 74 61 6c 20 3d 20      p->nTotal = 
2910: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
2920: 74 36 34 28 61 70 41 72 67 5b 31 5d 29 3b 0a 20  t64(apArg[1]);. 
2930: 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 50 61 72       if( p->nPar
2940: 61 6d 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  am<=0 ){.       
2950: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2960: 65 72 72 6f 72 28 0a 20 20 20 20 20 20 20 20 20  error(.         
2970: 20 20 20 70 43 74 78 2c 20 22 61 72 67 75 6d 65     pCtx, "argume
2980: 6e 74 20 6f 66 20 6e 74 69 6c 65 20 6d 75 73 74  nt of ntile must
2990: 20 62 65 20 61 20 70 6f 73 69 74 69 76 65 20 69   be a positive i
29a0: 6e 74 65 67 65 72 22 2c 20 2d 31 0a 20 20 20 20  nteger", -1.    
29b0: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
29c0: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 52 6f 77     }.    p->iRow
29d0: 2b 2b 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  ++;.  }.}.static
29e0: 20 76 6f 69 64 20 6e 74 69 6c 65 49 6e 76 46 75   void ntileInvFu
29f0: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
2a00: 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20  ntext *pCtx, .  
2a10: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69  int nArg,.  sqli
2a20: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72  te3_value **apAr
2a30: 67 0a 29 7b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  g.){.}.static vo
2a40: 69 64 20 6e 74 69 6c 65 56 61 6c 75 65 46 75 6e  id ntileValueFun
2a50: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
2a60: 74 20 2a 70 43 74 78 29 7b 0a 20 20 73 74 72 75  t *pCtx){.  stru
2a70: 63 74 20 4e 74 69 6c 65 43 74 78 20 2a 70 3b 0a  ct NtileCtx *p;.
2a80: 20 20 70 20 3d 20 28 73 74 72 75 63 74 20 4e 74    p = (struct Nt
2a90: 69 6c 65 43 74 78 2a 29 73 71 6c 69 74 65 33 5f  ileCtx*)sqlite3_
2aa0: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
2ab0: 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a  t(pCtx, sizeof(*
2ac0: 70 29 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20  p));.  if( p && 
2ad0: 70 2d 3e 6e 50 61 72 61 6d 3e 30 20 29 7b 0a 20  p->nParam>0 ){. 
2ae0: 20 20 20 69 6e 74 20 6e 53 69 7a 65 20 3d 20 28     int nSize = (
2af0: 70 2d 3e 6e 54 6f 74 61 6c 20 2f 20 70 2d 3e 6e  p->nTotal / p->n
2b00: 50 61 72 61 6d 29 3b 0a 20 20 20 20 69 66 28 20  Param);.    if( 
2b10: 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nSize==0 ){.    
2b20: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
2b30: 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 70 2d 3e  _int64(pCtx, p->
2b40: 69 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65  iRow);.    }else
2b50: 7b 0a 20 20 20 20 20 20 69 36 34 20 6e 4c 61 72  {.      i64 nLar
2b60: 67 65 20 3d 20 70 2d 3e 6e 54 6f 74 61 6c 20 2d  ge = p->nTotal -
2b70: 20 70 2d 3e 6e 50 61 72 61 6d 2a 6e 53 69 7a 65   p->nParam*nSize
2b80: 3b 0a 20 20 20 20 20 20 69 36 34 20 69 53 6d 61  ;.      i64 iSma
2b90: 6c 6c 20 3d 20 6e 4c 61 72 67 65 2a 28 6e 53 69  ll = nLarge*(nSi
2ba0: 7a 65 2b 31 29 3b 0a 20 20 20 20 20 20 69 36 34  ze+1);.      i64
2bb0: 20 69 52 6f 77 20 3d 20 70 2d 3e 69 52 6f 77 2d   iRow = p->iRow-
2bc0: 31 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  1;..      assert
2bd0: 28 20 28 6e 4c 61 72 67 65 2a 28 6e 53 69 7a 65  ( (nLarge*(nSize
2be0: 2b 31 29 20 2b 20 28 70 2d 3e 6e 50 61 72 61 6d  +1) + (p->nParam
2bf0: 2d 6e 4c 61 72 67 65 29 2a 6e 53 69 7a 65 29 3d  -nLarge)*nSize)=
2c00: 3d 70 2d 3e 6e 54 6f 74 61 6c 20 29 3b 0a 0a 20  =p->nTotal );.. 
2c10: 20 20 20 20 20 69 66 28 20 69 52 6f 77 3c 69 53       if( iRow<iS
2c20: 6d 61 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  mall ){.        
2c30: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
2c40: 6e 74 36 34 28 70 43 74 78 2c 20 31 20 2b 20 69  nt64(pCtx, 1 + i
2c50: 52 6f 77 2f 28 6e 53 69 7a 65 2b 31 29 29 3b 0a  Row/(nSize+1));.
2c60: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2c70: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
2c80: 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20  ult_int64(pCtx, 
2c90: 31 20 2b 20 6e 4c 61 72 67 65 20 2b 20 28 69 52  1 + nLarge + (iR
2ca0: 6f 77 2d 69 53 6d 61 6c 6c 29 2f 6e 53 69 7a 65  ow-iSmall)/nSize
2cb0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2cc0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
2cd0: 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 66 6f 72  ntext object for
2ce0: 20 6c 61 73 74 5f 76 61 6c 75 65 28 29 20 77 69   last_value() wi
2cf0: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ndow function..*
2d00: 2f 0a 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c  /.struct LastVal
2d10: 75 65 43 74 78 20 7b 0a 20 20 73 71 6c 69 74 65  ueCtx {.  sqlite
2d20: 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20  3_value *pVal;. 
2d30: 20 69 6e 74 20 6e 56 61 6c 3b 0a 7d 3b 0a 0a 2f   int nVal;.};../
2d40: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
2d50: 69 6f 6e 20 6f 66 20 6c 61 73 74 5f 76 61 6c 75  ion of last_valu
2d60: 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  e()..*/.static v
2d70: 6f 69 64 20 6c 61 73 74 5f 76 61 6c 75 65 53 74  oid last_valueSt
2d80: 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  epFunc(.  sqlite
2d90: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
2da0: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
2db0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
2dc0: 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63  apArg.){.  struc
2dd0: 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 20 2a  t LastValueCtx *
2de0: 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74  p;.  p = (struct
2df0: 20 4c 61 73 74 56 61 6c 75 65 43 74 78 2a 29 73   LastValueCtx*)s
2e00: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
2e10: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
2e20: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
2e30: 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( p ){.    sqlit
2e40: 65 33 5f 76 61 6c 75 65 5f 66 72 65 65 28 70 2d  e3_value_free(p-
2e50: 3e 70 56 61 6c 29 3b 0a 20 20 20 20 70 2d 3e 70  >pVal);.    p->p
2e60: 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  Val = sqlite3_va
2e70: 6c 75 65 5f 64 75 70 28 61 70 41 72 67 5b 30 5d  lue_dup(apArg[0]
2e80: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 56  );.    if( p->pV
2e90: 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  al==0 ){.      s
2ea0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
2eb0: 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29 3b  ror_nomem(pCtx);
2ec0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2ed0: 20 20 70 2d 3e 6e 56 61 6c 2b 2b 3b 0a 20 20 20    p->nVal++;.   
2ee0: 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20   }.  }.}.static 
2ef0: 76 6f 69 64 20 6c 61 73 74 5f 76 61 6c 75 65 49  void last_valueI
2f00: 6e 76 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  nvFunc(.  sqlite
2f10: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
2f20: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
2f30: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
2f40: 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63  apArg.){.  struc
2f50: 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 20 2a  t LastValueCtx *
2f60: 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74  p;.  p = (struct
2f70: 20 4c 61 73 74 56 61 6c 75 65 43 74 78 2a 29 73   LastValueCtx*)s
2f80: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
2f90: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
2fa0: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
2fb0: 28 20 41 4c 57 41 59 53 28 70 29 20 29 7b 0a 20  ( ALWAYS(p) ){. 
2fc0: 20 20 20 70 2d 3e 6e 56 61 6c 2d 2d 3b 0a 20 20     p->nVal--;.  
2fd0: 20 20 69 66 28 20 70 2d 3e 6e 56 61 6c 3d 3d 30    if( p->nVal==0
2fe0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2ff0: 33 5f 76 61 6c 75 65 5f 66 72 65 65 28 70 2d 3e  3_value_free(p->
3000: 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 70 2d 3e  pVal);.      p->
3010: 70 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pVal = 0;.    }.
3020: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
3030: 64 20 6c 61 73 74 5f 76 61 6c 75 65 56 61 6c 75  d last_valueValu
3040: 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  eFunc(sqlite3_co
3050: 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20 20  ntext *pCtx){.  
3060: 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75 65  struct LastValue
3070: 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73  Ctx *p;.  p = (s
3080: 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75 65 43  truct LastValueC
3090: 74 78 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72  tx*)sqlite3_aggr
30a0: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43  egate_context(pC
30b0: 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b  tx, sizeof(*p));
30c0: 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 70  .  if( p && p->p
30d0: 56 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Val ){.    sqlit
30e0: 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28  e3_result_value(
30f0: 70 43 74 78 2c 20 70 2d 3e 70 56 61 6c 29 3b 0a  pCtx, p->pVal);.
3100: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
3110: 64 20 6c 61 73 74 5f 76 61 6c 75 65 46 69 6e 61  d last_valueFina
3120: 6c 69 7a 65 46 75 6e 63 28 73 71 6c 69 74 65 33  lizeFunc(sqlite3
3130: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b  _context *pCtx){
3140: 0a 20 20 73 74 72 75 63 74 20 4c 61 73 74 56 61  .  struct LastVa
3150: 6c 75 65 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d  lueCtx *p;.  p =
3160: 20 28 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c   (struct LastVal
3170: 75 65 43 74 78 2a 29 73 71 6c 69 74 65 33 5f 61  ueCtx*)sqlite3_a
3180: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
3190: 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70  (pCtx, sizeof(*p
31a0: 29 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70  ));.  if( p && p
31b0: 2d 3e 70 56 61 6c 20 29 7b 0a 20 20 20 20 73 71  ->pVal ){.    sq
31c0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c  lite3_result_val
31d0: 75 65 28 70 43 74 78 2c 20 70 2d 3e 70 56 61 6c  ue(pCtx, p->pVal
31e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  );.    sqlite3_v
31f0: 61 6c 75 65 5f 66 72 65 65 28 70 2d 3e 70 56 61  alue_free(p->pVa
3200: 6c 29 3b 0a 20 20 20 20 70 2d 3e 70 56 61 6c 20  l);.    p->pVal 
3210: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
3220: 2a 20 4e 6f 2d 6f 70 20 69 6d 70 6c 65 6d 65 6e  * No-op implemen
3230: 74 61 74 69 6f 6e 73 20 6f 66 20 6e 74 68 5f 76  tations of nth_v
3240: 61 6c 75 65 28 29 2c 20 66 69 72 73 74 5f 76 61  alue(), first_va
3250: 6c 75 65 28 29 2c 20 6c 65 61 64 28 29 20 61 6e  lue(), lead() an
3260: 64 20 6c 61 67 28 29 2e 0a 2a 2a 20 54 68 65 73  d lag()..** Thes
3270: 65 20 61 72 65 20 61 6c 6c 20 69 6d 70 6c 65 6d  e are all implem
3280: 65 6e 74 65 64 20 69 6e 6c 69 6e 65 20 75 73 69  ented inline usi
3290: 6e 67 20 56 44 42 45 20 69 6e 73 74 72 75 63 74  ng VDBE instruct
32a0: 69 6f 6e 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  ions. .*/.static
32b0: 20 76 6f 69 64 20 6e 74 68 5f 76 61 6c 75 65 53   void nth_valueS
32c0: 74 65 70 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  tepFunc(sqlite3_
32d0: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 69  context *pCtx, i
32e0: 6e 74 20 6e 2c 20 73 71 6c 69 74 65 33 5f 76 61  nt n, sqlite3_va
32f0: 6c 75 65 20 2a 2a 61 29 7b 7d 0a 73 74 61 74 69  lue **a){}.stati
3300: 63 20 76 6f 69 64 20 6e 74 68 5f 76 61 6c 75 65  c void nth_value
3310: 49 6e 76 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  InvFunc(sqlite3_
3320: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 69  context *pCtx, i
3330: 6e 74 20 6e 2c 20 73 71 6c 69 74 65 33 5f 76 61  nt n, sqlite3_va
3340: 6c 75 65 20 2a 2a 61 70 29 7b 7d 0a 73 74 61 74  lue **ap){}.stat
3350: 69 63 20 76 6f 69 64 20 6e 74 68 5f 76 61 6c 75  ic void nth_valu
3360: 65 56 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74  eValueFunc(sqlit
3370: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
3380: 29 7b 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ){}.static void 
3390: 66 69 72 73 74 5f 76 61 6c 75 65 53 74 65 70 46  first_valueStepF
33a0: 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
33b0: 65 78 74 20 2a 70 2c 20 69 6e 74 20 6e 2c 20 73  ext *p, int n, s
33c0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
33d0: 70 29 7b 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  p){}.static void
33e0: 20 66 69 72 73 74 5f 76 61 6c 75 65 49 6e 76 46   first_valueInvF
33f0: 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
3400: 65 78 74 20 2a 70 2c 20 69 6e 74 20 6e 2c 20 73  ext *p, int n, s
3410: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
3420: 70 29 7b 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  p){}.static void
3430: 20 66 69 72 73 74 5f 76 61 6c 75 65 56 61 6c 75   first_valueValu
3440: 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  eFunc(sqlite3_co
3450: 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 7d 0a 73  ntext *pCtx){}.s
3460: 74 61 74 69 63 20 76 6f 69 64 20 6c 65 61 64 53  tatic void leadS
3470: 74 65 70 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  tepFunc(sqlite3_
3480: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 69  context *pCtx, i
3490: 6e 74 20 6e 2c 20 73 71 6c 69 74 65 33 5f 76 61  nt n, sqlite3_va
34a0: 6c 75 65 20 2a 2a 61 70 29 7b 7d 0a 73 74 61 74  lue **ap){}.stat
34b0: 69 63 20 76 6f 69 64 20 6c 65 61 64 49 6e 76 46  ic void leadInvF
34c0: 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
34d0: 65 78 74 20 2a 70 43 74 78 2c 20 69 6e 74 20 6e  ext *pCtx, int n
34e0: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
34f0: 2a 2a 61 70 29 7b 7d 0a 73 74 61 74 69 63 20 76  **ap){}.static v
3500: 6f 69 64 20 6c 65 61 64 56 61 6c 75 65 46 75 6e  oid leadValueFun
3510: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
3520: 74 20 2a 70 43 74 78 29 7b 7d 0a 73 74 61 74 69  t *pCtx){}.stati
3530: 63 20 76 6f 69 64 20 6c 61 67 53 74 65 70 46 75  c void lagStepFu
3540: 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  nc(sqlite3_conte
3550: 78 74 20 2a 70 43 74 78 2c 20 69 6e 74 20 6e 2c  xt *pCtx, int n,
3560: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
3570: 2a 61 70 29 7b 7d 0a 73 74 61 74 69 63 20 76 6f  *ap){}.static vo
3580: 69 64 20 6c 61 67 49 6e 76 46 75 6e 63 28 73 71  id lagInvFunc(sq
3590: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
35a0: 43 74 78 2c 20 69 6e 74 20 6e 2c 20 73 71 6c 69  Ctx, int n, sqli
35b0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 29 7b  te3_value **ap){
35c0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 61  }.static void la
35d0: 67 56 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74  gValueFunc(sqlit
35e0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
35f0: 29 7b 7d 0a 0a 23 64 65 66 69 6e 65 20 57 49 4e  ){}..#define WIN
3600: 44 4f 57 46 55 4e 43 28 6e 61 6d 65 2c 6e 41 72  DOWFUNC(name,nAr
3610: 67 2c 65 78 74 72 61 29 20 7b 20 20 20 20 20 20  g,extra) {      
3620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3640: 5c 0a 20 20 6e 41 72 67 2c 20 28 53 51 4c 49 54  \.  nArg, (SQLIT
3650: 45 5f 55 54 46 38 7c 53 51 4c 49 54 45 5f 46 55  E_UTF8|SQLITE_FU
3660: 4e 43 5f 57 49 4e 44 4f 57 7c 65 78 74 72 61 29  NC_WINDOW|extra)
3670: 2c 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 20  , 0, 0,         
3680: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
3690: 20 6e 61 6d 65 20 23 23 20 53 74 65 70 46 75 6e   name ## StepFun
36a0: 63 2c 20 6e 61 6d 65 20 23 23 20 56 61 6c 75 65  c, name ## Value
36b0: 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20 56 61  Func, name ## Va
36c0: 6c 75 65 46 75 6e 63 2c 20 20 20 20 20 20 20 20  lueFunc,        
36d0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6e 61            \.  na
36e0: 6d 65 20 23 23 20 49 6e 76 46 75 6e 63 2c 20 23  me ## InvFunc, #
36f0: 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  name            
3700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3720: 20 20 20 5c 0a 7d 0a 0a 23 64 65 66 69 6e 65 20     \.}..#define 
3730: 57 49 4e 44 4f 57 46 55 4e 43 46 28 6e 61 6d 65  WINDOWFUNCF(name
3740: 2c 6e 41 72 67 2c 65 78 74 72 61 29 20 7b 20 20  ,nArg,extra) {  
3750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3770: 20 20 20 5c 0a 20 20 6e 41 72 67 2c 20 28 53 51     \.  nArg, (SQ
3780: 4c 49 54 45 5f 55 54 46 38 7c 53 51 4c 49 54 45  LITE_UTF8|SQLITE
3790: 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 7c 65 78 74  _FUNC_WINDOW|ext
37a0: 72 61 29 2c 20 30 2c 20 30 2c 20 20 20 20 20 20  ra), 0, 0,      
37b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37c0: 5c 0a 20 20 6e 61 6d 65 20 23 23 20 53 74 65 70  \.  name ## Step
37d0: 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20 46 69  Func, name ## Fi
37e0: 6e 61 6c 69 7a 65 46 75 6e 63 2c 20 6e 61 6d 65  nalizeFunc, name
37f0: 20 23 23 20 56 61 6c 75 65 46 75 6e 63 2c 20 20   ## ValueFunc,  
3800: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
3810: 20 6e 61 6d 65 20 23 23 20 49 6e 76 46 75 6e 63   name ## InvFunc
3820: 2c 20 23 6e 61 6d 65 20 20 20 20 20 20 20 20 20  , #name         
3830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3850: 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a        \.}../*.**
3860: 20 52 65 67 69 73 74 65 72 20 74 68 6f 73 65 20   Register those 
3870: 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20  built-in window 
3880: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 61  functions that a
3890: 72 65 20 6e 6f 74 20 61 6c 73 6f 20 61 67 67 72  re not also aggr
38a0: 65 67 61 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  egates..*/.void 
38b0: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 46 75 6e  sqlite3WindowFun
38c0: 63 74 69 6f 6e 73 28 76 6f 69 64 29 7b 0a 20 20  ctions(void){.  
38d0: 73 74 61 74 69 63 20 46 75 6e 63 44 65 66 20 61  static FuncDef a
38e0: 57 69 6e 64 6f 77 46 75 6e 63 73 5b 5d 20 3d 20  WindowFuncs[] = 
38f0: 7b 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43  {.    WINDOWFUNC
3900: 28 72 6f 77 5f 6e 75 6d 62 65 72 2c 20 30 2c 20  (row_number, 0, 
3910: 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46 55  0),.    WINDOWFU
3920: 4e 43 28 64 65 6e 73 65 5f 72 61 6e 6b 2c 20 30  NC(dense_rank, 0
3930: 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57  , 0),.    WINDOW
3940: 46 55 4e 43 28 72 61 6e 6b 2c 20 30 2c 20 30 29  FUNC(rank, 0, 0)
3950: 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43  ,.    WINDOWFUNC
3960: 28 70 65 72 63 65 6e 74 5f 72 61 6e 6b 2c 20 30  (percent_rank, 0
3970: 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49  , SQLITE_FUNC_WI
3980: 4e 44 4f 57 5f 53 49 5a 45 29 2c 0a 20 20 20 20  NDOW_SIZE),.    
3990: 57 49 4e 44 4f 57 46 55 4e 43 28 63 75 6d 65 5f  WINDOWFUNC(cume_
39a0: 64 69 73 74 2c 20 30 2c 20 53 51 4c 49 54 45 5f  dist, 0, SQLITE_
39b0: 46 55 4e 43 5f 57 49 4e 44 4f 57 5f 53 49 5a 45  FUNC_WINDOW_SIZE
39c0: 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e  ),.    WINDOWFUN
39d0: 43 28 6e 74 69 6c 65 2c 20 31 2c 20 53 51 4c 49  C(ntile, 1, SQLI
39e0: 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 5f 53  TE_FUNC_WINDOW_S
39f0: 49 5a 45 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57  IZE),.    WINDOW
3a00: 46 55 4e 43 46 28 6c 61 73 74 5f 76 61 6c 75 65  FUNCF(last_value
3a10: 2c 20 31 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e  , 1, 0),.    WIN
3a20: 44 4f 57 46 55 4e 43 28 6e 74 68 5f 76 61 6c 75  DOWFUNC(nth_valu
3a30: 65 2c 20 32 2c 20 30 29 2c 0a 20 20 20 20 57 49  e, 2, 0),.    WI
3a40: 4e 44 4f 57 46 55 4e 43 28 66 69 72 73 74 5f 76  NDOWFUNC(first_v
3a50: 61 6c 75 65 2c 20 31 2c 20 30 29 2c 0a 20 20 20  alue, 1, 0),.   
3a60: 20 57 49 4e 44 4f 57 46 55 4e 43 28 6c 65 61 64   WINDOWFUNC(lead
3a70: 2c 20 31 2c 20 30 29 2c 20 57 49 4e 44 4f 57 46  , 1, 0), WINDOWF
3a80: 55 4e 43 28 6c 65 61 64 2c 20 32 2c 20 30 29 2c  UNC(lead, 2, 0),
3a90: 20 57 49 4e 44 4f 57 46 55 4e 43 28 6c 65 61 64   WINDOWFUNC(lead
3aa0: 2c 20 33 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e  , 3, 0),.    WIN
3ab0: 44 4f 57 46 55 4e 43 28 6c 61 67 2c 20 31 2c 20  DOWFUNC(lag, 1, 
3ac0: 30 29 2c 20 20 57 49 4e 44 4f 57 46 55 4e 43 28  0),  WINDOWFUNC(
3ad0: 6c 61 67 2c 20 32 2c 20 30 29 2c 20 20 57 49 4e  lag, 2, 0),  WIN
3ae0: 44 4f 57 46 55 4e 43 28 6c 61 67 2c 20 33 2c 20  DOWFUNC(lag, 3, 
3af0: 30 29 2c 0a 20 20 7d 3b 0a 20 20 73 71 6c 69 74  0),.  };.  sqlit
3b00: 65 33 49 6e 73 65 72 74 42 75 69 6c 74 69 6e 46  e3InsertBuiltinF
3b10: 75 6e 63 73 28 61 57 69 6e 64 6f 77 46 75 6e 63  uncs(aWindowFunc
3b20: 73 2c 20 41 72 72 61 79 53 69 7a 65 28 61 57 69  s, ArraySize(aWi
3b30: 6e 64 6f 77 46 75 6e 63 73 29 29 3b 0a 7d 0a 0a  ndowFuncs));.}..
3b40: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
3b50: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 69 6d  ion is called im
3b60: 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
3b70: 72 65 73 6f 6c 76 69 6e 67 20 74 68 65 20 66 75  resolving the fu
3b80: 6e 63 74 69 6f 6e 20 6e 61 6d 65 0a 2a 2a 20 66  nction name.** f
3b90: 6f 72 20 61 20 77 69 6e 64 6f 77 20 66 75 6e 63  or a window func
3ba0: 74 69 6f 6e 20 77 69 74 68 69 6e 20 61 20 53 45  tion within a SE
3bb0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
3bc0: 41 72 67 75 6d 65 6e 74 20 70 4c 69 73 74 20 69  Argument pList i
3bd0: 73 20 61 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69  s a.** linked li
3be0: 73 74 20 6f 66 20 57 49 4e 44 4f 57 20 64 65 66  st of WINDOW def
3bf0: 69 6e 69 74 69 6f 6e 73 20 66 6f 72 20 74 68 65  initions for the
3c00: 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
3c10: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 41 72  statement..** Ar
3c20: 67 75 6d 65 6e 74 20 70 46 75 6e 63 20 69 73 20  gument pFunc is 
3c30: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 65 66  the function def
3c40: 69 6e 69 74 69 6f 6e 20 6a 75 73 74 20 72 65 73  inition just res
3c50: 6f 6c 76 65 64 20 61 6e 64 20 70 57 69 6e 0a 2a  olved and pWin.*
3c60: 2a 20 69 73 20 74 68 65 20 57 69 6e 64 6f 77 20  * is the Window 
3c70: 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74  object represent
3c80: 69 6e 67 20 74 68 65 20 61 73 73 6f 63 69 61 74  ing the associat
3c90: 65 64 20 4f 56 45 52 20 63 6c 61 75 73 65 2e 20  ed OVER clause. 
3ca0: 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
3cb0: 20 75 70 64 61 74 65 73 20 74 68 65 20 63 6f 6e   updates the con
3cc0: 74 65 6e 74 73 20 6f 66 20 70 57 69 6e 20 61 73  tents of pWin as
3cd0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
3ce0: 20 20 2a 20 49 66 20 74 68 65 20 4f 56 45 52 20    * If the OVER 
3cf0: 63 6c 61 75 73 65 20 72 65 66 65 72 65 64 20 74  clause refered t
3d00: 6f 20 61 20 6e 61 6d 65 64 20 77 69 6e 64 6f 77  o a named window
3d10: 20 28 61 73 20 69 6e 20 22 6d 61 78 28 78 29 20   (as in "max(x) 
3d20: 4f 56 45 52 20 77 69 6e 22 29 2c 0a 2a 2a 20 20  OVER win"),.**  
3d30: 20 20 20 73 65 61 72 63 68 20 6c 69 73 74 20 70     search list p
3d40: 4c 69 73 74 20 66 6f 72 20 61 20 6d 61 74 63 68  List for a match
3d50: 69 6e 67 20 57 49 4e 44 4f 57 20 64 65 66 69 6e  ing WINDOW defin
3d60: 69 74 69 6f 6e 2c 20 61 6e 64 20 75 70 64 61 74  ition, and updat
3d70: 65 20 70 57 69 6e 0a 2a 2a 20 20 20 20 20 61 63  e pWin.**     ac
3d80: 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20 6e 6f  cordingly. If no
3d90: 20 73 75 63 68 20 57 49 4e 44 4f 57 20 63 6c 61   such WINDOW cla
3da0: 75 73 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  use can be found
3db0: 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
3dc0: 0a 2a 2a 20 20 20 20 20 69 6e 20 70 50 61 72 73  .**     in pPars
3dd0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20  e..**.**   * If 
3de0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  the function is 
3df0: 61 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  a built-in windo
3e00: 77 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  w function that 
3e10: 72 65 71 75 69 72 65 73 20 74 68 65 0a 2a 2a 20  requires the.** 
3e20: 20 20 20 20 77 69 6e 64 6f 77 20 74 6f 20 62 65      window to be
3e30: 20 63 6f 65 72 63 65 64 20 28 73 65 65 20 22 42   coerced (see "B
3e40: 55 49 4c 54 2d 49 4e 20 57 49 4e 44 4f 57 20 46  UILT-IN WINDOW F
3e50: 55 4e 43 54 49 4f 4e 53 22 20 61 74 20 74 68 65  UNCTIONS" at the
3e60: 20 74 6f 70 0a 2a 2a 20 20 20 20 20 6f 66 20 74   top.**     of t
3e70: 68 69 73 20 66 69 6c 65 29 2c 20 70 57 69 6e 20  his file), pWin 
3e80: 69 73 20 75 70 64 61 74 65 64 20 68 65 72 65 2e  is updated here.
3e90: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3ea0: 57 69 6e 64 6f 77 55 70 64 61 74 65 28 0a 20 20  WindowUpdate(.  
3eb0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a  Parse *pParse, .
3ec0: 20 20 57 69 6e 64 6f 77 20 2a 70 4c 69 73 74 2c    Window *pList,
3ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ee0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6e 61 6d    /* List of nam
3ef0: 65 64 20 77 69 6e 64 6f 77 73 20 66 6f 72 20 74  ed windows for t
3f00: 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  his SELECT */.  
3f10: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 2c 20 20 20  Window *pWin,   
3f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f30: 2f 2a 20 57 69 6e 64 6f 77 20 66 72 61 6d 65 20  /* Window frame 
3f40: 74 6f 20 75 70 64 61 74 65 20 2a 2f 0a 20 20 46  to update */.  F
3f50: 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20 20 20  uncDef *pFunc   
3f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3f70: 2a 20 57 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  * Window functio
3f80: 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 2a 2f 0a  n definition */.
3f90: 29 7b 0a 20 20 69 66 28 20 70 57 69 6e 2d 3e 7a  ){.  if( pWin->z
3fa0: 4e 61 6d 65 20 26 26 20 70 57 69 6e 2d 3e 65 54  Name && pWin->eT
3fb0: 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 57 69  ype==0 ){.    Wi
3fc0: 6e 64 6f 77 20 2a 70 3b 0a 20 20 20 20 66 6f 72  ndow *p;.    for
3fd0: 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70  (p=pList; p; p=p
3fe0: 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20  ->pNextWin){.   
3ff0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
4000: 72 49 43 6d 70 28 70 2d 3e 7a 4e 61 6d 65 2c 20  rICmp(p->zName, 
4010: 70 57 69 6e 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20  pWin->zName)==0 
4020: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
4030: 20 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20     if( p==0 ){. 
4040: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
4050: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
4060: 20 73 75 63 68 20 77 69 6e 64 6f 77 3a 20 25 73   such window: %s
4070: 22 2c 20 70 57 69 6e 2d 3e 7a 4e 61 6d 65 29 3b  ", pWin->zName);
4080: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
4090: 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 2d 3e 70     }.    pWin->p
40a0: 50 61 72 74 69 74 69 6f 6e 20 3d 20 73 71 6c 69  Partition = sqli
40b0: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70  te3ExprListDup(p
40c0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 50  Parse->db, p->pP
40d0: 61 72 74 69 74 69 6f 6e 2c 20 30 29 3b 0a 20 20  artition, 0);.  
40e0: 20 20 70 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79    pWin->pOrderBy
40f0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
4100: 73 74 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  stDup(pParse->db
4110: 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 30  , p->pOrderBy, 0
4120: 29 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70 53 74  );.    pWin->pSt
4130: 61 72 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  art = sqlite3Exp
4140: 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
4150: 20 70 2d 3e 70 53 74 61 72 74 2c 20 30 29 3b 0a   p->pStart, 0);.
4160: 20 20 20 20 70 57 69 6e 2d 3e 70 45 6e 64 20 3d      pWin->pEnd =
4170: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
4180: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70  pParse->db, p->p
4190: 45 6e 64 2c 20 30 29 3b 0a 20 20 20 20 70 57 69  End, 0);.    pWi
41a0: 6e 2d 3e 65 53 74 61 72 74 20 3d 20 70 2d 3e 65  n->eStart = p->e
41b0: 53 74 61 72 74 3b 0a 20 20 20 20 70 57 69 6e 2d  Start;.    pWin-
41c0: 3e 65 45 6e 64 20 3d 20 70 2d 3e 65 45 6e 64 3b  >eEnd = p->eEnd;
41d0: 0a 20 20 20 20 70 57 69 6e 2d 3e 65 54 79 70 65  .    pWin->eType
41e0: 20 3d 20 70 2d 3e 65 54 79 70 65 3b 0a 20 20 7d   = p->eType;.  }
41f0: 0a 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 66 75  .  if( pFunc->fu
4200: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
4210: 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 20 29 7b 0a  _FUNC_WINDOW ){.
4220: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
4230: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
4240: 20 20 69 66 28 20 70 57 69 6e 2d 3e 70 46 69 6c    if( pWin->pFil
4250: 74 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ter ){.      sql
4260: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
4270: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
4280: 22 46 49 4c 54 45 52 20 63 6c 61 75 73 65 20 6d  "FILTER clause m
4290: 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20  ay only be used 
42a0: 77 69 74 68 20 61 67 67 72 65 67 61 74 65 20 77  with aggregate w
42b0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 22  indow functions"
42c0: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 65  .      );.    }e
42d0: 6c 73 65 0a 20 20 20 20 69 66 28 20 70 46 75 6e  lse.    if( pFun
42e0: 63 2d 3e 78 53 46 75 6e 63 3d 3d 72 6f 77 5f 6e  c->xSFunc==row_n
42f0: 75 6d 62 65 72 53 74 65 70 46 75 6e 63 20 7c 7c  umberStepFunc ||
4300: 20 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d   pFunc->xSFunc==
4310: 6e 74 69 6c 65 53 74 65 70 46 75 6e 63 20 29 7b  ntileStepFunc ){
4320: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
4330: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 57 69  prDelete(db, pWi
4340: 6e 2d 3e 70 53 74 61 72 74 29 3b 0a 20 20 20 20  n->pStart);.    
4350: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
4360: 65 74 65 28 64 62 2c 20 70 57 69 6e 2d 3e 70 45  ete(db, pWin->pE
4370: 6e 64 29 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d  nd);.      pWin-
4380: 3e 70 53 74 61 72 74 20 3d 20 70 57 69 6e 2d 3e  >pStart = pWin->
4390: 70 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  pEnd = 0;.      
43a0: 70 57 69 6e 2d 3e 65 54 79 70 65 20 3d 20 54 4b  pWin->eType = TK
43b0: 5f 52 4f 57 53 3b 0a 20 20 20 20 20 20 70 57 69  _ROWS;.      pWi
43c0: 6e 2d 3e 65 53 74 61 72 74 20 3d 20 54 4b 5f 55  n->eStart = TK_U
43d0: 4e 42 4f 55 4e 44 45 44 3b 0a 20 20 20 20 20 20  NBOUNDED;.      
43e0: 70 57 69 6e 2d 3e 65 45 6e 64 20 3d 20 54 4b 5f  pWin->eEnd = TK_
43f0: 43 55 52 52 45 4e 54 3b 0a 20 20 20 20 7d 65 6c  CURRENT;.    }el
4400: 73 65 0a 0a 20 20 20 20 69 66 28 20 70 46 75 6e  se..    if( pFun
4410: 63 2d 3e 78 53 46 75 6e 63 3d 3d 64 65 6e 73 65  c->xSFunc==dense
4420: 5f 72 61 6e 6b 53 74 65 70 46 75 6e 63 20 7c 7c  _rankStepFunc ||
4430: 20 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d   pFunc->xSFunc==
4440: 72 61 6e 6b 53 74 65 70 46 75 6e 63 0a 20 20 20  rankStepFunc.   
4450: 20 20 7c 7c 20 70 46 75 6e 63 2d 3e 78 53 46 75    || pFunc->xSFu
4460: 6e 63 3d 3d 70 65 72 63 65 6e 74 5f 72 61 6e 6b  nc==percent_rank
4470: 53 74 65 70 46 75 6e 63 20 7c 7c 20 70 46 75 6e  StepFunc || pFun
4480: 63 2d 3e 78 53 46 75 6e 63 3d 3d 63 75 6d 65 5f  c->xSFunc==cume_
4490: 64 69 73 74 53 74 65 70 46 75 6e 63 0a 20 20 20  distStepFunc.   
44a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
44b0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
44c0: 70 57 69 6e 2d 3e 70 53 74 61 72 74 29 3b 0a 20  pWin->pStart);. 
44d0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
44e0: 44 65 6c 65 74 65 28 64 62 2c 20 70 57 69 6e 2d  Delete(db, pWin-
44f0: 3e 70 45 6e 64 29 3b 0a 20 20 20 20 20 20 70 57  >pEnd);.      pW
4500: 69 6e 2d 3e 70 53 74 61 72 74 20 3d 20 70 57 69  in->pStart = pWi
4510: 6e 2d 3e 70 45 6e 64 20 3d 20 30 3b 0a 20 20 20  n->pEnd = 0;.   
4520: 20 20 20 70 57 69 6e 2d 3e 65 54 79 70 65 20 3d     pWin->eType =
4530: 20 54 4b 5f 52 41 4e 47 45 3b 0a 20 20 20 20 20   TK_RANGE;.     
4540: 20 70 57 69 6e 2d 3e 65 53 74 61 72 74 20 3d 20   pWin->eStart = 
4550: 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 3b 0a 20 20  TK_UNBOUNDED;.  
4560: 20 20 20 20 70 57 69 6e 2d 3e 65 45 6e 64 20 3d      pWin->eEnd =
4570: 20 54 4b 5f 43 55 52 52 45 4e 54 3b 0a 20 20 20   TK_CURRENT;.   
4580: 20 7d 0a 20 20 7d 0a 20 20 70 57 69 6e 2d 3e 70   }.  }.  pWin->p
4590: 46 75 6e 63 20 3d 20 70 46 75 6e 63 3b 0a 7d 0a  Func = pFunc;.}.
45a0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65 78 74 20 6f  ./*.** Context o
45b0: 62 6a 65 63 74 20 70 61 73 73 65 64 20 74 68 72  bject passed thr
45c0: 6f 75 67 68 20 73 71 6c 69 74 65 33 57 61 6c 6b  ough sqlite3Walk
45d0: 45 78 70 72 4c 69 73 74 28 29 20 74 6f 0a 2a 2a  ExprList() to.**
45e0: 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77   selectWindowRew
45f0: 72 69 74 65 45 78 70 72 43 62 28 29 20 62 79 20  riteExprCb() by 
4600: 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72  selectWindowRewr
4610: 69 74 65 45 4c 69 73 74 28 29 2e 0a 2a 2f 0a 74  iteEList()..*/.t
4620: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57 69  ypedef struct Wi
4630: 6e 64 6f 77 52 65 77 72 69 74 65 20 57 69 6e 64  ndowRewrite Wind
4640: 6f 77 52 65 77 72 69 74 65 3b 0a 73 74 72 75 63  owRewrite;.struc
4650: 74 20 57 69 6e 64 6f 77 52 65 77 72 69 74 65 20  t WindowRewrite 
4660: 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e  {.  Window *pWin
4670: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 53  ;.  ExprList *pS
4680: 75 62 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61  ub;.};../*.** Ca
4690: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
46a0: 75 73 65 64 20 62 79 20 73 65 6c 65 63 74 57 69  used by selectWi
46b0: 6e 64 6f 77 52 65 77 72 69 74 65 45 4c 69 73 74  ndowRewriteEList
46c0: 28 29 2e 20 49 66 20 6e 65 63 65 73 73 61 72 79  (). If necessary
46d0: 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  ,.** this functi
46e0: 6f 6e 20 61 70 70 65 6e 64 73 20 74 6f 20 74 68  on appends to th
46f0: 65 20 6f 75 74 70 75 74 20 65 78 70 72 65 73 73  e output express
4700: 69 6f 6e 2d 6c 69 73 74 20 61 6e 64 20 75 70 64  ion-list and upd
4710: 61 74 65 73 20 0a 2a 2a 20 65 78 70 72 65 73 73  ates .** express
4720: 69 6f 6e 20 28 2a 70 70 45 78 70 72 29 20 69 6e  ion (*ppExpr) in
4730: 20 70 6c 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69   place..*/.stati
4740: 63 20 69 6e 74 20 73 65 6c 65 63 74 57 69 6e 64  c int selectWind
4750: 6f 77 52 65 77 72 69 74 65 45 78 70 72 43 62 28  owRewriteExprCb(
4760: 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
4770: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
4780: 20 73 74 72 75 63 74 20 57 69 6e 64 6f 77 52 65   struct WindowRe
4790: 77 72 69 74 65 20 2a 70 20 3d 20 70 57 61 6c 6b  write *p = pWalk
47a0: 65 72 2d 3e 75 2e 70 52 65 77 72 69 74 65 3b 0a  er->u.pRewrite;.
47b0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
47c0: 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
47d0: 65 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45  e;..  switch( pE
47e0: 78 70 72 2d 3e 6f 70 20 29 7b 0a 0a 20 20 20 20  xpr->op ){..    
47f0: 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  case TK_FUNCTION
4800: 3a 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  :.      if( pExp
4810: 72 2d 3e 70 57 69 6e 3d 3d 30 20 29 7b 0a 20 20  r->pWin==0 ){.  
4820: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4830: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4840: 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a    Window *pWin;.
4850: 20 20 20 20 20 20 20 20 66 6f 72 28 70 57 69 6e          for(pWin
4860: 3d 70 2d 3e 70 57 69 6e 3b 20 70 57 69 6e 3b 20  =p->pWin; pWin; 
4870: 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74  pWin=pWin->pNext
4880: 57 69 6e 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Win){.          
4890: 69 66 28 20 70 45 78 70 72 2d 3e 70 57 69 6e 3d  if( pExpr->pWin=
48a0: 3d 70 57 69 6e 20 29 7b 0a 20 20 20 20 20 20 20  =pWin ){.       
48b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69       assert( pWi
48c0: 6e 2d 3e 70 4f 77 6e 65 72 3d 3d 70 45 78 70 72  n->pOwner==pExpr
48d0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
48e0: 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
48f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
4900: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
4910: 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
4920: 72 6f 75 67 68 2e 20 20 2a 2f 0a 0a 20 20 20 20  rough.  */..    
4930: 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
4940: 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  TION:.    case T
4950: 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
4960: 20 20 45 78 70 72 20 2a 70 44 75 70 20 3d 20 73    Expr *pDup = s
4970: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50  qlite3ExprDup(pP
4980: 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c  arse->db, pExpr,
4990: 20 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 53   0);.      p->pS
49a0: 75 62 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ub = sqlite3Expr
49b0: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
49c0: 65 2c 20 70 2d 3e 70 53 75 62 2c 20 70 44 75 70  e, p->pSub, pDup
49d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
49e0: 70 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pSub ){.        
49f0: 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50  assert( ExprHasP
4a00: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
4a10: 50 5f 53 74 61 74 69 63 29 3d 3d 30 20 29 3b 0a  P_Static)==0 );.
4a20: 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74 50          ExprSetP
4a30: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
4a40: 50 5f 53 74 61 74 69 63 29 3b 0a 20 20 20 20 20  P_Static);.     
4a50: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
4a60: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
4a70: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20   pExpr);.       
4a80: 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72   ExprClearProper
4a90: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 74 61  ty(pExpr, EP_Sta
4aa0: 74 69 63 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  tic);.        me
4ab0: 6d 73 65 74 28 70 45 78 70 72 2c 20 30 2c 20 73  mset(pExpr, 0, s
4ac0: 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 0a 20  izeof(Expr));.. 
4ad0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
4ae0: 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20   = TK_COLUMN;.  
4af0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
4b00: 6c 75 6d 6e 20 3d 20 70 2d 3e 70 53 75 62 2d 3e  lumn = p->pSub->
4b10: 6e 45 78 70 72 2d 31 3b 0a 20 20 20 20 20 20 20  nExpr-1;.       
4b20: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
4b30: 20 70 2d 3e 70 57 69 6e 2d 3e 69 45 70 68 43 73   p->pWin->iEphCs
4b40: 72 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  r;.      }..    
4b50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
4b60: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 2f 2a 20      default: /* 
4b70: 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 62  no-op */.      b
4b80: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  reak;.  }..  ret
4b90: 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
4ba0: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73  ;.}.static int s
4bb0: 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69  electWindowRewri
4bc0: 74 65 53 65 6c 65 63 74 43 62 28 57 61 6c 6b 65  teSelectCb(Walke
4bd0: 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
4be0: 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
4bf0: 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
4c00: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72  ;.}.../*.** Iter
4c10: 61 74 65 20 74 68 72 6f 75 67 68 20 65 61 63 68  ate through each
4c20: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 65   expression in e
4c30: 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 70  xpression-list p
4c40: 45 4c 69 73 74 2e 20 46 6f 72 20 65 61 63 68 3a  EList. For each:
4c50: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 4b 5f 43 4f  .**.**   * TK_CO
4c60: 4c 55 4d 4e 2c 0a 2a 2a 20 20 20 2a 20 61 67 67  LUMN,.**   * agg
4c70: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c  regate function,
4c80: 20 6f 72 0a 2a 2a 20 20 20 2a 20 77 69 6e 64 6f   or.**   * windo
4c90: 77 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  w function with 
4ca0: 61 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20  a Window object 
4cb0: 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 6d 65  that is not a me
4cc0: 6d 62 65 72 20 6f 66 20 74 68 65 20 0a 2a 2a 20  mber of the .** 
4cd0: 20 20 20 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20      linked list 
4ce0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
4cf0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 28 70  cond argument (p
4d00: 57 69 6e 29 0a 2a 2a 0a 2a 2a 20 41 70 70 65 6e  Win).**.** Appen
4d10: 64 20 74 68 65 20 6e 6f 64 65 20 74 6f 20 6f 75  d the node to ou
4d20: 74 70 75 74 20 65 78 70 72 65 73 73 69 6f 6e 2d  tput expression-
4d30: 6c 69 73 74 20 28 2a 70 70 53 75 62 29 2e 20 41  list (*ppSub). A
4d40: 6e 64 20 72 65 70 6c 61 63 65 20 69 74 0a 2a 2a  nd replace it.**
4d50: 20 77 69 74 68 20 61 20 54 4b 5f 43 4f 4c 55 4d   with a TK_COLUM
4d60: 4e 20 74 68 61 74 20 72 65 61 64 73 20 74 68 65  N that reads the
4d70: 20 28 4e 2d 31 29 74 68 20 65 6c 65 6d 65 6e 74   (N-1)th element
4d80: 20 6f 66 20 74 61 62 6c 65 20 0a 2a 2a 20 70 57   of table .** pW
4d90: 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 77 68 65  in->iEphCsr, whe
4da0: 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  re N is the numb
4db0: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
4dc0: 6e 20 28 2a 70 70 53 75 62 29 20 61 66 74 65 72  n (*ppSub) after
4dd0: 0a 2a 2a 20 61 70 70 65 6e 64 69 6e 67 20 74 68  .** appending th
4de0: 65 20 6e 65 77 20 6f 6e 65 2e 0a 2a 2f 0a 73 74  e new one..*/.st
4df0: 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74  atic void select
4e00: 57 69 6e 64 6f 77 52 65 77 72 69 74 65 45 4c 69  WindowRewriteELi
4e10: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
4e20: 72 73 65 2c 20 0a 20 20 57 69 6e 64 6f 77 20 2a  rse, .  Window *
4e30: 70 57 69 6e 2c 0a 20 20 45 78 70 72 4c 69 73 74  pWin,.  ExprList
4e40: 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20   *pEList,       
4e50: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 77 72 69          /* Rewri
4e60: 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  te expressions i
4e70: 6e 20 74 68 69 73 20 6c 69 73 74 20 2a 2f 0a 20  n this list */. 
4e80: 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 53 75   ExprList **ppSu
4e90: 62 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b               
4ea0: 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 75 62 2d   /* IN/OUT: Sub-
4eb0: 73 65 6c 65 63 74 20 65 78 70 72 65 73 73 69 6f  select expressio
4ec0: 6e 2d 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 57  n-list */.){.  W
4ed0: 61 6c 6b 65 72 20 73 57 61 6c 6b 65 72 3b 0a 20  alker sWalker;. 
4ee0: 20 57 69 6e 64 6f 77 52 65 77 72 69 74 65 20 73   WindowRewrite s
4ef0: 52 65 77 72 69 74 65 3b 0a 0a 20 20 6d 65 6d 73  Rewrite;..  mems
4f00: 65 74 28 26 73 57 61 6c 6b 65 72 2c 20 30 2c 20  et(&sWalker, 0, 
4f10: 73 69 7a 65 6f 66 28 57 61 6c 6b 65 72 29 29 3b  sizeof(Walker));
4f20: 0a 20 20 6d 65 6d 73 65 74 28 26 73 52 65 77 72  .  memset(&sRewr
4f30: 69 74 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57  ite, 0, sizeof(W
4f40: 69 6e 64 6f 77 52 65 77 72 69 74 65 29 29 3b 0a  indowRewrite));.
4f50: 0a 20 20 73 52 65 77 72 69 74 65 2e 70 53 75 62  .  sRewrite.pSub
4f60: 20 3d 20 2a 70 70 53 75 62 3b 0a 20 20 73 52 65   = *ppSub;.  sRe
4f70: 77 72 69 74 65 2e 70 57 69 6e 20 3d 20 70 57 69  write.pWin = pWi
4f80: 6e 3b 0a 0a 20 20 73 57 61 6c 6b 65 72 2e 70 50  n;..  sWalker.pP
4f90: 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
4fa0: 20 73 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61   sWalker.xExprCa
4fb0: 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 57  llback = selectW
4fc0: 69 6e 64 6f 77 52 65 77 72 69 74 65 45 78 70 72  indowRewriteExpr
4fd0: 43 62 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 78 53  Cb;.  sWalker.xS
4fe0: 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
4ff0: 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72  selectWindowRewr
5000: 69 74 65 53 65 6c 65 63 74 43 62 3b 0a 20 20 73  iteSelectCb;.  s
5010: 57 61 6c 6b 65 72 2e 75 2e 70 52 65 77 72 69 74  Walker.u.pRewrit
5020: 65 20 3d 20 26 73 52 65 77 72 69 74 65 3b 0a 0a  e = &sRewrite;..
5030: 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 57    (void)sqlite3W
5040: 61 6c 6b 45 78 70 72 4c 69 73 74 28 26 73 57 61  alkExprList(&sWa
5050: 6c 6b 65 72 2c 20 70 45 4c 69 73 74 29 3b 0a 0a  lker, pEList);..
5060: 20 20 2a 70 70 53 75 62 20 3d 20 73 52 65 77 72    *ppSub = sRewr
5070: 69 74 65 2e 70 53 75 62 3b 0a 7d 0a 0a 2f 2a 0a  ite.pSub;.}../*.
5080: 2a 2a 20 41 70 70 65 6e 64 20 61 20 63 6f 70 79  ** Append a copy
5090: 20 6f 66 20 65 61 63 68 20 65 78 70 72 65 73 73   of each express
50a0: 69 6f 6e 20 69 6e 20 65 78 70 72 65 73 73 69 6f  ion in expressio
50b0: 6e 2d 6c 69 73 74 20 70 41 70 70 65 6e 64 20 74  n-list pAppend t
50c0: 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  o.** expression 
50d0: 6c 69 73 74 20 70 4c 69 73 74 2e 20 52 65 74 75  list pList. Retu
50e0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
50f0: 74 68 65 20 72 65 73 75 6c 74 20 6c 69 73 74 2e  the result list.
5100: 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 4c  .*/.static ExprL
5110: 69 73 74 20 2a 65 78 70 72 4c 69 73 74 41 70 70  ist *exprListApp
5120: 65 6e 64 4c 69 73 74 28 0a 20 20 50 61 72 73 65  endList(.  Parse
5130: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
5140: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
5150: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
5160: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
5170: 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68     /* List to wh
5180: 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d  ich to append. M
5190: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
51a0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 41 70 70    ExprList *pApp
51b0: 65 6e 64 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  end       /* Lis
51c0: 74 20 6f 66 20 76 61 6c 75 65 73 20 74 6f 20 61  t of values to a
51d0: 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20  ppend. Might be 
51e0: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  NULL */.){.  if(
51f0: 20 70 41 70 70 65 6e 64 20 29 7b 0a 20 20 20 20   pAppend ){.    
5200: 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e  int i;.    int n
5210: 49 6e 69 74 20 3d 20 70 4c 69 73 74 20 3f 20 70  Init = pList ? p
5220: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b  List->nExpr : 0;
5230: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
5240: 70 41 70 70 65 6e 64 2d 3e 6e 45 78 70 72 3b 20  pAppend->nExpr; 
5250: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
5260: 20 2a 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33   *pDup = sqlite3
5270: 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e  ExprDup(pParse->
5280: 64 62 2c 20 70 41 70 70 65 6e 64 2d 3e 61 5b 69  db, pAppend->a[i
5290: 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  ].pExpr, 0);.   
52a0: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
52b0: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
52c0: 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20  (pParse, pList, 
52d0: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 69 66 28  pDup);.      if(
52e0: 20 70 4c 69 73 74 20 29 20 70 4c 69 73 74 2d 3e   pList ) pList->
52f0: 61 5b 6e 49 6e 69 74 2b 69 5d 2e 73 6f 72 74 4f  a[nInit+i].sortO
5300: 72 64 65 72 20 3d 20 70 41 70 70 65 6e 64 2d 3e  rder = pAppend->
5310: 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[i].sortOrder;.
5320: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
5330: 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
5340: 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43 54  ** If the SELECT
5350: 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65   statement passe
5360: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
5370: 61 72 67 75 6d 65 6e 74 20 64 6f 65 73 20 6e 6f  argument does no
5380: 74 20 69 6e 76 6f 6b 65 0a 2a 2a 20 61 6e 79 20  t invoke.** any 
5390: 53 51 4c 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  SQL window funct
53a0: 69 6f 6e 73 2c 20 74 68 69 73 20 66 75 6e 63 74  ions, this funct
53b0: 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
53c0: 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 0a 2a  Otherwise, it .*
53d0: 2a 20 72 65 77 72 69 74 65 73 20 74 68 65 20 53  * rewrites the S
53e0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
53f0: 73 6f 20 74 68 61 74 20 77 69 6e 64 6f 77 20 66  so that window f
5400: 75 6e 63 74 69 6f 6e 20 78 53 74 65 70 20 66 75  unction xStep fu
5410: 6e 63 74 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 69  nctions.** are i
5420: 6e 76 6f 6b 65 64 20 69 6e 20 74 68 65 20 63 6f  nvoked in the co
5430: 72 72 65 63 74 20 6f 72 64 65 72 20 61 73 20 64  rrect order as d
5440: 65 73 63 72 69 62 65 64 20 75 6e 64 65 72 20 22  escribed under "
5450: 53 45 4c 45 43 54 20 52 45 57 52 49 54 49 4e 47  SELECT REWRITING
5460: 22 0a 2a 2a 20 61 74 20 74 68 65 20 74 6f 70 20  ".** at the top 
5470: 6f 66 20 74 68 69 73 20 66 69 6c 65 2e 0a 2a 2f  of this file..*/
5480: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 69 6e 64  .int sqlite3Wind
5490: 6f 77 52 65 77 72 69 74 65 28 50 61 72 73 65 20  owRewrite(Parse 
54a0: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
54b0: 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *p){.  int rc = 
54c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
54d0: 20 70 2d 3e 70 57 69 6e 20 29 7b 0a 20 20 20 20   p->pWin ){.    
54e0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
54f0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
5500: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  ;.    sqlite3 *d
5510: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
5520: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62      Select *pSub
5530: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
5540: 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72    /* The subquer
5550: 79 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74  y */.    SrcList
5560: 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63   *pSrc = p->pSrc
5570: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 57 68 65  ;.    Expr *pWhe
5580: 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a  re = p->pWhere;.
5590: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47      ExprList *pG
55a0: 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f  roupBy = p->pGro
55b0: 75 70 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a  upBy;.    Expr *
55c0: 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61  pHaving = p->pHa
55d0: 76 69 6e 67 3b 0a 20 20 20 20 45 78 70 72 4c 69  ving;.    ExprLi
55e0: 73 74 20 2a 70 53 6f 72 74 20 3d 20 30 3b 0a 0a  st *pSort = 0;..
55f0: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 53      ExprList *pS
5600: 75 62 6c 69 73 74 20 3d 20 30 3b 20 20 20 20 20  ublist = 0;     
5610: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
5620: 6c 69 73 74 20 66 6f 72 20 73 75 62 2d 71 75 65  list for sub-que
5630: 72 79 20 2a 2f 0a 20 20 20 20 57 69 6e 64 6f 77  ry */.    Window
5640: 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57 69   *pMWin = p->pWi
5650: 6e 3b 20 20 20 20 20 20 2f 2a 20 4d 61 73 74 65  n;      /* Maste
5660: 72 20 77 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20  r window object 
5670: 2a 2f 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a 70  */.    Window *p
5680: 57 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  Win;            
5690: 20 20 20 20 20 2f 2a 20 57 69 6e 64 6f 77 20 6f       /* Window o
56a0: 62 6a 65 63 74 20 69 74 65 72 61 74 6f 72 20 2a  bject iterator *
56b0: 2f 0a 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d  /..    p->pSrc =
56c0: 20 30 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72   0;.    p->pWher
56d0: 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 47  e = 0;.    p->pG
56e0: 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20 20 20  roupBy = 0;.    
56f0: 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a  p->pHaving = 0;.
5700: 0a 20 20 20 20 2f 2a 20 41 73 73 69 67 6e 20 61  .    /* Assign a
5710: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
5720: 6f 72 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  or the ephemeral
5730: 20 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20 62   table used to b
5740: 75 66 66 65 72 20 72 6f 77 73 2e 0a 20 20 20 20  uffer rows..    
5750: 2a 2a 20 54 68 65 20 4f 70 65 6e 45 70 68 65 6d  ** The OpenEphem
5760: 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  eral instruction
5770: 20 69 73 20 63 6f 64 65 64 20 6c 61 74 65 72 2c   is coded later,
5780: 20 61 66 74 65 72 20 69 74 20 69 73 20 6b 6e 6f   after it is kno
5790: 77 6e 20 68 6f 77 0a 20 20 20 20 2a 2a 20 6d 61  wn how.    ** ma
57a0: 6e 79 20 63 6f 6c 75 6d 6e 73 20 74 68 65 20 74  ny columns the t
57b0: 61 62 6c 65 20 77 69 6c 6c 20 68 61 76 65 2e 20  able will have. 
57c0: 20 2a 2f 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 69   */.    pMWin->i
57d0: 45 70 68 43 73 72 20 3d 20 70 50 61 72 73 65 2d  EphCsr = pParse-
57e0: 3e 6e 54 61 62 2b 2b 3b 0a 0a 20 20 20 20 73 65  >nTab++;..    se
57f0: 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74  lectWindowRewrit
5800: 65 45 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  eEList(pParse, p
5810: 4d 57 69 6e 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  MWin, p->pEList,
5820: 20 26 70 53 75 62 6c 69 73 74 29 3b 0a 20 20 20   &pSublist);.   
5830: 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77   selectWindowRew
5840: 72 69 74 65 45 4c 69 73 74 28 70 50 61 72 73 65  riteEList(pParse
5850: 2c 20 70 4d 57 69 6e 2c 20 70 2d 3e 70 4f 72 64  , pMWin, p->pOrd
5860: 65 72 42 79 2c 20 26 70 53 75 62 6c 69 73 74 29  erBy, &pSublist)
5870: 3b 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 6e 42 75  ;.    pMWin->nBu
5880: 66 66 65 72 43 6f 6c 20 3d 20 28 70 53 75 62 6c  fferCol = (pSubl
5890: 69 73 74 20 3f 20 70 53 75 62 6c 69 73 74 2d 3e  ist ? pSublist->
58a0: 6e 45 78 70 72 20 3a 20 30 29 3b 0a 0a 20 20 20  nExpr : 0);..   
58b0: 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 4f   /* Create the O
58c0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66  RDER BY clause f
58d0: 6f 72 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63  or the sub-selec
58e0: 74 2e 20 54 68 69 73 20 69 73 20 74 68 65 20 63  t. This is the c
58f0: 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 0a 20 20 20  oncatenation.   
5900: 20 2a 2a 20 6f 66 20 74 68 65 20 77 69 6e 64 6f   ** of the windo
5910: 77 20 50 41 52 54 49 54 49 4f 4e 20 61 6e 64 20  w PARTITION and 
5920: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73  ORDER BY clauses
5930: 2e 20 41 70 70 65 6e 64 20 74 68 65 20 73 61 6d  . Append the sam
5940: 65 20 0a 20 20 20 20 2a 2a 20 65 78 70 72 65 73  e .    ** expres
5950: 73 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 75 62  sions to the sub
5960: 2d 73 65 6c 65 63 74 20 65 78 70 72 65 73 73 69  -select expressi
5970: 6f 6e 20 6c 69 73 74 2e 20 54 68 65 79 20 61 72  on list. They ar
5980: 65 20 72 65 71 75 69 72 65 64 20 74 6f 0a 20 20  e required to.  
5990: 20 20 2a 2a 20 66 69 67 75 72 65 20 6f 75 74 20    ** figure out 
59a0: 77 68 65 72 65 20 62 6f 75 6e 64 61 72 69 65 73  where boundaries
59b0: 20 66 6f 72 20 70 61 72 74 69 74 69 6f 6e 73 20   for partitions 
59c0: 61 6e 64 20 73 65 74 73 20 6f 66 20 70 65 65 72  and sets of peer
59d0: 20 72 6f 77 73 2e 20 20 2a 2f 0a 20 20 20 20 70   rows.  */.    p
59e0: 53 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Sort = sqlite3Ex
59f0: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4d  prListDup(db, pM
5a00: 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c  Win->pPartition,
5a10: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 57   0);.    if( pMW
5a20: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  in->pOrderBy ){.
5a30: 20 20 20 20 20 20 70 53 6f 72 74 20 3d 20 65 78        pSort = ex
5a40: 70 72 4c 69 73 74 41 70 70 65 6e 64 4c 69 73 74  prListAppendList
5a50: 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20  (pParse, pSort, 
5a60: 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 29  pMWin->pOrderBy)
5a70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62  ;.    }.    pSub
5a80: 6c 69 73 74 20 3d 20 65 78 70 72 4c 69 73 74 41  list = exprListA
5a90: 70 70 65 6e 64 4c 69 73 74 28 70 50 61 72 73 65  ppendList(pParse
5aa0: 2c 20 70 53 75 62 6c 69 73 74 2c 20 70 53 6f 72  , pSublist, pSor
5ab0: 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65  t);..    /* Appe
5ac0: 6e 64 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73  nd the arguments
5ad0: 20 70 61 73 73 65 64 20 74 6f 20 65 61 63 68 20   passed to each 
5ae0: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
5af0: 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 75  to the.    ** su
5b00: 62 2d 73 65 6c 65 63 74 20 65 78 70 72 65 73 73  b-select express
5b10: 69 6f 6e 20 6c 69 73 74 2e 20 41 6c 73 6f 20 61  ion list. Also a
5b20: 6c 6c 6f 63 61 74 65 20 74 77 6f 20 72 65 67 69  llocate two regi
5b30: 73 74 65 72 73 20 66 6f 72 20 65 61 63 68 0a 20  sters for each. 
5b40: 20 20 20 2a 2a 20 77 69 6e 64 6f 77 20 66 75 6e     ** window fun
5b50: 63 74 69 6f 6e 20 2d 20 6f 6e 65 20 66 6f 72 20  ction - one for 
5b60: 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2c  the accumulator,
5b70: 20 61 6e 6f 74 68 65 72 20 66 6f 72 20 69 6e 74   another for int
5b80: 65 72 69 6d 0a 20 20 20 20 2a 2a 20 72 65 73 75  erim.    ** resu
5b90: 6c 74 73 2e 20 20 2a 2f 0a 20 20 20 20 66 6f 72  lts.  */.    for
5ba0: 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69  (pWin=pMWin; pWi
5bb0: 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e  n; pWin=pWin->pN
5bc0: 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 20 20 70  extWin){.      p
5bd0: 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 20 3d 20 28  Win->iArgCol = (
5be0: 70 53 75 62 6c 69 73 74 20 3f 20 70 53 75 62 6c  pSublist ? pSubl
5bf0: 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b  ist->nExpr : 0);
5c00: 0a 20 20 20 20 20 20 70 53 75 62 6c 69 73 74 20  .      pSublist 
5c10: 3d 20 65 78 70 72 4c 69 73 74 41 70 70 65 6e 64  = exprListAppend
5c20: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 75  List(pParse, pSu
5c30: 62 6c 69 73 74 2c 20 70 57 69 6e 2d 3e 70 4f 77  blist, pWin->pOw
5c40: 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  ner->x.pList);. 
5c50: 20 20 20 20 20 69 66 28 20 70 57 69 6e 2d 3e 70       if( pWin->p
5c60: 46 69 6c 74 65 72 20 29 7b 0a 20 20 20 20 20 20  Filter ){.      
5c70: 20 20 45 78 70 72 20 2a 70 46 69 6c 74 65 72 20    Expr *pFilter 
5c80: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
5c90: 28 64 62 2c 20 70 57 69 6e 2d 3e 70 46 69 6c 74  (db, pWin->pFilt
5ca0: 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  er, 0);.        
5cb0: 70 53 75 62 6c 69 73 74 20 3d 20 73 71 6c 69 74  pSublist = sqlit
5cc0: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
5cd0: 28 70 50 61 72 73 65 2c 20 70 53 75 62 6c 69 73  (pParse, pSublis
5ce0: 74 2c 20 70 46 69 6c 74 65 72 29 3b 0a 20 20 20  t, pFilter);.   
5cf0: 20 20 20 7d 0a 20 20 20 20 20 20 70 57 69 6e 2d     }.      pWin-
5d00: 3e 72 65 67 41 63 63 75 6d 20 3d 20 2b 2b 70 50  >regAccum = ++pP
5d10: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
5d20: 20 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c    pWin->regResul
5d30: 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
5d40: 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
5d50: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
5d60: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d  P_Null, 0, pWin-
5d70: 3e 72 65 67 41 63 63 75 6d 29 3b 0a 20 20 20 20  >regAccum);.    
5d80: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
5d90: 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
5da0: 59 20 6f 72 20 50 41 52 54 49 54 49 4f 4e 20 42  Y or PARTITION B
5db0: 59 20 63 6c 61 75 73 65 2c 20 61 6e 64 20 74 68  Y clause, and th
5dc0: 65 20 77 69 6e 64 6f 77 0a 20 20 20 20 2a 2a 20  e window.    ** 
5dd0: 66 75 6e 63 74 69 6f 6e 20 61 63 63 65 70 74 73  function accepts
5de0: 20 7a 65 72 6f 20 61 72 67 75 6d 65 6e 74 73 2c   zero arguments,
5df0: 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e   and there are n
5e00: 6f 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 73 0a  o other columns.
5e10: 20 20 20 20 2a 2a 20 73 65 6c 65 63 74 65 64 20      ** selected 
5e20: 28 65 2e 67 2e 20 22 53 45 4c 45 43 54 20 72 6f  (e.g. "SELECT ro
5e30: 77 5f 6e 75 6d 62 65 72 28 29 20 4f 56 45 52 20  w_number() OVER 
5e40: 28 29 20 46 52 4f 4d 20 74 31 22 29 2c 20 69 74  () FROM t1"), it
5e50: 20 69 73 20 70 6f 73 73 69 62 6c 65 0a 20 20 20   is possible.   
5e60: 20 2a 2a 20 74 68 61 74 20 70 53 75 62 6c 69 73   ** that pSublis
5e70: 74 20 69 73 20 73 74 69 6c 6c 20 4e 55 4c 4c 20  t is still NULL 
5e80: 68 65 72 65 2e 20 41 64 64 20 61 20 63 6f 6e 73  here. Add a cons
5e90: 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20  tant expression 
5ea0: 68 65 72 65 20 74 6f 20 0a 20 20 20 20 2a 2a 20  here to .    ** 
5eb0: 6b 65 65 70 20 65 76 65 72 79 74 68 69 6e 67 20  keep everything 
5ec0: 6c 65 67 61 6c 20 69 6e 20 74 68 69 73 20 63 61  legal in this ca
5ed0: 73 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  se. .    */.    
5ee0: 69 66 28 20 70 53 75 62 6c 69 73 74 3d 3d 30 20  if( pSublist==0 
5ef0: 29 7b 0a 20 20 20 20 20 20 70 53 75 62 6c 69 73  ){.      pSublis
5f00: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
5f10: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
5f20: 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
5f30: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
5f40: 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c  (db, TK_INTEGER,
5f50: 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65   &sqlite3IntToke
5f60: 6e 73 5b 30 5d 2c 20 30 29 0a 20 20 20 20 20 20  ns[0], 0).      
5f70: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 53  );.    }..    pS
5f80: 75 62 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ub = sqlite3Sele
5f90: 63 74 4e 65 77 28 0a 20 20 20 20 20 20 20 20 70  ctNew(.        p
5fa0: 50 61 72 73 65 2c 20 70 53 75 62 6c 69 73 74 2c  Parse, pSublist,
5fb0: 20 70 53 72 63 2c 20 70 57 68 65 72 65 2c 20 70   pSrc, pWhere, p
5fc0: 47 72 6f 75 70 42 79 2c 20 70 48 61 76 69 6e 67  GroupBy, pHaving
5fd0: 2c 20 70 53 6f 72 74 2c 20 30 2c 20 30 0a 20 20  , pSort, 0, 0.  
5fe0: 20 20 29 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63    );.    p->pSrc
5ff0: 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
6000: 74 41 70 70 65 6e 64 28 64 62 2c 20 30 2c 20 30  tAppend(db, 0, 0
6010: 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 0);.    assert
6020: 28 20 70 2d 3e 70 53 72 63 20 7c 7c 20 64 62 2d  ( p->pSrc || db-
6030: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
6040: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53 72 63  .    if( p->pSrc
6050: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 53 72   ){.      p->pSr
6060: 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20  c->a[0].pSelect 
6070: 3d 20 70 53 75 62 3b 0a 20 20 20 20 20 20 73 71  = pSub;.      sq
6080: 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
6090: 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65  gnCursors(pParse
60a0: 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20  , p->pSrc);.    
60b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
60c0: 61 6e 64 53 75 62 71 75 65 72 79 28 70 50 61 72  andSubquery(pPar
60d0: 73 65 2c 20 26 70 2d 3e 70 53 72 63 2d 3e 61 5b  se, &p->pSrc->a[
60e0: 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  0]) ){.        r
60f0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
6100: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
6110: 20 20 20 20 20 20 20 70 53 75 62 2d 3e 73 65 6c         pSub->sel
6120: 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78 70 61  Flags |= SF_Expa
6130: 6e 64 65 64 3b 0a 20 20 20 20 20 20 20 20 70 2d  nded;.        p-
6140: 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46  >selFlags &= ~SF
6150: 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20 20 20  _Aggregate;.    
6160: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
6170: 74 50 72 65 70 28 70 50 61 72 73 65 2c 20 70 53  tPrep(pParse, pS
6180: 75 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ub, 0);.      }.
6190: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
61a0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
61b0: 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 4d  penEphemeral, pM
61c0: 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 70 53  Win->iEphCsr, pS
61d0: 75 62 6c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  ublist->nExpr);.
61e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
61f0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
6200: 6c 65 74 65 28 64 62 2c 20 70 53 75 62 29 3b 0a  lete(db, pSub);.
6210: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62      }.    if( db
6220: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
6230: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
6240: 45 4d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  EM;.  }..  retur
6250: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n rc;.}../*.** F
6260: 72 65 65 20 74 68 65 20 57 69 6e 64 6f 77 20 6f  ree the Window o
6270: 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
6280: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
6290: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
62a0: 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65 74 65  ite3WindowDelete
62b0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69  (sqlite3 *db, Wi
62c0: 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 69 66 28 20  ndow *p){.  if( 
62d0: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
62e0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
62f0: 2d 3e 70 46 69 6c 74 65 72 29 3b 0a 20 20 20 20  ->pFilter);.    
6300: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
6310: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 61  elete(db, p->pPa
6320: 72 74 69 74 69 6f 6e 29 3b 0a 20 20 20 20 73 71  rtition);.    sq
6330: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
6340: 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  ete(db, p->pOrde
6350: 72 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rBy);.    sqlite
6360: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
6370: 70 2d 3e 70 45 6e 64 29 3b 0a 20 20 20 20 73 71  p->pEnd);.    sq
6380: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
6390: 64 62 2c 20 70 2d 3e 70 53 74 61 72 74 29 3b 0a  db, p->pStart);.
63a0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
63b0: 65 28 64 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b  e(db, p->zName);
63c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
63d0: 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d  ee(db, p);.  }.}
63e0: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65  ../*.** Free the
63f0: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
6400: 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 73 20 73  Window objects s
6410: 74 61 72 74 69 6e 67 20 61 74 20 74 68 65 20 73  tarting at the s
6420: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
6430: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57  */.void sqlite3W
6440: 69 6e 64 6f 77 4c 69 73 74 44 65 6c 65 74 65 28  indowListDelete(
6450: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 6e  sqlite3 *db, Win
6460: 64 6f 77 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65  dow *p){.  while
6470: 28 20 70 20 29 7b 0a 20 20 20 20 57 69 6e 64 6f  ( p ){.    Windo
6480: 77 20 2a 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  w *pNext = p->pN
6490: 65 78 74 57 69 6e 3b 0a 20 20 20 20 73 71 6c 69  extWin;.    sqli
64a0: 74 65 33 57 69 6e 64 6f 77 44 65 6c 65 74 65 28  te3WindowDelete(
64b0: 64 62 2c 20 70 29 3b 0a 20 20 20 20 70 20 3d 20  db, p);.    p = 
64c0: 70 4e 65 78 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pNext;.  }.}../*
64d0: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
64e0: 20 72 65 74 75 72 6e 20 61 20 6e 65 77 20 57 69   return a new Wi
64f0: 6e 64 6f 77 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  ndow object..*/.
6500: 57 69 6e 64 6f 77 20 2a 73 71 6c 69 74 65 33 57  Window *sqlite3W
6510: 69 6e 64 6f 77 41 6c 6c 6f 63 28 0a 20 20 50 61  indowAlloc(.  Pa
6520: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20  rse *pParse, .  
6530: 69 6e 74 20 65 54 79 70 65 2c 0a 20 20 69 6e 74  int eType,.  int
6540: 20 65 53 74 61 72 74 2c 20 45 78 70 72 20 2a 70   eStart, Expr *p
6550: 53 74 61 72 74 2c 0a 20 20 69 6e 74 20 65 45 6e  Start,.  int eEn
6560: 64 2c 20 45 78 70 72 20 2a 70 45 6e 64 0a 29 7b  d, Expr *pEnd.){
6570: 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 20  .  Window *pWin 
6580: 3d 20 28 57 69 6e 64 6f 77 2a 29 73 71 6c 69 74  = (Window*)sqlit
6590: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
65a0: 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
65b0: 66 28 57 69 6e 64 6f 77 29 29 3b 0a 0a 20 20 69  f(Window));..  i
65c0: 66 28 20 70 57 69 6e 20 29 7b 0a 20 20 20 20 61  f( pWin ){.    a
65d0: 73 73 65 72 74 28 20 65 54 79 70 65 20 29 3b 0a  ssert( eType );.
65e0: 20 20 20 20 70 57 69 6e 2d 3e 65 54 79 70 65 20      pWin->eType 
65f0: 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 70 57 69  = eType;.    pWi
6600: 6e 2d 3e 65 53 74 61 72 74 20 3d 20 65 53 74 61  n->eStart = eSta
6610: 72 74 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 65 45  rt;.    pWin->eE
6620: 6e 64 20 3d 20 65 45 6e 64 3b 0a 20 20 20 20 70  nd = eEnd;.    p
6630: 57 69 6e 2d 3e 70 45 6e 64 20 3d 20 70 45 6e 64  Win->pEnd = pEnd
6640: 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70 53 74 61  ;.    pWin->pSta
6650: 72 74 20 3d 20 70 53 74 61 72 74 3b 0a 20 20 7d  rt = pStart;.  }
6660: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
6670: 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
6680: 73 65 2d 3e 64 62 2c 20 70 45 6e 64 29 3b 0a 20  se->db, pEnd);. 
6690: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
66a0: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
66b0: 20 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 0a 20   pStart);.  }.. 
66c0: 20 72 65 74 75 72 6e 20 70 57 69 6e 3b 0a 7d 0a   return pWin;.}.
66d0: 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20 77 69  ./*.** Attach wi
66e0: 6e 64 6f 77 20 6f 62 6a 65 63 74 20 70 57 69 6e  ndow object pWin
66f0: 20 74 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 70   to expression p
6700: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
6710: 33 57 69 6e 64 6f 77 41 74 74 61 63 68 28 50 61  3WindowAttach(Pa
6720: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
6730: 72 20 2a 70 2c 20 57 69 6e 64 6f 77 20 2a 70 57  r *p, Window *pW
6740: 69 6e 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  in){.  if( p ){.
6750: 20 20 20 20 70 2d 3e 70 57 69 6e 20 3d 20 70 57      p->pWin = pW
6760: 69 6e 3b 0a 20 20 20 20 69 66 28 20 70 57 69 6e  in;.    if( pWin
6770: 20 29 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 20   ) pWin->pOwner 
6780: 3d 20 70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = p;.  }else{.  
6790: 20 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 44    sqlite3WindowD
67a0: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
67b0: 2c 20 70 57 69 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a  , pWin);.  }.}..
67c0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69  /*.** Return 0 i
67d0: 66 20 74 68 65 20 74 77 6f 20 77 69 6e 64 6f 77  f the two window
67e0: 20 6f 62 6a 65 63 74 73 20 61 72 65 20 69 64 65   objects are ide
67f0: 6e 74 69 63 61 6c 2c 20 6f 72 20 6e 6f 6e 2d 7a  ntical, or non-z
6800: 65 72 6f 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ero otherwise..*
6810: 2a 20 49 64 65 6e 74 69 63 61 6c 20 77 69 6e 64  * Identical wind
6820: 6f 77 20 6f 62 6a 65 63 74 73 20 63 61 6e 20 62  ow objects can b
6830: 65 20 70 72 6f 63 65 73 73 65 64 20 69 6e 20 61  e processed in a
6840: 20 73 69 6e 67 6c 65 20 73 63 61 6e 2e 0a 2a 2f   single scan..*/
6850: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 69 6e 64  .int sqlite3Wind
6860: 6f 77 43 6f 6d 70 61 72 65 28 50 61 72 73 65 20  owCompare(Parse 
6870: 2a 70 50 61 72 73 65 2c 20 57 69 6e 64 6f 77 20  *pParse, Window 
6880: 2a 70 31 2c 20 57 69 6e 64 6f 77 20 2a 70 32 29  *p1, Window *p2)
6890: 7b 0a 20 20 69 66 28 20 70 31 2d 3e 65 54 79 70  {.  if( p1->eTyp
68a0: 65 21 3d 70 32 2d 3e 65 54 79 70 65 20 29 20 72  e!=p2->eType ) r
68b0: 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70  eturn 1;.  if( p
68c0: 31 2d 3e 65 53 74 61 72 74 21 3d 70 32 2d 3e 65  1->eStart!=p2->e
68d0: 53 74 61 72 74 20 29 20 72 65 74 75 72 6e 20 31  Start ) return 1
68e0: 3b 0a 20 20 69 66 28 20 70 31 2d 3e 65 45 6e 64  ;.  if( p1->eEnd
68f0: 21 3d 70 32 2d 3e 65 45 6e 64 20 29 20 72 65 74  !=p2->eEnd ) ret
6900: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c  urn 1;.  if( sql
6910: 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
6920: 70 50 61 72 73 65 2c 20 70 31 2d 3e 70 53 74 61  pParse, p1->pSta
6930: 72 74 2c 20 70 32 2d 3e 70 53 74 61 72 74 2c 20  rt, p2->pStart, 
6940: 2d 31 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  -1) ) return 1;.
6950: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
6960: 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  rCompare(pParse,
6970: 20 70 31 2d 3e 70 45 6e 64 2c 20 70 32 2d 3e 70   p1->pEnd, p2->p
6980: 45 6e 64 2c 20 2d 31 29 20 29 20 72 65 74 75 72  End, -1) ) retur
6990: 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
69a0: 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
69b0: 65 28 70 31 2d 3e 70 50 61 72 74 69 74 69 6f 6e  e(p1->pPartition
69c0: 2c 20 70 32 2d 3e 70 50 61 72 74 69 74 69 6f 6e  , p2->pPartition
69d0: 2c 20 2d 31 29 20 29 20 72 65 74 75 72 6e 20 31  , -1) ) return 1
69e0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  ;.  if( sqlite3E
69f0: 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70  xprListCompare(p
6a00: 31 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 32 2d  1->pOrderBy, p2-
6a10: 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31 29 20 29  >pOrderBy, -1) )
6a20: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
6a30: 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn 0;.}.../*.**
6a40: 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   This is called 
6a50: 62 79 20 63 6f 64 65 20 69 6e 20 73 65 6c 65 63  by code in selec
6a60: 74 2e 63 20 62 65 66 6f 72 65 20 69 74 20 63 61  t.c before it ca
6a70: 6c 6c 73 20 73 71 6c 69 74 65 33 57 68 65 72 65  lls sqlite3Where
6a80: 42 65 67 69 6e 28 29 0a 2a 2a 20 74 6f 20 62 65  Begin().** to be
6a90: 67 69 6e 20 69 74 65 72 61 74 69 6e 67 20 74 68  gin iterating th
6aa0: 72 6f 75 67 68 20 74 68 65 20 73 75 62 2d 71 75  rough the sub-qu
6ab0: 65 72 79 20 72 65 73 75 6c 74 73 2e 20 49 74 20  ery results. It 
6ac0: 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63  is used to alloc
6ad0: 61 74 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69  ate.** and initi
6ae0: 61 6c 69 7a 65 20 72 65 67 69 73 74 65 72 73 20  alize registers 
6af0: 61 6e 64 20 63 75 72 73 6f 72 73 20 75 73 65 64  and cursors used
6b00: 20 62 79 20 73 71 6c 69 74 65 33 57 69 6e 64 6f   by sqlite3Windo
6b10: 77 43 6f 64 65 53 74 65 70 28 29 2e 0a 2a 2f 0a  wCodeStep()..*/.
6b20: 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64  void sqlite3Wind
6b30: 6f 77 43 6f 64 65 49 6e 69 74 28 50 61 72 73 65  owCodeInit(Parse
6b40: 20 2a 70 50 61 72 73 65 2c 20 57 69 6e 64 6f 77   *pParse, Window
6b50: 20 2a 70 4d 57 69 6e 29 7b 0a 20 20 57 69 6e 64   *pMWin){.  Wind
6b60: 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 56 64 62 65  ow *pWin;.  Vdbe
6b70: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
6b80: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
6b90: 69 6e 74 20 6e 50 61 72 74 20 3d 20 28 70 4d 57  int nPart = (pMW
6ba0: 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 3f  in->pPartition ?
6bb0: 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69   pMWin->pPartiti
6bc0: 6f 6e 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a  on->nExpr : 0);.
6bd0: 20 20 6e 50 61 72 74 20 2b 3d 20 28 70 4d 57 69    nPart += (pMWi
6be0: 6e 2d 3e 70 4f 72 64 65 72 42 79 20 3f 20 70 4d  n->pOrderBy ? pM
6bf0: 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  Win->pOrderBy->n
6c00: 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 69 66 28  Expr : 0);.  if(
6c10: 20 6e 50 61 72 74 20 29 7b 0a 20 20 20 20 70 4d   nPart ){.    pM
6c20: 57 69 6e 2d 3e 72 65 67 50 61 72 74 20 3d 20 70  Win->regPart = p
6c30: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
6c40: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
6c50: 2b 3d 20 6e 50 61 72 74 3b 0a 20 20 20 20 73 71  += nPart;.    sq
6c60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
6c70: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70  v, OP_Null, 0, p
6c80: 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c 20 70  MWin->regPart, p
6c90: 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 2b 6e 50  MWin->regPart+nP
6ca0: 61 72 74 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 66  art-1);.  }..  f
6cb0: 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70  or(pWin=pMWin; p
6cc0: 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e  Win; pWin=pWin->
6cd0: 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 46  pNextWin){.    F
6ce0: 75 6e 63 44 65 66 20 2a 70 20 3d 20 70 57 69 6e  uncDef *p = pWin
6cf0: 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 69 66 28  ->pFunc;.    if(
6d00: 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26   (p->funcFlags &
6d10: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e   SQLITE_FUNC_MIN
6d20: 4d 41 58 29 20 26 26 20 70 57 69 6e 2d 3e 65 53  MAX) && pWin->eS
6d30: 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44  tart!=TK_UNBOUND
6d40: 45 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  ED ){.      /* T
6d50: 68 65 20 69 6e 6c 69 6e 65 20 76 65 72 73 69 6f  he inline versio
6d60: 6e 73 20 6f 66 20 6d 69 6e 28 29 20 61 6e 64 20  ns of min() and 
6d70: 6d 61 78 28 29 20 72 65 71 75 69 72 65 20 61 20  max() require a 
6d80: 73 69 6e 67 6c 65 20 65 70 68 65 6d 65 72 61 6c  single ephemeral
6d90: 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20  .      ** table 
6da0: 61 6e 64 20 33 20 72 65 67 69 73 74 65 72 73 2e  and 3 registers.
6db0: 20 54 68 65 20 72 65 67 69 73 74 65 72 73 20 61   The registers a
6dc0: 72 65 20 75 73 65 64 20 61 73 20 66 6f 6c 6c 6f  re used as follo
6dd0: 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ws:.      **.   
6de0: 20 20 20 2a 2a 20 20 20 72 65 67 41 70 70 2b 30     **   regApp+0
6df0: 3a 20 73 6c 6f 74 20 74 6f 20 63 6f 70 79 20 6d  : slot to copy m
6e00: 69 6e 28 29 2f 6d 61 78 28 29 20 61 72 67 75 6d  in()/max() argum
6e10: 65 6e 74 20 74 6f 20 66 6f 72 20 4d 61 6b 65 52  ent to for MakeR
6e20: 65 63 6f 72 64 0a 20 20 20 20 20 20 2a 2a 20 20  ecord.      **  
6e30: 20 72 65 67 41 70 70 2b 31 3a 20 69 6e 74 65 67   regApp+1: integ
6e40: 65 72 20 76 61 6c 75 65 20 75 73 65 64 20 74 6f  er value used to
6e50: 20 65 6e 73 75 72 65 20 6b 65 79 73 20 61 72 65   ensure keys are
6e60: 20 75 6e 69 71 75 65 0a 20 20 20 20 20 20 2a 2a   unique.      **
6e70: 20 20 20 72 65 67 41 70 70 2b 32 3a 20 6f 75 74     regApp+2: out
6e80: 70 75 74 20 6f 66 20 4d 61 6b 65 52 65 63 6f 72  put of MakeRecor
6e90: 64 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  d.      */.     
6ea0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
6eb0: 20 3d 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d   = pWin->pOwner-
6ec0: 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  >x.pList;.      
6ed0: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
6ee0: 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
6ef0: 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
6f00: 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 30 2c  Parse, pList, 0,
6f10: 20 30 29 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d   0);.      pWin-
6f20: 3e 63 73 72 41 70 70 20 3d 20 70 50 61 72 73 65  >csrApp = pParse
6f30: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
6f40: 70 57 69 6e 2d 3e 72 65 67 41 70 70 20 3d 20 70  pWin->regApp = p
6f50: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
6f60: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
6f70: 6d 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20 69 66  m += 3;.      if
6f80: 28 20 70 4b 65 79 49 6e 66 6f 20 26 26 20 70 57  ( pKeyInfo && pW
6f90: 69 6e 2d 3e 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65  in->pFunc->zName
6fa0: 5b 31 5d 3d 3d 27 69 27 20 29 7b 0a 20 20 20 20  [1]=='i' ){.    
6fb0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79      assert( pKey
6fc0: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
6fd0: 5b 30 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  [0]==0 );.      
6fe0: 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72    pKeyInfo->aSor
6ff0: 74 4f 72 64 65 72 5b 30 5d 20 3d 20 31 3b 0a 20  tOrder[0] = 1;. 
7000: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
7010: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
7020: 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
7030: 61 6c 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70  al, pWin->csrApp
7040: 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 2);.      sqli
7050: 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
7060: 76 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  v, pKeyInfo, P4_
7070: 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
7080: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7090: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
70a0: 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70   0, pWin->regApp
70b0: 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65  +1);.    }.    e
70c0: 6c 73 65 20 69 66 28 20 70 2d 3e 78 53 46 75 6e  lse if( p->xSFun
70d0: 63 3d 3d 6e 74 68 5f 76 61 6c 75 65 53 74 65 70  c==nth_valueStep
70e0: 46 75 6e 63 20 7c 7c 20 70 2d 3e 78 53 46 75 6e  Func || p->xSFun
70f0: 63 3d 3d 66 69 72 73 74 5f 76 61 6c 75 65 53 74  c==first_valueSt
7100: 65 70 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20  epFunc ){.      
7110: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 77 6f 20  /* Allocate two 
7120: 72 65 67 69 73 74 65 72 73 20 61 74 20 70 57 69  registers at pWi
7130: 6e 2d 3e 72 65 67 41 70 70 2e 20 54 68 65 73 65  n->regApp. These
7140: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
7150: 0a 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 20  .      ** store 
7160: 74 68 65 20 73 74 61 72 74 20 61 6e 64 20 65 6e  the start and en
7170: 64 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63  d index of the c
7180: 75 72 72 65 6e 74 20 66 72 61 6d 65 2e 20 20 2a  urrent frame.  *
7190: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
71a0: 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 20 29  pMWin->iEphCsr )
71b0: 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 72 65  ;.      pWin->re
71c0: 67 41 70 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e  gApp = pParse->n
71d0: 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 70 57 69  Mem+1;.      pWi
71e0: 6e 2d 3e 63 73 72 41 70 70 20 3d 20 70 50 61 72  n->csrApp = pPar
71f0: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
7200: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
7210: 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 2;.      sqlit
7220: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
7230: 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70 57 69 6e  OP_OpenDup, pWin
7240: 2d 3e 63 73 72 41 70 70 2c 20 70 4d 57 69 6e 2d  ->csrApp, pMWin-
7250: 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 20 20 7d  >iEphCsr);.    }
7260: 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 2d  .    else if( p-
7270: 3e 78 53 46 75 6e 63 3d 3d 6c 65 61 64 53 74 65  >xSFunc==leadSte
7280: 70 46 75 6e 63 20 7c 7c 20 70 2d 3e 78 53 46 75  pFunc || p->xSFu
7290: 6e 63 3d 3d 6c 61 67 53 74 65 70 46 75 6e 63 20  nc==lagStepFunc 
72a0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
72b0: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 20   pMWin->iEphCsr 
72c0: 29 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 63  );.      pWin->c
72d0: 73 72 41 70 70 20 3d 20 70 50 61 72 73 65 2d 3e  srApp = pParse->
72e0: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 73 71  nTab++;.      sq
72f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7300: 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70  v, OP_OpenDup, p
7310: 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20 70 4d 57  Win->csrApp, pMW
7320: 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20  in->iEphCsr);.  
7330: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
7340: 20 41 20 22 50 52 45 43 45 44 49 4e 47 20 3c 65   A "PRECEDING <e
7350: 78 70 72 3e 22 20 28 62 45 6e 64 3d 3d 30 29 20  xpr>" (bEnd==0) 
7360: 6f 72 20 22 46 4f 4c 4c 4f 57 49 4e 47 20 3c 65  or "FOLLOWING <e
7370: 78 70 72 3e 22 20 28 62 45 6e 64 3d 3d 31 29 20  xpr>" (bEnd==1) 
7380: 68 61 73 20 6a 75 73 74 20 0a 2a 2a 20 62 65 65  has just .** bee
7390: 6e 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  n evaluated and 
73a0: 74 68 65 20 72 65 73 75 6c 74 20 6c 65 66 74 20  the result left 
73b0: 69 6e 20 72 65 67 69 73 74 65 72 20 72 65 67 2e  in register reg.
73c0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 67   This function g
73d0: 65 6e 65 72 61 74 65 73 0a 2a 2a 20 56 4d 20 63  enerates.** VM c
73e0: 6f 64 65 20 74 6f 20 63 68 65 63 6b 20 74 68 61  ode to check tha
73f0: 74 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 61  t the value is a
7400: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e   non-negative in
7410: 74 65 67 65 72 20 61 6e 64 20 74 68 72 6f 77 73  teger and throws
7420: 0a 2a 2a 20 61 6e 20 65 78 63 65 70 74 69 6f 6e  .** an exception
7430: 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2e 0a 2a   if it is not..*
7440: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
7450: 6e 64 6f 77 43 68 65 63 6b 46 72 61 6d 65 56 61  ndowCheckFrameVa
7460: 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  lue(Parse *pPars
7470: 65 2c 20 69 6e 74 20 72 65 67 2c 20 69 6e 74 20  e, int reg, int 
7480: 62 45 6e 64 29 7b 0a 20 20 73 74 61 74 69 63 20  bEnd){.  static 
7490: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 45 72  const char *azEr
74a0: 72 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 66 72 61  r[] = {.    "fra
74b0: 6d 65 20 73 74 61 72 74 69 6e 67 20 6f 66 66 73  me starting offs
74c0: 65 74 20 6d 75 73 74 20 62 65 20 61 20 6e 6f 6e  et must be a non
74d0: 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67 65  -negative intege
74e0: 72 22 2c 0a 20 20 20 20 22 66 72 61 6d 65 20 65  r",.    "frame e
74f0: 6e 64 69 6e 67 20 6f 66 66 73 65 74 20 6d 75 73  nding offset mus
7500: 74 20 62 65 20 61 20 6e 6f 6e 2d 6e 65 67 61 74  t be a non-negat
7510: 69 76 65 20 69 6e 74 65 67 65 72 22 0a 20 20 7d  ive integer".  }
7520: 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  ;.  Vdbe *v = sq
7530: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
7540: 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 65 67 5a  rse);.  int regZ
7550: 65 72 6f 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ero = sqlite3Get
7560: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
7570: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
7580: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
7590: 65 72 2c 20 30 2c 20 72 65 67 5a 65 72 6f 29 3b  er, 0, regZero);
75a0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
75b0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp2(v, OP_MustB
75c0: 65 49 6e 74 2c 20 72 65 67 2c 20 73 71 6c 69 74  eInt, reg, sqlit
75d0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
75e0: 72 28 76 29 2b 32 29 3b 0a 20 20 73 71 6c 69 74  r(v)+2);.  sqlit
75f0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
7600: 4f 50 5f 47 65 2c 20 72 65 67 5a 65 72 6f 2c 20  OP_Ge, regZero, 
7610: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
7620: 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 72 65 67  ntAddr(v)+2, reg
7630: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
7640: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 48 61 6c  AddOp2(v, OP_Hal
7650: 74 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c  t, SQLITE_ERROR,
7660: 20 4f 45 5f 41 62 6f 72 74 29 3b 0a 20 20 73 71   OE_Abort);.  sq
7670: 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
7680: 34 28 76 2c 20 28 76 6f 69 64 2a 29 61 7a 45 72  4(v, (void*)azEr
7690: 72 5b 62 45 6e 64 5d 2c 20 50 34 5f 53 54 41 54  r[bEnd], P4_STAT
76a0: 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  IC);.  sqlite3Re
76b0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
76c0: 72 73 65 2c 20 72 65 67 5a 65 72 6f 29 3b 0a 7d  rse, regZero);.}
76d0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
76e0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  he number of arg
76f0: 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f  uments passed to
7700: 20 74 68 65 20 77 69 6e 64 6f 77 2d 66 75 6e 63   the window-func
7710: 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 0a  tion associated.
7720: 2a 2a 20 77 69 74 68 20 74 68 65 20 6f 62 6a 65  ** with the obje
7730: 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
7740: 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 74   only argument t
7750: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  o this function.
7760: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
7770: 69 6e 64 6f 77 41 72 67 43 6f 75 6e 74 28 57 69  indowArgCount(Wi
7780: 6e 64 6f 77 20 2a 70 57 69 6e 29 7b 0a 20 20 45  ndow *pWin){.  E
7790: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
77a0: 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78   pWin->pOwner->x
77b0: 2e 70 4c 69 73 74 3b 0a 20 20 72 65 74 75 72 6e  .pList;.  return
77c0: 20 28 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d   (pList ? pList-
77d0: 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 7d 0a 0a  >nExpr : 0);.}..
77e0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56  /*.** Generate V
77f0: 4d 20 63 6f 64 65 20 74 6f 20 69 6e 76 6f 6b 65  M code to invoke
7800: 20 65 69 74 68 65 72 20 78 53 74 65 70 28 29 20   either xStep() 
7810: 28 69 66 20 62 49 6e 76 65 72 73 65 20 69 73 20  (if bInverse is 
7820: 30 29 20 6f 72 20 0a 2a 2a 20 78 49 6e 76 65 72  0) or .** xInver
7830: 73 65 20 28 69 66 20 62 49 6e 76 65 72 73 65 20  se (if bInverse 
7840: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 29 20 66 6f 72  is non-zero) for
7850: 20 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e   each window fun
7860: 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 0a 2a 2a  ction in the .**
7870: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61   linked list sta
7880: 72 74 69 6e 67 20 61 74 20 70 4d 57 69 6e 2e 20  rting at pMWin. 
7890: 4f 72 2c 20 66 6f 72 20 62 75 69 6c 74 2d 69 6e  Or, for built-in
78a0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
78b0: 73 0a 2a 2a 20 74 68 61 74 20 64 6f 20 6e 6f 74  s.** that do not
78c0: 20 75 73 65 20 74 68 65 20 73 74 61 6e 64 61 72   use the standar
78d0: 64 20 66 75 6e 63 74 69 6f 6e 20 41 50 49 2c 20  d function API, 
78e0: 67 65 6e 65 72 61 74 65 20 74 68 65 20 72 65 71  generate the req
78f0: 75 69 72 65 64 0a 2a 2a 20 69 6e 6c 69 6e 65 20  uired.** inline 
7900: 56 4d 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49  VM code..**.** I
7910: 66 20 61 72 67 75 6d 65 6e 74 20 63 73 72 20 69  f argument csr i
7920: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
7930: 72 20 65 71 75 61 6c 20 74 6f 20 30 2c 20 74 68  r equal to 0, th
7940: 65 6e 20 61 72 67 75 6d 65 6e 74 20 72 65 67 20  en argument reg 
7950: 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  is.** the first 
7960: 72 65 67 69 73 74 65 72 20 69 6e 20 61 6e 20 61  register in an a
7970: 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
7980: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
7990: 62 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75  be large.** enou
79a0: 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 61  gh to hold the a
79b0: 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74  rray of argument
79c0: 73 20 66 6f 72 20 65 61 63 68 20 66 75 6e 63 74  s for each funct
79d0: 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ion. In this cas
79e0: 65 0a 2a 2a 20 74 68 65 20 61 72 67 75 6d 65 6e  e.** the argumen
79f0: 74 73 20 61 72 65 20 65 78 74 72 61 63 74 65 64  ts are extracted
7a00: 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
7a10: 74 20 72 6f 77 20 6f 66 20 63 73 72 20 69 6e 74  t row of csr int
7a20: 6f 20 74 68 65 0a 2a 2a 20 61 72 72 61 79 20 6f  o the.** array o
7a30: 66 20 72 65 67 69 73 74 65 72 73 20 62 65 66 6f  f registers befo
7a40: 72 65 20 69 6e 76 6f 6b 69 6e 67 20 4f 50 5f 41  re invoking OP_A
7a50: 67 67 53 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 4f 72  ggStep..**.** Or
7a60: 2c 20 69 66 20 63 73 72 20 69 73 20 6c 65 73 73  , if csr is less
7a70: 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
7a80: 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 72 65   the array of re
7a90: 67 69 73 74 65 72 73 20 61 74 20 72 65 67 20 69  gisters at reg i
7aa0: 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 70 6f 70  s.** already pop
7ab0: 75 6c 61 74 65 64 20 77 69 74 68 20 61 6c 6c 20  ulated with all 
7ac0: 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65  columns from the
7ad0: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
7ae0: 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a  the sub-query..*
7af0: 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  *.** If argument
7b00: 20 72 65 67 50 61 72 74 53 69 7a 65 20 69 73 20   regPartSize is 
7b10: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69  non-zero, then i
7b20: 74 20 69 73 20 61 20 72 65 67 69 73 74 65 72 20  t is a register 
7b30: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 0a 2a  containing the.*
7b40: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * number of rows
7b50: 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
7b60: 70 61 72 74 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  partition..*/.st
7b70: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77  atic void window
7b80: 41 67 67 53 74 65 70 28 0a 20 20 50 61 72 73 65  AggStep(.  Parse
7b90: 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 57 69 6e   *pParse, .  Win
7ba0: 64 6f 77 20 2a 70 4d 57 69 6e 2c 20 20 20 20 20  dow *pMWin,     
7bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7bc0: 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 77  Linked list of w
7bd0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
7be0: 2a 2f 0a 20 20 69 6e 74 20 63 73 72 2c 20 20 20  */.  int csr,   
7bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c00: 20 20 20 20 20 2f 2a 20 52 65 61 64 20 61 72 67       /* Read arg
7c10: 75 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 69 73  uments from this
7c20: 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 69 6e 74   cursor */.  int
7c30: 20 62 49 6e 76 65 72 73 65 2c 20 20 20 20 20 20   bInverse,      
7c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7c50: 54 72 75 65 20 74 6f 20 69 6e 76 6f 6b 65 20 78  True to invoke x
7c60: 49 6e 76 65 72 73 65 20 69 6e 73 74 65 61 64 20  Inverse instead 
7c70: 6f 66 20 78 53 74 65 70 20 2a 2f 0a 20 20 69 6e  of xStep */.  in
7c80: 74 20 72 65 67 2c 20 20 20 20 20 20 20 20 20 20  t reg,          
7c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7ca0: 20 41 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   Array of regist
7cb0: 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ers */.  int reg
7cc0: 50 61 72 74 53 69 7a 65 20 20 20 20 20 20 20 20  PartSize        
7cd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
7ce0: 73 74 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ster containing 
7cf0: 73 69 7a 65 20 6f 66 20 70 61 72 74 69 74 69 6f  size of partitio
7d00: 6e 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  n */.){.  Vdbe *
7d10: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
7d20: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 57 69  be(pParse);.  Wi
7d30: 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 66 6f  ndow *pWin;.  fo
7d40: 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57  r(pWin=pMWin; pW
7d50: 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70  in; pWin=pWin->p
7d60: 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 69 6e  NextWin){.    in
7d70: 74 20 66 6c 61 67 73 20 3d 20 70 57 69 6e 2d 3e  t flags = pWin->
7d80: 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73  pFunc->funcFlags
7d90: 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 41 72 67  ;.    int regArg
7da0: 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 20 3d  ;.    int nArg =
7db0: 20 77 69 6e 64 6f 77 41 72 67 43 6f 75 6e 74 28   windowArgCount(
7dc0: 70 57 69 6e 29 3b 0a 0a 20 20 20 20 69 66 28 20  pWin);..    if( 
7dd0: 63 73 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  csr>=0 ){.      
7de0: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
7df0: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
7e00: 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
7e10: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
7e20: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c   OP_Column, csr,
7e30: 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 69   pWin->iArgCol+i
7e40: 2c 20 72 65 67 2b 69 29 3b 0a 20 20 20 20 20 20  , reg+i);.      
7e50: 7d 0a 20 20 20 20 20 20 72 65 67 41 72 67 20 3d  }.      regArg =
7e60: 20 72 65 67 3b 0a 20 20 20 20 20 20 69 66 28 20   reg;.      if( 
7e70: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
7e80: 55 4e 43 5f 57 49 4e 44 4f 57 5f 53 49 5a 45 20  UNC_WINDOW_SIZE 
7e90: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ){.        if( n
7ea0: 41 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Arg==0 ){.      
7eb0: 20 20 20 20 72 65 67 41 72 67 20 3d 20 72 65 67      regArg = reg
7ec0: 50 61 72 74 53 69 7a 65 3b 0a 20 20 20 20 20 20  PartSize;.      
7ed0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7ee0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7ef0: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
7f00: 2c 20 72 65 67 50 61 72 74 53 69 7a 65 2c 20 72  , regPartSize, r
7f10: 65 67 2b 6e 41 72 67 29 3b 0a 20 20 20 20 20 20  eg+nArg);.      
7f20: 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 41 72 67    }.        nArg
7f30: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
7f40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
7f50: 65 72 74 28 20 21 28 66 6c 61 67 73 20 26 20 53  ert( !(flags & S
7f60: 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f  QLITE_FUNC_WINDO
7f70: 57 5f 53 49 5a 45 29 20 29 3b 0a 20 20 20 20 20  W_SIZE) );.     
7f80: 20 72 65 67 41 72 67 20 3d 20 72 65 67 20 2b 20   regArg = reg + 
7f90: 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 3b 0a 20  pWin->iArgCol;. 
7fa0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70     }..    if( (p
7fb0: 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63  Win->pFunc->func
7fc0: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
7fd0: 55 4e 43 5f 4d 49 4e 4d 41 58 29 20 0a 20 20 20  UNC_MINMAX) .   
7fe0: 20 20 20 26 26 20 70 57 69 6e 2d 3e 65 53 74 61     && pWin->eSta
7ff0: 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  rt!=TK_UNBOUNDED
8000: 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69   .    ){.      i
8010: 66 28 20 62 49 6e 76 65 72 73 65 3d 3d 30 20 29  f( bInverse==0 )
8020: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8030: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8040: 50 5f 41 64 64 49 6d 6d 2c 20 70 57 69 6e 2d 3e  P_AddImm, pWin->
8050: 72 65 67 41 70 70 2b 31 2c 20 31 29 3b 0a 20 20  regApp+1, 1);.  
8060: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8070: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
8080: 6f 70 79 2c 20 72 65 67 41 72 67 2c 20 70 57 69  opy, regArg, pWi
8090: 6e 2d 3e 72 65 67 41 70 70 29 3b 0a 20 20 20 20  n->regApp);.    
80a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
80b0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
80c0: 52 65 63 6f 72 64 2c 20 70 57 69 6e 2d 3e 72 65  Record, pWin->re
80d0: 67 41 70 70 2c 20 32 2c 20 70 57 69 6e 2d 3e 72  gApp, 2, pWin->r
80e0: 65 67 41 70 70 2b 32 29 3b 0a 20 20 20 20 20 20  egApp+2);.      
80f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8100: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
8110: 65 72 74 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70  ert, pWin->csrAp
8120: 70 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b  p, pWin->regApp+
8130: 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  2);.      }else{
8140: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8150: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
8160: 20 4f 50 5f 53 65 65 6b 47 45 2c 20 70 57 69 6e   OP_SeekGE, pWin
8170: 2d 3e 63 73 72 41 70 70 2c 20 30 2c 20 72 65 67  ->csrApp, 0, reg
8180: 41 72 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  Arg, 1);.       
8190: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
81a0: 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c  p1(v, OP_Delete,
81b0: 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 29 3b 0a   pWin->csrApp);.
81c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
81d0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 73  dbeJumpHere(v, s
81e0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
81f0: 74 41 64 64 72 28 76 29 2d 32 29 3b 0a 20 20 20  tAddr(v)-2);.   
8200: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
8210: 66 28 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 20  f( pWin->regApp 
8220: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
8230: 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 78 53   pWin->pFunc->xS
8240: 46 75 6e 63 3d 3d 6e 74 68 5f 76 61 6c 75 65 53  Func==nth_valueS
8250: 74 65 70 46 75 6e 63 20 0a 20 20 20 20 20 20 20  tepFunc .       
8260: 20 20 20 20 7c 7c 20 70 57 69 6e 2d 3e 70 46 75      || pWin->pFu
8270: 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 66 69 72 73  nc->xSFunc==firs
8280: 74 5f 76 61 6c 75 65 53 74 65 70 46 75 6e 63 20  t_valueStepFunc 
8290: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
82a0: 61 73 73 65 72 74 28 20 62 49 6e 76 65 72 73 65  assert( bInverse
82b0: 3d 3d 30 20 7c 7c 20 62 49 6e 76 65 72 73 65 3d  ==0 || bInverse=
82c0: 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
82d0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
82e0: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 57 69 6e   OP_AddImm, pWin
82f0: 2d 3e 72 65 67 41 70 70 2b 31 2d 62 49 6e 76 65  ->regApp+1-bInve
8300: 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c  rse, 1);.    }el
8310: 73 65 20 69 66 28 20 70 57 69 6e 2d 3e 70 46 75  se if( pWin->pFu
8320: 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 6c 65 61 64  nc->xSFunc==lead
8330: 53 74 65 70 46 75 6e 63 20 0a 20 20 20 20 20 20  StepFunc .      
8340: 20 20 20 20 20 7c 7c 20 70 57 69 6e 2d 3e 70 46       || pWin->pF
8350: 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 6c 61 67  unc->xSFunc==lag
8360: 53 74 65 70 46 75 6e 63 20 0a 20 20 20 20 29 7b  StepFunc .    ){
8370: 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20  .      /* no-op 
8380: 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
8390: 20 20 20 20 69 6e 74 20 61 64 64 72 49 66 20 3d      int addrIf =
83a0: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57   0;.      if( pW
83b0: 69 6e 2d 3e 70 46 69 6c 74 65 72 20 29 7b 0a 20  in->pFilter ){. 
83c0: 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 54 6d         int regTm
83d0: 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  p;.        asser
83e0: 74 28 20 6e 41 72 67 3d 3d 70 57 69 6e 2d 3e 70  t( nArg==pWin->p
83f0: 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  Owner->x.pList->
8400: 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 20  nExpr );.       
8410: 20 69 66 28 20 63 73 72 3e 30 20 29 7b 0a 20 20   if( csr>0 ){.  
8420: 20 20 20 20 20 20 20 20 72 65 67 54 6d 70 20 3d          regTmp =
8430: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
8440: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
8450: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8460: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
8470: 6c 75 6d 6e 2c 20 63 73 72 2c 20 70 57 69 6e 2d  lumn, csr, pWin-
8480: 3e 69 41 72 67 43 6f 6c 2b 6e 41 72 67 2c 72 65  >iArgCol+nArg,re
8490: 67 54 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  gTmp);.        }
84a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
84b0: 72 65 67 54 6d 70 20 3d 20 72 65 67 41 72 67 20  regTmp = regArg 
84c0: 2b 20 6e 41 72 67 3b 0a 20 20 20 20 20 20 20 20  + nArg;.        
84d0: 7d 0a 20 20 20 20 20 20 20 20 61 64 64 72 49 66  }.        addrIf
84e0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
84f0: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp3(v, OP_IfNot
8500: 2c 20 72 65 67 54 6d 70 2c 20 30 2c 20 31 29 3b  , regTmp, 0, 1);
8510: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 73 72  .        if( csr
8520: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
8530: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
8540: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
8550: 67 54 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  gTmp);.        }
8560: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
8570: 66 28 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e  f( pWin->pFunc->
8580: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
8590: 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c  TE_FUNC_NEEDCOLL
85a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c   ){.        Coll
85b0: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
85c0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
85d0: 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71  te3ExprNNCollSeq
85e0: 28 70 50 61 72 73 65 2c 20 70 57 69 6e 2d 3e 70  (pParse, pWin->p
85f0: 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  Owner->x.pList->
8600: 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[0].pExpr);.   
8610: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8620: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp4(v, OP_Col
8630: 6c 53 65 71 2c 20 30 2c 30 2c 30 2c 20 28 63 6f  lSeq, 0,0,0, (co
8640: 6e 73 74 20 63 68 61 72 2a 29 70 43 6f 6c 6c 2c  nst char*)pColl,
8650: 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
8660: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
8670: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
8680: 20 4f 50 5f 41 67 67 53 74 65 70 30 2c 20 62 49   OP_AggStep0, bI
8690: 6e 76 65 72 73 65 2c 20 72 65 67 41 72 67 2c 20  nverse, regArg, 
86a0: 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 29 3b  pWin->regAccum);
86b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
86c0: 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 57  beAppendP4(v, pW
86d0: 69 6e 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55  in->pFunc, P4_FU
86e0: 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 73 71  NCDEF);.      sq
86f0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
8700: 35 28 76 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a  5(v, (u8)nArg);.
8710: 20 20 20 20 20 20 69 66 28 20 61 64 64 72 49 66        if( addrIf
8720: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75   ) sqlite3VdbeJu
8730: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 66  mpHere(v, addrIf
8740: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
8750: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56  /*.** Generate V
8760: 4d 20 63 6f 64 65 20 74 6f 20 69 6e 76 6f 6b 65  M code to invoke
8770: 20 65 69 74 68 65 72 20 78 56 61 6c 75 65 28 29   either xValue()
8780: 20 28 62 46 69 6e 61 6c 3d 3d 30 29 20 6f 72 20   (bFinal==0) or 
8790: 78 46 69 6e 61 6c 69 7a 65 28 29 0a 2a 2a 20 28  xFinalize().** (
87a0: 62 46 69 6e 61 6c 3d 3d 31 29 20 66 6f 72 20 65  bFinal==1) for e
87b0: 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  ach window funct
87c0: 69 6f 6e 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65  ion in the linke
87d0: 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67 20  d list starting 
87e0: 61 74 0a 2a 2a 20 70 4d 57 69 6e 2e 20 4f 72 2c  at.** pMWin. Or,
87f0: 20 66 6f 72 20 62 75 69 6c 74 2d 69 6e 20 77 69   for built-in wi
8800: 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e 73 20 74  ndow-functions t
8810: 68 61 74 20 64 6f 20 6e 6f 74 20 75 73 65 20 74  hat do not use t
8820: 68 65 20 73 74 61 6e 64 61 72 64 0a 2a 2a 20 41  he standard.** A
8830: 50 49 2c 20 67 65 6e 65 72 61 74 65 20 74 68 65  PI, generate the
8840: 20 65 71 75 69 76 61 6c 65 6e 74 20 56 4d 20 63   equivalent VM c
8850: 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ode..*/.static v
8860: 6f 69 64 20 77 69 6e 64 6f 77 41 67 67 46 69 6e  oid windowAggFin
8870: 61 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  al(Parse *pParse
8880: 2c 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 2c  , Window *pMWin,
8890: 20 69 6e 74 20 62 46 69 6e 61 6c 29 7b 0a 20 20   int bFinal){.  
88a0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
88b0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
88c0: 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e  ;.  Window *pWin
88d0: 3b 0a 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d  ;..  for(pWin=pM
88e0: 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d  Win; pWin; pWin=
88f0: 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b  pWin->pNextWin){
8900: 0a 20 20 20 20 69 66 28 20 28 70 57 69 6e 2d 3e  .    if( (pWin->
8910: 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73  pFunc->funcFlags
8920: 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d   & SQLITE_FUNC_M
8930: 49 4e 4d 41 58 29 20 0a 20 20 20 20 20 26 26 20  INMAX) .     && 
8940: 70 57 69 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b  pWin->eStart!=TK
8950: 5f 55 4e 42 4f 55 4e 44 45 44 20 0a 20 20 20 20  _UNBOUNDED .    
8960: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8970: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
8980: 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e  _Null, 0, pWin->
8990: 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  regResult);.    
89a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
89b0: 4f 70 31 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20  Op1(v, OP_Last, 
89c0: 70 57 69 6e 2d 3e 63 73 72 41 70 70 29 3b 0a 20  pWin->csrApp);. 
89d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
89e0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
89f0: 75 6d 6e 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70  umn, pWin->csrAp
8a00: 70 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 52  p, 0, pWin->regR
8a10: 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 73 71  esult);.      sq
8a20: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
8a30: 65 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65  e(v, sqlite3Vdbe
8a40: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 32  CurrentAddr(v)-2
8a50: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 46 69  );.      if( bFi
8a60: 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  nal ){.        s
8a70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
8a80: 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74  (v, OP_ResetSort
8a90: 65 72 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70  er, pWin->csrApp
8aa0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
8ab0: 65 6c 73 65 20 69 66 28 20 70 57 69 6e 2d 3e 72  else if( pWin->r
8ac0: 65 67 41 70 70 20 29 7b 0a 20 20 20 20 7d 65 6c  egApp ){.    }el
8ad0: 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 62 46  se{.      if( bF
8ae0: 69 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  inal==0 ){.     
8af0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8b00: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
8b10: 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73   0, pWin->regRes
8b20: 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ult);.      }.  
8b30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8b40: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 67 67 46  ddOp2(v, OP_AggF
8b50: 69 6e 61 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 41  inal, pWin->regA
8b60: 63 63 75 6d 2c 20 77 69 6e 64 6f 77 41 72 67 43  ccum, windowArgC
8b70: 6f 75 6e 74 28 70 57 69 6e 29 29 3b 0a 20 20 20  ount(pWin));.   
8b80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70     sqlite3VdbeAp
8b90: 70 65 6e 64 50 34 28 76 2c 20 70 57 69 6e 2d 3e  pendP4(v, pWin->
8ba0: 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45  pFunc, P4_FUNCDE
8bb0: 46 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 46  F);.      if( bF
8bc0: 69 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  inal ){.        
8bd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8be0: 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 57  2(v, OP_Copy, pW
8bf0: 69 6e 2d 3e 72 65 67 41 63 63 75 6d 2c 20 70 57  in->regAccum, pW
8c00: 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a  in->regResult);.
8c10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
8c20: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8c30: 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72  Null, 0, pWin->r
8c40: 65 67 41 63 63 75 6d 29 3b 0a 20 20 20 20 20 20  egAccum);.      
8c50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
8c60: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
8c70: 50 33 28 76 2c 20 2d 31 2c 20 70 57 69 6e 2d 3e  P3(v, -1, pWin->
8c80: 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  regResult);.    
8c90: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
8ca0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
8cb0: 74 69 6f 6e 20 67 65 6e 65 72 61 74 65 73 20 56  tion generates V
8cc0: 4d 20 63 6f 64 65 20 74 6f 20 69 6e 76 6f 6b 65  M code to invoke
8cd0: 20 74 68 65 20 73 75 62 2d 72 6f 75 74 69 6e 65   the sub-routine
8ce0: 20 61 74 20 61 64 64 72 65 73 73 0a 2a 2a 20 6c   at address.** l
8cf0: 62 6c 46 6c 75 73 68 50 61 72 74 20 6f 6e 63 65  blFlushPart once
8d00: 20 66 6f 72 20 65 61 63 68 20 70 61 72 74 69 74   for each partit
8d10: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 65 6e 74  ion with the ent
8d20: 69 72 65 20 70 61 72 74 69 74 69 6f 6e 20 63 61  ire partition ca
8d30: 63 68 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 57  ched in.** the W
8d40: 69 6e 64 6f 77 2e 69 45 70 68 43 73 72 20 74 65  indow.iEphCsr te
8d50: 6d 70 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  mp table..*/.sta
8d60: 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 50  tic void windowP
8d70: 61 72 74 69 74 69 6f 6e 43 61 63 68 65 28 0a 20  artitionCache(. 
8d80: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a   Parse *pParse,.
8d90: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
8da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8db0: 20 20 2f 2a 20 54 68 65 20 72 65 77 72 69 74 74    /* The rewritt
8dc0: 65 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  en SELECT statem
8dd0: 65 6e 74 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ent */.  WhereIn
8de0: 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 20  fo *pWInfo,     
8df0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72           /* Wher
8e00: 65 49 6e 66 6f 20 74 6f 20 63 61 6c 6c 20 57 68  eInfo to call Wh
8e10: 65 72 65 45 6e 64 28 29 20 6f 6e 20 2a 2f 0a 20  ereEnd() on */. 
8e20: 20 69 6e 74 20 72 65 67 46 6c 75 73 68 50 61 72   int regFlushPar
8e30: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
8e40: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 6f 20   /* Register to 
8e50: 75 73 65 20 77 69 74 68 20 47 6f 73 75 62 20 6c  use with Gosub l
8e60: 62 6c 46 6c 75 73 68 50 61 72 74 20 2a 2f 0a 20  blFlushPart */. 
8e70: 20 69 6e 74 20 6c 62 6c 46 6c 75 73 68 50 61 72   int lblFlushPar
8e80: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
8e90: 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 74   /* Subroutine t
8ea0: 6f 20 47 6f 73 75 62 20 74 6f 20 2a 2f 0a 20 20  o Gosub to */.  
8eb0: 69 6e 74 20 2a 70 52 65 67 53 69 7a 65 20 20 20  int *pRegSize   
8ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ed0: 2f 2a 20 4f 55 54 3a 20 52 65 67 69 73 74 65 72  /* OUT: Register
8ee0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 61 72 74   containing part
8ef0: 69 74 69 6f 6e 20 73 69 7a 65 20 2a 2f 0a 29 7b  ition size */.){
8f00: 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e  .  Window *pMWin
8f10: 20 3d 20 70 2d 3e 70 57 69 6e 3b 0a 20 20 56 64   = p->pWin;.  Vd
8f20: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
8f30: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
8f40: 20 20 69 6e 74 20 69 53 75 62 43 73 72 20 3d 20    int iSubCsr = 
8f50: 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43  p->pSrc->a[0].iC
8f60: 75 72 73 6f 72 3b 0a 20 20 69 6e 74 20 6e 53 75  ursor;.  int nSu
8f70: 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  b = p->pSrc->a[0
8f80: 5d 2e 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  ].pTab->nCol;.  
8f90: 69 6e 74 20 6b 3b 0a 0a 20 20 69 6e 74 20 72 65  int k;..  int re
8fa0: 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  g = pParse->nMem
8fb0: 2b 31 3b 0a 20 20 69 6e 74 20 72 65 67 52 65 63  +1;.  int regRec
8fc0: 6f 72 64 20 3d 20 72 65 67 2b 6e 53 75 62 3b 0a  ord = reg+nSub;.
8fd0: 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 20 3d    int regRowid =
8fe0: 20 72 65 67 52 65 63 6f 72 64 2b 31 3b 0a 0a 20   regRecord+1;.. 
8ff0: 20 2a 70 52 65 67 53 69 7a 65 20 3d 20 72 65 67   *pRegSize = reg
9000: 52 6f 77 69 64 3b 0a 20 20 70 50 61 72 73 65 2d  Rowid;.  pParse-
9010: 3e 6e 4d 65 6d 20 2b 3d 20 6e 53 75 62 20 2b 20  >nMem += nSub + 
9020: 32 3b 0a 0a 20 20 2f 2a 20 4d 61 72 74 69 61 6c  2;..  /* Martial
9030: 20 74 68 65 20 72 6f 77 20 72 65 74 75 72 6e 65   the row returne
9040: 64 20 62 79 20 74 68 65 20 73 75 62 2d 73 65 6c  d by the sub-sel
9050: 65 63 74 20 69 6e 74 6f 20 61 6e 20 61 72 72 61  ect into an arra
9060: 79 20 6f 66 20 0a 20 20 2a 2a 20 72 65 67 69 73  y of .  ** regis
9070: 74 65 72 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 6b  ters. */.  for(k
9080: 3d 30 3b 20 6b 3c 6e 53 75 62 3b 20 6b 2b 2b 29  =0; k<nSub; k++)
9090: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
90a0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
90b0: 6c 75 6d 6e 2c 20 69 53 75 62 43 73 72 2c 20 6b  lumn, iSubCsr, k
90c0: 2c 20 72 65 67 2b 6b 29 3b 0a 20 20 7d 0a 20 20  , reg+k);.  }.  
90d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
90e0: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
90f0: 72 64 2c 20 72 65 67 2c 20 6e 53 75 62 2c 20 72  rd, reg, nSub, r
9100: 65 67 52 65 63 6f 72 64 29 3b 0a 0a 20 20 2f 2a  egRecord);..  /*
9110: 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 69   Check if this i
9120: 73 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  s the start of a
9130: 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 2e 20   new partition. 
9140: 49 66 20 73 6f 2c 20 63 61 6c 6c 20 74 68 65 0a  If so, call the.
9150: 20 20 2a 2a 20 66 6c 75 73 68 5f 70 61 72 74 69    ** flush_parti
9160: 74 69 6f 6e 20 73 75 62 2d 72 6f 75 74 69 6e 65  tion sub-routine
9170: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69  .  */.  if( pMWi
9180: 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 29 7b  n->pPartition ){
9190: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  .    int addr;. 
91a0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 50 61     ExprList *pPa
91b0: 72 74 20 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72  rt = pMWin->pPar
91c0: 74 69 74 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20  tition;.    int 
91d0: 6e 50 61 72 74 20 3d 20 70 50 61 72 74 2d 3e 6e  nPart = pPart->n
91e0: 45 78 70 72 3b 0a 20 20 20 20 69 6e 74 20 72 65  Expr;.    int re
91f0: 67 4e 65 77 50 61 72 74 20 3d 20 72 65 67 20 2b  gNewPart = reg +
9200: 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43   pMWin->nBufferC
9210: 6f 6c 3b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20  ol;.    KeyInfo 
9220: 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69  *pKeyInfo = sqli
9230: 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78  te3KeyInfoFromEx
9240: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
9250: 50 61 72 74 2c 20 30 2c 20 30 29 3b 0a 0a 20 20  Part, 0, 0);..  
9260: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
9270: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
9280: 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67 4e 65 77  _Compare, regNew
9290: 50 61 72 74 2c 20 70 4d 57 69 6e 2d 3e 72 65 67  Part, pMWin->reg
92a0: 50 61 72 74 2c 6e 50 61 72 74 29 3b 0a 20 20 20  Part,nPart);.   
92b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65   sqlite3VdbeAppe
92c0: 6e 64 50 34 28 76 2c 20 28 76 6f 69 64 2a 29 70  ndP4(v, (void*)p
92d0: 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
92e0: 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  NFO);.    sqlite
92f0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
9300: 50 5f 4a 75 6d 70 2c 20 61 64 64 72 2b 32 2c 20  P_Jump, addr+2, 
9310: 61 64 64 72 2b 34 2c 20 61 64 64 72 2b 32 29 3b  addr+4, addr+2);
9320: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9330: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70  AddOp3(v, OP_Cop
9340: 79 2c 20 72 65 67 4e 65 77 50 61 72 74 2c 20 70  y, regNewPart, p
9350: 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c 20 6e  MWin->regPart, n
9360: 50 61 72 74 2d 31 29 3b 0a 20 20 20 20 73 71 6c  Part-1);.    sql
9370: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
9380: 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 46  , OP_Gosub, regF
9390: 6c 75 73 68 50 61 72 74 2c 20 6c 62 6c 46 6c 75  lushPart, lblFlu
93a0: 73 68 50 61 72 74 29 3b 0a 20 20 7d 0a 0a 20 20  shPart);.  }..  
93b0: 2f 2a 20 42 75 66 66 65 72 20 74 68 65 20 63 75  /* Buffer the cu
93c0: 72 72 65 6e 74 20 72 6f 77 20 69 6e 20 74 68 65  rrent row in the
93d0: 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
93e0: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  . */.  sqlite3Vd
93f0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
9400: 65 77 52 6f 77 69 64 2c 20 70 4d 57 69 6e 2d 3e  ewRowid, pMWin->
9410: 69 45 70 68 43 73 72 2c 20 72 65 67 52 6f 77 69  iEphCsr, regRowi
9420: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  d);.  sqlite3Vdb
9430: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
9440: 73 65 72 74 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  sert, pMWin->iEp
9450: 68 43 73 72 2c 20 72 65 67 52 65 63 6f 72 64 2c  hCsr, regRecord,
9460: 20 72 65 67 52 6f 77 69 64 29 3b 0a 0a 20 20 2f   regRowid);..  /
9470: 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 69 6e 70  * End of the inp
9480: 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c  ut loop */.  sql
9490: 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
94a0: 6e 66 6f 29 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f  nfo);..  /* Invo
94b0: 6b 65 20 22 66 6c 75 73 68 5f 70 61 72 74 69 74  ke "flush_partit
94c0: 69 6f 6e 22 20 74 6f 20 64 65 61 6c 20 77 69 74  ion" to deal wit
94d0: 68 20 74 68 65 20 66 69 6e 61 6c 20 28 6f 72 20  h the final (or 
94e0: 6f 6e 6c 79 29 20 70 61 72 74 69 74 69 6f 6e 20  only) partition 
94f0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
9500: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
9510: 75 62 2c 20 72 65 67 46 6c 75 73 68 50 61 72 74  ub, regFlushPart
9520: 2c 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 29 3b  , lblFlushPart);
9530: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
9540: 20 74 68 65 20 73 75 62 2d 72 6f 75 74 69 6e 65   the sub-routine
9550: 20 61 74 20 72 65 67 47 6f 73 75 62 20 28 67 65   at regGosub (ge
9560: 6e 65 72 61 74 65 64 20 62 79 20 63 6f 64 65 20  nerated by code 
9570: 69 6e 20 73 65 6c 65 63 74 2e 63 29 20 74 6f 0a  in select.c) to.
9580: 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 63 75  ** return the cu
9590: 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 57 69 6e  rrent row of Win
95a0: 64 6f 77 2e 69 45 70 68 43 73 72 2e 20 49 66 20  dow.iEphCsr. If 
95b0: 61 6c 6c 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  all window funct
95c0: 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 61 67 67 72  ions are.** aggr
95d0: 65 67 61 74 65 20 77 69 6e 64 6f 77 20 66 75 6e  egate window fun
95e0: 63 74 69 6f 6e 73 20 74 68 61 74 20 75 73 65 20  ctions that use 
95f0: 74 68 65 20 73 74 61 6e 64 61 72 64 20 41 50 49  the standard API
9600: 2c 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 4f 50  , a single.** OP
9610: 5f 47 6f 73 75 62 20 69 6e 73 74 72 75 63 74 69  _Gosub instructi
9620: 6f 6e 20 69 73 20 61 6c 6c 20 74 68 61 74 20 74  on is all that t
9630: 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
9640: 72 61 74 65 73 2e 20 45 78 74 72 61 20 56 4d 20  rates. Extra VM 
9650: 63 6f 64 65 0a 2a 2a 20 66 6f 72 20 70 65 72 2d  code.** for per-
9660: 72 6f 77 20 70 72 6f 63 65 73 73 69 6e 67 20 69  row processing i
9670: 73 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65 64  s only generated
9680: 20 66 6f 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69   for the followi
9690: 6e 67 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64  ng built-in wind
96a0: 6f 77 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 3a  ow.** functions:
96b0: 0a 2a 2a 0a 2a 2a 20 20 20 6e 74 68 5f 76 61 6c  .**.**   nth_val
96c0: 75 65 28 29 0a 2a 2a 20 20 20 66 69 72 73 74 5f  ue().**   first_
96d0: 76 61 6c 75 65 28 29 0a 2a 2a 20 20 20 6c 61 67  value().**   lag
96e0: 28 29 0a 2a 2a 20 20 20 6c 65 61 64 28 29 0a 2a  ().**   lead().*
96f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
9700: 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52 6f 77  ndowReturnOneRow
9710: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
9720: 65 2c 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57  e,.  Window *pMW
9730: 69 6e 2c 0a 20 20 69 6e 74 20 72 65 67 47 6f 73  in,.  int regGos
9740: 75 62 2c 0a 20 20 69 6e 74 20 61 64 64 72 47 6f  ub,.  int addrGo
9750: 73 75 62 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76  sub.){.  Vdbe *v
9760: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
9770: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 57 69 6e  e(pParse);.  Win
9780: 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 66 6f 72  dow *pWin;.  for
9790: 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69  (pWin=pMWin; pWi
97a0: 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e  n; pWin=pWin->pN
97b0: 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 46 75 6e  extWin){.    Fun
97c0: 63 44 65 66 20 2a 70 46 75 6e 63 20 3d 20 70 57  cDef *pFunc = pW
97d0: 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 69  in->pFunc;.    i
97e0: 66 28 20 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63  f( pFunc->xSFunc
97f0: 3d 3d 6e 74 68 5f 76 61 6c 75 65 53 74 65 70 46  ==nth_valueStepF
9800: 75 6e 63 20 0a 20 20 20 20 20 7c 7c 20 70 46 75  unc .     || pFu
9810: 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 66 69 72 73  nc->xSFunc==firs
9820: 74 5f 76 61 6c 75 65 53 74 65 70 46 75 6e 63 20  t_valueStepFunc 
9830: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 6e  .    ){.      in
9840: 74 20 63 73 72 20 3d 20 70 57 69 6e 2d 3e 63 73  t csr = pWin->cs
9850: 72 41 70 70 3b 0a 20 20 20 20 20 20 69 6e 74 20  rApp;.      int 
9860: 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  lbl = sqlite3Vdb
9870: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
9880: 20 20 20 20 20 69 6e 74 20 74 6d 70 52 65 67 20       int tmpReg 
9890: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
98a0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
98b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
98c0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
98d0: 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73   0, pWin->regRes
98e0: 75 6c 74 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  ult);..      if(
98f0: 20 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d   pFunc->xSFunc==
9900: 6e 74 68 5f 76 61 6c 75 65 53 74 65 70 46 75 6e  nth_valueStepFun
9910: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  c ){.        sql
9920: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
9930: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 4d 57  , OP_Column, pMW
9940: 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 70 57 69  in->iEphCsr, pWi
9950: 6e 2d 3e 69 41 72 67 43 6f 6c 2b 31 2c 74 6d 70  n->iArgCol+1,tmp
9960: 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Reg);.      }els
9970: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
9980: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
9990: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74  OP_Integer, 1, t
99a0: 6d 70 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a  mpReg);.      }.
99b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
99c0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64  eAddOp3(v, OP_Ad
99d0: 64 2c 20 74 6d 70 52 65 67 2c 20 70 57 69 6e 2d  d, tmpReg, pWin-
99e0: 3e 72 65 67 41 70 70 2c 20 74 6d 70 52 65 67 29  >regApp, tmpReg)
99f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
9a00: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
9a10: 47 74 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70  Gt, pWin->regApp
9a20: 2b 31 2c 20 6c 62 6c 2c 20 74 6d 70 52 65 67 29  +1, lbl, tmpReg)
9a30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
9a40: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
9a50: 53 65 65 6b 52 6f 77 69 64 2c 20 63 73 72 2c 20  SeekRowid, csr, 
9a60: 6c 62 6c 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20  lbl, tmpReg);.  
9a70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9a80: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
9a90: 6d 6e 2c 20 63 73 72 2c 20 70 57 69 6e 2d 3e 69  mn, csr, pWin->i
9aa0: 41 72 67 43 6f 6c 2c 20 70 57 69 6e 2d 3e 72 65  ArgCol, pWin->re
9ab0: 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20  gResult);.      
9ac0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
9ad0: 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b  veLabel(v, lbl);
9ae0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
9af0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
9b00: 72 73 65 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20  rse, tmpReg);.  
9b10: 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 28    }.    else if(
9b20: 20 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d   pFunc->xSFunc==
9b30: 6c 65 61 64 53 74 65 70 46 75 6e 63 20 7c 7c 20  leadStepFunc || 
9b40: 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 6c  pFunc->xSFunc==l
9b50: 61 67 53 74 65 70 46 75 6e 63 20 29 7b 0a 20 20  agStepFunc ){.  
9b60: 20 20 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 70      int nArg = p
9b70: 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70  Win->pOwner->x.p
9b80: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
9b90: 20 20 20 69 6e 74 20 69 45 70 68 20 3d 20 70 4d     int iEph = pM
9ba0: 57 69 6e 2d 3e 69 45 70 68 43 73 72 3b 0a 20 20  Win->iEphCsr;.  
9bb0: 20 20 20 20 69 6e 74 20 63 73 72 20 3d 20 70 57      int csr = pW
9bc0: 69 6e 2d 3e 63 73 72 41 70 70 3b 0a 20 20 20 20  in->csrApp;.    
9bd0: 20 20 69 6e 74 20 6c 62 6c 20 3d 20 73 71 6c 69    int lbl = sqli
9be0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
9bf0: 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 74  (v);.      int t
9c00: 6d 70 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47  mpReg = sqlite3G
9c10: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
9c20: 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 41  );..      if( nA
9c30: 72 67 3c 33 20 29 7b 0a 20 20 20 20 20 20 20 20  rg<3 ){.        
9c40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9c50: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
9c60: 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74   pWin->regResult
9c70: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
9c80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
9c90: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
9ca0: 43 6f 6c 75 6d 6e 2c 20 69 45 70 68 2c 20 70 57  Column, iEph, pW
9cb0: 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 32 2c 20 70  in->iArgCol+2, p
9cc0: 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b  Win->regResult);
9cd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
9ce0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
9cf0: 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 45  (v, OP_Rowid, iE
9d00: 70 68 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20  ph, tmpReg);.   
9d10: 20 20 20 69 66 28 20 6e 41 72 67 3c 32 20 29 7b     if( nArg<2 ){
9d20: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 76 61 6c  .        int val
9d30: 20 3d 20 28 70 46 75 6e 63 2d 3e 78 53 46 75 6e   = (pFunc->xSFun
9d40: 63 3d 3d 6c 65 61 64 53 74 65 70 46 75 6e 63 20  c==leadStepFunc 
9d50: 3f 20 31 20 3a 20 2d 31 29 3b 0a 20 20 20 20 20  ? 1 : -1);.     
9d60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9d70: 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
9d80: 6d 2c 20 74 6d 70 52 65 67 2c 20 76 61 6c 29 3b  m, tmpReg, val);
9d90: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9da0: 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 28        int op = (
9db0: 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 6c  pFunc->xSFunc==l
9dc0: 65 61 64 53 74 65 70 46 75 6e 63 20 3f 20 4f 50  eadStepFunc ? OP
9dd0: 5f 41 64 64 20 3a 20 4f 50 5f 53 75 62 74 72 61  _Add : OP_Subtra
9de0: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ct);.        int
9df0: 20 74 6d 70 52 65 67 32 20 3d 20 73 71 6c 69 74   tmpReg2 = sqlit
9e00: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
9e10: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
9e20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
9e30: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 45  v, OP_Column, iE
9e40: 70 68 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f  ph, pWin->iArgCo
9e50: 6c 2b 31 2c 20 74 6d 70 52 65 67 32 29 3b 0a 20  l+1, tmpReg2);. 
9e60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
9e70: 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20  beAddOp3(v, op, 
9e80: 74 6d 70 52 65 67 32 2c 20 74 6d 70 52 65 67 2c  tmpReg2, tmpReg,
9e90: 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20 20   tmpReg);.      
9ea0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
9eb0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
9ec0: 74 6d 70 52 65 67 32 29 3b 0a 20 20 20 20 20 20  tmpReg2);.      
9ed0: 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  }..      sqlite3
9ee0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
9ef0: 5f 53 65 65 6b 52 6f 77 69 64 2c 20 63 73 72 2c  _SeekRowid, csr,
9f00: 20 6c 62 6c 2c 20 74 6d 70 52 65 67 29 3b 0a 20   lbl, tmpReg);. 
9f10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9f20: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
9f30: 75 6d 6e 2c 20 63 73 72 2c 20 70 57 69 6e 2d 3e  umn, csr, pWin->
9f40: 69 41 72 67 43 6f 6c 2c 20 70 57 69 6e 2d 3e 72  iArgCol, pWin->r
9f50: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
9f60: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
9f70: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29  lveLabel(v, lbl)
9f80: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
9f90: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
9fa0: 61 72 73 65 2c 20 74 6d 70 52 65 67 29 3b 0a 20  arse, tmpReg);. 
9fb0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
9fc0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
9fd0: 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 47 6f 73  OP_Gosub, regGos
9fe0: 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a  ub, addrGosub);.
9ff0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
a000: 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
a010: 65 64 20 62 79 20 77 69 6e 64 6f 77 52 65 74 75  ed by windowRetu
a020: 72 6e 4f 6e 65 52 6f 77 28 29 20 61 6e 64 2c 20  rnOneRow() and, 
a030: 6f 70 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 0a  optionally, the.
a040: 2a 2a 20 78 49 6e 76 65 72 73 65 28 29 20 66 75  ** xInverse() fu
a050: 6e 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 20  nction for each 
a060: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 2c  window function,
a070: 20 66 6f 72 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   for one or more
a080: 20 72 6f 77 73 0a 2a 2a 20 66 72 6f 6d 20 74 68   rows.** from th
a090: 65 20 57 69 6e 64 6f 77 2e 69 45 70 68 43 73 72  e Window.iEphCsr
a0a0: 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 54 68 69   temp table. Thi
a0b0: 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
a0c0: 74 65 73 20 56 4d 20 63 6f 64 65 0a 2a 2a 20 73  tes VM code.** s
a0d0: 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a  imilar to:.**.**
a0e0: 20 20 20 77 68 69 6c 65 28 20 72 65 67 43 74 72     while( regCtr
a0f0: 3e 30 20 29 7b 0a 2a 2a 20 20 20 20 20 72 65 67  >0 ){.**     reg
a100: 43 74 72 2d 2d 3b 0a 2a 2a 20 20 20 20 20 77 69  Ctr--;.**     wi
a110: 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52 6f 77  ndowReturnOneRow
a120: 28 29 0a 2a 2a 20 20 20 20 20 69 66 28 20 62 49  ().**     if( bI
a130: 6e 76 65 72 73 65 20 29 7b 0a 2a 2a 20 20 20 20  nverse ){.**    
a140: 20 20 20 41 67 67 53 74 65 70 20 28 78 49 6e 76     AggStep (xInv
a150: 65 72 73 65 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a  erse).**     }.*
a160: 2a 20 20 20 20 20 4e 65 78 74 20 28 57 69 6e 64  *     Next (Wind
a170: 6f 77 2e 69 45 70 68 43 73 72 29 0a 2a 2a 20 20  ow.iEphCsr).**  
a180: 20 7d 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69   }.*/.static voi
a190: 64 20 77 69 6e 64 6f 77 52 65 74 75 72 6e 52 6f  d windowReturnRo
a1a0: 77 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ws(.  Parse *pPa
a1b0: 72 73 65 2c 0a 20 20 57 69 6e 64 6f 77 20 2a 70  rse,.  Window *p
a1c0: 4d 57 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20  MWin,           
a1d0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
a1e0: 66 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  f window functio
a1f0: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43  ns */.  int regC
a200: 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  tr,             
a210: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
a220: 74 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e  ter containing n
a230: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f  umber of rows */
a240: 0a 20 20 69 6e 74 20 72 65 67 47 6f 73 75 62 2c  .  int regGosub,
a250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a260: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66     /* Register f
a270: 6f 72 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73  or Gosub addrGos
a280: 75 62 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ub */.  int addr
a290: 47 6f 73 75 62 2c 20 20 20 20 20 20 20 20 20 20  Gosub,          
a2a0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
a2b0: 73 73 20 6f 66 20 73 75 62 2d 72 6f 75 74 69 6e  ss of sub-routin
a2c0: 65 20 66 6f 72 20 52 65 74 75 72 6e 4f 6e 65 52  e for ReturnOneR
a2d0: 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 49  ow */.  int regI
a2e0: 6e 76 41 72 67 2c 20 20 20 20 20 20 20 20 20 20  nvArg,          
a2f0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
a300: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 66 6f   of registers fo
a310: 72 20 78 49 6e 76 65 72 73 65 20 61 72 67 73 20  r xInverse args 
a320: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 49 6e 76 53  */.  int regInvS
a330: 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ize             
a340: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
a350: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73 69 7a 65   containing size
a360: 20 6f 66 20 70 61 72 74 69 74 69 6f 6e 20 2a 2f   of partition */
a370: 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a  .){.  int addr;.
a380: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
a390: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
a3a0: 65 29 3b 0a 20 20 77 69 6e 64 6f 77 41 67 67 46  e);.  windowAggF
a3b0: 69 6e 61 6c 28 70 50 61 72 73 65 2c 20 70 4d 57  inal(pParse, pMW
a3c0: 69 6e 2c 20 30 29 3b 0a 20 20 61 64 64 72 20 3d  in, 0);.  addr =
a3d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a3e0: 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p3(v, OP_IfPos, 
a3f0: 72 65 67 43 74 72 2c 20 73 71 6c 69 74 65 33 56  regCtr, sqlite3V
a400: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
a410: 29 2b 32 20 2c 31 29 3b 0a 20 20 73 71 6c 69 74  )+2 ,1);.  sqlit
a420: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
a430: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 3b 0a  OP_Goto, 0, 0);.
a440: 20 20 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e    windowReturnOn
a450: 65 52 6f 77 28 70 50 61 72 73 65 2c 20 70 4d 57  eRow(pParse, pMW
a460: 69 6e 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64  in, regGosub, ad
a470: 64 72 47 6f 73 75 62 29 3b 0a 20 20 69 66 28 20  drGosub);.  if( 
a480: 72 65 67 49 6e 76 41 72 67 20 29 7b 0a 20 20 20  regInvArg ){.   
a490: 20 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28 70   windowAggStep(p
a4a0: 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 70 4d  Parse, pMWin, pM
a4b0: 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 31 2c  Win->iEphCsr, 1,
a4c0: 20 72 65 67 49 6e 76 41 72 67 2c 20 72 65 67 49   regInvArg, regI
a4d0: 6e 76 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 73  nvSize);.  }.  s
a4e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
a4f0: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4d 57  (v, OP_Next, pMW
a500: 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 61 64 64  in->iEphCsr, add
a510: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  r);.  sqlite3Vdb
a520: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
a530: 72 2b 31 29 3b 20 20 20 2f 2a 20 54 68 65 20 4f  r+1);   /* The O
a540: 50 5f 47 6f 74 6f 20 2a 2f 0a 7d 0a 0a 2f 2a 0a  P_Goto */.}../*.
a550: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
a560: 20 74 6f 20 73 65 74 20 74 68 65 20 61 63 63 75   to set the accu
a570: 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72  mulator register
a580: 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77   for each window
a590: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20   function.** in 
a5a0: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
a5b0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
a5c0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
a5d0: 20 4e 55 4c 4c 2e 20 41 6e 64 20 70 65 72 66 6f   NULL. And perfo
a5e0: 72 6d 0a 2a 2a 20 61 6e 79 20 65 71 75 69 76 61  rm.** any equiva
a5f0: 6c 65 6e 74 20 69 6e 69 74 69 61 6c 69 7a 61 74  lent initializat
a600: 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20  ion required by 
a610: 61 6e 79 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e  any built-in win
a620: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a  dow functions.**
a630: 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f   in the list..*/
a640: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 64  .static int wind
a650: 6f 77 49 6e 69 74 41 63 63 75 6d 28 50 61 72 73  owInitAccum(Pars
a660: 65 20 2a 70 50 61 72 73 65 2c 20 57 69 6e 64 6f  e *pParse, Windo
a670: 77 20 2a 70 4d 57 69 6e 29 7b 0a 20 20 56 64 62  w *pMWin){.  Vdb
a680: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
a690: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
a6a0: 20 69 6e 74 20 72 65 67 41 72 67 3b 0a 20 20 69   int regArg;.  i
a6b0: 6e 74 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 57  nt nArg = 0;.  W
a6c0: 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 66  indow *pWin;.  f
a6d0: 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70  or(pWin=pMWin; p
a6e0: 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e  Win; pWin=pWin->
a6f0: 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 46  pNextWin){.    F
a700: 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20 3d 20  uncDef *pFunc = 
a710: 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20 20  pWin->pFunc;.   
a720: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a730: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
a740: 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d  , pWin->regAccum
a750: 29 3b 0a 20 20 20 20 6e 41 72 67 20 3d 20 4d 41  );.    nArg = MA
a760: 58 28 6e 41 72 67 2c 20 77 69 6e 64 6f 77 41 72  X(nArg, windowAr
a770: 67 43 6f 75 6e 74 28 70 57 69 6e 29 29 3b 0a 20  gCount(pWin));. 
a780: 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 78 53     if( pFunc->xS
a790: 46 75 6e 63 3d 3d 6e 74 68 5f 76 61 6c 75 65 53  Func==nth_valueS
a7a0: 74 65 70 46 75 6e 63 0a 20 20 20 20 20 7c 7c 20  tepFunc.     || 
a7b0: 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 66  pFunc->xSFunc==f
a7c0: 69 72 73 74 5f 76 61 6c 75 65 53 74 65 70 46 75  irst_valueStepFu
a7d0: 6e 63 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  nc .    ){.     
a7e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a7f0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
a800: 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70  , 0, pWin->regAp
a810: 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
a820: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a830: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 57  P_Integer, 0, pW
a840: 69 6e 2d 3e 72 65 67 41 70 70 2b 31 29 3b 0a 20  in->regApp+1);. 
a850: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70     }..    if( (p
a860: 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20  Func->funcFlags 
a870: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49  & SQLITE_FUNC_MI
a880: 4e 4d 41 58 29 20 26 26 20 70 57 69 6e 2d 3e 63  NMAX) && pWin->c
a890: 73 72 41 70 70 20 29 7b 0a 20 20 20 20 20 20 61  srApp ){.      a
a8a0: 73 73 65 72 74 28 20 70 57 69 6e 2d 3e 65 53 74  ssert( pWin->eSt
a8b0: 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  art!=TK_UNBOUNDE
a8c0: 44 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  D );.      sqlit
a8d0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
a8e0: 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20  OP_ResetSorter, 
a8f0: 70 57 69 6e 2d 3e 63 73 72 41 70 70 29 3b 0a 20  pWin->csrApp);. 
a900: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a910: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
a920: 65 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d 3e 72  eger, 0, pWin->r
a930: 65 67 41 70 70 2b 31 29 3b 0a 20 20 20 20 7d 0a  egApp+1);.    }.
a940: 20 20 7d 0a 20 20 72 65 67 41 72 67 20 3d 20 70    }.  regArg = p
a950: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
a960: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
a970: 20 6e 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20   nArg;.  return 
a980: 72 65 67 41 72 67 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  regArg;.}.../*.*
a990: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
a9a0: 64 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 6f 66  does the work of
a9b0: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f   sqlite3WindowCo
a9c0: 64 65 53 74 65 70 28 29 20 66 6f 72 20 61 6c 6c  deStep() for all
a9d0: 20 22 52 4f 57 53 22 0a 2a 2a 20 77 69 6e 64 6f   "ROWS".** windo
a9e0: 77 20 66 72 61 6d 65 20 74 79 70 65 73 20 65 78  w frame types ex
a9f0: 63 65 70 74 20 66 6f 72 20 22 42 45 54 57 45 45  cept for "BETWEE
aa00: 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43  N UNBOUNDED PREC
aa10: 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e  EDING AND CURREN
aa20: 54 0a 2a 2a 20 52 4f 57 22 2e 20 50 73 65 75 64  T.** ROW". Pseud
aa30: 6f 2d 63 6f 64 65 20 66 6f 72 20 65 61 63 68 20  o-code for each 
aa40: 66 6f 6c 6c 6f 77 73 2e 0a 2a 2a 0a 2a 2a 20 52  follows..**.** R
aa50: 4f 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70  OWS BETWEEN <exp
aa60: 72 31 3e 20 50 52 45 43 45 44 49 4e 47 20 41 4e  r1> PRECEDING AN
aa70: 44 20 3c 65 78 70 72 32 3e 20 46 4f 4c 4c 4f 57  D <expr2> FOLLOW
aa80: 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e  ING.**.**     ..
aa90: 2e 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 6e  ..**       if( n
aaa0: 65 77 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a  ew partition ){.
aab0: 2a 2a 20 20 20 20 20 20 20 20 20 47 6f 73 75 62  **         Gosub
aac0: 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e   flush_partition
aad0: 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  .**       }.**  
aae0: 20 20 20 20 20 49 6e 73 65 72 74 20 28 72 65 63       Insert (rec
aaf0: 6f 72 64 20 69 6e 20 65 70 68 2d 74 61 62 6c 65  ord in eph-table
ab00: 29 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ).**     sqlite3
ab10: 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20  WhereEnd().**   
ab20: 20 20 47 6f 73 75 62 20 66 6c 75 73 68 5f 70 61    Gosub flush_pa
ab30: 72 74 69 74 69 6f 6e 0a 2a 2a 20 20 0a 2a 2a 20  rtition.**  .** 
ab40: 20 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f    flush_partitio
ab50: 6e 3a 0a 2a 2a 20 20 20 20 20 4f 6e 63 65 20 7b  n:.**     Once {
ab60: 0a 2a 2a 20 20 20 20 20 20 20 4f 70 65 6e 44 75  .**       OpenDu
ab70: 70 20 28 69 45 70 68 43 73 72 20 2d 3e 20 63 73  p (iEphCsr -> cs
ab80: 72 53 74 61 72 74 29 0a 2a 2a 20 20 20 20 20 20  rStart).**      
ab90: 20 4f 70 65 6e 44 75 70 20 28 69 45 70 68 43 73   OpenDup (iEphCs
aba0: 72 20 2d 3e 20 63 73 72 45 6e 64 29 0a 2a 2a 20  r -> csrEnd).** 
abb0: 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 72 65 67      }.**     reg
abc0: 53 74 61 72 74 20 3d 20 3c 65 78 70 72 31 3e 20  Start = <expr1> 
abd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
abe0: 2f 20 50 52 45 43 45 44 49 4e 47 20 65 78 70 72  / PRECEDING expr
abf0: 65 73 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 72 65  ession.**     re
ac00: 67 45 6e 64 20 3d 20 3c 65 78 70 72 32 3e 20 20  gEnd = <expr2>  
ac10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac20: 2f 2f 20 46 4f 4c 4c 4f 57 49 4e 47 20 65 78 70  // FOLLOWING exp
ac30: 72 65 73 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 69  ression.**     i
ac40: 66 28 20 72 65 67 53 74 61 72 74 3c 30 20 7c 7c  f( regStart<0 ||
ac50: 20 72 65 67 45 6e 64 3c 30 20 29 7b 20 65 72 72   regEnd<0 ){ err
ac60: 6f 72 21 20 7d 0a 2a 2a 20 20 20 20 20 52 65 77  or! }.**     Rew
ac70: 69 6e 64 20 28 63 73 72 2c 63 73 72 53 74 61 72  ind (csr,csrStar
ac80: 74 2c 63 73 72 45 6e 64 29 20 20 20 20 20 20 2f  t,csrEnd)      /
ac90: 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c  / if EOF goto fl
aca0: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f  ush_partition_do
acb0: 6e 65 0a 2a 2a 20 20 20 20 20 20 20 4e 65 78 74  ne.**       Next
acc0: 28 63 73 72 45 6e 64 29 20 20 20 20 20 20 20 20  (csrEnd)        
acd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 69              // i
ace0: 66 20 45 4f 46 20 73 6b 69 70 20 41 67 67 73 74  f EOF skip Aggst
acf0: 65 70 0a 2a 2a 20 20 20 20 20 20 20 41 67 67 73  ep.**       Aggs
ad00: 74 65 70 20 28 63 73 72 45 6e 64 29 0a 2a 2a 20  tep (csrEnd).** 
ad10: 20 20 20 20 20 20 69 66 28 20 28 72 65 67 45 6e        if( (regEn
ad20: 64 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20  d--)<=0 ){.**   
ad30: 20 20 20 20 20 20 41 67 67 46 69 6e 61 6c 20 28        AggFinal (
ad40: 78 56 61 6c 75 65 29 0a 2a 2a 20 20 20 20 20 20  xValue).**      
ad50: 20 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73     Gosub addrGos
ad60: 75 62 0a 2a 2a 20 20 20 20 20 20 20 20 20 4e 65  ub.**         Ne
ad70: 78 74 28 63 73 72 29 20 20 20 20 20 20 20 20 20  xt(csr)         
ad80: 20 20 20 20 20 20 20 2f 2f 20 69 66 20 45 4f 46         // if EOF
ad90: 20 67 6f 74 6f 20 66 6c 75 73 68 5f 70 61 72 74   goto flush_part
ada0: 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20  ition_done.**   
adb0: 20 20 20 20 20 20 69 66 28 20 28 72 65 67 53 74        if( (regSt
adc0: 61 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20  art--)<=0 ){.** 
add0: 20 20 20 20 20 20 20 20 20 20 41 67 67 53 74 65            AggSte
ade0: 70 20 28 63 73 72 53 74 61 72 74 2c 20 78 49 6e  p (csrStart, xIn
adf0: 76 65 72 73 65 29 0a 2a 2a 20 20 20 20 20 20 20  verse).**       
ae00: 20 20 20 20 4e 65 78 74 28 63 73 72 53 74 61 72      Next(csrStar
ae10: 74 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a  t).**         }.
ae20: 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20  **       }.**   
ae30: 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f  flush_partition_
ae40: 64 6f 6e 65 3a 0a 2a 2a 20 20 20 20 20 52 65 73  done:.**     Res
ae50: 65 74 53 6f 72 74 65 72 20 28 63 73 72 29 0a 2a  etSorter (csr).*
ae60: 2a 20 20 20 20 20 52 65 74 75 72 6e 0a 2a 2a 0a  *     Return.**.
ae70: 2a 2a 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20  ** ROWS BETWEEN 
ae80: 3c 65 78 70 72 3e 20 50 52 45 43 45 44 49 4e 47  <expr> PRECEDING
ae90: 20 20 20 20 41 4e 44 20 43 55 52 52 45 4e 54 20      AND CURRENT 
aea0: 52 4f 57 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57  ROW.** ROWS BETW
aeb0: 45 45 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20  EEN CURRENT ROW 
aec0: 20 20 20 20 20 20 20 20 41 4e 44 20 3c 65 78 70          AND <exp
aed0: 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 20  r> FOLLOWING.** 
aee0: 52 4f 57 53 20 42 45 54 57 45 45 4e 20 55 4e 42  ROWS BETWEEN UNB
aef0: 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47  OUNDED PRECEDING
af00: 20 41 4e 44 20 3c 65 78 70 72 3e 20 46 4f 4c 4c   AND <expr> FOLL
af10: 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 54 68  OWING.**.**   Th
af20: 65 73 65 20 61 72 65 20 73 69 6d 69 6c 61 72 20  ese are similar 
af30: 74 6f 20 74 68 65 20 61 62 6f 76 65 2e 20 46 6f  to the above. Fo
af40: 72 20 22 43 55 52 52 45 4e 54 20 52 4f 57 22 2c  r "CURRENT ROW",
af50: 20 69 6e 74 69 61 6c 69 7a 65 20 74 68 65 0a 2a   intialize the.*
af60: 2a 20 20 20 72 65 67 69 73 74 65 72 20 74 6f 20  *   register to 
af70: 30 2e 20 46 6f 72 20 22 55 4e 42 4f 55 4e 44 45  0. For "UNBOUNDE
af80: 44 20 50 52 45 43 45 44 49 4e 47 22 20 74 6f 20  D PRECEDING" to 
af90: 69 6e 66 69 6e 69 74 79 2e 0a 2a 2a 0a 2a 2a 20  infinity..**.** 
afa0: 52 4f 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78  ROWS BETWEEN <ex
afb0: 70 72 3e 20 50 52 45 43 45 44 49 4e 47 20 20 20  pr> PRECEDING   
afc0: 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46   AND UNBOUNDED F
afd0: 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 20 52 4f 57 53  OLLOWING.** ROWS
afe0: 20 42 45 54 57 45 45 4e 20 43 55 52 52 45 4e 54   BETWEEN CURRENT
aff0: 20 52 4f 57 20 20 20 20 20 20 20 20 20 41 4e 44   ROW         AND
b000: 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f   UNBOUNDED FOLLO
b010: 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52  WING.**.**     R
b020: 65 77 69 6e 64 20 28 63 73 72 2c 63 73 72 53 74  ewind (csr,csrSt
b030: 61 72 74 2c 63 73 72 45 6e 64 29 20 20 20 20 2f  art,csrEnd)    /
b040: 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c  / if EOF goto fl
b050: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f  ush_partition_do
b060: 6e 65 0a 2a 2a 20 20 20 20 20 77 68 69 6c 65 28  ne.**     while(
b070: 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 4e   1 ){.**       N
b080: 65 78 74 28 63 73 72 45 6e 64 29 20 20 20 20 20  ext(csrEnd)     
b090: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
b0a0: 45 78 69 74 20 77 68 69 6c 65 28 31 29 20 61 74  Exit while(1) at
b0b0: 20 45 4f 46 0a 2a 2a 20 20 20 20 20 20 20 41 67   EOF.**       Ag
b0c0: 67 73 74 65 70 20 28 63 73 72 45 6e 64 29 0a 2a  gstep (csrEnd).*
b0d0: 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 77  *     }.**     w
b0e0: 68 69 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20  hile( 1 ){.**   
b0f0: 20 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78 56      AggFinal (xV
b100: 61 6c 75 65 29 0a 2a 2a 20 20 20 20 20 20 20 47  alue).**       G
b110: 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a  osub addrGosub.*
b120: 2a 20 20 20 20 20 20 20 4e 65 78 74 28 63 73 72  *       Next(csr
b130: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
b140: 20 20 20 20 20 20 2f 2f 20 69 66 20 45 4f 46 20        // if EOF 
b150: 67 6f 74 6f 20 66 6c 75 73 68 5f 70 61 72 74 69  goto flush_parti
b160: 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20  tion_done.**    
b170: 20 20 20 69 66 28 20 28 72 65 67 53 74 61 72 74     if( (regStart
b180: 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20  --)<=0 ){.**    
b190: 20 20 20 20 20 41 67 67 53 74 65 70 20 28 63 73       AggStep (cs
b1a0: 72 53 74 61 72 74 2c 20 78 49 6e 76 65 72 73 65  rStart, xInverse
b1b0: 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 4e 65 78  ).**         Nex
b1c0: 74 28 63 73 72 53 74 61 72 74 29 0a 2a 2a 20 20  t(csrStart).**  
b1d0: 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a       }.**     }.
b1e0: 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 74 68 65 20  **.**   For the 
b1f0: 22 43 55 52 52 45 4e 54 20 52 4f 57 20 41 4e 44  "CURRENT ROW AND
b200: 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f   UNBOUNDED FOLLO
b210: 57 49 4e 47 22 20 63 61 73 65 2c 20 74 68 65 20  WING" case, the 
b220: 66 69 6e 61 6c 20 69 66 28 29 20 0a 2a 2a 20 20  final if() .**  
b230: 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 61 6c   condition is al
b240: 77 61 79 73 20 74 72 75 65 20 28 61 73 20 69 66  ways true (as if
b250: 20 72 65 67 53 74 61 72 74 20 77 65 72 65 20 69   regStart were i
b260: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 30 29  nitialized to 0)
b270: 2e 0a 2a 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45  ..**.** RANGE BE
b280: 54 57 45 45 4e 20 43 55 52 52 45 4e 54 20 52 4f  TWEEN CURRENT RO
b290: 57 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20  W AND UNBOUNDED 
b2a0: 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 20 0a 2a 2a  FOLLOWING.** .**
b2b0: 20 20 20 54 68 69 73 20 69 73 20 74 68 65 20 6f     This is the o
b2c0: 6e 6c 79 20 52 41 4e 47 45 20 63 61 73 65 20 68  nly RANGE case h
b2d0: 61 6e 64 6c 65 64 20 62 79 20 74 68 69 73 20 72  andled by this r
b2e0: 6f 75 74 69 6e 65 2e 20 49 74 20 6d 6f 64 69 66  outine. It modif
b2f0: 69 65 73 20 74 68 65 0a 2a 2a 20 20 20 73 65 63  ies the.**   sec
b300: 6f 6e 64 20 77 68 69 6c 65 28 20 31 20 29 20 6c  ond while( 1 ) l
b310: 6f 6f 70 20 69 6e 20 22 52 4f 57 53 20 42 45 54  oop in "ROWS BET
b320: 57 45 45 4e 20 43 55 52 52 45 4e 54 20 2e 2e 2e  WEEN CURRENT ...
b330: 20 55 4e 42 4f 55 4e 44 45 44 2e 2e 2e 22 20 74   UNBOUNDED..." t
b340: 6f 0a 2a 2a 20 20 20 62 65 3a 0a 2a 2a 0a 2a 2a  o.**   be:.**.**
b350: 20 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b       while( 1 ){
b360: 0a 2a 2a 20 20 20 20 20 20 20 41 67 67 46 69 6e  .**       AggFin
b370: 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20  al (xValue).**  
b380: 20 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b       while( 1 ){
b390: 0a 2a 2a 20 20 20 20 20 20 20 20 20 72 65 67 50  .**         regP
b3a0: 65 65 72 2b 2b 0a 2a 2a 20 20 20 20 20 20 20 20  eer++.**        
b3b0: 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62   Gosub addrGosub
b3c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 4e 65 78 74  .**         Next
b3d0: 28 63 73 72 29 20 20 20 20 20 20 20 20 20 20 20  (csr)           
b3e0: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 69 66 20            // if 
b3f0: 45 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68 5f 70  EOF goto flush_p
b400: 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a  artition_done.**
b410: 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 77           if( new
b420: 20 70 65 65 72 20 29 20 62 72 65 61 6b 3b 0a 2a   peer ) break;.*
b430: 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  *       }.**    
b440: 20 20 20 77 68 69 6c 65 28 20 28 72 65 67 50 65     while( (regPe
b450: 65 72 2d 2d 29 3e 30 20 29 7b 0a 2a 2a 20 20 20  er--)>0 ){.**   
b460: 20 20 20 20 20 20 41 67 67 53 74 65 70 20 28 63        AggStep (c
b470: 73 72 53 74 61 72 74 2c 20 78 49 6e 76 65 72 73  srStart, xInvers
b480: 65 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 4e 65  e).**         Ne
b490: 78 74 28 63 73 72 53 74 61 72 74 29 0a 2a 2a 20  xt(csrStart).** 
b4a0: 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 7d        }.**     }
b4b0: 0a 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57  .**.** ROWS BETW
b4c0: 45 45 4e 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f  EEN <expr> FOLLO
b4d0: 57 49 4e 47 20 20 20 20 41 4e 44 20 3c 65 78 70  WING    AND <exp
b4e0: 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a  r> FOLLOWING.**.
b4f0: 2a 2a 20 20 20 72 65 67 45 6e 64 20 3d 20 72 65  **   regEnd = re
b500: 67 45 6e 64 20 2d 20 72 65 67 53 74 61 72 74 0a  gEnd - regStart.
b510: 2a 2a 20 20 20 52 65 77 69 6e 64 20 28 63 73 72  **   Rewind (csr
b520: 2c 63 73 72 53 74 61 72 74 2c 63 73 72 45 6e 64  ,csrStart,csrEnd
b530: 29 20 20 20 2f 2f 20 69 66 20 45 4f 46 20 67 6f  )   // if EOF go
b540: 74 6f 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69  to flush_partiti
b550: 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20 41  on_done.**     A
b560: 67 67 73 74 65 70 20 28 63 73 72 45 6e 64 29 0a  ggstep (csrEnd).
b570: 2a 2a 20 20 20 20 20 4e 65 78 74 28 63 73 72 45  **     Next(csrE
b580: 6e 64 29 20 20 20 20 20 20 20 20 20 20 20 20 20  nd)             
b590: 20 20 20 20 2f 2f 20 69 66 20 45 4f 46 20 66 61      // if EOF fa
b5a0: 6c 6c 2d 74 68 72 6f 75 67 68 0a 2a 2a 20 20 20  ll-through.**   
b5b0: 20 20 69 66 28 20 28 72 65 67 45 6e 64 2d 2d 29    if( (regEnd--)
b5c0: 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  <=0 ){.**       
b5d0: 69 66 28 20 28 72 65 67 53 74 61 72 74 2d 2d 29  if( (regStart--)
b5e0: 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  <=0 ){.**       
b5f0: 20 20 41 67 67 46 69 6e 61 6c 20 28 78 56 61 6c    AggFinal (xVal
b600: 75 65 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 47  ue).**         G
b610: 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a  osub addrGosub.*
b620: 2a 20 20 20 20 20 20 20 20 20 4e 65 78 74 28 63  *         Next(c
b630: 73 72 29 20 20 20 20 20 20 20 20 20 20 20 20 20  sr)             
b640: 20 2f 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f 20   // if EOF goto 
b650: 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f  flush_partition_
b660: 64 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 7d 0a  done.**       }.
b670: 2a 2a 20 20 20 20 20 20 20 41 67 67 53 74 65 70  **       AggStep
b680: 20 28 63 73 72 53 74 61 72 74 2c 20 78 49 6e 76   (csrStart, xInv
b690: 65 72 73 65 29 0a 2a 2a 20 20 20 20 20 20 20 4e  erse).**       N
b6a0: 65 78 74 20 28 63 73 72 53 74 61 72 74 29 0a 2a  ext (csrStart).*
b6b0: 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 52 4f  *     }.**.** RO
b6c0: 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72  WS BETWEEN <expr
b6d0: 3e 20 50 52 45 43 45 44 49 4e 47 20 20 20 20 41  > PRECEDING    A
b6e0: 4e 44 20 3c 65 78 70 72 3e 20 50 52 45 43 45 44  ND <expr> PRECED
b6f0: 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 52 65 70 6c  ING.**.**   Repl
b700: 61 63 65 20 74 68 65 20 62 69 74 20 61 66 74 65  ace the bit afte
b710: 72 20 22 52 65 77 69 6e 64 22 20 69 6e 20 74 68  r "Rewind" in th
b720: 65 20 61 62 6f 76 65 20 77 69 74 68 3a 0a 2a 2a  e above with:.**
b730: 0a 2a 2a 20 20 20 20 20 69 66 28 20 28 72 65 67  .**     if( (reg
b740: 45 6e 64 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20  End--)<=0 ){.** 
b750: 20 20 20 20 20 20 41 67 67 53 74 65 70 20 28 63        AggStep (c
b760: 73 72 45 6e 64 29 0a 2a 2a 20 20 20 20 20 20 20  srEnd).**       
b770: 4e 65 78 74 20 28 63 73 72 45 6e 64 29 0a 2a 2a  Next (csrEnd).**
b780: 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 41 67       }.**     Ag
b790: 67 46 69 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a  gFinal (xValue).
b7a0: 2a 2a 20 20 20 20 20 47 6f 73 75 62 20 61 64 64  **     Gosub add
b7b0: 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 4e 65  rGosub.**     Ne
b7c0: 78 74 28 63 73 72 29 20 20 20 20 20 20 20 20 20  xt(csr)         
b7d0: 20 20 20 20 20 20 20 20 20 2f 2f 20 69 66 20 45           // if E
b7e0: 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68 5f 70 61  OF goto flush_pa
b7f0: 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20  rtition_done.** 
b800: 20 20 20 20 69 66 28 20 28 72 65 67 53 74 61 72      if( (regStar
b810: 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20  t--)<=0 ){.**   
b820: 20 20 20 20 41 67 67 53 74 65 70 20 28 63 73 72      AggStep (csr
b830: 32 2c 20 78 49 6e 76 65 72 73 65 29 0a 2a 2a 20  2, xInverse).** 
b840: 20 20 20 20 20 20 4e 65 78 74 20 28 63 73 72 32        Next (csr2
b850: 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2f  ).**     }.**.*/
b860: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
b870: 64 6f 77 43 6f 64 65 52 6f 77 45 78 70 72 53 74  dowCodeRowExprSt
b880: 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ep(.  Parse *pPa
b890: 72 73 65 2c 20 0a 20 20 53 65 6c 65 63 74 20 2a  rse, .  Select *
b8a0: 70 2c 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  p,.  WhereInfo *
b8b0: 70 57 49 6e 66 6f 2c 0a 20 20 69 6e 74 20 72 65  pWInfo,.  int re
b8c0: 67 47 6f 73 75 62 2c 20 0a 20 20 69 6e 74 20 61  gGosub, .  int a
b8d0: 64 64 72 47 6f 73 75 62 0a 29 7b 0a 20 20 57 69  ddrGosub.){.  Wi
b8e0: 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d  ndow *pMWin = p-
b8f0: 3e 70 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76  >pWin;.  Vdbe *v
b900: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
b910: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  e(pParse);.  int
b920: 20 72 65 67 46 6c 75 73 68 50 61 72 74 3b 20 20   regFlushPart;  
b930: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b940: 52 65 67 69 73 74 65 72 20 66 6f 72 20 22 47 6f  Register for "Go
b950: 73 75 62 20 66 6c 75 73 68 5f 70 61 72 74 69 74  sub flush_partit
b960: 69 6f 6e 22 20 2a 2f 0a 20 20 69 6e 74 20 6c 62  ion" */.  int lb
b970: 6c 46 6c 75 73 68 50 61 72 74 3b 20 20 20 20 20  lFlushPart;     
b980: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62            /* Lab
b990: 65 6c 20 66 6f 72 20 22 47 6f 73 75 62 20 66 6c  el for "Gosub fl
b9a0: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 20 2a  ush_partition" *
b9b0: 2f 0a 20 20 69 6e 74 20 6c 62 6c 46 6c 75 73 68  /.  int lblFlush
b9c0: 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 20 20 20  Done;           
b9d0: 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72      /* Label for
b9e0: 20 22 47 6f 73 75 62 20 66 6c 75 73 68 5f 70 61   "Gosub flush_pa
b9f0: 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 22 20 2a 2f  rtition_done" */
ba00: 0a 0a 20 20 69 6e 74 20 72 65 67 41 72 67 3b 0a  ..  int regArg;.
ba10: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e    int addr;.  in
ba20: 74 20 63 73 72 53 74 61 72 74 20 3d 20 70 50 61  t csrStart = pPa
ba30: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69  rse->nTab++;.  i
ba40: 6e 74 20 63 73 72 45 6e 64 20 3d 20 70 50 61 72  nt csrEnd = pPar
ba50: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 6e  se->nTab++;.  in
ba60: 74 20 72 65 67 53 74 61 72 74 3b 20 20 20 20 20  t regStart;     
ba70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ba80: 2a 20 56 61 6c 75 65 20 6f 66 20 3c 65 78 70 72  * Value of <expr
ba90: 3e 20 50 52 45 43 45 44 49 4e 47 20 2a 2f 0a 20  > PRECEDING */. 
baa0: 20 69 6e 74 20 72 65 67 45 6e 64 3b 20 20 20 20   int regEnd;    
bab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bac0: 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 3c 65    /* Value of <e
bad0: 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 2a  xpr> FOLLOWING *
bae0: 2f 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 74 6f  /.  int addrGoto
baf0: 3b 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b  ;.  int addrTop;
bb00: 0a 20 20 69 6e 74 20 61 64 64 72 49 66 50 6f 73  .  int addrIfPos
bb10: 31 3b 0a 20 20 69 6e 74 20 61 64 64 72 49 66 50  1;.  int addrIfP
bb20: 6f 73 32 3b 0a 20 20 69 6e 74 20 72 65 67 53 69  os2;.  int regSi
bb30: 7a 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ze = 0;..  asser
bb40: 74 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  t( pMWin->eStart
bb50: 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 0a  ==TK_PRECEDING .
bb60: 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d         || pMWin-
bb70: 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52  >eStart==TK_CURR
bb80: 45 4e 54 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  ENT .       || p
bb90: 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
bba0: 5f 46 4f 4c 4c 4f 57 49 4e 47 20 0a 20 20 20 20  _FOLLOWING .    
bbb0: 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74     || pMWin->eSt
bbc0: 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  art==TK_UNBOUNDE
bbd0: 44 20 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  D .  );.  assert
bbe0: 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54  ( pMWin->eEnd==T
bbf0: 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 0a 20 20 20  K_FOLLOWING .   
bc00: 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45      || pMWin->eE
bc10: 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 0a  nd==TK_CURRENT .
bc20: 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d         || pMWin-
bc30: 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e  >eEnd==TK_UNBOUN
bc40: 44 45 44 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  DED .       || p
bc50: 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50  MWin->eEnd==TK_P
bc60: 52 45 43 45 44 49 4e 47 20 0a 20 20 29 3b 0a 0a  RECEDING .  );..
bc70: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 72 65    /* Allocate re
bc80: 67 69 73 74 65 72 20 61 6e 64 20 6c 61 62 65 6c  gister and label
bc90: 20 66 6f 72 20 74 68 65 20 22 66 6c 75 73 68 5f   for the "flush_
bca0: 70 61 72 74 69 74 69 6f 6e 22 20 73 75 62 2d 72  partition" sub-r
bcb0: 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 72 65 67  outine. */.  reg
bcc0: 46 6c 75 73 68 50 61 72 74 20 3d 20 2b 2b 70 50  FlushPart = ++pP
bcd0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6c 62  arse->nMem;.  lb
bce0: 6c 46 6c 75 73 68 50 61 72 74 20 3d 20 73 71 6c  lFlushPart = sql
bcf0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
bd00: 6c 28 76 29 3b 0a 20 20 6c 62 6c 46 6c 75 73 68  l(v);.  lblFlush
bd10: 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Done = sqlite3Vd
bd20: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
bd30: 0a 20 20 72 65 67 53 74 61 72 74 20 3d 20 2b 2b  .  regStart = ++
bd40: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
bd50: 72 65 67 45 6e 64 20 3d 20 2b 2b 70 50 61 72 73  regEnd = ++pPars
bd60: 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 77 69 6e 64  e->nMem;..  wind
bd70: 6f 77 50 61 72 74 69 74 69 6f 6e 43 61 63 68 65  owPartitionCache
bd80: 28 70 50 61 72 73 65 2c 20 70 2c 20 70 57 49 6e  (pParse, p, pWIn
bd90: 66 6f 2c 20 72 65 67 46 6c 75 73 68 50 61 72 74  fo, regFlushPart
bda0: 2c 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 2c 20  , lblFlushPart, 
bdb0: 26 72 65 67 53 69 7a 65 29 3b 0a 0a 20 20 61 64  &regSize);..  ad
bdc0: 64 72 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33  drGoto = sqlite3
bdd0: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
bde0: 5f 47 6f 74 6f 29 3b 0a 0a 20 20 2f 2a 20 53 74  _Goto);..  /* St
bdf0: 61 72 74 20 6f 66 20 22 66 6c 75 73 68 5f 70 61  art of "flush_pa
be00: 72 74 69 74 69 6f 6e 22 20 2a 2f 0a 20 20 73 71  rtition" */.  sq
be10: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
be20: 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 46 6c 75 73  Label(v, lblFlus
be30: 68 50 61 72 74 29 3b 0a 20 20 73 71 6c 69 74 65  hPart);.  sqlite
be40: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
be50: 50 5f 4f 6e 63 65 2c 20 30 2c 20 73 71 6c 69 74  P_Once, 0, sqlit
be60: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
be70: 72 28 76 29 2b 33 29 3b 0a 20 20 73 71 6c 69 74  r(v)+3);.  sqlit
be80: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
be90: 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 63 73 72 53  OP_OpenDup, csrS
bea0: 74 61 72 74 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  tart, pMWin->iEp
beb0: 68 43 73 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  hCsr);.  sqlite3
bec0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
bed0: 5f 4f 70 65 6e 44 75 70 2c 20 63 73 72 45 6e 64  _OpenDup, csrEnd
bee0: 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
bef0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 65 69 74 68  );..  /* If eith
bf00: 65 72 20 72 65 67 53 74 61 72 74 20 6f 72 20 72  er regStart or r
bf10: 65 67 45 6e 64 20 61 72 65 20 6e 6f 74 20 6e 6f  egEnd are not no
bf20: 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67  n-negative integ
bf30: 65 72 73 2c 20 74 68 72 6f 77 20 0a 20 20 2a 2a  ers, throw .  **
bf40: 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 2e 20 20   an exception.  
bf50: 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  */.  if( pMWin->
bf60: 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 73 71  pStart ){.    sq
bf70: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
bf80: 61 72 73 65 2c 20 70 4d 57 69 6e 2d 3e 70 53 74  arse, pMWin->pSt
bf90: 61 72 74 2c 20 72 65 67 53 74 61 72 74 29 3b 0a  art, regStart);.
bfa0: 20 20 20 20 77 69 6e 64 6f 77 43 68 65 63 6b 46      windowCheckF
bfb0: 72 61 6d 65 56 61 6c 75 65 28 70 50 61 72 73 65  rameValue(pParse
bfc0: 2c 20 72 65 67 53 74 61 72 74 2c 20 30 29 3b 0a  , regStart, 0);.
bfd0: 20 20 7d 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d    }.  if( pMWin-
bfe0: 3e 70 45 6e 64 20 29 7b 0a 20 20 20 20 73 71 6c  >pEnd ){.    sql
bff0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
c000: 72 73 65 2c 20 70 4d 57 69 6e 2d 3e 70 45 6e 64  rse, pMWin->pEnd
c010: 2c 20 72 65 67 45 6e 64 29 3b 0a 20 20 20 20 77  , regEnd);.    w
c020: 69 6e 64 6f 77 43 68 65 63 6b 46 72 61 6d 65 56  indowCheckFrameV
c030: 61 6c 75 65 28 70 50 61 72 73 65 2c 20 72 65 67  alue(pParse, reg
c040: 45 6e 64 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20  End, 1);.  }..  
c050: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 22 52  /* If this is "R
c060: 4f 57 53 20 3c 65 78 70 72 31 3e 20 46 4f 4c 4c  OWS <expr1> FOLL
c070: 4f 57 49 4e 47 20 41 4e 44 20 52 4f 57 53 20 3c  OWING AND ROWS <
c080: 65 78 70 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47  expr2> FOLLOWING
c090: 22 2c 20 64 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ", do:.  **.  **
c0a0: 20 20 20 69 66 28 20 72 65 67 45 6e 64 3c 72 65     if( regEnd<re
c0b0: 67 53 74 61 72 74 20 29 7b 0a 20 20 2a 2a 20 20  gStart ){.  **  
c0c0: 20 20 20 2f 2f 20 54 68 65 20 66 72 61 6d 65 20     // The frame 
c0d0: 61 6c 77 61 79 73 20 63 6f 6e 73 69 73 74 73 20  always consists 
c0e0: 6f 66 20 30 20 72 6f 77 73 0a 20 20 2a 2a 20 20  of 0 rows.  **  
c0f0: 20 20 20 72 65 67 53 74 61 72 74 20 3d 20 72 65     regStart = re
c100: 67 53 69 7a 65 3b 0a 20 20 2a 2a 20 20 20 7d 0a  gSize;.  **   }.
c110: 20 20 2a 2a 20 20 20 72 65 67 45 6e 64 20 3d 20    **   regEnd = 
c120: 72 65 67 45 6e 64 20 2d 20 72 65 67 53 74 61 72  regEnd - regStar
c130: 74 3b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4d  t;.  */.  if( pM
c140: 57 69 6e 2d 3e 70 45 6e 64 20 26 26 20 70 4d 57  Win->pEnd && pMW
c150: 69 6e 2d 3e 70 53 74 61 72 74 20 26 26 20 70 4d  in->pStart && pM
c160: 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
c170: 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20  FOLLOWING ){.   
c180: 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e   assert( pMWin->
c190: 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49  eEnd==TK_FOLLOWI
c1a0: 4e 47 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  NG );.    sqlite
c1b0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
c1c0: 50 5f 47 65 2c 20 72 65 67 53 74 61 72 74 2c 20  P_Ge, regStart, 
c1d0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
c1e0: 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 72 65 67  ntAddr(v)+2, reg
c1f0: 45 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  End);.    sqlite
c200: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
c210: 50 5f 43 6f 70 79 2c 20 72 65 67 53 69 7a 65 2c  P_Copy, regSize,
c220: 20 72 65 67 53 74 61 72 74 29 3b 0a 20 20 20 20   regStart);.    
c230: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c240: 33 28 76 2c 20 4f 50 5f 53 75 62 74 72 61 63 74  3(v, OP_Subtract
c250: 2c 20 72 65 67 53 74 61 72 74 2c 20 72 65 67 45  , regStart, regE
c260: 6e 64 2c 20 72 65 67 45 6e 64 29 3b 0a 20 20 7d  nd, regEnd);.  }
c270: 0a 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70  ..  if( pMWin->p
c280: 45 6e 64 20 26 26 20 70 4d 57 69 6e 2d 3e 70 53  End && pMWin->pS
c290: 74 61 72 74 20 26 26 20 70 4d 57 69 6e 2d 3e 65  tart && pMWin->e
c2a0: 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e  End==TK_PRECEDIN
c2b0: 47 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  G ){.    assert(
c2c0: 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d   pMWin->eStart==
c2d0: 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 29 3b 0a  TK_PRECEDING );.
c2e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c2f0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4c 65 2c 20  ddOp3(v, OP_Le, 
c300: 72 65 67 53 74 61 72 74 2c 20 73 71 6c 69 74 65  regStart, sqlite
c310: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
c320: 28 76 29 2b 33 2c 20 72 65 67 45 6e 64 29 3b 0a  (v)+3, regEnd);.
c330: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c340: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp2(v, OP_Copy
c350: 2c 20 72 65 67 53 69 7a 65 2c 20 72 65 67 53 74  , regSize, regSt
c360: 61 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  art);.    sqlite
c370: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
c380: 50 5f 43 6f 70 79 2c 20 72 65 67 53 69 7a 65 2c  P_Copy, regSize,
c390: 20 72 65 67 45 6e 64 29 3b 0a 20 20 7d 0a 0a 20   regEnd);.  }.. 
c3a0: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
c3b0: 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72  he accumulator r
c3c0: 65 67 69 73 74 65 72 20 66 6f 72 20 65 61 63 68  egister for each
c3d0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
c3e0: 20 74 6f 20 4e 55 4c 4c 20 2a 2f 0a 20 20 72 65   to NULL */.  re
c3f0: 67 41 72 67 20 3d 20 77 69 6e 64 6f 77 49 6e 69  gArg = windowIni
c400: 74 41 63 63 75 6d 28 70 50 61 72 73 65 2c 20 70  tAccum(pParse, p
c410: 4d 57 69 6e 29 3b 0a 0a 20 20 73 71 6c 69 74 65  MWin);..  sqlite
c420: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
c430: 50 5f 52 65 77 69 6e 64 2c 20 70 4d 57 69 6e 2d  P_Rewind, pMWin-
c440: 3e 69 45 70 68 43 73 72 2c 20 6c 62 6c 46 6c 75  >iEphCsr, lblFlu
c450: 73 68 44 6f 6e 65 29 3b 0a 20 20 73 71 6c 69 74  shDone);.  sqlit
c460: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
c470: 4f 50 5f 52 65 77 69 6e 64 2c 20 63 73 72 53 74  OP_Rewind, csrSt
c480: 61 72 74 2c 20 6c 62 6c 46 6c 75 73 68 44 6f 6e  art, lblFlushDon
c490: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e);.  sqlite3Vdb
c4a0: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b  eChangeP5(v, 1);
c4b0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
c4c0: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
c4d0: 64 2c 20 63 73 72 45 6e 64 2c 20 6c 62 6c 46 6c  d, csrEnd, lblFl
c4e0: 75 73 68 44 6f 6e 65 29 3b 0a 20 20 73 71 6c 69  ushDone);.  sqli
c4f0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
c500: 76 2c 20 31 29 3b 0a 0a 20 20 2f 2a 20 49 6e 76  v, 1);..  /* Inv
c510: 6f 6b 65 20 41 67 67 53 74 65 70 20 66 75 6e 63  oke AggStep func
c520: 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 77 69  tion for each wi
c530: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 75 73  ndow function us
c540: 69 6e 67 20 74 68 65 20 72 6f 77 20 74 68 61 74  ing the row that
c550: 0a 20 20 2a 2a 20 63 73 72 45 6e 64 20 63 75 72  .  ** csrEnd cur
c560: 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
c570: 2e 20 4f 72 2c 20 69 66 20 63 73 72 45 6e 64 20  . Or, if csrEnd 
c580: 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 45 4f  is already at EO
c590: 46 2c 0a 20 20 2a 2a 20 64 6f 20 6e 6f 74 68 69  F,.  ** do nothi
c5a0: 6e 67 2e 20 20 2a 2f 0a 20 20 61 64 64 72 54 6f  ng.  */.  addrTo
c5b0: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
c5c0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
c5d0: 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64   if( pMWin->eEnd
c5e0: 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 29  ==TK_PRECEDING )
c5f0: 7b 0a 20 20 20 20 61 64 64 72 49 66 50 6f 73 31  {.    addrIfPos1
c600: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
c610: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp3(v, OP_IfPos
c620: 2c 20 72 65 67 45 6e 64 2c 20 30 20 2c 20 31 29  , regEnd, 0 , 1)
c630: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
c640: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
c650: 4e 65 78 74 2c 20 63 73 72 45 6e 64 2c 20 73 71  Next, csrEnd, sq
c660: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
c670: 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 61 64  Addr(v)+2);.  ad
c680: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
c690: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74  AddOp0(v, OP_Got
c6a0: 6f 29 3b 0a 20 20 77 69 6e 64 6f 77 41 67 67 53  o);.  windowAggS
c6b0: 74 65 70 28 70 50 61 72 73 65 2c 20 70 4d 57 69  tep(pParse, pMWi
c6c0: 6e 2c 20 63 73 72 45 6e 64 2c 20 30 2c 20 72 65  n, csrEnd, 0, re
c6d0: 67 41 72 67 2c 20 72 65 67 53 69 7a 65 29 3b 0a  gArg, regSize);.
c6e0: 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e    if( pMWin->eEn
c6f0: 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20  d==TK_UNBOUNDED 
c700: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
c710: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
c720: 6f 74 6f 2c 20 30 2c 20 61 64 64 72 54 6f 70 29  oto, 0, addrTop)
c730: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
c740: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
c750: 72 29 3b 0a 20 20 20 20 61 64 64 72 54 6f 70 20  r);.    addrTop 
c760: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
c770: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 7d  rentAddr(v);.  }
c780: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
c790: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
c7a0: 20 61 64 64 72 29 3b 0a 20 20 20 20 69 66 28 20   addr);.    if( 
c7b0: 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f  pMWin->eEnd==TK_
c7c0: 50 52 45 43 45 44 49 4e 47 20 29 7b 0a 20 20 20  PRECEDING ){.   
c7d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
c7e0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 66  mpHere(v, addrIf
c7f0: 50 6f 73 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Pos1);.    }.  }
c800: 0a 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65  ..  if( pMWin->e
c810: 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e  End==TK_FOLLOWIN
c820: 47 20 29 7b 0a 20 20 20 20 61 64 64 72 49 66 50  G ){.    addrIfP
c830: 6f 73 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  os1 = sqlite3Vdb
c840: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
c850: 50 6f 73 2c 20 72 65 67 45 6e 64 2c 20 30 20 2c  Pos, regEnd, 0 ,
c860: 20 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   1);.  }.  if( p
c870: 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
c880: 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20  _FOLLOWING ){.  
c890: 20 20 61 64 64 72 49 66 50 6f 73 32 20 3d 20 73    addrIfPos2 = s
c8a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
c8b0: 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 72 65  (v, OP_IfPos, re
c8c0: 67 53 74 61 72 74 2c 20 30 20 2c 20 31 29 3b 0a  gStart, 0 , 1);.
c8d0: 20 20 7d 0a 20 20 77 69 6e 64 6f 77 41 67 67 46    }.  windowAggF
c8e0: 69 6e 61 6c 28 70 50 61 72 73 65 2c 20 70 4d 57  inal(pParse, pMW
c8f0: 69 6e 2c 20 30 29 3b 0a 20 20 77 69 6e 64 6f 77  in, 0);.  window
c900: 52 65 74 75 72 6e 4f 6e 65 52 6f 77 28 70 50 61  ReturnOneRow(pPa
c910: 72 73 65 2c 20 70 4d 57 69 6e 2c 20 72 65 67 47  rse, pMWin, regG
c920: 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29  osub, addrGosub)
c930: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
c940: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
c950: 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
c960: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
c970: 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a  rentAddr(v)+2);.
c980: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c990: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
c9a0: 30 2c 20 6c 62 6c 46 6c 75 73 68 44 6f 6e 65 29  0, lblFlushDone)
c9b0: 3b 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65  ;.  if( pMWin->e
c9c0: 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57  Start==TK_FOLLOW
c9d0: 49 4e 47 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ING ){.    sqlit
c9e0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
c9f0: 2c 20 61 64 64 72 49 66 50 6f 73 32 29 3b 0a 20  , addrIfPos2);. 
ca00: 20 7d 0a 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d   }..  if( pMWin-
ca10: 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52  >eStart==TK_CURR
ca20: 45 4e 54 20 0a 20 20 20 7c 7c 20 70 4d 57 69 6e  ENT .   || pMWin
ca30: 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45  ->eStart==TK_PRE
ca40: 43 45 44 49 4e 47 20 0a 20 20 20 7c 7c 20 70 4d  CEDING .   || pM
ca50: 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
ca60: 46 4f 4c 4c 4f 57 49 4e 47 20 0a 20 20 29 7b 0a  FOLLOWING .  ){.
ca70: 20 20 20 20 69 6e 74 20 61 64 64 72 4a 75 6d 70      int addrJump
ca80: 48 65 72 65 20 3d 20 30 3b 0a 20 20 20 20 69 66  Here = 0;.    if
ca90: 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d  ( pMWin->eStart=
caa0: 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 29 7b  =TK_PRECEDING ){
cab0: 0a 20 20 20 20 20 20 61 64 64 72 4a 75 6d 70 48  .      addrJumpH
cac0: 65 72 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ere = sqlite3Vdb
cad0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
cae0: 50 6f 73 2c 20 72 65 67 53 74 61 72 74 2c 20 30  Pos, regStart, 0
caf0: 20 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20   , 1);.    }.   
cb00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
cb10: 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 63  p2(v, OP_Next, c
cb20: 73 72 53 74 61 72 74 2c 20 73 71 6c 69 74 65 33  srStart, sqlite3
cb30: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
cb40: 76 29 2b 31 29 3b 0a 20 20 20 20 77 69 6e 64 6f  v)+1);.    windo
cb50: 77 41 67 67 53 74 65 70 28 70 50 61 72 73 65 2c  wAggStep(pParse,
cb60: 20 70 4d 57 69 6e 2c 20 63 73 72 53 74 61 72 74   pMWin, csrStart
cb70: 2c 20 31 2c 20 72 65 67 41 72 67 2c 20 72 65 67  , 1, regArg, reg
cb80: 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 61  Size);.    if( a
cb90: 64 64 72 4a 75 6d 70 48 65 72 65 20 29 7b 0a 20  ddrJumpHere ){. 
cba0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cbb0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
cbc0: 4a 75 6d 70 48 65 72 65 29 3b 0a 20 20 20 20 7d  JumpHere);.    }
cbd0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d 57 69 6e  .  }.  if( pMWin
cbe0: 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f  ->eEnd==TK_FOLLO
cbf0: 57 49 4e 47 20 29 7b 0a 20 20 20 20 73 71 6c 69  WING ){.    sqli
cc00: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
cc10: 76 2c 20 61 64 64 72 49 66 50 6f 73 31 29 3b 0a  v, addrIfPos1);.
cc20: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
cc30: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
cc40: 74 6f 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b  to, 0, addrTop);
cc50: 0a 0a 20 20 2f 2a 20 66 6c 75 73 68 5f 70 61 72  ..  /* flush_par
cc60: 74 69 74 69 6f 6e 5f 64 6f 6e 65 3a 20 2a 2f 0a  tition_done: */.
cc70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
cc80: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c  olveLabel(v, lbl
cc90: 46 6c 75 73 68 44 6f 6e 65 29 3b 0a 20 20 73 71  FlushDone);.  sq
cca0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
ccb0: 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74 65  v, OP_ResetSorte
ccc0: 72 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  r, pMWin->iEphCs
ccd0: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  r);.  sqlite3Vdb
cce0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
ccf0: 74 75 72 6e 2c 20 72 65 67 46 6c 75 73 68 50 61  turn, regFlushPa
cd00: 72 74 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  rt);..  /* Jump 
cd10: 74 6f 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20  to here to skip 
cd20: 6f 76 65 72 20 66 6c 75 73 68 5f 70 61 72 74 69  over flush_parti
cd30: 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tion */.  sqlite
cd40: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
cd50: 20 61 64 64 72 47 6f 74 6f 29 3b 0a 7d 0a 0a 2f   addrGoto);.}../
cd60: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
cd70: 6f 6e 20 64 6f 65 73 20 74 68 65 20 77 6f 72 6b  on does the work
cd80: 20 6f 66 20 73 71 6c 69 74 65 33 57 69 6e 64 6f   of sqlite3Windo
cd90: 77 43 6f 64 65 53 74 65 70 28 29 20 66 6f 72 20  wCodeStep() for 
cda0: 63 61 73 65 73 20 74 68 61 74 0a 2a 2a 20 77 6f  cases that.** wo
cdb0: 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20  uld normally be 
cdc0: 68 61 6e 64 6c 65 64 20 62 79 20 77 69 6e 64 6f  handled by windo
cdd0: 77 43 6f 64 65 44 65 66 61 75 6c 74 53 74 65 70  wCodeDefaultStep
cde0: 28 29 20 77 68 65 6e 20 74 68 65 72 65 20 61 72  () when there ar
cdf0: 65 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  e.** one or more
ce00: 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77   built-in window
ce10: 2d 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20  -functions that 
ce20: 72 65 71 75 69 72 65 20 74 68 65 20 65 6e 74 69  require the enti
ce30: 72 65 20 70 61 72 74 69 74 69 6f 6e 0a 2a 2a 20  re partition.** 
ce40: 74 6f 20 62 65 20 63 61 63 68 65 64 20 69 6e 20  to be cached in 
ce50: 61 20 74 65 6d 70 20 74 61 62 6c 65 20 62 65 66  a temp table bef
ce60: 6f 72 65 20 61 6e 79 20 72 6f 77 73 20 63 61 6e  ore any rows can
ce70: 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 41 64   be returned. Ad
ce80: 64 69 74 69 6f 6e 61 6c 6c 79 2e 0a 2a 2a 20 22  ditionally..** "
ce90: 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 43 55  RANGE BETWEEN CU
cea0: 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 55 4e  RRENT ROW AND UN
ceb0: 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e  BOUNDED FOLLOWIN
cec0: 47 22 20 69 73 20 61 6c 77 61 79 73 20 68 61 6e  G" is always han
ced0: 64 6c 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20  dled by.** this 
cee0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
cef0: 50 73 65 75 64 6f 2d 63 6f 64 65 20 63 6f 72 72  Pseudo-code corr
cf00: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
cf10: 20 56 4d 20 63 6f 64 65 20 67 65 6e 65 72 61 74   VM code generat
cf20: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
cf30: 69 6f 6e 0a 2a 2a 20 66 6f 72 20 65 61 63 68 20  ion.** for each 
cf40: 74 79 70 65 20 6f 66 20 77 69 6e 64 6f 77 20 66  type of window f
cf50: 6f 6c 6c 6f 77 73 2e 0a 2a 2a 0a 2a 2a 20 52 41  ollows..**.** RA
cf60: 4e 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f  NGE BETWEEN UNBO
cf70: 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20  UNDED PRECEDING 
cf80: 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a  AND CURRENT ROW.
cf90: 2a 2a 0a 2a 2a 20 20 20 66 6c 75 73 68 5f 70 61  **.**   flush_pa
cfa0: 72 74 69 74 69 6f 6e 3a 0a 2a 2a 20 20 20 20 20  rtition:.**     
cfb0: 4f 6e 63 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20  Once {.**       
cfc0: 4f 70 65 6e 44 75 70 20 28 69 45 70 68 43 73 72  OpenDup (iEphCsr
cfd0: 20 2d 3e 20 63 73 72 4c 65 61 64 29 0a 2a 2a 20   -> csrLead).** 
cfe0: 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 49 6e 74      }.**     Int
cff0: 65 67 65 72 20 63 74 72 20 30 0a 2a 2a 20 20 20  eger ctr 0.**   
d000: 20 20 66 6f 72 65 61 63 68 20 72 6f 77 20 28 63    foreach row (c
d010: 73 72 4c 65 61 64 29 7b 0a 2a 2a 20 20 20 20 20  srLead){.**     
d020: 20 20 69 66 28 20 6e 65 77 20 70 65 65 72 20 29    if( new peer )
d030: 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 67 67  {.**         Agg
d040: 46 69 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a  Final (xValue).*
d050: 2a 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  *         for(i=
d060: 30 3b 20 69 3c 63 74 72 3b 20 69 2b 2b 29 7b 0a  0; i<ctr; i++){.
d070: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 47 6f 73  **           Gos
d080: 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20  ub addrGosub.** 
d090: 20 20 20 20 20 20 20 20 20 20 4e 65 78 74 20 69            Next i
d0a0: 45 70 68 43 73 72 0a 2a 2a 20 20 20 20 20 20 20  EphCsr.**       
d0b0: 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 49    }.**         I
d0c0: 6e 74 65 67 65 72 20 63 74 72 20 30 0a 2a 2a 20  nteger ctr 0.** 
d0d0: 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20        }.**      
d0e0: 20 41 67 67 53 74 65 70 20 28 63 73 72 4c 65 61   AggStep (csrLea
d0f0: 64 29 0a 2a 2a 20 20 20 20 20 20 20 49 6e 63 72  d).**       Incr
d100: 20 63 74 72 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a   ctr.**     }.**
d110: 0a 2a 2a 20 20 20 20 20 41 67 67 46 69 6e 61 6c  .**     AggFinal
d120: 20 28 78 46 69 6e 61 6c 69 7a 65 29 0a 2a 2a 20   (xFinalize).** 
d130: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 63      for(i=0; i<c
d140: 74 72 3b 20 69 2b 2b 29 7b 0a 2a 2a 20 20 20 20  tr; i++){.**    
d150: 20 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73     Gosub addrGos
d160: 75 62 0a 2a 2a 20 20 20 20 20 20 20 4e 65 78 74  ub.**       Next
d170: 20 69 45 70 68 43 73 72 0a 2a 2a 20 20 20 20 20   iEphCsr.**     
d180: 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 73 65  }.**.**     Rese
d190: 74 53 6f 72 74 65 72 20 28 63 73 72 29 0a 2a 2a  tSorter (csr).**
d1a0: 20 20 20 20 20 52 65 74 75 72 6e 0a 2a 2a 0a 2a       Return.**.*
d1b0: 2a 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20 55  * ROWS BETWEEN U
d1c0: 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49  NBOUNDED PRECEDI
d1d0: 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52  NG AND CURRENT R
d1e0: 4f 57 0a 2a 2a 0a 2a 2a 20 20 20 41 73 20 61 62  OW.**.**   As ab
d1f0: 6f 76 65 2c 20 65 78 63 65 70 74 20 74 68 61 74  ove, except that
d200: 20 74 68 65 20 22 69 66 28 20 6e 65 77 20 70 65   the "if( new pe
d210: 65 72 20 29 22 20 62 72 61 6e 63 68 20 69 73 20  er )" branch is 
d220: 61 6c 77 61 79 73 20 74 61 6b 65 6e 2e 0a 2a 2a  always taken..**
d230: 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54 57 45 45  .** RANGE BETWEE
d240: 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20 41 4e  N CURRENT ROW AN
d250: 44 20 43 55 52 52 45 4e 54 20 52 4f 57 20 0a 2a  D CURRENT ROW .*
d260: 2a 0a 2a 2a 20 20 20 41 73 20 61 62 6f 76 65 2c  *.**   As above,
d270: 20 65 78 63 65 70 74 20 74 68 61 74 20 65 61 63   except that eac
d280: 68 20 6f 66 20 74 68 65 20 66 6f 72 28 29 20 6c  h of the for() l
d290: 6f 6f 70 73 20 62 65 63 6f 6d 65 73 3a 0a 2a 2a  oops becomes:.**
d2a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 28  .**         for(
d2b0: 69 3d 30 3b 20 69 3c 63 74 72 3b 20 69 2b 2b 29  i=0; i<ctr; i++)
d2c0: 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 47  {.**           G
d2d0: 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a  osub addrGosub.*
d2e0: 2a 20 20 20 20 20 20 20 20 20 20 20 41 67 67 53  *           AggS
d2f0: 74 65 70 20 28 78 49 6e 76 65 72 73 65 2c 20 69  tep (xInverse, i
d300: 45 70 68 43 73 72 29 0a 2a 2a 20 20 20 20 20 20  EphCsr).**      
d310: 20 20 20 20 20 4e 65 78 74 20 69 45 70 68 43 73       Next iEphCs
d320: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a  r.**         }.*
d330: 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54 57 45  *.** RANGE BETWE
d340: 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  EN UNBOUNDED PRE
d350: 43 45 44 49 4e 47 20 41 4e 44 20 55 4e 42 4f 55  CEDING AND UNBOU
d360: 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a  NDED FOLLOWING.*
d370: 2a 0a 2a 2a 20 20 20 66 6c 75 73 68 5f 70 61 72  *.**   flush_par
d380: 74 69 74 69 6f 6e 3a 0a 2a 2a 20 20 20 20 20 4f  tition:.**     O
d390: 6e 63 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20 4f  nce {.**       O
d3a0: 70 65 6e 44 75 70 20 28 69 45 70 68 43 73 72 20  penDup (iEphCsr 
d3b0: 2d 3e 20 63 73 72 4c 65 61 64 29 0a 2a 2a 20 20  -> csrLead).**  
d3c0: 20 20 20 7d 0a 2a 2a 20 20 20 20 20 66 6f 72 65     }.**     fore
d3d0: 61 63 68 20 72 6f 77 20 28 63 73 72 4c 65 61 64  ach row (csrLead
d3e0: 29 20 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67 67  ) {.**       Agg
d3f0: 53 74 65 70 20 28 63 73 72 4c 65 61 64 29 0a 2a  Step (csrLead).*
d400: 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 66  *     }.**     f
d410: 6f 72 65 61 63 68 20 72 6f 77 20 28 69 45 70 68  oreach row (iEph
d420: 43 73 72 29 20 7b 0a 2a 2a 20 20 20 20 20 20 20  Csr) {.**       
d430: 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a  Gosub addrGosub.
d440: 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 0a 2a 2a 20  **     }.** .** 
d450: 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 43 55  RANGE BETWEEN CU
d460: 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 55 4e  RRENT ROW AND UN
d470: 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e  BOUNDED FOLLOWIN
d480: 47 0a 2a 2a 0a 2a 2a 20 20 20 66 6c 75 73 68 5f  G.**.**   flush_
d490: 70 61 72 74 69 74 69 6f 6e 3a 0a 2a 2a 20 20 20  partition:.**   
d4a0: 20 20 4f 6e 63 65 20 7b 0a 2a 2a 20 20 20 20 20    Once {.**     
d4b0: 20 20 4f 70 65 6e 44 75 70 20 28 69 45 70 68 43    OpenDup (iEphC
d4c0: 73 72 20 2d 3e 20 63 73 72 4c 65 61 64 29 0a 2a  sr -> csrLead).*
d4d0: 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 66  *     }.**     f
d4e0: 6f 72 65 61 63 68 20 72 6f 77 20 28 63 73 72 4c  oreach row (csrL
d4f0: 65 61 64 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41  ead){.**       A
d500: 67 67 53 74 65 70 20 28 63 73 72 4c 65 61 64 29  ggStep (csrLead)
d510: 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  .**     }.**    
d520: 20 52 65 77 69 6e 64 20 28 63 73 72 4c 65 61 64   Rewind (csrLead
d530: 29 0a 2a 2a 20 20 20 20 20 49 6e 74 65 67 65 72  ).**     Integer
d540: 20 63 74 72 20 30 0a 2a 2a 20 20 20 20 20 66 6f   ctr 0.**     fo
d550: 72 65 61 63 68 20 72 6f 77 20 28 63 73 72 4c 65  reach row (csrLe
d560: 61 64 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66  ad){.**       if
d570: 28 20 6e 65 77 20 70 65 65 72 20 29 7b 0a 2a 2a  ( new peer ){.**
d580: 20 20 20 20 20 20 20 20 20 41 67 67 46 69 6e 61           AggFina
d590: 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20 20  l (xValue).**   
d5a0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
d5b0: 3c 63 74 72 3b 20 69 2b 2b 29 7b 0a 2a 2a 20 20  <ctr; i++){.**  
d5c0: 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20 61           Gosub a
d5d0: 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20  ddrGosub.**     
d5e0: 20 20 20 20 20 20 41 67 67 53 74 65 70 20 28 78        AggStep (x
d5f0: 49 6e 76 65 72 73 65 2c 20 69 45 70 68 43 73 72  Inverse, iEphCsr
d600: 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 4e  ).**           N
d610: 65 78 74 20 69 45 70 68 43 73 72 0a 2a 2a 20 20  ext iEphCsr.**  
d620: 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
d630: 20 20 20 20 49 6e 74 65 67 65 72 20 63 74 72 20      Integer ctr 
d640: 30 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20  0.**       }.** 
d650: 20 20 20 20 20 20 49 6e 63 72 20 63 74 72 0a 2a        Incr ctr.*
d660: 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20  *     }.**.**   
d670: 20 20 41 67 67 46 69 6e 61 6c 20 28 78 46 69 6e    AggFinal (xFin
d680: 61 6c 69 7a 65 29 0a 2a 2a 20 20 20 20 20 66 6f  alize).**     fo
d690: 72 28 69 3d 30 3b 20 69 3c 63 74 72 3b 20 69 2b  r(i=0; i<ctr; i+
d6a0: 2b 29 7b 0a 2a 2a 20 20 20 20 20 20 20 47 6f 73  +){.**       Gos
d6b0: 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20  ub addrGosub.** 
d6c0: 20 20 20 20 20 20 4e 65 78 74 20 69 45 70 68 43        Next iEphC
d6d0: 73 72 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a  sr.**     }.**.*
d6e0: 2a 20 20 20 20 20 52 65 73 65 74 53 6f 72 74 65  *     ResetSorte
d6f0: 72 20 28 63 73 72 29 0a 2a 2a 20 20 20 20 20 52  r (csr).**     R
d700: 65 74 75 72 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  eturn.*/.static 
d710: 76 6f 69 64 20 77 69 6e 64 6f 77 43 6f 64 65 43  void windowCodeC
d720: 61 63 68 65 53 74 65 70 28 0a 20 20 50 61 72 73  acheStep(.  Pars
d730: 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 53 65  e *pParse, .  Se
d740: 6c 65 63 74 20 2a 70 2c 0a 20 20 57 68 65 72 65  lect *p,.  Where
d750: 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20 20  Info *pWInfo,.  
d760: 69 6e 74 20 72 65 67 47 6f 73 75 62 2c 20 0a 20  int regGosub, . 
d770: 20 69 6e 74 20 61 64 64 72 47 6f 73 75 62 0a 29   int addrGosub.)
d780: 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69  {.  Window *pMWi
d790: 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b 0a 20 20 56  n = p->pWin;.  V
d7a0: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
d7b0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
d7c0: 0a 20 20 69 6e 74 20 6b 3b 0a 20 20 69 6e 74 20  .  int k;.  int 
d7d0: 61 64 64 72 3b 0a 20 20 45 78 70 72 4c 69 73 74  addr;.  ExprList
d7e0: 20 2a 70 50 61 72 74 20 3d 20 70 4d 57 69 6e 2d   *pPart = pMWin-
d7f0: 3e 70 50 61 72 74 69 74 69 6f 6e 3b 0a 20 20 45  >pPartition;.  E
d800: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
d810: 79 20 3d 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65  y = pMWin->pOrde
d820: 72 42 79 3b 0a 20 20 69 6e 74 20 6e 50 65 65 72  rBy;.  int nPeer
d830: 20 3d 20 70 4f 72 64 65 72 42 79 20 3f 20 70 4f   = pOrderBy ? pO
d840: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 3a 20  rderBy->nExpr : 
d850: 30 3b 0a 20 20 69 6e 74 20 72 65 67 4e 65 77 50  0;.  int regNewP
d860: 65 65 72 3b 0a 0a 20 20 69 6e 74 20 61 64 64 72  eer;..  int addr
d870: 47 6f 74 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Goto;           
d880: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
d890: 73 73 20 6f 66 20 47 6f 74 6f 20 75 73 65 64 20  ss of Goto used 
d8a0: 74 6f 20 6a 75 6d 70 20 66 6c 75 73 68 5f 70 61  to jump flush_pa
d8b0: 72 2e 2e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  r.. */.  int add
d8c0: 72 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  rNext;          
d8d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
d8e0: 20 68 65 72 65 20 66 6f 72 20 6e 65 78 74 20 69   here for next i
d8f0: 74 65 72 61 74 69 6f 6e 20 6f 66 20 6c 6f 6f 70  teration of loop
d900: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 6c 75   */.  int regFlu
d910: 73 68 50 61 72 74 3b 0a 20 20 69 6e 74 20 6c 62  shPart;.  int lb
d920: 6c 46 6c 75 73 68 50 61 72 74 3b 0a 20 20 69 6e  lFlushPart;.  in
d930: 74 20 63 73 72 4c 65 61 64 3b 0a 20 20 69 6e 74  t csrLead;.  int
d940: 20 72 65 67 43 74 72 3b 0a 20 20 69 6e 74 20 72   regCtr;.  int r
d950: 65 67 41 72 67 3b 20 20 20 20 20 20 20 20 20 20  egArg;          
d960: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
d970: 67 69 73 74 65 72 20 61 72 72 61 79 20 74 6f 20  gister array to 
d980: 6d 61 72 74 69 61 6c 20 66 75 6e 63 74 69 6f 6e  martial function
d990: 20 61 72 67 73 20 2a 2f 0a 20 20 69 6e 74 20 72   args */.  int r
d9a0: 65 67 53 69 7a 65 3b 0a 20 20 69 6e 74 20 6c 62  egSize;.  int lb
d9b0: 6c 45 6d 70 74 79 3b 0a 20 20 69 6e 74 20 62 52  lEmpty;.  int bR
d9c0: 65 76 65 72 73 65 20 3d 20 70 4d 57 69 6e 2d 3e  everse = pMWin->
d9d0: 70 4f 72 64 65 72 42 79 20 26 26 20 70 4d 57 69  pOrderBy && pMWi
d9e0: 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55  n->eStart==TK_CU
d9f0: 52 52 45 4e 54 20 0a 20 20 20 20 20 20 20 20 20  RRENT .         
da00: 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d   && pMWin->eEnd=
da10: 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 3b 0a 0a  =TK_UNBOUNDED;..
da20: 20 20 61 73 73 65 72 74 28 20 28 70 4d 57 69 6e    assert( (pMWin
da30: 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42  ->eStart==TK_UNB
da40: 4f 55 4e 44 45 44 20 26 26 20 70 4d 57 69 6e 2d  OUNDED && pMWin-
da50: 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e  >eEnd==TK_CURREN
da60: 54 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  T) .       || (p
da70: 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
da80: 5f 55 4e 42 4f 55 4e 44 45 44 20 26 26 20 70 4d  _UNBOUNDED && pM
da90: 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e  Win->eEnd==TK_UN
daa0: 42 4f 55 4e 44 45 44 29 20 0a 20 20 20 20 20 20  BOUNDED) .      
dab0: 20 7c 7c 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61   || (pMWin->eSta
dac0: 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 26  rt==TK_CURRENT &
dad0: 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54  & pMWin->eEnd==T
dae0: 4b 5f 43 55 52 52 45 4e 54 29 20 0a 20 20 20 20  K_CURRENT) .    
daf0: 20 20 20 7c 7c 20 28 70 4d 57 69 6e 2d 3e 65 53     || (pMWin->eS
db00: 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54  tart==TK_CURRENT
db10: 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d   && pMWin->eEnd=
db20: 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 29 20 0a  =TK_UNBOUNDED) .
db30: 20 20 29 3b 0a 0a 20 20 6c 62 6c 45 6d 70 74 79    );..  lblEmpty
db40: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
db50: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 72 65  keLabel(v);.  re
db60: 67 4e 65 77 50 65 65 72 20 3d 20 70 50 61 72 73  gNewPeer = pPars
db70: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 70 50 61  e->nMem+1;.  pPa
db80: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 65  rse->nMem += nPe
db90: 65 72 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  er;..  /* Alloca
dba0: 74 65 20 72 65 67 69 73 74 65 72 20 61 6e 64 20  te register and 
dbb0: 6c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 22 66  label for the "f
dbc0: 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 20  lush_partition" 
dbd0: 73 75 62 2d 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a  sub-routine. */.
dbe0: 20 20 72 65 67 46 6c 75 73 68 50 61 72 74 20 3d    regFlushPart =
dbf0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
dc00: 0a 20 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 20  .  lblFlushPart 
dc10: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
dc20: 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 63 73  eLabel(v);..  cs
dc30: 72 4c 65 61 64 20 3d 20 70 50 61 72 73 65 2d 3e  rLead = pParse->
dc40: 6e 54 61 62 2b 2b 3b 0a 20 20 72 65 67 43 74 72  nTab++;.  regCtr
dc50: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
dc60: 6d 3b 0a 0a 20 20 77 69 6e 64 6f 77 50 61 72 74  m;..  windowPart
dc70: 69 74 69 6f 6e 43 61 63 68 65 28 70 50 61 72 73  itionCache(pPars
dc80: 65 2c 20 70 2c 20 70 57 49 6e 66 6f 2c 20 72 65  e, p, pWInfo, re
dc90: 67 46 6c 75 73 68 50 61 72 74 2c 20 6c 62 6c 46  gFlushPart, lblF
dca0: 6c 75 73 68 50 61 72 74 2c 20 26 72 65 67 53 69  lushPart, &regSi
dcb0: 7a 65 29 3b 0a 20 20 61 64 64 72 47 6f 74 6f 20  ze);.  addrGoto 
dcc0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
dcd0: 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b  Op0(v, OP_Goto);
dce0: 0a 0a 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20  ..  /* Start of 
dcf0: 22 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e  "flush_partition
dd00: 22 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  " */.  sqlite3Vd
dd10: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
dd20: 2c 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 29 3b  , lblFlushPart);
dd30: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
dd40: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c  dOp2(v, OP_Once,
dd50: 20 30 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43   0, sqlite3VdbeC
dd60: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29  urrentAddr(v)+2)
dd70: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
dd80: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
dd90: 44 75 70 2c 20 63 73 72 4c 65 61 64 2c 20 70 4d  Dup, csrLead, pM
dda0: 57 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 0a  Win->iEphCsr);..
ddb0: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
ddc0: 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
ddd0: 72 65 67 69 73 74 65 72 20 66 6f 72 20 65 61 63  register for eac
dde0: 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  h window functio
ddf0: 6e 20 74 6f 20 4e 55 4c 4c 20 2a 2f 0a 20 20 72  n to NULL */.  r
de00: 65 67 41 72 67 20 3d 20 77 69 6e 64 6f 77 49 6e  egArg = windowIn
de10: 69 74 41 63 63 75 6d 28 70 50 61 72 73 65 2c 20  itAccum(pParse, 
de20: 70 4d 57 69 6e 29 3b 0a 0a 20 20 73 71 6c 69 74  pMWin);..  sqlit
de30: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
de40: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72  OP_Integer, 0, r
de50: 65 67 43 74 72 29 3b 0a 20 20 73 71 6c 69 74 65  egCtr);.  sqlite
de60: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
de70: 50 5f 52 65 77 69 6e 64 2c 20 63 73 72 4c 65 61  P_Rewind, csrLea
de80: 64 2c 20 6c 62 6c 45 6d 70 74 79 29 3b 0a 20 20  d, lblEmpty);.  
de90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dea0: 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
deb0: 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20  pMWin->iEphCsr, 
dec0: 6c 62 6c 45 6d 70 74 79 29 3b 0a 0a 20 20 69 66  lblEmpty);..  if
ded0: 28 20 62 52 65 76 65 72 73 65 20 29 7b 0a 20 20  ( bReverse ){.  
dee0: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
def0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
df00: 64 64 72 28 76 29 3b 0a 20 20 20 20 77 69 6e 64  ddr(v);.    wind
df10: 6f 77 41 67 67 53 74 65 70 28 70 50 61 72 73 65  owAggStep(pParse
df20: 2c 20 70 4d 57 69 6e 2c 20 63 73 72 4c 65 61 64  , pMWin, csrLead
df30: 2c 20 30 2c 20 72 65 67 41 72 67 2c 20 72 65 67  , 0, regArg, reg
df40: 53 69 7a 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Size);.    sqlit
df50: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
df60: 4f 50 5f 4e 65 78 74 2c 20 63 73 72 4c 65 61 64  OP_Next, csrLead
df70: 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 73 71 6c  , addr);.    sql
df80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
df90: 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 63 73 72  , OP_Rewind, csr
dfa0: 4c 65 61 64 2c 20 6c 62 6c 45 6d 70 74 79 29 3b  Lead, lblEmpty);
dfb0: 0a 20 20 7d 0a 20 20 61 64 64 72 4e 65 78 74 20  .  }.  addrNext 
dfc0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
dfd0: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20 20  rentAddr(v);..  
dfe0: 69 66 28 20 70 4f 72 64 65 72 42 79 20 26 26 20  if( pOrderBy && 
dff0: 28 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b  (pMWin->eEnd==TK
e000: 5f 43 55 52 52 45 4e 54 20 7c 7c 20 70 4d 57 69  _CURRENT || pMWi
e010: 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55  n->eStart==TK_CU
e020: 52 52 45 4e 54 29 20 29 7b 0a 20 20 20 20 69 6e  RRENT) ){.    in
e030: 74 20 62 43 75 72 72 65 6e 74 20 3d 20 28 70 4d  t bCurrent = (pM
e040: 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
e050: 43 55 52 52 45 4e 54 29 3b 0a 20 20 20 20 69 6e  CURRENT);.    in
e060: 74 20 61 64 64 72 4a 75 6d 70 20 3d 20 30 3b 20  t addrJump = 0; 
e070: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
e080: 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4a 75 6d  ddress of OP_Jum
e090: 70 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 69  p below */.    i
e0a0: 66 28 20 70 4d 57 69 6e 2d 3e 65 54 79 70 65 3d  f( pMWin->eType=
e0b0: 3d 54 4b 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20  =TK_RANGE ){.   
e0c0: 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 4d     int iOff = pM
e0d0: 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 20  Win->nBufferCol 
e0e0: 2b 20 28 70 50 61 72 74 20 3f 20 70 50 61 72 74  + (pPart ? pPart
e0f0: 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20  ->nExpr : 0);.  
e100: 20 20 20 20 69 6e 74 20 72 65 67 50 65 65 72 20      int regPeer 
e110: 3d 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74  = pMWin->regPart
e120: 20 2b 20 28 70 50 61 72 74 20 3f 20 70 50 61 72   + (pPart ? pPar
e130: 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20  t->nExpr : 0);. 
e140: 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
e150: 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
e160: 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  KeyInfoFromExprL
e170: 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ist(pParse, pOrd
e180: 65 72 42 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20  erBy, 0, 0);.   
e190: 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 50     for(k=0; k<nP
e1a0: 65 65 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  eer; k++){.     
e1b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e1c0: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
e1d0: 6e 2c 20 63 73 72 4c 65 61 64 2c 20 69 4f 66 66  n, csrLead, iOff
e1e0: 2b 6b 2c 20 72 65 67 4e 65 77 50 65 65 72 2b 6b  +k, regNewPeer+k
e1f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
e200: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
e210: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
e220: 43 6f 6d 70 61 72 65 2c 20 72 65 67 4e 65 77 50  Compare, regNewP
e230: 65 65 72 2c 20 72 65 67 50 65 65 72 2c 20 6e 50  eer, regPeer, nP
e240: 65 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eer);.      sqli
e250: 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
e260: 76 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e  v, (void*)pKeyIn
e270: 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
e280: 0a 20 20 20 20 20 20 61 64 64 72 4a 75 6d 70 20  .      addrJump 
e290: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
e2a0: 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
e2b0: 61 64 64 72 2b 32 2c 20 30 2c 20 61 64 64 72 2b  addr+2, 0, addr+
e2c0: 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
e2d0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
e2e0: 50 5f 43 6f 70 79 2c 20 72 65 67 4e 65 77 50 65  P_Copy, regNewPe
e2f0: 65 72 2c 20 72 65 67 50 65 65 72 2c 20 6e 50 65  er, regPeer, nPe
e300: 65 72 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  er-1);.    }..  
e310: 20 20 77 69 6e 64 6f 77 52 65 74 75 72 6e 52 6f    windowReturnRo
e320: 77 73 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  ws(pParse, pMWin
e330: 2c 20 72 65 67 43 74 72 2c 20 72 65 67 47 6f 73  , regCtr, regGos
e340: 75 62 2c 20 61 64 64 72 47 6f 73 75 62 2c 20 0a  ub, addrGosub, .
e350: 20 20 20 20 20 20 20 20 28 62 43 75 72 72 65 6e          (bCurren
e360: 74 20 3f 20 72 65 67 41 72 67 20 3a 20 30 29 2c  t ? regArg : 0),
e370: 20 28 62 43 75 72 72 65 6e 74 20 3f 20 72 65 67   (bCurrent ? reg
e380: 53 69 7a 65 20 3a 20 30 29 0a 20 20 20 20 29 3b  Size : 0).    );
e390: 0a 20 20 20 20 69 66 28 20 61 64 64 72 4a 75 6d  .    if( addrJum
e3a0: 70 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  p ) sqlite3VdbeJ
e3b0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4a  umpHere(v, addrJ
e3c0: 75 6d 70 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ump);.  }..  if(
e3d0: 20 62 52 65 76 65 72 73 65 3d 3d 30 20 29 7b 0a   bReverse==0 ){.
e3e0: 20 20 20 20 77 69 6e 64 6f 77 41 67 67 53 74 65      windowAggSte
e3f0: 70 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c  p(pParse, pMWin,
e400: 20 63 73 72 4c 65 61 64 2c 20 30 2c 20 72 65 67   csrLead, 0, reg
e410: 41 72 67 2c 20 72 65 67 53 69 7a 65 29 3b 0a 20  Arg, regSize);. 
e420: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
e430: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
e440: 49 6d 6d 2c 20 72 65 67 43 74 72 2c 20 31 29 3b  Imm, regCtr, 1);
e450: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
e460: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
e470: 20 63 73 72 4c 65 61 64 2c 20 61 64 64 72 4e 65   csrLead, addrNe
e480: 78 74 29 3b 0a 0a 20 20 77 69 6e 64 6f 77 52 65  xt);..  windowRe
e490: 74 75 72 6e 52 6f 77 73 28 70 50 61 72 73 65 2c  turnRows(pParse,
e4a0: 20 70 4d 57 69 6e 2c 20 72 65 67 43 74 72 2c 20   pMWin, regCtr, 
e4b0: 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f  regGosub, addrGo
e4c0: 73 75 62 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 73  sub, 0, 0);..  s
e4d0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
e4e0: 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 45 6d 70  eLabel(v, lblEmp
e4f0: 74 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ty);.  sqlite3Vd
e500: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
e510: 65 73 65 74 53 6f 72 74 65 72 2c 20 70 4d 57 69  esetSorter, pMWi
e520: 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 73  n->iEphCsr);.  s
e530: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
e540: 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
e550: 65 67 46 6c 75 73 68 50 61 72 74 29 3b 0a 0a 20  egFlushPart);.. 
e560: 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65   /* Jump to here
e570: 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 66 6c   to skip over fl
e580: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 20 2a 2f  ush_partition */
e590: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
e5a0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 47 6f  mpHere(v, addrGo
e5b0: 74 6f 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  to);.}.../*.** R
e5c0: 41 4e 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42  ANGE BETWEEN UNB
e5d0: 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47  OUNDED PRECEDING
e5e0: 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57   AND CURRENT ROW
e5f0: 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 0a 2a 2a 20  .**.**   ....** 
e600: 20 20 20 20 69 66 28 20 6e 65 77 20 70 61 72 74      if( new part
e610: 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20  ition ){.**     
e620: 20 20 41 67 67 46 69 6e 61 6c 20 28 78 46 69 6e    AggFinal (xFin
e630: 61 6c 69 7a 65 29 0a 2a 2a 20 20 20 20 20 20 20  alize).**       
e640: 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a  Gosub addrGosub.
e650: 2a 2a 20 20 20 20 20 20 20 52 65 73 65 74 53 6f  **       ResetSo
e660: 72 74 65 72 20 65 70 68 2d 74 61 62 6c 65 0a 2a  rter eph-table.*
e670: 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 65  *     }.**     e
e680: 6c 73 65 20 69 66 28 20 6e 65 77 20 70 65 65 72  lse if( new peer
e690: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67 67   ){.**       Agg
e6a0: 46 69 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a  Final (xValue).*
e6b0: 2a 20 20 20 20 20 20 20 47 6f 73 75 62 20 61 64  *       Gosub ad
e6c0: 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20  drGosub.**      
e6d0: 20 52 65 73 65 74 53 6f 72 74 65 72 20 65 70 68   ResetSorter eph
e6e0: 2d 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 7d 0a  -table.**     }.
e6f0: 2a 2a 20 20 20 20 20 41 67 67 53 74 65 70 0a 2a  **     AggStep.*
e700: 2a 20 20 20 20 20 49 6e 73 65 72 74 20 28 72 65  *     Insert (re
e710: 63 6f 72 64 20 69 6e 74 6f 20 65 70 68 2d 74 61  cord into eph-ta
e720: 62 6c 65 29 0a 2a 2a 20 20 20 73 71 6c 69 74 65  ble).**   sqlite
e730: 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20  3WhereEnd().**  
e740: 20 41 67 67 46 69 6e 61 6c 20 28 78 46 69 6e 61   AggFinal (xFina
e750: 6c 69 7a 65 29 0a 2a 2a 20 20 20 47 6f 73 75 62  lize).**   Gosub
e760: 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 0a 2a 2a   addrGosub.**.**
e770: 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 55   RANGE BETWEEN U
e780: 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49  NBOUNDED PRECEDI
e790: 4e 47 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44  NG AND UNBOUNDED
e7a0: 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a   FOLLOWING.**.**
e7b0: 20 20 20 41 73 20 61 62 6f 76 65 2c 20 65 78 63     As above, exc
e7c0: 65 70 74 20 74 61 6b 65 20 6e 6f 20 61 63 74 69  ept take no acti
e7d0: 6f 6e 20 66 6f 72 20 61 20 22 6e 65 77 20 70 65  on for a "new pe
e7e0: 65 72 22 2e 20 49 6e 76 6f 6b 65 0a 2a 2a 20 20  er". Invoke.**  
e7f0: 20 74 68 65 20 73 75 62 2d 72 6f 75 74 69 6e 65   the sub-routine
e800: 20 6f 6e 63 65 20 6f 6e 6c 79 20 66 6f 72 20 65   once only for e
e810: 61 63 68 20 70 61 72 74 69 74 69 6f 6e 2e 0a 2a  ach partition..*
e820: 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54 57 45  *.** RANGE BETWE
e830: 45 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20 41  EN CURRENT ROW A
e840: 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a  ND CURRENT ROW.*
e850: 2a 0a 2a 2a 20 20 20 41 73 20 61 62 6f 76 65 2c  *.**   As above,
e860: 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65   except that the
e870: 20 22 6e 65 77 20 70 65 65 72 22 20 63 6f 6e 64   "new peer" cond
e880: 69 74 69 6f 6e 20 69 73 20 68 61 6e 64 6c 65 64  ition is handled
e890: 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 73 61 6d   in the.**   sam
e8a0: 65 20 77 61 79 20 61 73 20 22 6e 65 77 20 70 61  e way as "new pa
e8b0: 72 74 69 74 69 6f 6e 22 20 28 73 6f 20 74 68 65  rtition" (so the
e8c0: 72 65 20 69 73 20 6e 6f 20 22 65 6c 73 65 20 69  re is no "else i
e8d0: 66 22 20 62 6c 6f 63 6b 29 2e 0a 2a 2a 0a 2a 2a  f" block)..**.**
e8e0: 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20 55 4e   ROWS BETWEEN UN
e8f0: 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e  BOUNDED PRECEDIN
e900: 47 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f  G AND CURRENT RO
e910: 57 0a 2a 2a 20 0a 2a 2a 20 20 20 41 73 20 61 62  W.** .**   As ab
e920: 6f 76 65 2c 20 65 78 63 65 70 74 20 61 73 73 75  ove, except assu
e930: 6d 65 20 65 76 65 72 79 20 72 6f 77 20 69 73 20  me every row is 
e940: 61 20 22 6e 65 77 20 70 65 65 72 22 2e 0a 2a 2f  a "new peer"..*/
e950: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
e960: 64 6f 77 43 6f 64 65 44 65 66 61 75 6c 74 53 74  dowCodeDefaultSt
e970: 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ep(.  Parse *pPa
e980: 72 73 65 2c 20 0a 20 20 53 65 6c 65 63 74 20 2a  rse, .  Select *
e990: 70 2c 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  p,.  WhereInfo *
e9a0: 70 57 49 6e 66 6f 2c 0a 20 20 69 6e 74 20 72 65  pWInfo,.  int re
e9b0: 67 47 6f 73 75 62 2c 20 0a 20 20 69 6e 74 20 61  gGosub, .  int a
e9c0: 64 64 72 47 6f 73 75 62 0a 29 7b 0a 20 20 57 69  ddrGosub.){.  Wi
e9d0: 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d  ndow *pMWin = p-
e9e0: 3e 70 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76  >pWin;.  Vdbe *v
e9f0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
ea00: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  e(pParse);.  int
ea10: 20 6b 3b 0a 20 20 69 6e 74 20 69 53 75 62 43 73   k;.  int iSubCs
ea20: 72 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  r = p->pSrc->a[0
ea30: 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 69 6e 74  ].iCursor;.  int
ea40: 20 6e 53 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d   nSub = p->pSrc-
ea50: 3e 61 5b 30 5d 2e 70 54 61 62 2d 3e 6e 43 6f 6c  >a[0].pTab->nCol
ea60: 3b 0a 20 20 69 6e 74 20 72 65 67 20 3d 20 70 50  ;.  int reg = pP
ea70: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
ea80: 69 6e 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20  int regRecord = 
ea90: 72 65 67 2b 6e 53 75 62 3b 0a 20 20 69 6e 74 20  reg+nSub;.  int 
eaa0: 72 65 67 52 6f 77 69 64 20 3d 20 72 65 67 52 65  regRowid = regRe
eab0: 63 6f 72 64 2b 31 3b 0a 20 20 69 6e 74 20 61 64  cord+1;.  int ad
eac0: 64 72 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  dr;.  ExprList *
ead0: 70 50 61 72 74 20 3d 20 70 4d 57 69 6e 2d 3e 70  pPart = pMWin->p
eae0: 50 61 72 74 69 74 69 6f 6e 3b 0a 20 20 45 78 70  Partition;.  Exp
eaf0: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
eb00: 3d 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42  = pMWin->pOrderB
eb10: 79 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4d  y;..  assert( pM
eb20: 57 69 6e 2d 3e 65 54 79 70 65 3d 3d 54 4b 5f 52  Win->eType==TK_R
eb30: 41 4e 47 45 20 0a 20 20 20 20 20 20 7c 7c 20 28  ANGE .      || (
eb40: 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
eb50: 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 26 26 20 70  K_UNBOUNDED && p
eb60: 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43  MWin->eEnd==TK_C
eb70: 55 52 52 45 4e 54 29 0a 20 20 29 3b 0a 0a 20 20  URRENT).  );..  
eb80: 61 73 73 65 72 74 28 20 28 70 4d 57 69 6e 2d 3e  assert( (pMWin->
eb90: 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55  eStart==TK_UNBOU
eba0: 4e 44 45 44 20 26 26 20 70 4d 57 69 6e 2d 3e 65  NDED && pMWin->e
ebb0: 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29  End==TK_CURRENT)
ebc0: 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 4d 57 69  .       || (pMWi
ebd0: 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e  n->eStart==TK_UN
ebe0: 42 4f 55 4e 44 45 44 20 26 26 20 70 4d 57 69 6e  BOUNDED && pMWin
ebf0: 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55  ->eEnd==TK_UNBOU
ec00: 4e 44 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20  NDED).       || 
ec10: 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d  (pMWin->eStart==
ec20: 54 4b 5f 43 55 52 52 45 4e 54 20 26 26 20 70 4d  TK_CURRENT && pM
ec30: 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55  Win->eEnd==TK_CU
ec40: 52 52 45 4e 54 29 0a 20 20 20 20 20 20 20 7c 7c  RRENT).       ||
ec50: 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d   (pMWin->eStart=
ec60: 3d 54 4b 5f 43 55 52 52 45 4e 54 20 26 26 20 70  =TK_CURRENT && p
ec70: 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55  MWin->eEnd==TK_U
ec80: 4e 42 4f 55 4e 44 45 44 20 26 26 20 21 70 4f 72  NBOUNDED && !pOr
ec90: 64 65 72 42 79 29 0a 20 20 29 3b 0a 0a 20 20 69  derBy).  );..  i
eca0: 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  f( pMWin->eEnd==
ecb0: 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a  TK_UNBOUNDED ){.
ecc0: 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30      pOrderBy = 0
ecd0: 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 72 73 65 2d  ;.  }..  pParse-
ece0: 3e 6e 4d 65 6d 20 2b 3d 20 6e 53 75 62 20 2b 20  >nMem += nSub + 
ecf0: 32 3b 0a 0a 20 20 2f 2a 20 4d 61 72 74 69 61 6c  2;..  /* Martial
ed00: 20 74 68 65 20 72 6f 77 20 72 65 74 75 72 6e 65   the row returne
ed10: 64 20 62 79 20 74 68 65 20 73 75 62 2d 73 65 6c  d by the sub-sel
ed20: 65 63 74 20 69 6e 74 6f 20 61 6e 20 61 72 72 61  ect into an arra
ed30: 79 20 6f 66 20 0a 20 20 2a 2a 20 72 65 67 69 73  y of .  ** regis
ed40: 74 65 72 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 6b  ters. */.  for(k
ed50: 3d 30 3b 20 6b 3c 6e 53 75 62 3b 20 6b 2b 2b 29  =0; k<nSub; k++)
ed60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
ed70: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
ed80: 6c 75 6d 6e 2c 20 69 53 75 62 43 73 72 2c 20 6b  lumn, iSubCsr, k
ed90: 2c 20 72 65 67 2b 6b 29 3b 0a 20 20 7d 0a 0a 20  , reg+k);.  }.. 
eda0: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69   /* Check if thi
edb0: 73 20 69 73 20 74 68 65 20 73 74 61 72 74 20 6f  s is the start o
edc0: 66 20 61 20 6e 65 77 20 70 61 72 74 69 74 69 6f  f a new partitio
edd0: 6e 20 6f 72 20 70 65 65 72 20 67 72 6f 75 70 2e  n or peer group.
ede0: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 74 20   */.  if( pPart 
edf0: 7c 7c 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  || pOrderBy ){. 
ee00: 20 20 20 69 6e 74 20 6e 50 61 72 74 20 3d 20 28     int nPart = (
ee10: 70 50 61 72 74 20 3f 20 70 50 61 72 74 2d 3e 6e  pPart ? pPart->n
ee20: 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 69  Expr : 0);.    i
ee30: 6e 74 20 61 64 64 72 47 6f 74 6f 20 3d 20 30 3b  nt addrGoto = 0;
ee40: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4a 75 6d  .    int addrJum
ee50: 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e  p = 0;.    int n
ee60: 50 65 65 72 20 3d 20 28 70 4f 72 64 65 72 42 79  Peer = (pOrderBy
ee70: 20 3f 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   ? pOrderBy->nEx
ee80: 70 72 20 3a 20 30 29 3b 0a 0a 20 20 20 20 69 66  pr : 0);..    if
ee90: 28 20 70 50 61 72 74 20 29 7b 0a 20 20 20 20 20  ( pPart ){.     
eea0: 20 69 6e 74 20 72 65 67 4e 65 77 50 61 72 74 20   int regNewPart 
eeb0: 3d 20 72 65 67 20 2b 20 70 4d 57 69 6e 2d 3e 6e  = reg + pMWin->n
eec0: 42 75 66 66 65 72 43 6f 6c 3b 0a 20 20 20 20 20  BufferCol;.     
eed0: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
eee0: 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  fo = sqlite3KeyI
eef0: 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
ef00: 70 50 61 72 73 65 2c 20 70 50 61 72 74 2c 20 30  pParse, pPart, 0
ef10: 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 64 64 72  , 0);.      addr
ef20: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
ef30: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp3(v, OP_Compa
ef40: 72 65 2c 20 72 65 67 4e 65 77 50 61 72 74 2c 20  re, regNewPart, 
ef50: 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c 6e  pMWin->regPart,n
ef60: 50 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Part);.      sql
ef70: 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
ef80: 28 76 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79 49  (v, (void*)pKeyI
ef90: 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
efa0: 3b 0a 20 20 20 20 20 20 61 64 64 72 4a 75 6d 70  ;.      addrJump
efb0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
efc0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
efd0: 20 61 64 64 72 2b 32 2c 20 30 2c 20 61 64 64 72   addr+2, 0, addr
efe0: 2b 32 29 3b 0a 20 20 20 20 20 20 77 69 6e 64 6f  +2);.      windo
eff0: 77 41 67 67 46 69 6e 61 6c 28 70 50 61 72 73 65  wAggFinal(pParse
f000: 2c 20 70 4d 57 69 6e 2c 20 31 29 3b 0a 20 20 20  , pMWin, 1);.   
f010: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
f020: 29 7b 0a 20 20 20 20 20 20 20 20 61 64 64 72 47  ){.        addrG
f030: 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33 56 64 62  oto = sqlite3Vdb
f040: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f  eAddOp0(v, OP_Go
f050: 74 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  to);.      }.   
f060: 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 72 64   }..    if( pOrd
f070: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e  erBy ){.      in
f080: 74 20 72 65 67 4e 65 77 50 65 65 72 20 3d 20 72  t regNewPeer = r
f090: 65 67 20 2b 20 70 4d 57 69 6e 2d 3e 6e 42 75 66  eg + pMWin->nBuf
f0a0: 66 65 72 43 6f 6c 20 2b 20 6e 50 61 72 74 3b 0a  ferCol + nPart;.
f0b0: 20 20 20 20 20 20 69 6e 74 20 72 65 67 50 65 65        int regPee
f0c0: 72 20 3d 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61  r = pMWin->regPa
f0d0: 72 74 20 2b 20 6e 50 61 72 74 3b 0a 0a 20 20 20  rt + nPart;..   
f0e0: 20 20 20 69 66 28 20 61 64 64 72 4a 75 6d 70 20     if( addrJump 
f0f0: 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
f100: 70 48 65 72 65 28 76 2c 20 61 64 64 72 4a 75 6d  pHere(v, addrJum
f110: 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d  p);.      if( pM
f120: 57 69 6e 2d 3e 65 54 79 70 65 3d 3d 54 4b 5f 52  Win->eType==TK_R
f130: 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20  ANGE ){.        
f140: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
f150: 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
f160: 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
f170: 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
f180: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
f190: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
f1a0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
f1b0: 6f 6d 70 61 72 65 2c 20 72 65 67 4e 65 77 50 65  ompare, regNewPe
f1c0: 65 72 2c 20 72 65 67 50 65 65 72 2c 20 6e 50 65  er, regPeer, nPe
f1d0: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  er);.        sql
f1e0: 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
f1f0: 28 76 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79 49  (v, (void*)pKeyI
f200: 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
f210: 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72 4a 75  ;.        addrJu
f220: 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  mp = sqlite3Vdbe
f230: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
f240: 70 2c 20 61 64 64 72 2b 32 2c 20 30 2c 20 61 64  p, addr+2, 0, ad
f250: 64 72 2b 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c  dr+2);.      }el
f260: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 64 64 72  se{.        addr
f270: 4a 75 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  Jump = 0;.      
f280: 7d 0a 20 20 20 20 20 20 77 69 6e 64 6f 77 41 67  }.      windowAg
f290: 67 46 69 6e 61 6c 28 70 50 61 72 73 65 2c 20 70  gFinal(pParse, p
f2a0: 4d 57 69 6e 2c 20 70 4d 57 69 6e 2d 3e 65 53 74  MWin, pMWin->eSt
f2b0: 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29  art==TK_CURRENT)
f2c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 61 64 64 72  ;.      if( addr
f2d0: 47 6f 74 6f 20 29 20 73 71 6c 69 74 65 33 56 64  Goto ) sqlite3Vd
f2e0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
f2f0: 64 72 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a 0a  drGoto);.    }..
f300: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f310: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
f320: 6e 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43  nd, pMWin->iEphC
f330: 73 72 2c 73 71 6c 69 74 65 33 56 64 62 65 43 75  sr,sqlite3VdbeCu
f340: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b  rrentAddr(v)+3);
f350: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
f360: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
f370: 75 62 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64  ub, regGosub, ad
f380: 64 72 47 6f 73 75 62 29 3b 0a 20 20 20 20 73 71  drGosub);.    sq
f390: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
f3a0: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4d 57 69  v, OP_Next, pMWi
f3b0: 6e 2d 3e 69 45 70 68 43 73 72 2c 20 73 71 6c 69  n->iEphCsr, sqli
f3c0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
f3d0: 64 72 28 76 29 2d 31 29 3b 0a 0a 20 20 20 20 73  dr(v)-1);..    s
f3e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
f3f0: 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74  (v, OP_ResetSort
f400: 65 72 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43  er, pMWin->iEphC
f410: 73 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  sr);.    sqlite3
f420: 56 64 62 65 41 64 64 4f 70 33 28 0a 20 20 20 20  VdbeAddOp3(.    
f430: 20 20 20 20 76 2c 20 4f 50 5f 43 6f 70 79 2c 20      v, OP_Copy, 
f440: 72 65 67 2b 70 4d 57 69 6e 2d 3e 6e 42 75 66 66  reg+pMWin->nBuff
f450: 65 72 43 6f 6c 2c 20 70 4d 57 69 6e 2d 3e 72 65  erCol, pMWin->re
f460: 67 50 61 72 74 2c 20 6e 50 61 72 74 2b 6e 50 65  gPart, nPart+nPe
f470: 65 72 2d 31 0a 20 20 20 20 29 3b 0a 0a 20 20 20  er-1.    );..   
f480: 20 69 66 28 20 61 64 64 72 4a 75 6d 70 20 29 20   if( addrJump ) 
f490: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
f4a0: 65 72 65 28 76 2c 20 61 64 64 72 4a 75 6d 70 29  ere(v, addrJump)
f4b0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 76 6f  ;.  }..  /* Invo
f4c0: 6b 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e  ke step function
f4d0: 20 66 6f 72 20 77 69 6e 64 6f 77 20 66 75 6e 63   for window func
f4e0: 74 69 6f 6e 73 20 2a 2f 0a 20 20 77 69 6e 64 6f  tions */.  windo
f4f0: 77 41 67 67 53 74 65 70 28 70 50 61 72 73 65 2c  wAggStep(pParse,
f500: 20 70 4d 57 69 6e 2c 20 2d 31 2c 20 30 2c 20 72   pMWin, -1, 0, r
f510: 65 67 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 42 75  eg, 0);..  /* Bu
f520: 66 66 65 72 20 74 68 65 20 63 75 72 72 65 6e 74  ffer the current
f530: 20 72 6f 77 20 69 6e 20 74 68 65 20 65 70 68 65   row in the ephe
f540: 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20 2a 2f 0a  meral table. */.
f550: 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 6e 42 75    if( pMWin->nBu
f560: 66 66 65 72 43 6f 6c 3e 30 20 29 7b 0a 20 20 20  fferCol>0 ){.   
f570: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f580: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
f590: 6f 72 64 2c 20 72 65 67 2c 20 70 4d 57 69 6e 2d  ord, reg, pMWin-
f5a0: 3e 6e 42 75 66 66 65 72 43 6f 6c 2c 20 72 65 67  >nBufferCol, reg
f5b0: 52 65 63 6f 72 64 29 3b 0a 20 20 7d 65 6c 73 65  Record);.  }else
f5c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
f5d0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 42 6c  eAddOp2(v, OP_Bl
f5e0: 6f 62 2c 20 30 2c 20 72 65 67 52 65 63 6f 72 64  ob, 0, regRecord
f5f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
f600: 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28 76  beAppendP4(v, (v
f610: 6f 69 64 2a 29 22 22 2c 20 30 29 3b 0a 20 20 7d  oid*)"", 0);.  }
f620: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
f630: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
f640: 77 69 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  wid, pMWin->iEph
f650: 43 73 72 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  Csr, regRowid);.
f660: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f670: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
f680: 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
f690: 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 72 65 67  , regRecord, reg
f6a0: 52 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a 20 45 6e  Rowid);..  /* En
f6b0: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
f6c0: 63 61 6e 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 73  can loop. */.  s
f6d0: 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
f6e0: 57 49 6e 66 6f 29 3b 0a 0a 20 20 77 69 6e 64 6f  WInfo);..  windo
f6f0: 77 41 67 67 46 69 6e 61 6c 28 70 50 61 72 73 65  wAggFinal(pParse
f700: 2c 20 70 4d 57 69 6e 2c 20 31 29 3b 0a 20 20 73  , pMWin, 1);.  s
f710: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
f720: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70  (v, OP_Rewind, p
f730: 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 73 71  MWin->iEphCsr,sq
f740: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
f750: 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 73 71  Addr(v)+3);.  sq
f760: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
f770: 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
f780: 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62  Gosub, addrGosub
f790: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
f7a0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
f7b0: 74 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  t, pMWin->iEphCs
f7c0: 72 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  r, sqlite3VdbeCu
f7d0: 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 29 3b  rrentAddr(v)-1);
f7e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
f7f0: 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
f800: 64 75 70 6c 69 63 61 74 65 20 6f 66 20 74 68 65  duplicate of the
f810: 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 69   Window object i
f820: 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65 0a  ndicated by the.
f830: 2a 2a 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  ** third argumen
f840: 74 2e 20 53 65 74 20 74 68 65 20 57 69 6e 64 6f  t. Set the Windo
f850: 77 2e 70 4f 77 6e 65 72 20 66 69 65 6c 64 20 6f  w.pOwner field o
f860: 66 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  f the new object
f870: 20 74 6f 0a 2a 2a 20 70 4f 77 6e 65 72 2e 0a 2a   to.** pOwner..*
f880: 2f 0a 57 69 6e 64 6f 77 20 2a 73 71 6c 69 74 65  /.Window *sqlite
f890: 33 57 69 6e 64 6f 77 44 75 70 28 73 71 6c 69 74  3WindowDup(sqlit
f8a0: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4f  e3 *db, Expr *pO
f8b0: 77 6e 65 72 2c 20 57 69 6e 64 6f 77 20 2a 70 29  wner, Window *p)
f8c0: 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4e 65 77  {.  Window *pNew
f8d0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b   = 0;.  if( p ){
f8e0: 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
f8f0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
f900: 64 62 2c 20 73 69 7a 65 6f 66 28 57 69 6e 64 6f  db, sizeof(Windo
f910: 77 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  w));.    if( pNe
f920: 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  w ){.      pNew-
f930: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
f940: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 2d 3e  DbStrDup(db, p->
f950: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 4e  zName);.      pN
f960: 65 77 2d 3e 70 46 69 6c 74 65 72 20 3d 20 73 71  ew->pFilter = sq
f970: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
f980: 20 70 2d 3e 70 46 69 6c 74 65 72 2c 20 30 29 3b   p->pFilter, 0);
f990: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50 61  .      pNew->pPa
f9a0: 72 74 69 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65  rtition = sqlite
f9b0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
f9c0: 20 70 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20   p->pPartition, 
f9d0: 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  0);.      pNew->
f9e0: 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74  pOrderBy = sqlit
f9f0: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
fa00: 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 30  , p->pOrderBy, 0
fa10: 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 65  );.      pNew->e
fa20: 54 79 70 65 20 3d 20 70 2d 3e 65 54 79 70 65 3b  Type = p->eType;
fa30: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 65 45 6e  .      pNew->eEn
fa40: 64 20 3d 20 70 2d 3e 65 45 6e 64 3b 0a 20 20 20  d = p->eEnd;.   
fa50: 20 20 20 70 4e 65 77 2d 3e 65 53 74 61 72 74 20     pNew->eStart 
fa60: 3d 20 70 2d 3e 65 53 74 61 72 74 3b 0a 20 20 20  = p->eStart;.   
fa70: 20 20 20 70 4e 65 77 2d 3e 70 53 74 61 72 74 20     pNew->pStart 
fa80: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
fa90: 28 64 62 2c 20 70 2d 3e 70 53 74 61 72 74 2c 20  (db, p->pStart, 
faa0: 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  0);.      pNew->
fab0: 70 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 45 78  pEnd = sqlite3Ex
fac0: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 6e  prDup(db, p->pEn
fad0: 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65  d, 0);.      pNe
fae0: 77 2d 3e 70 4f 77 6e 65 72 20 3d 20 70 4f 77 6e  w->pOwner = pOwn
faf0: 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  er;.    }.  }.  
fb00: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
fb10: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 63  /*.** Return a c
fb20: 6f 70 79 20 6f 66 20 74 68 65 20 6c 69 6e 6b 65  opy of the linke
fb30: 64 20 6c 69 73 74 20 6f 66 20 57 69 6e 64 6f 77  d list of Window
fb40: 20 6f 62 6a 65 63 74 73 20 70 61 73 73 65 64 20   objects passed 
fb50: 61 73 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64  as the.** second
fb60: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 57 69   argument..*/.Wi
fb70: 6e 64 6f 77 20 2a 73 71 6c 69 74 65 33 57 69 6e  ndow *sqlite3Win
fb80: 64 6f 77 4c 69 73 74 44 75 70 28 73 71 6c 69 74  dowListDup(sqlit
fb90: 65 33 20 2a 64 62 2c 20 57 69 6e 64 6f 77 20 2a  e3 *db, Window *
fba0: 70 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57  p){.  Window *pW
fbb0: 69 6e 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 52  in;.  Window *pR
fbc0: 65 74 20 3d 20 30 3b 0a 20 20 57 69 6e 64 6f 77  et = 0;.  Window
fbd0: 20 2a 2a 70 70 20 3d 20 26 70 52 65 74 3b 0a 0a   **pp = &pRet;..
fbe0: 20 20 66 6f 72 28 70 57 69 6e 3d 70 3b 20 70 57    for(pWin=p; pW
fbf0: 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70  in; pWin=pWin->p
fc00: 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 2a 70  NextWin){.    *p
fc10: 70 20 3d 20 73 71 6c 69 74 65 33 57 69 6e 64 6f  p = sqlite3Windo
fc20: 77 44 75 70 28 64 62 2c 20 30 2c 20 70 57 69 6e  wDup(db, 0, pWin
fc30: 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 70 3d 3d  );.    if( *pp==
fc40: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70  0 ) break;.    p
fc50: 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65  p = &((*pp)->pNe
fc60: 78 74 57 69 6e 29 3b 0a 20 20 7d 0a 0a 20 20 72  xtWin);.  }..  r
fc70: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
fc80: 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72  *.** sqlite3Wher
fc90: 65 42 65 67 69 6e 28 29 20 68 61 73 20 61 6c 72  eBegin() has alr
fca0: 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
fcb0: 20 66 6f 72 20 74 68 65 20 53 45 4c 45 43 54 20   for the SELECT 
fcc0: 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a 20 70 61  statement .** pa
fcd0: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
fce0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 77 68 65 6e  nd argument when
fcf0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
fd00: 73 20 69 6e 76 6f 6b 65 64 2e 20 49 74 20 67 65  s invoked. It ge
fd10: 6e 65 72 61 74 65 73 0a 2a 2a 20 63 6f 64 65 20  nerates.** code 
fd20: 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  to populate the 
fd30: 57 69 6e 64 6f 77 2e 72 65 67 52 65 73 75 6c 74  Window.regResult
fd40: 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 65 61   register for ea
fd50: 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  ch window functi
fd60: 6f 6e 20 61 6e 64 0a 2a 2a 20 69 6e 76 6f 6b 65  on and.** invoke
fd70: 20 74 68 65 20 73 75 62 2d 72 6f 75 74 69 6e 65   the sub-routine
fd80: 20 61 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   at instruction 
fd90: 61 64 64 72 47 6f 73 75 62 20 6f 6e 63 65 20 66  addrGosub once f
fda0: 6f 72 20 65 61 63 68 20 72 6f 77 2e 0a 2a 2a 20  or each row..** 
fdb0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  This function ca
fdc0: 6c 6c 73 20 73 71 6c 69 74 65 33 57 68 65 72 65  lls sqlite3Where
fdd0: 45 6e 64 28 29 20 62 65 66 6f 72 65 20 72 65 74  End() before ret
fde0: 75 72 6e 69 6e 67 2e 20 0a 2a 2f 0a 76 6f 69 64  urning. .*/.void
fdf0: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f   sqlite3WindowCo
fe00: 64 65 53 74 65 70 28 0a 20 20 50 61 72 73 65 20  deStep(.  Parse 
fe10: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
fe20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
fe30: 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
fe40: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
fe50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe60: 2f 2a 20 52 65 77 72 69 74 74 65 6e 20 53 45 4c  /* Rewritten SEL
fe70: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
fe80: 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
fe90: 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
fea0: 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 72 65     /* Context re
feb0: 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
fec0: 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f  3WhereBegin() */
fed0: 0a 20 20 69 6e 74 20 72 65 67 47 6f 73 75 62 2c  .  int regGosub,
fee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fef0: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66     /* Register f
ff00: 6f 72 20 4f 50 5f 47 6f 73 75 62 20 2a 2f 0a 20  or OP_Gosub */. 
ff10: 20 69 6e 74 20 61 64 64 72 47 6f 73 75 62 20 20   int addrGosub  
ff20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff30: 20 2f 2a 20 4f 50 5f 47 6f 73 75 62 20 68 65 72   /* OP_Gosub her
ff40: 65 20 74 6f 20 72 65 74 75 72 6e 20 65 61 63 68  e to return each
ff50: 20 72 6f 77 20 2a 2f 0a 29 7b 0a 20 20 57 69 6e   row */.){.  Win
ff60: 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e  dow *pMWin = p->
ff70: 70 57 69 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 72  pWin;..  /* Ther
ff80: 65 20 61 72 65 20 74 68 72 65 65 20 64 69 66 66  e are three diff
ff90: 65 72 65 6e 74 20 66 75 6e 63 74 69 6f 6e 73 20  erent functions 
ffa0: 74 68 61 74 20 6d 61 79 20 62 65 20 75 73 65 64  that may be used
ffb0: 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 0a   to do the work.
ffc0: 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 6f 6e 65    ** of this one
ffd0: 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74  , depending on t
ffe0: 68 65 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 20  he window frame 
fff0: 61 6e 64 20 74 68 65 20 73 70 65 63 69 66 69 63  and the specific
10000 20 62 75 69 6c 74 2d 69 6e 0a 20 20 2a 2a 20 77   built-in.  ** w
10010 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
10020 75 73 65 64 20 28 69 66 20 61 6e 79 29 2e 0a 20  used (if any).. 
10030 20 2a 2a 0a 20 20 2a 2a 20 77 69 6e 64 6f 77 43   **.  ** windowC
10040 6f 64 65 52 6f 77 45 78 70 72 53 74 65 70 28 29  odeRowExprStep()
10050 20 68 61 6e 64 6c 65 73 20 61 6c 6c 20 22 52 4f   handles all "RO
10060 57 53 22 20 77 69 6e 64 6f 77 20 66 72 61 6d 65  WS" window frame
10070 73 2c 20 65 78 63 65 70 74 20 66 6f 72 3a 0a 20  s, except for:. 
10080 20 2a 2a 0a 20 20 2a 2a 20 20 20 52 4f 57 53 20   **.  **   ROWS 
10090 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45  BETWEEN UNBOUNDE
100a0 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20  D PRECEDING AND 
100b0 43 55 52 52 45 4e 54 20 52 4f 57 0a 20 20 2a 2a  CURRENT ROW.  **
100c0 0a 20 20 2a 2a 20 54 68 65 20 65 78 63 65 70 74  .  ** The except
100d0 69 6f 6e 20 69 73 20 62 65 63 61 75 73 65 20 77  ion is because w
100e0 69 6e 64 6f 77 43 6f 64 65 52 6f 77 45 78 70 72  indowCodeRowExpr
100f0 53 74 65 70 28 29 20 69 6d 70 6c 65 6d 65 6e 74  Step() implement
10100 73 20 61 6c 6c 20 77 69 6e 64 6f 77 0a 20 20 2a  s all window.  *
10110 2a 20 66 72 61 6d 65 20 74 79 70 65 73 20 62 79  * frame types by
10120 20 63 61 63 68 69 6e 67 20 74 68 65 20 65 6e 74   caching the ent
10130 69 72 65 20 70 61 72 74 69 74 69 6f 6e 20 69 6e  ire partition in
10140 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2c 20 61   a temp table, a
10150 6e 64 0a 20 20 2a 2a 20 22 52 4f 57 53 20 42 45  nd.  ** "ROWS BE
10160 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20  TWEEN UNBOUNDED 
10170 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 43 55  PRECEDING AND CU
10180 52 52 45 4e 54 20 52 4f 57 22 20 69 73 20 65 61  RRENT ROW" is ea
10190 73 79 20 65 6e 6f 75 67 68 20 74 6f 0a 20 20 2a  sy enough to.  *
101a0 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 77 69 74 68  * implement with
101b0 6f 75 74 20 73 75 63 68 20 61 20 63 61 63 68 65  out such a cache
101c0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 69 6e 64  ..  **.  ** wind
101d0 6f 77 43 6f 64 65 43 61 63 68 65 53 74 65 70 28  owCodeCacheStep(
101e0 29 20 69 73 20 75 73 65 64 20 66 6f 72 3a 0a 20  ) is used for:. 
101f0 20 2a 2a 0a 20 20 2a 2a 20 20 20 52 41 4e 47 45   **.  **   RANGE
10200 20 42 45 54 57 45 45 4e 20 43 55 52 52 45 4e 54   BETWEEN CURRENT
10210 20 52 4f 57 20 41 4e 44 20 55 4e 42 4f 55 4e 44   ROW AND UNBOUND
10220 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20 2a  ED FOLLOWING.  *
10230 2a 0a 20 20 2a 2a 20 49 74 20 69 73 20 61 6c 73  *.  ** It is als
10240 6f 20 75 73 65 64 20 66 6f 72 20 61 6e 79 74 68  o used for anyth
10250 69 6e 67 20 6e 6f 74 20 68 61 6e 64 6c 65 64 20  ing not handled 
10260 62 79 20 77 69 6e 64 6f 77 43 6f 64 65 52 6f 77  by windowCodeRow
10270 45 78 70 72 53 74 65 70 28 29 20 0a 20 20 2a 2a  ExprStep() .  **
10280 20 74 68 61 74 20 69 6e 76 6f 6b 65 73 20 61 20   that invokes a 
10290 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20  built-in window 
102a0 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 72 65  function that re
102b0 71 75 69 72 65 73 20 74 68 65 20 65 6e 74 69 72  quires the entir
102c0 65 20 0a 20 20 2a 2a 20 70 61 72 74 69 74 69 6f  e .  ** partitio
102d0 6e 20 74 6f 20 62 65 20 63 61 63 68 65 64 20 69  n to be cached i
102e0 6e 20 61 20 74 65 6d 70 20 74 61 62 6c 65 20 62  n a temp table b
102f0 65 66 6f 72 65 20 61 6e 79 20 72 6f 77 73 20 61  efore any rows a
10300 72 65 20 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a  re returned.  **
10310 20 28 65 2e 67 2e 20 6e 74 68 5f 76 61 6c 75 65   (e.g. nth_value
10320 28 29 20 6f 72 20 70 65 72 63 65 6e 74 5f 72 61  () or percent_ra
10330 6e 6b 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nk())..  **.  **
10340 20 46 69 6e 61 6c 6c 79 2c 20 61 73 73 75 6d 69   Finally, assumi
10350 6e 67 20 74 68 65 72 65 20 69 73 20 6e 6f 20 62  ng there is no b
10360 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66  uilt-in window f
10370 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 72 65 71  unction that req
10380 75 69 72 65 73 0a 20 20 2a 2a 20 74 68 65 20 70  uires.  ** the p
10390 61 72 74 69 74 69 6f 6e 20 74 6f 20 62 65 20 63  artition to be c
103a0 61 63 68 65 64 2c 20 77 69 6e 64 6f 77 43 6f 64  ached, windowCod
103b0 65 44 65 66 61 75 6c 74 53 74 65 70 28 29 20 69  eDefaultStep() i
103c0 73 20 75 73 65 64 20 66 6f 72 3a 0a 20 20 2a 2a  s used for:.  **
103d0 0a 20 20 2a 2a 20 20 20 52 41 4e 47 45 20 42 45  .  **   RANGE BE
103e0 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20  TWEEN UNBOUNDED 
103f0 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 43 55  PRECEDING AND CU
10400 52 52 45 4e 54 20 52 4f 57 20 0a 20 20 2a 2a 20  RRENT ROW .  ** 
10410 20 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20    RANGE BETWEEN 
10420 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44  UNBOUNDED PRECED
10430 49 4e 47 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45  ING AND UNBOUNDE
10440 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20 2a 2a  D FOLLOWING.  **
10450 20 20 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e     RANGE BETWEEN
10460 20 43 55 52 52 45 4e 54 20 52 4f 57 20 41 4e 44   CURRENT ROW AND
10470 20 43 55 52 52 45 4e 54 20 52 4f 57 20 0a 20 20   CURRENT ROW .  
10480 2a 2a 20 20 20 52 4f 57 53 20 42 45 54 57 45 45  **   ROWS BETWEE
10490 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43  N UNBOUNDED PREC
104a0 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e  EDING AND CURREN
104b0 54 20 52 4f 57 0a 20 20 2a 2a 0a 20 20 2a 2a 20  T ROW.  **.  ** 
104c0 77 69 6e 64 6f 77 43 6f 64 65 44 65 66 61 75 6c  windowCodeDefaul
104d0 74 53 74 65 70 28 29 20 69 73 20 74 68 65 20 6f  tStep() is the o
104e0 6e 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 74  nly one of the t
104f0 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 20 74  hree functions t
10500 68 61 74 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f  hat.  ** does no
10510 74 20 63 61 63 68 65 20 65 61 63 68 20 70 61 72  t cache each par
10520 74 69 74 69 6f 6e 20 69 6e 20 61 20 74 65 6d 70  tition in a temp
10530 20 74 61 62 6c 65 20 62 65 66 6f 72 65 20 62 65   table before be
10540 67 69 6e 6e 69 6e 67 20 74 6f 0a 20 20 2a 2a 20  ginning to.  ** 
10550 72 65 74 75 72 6e 20 72 6f 77 73 2e 0a 20 20 2a  return rows..  *
10560 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65  /.  if( pMWin->e
10570 54 79 70 65 3d 3d 54 4b 5f 52 4f 57 53 20 0a 20  Type==TK_ROWS . 
10580 20 20 26 26 20 28 70 4d 57 69 6e 2d 3e 65 53 74    && (pMWin->eSt
10590 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  art!=TK_UNBOUNDE
105a0 44 7c 7c 70 4d 57 69 6e 2d 3e 65 45 6e 64 21 3d  D||pMWin->eEnd!=
105b0 54 4b 5f 43 55 52 52 45 4e 54 7c 7c 21 70 4d 57  TK_CURRENT||!pMW
105c0 69 6e 2d 3e 70 4f 72 64 65 72 42 79 29 0a 20 20  in->pOrderBy).  
105d0 29 7b 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f 64  ){.    windowCod
105e0 65 52 6f 77 45 78 70 72 53 74 65 70 28 70 50 61  eRowExprStep(pPa
105f0 72 73 65 2c 20 70 2c 20 70 57 49 6e 66 6f 2c 20  rse, p, pWInfo, 
10600 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f  regGosub, addrGo
10610 73 75 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  sub);.  }else{. 
10620 20 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b     Window *pWin;
10630 0a 20 20 20 20 69 6e 74 20 62 43 61 63 68 65 20  .    int bCache 
10640 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
10650 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73     /* True to us
10660 65 20 43 61 63 68 65 53 74 65 70 28 29 20 2a 2f  e CacheStep() */
10670 0a 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d  ..    if( pMWin-
10680 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52  >eStart==TK_CURR
10690 45 4e 54 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45  ENT && pMWin->eE
106a0 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  nd==TK_UNBOUNDED
106b0 20 29 7b 0a 20 20 20 20 20 20 62 43 61 63 68 65   ){.      bCache
106c0 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
106d0 0a 20 20 20 20 20 20 66 6f 72 28 70 57 69 6e 3d  .      for(pWin=
106e0 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69  pMWin; pWin; pWi
106f0 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e  n=pWin->pNextWin
10700 29 7b 0a 20 20 20 20 20 20 20 20 46 75 6e 63 44  ){.        FuncD
10710 65 66 20 2a 70 46 75 6e 63 20 3d 20 70 57 69 6e  ef *pFunc = pWin
10720 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 20  ->pFunc;.       
10730 20 69 66 28 20 28 70 46 75 6e 63 2d 3e 66 75 6e   if( (pFunc->fun
10740 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
10750 46 55 4e 43 5f 57 49 4e 44 4f 57 5f 53 49 5a 45  FUNC_WINDOW_SIZE
10760 29 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70  ).         || (p
10770 46 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 6e 74  Func->xSFunc==nt
10780 68 5f 76 61 6c 75 65 53 74 65 70 46 75 6e 63 29  h_valueStepFunc)
10790 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 46  .         || (pF
107a0 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 66 69 72  unc->xSFunc==fir
107b0 73 74 5f 76 61 6c 75 65 53 74 65 70 46 75 6e 63  st_valueStepFunc
107c0 29 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70  ).         || (p
107d0 46 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 6c 65  Func->xSFunc==le
107e0 61 64 53 74 65 70 46 75 6e 63 29 0a 20 20 20 20  adStepFunc).    
107f0 20 20 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d 3e       || (pFunc->
10800 78 53 46 75 6e 63 3d 3d 6c 61 67 53 74 65 70 46  xSFunc==lagStepF
10810 75 6e 63 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  unc).        ){.
10820 20 20 20 20 20 20 20 20 20 20 62 43 61 63 68 65            bCache
10830 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
10840 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
10850 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
10860 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65      /* Otherwise
10870 2c 20 63 61 6c 6c 20 77 69 6e 64 6f 77 43 6f 64  , call windowCod
10880 65 44 65 66 61 75 6c 74 53 74 65 70 28 29 2e 20  eDefaultStep(). 
10890 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 43 61 63   */.    if( bCac
108a0 68 65 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 64  he ){.      wind
108b0 6f 77 43 6f 64 65 43 61 63 68 65 53 74 65 70 28  owCodeCacheStep(
108c0 70 50 61 72 73 65 2c 20 70 2c 20 70 57 49 6e 66  pParse, p, pWInf
108d0 6f 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64  o, regGosub, add
108e0 72 47 6f 73 75 62 29 3b 0a 20 20 20 20 7d 65 6c  rGosub);.    }el
108f0 73 65 7b 0a 20 20 20 20 20 20 77 69 6e 64 6f 77  se{.      window
10900 43 6f 64 65 44 65 66 61 75 6c 74 53 74 65 70 28  CodeDefaultStep(
10910 70 50 61 72 73 65 2c 20 70 2c 20 70 57 49 6e 66  pParse, p, pWInf
10920 6f 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64  o, regGosub, add
10930 72 47 6f 73 75 62 29 3b 0a 20 20 20 20 7d 0a 20  rGosub);.    }. 
10940 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20   }.}..#endif /* 
10950 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44  SQLITE_OMIT_WIND
10960 4f 57 46 55 4e 43 20 2a 2f 0a                    OWFUNC */.