/ Hex Artifact Content
Login

Artifact 3c94dfffdfba99159cdd11bd972c7d7c0a23fa7e09135963e99e4d583e75e77f:


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 2f 2a 0a 2a  liteInt.h"../*.*
0190: 2a 20 53 45 4c 45 43 54 20 52 45 57 52 49 54 49  * SELECT REWRITI
01a0: 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 41 6e 79 20 53  NG.**.**   Any S
01b0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
01c0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  that contains on
01d0: 65 20 6f 72 20 6d 6f 72 65 20 77 69 6e 64 6f 77  e or more window
01e0: 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 0a 2a 2a   functions in.**
01f0: 20 20 20 65 69 74 68 65 72 20 74 68 65 20 73 65     either the se
0200: 6c 65 63 74 20 6c 69 73 74 20 6f 72 20 4f 52 44  lect list or ORD
0210: 45 52 20 42 59 20 63 6c 61 75 73 65 20 28 74 68  ER BY clause (th
0220: 65 20 6f 6e 6c 79 20 74 77 6f 20 70 6c 61 63 65  e only two place
0230: 73 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20 66 75  s window.**   fu
0240: 6e 63 74 69 6f 6e 73 20 6d 61 79 20 62 65 20 75  nctions may be u
0250: 73 65 64 29 20 69 73 20 74 72 61 6e 73 66 6f 72  sed) is transfor
0260: 6d 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20  med by function 
0270: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 52 65 77  sqlite3WindowRew
0280: 72 69 74 65 28 29 0a 2a 2a 20 20 20 69 6e 20 6f  rite().**   in o
0290: 72 64 65 72 20 74 6f 20 73 75 70 70 6f 72 74 20  rder to support 
02a0: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
02b0: 70 72 6f 63 65 73 73 69 6e 67 2e 20 46 6f 72 20  processing. For 
02c0: 65 78 61 6d 70 6c 65 2c 20 77 69 74 68 20 74 68  example, with th
02d0: 65 0a 2a 2a 20 20 20 73 63 68 65 6d 61 3a 0a 2a  e.**   schema:.*
02e0: 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20  *.**     CREATE 
02f0: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63  TABLE t1(a, b, c
0300: 2c 20 64 2c 20 65 2c 20 66 2c 20 67 29 3b 0a 2a  , d, e, f, g);.*
0310: 2a 0a 2a 2a 20 20 20 74 68 65 20 73 74 61 74 65  *.**   the state
0320: 6d 65 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment:.**.**     
0330: 53 45 4c 45 43 54 20 61 2b 31 2c 20 6d 61 78 28  SELECT a+1, max(
0340: 62 29 20 4f 56 45 52 20 28 50 41 52 54 49 54 49  b) OVER (PARTITI
0350: 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20 42 59  ON BY c ORDER BY
0360: 20 64 29 20 46 52 4f 4d 20 74 31 20 4f 52 44 45   d) FROM t1 ORDE
0370: 52 20 42 59 20 65 3b 0a 2a 2a 0a 2a 2a 20 20 20  R BY e;.**.**   
0380: 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74  is transformed t
0390: 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  o:.**.**     SEL
03a0: 45 43 54 20 61 2b 31 2c 20 6d 61 78 28 62 29 20  ECT a+1, max(b) 
03b0: 4f 56 45 52 20 28 50 41 52 54 49 54 49 4f 4e 20  OVER (PARTITION 
03c0: 42 59 20 63 20 4f 52 44 45 52 20 42 59 20 64 29  BY c ORDER BY d)
03d0: 20 46 52 4f 4d 20 28 0a 2a 2a 20 20 20 20 20 20   FROM (.**      
03e0: 20 20 20 53 45 4c 45 43 54 20 61 2c 20 65 2c 20     SELECT a, e, 
03f0: 63 2c 20 64 2c 20 62 20 46 52 4f 4d 20 74 31 20  c, d, b FROM t1 
0400: 4f 52 44 45 52 20 42 59 20 63 2c 20 64 0a 2a 2a  ORDER BY c, d.**
0410: 20 20 20 20 20 29 20 4f 52 44 45 52 20 42 59 20       ) ORDER BY 
0420: 65 3b 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66  e;.**.**   The f
0430: 6c 61 74 74 65 6e 69 6e 67 20 6f 70 74 69 6d 69  lattening optimi
0440: 7a 61 74 69 6f 6e 20 69 73 20 64 69 73 61 62 6c  zation is disabl
0450: 65 64 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69  ed when processi
0460: 6e 67 20 74 68 69 73 20 74 72 61 6e 73 66 6f 72  ng this transfor
0470: 6d 65 64 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  med.**   SELECT 
0480: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
0490: 61 6c 6c 6f 77 73 20 74 68 65 20 69 6d 70 6c 65  allows the imple
04a0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
04b0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
04c0: 0a 2a 2a 20 20 20 28 69 6e 20 74 68 69 73 20 63  .**   (in this c
04d0: 61 73 65 20 6d 61 78 28 29 29 20 74 6f 20 70 72  ase max()) to pr
04e0: 6f 63 65 73 73 20 72 6f 77 73 20 73 6f 72 74 65  ocess rows sorte
04f0: 64 20 69 6e 20 6f 72 64 65 72 20 6f 66 20 28 63  d in order of (c
0500: 2c 20 64 29 2c 20 77 68 69 63 68 0a 2a 2a 20 20  , d), which.**  
0510: 20 6d 61 6b 65 73 20 74 68 69 6e 67 73 20 65 61   makes things ea
0520: 73 69 65 72 20 66 6f 72 20 6f 62 76 69 6f 75 73  sier for obvious
0530: 20 72 65 61 73 6f 6e 73 2e 20 4d 6f 72 65 20 67   reasons. More g
0540: 65 6e 65 72 61 6c 6c 79 3a 0a 2a 2a 0a 2a 2a 20  enerally:.**.** 
0550: 20 20 20 20 2a 20 46 52 4f 4d 2c 20 57 48 45 52      * FROM, WHER
0560: 45 2c 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20  E, GROUP BY and 
0570: 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73 20 61  HAVING clauses a
0580: 72 65 20 61 6c 6c 20 6d 6f 76 65 64 20 74 6f 20  re all moved to 
0590: 0a 2a 2a 20 20 20 20 20 20 20 74 68 65 20 73 75  .**       the su
05a0: 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  b-query..**.**  
05b0: 20 20 20 2a 20 4f 52 44 45 52 20 42 59 2c 20 4c     * ORDER BY, L
05c0: 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
05d0: 72 65 6d 61 69 6e 20 70 61 72 74 20 6f 66 20 74  remain part of t
05e0: 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 2e  he parent query.
05f0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 65 72  .**.**     * Ter
0600: 6d 69 6e 61 6c 73 20 66 72 6f 6d 20 65 61 63 68  minals from each
0610: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
0620: 6f 6e 20 74 72 65 65 73 20 74 68 61 74 20 6d 61  on trees that ma
0630: 6b 65 20 75 70 20 74 68 65 20 0a 2a 2a 20 20 20  ke up the .**   
0640: 20 20 20 20 73 65 6c 65 63 74 2d 6c 69 73 74 20      select-list 
0650: 61 6e 64 20 4f 52 44 45 52 20 42 59 20 65 78 70  and ORDER BY exp
0660: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20  ressions in the 
0670: 70 61 72 65 6e 74 20 71 75 65 72 79 20 61 72 65  parent query are
0680: 0a 2a 2a 20 20 20 20 20 20 20 73 65 6c 65 63 74  .**       select
0690: 65 64 20 62 79 20 74 68 65 20 73 75 62 2d 71 75  ed by the sub-qu
06a0: 65 72 79 2e 20 46 6f 72 20 74 68 65 20 70 75 72  ery. For the pur
06b0: 70 6f 73 65 73 20 6f 66 20 74 68 65 20 74 72 61  poses of the tra
06c0: 6e 73 66 6f 72 6d 61 74 69 6f 6e 2c 0a 2a 2a 20  nsformation,.** 
06d0: 20 20 20 20 20 20 74 65 72 6d 69 6e 61 6c 73 20        terminals 
06e0: 61 72 65 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72  are column refer
06f0: 65 6e 63 65 73 20 61 6e 64 20 61 67 67 72 65 67  ences and aggreg
0700: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  ate functions..*
0710: 2a 0a 2a 2a 20 20 20 49 66 20 74 68 65 72 65 20  *.**   If there 
0720: 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  is more than one
0730: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
0740: 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 74   in the SELECT t
0750: 68 61 74 20 75 73 65 73 0a 2a 2a 20 20 20 74 68  hat uses.**   th
0760: 65 20 73 61 6d 65 20 77 69 6e 64 6f 77 20 64 65  e same window de
0770: 63 6c 61 72 61 74 69 6f 6e 20 28 74 68 65 20 4f  claration (the O
0780: 56 45 52 20 62 69 74 29 2c 20 74 68 65 6e 20 61  VER bit), then a
0790: 20 73 69 6e 67 6c 65 20 73 63 61 6e 20 6d 61 79   single scan may
07a0: 0a 2a 2a 20 20 20 62 65 20 75 73 65 64 20 74 6f  .**   be used to
07b0: 20 70 72 6f 63 65 73 73 20 6d 6f 72 65 20 74 68   process more th
07c0: 61 6e 20 6f 6e 65 20 77 69 6e 64 6f 77 20 66 75  an one window fu
07d0: 6e 63 74 69 6f 6e 2e 20 46 6f 72 20 65 78 61 6d  nction. For exam
07e0: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ple:.**.**     S
07f0: 45 4c 45 43 54 20 6d 61 78 28 62 29 20 4f 56 45  ELECT max(b) OVE
0800: 52 20 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20  R (PARTITION BY 
0810: 63 20 4f 52 44 45 52 20 42 59 20 64 29 2c 20 0a  c ORDER BY d), .
0820: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 6d 69  **            mi
0830: 6e 28 65 29 20 4f 56 45 52 20 28 50 41 52 54 49  n(e) OVER (PARTI
0840: 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20  TION BY c ORDER 
0850: 42 59 20 64 29 20 0a 2a 2a 20 20 20 20 20 46 52  BY d) .**     FR
0860: 4f 4d 20 74 31 3b 0a 2a 2a 0a 2a 2a 20 20 20 69  OM t1;.**.**   i
0870: 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  s transformed in
0880: 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73   the same way as
0890: 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f   the example abo
08a0: 76 65 2e 20 48 6f 77 65 76 65 72 3a 0a 2a 2a 0a  ve. However:.**.
08b0: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 6d 61  **     SELECT ma
08c0: 78 28 62 29 20 4f 56 45 52 20 28 50 41 52 54 49  x(b) OVER (PARTI
08d0: 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20  TION BY c ORDER 
08e0: 42 59 20 64 29 2c 20 0a 2a 2a 20 20 20 20 20 20  BY d), .**      
08f0: 20 20 20 20 20 20 6d 69 6e 28 65 29 20 4f 56 45        min(e) OVE
0900: 52 20 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20  R (PARTITION BY 
0910: 61 20 4f 52 44 45 52 20 42 59 20 62 29 20 0a 2a  a ORDER BY b) .*
0920: 2a 20 20 20 20 20 46 52 4f 4d 20 74 31 3b 0a 2a  *     FROM t1;.*
0930: 2a 0a 2a 2a 20 20 20 4d 75 73 74 20 62 65 20 74  *.**   Must be t
0940: 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 2a  ransformed to:.*
0950: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
0960: 6d 61 78 28 62 29 20 4f 56 45 52 20 28 50 41 52  max(b) OVER (PAR
0970: 54 49 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45  TITION BY c ORDE
0980: 52 20 42 59 20 64 29 20 46 52 4f 4d 20 28 0a 2a  R BY d) FROM (.*
0990: 2a 20 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  *         SELECT
09a0: 20 65 2c 20 6d 69 6e 28 65 29 20 4f 56 45 52 20   e, min(e) OVER 
09b0: 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20 61 20  (PARTITION BY a 
09c0: 4f 52 44 45 52 20 42 59 20 62 29 2c 20 63 2c 20  ORDER BY b), c, 
09d0: 64 2c 20 62 20 46 52 4f 4d 0a 2a 2a 20 20 20 20  d, b FROM.**    
09e0: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 2c         SELECT a,
09f0: 20 65 2c 20 63 2c 20 64 2c 20 62 20 46 52 4f 4d   e, c, d, b FROM
0a00: 20 74 31 20 4f 52 44 45 52 20 42 59 20 61 2c 20   t1 ORDER BY a, 
0a10: 62 0a 2a 2a 20 20 20 20 20 20 20 20 20 29 20 4f  b.**         ) O
0a20: 52 44 45 52 20 42 59 20 63 2c 20 64 0a 2a 2a 20  RDER BY c, d.** 
0a30: 20 20 20 20 29 20 4f 52 44 45 52 20 42 59 20 65      ) ORDER BY e
0a40: 3b 0a 2a 2a 0a 2a 2a 20 20 20 73 6f 20 74 68 61  ;.**.**   so tha
0a50: 74 20 62 6f 74 68 20 6d 69 6e 28 29 20 61 6e 64  t both min() and
0a60: 20 6d 61 78 28 29 20 6d 61 79 20 70 72 6f 63 65   max() may proce
0a70: 73 73 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6f  ss rows in the o
0a80: 72 64 65 72 20 64 65 66 69 6e 65 64 20 62 79 0a  rder defined by.
0a90: 2a 2a 20 20 20 74 68 65 69 72 20 72 65 73 70 65  **   their respe
0aa0: 63 74 69 76 65 20 77 69 6e 64 6f 77 20 64 65 63  ctive window dec
0ab0: 6c 61 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  larations..**.**
0ac0: 20 49 4e 54 45 52 46 41 43 45 20 57 49 54 48 20   INTERFACE WITH 
0ad0: 53 45 4c 45 43 54 2e 43 0a 2a 2a 0a 2a 2a 20 20  SELECT.C.**.**  
0ae0: 20 57 68 65 6e 20 70 72 6f 63 65 73 73 69 6e 67   When processing
0af0: 20 74 68 65 20 72 65 77 72 69 74 74 65 6e 20 53   the rewritten S
0b00: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
0b10: 20 63 6f 64 65 20 69 6e 20 73 65 6c 65 63 74 2e   code in select.
0b20: 63 20 63 61 6c 6c 73 0a 2a 2a 20 20 20 73 71 6c  c calls.**   sql
0b30: 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
0b40: 20 74 6f 20 62 65 67 69 6e 20 69 74 65 72 61 74   to begin iterat
0b50: 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68 65 20  ing through the 
0b60: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 0a 2a  results of the.*
0b70: 2a 20 20 20 73 75 62 2d 71 75 65 72 79 2c 20 77  *   sub-query, w
0b80: 68 69 63 68 20 69 73 20 61 6c 77 61 79 73 20 69  hich is always i
0b90: 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
0ba0: 63 6f 2d 72 6f 75 74 69 6e 65 2e 20 49 74 20 74  co-routine. It t
0bb0: 68 65 6e 20 63 61 6c 6c 73 0a 2a 2a 20 20 20 73  hen calls.**   s
0bc0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65  qlite3WindowCode
0bd0: 53 74 65 70 28 29 20 74 6f 20 70 72 6f 63 65 73  Step() to proces
0be0: 73 20 72 6f 77 73 20 61 6e 64 20 66 69 6e 69 73  s rows and finis
0bf0: 68 20 74 68 65 20 73 63 61 6e 20 62 79 20 63 61  h the scan by ca
0c00: 6c 6c 69 6e 67 0a 2a 2a 20 20 20 73 71 6c 69 74  lling.**   sqlit
0c10: 65 33 57 68 65 72 65 45 6e 64 28 29 2e 0a 2a 2a  e3WhereEnd()..**
0c20: 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 57 69 6e  .**   sqlite3Win
0c30: 64 6f 77 43 6f 64 65 53 74 65 70 28 29 20 67 65  dowCodeStep() ge
0c40: 6e 65 72 61 74 65 73 20 56 4d 20 63 6f 64 65 20  nerates VM code 
0c50: 73 6f 20 74 68 61 74 2c 20 66 6f 72 20 65 61 63  so that, for eac
0c60: 68 20 72 6f 77 20 72 65 74 75 72 6e 65 64 0a 2a  h row returned.*
0c70: 2a 20 20 20 62 79 20 74 68 65 20 73 75 62 2d 71  *   by the sub-q
0c80: 75 65 72 79 20 61 20 73 75 62 2d 72 6f 75 74 69  uery a sub-routi
0c90: 6e 65 20 28 4f 50 5f 47 6f 73 75 62 29 20 63 6f  ne (OP_Gosub) co
0ca0: 64 65 64 20 62 79 20 73 65 6c 65 63 74 2e 63 20  ded by select.c 
0cb0: 69 73 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2a 20 20  is invoked..**  
0cc0: 20 57 68 65 6e 20 74 68 65 20 73 75 62 2d 72 6f   When the sub-ro
0cd0: 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64  utine is invoked
0ce0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 68  :.**.**     * Th
0cf0: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 61 6c 6c  e results of all
0d00: 20 77 69 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e   window-function
0d10: 73 20 66 6f 72 20 74 68 65 20 72 6f 77 20 61 72  s for the row ar
0d20: 65 20 73 74 6f 72 65 64 0a 2a 2a 20 20 20 20 20  e stored.**     
0d30: 20 20 69 6e 20 74 68 65 20 61 73 73 6f 63 69 61    in the associa
0d40: 74 65 64 20 57 69 6e 64 6f 77 2e 72 65 67 52 65  ted Window.regRe
0d50: 73 75 6c 74 20 72 65 67 69 73 74 65 72 73 2e 0a  sult registers..
0d60: 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 68 65 20  **.**     * The 
0d70: 72 65 71 75 69 72 65 64 20 74 65 72 6d 69 6e 61  required termina
0d80: 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f  l values are sto
0d90: 72 65 64 20 69 6e 20 74 68 65 20 63 75 72 72 65  red in the curre
0da0: 6e 74 20 72 6f 77 20 6f 66 0a 2a 2a 20 20 20 20  nt row of.**    
0db0: 20 20 20 74 65 6d 70 20 74 61 62 6c 65 20 57 69     temp table Wi
0dc0: 6e 64 6f 77 2e 69 45 70 68 43 73 72 2e 0a 2a 2a  ndow.iEphCsr..**
0dd0: 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 63 61  .**   In some ca
0de0: 73 65 73 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  ses, depending o
0df0: 6e 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61  n the window fra
0e00: 6d 65 20 61 6e 64 20 74 68 65 20 73 70 65 63 69  me and the speci
0e10: 66 69 63 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20  fic window.**   
0e20: 66 75 6e 63 74 69 6f 6e 73 20 69 6e 76 6f 6b 65  functions invoke
0e30: 64 2c 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  d, sqlite3Window
0e40: 43 6f 64 65 53 74 65 70 28 29 20 63 61 63 68 65  CodeStep() cache
0e50: 73 20 65 61 63 68 20 65 6e 74 69 72 65 20 70 61  s each entire pa
0e60: 72 74 69 74 69 6f 6e 0a 2a 2a 20 20 20 69 6e 20  rtition.**   in 
0e70: 61 20 74 65 6d 70 20 74 61 62 6c 65 20 62 65 66  a temp table bef
0e80: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 61 6e  ore returning an
0e90: 79 20 72 6f 77 73 2e 20 49 6e 20 6f 74 68 65 72  y rows. In other
0ea0: 20 63 61 73 65 73 20 69 74 20 64 6f 65 73 20 6e   cases it does n
0eb0: 6f 74 2e 0a 2a 2a 20 20 20 54 68 69 73 20 64 65  ot..**   This de
0ec0: 74 61 69 6c 20 69 73 20 65 6e 63 61 70 73 75 6c  tail is encapsul
0ed0: 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 69 73  ated within this
0ee0: 20 66 69 6c 65 2c 20 74 68 65 20 63 6f 64 65 20   file, the code 
0ef0: 67 65 6e 65 72 61 74 65 64 20 62 79 0a 2a 2a 20  generated by.** 
0f00: 20 20 73 65 6c 65 63 74 2e 63 20 69 73 20 74 68    select.c is th
0f10: 65 20 73 61 6d 65 20 69 6e 20 65 69 74 68 65 72  e same in either
0f20: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 55 49   case..**.** BUI
0f30: 4c 54 2d 49 4e 20 57 49 4e 44 4f 57 20 46 55 4e  LT-IN WINDOW FUN
0f40: 43 54 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 54  CTIONS.**.**   T
0f50: 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  his implementati
0f60: 6f 6e 20 66 65 61 74 75 72 65 73 20 74 68 65 20  on features the 
0f70: 66 6f 6c 6c 6f 77 69 6e 67 20 62 75 69 6c 74 2d  following built-
0f80: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
0f90: 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72  ons:.**.**     r
0fa0: 6f 77 5f 6e 75 6d 62 65 72 28 29 0a 2a 2a 20 20  ow_number().**  
0fb0: 20 20 20 72 61 6e 6b 28 29 0a 2a 2a 20 20 20 20     rank().**    
0fc0: 20 64 65 6e 73 65 5f 72 61 6e 6b 28 29 0a 2a 2a   dense_rank().**
0fd0: 20 20 20 20 20 70 65 72 63 65 6e 74 5f 72 61 6e       percent_ran
0fe0: 6b 28 29 0a 2a 2a 20 20 20 20 20 63 75 6d 65 5f  k().**     cume_
0ff0: 64 69 73 74 28 29 0a 2a 2a 20 20 20 20 20 6e 74  dist().**     nt
1000: 69 6c 65 28 4e 29 0a 2a 2a 20 20 20 20 20 6c 65  ile(N).**     le
1010: 61 64 28 65 78 70 72 20 5b 2c 20 6f 66 66 73 65  ad(expr [, offse
1020: 74 20 5b 2c 20 64 65 66 61 75 6c 74 5d 5d 29 0a  t [, default]]).
1030: 2a 2a 20 20 20 20 20 6c 61 67 28 65 78 70 72 20  **     lag(expr 
1040: 5b 2c 20 6f 66 66 73 65 74 20 5b 2c 20 64 65 66  [, offset [, def
1050: 61 75 6c 74 5d 5d 29 0a 2a 2a 20 20 20 20 20 66  ault]]).**     f
1060: 69 72 73 74 5f 76 61 6c 75 65 28 65 78 70 72 29  irst_value(expr)
1070: 0a 2a 2a 20 20 20 20 20 6c 61 73 74 5f 76 61 6c  .**     last_val
1080: 75 65 28 65 78 70 72 29 0a 2a 2a 20 20 20 20 20  ue(expr).**     
1090: 6e 74 68 5f 76 61 6c 75 65 28 65 78 70 72 2c 20  nth_value(expr, 
10a0: 4e 29 0a 2a 2a 20 20 20 0a 2a 2a 20 20 20 54 68  N).**   .**   Th
10b0: 65 73 65 20 61 72 65 20 74 68 65 20 73 61 6d 65  ese are the same
10c0: 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77   built-in window
10d0: 20 66 75 6e 63 74 69 6f 6e 73 20 73 75 70 70 6f   functions suppo
10e0: 72 74 65 64 20 62 79 20 50 6f 73 74 67 72 65 73  rted by Postgres
10f0: 2e 20 0a 2a 2a 20 20 20 41 6c 74 68 6f 75 67 68  . .**   Although
1100: 20 74 68 65 20 62 65 68 61 76 69 6f 75 72 20 6f   the behaviour o
1110: 66 20 61 67 67 72 65 67 61 74 65 20 77 69 6e 64  f aggregate wind
1120: 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 28 66 75  ow functions (fu
1130: 6e 63 74 69 6f 6e 73 20 74 68 61 74 0a 2a 2a 20  nctions that.** 
1140: 20 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 73    can be used as
1150: 20 65 69 74 68 65 72 20 61 67 67 72 65 67 61 74   either aggregat
1160: 65 73 20 6f 72 20 77 69 6e 64 6f 77 20 66 75 6e  es or window fun
1170: 74 69 6f 6e 73 29 20 61 6c 6c 6f 77 73 20 74 68  tions) allows th
1180: 65 6d 20 74 6f 0a 2a 2a 20 20 20 62 65 20 69 6d  em to.**   be im
1190: 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20  plemented using 
11a0: 61 6e 20 41 50 49 2c 20 62 75 69 6c 74 2d 69 6e  an API, built-in
11b0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
11c0: 73 20 61 72 65 20 6d 75 63 68 20 6d 6f 72 65 0a  s are much more.
11d0: 2a 2a 20 20 20 65 73 6f 74 65 72 69 63 2e 20 41  **   esoteric. A
11e0: 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 73 6f 6d  dditionally, som
11f0: 65 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  e window functio
1200: 6e 73 20 28 65 2e 67 2e 20 6e 74 68 5f 76 61 6c  ns (e.g. nth_val
1210: 75 65 28 29 29 20 0a 2a 2a 20 20 20 6d 61 79 20  ue()) .**   may 
1220: 6f 6e 6c 79 20 62 65 20 69 6d 70 6c 65 6d 65 6e  only be implemen
1230: 74 65 64 20 62 79 20 63 61 63 68 69 6e 67 20 74  ted by caching t
1240: 68 65 20 65 6e 74 69 72 65 20 70 61 72 74 69 74  he entire partit
1250: 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a  ion in memory..*
1260: 2a 20 20 20 41 73 20 73 75 63 68 2c 20 73 6f 6d  *   As such, som
1270: 65 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  e built-in windo
1280: 77 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 20  w functions use 
1290: 74 68 65 20 73 61 6d 65 20 41 50 49 20 61 73 20  the same API as 
12a0: 61 67 67 72 65 67 61 74 65 0a 2a 2a 20 20 20 77  aggregate.**   w
12b0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
12c0: 61 6e 64 20 73 6f 6d 65 20 61 72 65 20 69 6d 70  and some are imp
12d0: 6c 65 6d 65 6e 74 65 64 20 64 69 72 65 63 74 6c  lemented directl
12e0: 79 20 75 73 69 6e 67 20 56 44 42 45 20 0a 2a 2a  y using VDBE .**
12f0: 20 20 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e     instructions.
1300: 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 66   Additionally, f
1310: 6f 72 20 74 68 6f 73 65 20 66 75 6e 63 74 69 6f  or those functio
1320: 6e 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20  ns that use the 
1330: 41 50 49 2c 20 74 68 65 0a 2a 2a 20 20 20 77 69  API, the.**   wi
1340: 6e 64 6f 77 20 66 72 61 6d 65 20 69 73 20 73 6f  ndow frame is so
1350: 6d 65 74 69 6d 65 73 20 6d 6f 64 69 66 69 65 64  metimes modified
1360: 20 62 65 66 6f 72 65 20 74 68 65 20 53 45 4c 45   before the SELE
1370: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a  CT statement is.
1380: 2a 2a 20 20 20 72 65 77 72 69 74 74 65 6e 2e 20  **   rewritten. 
1390: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 72 65 67  For example, reg
13a0: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 73  ardless of the s
13b0: 70 65 63 69 66 69 65 64 20 77 69 6e 64 6f 77 20  pecified window 
13c0: 66 72 61 6d 65 2c 20 74 68 65 0a 2a 2a 20 20 20  frame, the.**   
13d0: 72 6f 77 5f 6e 75 6d 62 65 72 28 29 20 66 75 6e  row_number() fun
13e0: 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 75 73 65  ction always use
13f0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 4f 57  s:.**.**     ROW
1400: 53 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e  S BETWEEN UNBOUN
1410: 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e  DED PRECEDING AN
1420: 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a  D CURRENT ROW.**
1430: 0a 2a 2a 20 20 20 53 65 65 20 73 71 6c 69 74 65  .**   See sqlite
1440: 33 57 69 6e 64 6f 77 55 70 64 61 74 65 28 29 20  3WindowUpdate() 
1450: 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  for details..**.
1460: 2a 2a 20 20 20 41 73 20 77 65 6c 6c 20 61 73 20  **   As well as 
1470: 73 6f 6d 65 20 6f 66 20 74 68 65 20 62 75 69 6c  some of the buil
1480: 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63  t-in window func
1490: 74 69 6f 6e 73 2c 20 61 67 67 72 65 67 61 74 65  tions, aggregate
14a0: 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20 66 75 6e   window.**   fun
14b0: 63 74 69 6f 6e 73 20 6d 69 6e 28 29 20 61 6e 64  ctions min() and
14c0: 20 6d 61 78 28 29 20 61 72 65 20 69 6d 70 6c 65   max() are imple
14d0: 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 56 44 42  mented using VDB
14e0: 45 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 69  E instructions i
14f0: 66 0a 2a 2a 20 20 20 74 68 65 20 73 74 61 72 74  f.**   the start
1500: 20 6f 66 20 74 68 65 20 77 69 6e 64 6f 77 20 66   of the window f
1510: 72 61 6d 65 20 69 73 20 64 65 63 6c 61 72 65 64  rame is declared
1520: 20 61 73 20 61 6e 79 74 68 69 6e 67 20 6f 74 68   as anything oth
1530: 65 72 20 74 68 61 6e 20 0a 2a 2a 20 20 20 55 4e  er than .**   UN
1540: 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e  BOUNDED PRECEDIN
1550: 47 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  G..*/../*.** Imp
1560: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 62  lementation of b
1570: 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66  uilt-in window f
1580: 75 6e 63 74 69 6f 6e 20 72 6f 77 5f 6e 75 6d 62  unction row_numb
1590: 65 72 28 29 2e 20 41 73 73 75 6d 65 73 20 74 68  er(). Assumes th
15a0: 61 74 20 74 68 65 0a 2a 2a 20 77 69 6e 64 6f 77  at the.** window
15b0: 20 66 72 61 6d 65 20 68 61 73 20 62 65 65 6e 20   frame has been 
15c0: 63 6f 65 72 63 65 64 20 74 6f 3a 0a 2a 2a 0a 2a  coerced to:.**.*
15d0: 2a 20 20 20 52 4f 57 53 20 42 45 54 57 45 45 4e  *   ROWS BETWEEN
15e0: 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45   UNBOUNDED PRECE
15f0: 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54  DING AND CURRENT
1600: 20 52 4f 57 0a 2a 2f 0a 73 74 61 74 69 63 20 76   ROW.*/.static v
1610: 6f 69 64 20 72 6f 77 5f 6e 75 6d 62 65 72 53 74  oid row_numberSt
1620: 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  epFunc(.  sqlite
1630: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
1640: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
1650: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
1660: 61 70 41 72 67 0a 29 7b 0a 20 20 69 36 34 20 2a  apArg.){.  i64 *
1670: 70 20 3d 20 28 69 36 34 2a 29 73 71 6c 69 74 65  p = (i64*)sqlite
1680: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
1690: 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66  ext(pCtx, sizeof
16a0: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29  (*p));.  if( p )
16b0: 20 28 2a 70 29 2b 2b 3b 0a 7d 0a 73 74 61 74 69   (*p)++;.}.stati
16c0: 63 20 76 6f 69 64 20 72 6f 77 5f 6e 75 6d 62 65  c void row_numbe
16d0: 72 49 6e 76 46 75 6e 63 28 0a 20 20 73 71 6c 69  rInvFunc(.  sqli
16e0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
16f0: 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  x, .  int nArg,.
1700: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
1710: 2a 2a 61 70 41 72 67 0a 29 7b 0a 7d 0a 73 74 61  **apArg.){.}.sta
1720: 74 69 63 20 76 6f 69 64 20 72 6f 77 5f 6e 75 6d  tic void row_num
1730: 62 65 72 56 61 6c 75 65 46 75 6e 63 28 73 71 6c  berValueFunc(sql
1740: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
1750: 74 78 29 7b 0a 20 20 69 36 34 20 2a 70 20 3d 20  tx){.  i64 *p = 
1760: 28 69 36 34 2a 29 73 71 6c 69 74 65 33 5f 61 67  (i64*)sqlite3_ag
1770: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
1780: 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29  pCtx, sizeof(*p)
1790: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
17a0: 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20  ult_int64(pCtx, 
17b0: 28 70 20 3f 20 2a 70 20 3a 20 30 29 29 3b 0a 7d  (p ? *p : 0));.}
17c0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65 78 74 20  ../*.** Context 
17d0: 6f 62 6a 65 63 74 20 74 79 70 65 20 75 73 65 64  object type used
17e0: 20 62 79 20 72 61 6e 6b 28 29 2c 20 64 65 6e 73   by rank(), dens
17f0: 65 5f 72 61 6e 6b 28 29 2c 20 70 65 72 63 65 6e  e_rank(), percen
1800: 74 5f 72 61 6e 6b 28 29 20 61 6e 64 0a 2a 2a 20  t_rank() and.** 
1810: 63 75 6d 65 5f 64 69 73 74 28 29 2e 0a 2a 2f 0a  cume_dist()..*/.
1820: 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74  struct CallCount
1830: 20 7b 0a 20 20 69 36 34 20 6e 56 61 6c 75 65 3b   {.  i64 nValue;
1840: 0a 20 20 69 36 34 20 6e 53 74 65 70 3b 0a 20 20  .  i64 nStep;.  
1850: 69 36 34 20 6e 54 6f 74 61 6c 3b 0a 7d 3b 0a 0a  i64 nTotal;.};..
1860: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
1870: 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74 2d 69 6e  tion of built-in
1880: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
1890: 20 64 65 6e 73 65 5f 72 61 6e 6b 28 29 2e 0a 2a   dense_rank()..*
18a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65  /.static void de
18b0: 6e 73 65 5f 72 61 6e 6b 53 74 65 70 46 75 6e 63  nse_rankStepFunc
18c0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
18d0: 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e  ext *pCtx, .  in
18e0: 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65  t nArg,.  sqlite
18f0: 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a  3_value **apArg.
1900: 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61 6c 6c  ){.  struct Call
1910: 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70 20 3d 20  Count *p;.  p = 
1920: 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e  (struct CallCoun
1930: 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65  t*)sqlite3_aggre
1940: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74  gate_context(pCt
1950: 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  x, sizeof(*p));.
1960: 20 20 69 66 28 20 70 20 29 20 70 2d 3e 6e 53 74    if( p ) p->nSt
1970: 65 70 20 3d 20 31 3b 0a 7d 0a 73 74 61 74 69 63  ep = 1;.}.static
1980: 20 76 6f 69 64 20 64 65 6e 73 65 5f 72 61 6e 6b   void dense_rank
1990: 49 6e 76 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  InvFunc(.  sqlit
19a0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
19b0: 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  , .  int nArg,. 
19c0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
19d0: 2a 61 70 41 72 67 0a 29 7b 0a 7d 0a 73 74 61 74  *apArg.){.}.stat
19e0: 69 63 20 76 6f 69 64 20 64 65 6e 73 65 5f 72 61  ic void dense_ra
19f0: 6e 6b 56 61 6c 75 65 46 75 6e 63 28 73 71 6c 69  nkValueFunc(sqli
1a00: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
1a10: 78 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61 6c  x){.  struct Cal
1a20: 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70 20 3d  lCount *p;.  p =
1a30: 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75   (struct CallCou
1a40: 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72  nt*)sqlite3_aggr
1a50: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43  egate_context(pC
1a60: 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b  tx, sizeof(*p));
1a70: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
1a80: 69 66 28 20 70 2d 3e 6e 53 74 65 70 20 29 7b 0a  if( p->nStep ){.
1a90: 20 20 20 20 20 20 70 2d 3e 6e 56 61 6c 75 65 2b        p->nValue+
1aa0: 2b 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 74 65  +;.      p->nSte
1ab0: 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  p = 0;.    }.   
1ac0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1ad0: 69 6e 74 36 34 28 70 43 74 78 2c 20 70 2d 3e 6e  int64(pCtx, p->n
1ae0: 56 61 6c 75 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Value);.  }.}../
1af0: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
1b00: 69 6f 6e 20 6f 66 20 62 75 69 6c 74 2d 69 6e 20  ion of built-in 
1b10: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
1b20: 72 61 6e 6b 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  rank()..*/.stati
1b30: 63 20 76 6f 69 64 20 72 61 6e 6b 53 74 65 70 46  c void rankStepF
1b40: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
1b50: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
1b60: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
1b70: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41  ite3_value **apA
1b80: 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 43  rg.){.  struct C
1b90: 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70  allCount *p;.  p
1ba0: 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43   = (struct CallC
1bb0: 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67  ount*)sqlite3_ag
1bc0: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
1bd0: 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29  pCtx, sizeof(*p)
1be0: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
1bf0: 20 20 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 20 20    p->nStep++;.  
1c00: 20 20 69 66 28 20 70 2d 3e 6e 56 61 6c 75 65 3d    if( p->nValue=
1c10: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  =0 ){.      p->n
1c20: 56 61 6c 75 65 20 3d 20 70 2d 3e 6e 53 74 65 70  Value = p->nStep
1c30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74  ;.    }.  }.}.st
1c40: 61 74 69 63 20 76 6f 69 64 20 72 61 6e 6b 49 6e  atic void rankIn
1c50: 76 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  vFunc(.  sqlite3
1c60: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20  _context *pCtx, 
1c70: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73  .  int nArg,.  s
1c80: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
1c90: 70 41 72 67 0a 29 7b 0a 7d 0a 73 74 61 74 69 63  pArg.){.}.static
1ca0: 20 76 6f 69 64 20 72 61 6e 6b 56 61 6c 75 65 46   void rankValueF
1cb0: 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
1cc0: 65 78 74 20 2a 70 43 74 78 29 7b 0a 20 20 73 74  ext *pCtx){.  st
1cd0: 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 20 2a  ruct CallCount *
1ce0: 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74  p;.  p = (struct
1cf0: 20 43 61 6c 6c 43 6f 75 6e 74 2a 29 73 71 6c 69   CallCount*)sqli
1d00: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
1d10: 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65  ntext(pCtx, size
1d20: 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70  of(*p));.  if( p
1d30: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1d40: 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74  result_int64(pCt
1d50: 78 2c 20 70 2d 3e 6e 56 61 6c 75 65 29 3b 0a 20  x, p->nValue);. 
1d60: 20 20 20 70 2d 3e 6e 56 61 6c 75 65 20 3d 20 30     p->nValue = 0
1d70: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
1d80: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
1d90: 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77   built-in window
1da0: 20 66 75 6e 63 74 69 6f 6e 20 70 65 72 63 65 6e   function percen
1db0: 74 5f 72 61 6e 6b 28 29 2e 0a 2a 2f 0a 73 74 61  t_rank()..*/.sta
1dc0: 74 69 63 20 76 6f 69 64 20 70 65 72 63 65 6e 74  tic void percent
1dd0: 5f 72 61 6e 6b 53 74 65 70 46 75 6e 63 28 0a 20  _rankStepFunc(. 
1de0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
1df0: 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
1e00: 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
1e10: 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a  alue **apArg.){.
1e20: 20 20 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75    struct CallCou
1e30: 6e 74 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  nt *p;.  assert(
1e40: 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 0a 20 20 70   nArg==1 );..  p
1e50: 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43   = (struct CallC
1e60: 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67  ount*)sqlite3_ag
1e70: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
1e80: 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29  pCtx, sizeof(*p)
1e90: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
1ea0: 20 20 69 66 28 20 70 2d 3e 6e 54 6f 74 61 6c 3d    if( p->nTotal=
1eb0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  =0 ){.      p->n
1ec0: 54 6f 74 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f  Total = sqlite3_
1ed0: 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 70 41 72  value_int64(apAr
1ee0: 67 5b 30 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  g[0]);.    }.   
1ef0: 20 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 20 20 20   p->nStep++;.   
1f00: 20 69 66 28 20 70 2d 3e 6e 56 61 6c 75 65 3d 3d   if( p->nValue==
1f10: 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 56  0 ){.      p->nV
1f20: 61 6c 75 65 20 3d 20 70 2d 3e 6e 53 74 65 70 3b  alue = p->nStep;
1f30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61  .    }.  }.}.sta
1f40: 74 69 63 20 76 6f 69 64 20 70 65 72 63 65 6e 74  tic void percent
1f50: 5f 72 61 6e 6b 49 6e 76 46 75 6e 63 28 0a 20 20  _rankInvFunc(.  
1f60: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1f70: 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41  *pCtx, .  int nA
1f80: 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  rg,.  sqlite3_va
1f90: 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 7d  lue **apArg.){.}
1fa0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 65 72  .static void per
1fb0: 63 65 6e 74 5f 72 61 6e 6b 56 61 6c 75 65 46 75  cent_rankValueFu
1fc0: 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  nc(sqlite3_conte
1fd0: 78 74 20 2a 70 43 74 78 29 7b 0a 20 20 73 74 72  xt *pCtx){.  str
1fe0: 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 20 2a 70  uct CallCount *p
1ff0: 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74 20  ;.  p = (struct 
2000: 43 61 6c 6c 43 6f 75 6e 74 2a 29 73 71 6c 69 74  CallCount*)sqlit
2010: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
2020: 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f  text(pCtx, sizeo
2030: 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20  f(*p));.  if( p 
2040: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 54  ){.    if( p->nT
2050: 6f 74 61 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20  otal>1 ){.      
2060: 64 6f 75 62 6c 65 20 72 20 3d 20 28 64 6f 75 62  double r = (doub
2070: 6c 65 29 28 70 2d 3e 6e 56 61 6c 75 65 2d 31 29  le)(p->nValue-1)
2080: 20 2f 20 28 64 6f 75 62 6c 65 29 28 70 2d 3e 6e   / (double)(p->n
2090: 54 6f 74 61 6c 2d 31 29 3b 0a 20 20 20 20 20 20  Total-1);.      
20a0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64  sqlite3_result_d
20b0: 6f 75 62 6c 65 28 70 43 74 78 2c 20 72 29 3b 0a  ouble(pCtx, r);.
20c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20d0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
20e0: 64 6f 75 62 6c 65 28 70 43 74 78 2c 20 31 30 30  double(pCtx, 100
20f0: 2e 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  .0);.    }.    p
2100: 2d 3e 6e 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20  ->nValue = 0;.  
2110: 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
2120: 20 63 75 6d 65 5f 64 69 73 74 53 74 65 70 46 75   cume_distStepFu
2130: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
2140: 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20  ntext *pCtx, .  
2150: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69  int nArg,.  sqli
2160: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72  te3_value **apAr
2170: 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61  g.){.  struct Ca
2180: 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 61 73  llCount *p;.  as
2190: 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b  sert( nArg==1 );
21a0: 0a 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74 20  ..  p = (struct 
21b0: 43 61 6c 6c 43 6f 75 6e 74 2a 29 73 71 6c 69 74  CallCount*)sqlit
21c0: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
21d0: 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f  text(pCtx, sizeo
21e0: 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20  f(*p));.  if( p 
21f0: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 54  ){.    if( p->nT
2200: 6f 74 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  otal==0 ){.     
2210: 20 70 2d 3e 6e 54 6f 74 61 6c 20 3d 20 73 71 6c   p->nTotal = sql
2220: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
2230: 28 61 70 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20  (apArg[0]);.    
2240: 7d 0a 20 20 20 20 70 2d 3e 6e 53 74 65 70 2b 2b  }.    p->nStep++
2250: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
2260: 6f 69 64 20 63 75 6d 65 5f 64 69 73 74 49 6e 76  oid cume_distInv
2270: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
2280: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
2290: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
22a0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
22b0: 41 72 67 0a 29 7b 0a 7d 0a 73 74 61 74 69 63 20  Arg.){.}.static 
22c0: 76 6f 69 64 20 63 75 6d 65 5f 64 69 73 74 56 61  void cume_distVa
22d0: 6c 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  lueFunc(sqlite3_
22e0: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a  context *pCtx){.
22f0: 20 20 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75    struct CallCou
2300: 6e 74 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74  nt *p;.  p = (st
2310: 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29  ruct CallCount*)
2320: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
2330: 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20  e_context(pCtx, 
2340: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69  sizeof(*p));.  i
2350: 66 28 20 70 20 29 7b 0a 20 20 20 20 64 6f 75 62  f( p ){.    doub
2360: 6c 65 20 72 20 3d 20 28 64 6f 75 62 6c 65 29 28  le r = (double)(
2370: 70 2d 3e 6e 53 74 65 70 29 20 2f 20 28 64 6f 75  p->nStep) / (dou
2380: 62 6c 65 29 28 70 2d 3e 6e 54 6f 74 61 6c 29 3b  ble)(p->nTotal);
2390: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
23a0: 75 6c 74 5f 64 6f 75 62 6c 65 28 70 43 74 78 2c  ult_double(pCtx,
23b0: 20 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   r);.  }.}../*.*
23c0: 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74  * Context object
23d0: 20 66 6f 72 20 6e 74 69 6c 65 28 29 20 77 69 6e   for ntile() win
23e0: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  dow function..*/
23f0: 0a 73 74 72 75 63 74 20 4e 74 69 6c 65 43 74 78  .struct NtileCtx
2400: 20 7b 0a 20 20 69 36 34 20 6e 54 6f 74 61 6c 3b   {.  i64 nTotal;
2410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2420: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 72 6f       /* Total ro
2430: 77 73 20 69 6e 20 70 61 72 74 69 74 69 6f 6e 20  ws in partition 
2440: 2a 2f 0a 20 20 69 36 34 20 6e 50 61 72 61 6d 3b  */.  i64 nParam;
2450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2460: 20 20 20 20 20 2f 2a 20 50 61 72 61 6d 65 74 65       /* Paramete
2470: 72 20 70 61 73 73 65 64 20 74 6f 20 6e 74 69 6c  r passed to ntil
2480: 65 28 4e 29 20 2a 2f 0a 20 20 69 36 34 20 69 52  e(N) */.  i64 iR
2490: 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ow;             
24a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
24b0: 72 65 6e 74 20 72 6f 77 20 2a 2f 0a 7d 3b 0a 0a  rent row */.};..
24c0: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
24d0: 74 69 6f 6e 20 6f 66 20 6e 74 69 6c 65 28 29 2e  tion of ntile().
24e0: 20 54 68 69 73 20 61 73 73 75 6d 65 73 20 74 68   This assumes th
24f0: 61 74 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72  at the window fr
2500: 61 6d 65 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20  ame has.** been 
2510: 63 6f 65 72 63 65 64 20 74 6f 3a 0a 2a 2a 0a 2a  coerced to:.**.*
2520: 2a 20 20 20 52 4f 57 53 20 55 4e 42 4f 55 4e 44  *   ROWS UNBOUND
2530: 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44  ED PRECEDING AND
2540: 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2f 0a   CURRENT ROW.*/.
2550: 73 74 61 74 69 63 20 76 6f 69 64 20 6e 74 69 6c  static void ntil
2560: 65 53 74 65 70 46 75 6e 63 28 0a 20 20 73 71 6c  eStepFunc(.  sql
2570: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
2580: 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c  tx, .  int nArg,
2590: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
25a0: 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20 73 74   **apArg.){.  st
25b0: 72 75 63 74 20 4e 74 69 6c 65 43 74 78 20 2a 70  ruct NtileCtx *p
25c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 41 72 67  ;.  assert( nArg
25d0: 3d 3d 32 20 29 3b 0a 20 20 70 20 3d 20 28 73 74  ==2 );.  p = (st
25e0: 72 75 63 74 20 4e 74 69 6c 65 43 74 78 2a 29 73  ruct NtileCtx*)s
25f0: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
2600: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
2610: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
2620: 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ( p ){.    if( p
2630: 2d 3e 6e 54 6f 74 61 6c 3d 3d 30 20 29 7b 0a 20  ->nTotal==0 ){. 
2640: 20 20 20 20 20 70 2d 3e 6e 50 61 72 61 6d 20 3d       p->nParam =
2650: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
2660: 6e 74 36 34 28 61 70 41 72 67 5b 30 5d 29 3b 0a  nt64(apArg[0]);.
2670: 20 20 20 20 20 20 70 2d 3e 6e 54 6f 74 61 6c 20        p->nTotal 
2680: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
2690: 69 6e 74 36 34 28 61 70 41 72 67 5b 31 5d 29 3b  int64(apArg[1]);
26a0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 50  .      if( p->nP
26b0: 61 72 61 6d 3c 3d 30 20 29 7b 0a 20 20 20 20 20  aram<=0 ){.     
26c0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
26d0: 74 5f 65 72 72 6f 72 28 0a 20 20 20 20 20 20 20  t_error(.       
26e0: 20 20 20 20 20 70 43 74 78 2c 20 22 61 72 67 75       pCtx, "argu
26f0: 6d 65 6e 74 20 6f 66 20 6e 74 69 6c 65 20 6d 75  ment of ntile mu
2700: 73 74 20 62 65 20 61 20 70 6f 73 69 74 69 76 65  st be a positive
2710: 20 69 6e 74 65 67 65 72 22 2c 20 2d 31 0a 20 20   integer", -1.  
2720: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
2730: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 52  .    }.    p->iR
2740: 6f 77 2b 2b 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  ow++;.  }.}.stat
2750: 69 63 20 76 6f 69 64 20 6e 74 69 6c 65 49 6e 76  ic void ntileInv
2760: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
2770: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
2780: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
2790: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
27a0: 41 72 67 0a 29 7b 0a 7d 0a 73 74 61 74 69 63 20  Arg.){.}.static 
27b0: 76 6f 69 64 20 6e 74 69 6c 65 56 61 6c 75 65 46  void ntileValueF
27c0: 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
27d0: 65 78 74 20 2a 70 43 74 78 29 7b 0a 20 20 73 74  ext *pCtx){.  st
27e0: 72 75 63 74 20 4e 74 69 6c 65 43 74 78 20 2a 70  ruct NtileCtx *p
27f0: 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74 20  ;.  p = (struct 
2800: 4e 74 69 6c 65 43 74 78 2a 29 73 71 6c 69 74 65  NtileCtx*)sqlite
2810: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
2820: 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66  ext(pCtx, sizeof
2830: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 26  (*p));.  if( p &
2840: 26 20 70 2d 3e 6e 50 61 72 61 6d 3e 30 20 29 7b  & p->nParam>0 ){
2850: 0a 20 20 20 20 69 6e 74 20 6e 53 69 7a 65 20 3d  .    int nSize =
2860: 20 28 70 2d 3e 6e 54 6f 74 61 6c 20 2f 20 70 2d   (p->nTotal / p-
2870: 3e 6e 50 61 72 61 6d 29 3b 0a 20 20 20 20 69 66  >nParam);.    if
2880: 28 20 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20  ( nSize==0 ){.  
2890: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
28a0: 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 70  lt_int64(pCtx, p
28b0: 2d 3e 69 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c  ->iRow);.    }el
28c0: 73 65 7b 0a 20 20 20 20 20 20 69 36 34 20 6e 4c  se{.      i64 nL
28d0: 61 72 67 65 20 3d 20 70 2d 3e 6e 54 6f 74 61 6c  arge = p->nTotal
28e0: 20 2d 20 70 2d 3e 6e 50 61 72 61 6d 2a 6e 53 69   - p->nParam*nSi
28f0: 7a 65 3b 0a 20 20 20 20 20 20 69 36 34 20 69 53  ze;.      i64 iS
2900: 6d 61 6c 6c 20 3d 20 6e 4c 61 72 67 65 2a 28 6e  mall = nLarge*(n
2910: 53 69 7a 65 2b 31 29 3b 0a 20 20 20 20 20 20 69  Size+1);.      i
2920: 36 34 20 69 52 6f 77 20 3d 20 70 2d 3e 69 52 6f  64 iRow = p->iRo
2930: 77 2d 31 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  w-1;..      asse
2940: 72 74 28 20 28 6e 4c 61 72 67 65 2a 28 6e 53 69  rt( (nLarge*(nSi
2950: 7a 65 2b 31 29 20 2b 20 28 70 2d 3e 6e 50 61 72  ze+1) + (p->nPar
2960: 61 6d 2d 6e 4c 61 72 67 65 29 2a 6e 53 69 7a 65  am-nLarge)*nSize
2970: 29 3d 3d 70 2d 3e 6e 54 6f 74 61 6c 20 29 3b 0a  )==p->nTotal );.
2980: 0a 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 3c  .      if( iRow<
2990: 69 53 6d 61 6c 6c 20 29 7b 0a 20 20 20 20 20 20  iSmall ){.      
29a0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
29b0: 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 31 20 2b  _int64(pCtx, 1 +
29c0: 20 69 52 6f 77 2f 28 6e 53 69 7a 65 2b 31 29 29   iRow/(nSize+1))
29d0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
29e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
29f0: 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78  esult_int64(pCtx
2a00: 2c 20 31 20 2b 20 6e 4c 61 72 67 65 20 2b 20 28  , 1 + nLarge + (
2a10: 69 52 6f 77 2d 69 53 6d 61 6c 6c 29 2f 6e 53 69  iRow-iSmall)/nSi
2a20: 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ze);.      }.   
2a30: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
2a40: 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 66  Context object f
2a50: 6f 72 20 6c 61 73 74 5f 76 61 6c 75 65 28 29 20  or last_value() 
2a60: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 2e  window function.
2a70: 0a 2a 2f 0a 73 74 72 75 63 74 20 4c 61 73 74 56  .*/.struct LastV
2a80: 61 6c 75 65 43 74 78 20 7b 0a 20 20 73 71 6c 69  alueCtx {.  sqli
2a90: 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b  te3_value *pVal;
2aa0: 0a 20 20 69 6e 74 20 6e 56 61 6c 3b 0a 7d 3b 0a  .  int nVal;.};.
2ab0: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
2ac0: 61 74 69 6f 6e 20 6f 66 20 6c 61 73 74 5f 76 61  ation of last_va
2ad0: 6c 75 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  lue()..*/.static
2ae0: 20 76 6f 69 64 20 6c 61 73 74 5f 76 61 6c 75 65   void last_value
2af0: 53 74 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69  StepFunc(.  sqli
2b00: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
2b10: 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  x, .  int nArg,.
2b20: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
2b30: 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72  **apArg.){.  str
2b40: 75 63 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78  uct LastValueCtx
2b50: 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75   *p;.  p = (stru
2b60: 63 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 20  ct LastValueCtx 
2b70: 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  *)sqlite3_aggreg
2b80: 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78  ate_context(pCtx
2b90: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
2ba0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71   if( p ){.    sq
2bb0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 66 72 65 65  lite3_value_free
2bc0: 28 70 2d 3e 70 56 61 6c 29 3b 0a 20 20 20 20 70  (p->pVal);.    p
2bd0: 2d 3e 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33  ->pVal = sqlite3
2be0: 5f 76 61 6c 75 65 5f 64 75 70 28 61 70 41 72 67  _value_dup(apArg
2bf0: 5b 30 5d 29 3b 0a 20 20 20 20 70 2d 3e 6e 56 61  [0]);.    p->nVa
2c00: 6c 2b 2b 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  l++;.  }.}.stati
2c10: 63 20 76 6f 69 64 20 6c 61 73 74 5f 76 61 6c 75  c void last_valu
2c20: 65 49 6e 76 46 75 6e 63 28 0a 20 20 73 71 6c 69  eInvFunc(.  sqli
2c30: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
2c40: 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  x, .  int nArg,.
2c50: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
2c60: 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72  **apArg.){.  str
2c70: 75 63 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78  uct LastValueCtx
2c80: 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75   *p;.  p = (stru
2c90: 63 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 20  ct LastValueCtx 
2ca0: 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  *)sqlite3_aggreg
2cb0: 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78  ate_context(pCtx
2cc0: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
2cd0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70 2d   if( p ){.    p-
2ce0: 3e 6e 56 61 6c 2d 2d 3b 0a 20 20 20 20 69 66 28  >nVal--;.    if(
2cf0: 20 70 2d 3e 6e 56 61 6c 3d 3d 30 20 29 7b 0a 20   p->nVal==0 ){. 
2d00: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
2d10: 75 65 5f 66 72 65 65 28 70 2d 3e 70 56 61 6c 29  ue_free(p->pVal)
2d20: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 56 61 6c 20  ;.      p->pVal 
2d30: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
2d40: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 61 73  .static void las
2d50: 74 5f 76 61 6c 75 65 56 61 6c 75 65 46 75 6e 63  t_valueValueFunc
2d60: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
2d70: 20 2a 70 43 74 78 29 7b 0a 20 20 73 74 72 75 63   *pCtx){.  struc
2d80: 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 20 2a  t LastValueCtx *
2d90: 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74  p;.  p = (struct
2da0: 20 4c 61 73 74 56 61 6c 75 65 43 74 78 20 2a 29   LastValueCtx *)
2db0: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
2dc0: 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20  e_context(pCtx, 
2dd0: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69  sizeof(*p));.  i
2de0: 66 28 20 70 20 26 26 20 70 2d 3e 70 56 61 6c 20  f( p && p->pVal 
2df0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
2e00: 65 73 75 6c 74 5f 76 61 6c 75 65 28 70 43 74 78  esult_value(pCtx
2e10: 2c 20 70 2d 3e 70 56 61 6c 29 3b 0a 20 20 7d 0a  , p->pVal);.  }.
2e20: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 61  }.static void la
2e30: 73 74 5f 76 61 6c 75 65 46 69 6e 61 6c 69 7a 65  st_valueFinalize
2e40: 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Func(sqlite3_con
2e50: 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20 20 73  text *pCtx){.  s
2e60: 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75 65 43  truct LastValueC
2e70: 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74  tx *p;.  p = (st
2e80: 72 75 63 74 20 4c 61 73 74 56 61 6c 75 65 43 74  ruct LastValueCt
2e90: 78 20 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72  x *)sqlite3_aggr
2ea0: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43  egate_context(pC
2eb0: 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b  tx, sizeof(*p));
2ec0: 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 70  .  if( p && p->p
2ed0: 56 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Val ){.    sqlit
2ee0: 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28  e3_result_value(
2ef0: 70 43 74 78 2c 20 70 2d 3e 70 56 61 6c 29 3b 0a  pCtx, p->pVal);.
2f00: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
2f10: 65 5f 66 72 65 65 28 70 2d 3e 70 56 61 6c 29 3b  e_free(p->pVal);
2f20: 0a 20 20 20 20 70 2d 3e 70 56 61 6c 20 3d 20 30  .    p->pVal = 0
2f30: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e  ;.  }.}../*.** N
2f40: 6f 2d 6f 70 20 69 6d 70 6c 65 6d 65 6e 74 61 74  o-op implementat
2f50: 69 6f 6e 73 20 6f 66 20 6e 74 68 5f 76 61 6c 75  ions of nth_valu
2f60: 65 28 29 2c 20 66 69 72 73 74 5f 76 61 6c 75 65  e(), first_value
2f70: 28 29 2c 20 6c 65 61 64 28 29 20 61 6e 64 20 6c  (), lead() and l
2f80: 61 67 28 29 2e 0a 2a 2a 20 54 68 65 73 65 20 61  ag()..** These a
2f90: 72 65 20 61 6c 6c 20 69 6d 70 6c 65 6d 65 6e 74  re all implement
2fa0: 65 64 20 69 6e 6c 69 6e 65 20 75 73 69 6e 67 20  ed inline using 
2fb0: 56 44 42 45 20 69 6e 73 74 72 75 63 74 69 6f 6e  VDBE instruction
2fc0: 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  s. .*/.static vo
2fd0: 69 64 20 6e 74 68 5f 76 61 6c 75 65 53 74 65 70  id nth_valueStep
2fe0: 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Func(sqlite3_con
2ff0: 74 65 78 74 20 2a 70 43 74 78 2c 20 69 6e 74 20  text *pCtx, int 
3000: 6e 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  n, sqlite3_value
3010: 20 2a 2a 61 29 7b 7d 0a 73 74 61 74 69 63 20 76   **a){}.static v
3020: 6f 69 64 20 6e 74 68 5f 76 61 6c 75 65 49 6e 76  oid nth_valueInv
3030: 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Func(sqlite3_con
3040: 74 65 78 74 20 2a 70 43 74 78 2c 20 69 6e 74 20  text *pCtx, int 
3050: 6e 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  n, sqlite3_value
3060: 20 2a 2a 61 70 29 7b 7d 0a 73 74 61 74 69 63 20   **ap){}.static 
3070: 76 6f 69 64 20 6e 74 68 5f 76 61 6c 75 65 56 61  void nth_valueVa
3080: 6c 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  lueFunc(sqlite3_
3090: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 7d  context *pCtx){}
30a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 72  .static void fir
30b0: 73 74 5f 76 61 6c 75 65 53 74 65 70 46 75 6e 63  st_valueStepFunc
30c0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
30d0: 20 2a 70 2c 20 69 6e 74 20 6e 2c 20 73 71 6c 69   *p, int n, sqli
30e0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 29 7b  te3_value **ap){
30f0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69  }.static void fi
3100: 72 73 74 5f 76 61 6c 75 65 49 6e 76 46 75 6e 63  rst_valueInvFunc
3110: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
3120: 20 2a 70 2c 20 69 6e 74 20 6e 2c 20 73 71 6c 69   *p, int n, sqli
3130: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 29 7b  te3_value **ap){
3140: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69  }.static void fi
3150: 72 73 74 5f 76 61 6c 75 65 56 61 6c 75 65 46 75  rst_valueValueFu
3160: 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  nc(sqlite3_conte
3170: 78 74 20 2a 70 43 74 78 29 7b 7d 0a 73 74 61 74  xt *pCtx){}.stat
3180: 69 63 20 76 6f 69 64 20 6c 65 61 64 53 74 65 70  ic void leadStep
3190: 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Func(sqlite3_con
31a0: 74 65 78 74 20 2a 70 43 74 78 2c 20 69 6e 74 20  text *pCtx, int 
31b0: 6e 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  n, sqlite3_value
31c0: 20 2a 2a 61 70 29 7b 7d 0a 73 74 61 74 69 63 20   **ap){}.static 
31d0: 76 6f 69 64 20 6c 65 61 64 49 6e 76 46 75 6e 63  void leadInvFunc
31e0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
31f0: 20 2a 70 43 74 78 2c 20 69 6e 74 20 6e 2c 20 73   *pCtx, int n, s
3200: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
3210: 70 29 7b 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  p){}.static void
3220: 20 6c 65 61 64 56 61 6c 75 65 46 75 6e 63 28 73   leadValueFunc(s
3230: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
3240: 70 43 74 78 29 7b 7d 0a 73 74 61 74 69 63 20 76  pCtx){}.static v
3250: 6f 69 64 20 6c 61 67 53 74 65 70 46 75 6e 63 28  oid lagStepFunc(
3260: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
3270: 2a 70 43 74 78 2c 20 69 6e 74 20 6e 2c 20 73 71  *pCtx, int n, sq
3280: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
3290: 29 7b 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ){}.static void 
32a0: 6c 61 67 49 6e 76 46 75 6e 63 28 73 71 6c 69 74  lagInvFunc(sqlit
32b0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
32c0: 2c 20 69 6e 74 20 6e 2c 20 73 71 6c 69 74 65 33  , int n, sqlite3
32d0: 5f 76 61 6c 75 65 20 2a 2a 61 70 29 7b 7d 0a 73  _value **ap){}.s
32e0: 74 61 74 69 63 20 76 6f 69 64 20 6c 61 67 56 61  tatic void lagVa
32f0: 6c 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  lueFunc(sqlite3_
3300: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 7d  context *pCtx){}
3310: 0a 0a 23 64 65 66 69 6e 65 20 57 49 4e 44 4f 57  ..#define WINDOW
3320: 46 55 4e 43 28 6e 61 6d 65 2c 6e 41 72 67 2c 65  FUNC(name,nArg,e
3330: 78 74 72 61 29 20 7b 20 20 20 20 20 20 20 20 20  xtra) {         
3340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3350: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
3360: 20 6e 41 72 67 2c 20 28 53 51 4c 49 54 45 5f 55   nArg, (SQLITE_U
3370: 54 46 38 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f  TF8|SQLITE_FUNC_
3380: 57 49 4e 44 4f 57 7c 65 78 74 72 61 29 2c 20 30  WINDOW|extra), 0
3390: 2c 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  , 0,            
33a0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6e 61            \.  na
33b0: 6d 65 20 23 23 20 53 74 65 70 46 75 6e 63 2c 20  me ## StepFunc, 
33c0: 6e 61 6d 65 20 23 23 20 56 61 6c 75 65 46 75 6e  name ## ValueFun
33d0: 63 2c 20 6e 61 6d 65 20 23 23 20 56 61 6c 75 65  c, name ## Value
33e0: 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Func,           
33f0: 20 20 20 20 20 20 20 5c 0a 20 20 6e 61 6d 65 20         \.  name 
3400: 23 23 20 49 6e 76 46 75 6e 63 2c 20 23 6e 61 6d  ## InvFunc, #nam
3410: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
3420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3440: 5c 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 57 49 4e  \.}..#define WIN
3450: 44 4f 57 46 55 4e 43 46 28 6e 61 6d 65 2c 6e 41  DOWFUNCF(name,nA
3460: 72 67 2c 65 78 74 72 61 29 20 7b 20 20 20 20 20  rg,extra) {     
3470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3490: 5c 0a 20 20 6e 41 72 67 2c 20 28 53 51 4c 49 54  \.  nArg, (SQLIT
34a0: 45 5f 55 54 46 38 7c 53 51 4c 49 54 45 5f 46 55  E_UTF8|SQLITE_FU
34b0: 4e 43 5f 57 49 4e 44 4f 57 7c 65 78 74 72 61 29  NC_WINDOW|extra)
34c0: 2c 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 20  , 0, 0,         
34d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
34e0: 20 6e 61 6d 65 20 23 23 20 53 74 65 70 46 75 6e   name ## StepFun
34f0: 63 2c 20 6e 61 6d 65 20 23 23 20 46 69 6e 61 6c  c, name ## Final
3500: 69 7a 65 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23  izeFunc, name ##
3510: 20 56 61 6c 75 65 46 75 6e 63 2c 20 20 20 20 20   ValueFunc,     
3520: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6e 61            \.  na
3530: 6d 65 20 23 23 20 49 6e 76 46 75 6e 63 2c 20 23  me ## InvFunc, #
3540: 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  name            
3550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3570: 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65     \.}../*.** Re
3580: 67 69 73 74 65 72 20 74 68 6f 73 65 20 62 75 69  gister those bui
3590: 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e  lt-in window fun
35a0: 63 74 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  ctions that are 
35b0: 6e 6f 74 20 61 6c 73 6f 20 61 67 67 72 65 67 61  not also aggrega
35c0: 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tes..*/.void sql
35d0: 69 74 65 33 57 69 6e 64 6f 77 46 75 6e 63 74 69  ite3WindowFuncti
35e0: 6f 6e 73 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  ons(void){.  sta
35f0: 74 69 63 20 46 75 6e 63 44 65 66 20 61 57 69 6e  tic FuncDef aWin
3600: 64 6f 77 46 75 6e 63 73 5b 5d 20 3d 20 7b 0a 20  dowFuncs[] = {. 
3610: 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 28 72 6f     WINDOWFUNC(ro
3620: 77 5f 6e 75 6d 62 65 72 2c 20 30 2c 20 30 29 2c  w_number, 0, 0),
3630: 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 28  .    WINDOWFUNC(
3640: 64 65 6e 73 65 5f 72 61 6e 6b 2c 20 30 2c 20 30  dense_rank, 0, 0
3650: 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e  ),.    WINDOWFUN
3660: 43 28 72 61 6e 6b 2c 20 30 2c 20 30 29 2c 0a 20  C(rank, 0, 0),. 
3670: 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 28 70 65     WINDOWFUNC(pe
3680: 72 63 65 6e 74 5f 72 61 6e 6b 2c 20 30 2c 20 53  rcent_rank, 0, S
3690: 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f  QLITE_FUNC_WINDO
36a0: 57 5f 53 49 5a 45 29 2c 0a 20 20 20 20 57 49 4e  W_SIZE),.    WIN
36b0: 44 4f 57 46 55 4e 43 28 63 75 6d 65 5f 64 69 73  DOWFUNC(cume_dis
36c0: 74 2c 20 30 2c 20 53 51 4c 49 54 45 5f 46 55 4e  t, 0, SQLITE_FUN
36d0: 43 5f 57 49 4e 44 4f 57 5f 53 49 5a 45 29 2c 0a  C_WINDOW_SIZE),.
36e0: 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 28 6e      WINDOWFUNC(n
36f0: 74 69 6c 65 2c 20 31 2c 20 53 51 4c 49 54 45 5f  tile, 1, SQLITE_
3700: 46 55 4e 43 5f 57 49 4e 44 4f 57 5f 53 49 5a 45  FUNC_WINDOW_SIZE
3710: 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e  ),.    WINDOWFUN
3720: 43 46 28 6c 61 73 74 5f 76 61 6c 75 65 2c 20 31  CF(last_value, 1
3730: 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57  , 0),.    WINDOW
3740: 46 55 4e 43 28 6e 74 68 5f 76 61 6c 75 65 2c 20  FUNC(nth_value, 
3750: 32 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f  2, 0),.    WINDO
3760: 57 46 55 4e 43 28 66 69 72 73 74 5f 76 61 6c 75  WFUNC(first_valu
3770: 65 2c 20 31 2c 20 30 29 2c 0a 20 20 20 20 57 49  e, 1, 0),.    WI
3780: 4e 44 4f 57 46 55 4e 43 28 6c 65 61 64 2c 20 31  NDOWFUNC(lead, 1
3790: 2c 20 30 29 2c 20 57 49 4e 44 4f 57 46 55 4e 43  , 0), WINDOWFUNC
37a0: 28 6c 65 61 64 2c 20 32 2c 20 30 29 2c 20 57 49  (lead, 2, 0), WI
37b0: 4e 44 4f 57 46 55 4e 43 28 6c 65 61 64 2c 20 33  NDOWFUNC(lead, 3
37c0: 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57  , 0),.    WINDOW
37d0: 46 55 4e 43 28 6c 61 67 2c 20 31 2c 20 30 29 2c  FUNC(lag, 1, 0),
37e0: 20 20 57 49 4e 44 4f 57 46 55 4e 43 28 6c 61 67    WINDOWFUNC(lag
37f0: 2c 20 32 2c 20 30 29 2c 20 20 57 49 4e 44 4f 57  , 2, 0),  WINDOW
3800: 46 55 4e 43 28 6c 61 67 2c 20 33 2c 20 30 29 2c  FUNC(lag, 3, 0),
3810: 0a 20 20 7d 3b 0a 20 20 73 71 6c 69 74 65 33 49  .  };.  sqlite3I
3820: 6e 73 65 72 74 42 75 69 6c 74 69 6e 46 75 6e 63  nsertBuiltinFunc
3830: 73 28 61 57 69 6e 64 6f 77 46 75 6e 63 73 2c 20  s(aWindowFuncs, 
3840: 41 72 72 61 79 53 69 7a 65 28 61 57 69 6e 64 6f  ArraySize(aWindo
3850: 77 46 75 6e 63 73 29 29 3b 0a 7d 0a 0a 2f 2a 0a  wFuncs));.}../*.
3860: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
3870: 20 69 73 20 63 61 6c 6c 65 64 20 69 6d 6d 65 64   is called immed
3880: 69 61 74 65 6c 79 20 61 66 74 65 72 20 72 65 73  iately after res
3890: 6f 6c 76 69 6e 67 20 74 68 65 20 66 75 6e 63 74  olving the funct
38a0: 69 6f 6e 20 6e 61 6d 65 0a 2a 2a 20 66 6f 72 20  ion name.** for 
38b0: 61 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  a window functio
38c0: 6e 20 77 69 74 68 69 6e 20 61 20 53 45 4c 45 43  n within a SELEC
38d0: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 41 72 67  T statement. Arg
38e0: 75 6d 65 6e 74 20 70 4c 69 73 74 20 69 73 20 61  ument pList is a
38f0: 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  .** linked list 
3900: 6f 66 20 57 49 4e 44 4f 57 20 64 65 66 69 6e 69  of WINDOW defini
3910: 74 69 6f 6e 73 20 66 6f 72 20 74 68 65 20 63 75  tions for the cu
3920: 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61  rrent SELECT sta
3930: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 41 72 67 75 6d  tement..** Argum
3940: 65 6e 74 20 70 46 75 6e 63 20 69 73 20 74 68 65  ent pFunc is the
3950: 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69   function defini
3960: 74 69 6f 6e 20 6a 75 73 74 20 72 65 73 6f 6c 76  tion just resolv
3970: 65 64 20 61 6e 64 20 70 57 69 6e 0a 2a 2a 20 69  ed and pWin.** i
3980: 73 20 74 68 65 20 57 69 6e 64 6f 77 20 6f 62 6a  s the Window obj
3990: 65 63 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67  ect representing
39a0: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
39b0: 4f 56 45 52 20 63 6c 61 75 73 65 2e 20 54 68 69  OVER clause. Thi
39c0: 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 75 70  s.** function up
39d0: 64 61 74 65 73 20 74 68 65 20 63 6f 6e 74 65 6e  dates the conten
39e0: 74 73 20 6f 66 20 70 57 69 6e 20 61 73 20 66 6f  ts of pWin as fo
39f0: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  llows:.**.**   *
3a00: 20 49 66 20 74 68 65 20 4f 56 45 52 20 63 6c 61   If the OVER cla
3a10: 75 73 65 20 72 65 66 65 72 65 64 20 74 6f 20 61  use refered to a
3a20: 20 6e 61 6d 65 64 20 77 69 6e 64 6f 77 20 28 61   named window (a
3a30: 73 20 69 6e 20 22 6d 61 78 28 78 29 20 4f 56 45  s in "max(x) OVE
3a40: 52 20 77 69 6e 22 29 2c 0a 2a 2a 20 20 20 20 20  R win"),.**     
3a50: 73 65 61 72 63 68 20 6c 69 73 74 20 70 4c 69 73  search list pLis
3a60: 74 20 66 6f 72 20 61 20 6d 61 74 63 68 69 6e 67  t for a matching
3a70: 20 57 49 4e 44 4f 57 20 64 65 66 69 6e 69 74 69   WINDOW definiti
3a80: 6f 6e 2c 20 61 6e 64 20 75 70 64 61 74 65 20 70  on, and update p
3a90: 57 69 6e 0a 2a 2a 20 20 20 20 20 61 63 63 6f 72  Win.**     accor
3aa0: 64 69 6e 67 6c 79 2e 20 49 66 20 6e 6f 20 73 75  dingly. If no su
3ab0: 63 68 20 57 49 4e 44 4f 57 20 63 6c 61 75 73 65  ch WINDOW clause
3ac0: 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 6c   can be found, l
3ad0: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 0a 2a 2a  eave an error.**
3ae0: 20 20 20 20 20 69 6e 20 70 50 61 72 73 65 2e 0a       in pParse..
3af0: 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  **.**   * If the
3b00: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 62   function is a b
3b10: 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66  uilt-in window f
3b20: 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 72 65 71  unction that req
3b30: 75 69 72 65 73 20 74 68 65 0a 2a 2a 20 20 20 20  uires the.**    
3b40: 20 77 69 6e 64 6f 77 20 74 6f 20 62 65 20 63 6f   window to be co
3b50: 65 72 63 65 64 20 28 73 65 65 20 22 42 55 49 4c  erced (see "BUIL
3b60: 54 2d 49 4e 20 57 49 4e 44 4f 57 20 46 55 4e 43  T-IN WINDOW FUNC
3b70: 54 49 4f 4e 53 22 20 61 74 20 74 68 65 20 74 6f  TIONS" at the to
3b80: 70 0a 2a 2a 20 20 20 20 20 6f 66 20 74 68 69 73  p.**     of this
3b90: 20 66 69 6c 65 29 2c 20 70 57 69 6e 20 69 73 20   file), pWin is 
3ba0: 75 70 64 61 74 65 64 20 68 65 72 65 2e 0a 2a 2f  updated here..*/
3bb0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 6e  .void sqlite3Win
3bc0: 64 6f 77 55 70 64 61 74 65 28 0a 20 20 50 61 72  dowUpdate(.  Par
3bd0: 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 57  se *pParse, .  W
3be0: 69 6e 64 6f 77 20 2a 70 4c 69 73 74 2c 20 20 20  indow *pList,   
3bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3c00: 2a 20 4c 69 73 74 20 6f 66 20 6e 61 6d 65 64 20  * List of named 
3c10: 77 69 6e 64 6f 77 73 20 66 6f 72 20 74 68 69 73  windows for this
3c20: 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 57 69 6e   SELECT */.  Win
3c30: 64 6f 77 20 2a 70 57 69 6e 2c 20 20 20 20 20 20  dow *pWin,      
3c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3c50: 57 69 6e 64 6f 77 20 66 72 61 6d 65 20 74 6f 20  Window frame to 
3c60: 75 70 64 61 74 65 20 2a 2f 0a 20 20 46 75 6e 63  update */.  Func
3c70: 44 65 66 20 2a 70 46 75 6e 63 20 20 20 20 20 20  Def *pFunc      
3c80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
3c90: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 64  indow function d
3ca0: 65 66 69 6e 69 74 69 6f 6e 20 2a 2f 0a 29 7b 0a  efinition */.){.
3cb0: 20 20 69 66 28 20 70 57 69 6e 2d 3e 7a 4e 61 6d    if( pWin->zNam
3cc0: 65 20 29 7b 0a 20 20 20 20 57 69 6e 64 6f 77 20  e ){.    Window 
3cd0: 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c  *p;.    for(p=pL
3ce0: 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  ist; p; p=p->pNe
3cf0: 78 74 57 69 6e 29 7b 0a 20 20 20 20 20 20 69 66  xtWin){.      if
3d00: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
3d10: 28 70 2d 3e 7a 4e 61 6d 65 2c 20 70 57 69 6e 2d  (p->zName, pWin-
3d20: 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65  >zName)==0 ) bre
3d30: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
3d40: 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( p==0 ){.      
3d50: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
3d60: 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
3d70: 20 77 69 6e 64 6f 77 3a 20 25 73 22 2c 20 70 57   window: %s", pW
3d80: 69 6e 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  in->zName);.    
3d90: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
3da0: 20 20 20 20 70 57 69 6e 2d 3e 70 50 61 72 74 69      pWin->pParti
3db0: 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78  tion = sqlite3Ex
3dc0: 70 72 4c 69 73 74 44 75 70 28 70 50 61 72 73 65  prListDup(pParse
3dd0: 2d 3e 64 62 2c 20 70 2d 3e 70 50 61 72 74 69 74  ->db, p->pPartit
3de0: 69 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 70 57 69  ion, 0);.    pWi
3df0: 6e 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71  n->pOrderBy = sq
3e00: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
3e10: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e  (pParse->db, p->
3e20: 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 20 20  pOrderBy, 0);.  
3e30: 20 20 70 57 69 6e 2d 3e 70 53 74 61 72 74 20 3d    pWin->pStart =
3e40: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
3e50: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70  pParse->db, p->p
3e60: 53 74 61 72 74 2c 20 30 29 3b 0a 20 20 20 20 70  Start, 0);.    p
3e70: 57 69 6e 2d 3e 70 45 6e 64 20 3d 20 73 71 6c 69  Win->pEnd = sqli
3e80: 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73  te3ExprDup(pPars
3e90: 65 2d 3e 64 62 2c 20 70 2d 3e 70 45 6e 64 2c 20  e->db, p->pEnd, 
3ea0: 30 29 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 65 53  0);.    pWin->eS
3eb0: 74 61 72 74 20 3d 20 70 2d 3e 65 53 74 61 72 74  tart = p->eStart
3ec0: 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 65 45 6e 64  ;.    pWin->eEnd
3ed0: 20 3d 20 70 2d 3e 65 45 6e 64 3b 0a 20 20 7d 0a   = p->eEnd;.  }.
3ee0: 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 66 75 6e    if( pFunc->fun
3ef0: 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
3f00: 46 55 4e 43 5f 57 49 4e 44 4f 57 20 29 7b 0a 20  FUNC_WINDOW ){. 
3f10: 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
3f20: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20   pParse->db;.   
3f30: 20 69 66 28 20 70 57 69 6e 2d 3e 70 46 69 6c 74   if( pWin->pFilt
3f40: 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  er ){.      sqli
3f50: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
3f60: 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  se, .          "
3f70: 46 49 4c 54 45 52 20 63 6c 61 75 73 65 20 6d 61  FILTER clause ma
3f80: 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77  y only be used w
3f90: 69 74 68 20 61 67 67 72 65 67 61 74 65 20 77 69  ith aggregate wi
3fa0: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 22 0a  ndow functions".
3fb0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 65 6c        );.    }el
3fc0: 73 65 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63  se.    if( pFunc
3fd0: 2d 3e 78 53 46 75 6e 63 3d 3d 72 6f 77 5f 6e 75  ->xSFunc==row_nu
3fe0: 6d 62 65 72 53 74 65 70 46 75 6e 63 20 7c 7c 20  mberStepFunc || 
3ff0: 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 6e  pFunc->xSFunc==n
4000: 74 69 6c 65 53 74 65 70 46 75 6e 63 20 29 7b 0a  tileStepFunc ){.
4010: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
4020: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 57 69 6e  rDelete(db, pWin
4030: 2d 3e 70 53 74 61 72 74 29 3b 0a 20 20 20 20 20  ->pStart);.     
4040: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
4050: 74 65 28 64 62 2c 20 70 57 69 6e 2d 3e 70 45 6e  te(db, pWin->pEn
4060: 64 29 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e  d);.      pWin->
4070: 70 53 74 61 72 74 20 3d 20 70 57 69 6e 2d 3e 70  pStart = pWin->p
4080: 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  End = 0;.      p
4090: 57 69 6e 2d 3e 65 54 79 70 65 20 3d 20 54 4b 5f  Win->eType = TK_
40a0: 52 4f 57 53 3b 0a 20 20 20 20 20 20 70 57 69 6e  ROWS;.      pWin
40b0: 2d 3e 65 53 74 61 72 74 20 3d 20 54 4b 5f 55 4e  ->eStart = TK_UN
40c0: 42 4f 55 4e 44 45 44 3b 0a 20 20 20 20 20 20 70  BOUNDED;.      p
40d0: 57 69 6e 2d 3e 65 45 6e 64 20 3d 20 54 4b 5f 43  Win->eEnd = TK_C
40e0: 55 52 52 45 4e 54 3b 0a 20 20 20 20 7d 65 6c 73  URRENT;.    }els
40f0: 65 0a 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63  e..    if( pFunc
4100: 2d 3e 78 53 46 75 6e 63 3d 3d 64 65 6e 73 65 5f  ->xSFunc==dense_
4110: 72 61 6e 6b 53 74 65 70 46 75 6e 63 20 7c 7c 20  rankStepFunc || 
4120: 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 72  pFunc->xSFunc==r
4130: 61 6e 6b 53 74 65 70 46 75 6e 63 0a 20 20 20 20  ankStepFunc.    
4140: 20 7c 7c 20 70 46 75 6e 63 2d 3e 78 53 46 75 6e   || pFunc->xSFun
4150: 63 3d 3d 70 65 72 63 65 6e 74 5f 72 61 6e 6b 53  c==percent_rankS
4160: 74 65 70 46 75 6e 63 20 7c 7c 20 70 46 75 6e 63  tepFunc || pFunc
4170: 2d 3e 78 53 46 75 6e 63 3d 3d 63 75 6d 65 5f 64  ->xSFunc==cume_d
4180: 69 73 74 53 74 65 70 46 75 6e 63 0a 20 20 20 20  istStepFunc.    
4190: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
41a0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
41b0: 57 69 6e 2d 3e 70 53 74 61 72 74 29 3b 0a 20 20  Win->pStart);.  
41c0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
41d0: 65 6c 65 74 65 28 64 62 2c 20 70 57 69 6e 2d 3e  elete(db, pWin->
41e0: 70 45 6e 64 29 3b 0a 20 20 20 20 20 20 70 57 69  pEnd);.      pWi
41f0: 6e 2d 3e 70 53 74 61 72 74 20 3d 20 70 57 69 6e  n->pStart = pWin
4200: 2d 3e 70 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20  ->pEnd = 0;.    
4210: 20 20 70 57 69 6e 2d 3e 65 54 79 70 65 20 3d 20    pWin->eType = 
4220: 54 4b 5f 52 41 4e 47 45 3b 0a 20 20 20 20 20 20  TK_RANGE;.      
4230: 70 57 69 6e 2d 3e 65 53 74 61 72 74 20 3d 20 54  pWin->eStart = T
4240: 4b 5f 55 4e 42 4f 55 4e 44 45 44 3b 0a 20 20 20  K_UNBOUNDED;.   
4250: 20 20 20 70 57 69 6e 2d 3e 65 45 6e 64 20 3d 20     pWin->eEnd = 
4260: 54 4b 5f 43 55 52 52 45 4e 54 3b 0a 20 20 20 20  TK_CURRENT;.    
4270: 7d 0a 20 20 7d 0a 20 20 70 57 69 6e 2d 3e 70 46  }.  }.  pWin->pF
4280: 75 6e 63 20 3d 20 70 46 75 6e 63 3b 0a 7d 0a 0a  unc = pFunc;.}..
4290: 2f 2a 0a 2a 2a 20 43 6f 6e 74 65 78 74 20 6f 62  /*.** Context ob
42a0: 6a 65 63 74 20 70 61 73 73 65 64 20 74 68 72 6f  ject passed thro
42b0: 75 67 68 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ugh sqlite3WalkE
42c0: 78 70 72 4c 69 73 74 28 29 20 74 6f 0a 2a 2a 20  xprList() to.** 
42d0: 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72  selectWindowRewr
42e0: 69 74 65 45 78 70 72 43 62 28 29 20 62 79 20 73  iteExprCb() by s
42f0: 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69  electWindowRewri
4300: 74 65 45 4c 69 73 74 28 29 2e 0a 2a 2f 0a 74 79  teEList()..*/.ty
4310: 70 65 64 65 66 20 73 74 72 75 63 74 20 57 69 6e  pedef struct Win
4320: 64 6f 77 52 65 77 72 69 74 65 20 57 69 6e 64 6f  dowRewrite Windo
4330: 77 52 65 77 72 69 74 65 3b 0a 73 74 72 75 63 74  wRewrite;.struct
4340: 20 57 69 6e 64 6f 77 52 65 77 72 69 74 65 20 7b   WindowRewrite {
4350: 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b  .  Window *pWin;
4360: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 53 75  .  ExprList *pSu
4370: 62 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c  b;.};../*.** Cal
4380: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 75  lback function u
4390: 73 65 64 20 62 79 20 73 65 6c 65 63 74 57 69 6e  sed by selectWin
43a0: 64 6f 77 52 65 77 72 69 74 65 45 4c 69 73 74 28  dowRewriteEList(
43b0: 29 2e 20 49 66 20 6e 65 63 65 73 73 61 72 79 2c  ). If necessary,
43c0: 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
43d0: 6e 20 61 70 70 65 6e 64 73 20 74 6f 20 74 68 65  n appends to the
43e0: 20 6f 75 74 70 75 74 20 65 78 70 72 65 73 73 69   output expressi
43f0: 6f 6e 2d 6c 69 73 74 20 61 6e 64 20 75 70 64 61  on-list and upda
4400: 74 65 73 20 0a 2a 2a 20 65 78 70 72 65 73 73 69  tes .** expressi
4410: 6f 6e 20 28 2a 70 70 45 78 70 72 29 20 69 6e 20  on (*ppExpr) in 
4420: 70 6c 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  place..*/.static
4430: 20 69 6e 74 20 73 65 6c 65 63 74 57 69 6e 64 6f   int selectWindo
4440: 77 52 65 77 72 69 74 65 45 78 70 72 43 62 28 57  wRewriteExprCb(W
4450: 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
4460: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
4470: 73 74 72 75 63 74 20 57 69 6e 64 6f 77 52 65 77  struct WindowRew
4480: 72 69 74 65 20 2a 70 20 3d 20 70 57 61 6c 6b 65  rite *p = pWalke
4490: 72 2d 3e 75 2e 70 52 65 77 72 69 74 65 3b 0a 20  r->u.pRewrite;. 
44a0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
44b0: 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
44c0: 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  ;..  switch( pEx
44d0: 70 72 2d 3e 6f 70 20 29 7b 0a 0a 20 20 20 20 63  pr->op ){..    c
44e0: 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
44f0: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
4500: 2d 3e 70 57 69 6e 3d 3d 30 20 29 7b 0a 20 20 20  ->pWin==0 ){.   
4510: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4520: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
4530: 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20   Window *pWin;. 
4540: 20 20 20 20 20 20 20 66 6f 72 28 70 57 69 6e 3d         for(pWin=
4550: 70 2d 3e 70 57 69 6e 3b 20 70 57 69 6e 3b 20 70  p->pWin; pWin; p
4560: 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57  Win=pWin->pNextW
4570: 69 6e 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  in){.          i
4580: 66 28 20 70 45 78 70 72 2d 3e 70 57 69 6e 3d 3d  f( pExpr->pWin==
4590: 70 57 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  pWin ){.        
45a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69 6e      assert( pWin
45b0: 2d 3e 70 4f 77 6e 65 72 3d 3d 70 45 78 70 72 20  ->pOwner==pExpr 
45c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
45d0: 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
45e0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
45f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
4600: 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
4610: 6f 75 67 68 2e 20 20 2a 2f 0a 0a 20 20 20 20 63  ough.  */..    c
4620: 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
4630: 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ION:.    case TK
4640: 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
4650: 20 45 78 70 72 20 2a 70 44 75 70 20 3d 20 73 71   Expr *pDup = sq
4660: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61  lite3ExprDup(pPa
4670: 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20  rse->db, pExpr, 
4680: 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 53 75  0);.      p->pSu
4690: 62 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  b = sqlite3ExprL
46a0: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
46b0: 2c 20 70 2d 3e 70 53 75 62 2c 20 70 44 75 70 29  , p->pSub, pDup)
46c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  ;.      if( p->p
46d0: 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 61  Sub ){.        a
46e0: 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50 72  ssert( ExprHasPr
46f0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
4700: 5f 53 74 61 74 69 63 29 3d 3d 30 20 29 3b 0a 20  _Static)==0 );. 
4710: 20 20 20 20 20 20 20 45 78 70 72 53 65 74 50 72         ExprSetPr
4720: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
4730: 5f 53 74 61 74 69 63 29 3b 0a 20 20 20 20 20 20  _Static);.      
4740: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
4750: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
4760: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
4770: 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74  ExprClearPropert
4780: 79 28 70 45 78 70 72 2c 20 45 50 5f 53 74 61 74  y(pExpr, EP_Stat
4790: 69 63 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ic);.        mem
47a0: 73 65 74 28 70 45 78 70 72 2c 20 30 2c 20 73 69  set(pExpr, 0, si
47b0: 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 0a 20 20  zeof(Expr));..  
47c0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
47d0: 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20  = TK_COLUMN;.   
47e0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
47f0: 75 6d 6e 20 3d 20 70 2d 3e 70 53 75 62 2d 3e 6e  umn = p->pSub->n
4800: 45 78 70 72 2d 31 3b 0a 20 20 20 20 20 20 20 20  Expr-1;.        
4810: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
4820: 70 2d 3e 70 57 69 6e 2d 3e 69 45 70 68 43 73 72  p->pWin->iEphCsr
4830: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
4840: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
4850: 20 20 20 64 65 66 61 75 6c 74 3a 20 2f 2a 20 6e     default: /* n
4860: 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 62 72  o-op */.      br
4870: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  eak;.  }..  retu
4880: 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
4890: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  .}.static int se
48a0: 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74  lectWindowRewrit
48b0: 65 53 65 6c 65 63 74 43 62 28 57 61 6c 6b 65 72  eSelectCb(Walker
48c0: 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
48d0: 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 72  t *pSelect){.  r
48e0: 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
48f0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61  .}.../*.** Itera
4900: 74 65 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  te through each 
4910: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 65 78  expression in ex
4920: 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 70 45  pression-list pE
4930: 4c 69 73 74 2e 20 46 6f 72 20 65 61 63 68 3a 0a  List. For each:.
4940: 2a 2a 0a 2a 2a 20 20 20 2a 20 54 4b 5f 43 4f 4c  **.**   * TK_COL
4950: 55 4d 4e 2c 0a 2a 2a 20 20 20 2a 20 61 67 67 72  UMN,.**   * aggr
4960: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20  egate function, 
4970: 6f 72 0a 2a 2a 20 20 20 2a 20 77 69 6e 64 6f 77  or.**   * window
4980: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 61   function with a
4990: 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 74   Window object t
49a0: 68 61 74 20 69 73 20 6e 6f 74 20 61 20 6d 65 6d  hat is not a mem
49b0: 62 65 72 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20  ber of the .**  
49c0: 20 20 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 70     linked list p
49d0: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
49e0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 28 70 57  ond argument (pW
49f0: 69 6e 29 0a 2a 2a 0a 2a 2a 20 41 70 70 65 6e 64  in).**.** Append
4a00: 20 74 68 65 20 6e 6f 64 65 20 74 6f 20 6f 75 74   the node to out
4a10: 70 75 74 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c  put expression-l
4a20: 69 73 74 20 28 2a 70 70 53 75 62 29 2e 20 41 6e  ist (*ppSub). An
4a30: 64 20 72 65 70 6c 61 63 65 20 69 74 0a 2a 2a 20  d replace it.** 
4a40: 77 69 74 68 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e  with a TK_COLUMN
4a50: 20 74 68 61 74 20 72 65 61 64 73 20 74 68 65 20   that reads the 
4a60: 28 4e 2d 31 29 74 68 20 65 6c 65 6d 65 6e 74 20  (N-1)th element 
4a70: 6f 66 20 74 61 62 6c 65 20 0a 2a 2a 20 70 57 69  of table .** pWi
4a80: 6e 2d 3e 69 45 70 68 43 73 72 2c 20 77 68 65 72  n->iEphCsr, wher
4a90: 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e N is the numbe
4aa0: 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e  r of elements in
4ab0: 20 28 2a 70 70 53 75 62 29 20 61 66 74 65 72 0a   (*ppSub) after.
4ac0: 2a 2a 20 61 70 70 65 6e 64 69 6e 67 20 74 68 65  ** appending the
4ad0: 20 6e 65 77 20 6f 6e 65 2e 0a 2a 2f 0a 73 74 61   new one..*/.sta
4ae0: 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 57 69  tic int selectWi
4af0: 6e 64 6f 77 52 65 77 72 69 74 65 45 4c 69 73 74  ndowRewriteEList
4b00: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
4b10: 65 2c 20 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57  e, .  Window *pW
4b20: 69 6e 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  in,.  ExprList *
4b30: 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  pEList,         
4b40: 20 20 20 20 20 20 2f 2a 20 52 65 77 72 69 74 65        /* Rewrite
4b50: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
4b60: 74 68 69 73 20 6c 69 73 74 20 2a 2f 0a 20 20 45  this list */.  E
4b70: 78 70 72 4c 69 73 74 20 2a 2a 70 70 53 75 62 20  xprList **ppSub 
4b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4b90: 2a 20 49 4e 2f 4f 55 54 3a 20 53 75 62 2d 73 65  * IN/OUT: Sub-se
4ba0: 6c 65 63 74 20 65 78 70 72 65 73 73 69 6f 6e 2d  lect expression-
4bb0: 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c  list */.){.  Wal
4bc0: 6b 65 72 20 73 57 61 6c 6b 65 72 3b 0a 20 20 57  ker sWalker;.  W
4bd0: 69 6e 64 6f 77 52 65 77 72 69 74 65 20 73 52 65  indowRewrite sRe
4be0: 77 72 69 74 65 3b 0a 20 20 69 6e 74 20 72 63 3b  write;.  int rc;
4bf0: 0a 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 61 6c  ..  memset(&sWal
4c00: 6b 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57  ker, 0, sizeof(W
4c10: 61 6c 6b 65 72 29 29 3b 0a 20 20 6d 65 6d 73 65  alker));.  memse
4c20: 74 28 26 73 52 65 77 72 69 74 65 2c 20 30 2c 20  t(&sRewrite, 0, 
4c30: 73 69 7a 65 6f 66 28 57 69 6e 64 6f 77 52 65 77  sizeof(WindowRew
4c40: 72 69 74 65 29 29 3b 0a 0a 20 20 73 52 65 77 72  rite));..  sRewr
4c50: 69 74 65 2e 70 53 75 62 20 3d 20 2a 70 70 53 75  ite.pSub = *ppSu
4c60: 62 3b 0a 20 20 73 52 65 77 72 69 74 65 2e 70 57  b;.  sRewrite.pW
4c70: 69 6e 20 3d 20 70 57 69 6e 3b 0a 0a 20 20 73 57  in = pWin;..  sW
4c80: 61 6c 6b 65 72 2e 70 50 61 72 73 65 20 3d 20 70  alker.pParse = p
4c90: 50 61 72 73 65 3b 0a 20 20 73 57 61 6c 6b 65 72  Parse;.  sWalker
4ca0: 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
4cb0: 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77   selectWindowRew
4cc0: 72 69 74 65 45 78 70 72 43 62 3b 0a 20 20 73 57  riteExprCb;.  sW
4cd0: 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c  alker.xSelectCal
4ce0: 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 57 69  lback = selectWi
4cf0: 6e 64 6f 77 52 65 77 72 69 74 65 53 65 6c 65 63  ndowRewriteSelec
4d00: 74 43 62 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 75  tCb;.  sWalker.u
4d10: 2e 70 52 65 77 72 69 74 65 20 3d 20 26 73 52 65  .pRewrite = &sRe
4d20: 77 72 69 74 65 3b 0a 0a 20 20 72 63 20 3d 20 73  write;..  rc = s
4d30: 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69  qlite3WalkExprLi
4d40: 73 74 28 26 73 57 61 6c 6b 65 72 2c 20 70 45 4c  st(&sWalker, pEL
4d50: 69 73 74 29 3b 0a 0a 20 20 2a 70 70 53 75 62 20  ist);..  *ppSub 
4d60: 3d 20 73 52 65 77 72 69 74 65 2e 70 53 75 62 3b  = sRewrite.pSub;
4d70: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
4d80: 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
4d90: 63 6f 70 79 20 6f 66 20 65 61 63 68 20 65 78 70  copy of each exp
4da0: 72 65 73 73 69 6f 6e 20 69 6e 20 65 78 70 72 65  ression in expre
4db0: 73 73 69 6f 6e 2d 6c 69 73 74 20 70 41 70 70 65  ssion-list pAppe
4dc0: 6e 64 20 74 6f 0a 2a 2a 20 65 78 70 72 65 73 73  nd to.** express
4dd0: 69 6f 6e 20 6c 69 73 74 20 70 4c 69 73 74 2e 20  ion list pList. 
4de0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
4df0: 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20 6c   to the result l
4e00: 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45  ist..*/.static E
4e10: 78 70 72 4c 69 73 74 20 2a 65 78 70 72 4c 69 73  xprList *exprLis
4e20: 74 41 70 70 65 6e 64 4c 69 73 74 28 0a 20 20 50  tAppendList(.  P
4e30: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
4e40: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
4e50: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
4e60: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
4e70: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
4e80: 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70 65 6e  o which to appen
4e90: 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  d. Might be NULL
4ea0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
4eb0: 70 41 70 70 65 6e 64 20 20 20 20 20 20 20 2f 2a  pAppend       /*
4ec0: 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20   List of values 
4ed0: 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74  to append. Might
4ee0: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   be NULL */.){. 
4ef0: 20 69 66 28 20 70 41 70 70 65 6e 64 20 29 7b 0a   if( pAppend ){.
4f00: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
4f10: 6e 74 20 6e 49 6e 69 74 20 3d 20 70 4c 69 73 74  nt nInit = pList
4f20: 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20   ? pList->nExpr 
4f30: 3a 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  : 0;.    for(i=0
4f40: 3b 20 69 3c 70 41 70 70 65 6e 64 2d 3e 6e 45 78  ; i<pAppend->nEx
4f50: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
4f60: 45 78 70 72 20 2a 70 44 75 70 20 3d 20 73 71 6c  Expr *pDup = sql
4f70: 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72  ite3ExprDup(pPar
4f80: 73 65 2d 3e 64 62 2c 20 70 41 70 70 65 6e 64 2d  se->db, pAppend-
4f90: 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 30 29 3b  >a[i].pExpr, 0);
4fa0: 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 73  .      pList = s
4fb0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
4fc0: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4c 69  pend(pParse, pLi
4fd0: 73 74 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20  st, pDup);.     
4fe0: 20 69 66 28 20 70 4c 69 73 74 20 29 20 70 4c 69   if( pList ) pLi
4ff0: 73 74 2d 3e 61 5b 6e 49 6e 69 74 2b 69 5d 2e 73  st->a[nInit+i].s
5000: 6f 72 74 4f 72 64 65 72 20 3d 20 70 41 70 70 65  ortOrder = pAppe
5010: 6e 64 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  nd->a[i].sortOrd
5020: 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  er;.    }.  }.  
5030: 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
5040: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 45  ./*.** If the SE
5050: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70  LECT statement p
5060: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
5070: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 64 6f 65  ond argument doe
5080: 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 0a 2a 2a 20  s not invoke.** 
5090: 61 6e 79 20 53 51 4c 20 77 69 6e 64 6f 77 20 66  any SQL window f
50a0: 75 6e 63 74 69 6f 6e 73 2c 20 74 68 69 73 20 66  unctions, this f
50b0: 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
50c0: 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  op. Otherwise, i
50d0: 74 20 0a 2a 2a 20 72 65 77 72 69 74 65 73 20 74  t .** rewrites t
50e0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
50f0: 65 6e 74 20 73 6f 20 74 68 61 74 20 77 69 6e 64  ent so that wind
5100: 6f 77 20 66 75 6e 63 74 69 6f 6e 20 78 53 74 65  ow function xSte
5110: 70 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 61  p functions.** a
5120: 72 65 20 69 6e 76 6f 6b 65 64 20 69 6e 20 74 68  re invoked in th
5130: 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72 20  e correct order 
5140: 61 73 20 64 65 73 63 72 69 62 65 64 20 75 6e 64  as described und
5150: 65 72 20 22 53 45 4c 45 43 54 20 52 45 57 52 49  er "SELECT REWRI
5160: 54 49 4e 47 22 0a 2a 2a 20 61 74 20 74 68 65 20  TING".** at the 
5170: 74 6f 70 20 6f 66 20 74 68 69 73 20 66 69 6c 65  top of this file
5180: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5190: 57 69 6e 64 6f 77 52 65 77 72 69 74 65 28 50 61  WindowRewrite(Pa
51a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
51b0: 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ect *p){.  int r
51c0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
51d0: 20 69 66 28 20 70 2d 3e 70 57 69 6e 20 29 7b 0a   if( p->pWin ){.
51e0: 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71      Vdbe *v = sq
51f0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
5200: 72 73 65 29 3b 0a 20 20 20 20 69 6e 74 20 69 3b  rse);.    int i;
5210: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
5220: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
5230: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20     Select *pSub 
5240: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
5250: 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79   /* The subquery
5260: 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74 20   */.    SrcList 
5270: 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b  *pSrc = p->pSrc;
5280: 0a 20 20 20 20 45 78 70 72 20 2a 70 57 68 65 72  .    Expr *pWher
5290: 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20  e = p->pWhere;. 
52a0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72     ExprList *pGr
52b0: 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
52c0: 70 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  pBy;.    Expr *p
52d0: 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76  Having = p->pHav
52e0: 69 6e 67 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  ing;.    ExprLis
52f0: 74 20 2a 70 53 6f 72 74 20 3d 20 30 3b 0a 0a 20  t *pSort = 0;.. 
5300: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 53 75     ExprList *pSu
5310: 62 6c 69 73 74 20 3d 20 30 3b 20 20 20 20 20 20  blist = 0;      
5320: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6c   /* Expression l
5330: 69 73 74 20 66 6f 72 20 73 75 62 2d 71 75 65 72  ist for sub-quer
5340: 79 20 2a 2f 0a 20 20 20 20 57 69 6e 64 6f 77 20  y */.    Window 
5350: 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e  *pMWin = p->pWin
5360: 3b 20 20 20 20 20 20 2f 2a 20 4d 61 73 74 65 72  ;      /* Master
5370: 20 77 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 2a   window object *
5380: 2f 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a 70 57  /.    Window *pW
5390: 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  in;             
53a0: 20 20 20 20 2f 2a 20 57 69 6e 64 6f 77 20 6f 62      /* Window ob
53b0: 6a 65 63 74 20 69 74 65 72 61 74 6f 72 20 2a 2f  ject iterator */
53c0: 0a 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20  ..    p->pSrc = 
53d0: 30 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65  0;.    p->pWhere
53e0: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 47 72   = 0;.    p->pGr
53f0: 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20 20 20 70  oupBy = 0;.    p
5400: 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a 0a  ->pHaving = 0;..
5410: 20 20 20 20 2f 2a 20 41 73 73 69 67 6e 20 61 20      /* Assign a 
5420: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
5430: 72 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20  r the ephemeral 
5440: 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20 62 75  table used to bu
5450: 66 66 65 72 20 72 6f 77 73 2e 0a 20 20 20 20 2a  ffer rows..    *
5460: 2a 20 54 68 65 20 4f 70 65 6e 45 70 68 65 6d 65  * The OpenEpheme
5470: 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ral instruction 
5480: 69 73 20 63 6f 64 65 64 20 6c 61 74 65 72 2c 20  is coded later, 
5490: 61 66 74 65 72 20 69 74 20 69 73 20 6b 6e 6f 77  after it is know
54a0: 6e 20 68 6f 77 0a 20 20 20 20 2a 2a 20 6d 61 6e  n how.    ** man
54b0: 79 20 63 6f 6c 75 6d 6e 73 20 74 68 65 20 74 61  y columns the ta
54c0: 62 6c 65 20 77 69 6c 6c 20 68 61 76 65 2e 20 20  ble will have.  
54d0: 2a 2f 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 69 45  */.    pMWin->iE
54e0: 70 68 43 73 72 20 3d 20 70 50 61 72 73 65 2d 3e  phCsr = pParse->
54f0: 6e 54 61 62 2b 2b 3b 0a 0a 20 20 20 20 72 63 20  nTab++;..    rc 
5500: 3d 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65  = selectWindowRe
5510: 77 72 69 74 65 45 4c 69 73 74 28 70 50 61 72 73  writeEList(pPars
5520: 65 2c 20 70 4d 57 69 6e 2c 20 70 2d 3e 70 45 4c  e, pMWin, p->pEL
5530: 69 73 74 2c 20 26 70 53 75 62 6c 69 73 74 29 3b  ist, &pSublist);
5540: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
5550: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20  turn rc;.    rc 
5560: 3d 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65  = selectWindowRe
5570: 77 72 69 74 65 45 4c 69 73 74 28 70 50 61 72 73  writeEList(pPars
5580: 65 2c 20 70 4d 57 69 6e 2c 20 70 2d 3e 70 4f 72  e, pMWin, p->pOr
5590: 64 65 72 42 79 2c 20 26 70 53 75 62 6c 69 73 74  derBy, &pSublist
55a0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
55b0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
55c0: 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c  MWin->nBufferCol
55d0: 20 3d 20 28 70 53 75 62 6c 69 73 74 20 3f 20 70   = (pSublist ? p
55e0: 53 75 62 6c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  Sublist->nExpr :
55f0: 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65   0);..    /* Cre
5600: 61 74 65 20 74 68 65 20 4f 52 44 45 52 20 42 59  ate the ORDER BY
5610: 20 63 6c 61 75 73 65 20 66 6f 72 20 74 68 65 20   clause for the 
5620: 73 75 62 2d 73 65 6c 65 63 74 2e 20 54 68 69 73  sub-select. This
5630: 20 69 73 20 74 68 65 20 63 6f 6e 63 61 74 65 6e   is the concaten
5640: 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6f 66 20  ation.    ** of 
5650: 74 68 65 20 77 69 6e 64 6f 77 20 50 41 52 54 49  the window PARTI
5660: 54 49 4f 4e 20 61 6e 64 20 4f 52 44 45 52 20 42  TION and ORDER B
5670: 59 20 63 6c 61 75 73 65 73 2e 20 41 70 70 65 6e  Y clauses. Appen
5680: 64 20 74 68 65 20 73 61 6d 65 20 0a 20 20 20 20  d the same .    
5690: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  ** expressions t
56a0: 6f 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74  o the sub-select
56b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
56c0: 2e 20 54 68 65 79 20 61 72 65 20 72 65 71 75 69  . They are requi
56d0: 72 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 66 69  red to.    ** fi
56e0: 67 75 72 65 20 6f 75 74 20 77 68 65 72 65 20 62  gure out where b
56f0: 6f 75 6e 64 61 72 69 65 73 20 66 6f 72 20 70 61  oundaries for pa
5700: 72 74 69 74 69 6f 6e 73 20 61 6e 64 20 73 65 74  rtitions and set
5710: 73 20 6f 66 20 70 65 65 72 20 72 6f 77 73 2e 20  s of peer rows. 
5720: 20 2a 2f 0a 20 20 20 20 70 53 6f 72 74 20 3d 20   */.    pSort = 
5730: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
5740: 75 70 28 64 62 2c 20 70 4d 57 69 6e 2d 3e 70 50  up(db, pMWin->pP
5750: 61 72 74 69 74 69 6f 6e 2c 20 30 29 3b 0a 20 20  artition, 0);.  
5760: 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70 4f 72    if( pMWin->pOr
5770: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 70  derBy ){.      p
5780: 53 6f 72 74 20 3d 20 65 78 70 72 4c 69 73 74 41  Sort = exprListA
5790: 70 70 65 6e 64 4c 69 73 74 28 70 50 61 72 73 65  ppendList(pParse
57a0: 2c 20 70 53 6f 72 74 2c 20 70 4d 57 69 6e 2d 3e  , pSort, pMWin->
57b0: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 7d  pOrderBy);.    }
57c0: 0a 20 20 20 20 70 53 75 62 6c 69 73 74 20 3d 20  .    pSublist = 
57d0: 65 78 70 72 4c 69 73 74 41 70 70 65 6e 64 4c 69  exprListAppendLi
57e0: 73 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 6c  st(pParse, pSubl
57f0: 69 73 74 2c 20 70 53 6f 72 74 29 3b 0a 0a 20 20  ist, pSort);..  
5800: 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
5810: 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64  arguments passed
5820: 20 74 6f 20 65 61 63 68 20 77 69 6e 64 6f 77 20   to each window 
5830: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 74 68 65 0a  function to the.
5840: 20 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63      ** sub-selec
5850: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  t expression lis
5860: 74 2e 20 41 6c 73 6f 20 61 6c 6c 6f 63 61 74 65  t. Also allocate
5870: 20 74 77 6f 20 72 65 67 69 73 74 65 72 73 20 66   two registers f
5880: 6f 72 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 77  or each.    ** w
5890: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 2d  indow function -
58a0: 20 6f 6e 65 20 66 6f 72 20 74 68 65 20 61 63 63   one for the acc
58b0: 75 6d 75 6c 61 74 6f 72 2c 20 61 6e 6f 74 68 65  umulator, anothe
58c0: 72 20 66 6f 72 20 69 6e 74 65 72 69 6d 0a 20 20  r for interim.  
58d0: 20 20 2a 2a 20 72 65 73 75 6c 74 73 2e 20 20 2a    ** results.  *
58e0: 2f 0a 20 20 20 20 66 6f 72 28 70 57 69 6e 3d 70  /.    for(pWin=p
58f0: 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e  MWin; pWin; pWin
5900: 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29  =pWin->pNextWin)
5910: 7b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 69 41  {.      pWin->iA
5920: 72 67 43 6f 6c 20 3d 20 28 70 53 75 62 6c 69 73  rgCol = (pSublis
5930: 74 20 3f 20 70 53 75 62 6c 69 73 74 2d 3e 6e 45  t ? pSublist->nE
5940: 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  xpr : 0);.      
5950: 70 53 75 62 6c 69 73 74 20 3d 20 65 78 70 72 4c  pSublist = exprL
5960: 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28 70 50  istAppendList(pP
5970: 61 72 73 65 2c 20 70 53 75 62 6c 69 73 74 2c 20  arse, pSublist, 
5980: 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e  pWin->pOwner->x.
5990: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 69 66  pList);.      if
59a0: 28 20 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72 20  ( pWin->pFilter 
59b0: 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
59c0: 2a 70 46 69 6c 74 65 72 20 3d 20 73 71 6c 69 74  *pFilter = sqlit
59d0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 57  e3ExprDup(db, pW
59e0: 69 6e 2d 3e 70 46 69 6c 74 65 72 2c 20 30 29 3b  in->pFilter, 0);
59f0: 0a 20 20 20 20 20 20 20 20 70 53 75 62 6c 69 73  .        pSublis
5a00: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
5a10: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
5a20: 2c 20 70 53 75 62 6c 69 73 74 2c 20 70 46 69 6c  , pSublist, pFil
5a30: 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
5a40: 20 20 20 20 70 57 69 6e 2d 3e 72 65 67 41 63 63      pWin->regAcc
5a50: 75 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  um = ++pParse->n
5a60: 4d 65 6d 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d  Mem;.      pWin-
5a70: 3e 72 65 67 52 65 73 75 6c 74 20 3d 20 2b 2b 70  >regResult = ++p
5a80: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
5a90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5aa0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
5ab0: 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63   0, pWin->regAcc
5ac0: 75 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  um);.    }..    
5ad0: 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33 53 65  pSub = sqlite3Se
5ae0: 6c 65 63 74 4e 65 77 28 0a 20 20 20 20 20 20 20  lectNew(.       
5af0: 20 70 50 61 72 73 65 2c 20 70 53 75 62 6c 69 73   pParse, pSublis
5b00: 74 2c 20 70 53 72 63 2c 20 70 57 68 65 72 65 2c  t, pSrc, pWhere,
5b10: 20 70 47 72 6f 75 70 42 79 2c 20 70 48 61 76 69   pGroupBy, pHavi
5b20: 6e 67 2c 20 70 53 6f 72 74 2c 20 30 2c 20 30 0a  ng, pSort, 0, 0.
5b30: 20 20 20 20 29 3b 0a 20 20 20 20 70 2d 3e 70 53      );.    p->pS
5b40: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
5b50: 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20 30 2c  istAppend(db, 0,
5b60: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
5b70: 70 2d 3e 70 53 72 63 20 29 7b 0a 20 20 20 20 20  p->pSrc ){.     
5b80: 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 20 20 20   int iTab;.     
5b90: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
5ba0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70   = 0;.      p->p
5bb0: 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
5bc0: 74 20 3d 20 70 53 75 62 3b 0a 20 20 20 20 20 20  t = pSub;.      
5bd0: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
5be0: 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
5bf0: 73 65 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20  se, p->pSrc);.  
5c00: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
5c10: 78 70 61 6e 64 53 75 62 71 75 65 72 79 28 70 50  xpandSubquery(pP
5c20: 61 72 73 65 2c 20 26 70 2d 3e 70 53 72 63 2d 3e  arse, &p->pSrc->
5c30: 61 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  a[0]) ){.       
5c40: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
5c50: 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EM;.      }else{
5c60: 0a 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 73  .        pSub->s
5c70: 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78  elFlags |= SF_Ex
5c80: 70 61 6e 64 65 64 3b 0a 20 20 20 20 20 20 20 20  panded;.        
5c90: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e  p->selFlags &= ~
5ca0: 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20  SF_Aggregate;.  
5cb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
5cc0: 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c 20  ectPrep(pParse, 
5cd0: 70 53 75 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  pSub, 0);.      
5ce0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  }.    }..    sql
5cf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5d00: 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
5d10: 61 6c 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43  al, pMWin->iEphC
5d20: 73 72 2c 20 70 53 75 62 6c 69 73 74 2d 3e 6e 45  sr, pSublist->nE
5d30: 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  xpr);.  }..  ret
5d40: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5d50: 20 46 72 65 65 20 74 68 65 20 57 69 6e 64 6f 77   Free the Window
5d60: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
5d70: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
5d80: 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ument..*/.void s
5d90: 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65  qlite3WindowDele
5da0: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
5db0: 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 69 66  Window *p){.  if
5dc0: 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( p ){.    sqlit
5dd0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
5de0: 20 70 2d 3e 70 46 69 6c 74 65 72 29 3b 0a 20 20   p->pFilter);.  
5df0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
5e00: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
5e10: 50 61 72 74 69 74 69 6f 6e 29 3b 0a 20 20 20 20  Partition);.    
5e20: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
5e30: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
5e40: 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71 6c 69  derBy);.    sqli
5e50: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
5e60: 2c 20 70 2d 3e 70 45 6e 64 29 3b 0a 20 20 20 20  , p->pEnd);.    
5e70: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
5e80: 65 28 64 62 2c 20 70 2d 3e 70 53 74 61 72 74 29  e(db, p->pStart)
5e90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
5ea0: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4e 61 6d 65  ree(db, p->zName
5eb0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
5ec0: 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d  Free(db, p);.  }
5ed0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
5ee0: 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  he linked list o
5ef0: 66 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 73  f Window objects
5f00: 20 73 74 61 72 74 69 6e 67 20 61 74 20 74 68 65   starting at the
5f10: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
5f20: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5f30: 33 57 69 6e 64 6f 77 4c 69 73 74 44 65 6c 65 74  3WindowListDelet
5f40: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
5f50: 69 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 77 68 69  indow *p){.  whi
5f60: 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 57 69 6e  le( p ){.    Win
5f70: 64 6f 77 20 2a 70 4e 65 78 74 20 3d 20 70 2d 3e  dow *pNext = p->
5f80: 70 4e 65 78 74 57 69 6e 3b 0a 20 20 20 20 73 71  pNextWin;.    sq
5f90: 6c 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65 74  lite3WindowDelet
5fa0: 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 70 20  e(db, p);.    p 
5fb0: 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 7d 0a 0a  = pNext;.  }.}..
5fc0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
5fd0: 6e 64 20 72 65 74 75 72 6e 20 61 20 6e 65 77 20  nd return a new 
5fe0: 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 2e 0a 2a  Window object..*
5ff0: 2f 0a 57 69 6e 64 6f 77 20 2a 73 71 6c 69 74 65  /.Window *sqlite
6000: 33 57 69 6e 64 6f 77 41 6c 6c 6f 63 28 0a 20 20  3WindowAlloc(.  
6010: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a  Parse *pParse, .
6020: 20 20 69 6e 74 20 65 54 79 70 65 2c 0a 20 20 69    int eType,.  i
6030: 6e 74 20 65 53 74 61 72 74 2c 20 45 78 70 72 20  nt eStart, Expr 
6040: 2a 70 53 74 61 72 74 2c 0a 20 20 69 6e 74 20 65  *pStart,.  int e
6050: 45 6e 64 2c 20 45 78 70 72 20 2a 70 45 6e 64 0a  End, Expr *pEnd.
6060: 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69  ){.  Window *pWi
6070: 6e 20 3d 20 28 57 69 6e 64 6f 77 2a 29 73 71 6c  n = (Window*)sql
6080: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
6090: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a  (pParse->db, siz
60a0: 65 6f 66 28 57 69 6e 64 6f 77 29 29 3b 0a 0a 20  eof(Window));.. 
60b0: 20 69 66 28 20 70 57 69 6e 20 29 7b 0a 20 20 20   if( pWin ){.   
60c0: 20 70 57 69 6e 2d 3e 65 54 79 70 65 20 3d 20 65   pWin->eType = e
60d0: 54 79 70 65 3b 0a 20 20 20 20 70 57 69 6e 2d 3e  Type;.    pWin->
60e0: 65 53 74 61 72 74 20 3d 20 65 53 74 61 72 74 3b  eStart = eStart;
60f0: 0a 20 20 20 20 70 57 69 6e 2d 3e 65 45 6e 64 20  .    pWin->eEnd 
6100: 3d 20 65 45 6e 64 3b 0a 20 20 20 20 70 57 69 6e  = eEnd;.    pWin
6110: 2d 3e 70 45 6e 64 20 3d 20 70 45 6e 64 3b 0a 20  ->pEnd = pEnd;. 
6120: 20 20 20 70 57 69 6e 2d 3e 70 53 74 61 72 74 20     pWin->pStart 
6130: 3d 20 70 53 74 61 72 74 3b 0a 20 20 7d 65 6c 73  = pStart;.  }els
6140: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  e{.    sqlite3Ex
6150: 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  prDelete(pParse-
6160: 3e 64 62 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20  >db, pEnd);.    
6170: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
6180: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53  e(pParse->db, pS
6190: 74 61 72 74 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  tart);.  }..  re
61a0: 74 75 72 6e 20 70 57 69 6e 3b 0a 7d 0a 0a 2f 2a  turn pWin;.}../*
61b0: 0a 2a 2a 20 41 74 74 61 63 68 20 77 69 6e 64 6f  .** Attach windo
61c0: 77 20 6f 62 6a 65 63 74 20 70 57 69 6e 20 74 6f  w object pWin to
61d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 2e 0a 2a   expression p..*
61e0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69  /.void sqlite3Wi
61f0: 6e 64 6f 77 41 74 74 61 63 68 28 50 61 72 73 65  ndowAttach(Parse
6200: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
6210: 70 2c 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 29  p, Window *pWin)
6220: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
6230: 20 70 2d 3e 70 57 69 6e 20 3d 20 70 57 69 6e 3b   p->pWin = pWin;
6240: 0a 20 20 20 20 69 66 28 20 70 57 69 6e 20 29 20  .    if( pWin ) 
6250: 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 20 3d 20 70  pWin->pOwner = p
6260: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
6270: 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65  qlite3WindowDele
6280: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
6290: 57 69 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Win);.  }.}../*.
62a0: 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 74  ** Return 0 if t
62b0: 68 65 20 74 77 6f 20 77 69 6e 64 6f 77 20 6f 62  he two window ob
62c0: 6a 65 63 74 73 20 61 72 65 20 69 64 65 6e 74 69  jects are identi
62d0: 63 61 6c 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  cal, or non-zero
62e0: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 20 49   otherwise..** I
62f0: 64 65 6e 74 69 63 61 6c 20 77 69 6e 64 6f 77 20  dentical window 
6300: 6f 62 6a 65 63 74 73 20 63 61 6e 20 62 65 20 70  objects can be p
6310: 72 6f 63 65 73 73 65 64 20 69 6e 20 61 20 73 69  rocessed in a si
6320: 6e 67 6c 65 20 73 63 61 6e 2e 0a 2a 2f 0a 69 6e  ngle scan..*/.in
6330: 74 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43  t sqlite3WindowC
6340: 6f 6d 70 61 72 65 28 50 61 72 73 65 20 2a 70 50  ompare(Parse *pP
6350: 61 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70 31  arse, Window *p1
6360: 2c 20 57 69 6e 64 6f 77 20 2a 70 32 29 7b 0a 20  , Window *p2){. 
6370: 20 69 66 28 20 70 31 2d 3e 65 54 79 70 65 21 3d   if( p1->eType!=
6380: 70 32 2d 3e 65 54 79 70 65 20 29 20 72 65 74 75  p2->eType ) retu
6390: 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 31 2d 3e  rn 1;.  if( p1->
63a0: 65 53 74 61 72 74 21 3d 70 32 2d 3e 65 53 74 61  eStart!=p2->eSta
63b0: 72 74 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  rt ) return 1;. 
63c0: 20 69 66 28 20 70 31 2d 3e 65 45 6e 64 21 3d 70   if( p1->eEnd!=p
63d0: 32 2d 3e 65 45 6e 64 20 29 20 72 65 74 75 72 6e  2->eEnd ) return
63e0: 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   1;.  if( sqlite
63f0: 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61  3ExprCompare(pPa
6400: 72 73 65 2c 20 70 31 2d 3e 70 53 74 61 72 74 2c  rse, p1->pStart,
6410: 20 70 32 2d 3e 70 53 74 61 72 74 2c 20 2d 31 29   p2->pStart, -1)
6420: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
6430: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
6440: 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 31  mpare(pParse, p1
6450: 2d 3e 70 45 6e 64 2c 20 70 32 2d 3e 70 45 6e 64  ->pEnd, p2->pEnd
6460: 2c 20 2d 31 29 20 29 20 72 65 74 75 72 6e 20 31  , -1) ) return 1
6470: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  ;.  if( sqlite3E
6480: 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70  xprListCompare(p
6490: 31 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20 70  1->pPartition, p
64a0: 32 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20 2d  2->pPartition, -
64b0: 31 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  1) ) return 1;. 
64c0: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
64d0: 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 31 2d 3e  ListCompare(p1->
64e0: 70 4f 72 64 65 72 42 79 2c 20 70 32 2d 3e 70 4f  pOrderBy, p2->pO
64f0: 72 64 65 72 42 79 2c 20 2d 31 29 20 29 20 72 65  rderBy, -1) ) re
6500: 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e  turn 1;.  return
6510: 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68   0;.}.../*.** Th
6520: 69 73 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  is is called by 
6530: 63 6f 64 65 20 69 6e 20 73 65 6c 65 63 74 2e 63  code in select.c
6540: 20 62 65 66 6f 72 65 20 69 74 20 63 61 6c 6c 73   before it calls
6550: 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
6560: 69 6e 28 29 0a 2a 2a 20 74 6f 20 62 65 67 69 6e  in().** to begin
6570: 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75   iterating throu
6580: 67 68 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  gh the sub-query
6590: 20 72 65 73 75 6c 74 73 2e 20 49 74 20 69 73 20   results. It is 
65a0: 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  used to allocate
65b0: 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  .** and initiali
65c0: 7a 65 20 72 65 67 69 73 74 65 72 73 20 61 6e 64  ze registers and
65d0: 20 63 75 72 73 6f 72 73 20 75 73 65 64 20 62 79   cursors used by
65e0: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f   sqlite3WindowCo
65f0: 64 65 53 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69  deStep()..*/.voi
6600: 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43  d sqlite3WindowC
6610: 6f 64 65 49 6e 69 74 28 50 61 72 73 65 20 2a 70  odeInit(Parse *p
6620: 50 61 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70  Parse, Window *p
6630: 4d 57 69 6e 29 7b 0a 20 20 57 69 6e 64 6f 77 20  MWin){.  Window 
6640: 2a 70 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76  *pWin;.  Vdbe *v
6650: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
6660: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  e(pParse);.  int
6670: 20 6e 50 61 72 74 20 3d 20 28 70 4d 57 69 6e 2d   nPart = (pMWin-
6680: 3e 70 50 61 72 74 69 74 69 6f 6e 20 3f 20 70 4d  >pPartition ? pM
6690: 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2d  Win->pPartition-
66a0: 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 6e  >nExpr : 0);.  n
66b0: 50 61 72 74 20 2b 3d 20 28 70 4d 57 69 6e 2d 3e  Part += (pMWin->
66c0: 70 4f 72 64 65 72 42 79 20 3f 20 70 4d 57 69 6e  pOrderBy ? pMWin
66d0: 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
66e0: 72 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 6e 50  r : 0);.  if( nP
66f0: 61 72 74 20 29 7b 0a 20 20 20 20 70 4d 57 69 6e  art ){.    pMWin
6700: 2d 3e 72 65 67 50 61 72 74 20 3d 20 70 50 61 72  ->regPart = pPar
6710: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
6720: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
6730: 6e 50 61 72 74 3b 0a 20 20 20 20 73 71 6c 69 74  nPart;.    sqlit
6740: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6750: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 4d 57 69  OP_Null, 0, pMWi
6760: 6e 2d 3e 72 65 67 50 61 72 74 2c 20 70 4d 57 69  n->regPart, pMWi
6770: 6e 2d 3e 72 65 67 50 61 72 74 2b 6e 50 61 72 74  n->regPart+nPart
6780: 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28  -1);.  }..  for(
6790: 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e  pWin=pMWin; pWin
67a0: 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65  ; pWin=pWin->pNe
67b0: 78 74 57 69 6e 29 7b 0a 20 20 20 20 46 75 6e 63  xtWin){.    Func
67c0: 44 65 66 20 2a 70 20 3d 20 70 57 69 6e 2d 3e 70  Def *p = pWin->p
67d0: 46 75 6e 63 3b 0a 20 20 20 20 69 66 28 20 28 70  Func;.    if( (p
67e0: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
67f0: 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58  LITE_FUNC_MINMAX
6800: 29 20 26 26 20 70 57 69 6e 2d 3e 65 53 74 61 72  ) && pWin->eStar
6810: 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20  t!=TK_UNBOUNDED 
6820: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
6830: 69 6e 6c 69 6e 65 20 76 65 72 73 69 6f 6e 73 20  inline versions 
6840: 6f 66 20 6d 69 6e 28 29 20 61 6e 64 20 6d 61 78  of min() and max
6850: 28 29 20 72 65 71 75 69 72 65 20 61 20 73 69 6e  () require a sin
6860: 67 6c 65 20 65 70 68 65 6d 65 72 61 6c 0a 20 20  gle ephemeral.  
6870: 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64      ** table and
6880: 20 33 20 72 65 67 69 73 74 65 72 73 2e 20 54 68   3 registers. Th
6890: 65 20 72 65 67 69 73 74 65 72 73 20 61 72 65 20  e registers are 
68a0: 75 73 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  used as follows:
68b0: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
68c0: 2a 2a 20 20 20 72 65 67 41 70 70 2b 30 3a 20 73  **   regApp+0: s
68d0: 6c 6f 74 20 74 6f 20 63 6f 70 79 20 6d 69 6e 28  lot to copy min(
68e0: 29 2f 6d 61 78 28 29 20 61 72 67 75 6d 65 6e 74  )/max() argument
68f0: 20 74 6f 20 66 6f 72 20 4d 61 6b 65 52 65 63 6f   to for MakeReco
6900: 72 64 0a 20 20 20 20 20 20 2a 2a 20 20 20 72 65  rd.      **   re
6910: 67 41 70 70 2b 31 3a 20 69 6e 74 65 67 65 72 20  gApp+1: integer 
6920: 76 61 6c 75 65 20 75 73 65 64 20 74 6f 20 65 6e  value used to en
6930: 73 75 72 65 20 6b 65 79 73 20 61 72 65 20 75 6e  sure keys are un
6940: 69 71 75 65 0a 20 20 20 20 20 20 2a 2a 20 20 20  ique.      **   
6950: 72 65 67 41 70 70 2b 32 3a 20 6f 75 74 70 75 74  regApp+2: output
6960: 20 6f 66 20 4d 61 6b 65 52 65 63 6f 72 64 0a 20   of MakeRecord. 
6970: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45 78       */.      Ex
6980: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
6990: 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e  pWin->pOwner->x.
69a0: 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 4b 65 79  pList;.      Key
69b0: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
69c0: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46   sqlite3KeyInfoF
69d0: 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
69e0: 73 65 2c 20 70 4c 69 73 74 2c 20 30 2c 20 30 29  se, pList, 0, 0)
69f0: 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 63 73  ;.      pWin->cs
6a00: 72 41 70 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rApp = pParse->n
6a10: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 57 69  Tab++;.      pWi
6a20: 6e 2d 3e 72 65 67 41 70 70 20 3d 20 70 50 61 72  n->regApp = pPar
6a30: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
6a40: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
6a50: 3d 20 33 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 3;.      if( p
6a60: 4b 65 79 49 6e 66 6f 20 26 26 20 70 57 69 6e 2d  KeyInfo && pWin-
6a70: 3e 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 5b 31 5d  >pFunc->zName[1]
6a80: 3d 3d 27 69 27 20 29 7b 0a 20 20 20 20 20 20 20  =='i' ){.       
6a90: 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
6aa0: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d  o->aSortOrder[0]
6ab0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
6ac0: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
6ad0: 64 65 72 5b 30 5d 20 3d 20 31 3b 0a 20 20 20 20  der[0] = 1;.    
6ae0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
6af0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6b00: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
6b10: 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20 32   pWin->csrApp, 2
6b20: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6b30: 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20  VdbeAppendP4(v, 
6b40: 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
6b50: 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 73 71 6c  INFO);.      sql
6b60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
6b70: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
6b80: 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31 29   pWin->regApp+1)
6b90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65  ;.    }.    else
6ba0: 20 69 66 28 20 70 2d 3e 78 53 46 75 6e 63 3d 3d   if( p->xSFunc==
6bb0: 6e 74 68 5f 76 61 6c 75 65 53 74 65 70 46 75 6e  nth_valueStepFun
6bc0: 63 20 7c 7c 20 70 2d 3e 78 53 46 75 6e 63 3d 3d  c || p->xSFunc==
6bd0: 66 69 72 73 74 5f 76 61 6c 75 65 53 74 65 70 46  first_valueStepF
6be0: 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  unc ){.      /* 
6bf0: 41 6c 6c 6f 63 61 74 65 20 74 77 6f 20 72 65 67  Allocate two reg
6c00: 69 73 74 65 72 73 20 61 74 20 70 57 69 6e 2d 3e  isters at pWin->
6c10: 72 65 67 41 70 70 2e 20 54 68 65 73 65 20 77 69  regApp. These wi
6c20: 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 0a 20 20  ll be used to.  
6c30: 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65      ** store the
6c40: 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 69   start and end i
6c50: 6e 64 65 78 20 6f 66 20 74 68 65 20 63 75 72 72  ndex of the curr
6c60: 65 6e 74 20 66 72 61 6d 65 2e 20 20 2a 2f 0a 20  ent frame.  */. 
6c70: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 57       assert( pMW
6c80: 69 6e 2d 3e 69 45 70 68 43 73 72 20 29 3b 0a 20  in->iEphCsr );. 
6c90: 20 20 20 20 20 70 57 69 6e 2d 3e 72 65 67 41 70       pWin->regAp
6ca0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  p = pParse->nMem
6cb0: 2b 31 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e  +1;.      pWin->
6cc0: 63 73 72 41 70 70 20 3d 20 70 50 61 72 73 65 2d  csrApp = pParse-
6cd0: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70  >nTab++;.      p
6ce0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 32  Parse->nMem += 2
6cf0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
6d00: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
6d10: 4f 70 65 6e 44 75 70 2c 20 70 57 69 6e 2d 3e 63  OpenDup, pWin->c
6d20: 73 72 41 70 70 2c 20 70 4d 57 69 6e 2d 3e 69 45  srApp, pMWin->iE
6d30: 70 68 43 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20  phCsr);.    }.  
6d40: 20 20 65 6c 73 65 20 69 66 28 20 70 2d 3e 78 53    else if( p->xS
6d50: 46 75 6e 63 3d 3d 6c 65 61 64 53 74 65 70 46 75  Func==leadStepFu
6d60: 6e 63 20 7c 7c 20 70 2d 3e 78 53 46 75 6e 63 3d  nc || p->xSFunc=
6d70: 3d 6c 61 67 53 74 65 70 46 75 6e 63 20 29 7b 0a  =lagStepFunc ){.
6d80: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
6d90: 57 69 6e 2d 3e 69 45 70 68 43 73 72 20 29 3b 0a  Win->iEphCsr );.
6da0: 20 20 20 20 20 20 70 57 69 6e 2d 3e 63 73 72 41        pWin->csrA
6db0: 70 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  pp = pParse->nTa
6dc0: 62 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  b++;.      sqlit
6dd0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6de0: 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70 57 69 6e  OP_OpenDup, pWin
6df0: 2d 3e 63 73 72 41 70 70 2c 20 70 4d 57 69 6e 2d  ->csrApp, pMWin-
6e00: 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 20 20 7d  >iEphCsr);.    }
6e10: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  .  }.}../*.** A 
6e20: 22 50 52 45 43 45 44 49 4e 47 20 3c 65 78 70 72  "PRECEDING <expr
6e30: 3e 22 20 28 62 45 6e 64 3d 3d 30 29 20 6f 72 20  >" (bEnd==0) or 
6e40: 22 46 4f 4c 4c 4f 57 49 4e 47 20 3c 65 78 70 72  "FOLLOWING <expr
6e50: 3e 22 20 28 62 45 6e 64 3d 3d 31 29 20 68 61 73  >" (bEnd==1) has
6e60: 20 6a 75 73 74 20 0a 2a 2a 20 62 65 65 6e 20 65   just .** been e
6e70: 76 61 6c 75 61 74 65 64 20 61 6e 64 20 74 68 65  valuated and the
6e80: 20 72 65 73 75 6c 74 20 6c 65 66 74 20 69 6e 20   result left in 
6e90: 72 65 67 69 73 74 65 72 20 72 65 67 2e 20 54 68  register reg. Th
6ea0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 67 65 6e 65  is function gene
6eb0: 72 61 74 65 73 0a 2a 2a 20 56 4d 20 63 6f 64 65  rates.** VM code
6ec0: 20 74 6f 20 63 68 65 63 6b 20 74 68 61 74 20 74   to check that t
6ed0: 68 65 20 76 61 6c 75 65 20 69 73 20 61 20 6e 6f  he value is a no
6ee0: 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67  n-negative integ
6ef0: 65 72 20 61 6e 64 20 74 68 72 6f 77 73 0a 2a 2a  er and throws.**
6f00: 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66   an exception if
6f10: 20 69 74 20 69 73 20 6e 6f 74 2e 0a 2a 2f 0a 73   it is not..*/.s
6f20: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f  tatic void windo
6f30: 77 43 68 65 63 6b 46 72 61 6d 65 56 61 6c 75 65  wCheckFrameValue
6f40: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
6f50: 69 6e 74 20 72 65 67 2c 20 69 6e 74 20 62 45 6e  int reg, int bEn
6f60: 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  d){.  static con
6f70: 73 74 20 63 68 61 72 20 2a 61 7a 45 72 72 5b 5d  st char *azErr[]
6f80: 20 3d 20 7b 0a 20 20 20 20 22 66 72 61 6d 65 20   = {.    "frame 
6f90: 73 74 61 72 74 69 6e 67 20 6f 66 66 73 65 74 20  starting offset 
6fa0: 6d 75 73 74 20 62 65 20 61 20 6e 6f 6e 2d 6e 65  must be a non-ne
6fb0: 67 61 74 69 76 65 20 69 6e 74 65 67 65 72 22 2c  gative integer",
6fc0: 0a 20 20 20 20 22 66 72 61 6d 65 20 65 6e 64 69  .    "frame endi
6fd0: 6e 67 20 6f 66 66 73 65 74 20 6d 75 73 74 20 62  ng offset must b
6fe0: 65 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65  e a non-negative
6ff0: 20 69 6e 74 65 67 65 72 22 0a 20 20 7d 3b 0a 20   integer".  };. 
7000: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
7010: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
7020: 29 3b 0a 20 20 69 6e 74 20 72 65 67 5a 65 72 6f  );.  int regZero
7030: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
7040: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
7050: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7060: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
7070: 20 30 2c 20 72 65 67 5a 65 72 6f 29 3b 0a 20 20   0, regZero);.  
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 4d 75 73 74 42 65 49 6e  2(v, OP_MustBeIn
70a0: 74 2c 20 72 65 67 2c 20 73 71 6c 69 74 65 33 56  t, reg, sqlite3V
70b0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
70c0: 29 2b 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  )+2);.  sqlite3V
70d0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
70e0: 47 65 2c 20 72 65 67 5a 65 72 6f 2c 20 73 71 6c  Ge, regZero, sql
70f0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
7100: 64 64 72 28 76 29 2b 32 2c 20 72 65 67 29 3b 0a  ddr(v)+2, reg);.
7110: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7120: 4f 70 32 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20  Op2(v, OP_Halt, 
7130: 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 4f 45  SQLITE_ERROR, OE
7140: 5f 41 62 6f 72 74 29 3b 0a 20 20 73 71 6c 69 74  _Abort);.  sqlit
7150: 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76  e3VdbeAppendP4(v
7160: 2c 20 28 76 6f 69 64 2a 29 61 7a 45 72 72 5b 62  , (void*)azErr[b
7170: 45 6e 64 5d 2c 20 50 34 5f 53 54 41 54 49 43 29  End], P4_STATIC)
7180: 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
7190: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
71a0: 2c 20 72 65 67 5a 65 72 6f 29 3b 0a 7d 0a 0a 2f  , regZero);.}../
71b0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
71c0: 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
71d0: 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 74 68  nts passed to th
71e0: 65 20 77 69 6e 64 6f 77 2d 66 75 6e 63 74 69 6f  e window-functio
71f0: 6e 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  n associated.** 
7200: 77 69 74 68 20 74 68 65 20 6f 62 6a 65 63 74 20  with the object 
7210: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e  passed as the on
7220: 6c 79 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  ly argument to t
7230: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  his function..*/
7240: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 64  .static int wind
7250: 6f 77 41 72 67 43 6f 75 6e 74 28 57 69 6e 64 6f  owArgCount(Windo
7260: 77 20 2a 70 57 69 6e 29 7b 0a 20 20 45 78 70 72  w *pWin){.  Expr
7270: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 57  List *pList = pW
7280: 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c  in->pOwner->x.pL
7290: 69 73 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 70  ist;.  return (p
72a0: 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45  List ? pList->nE
72b0: 78 70 72 20 3a 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  xpr : 0);.}../*.
72c0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 4d 20 63  ** Generate VM c
72d0: 6f 64 65 20 74 6f 20 69 6e 76 6f 6b 65 20 65 69  ode to invoke ei
72e0: 74 68 65 72 20 78 53 74 65 70 28 29 20 28 69 66  ther xStep() (if
72f0: 20 62 49 6e 76 65 72 73 65 20 69 73 20 30 29 20   bInverse is 0) 
7300: 6f 72 20 0a 2a 2a 20 78 49 6e 76 65 72 73 65 20  or .** xInverse 
7310: 28 69 66 20 62 49 6e 76 65 72 73 65 20 69 73 20  (if bInverse is 
7320: 6e 6f 6e 2d 7a 65 72 6f 29 20 66 6f 72 20 65 61  non-zero) for ea
7330: 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  ch window functi
7340: 6f 6e 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69  on in the .** li
7350: 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69  nked list starti
7360: 6e 67 20 61 74 20 70 4d 57 69 6e 2e 20 4f 72 2c  ng at pMWin. Or,
7370: 20 66 6f 72 20 62 75 69 6c 74 2d 69 6e 20 77 69   for built-in wi
7380: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 0a 2a  ndow functions.*
7390: 2a 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 75 73  * that do not us
73a0: 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 66  e the standard f
73b0: 75 6e 63 74 69 6f 6e 20 41 50 49 2c 20 67 65 6e  unction API, gen
73c0: 65 72 61 74 65 20 74 68 65 20 72 65 71 75 69 72  erate the requir
73d0: 65 64 0a 2a 2a 20 69 6e 6c 69 6e 65 20 56 4d 20  ed.** inline VM 
73e0: 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  code..**.** If a
73f0: 72 67 75 6d 65 6e 74 20 63 73 72 20 69 73 20 67  rgument csr is g
7400: 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
7410: 71 75 61 6c 20 74 6f 20 30 2c 20 74 68 65 6e 20  qual to 0, then 
7420: 61 72 67 75 6d 65 6e 74 20 72 65 67 20 69 73 0a  argument reg is.
7430: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72 65 67  ** the first reg
7440: 69 73 74 65 72 20 69 6e 20 61 6e 20 61 72 72 61  ister in an arra
7450: 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 67  y of registers g
7460: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
7470: 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 20  large.** enough 
7480: 74 6f 20 68 6f 6c 64 20 74 68 65 20 61 72 72 61  to hold the arra
7490: 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 66  y of arguments f
74a0: 6f 72 20 65 61 63 68 20 66 75 6e 63 74 69 6f 6e  or each function
74b0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a  . In this case.*
74c0: 2a 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20  * the arguments 
74d0: 61 72 65 20 65 78 74 72 61 63 74 65 64 20 66 72  are extracted fr
74e0: 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  om the current r
74f0: 6f 77 20 6f 66 20 63 73 72 20 69 6e 74 6f 20 74  ow of csr into t
7500: 68 65 0a 2a 2a 20 61 72 72 61 79 20 6f 66 20 72  he.** array of r
7510: 65 67 69 73 74 65 72 73 20 62 65 66 6f 72 65 20  egisters before 
7520: 69 6e 76 6f 6b 69 6e 67 20 4f 50 5f 41 67 67 53  invoking OP_AggS
7530: 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  tep..**.** Or, i
7540: 66 20 63 73 72 20 69 73 20 6c 65 73 73 20 74 68  f csr is less th
7550: 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
7560: 65 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73  e array of regis
7570: 74 65 72 73 20 61 74 20 72 65 67 20 69 73 0a 2a  ters at reg is.*
7580: 2a 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61  * already popula
7590: 74 65 64 20 77 69 74 68 20 61 6c 6c 20 63 6f 6c  ted with all col
75a0: 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 63 75  umns from the cu
75b0: 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65  rrent row of the
75c0: 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a   sub-query..**.*
75d0: 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 72 65  * If argument re
75e0: 67 50 61 72 74 53 69 7a 65 20 69 73 20 6e 6f 6e  gPartSize is non
75f0: 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69  -zero, then it i
7600: 73 20 61 20 72 65 67 69 73 74 65 72 20 63 6f 6e  s a register con
7610: 74 61 69 6e 69 6e 67 20 74 68 65 0a 2a 2a 20 6e  taining the.** n
7620: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
7630: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 72   the current par
7640: 74 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  tition..*/.stati
7650: 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 41 67 67  c void windowAgg
7660: 53 74 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70  Step(.  Parse *p
7670: 50 61 72 73 65 2c 20 0a 20 20 57 69 6e 64 6f 77  Parse, .  Window
7680: 20 2a 70 4d 57 69 6e 2c 20 20 20 20 20 20 20 20   *pMWin,        
7690: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e            /* Lin
76a0: 6b 65 64 20 6c 69 73 74 20 6f 66 20 77 69 6e 64  ked list of wind
76b0: 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  ow functions */.
76c0: 20 20 69 6e 74 20 63 73 72 2c 20 20 20 20 20 20    int csr,      
76d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76e0: 20 20 2f 2a 20 52 65 61 64 20 61 72 67 75 6d 65    /* Read argume
76f0: 6e 74 73 20 66 72 6f 6d 20 74 68 69 73 20 63 75  nts from this cu
7700: 72 73 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 62 49  rsor */.  int bI
7710: 6e 76 65 72 73 65 2c 20 20 20 20 20 20 20 20 20  nverse,         
7720: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7730: 65 20 74 6f 20 69 6e 76 6f 6b 65 20 78 49 6e 76  e to invoke xInv
7740: 65 72 73 65 20 69 6e 73 74 65 61 64 20 6f 66 20  erse instead of 
7750: 78 53 74 65 70 20 2a 2f 0a 20 20 69 6e 74 20 72  xStep */.  int r
7760: 65 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  eg,             
7770: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
7780: 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
7790: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 61 72   */.  int regPar
77a0: 74 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  tSize           
77b0: 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
77c0: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73 69 7a  r containing siz
77d0: 65 20 6f 66 20 70 61 72 74 69 74 69 6f 6e 20 2a  e of partition *
77e0: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
77f0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
7800: 70 50 61 72 73 65 29 3b 0a 20 20 57 69 6e 64 6f  pParse);.  Windo
7810: 77 20 2a 70 57 69 6e 3b 0a 20 20 66 6f 72 28 70  w *pWin;.  for(p
7820: 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b  Win=pMWin; pWin;
7830: 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78   pWin=pWin->pNex
7840: 74 57 69 6e 29 7b 0a 20 20 20 20 69 6e 74 20 66  tWin){.    int f
7850: 6c 61 67 73 20 3d 20 70 57 69 6e 2d 3e 70 46 75  lags = pWin->pFu
7860: 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 3b 0a 20  nc->funcFlags;. 
7870: 20 20 20 69 6e 74 20 72 65 67 41 72 67 3b 0a 20     int regArg;. 
7880: 20 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 77 69     int nArg = wi
7890: 6e 64 6f 77 41 72 67 43 6f 75 6e 74 28 70 57 69  ndowArgCount(pWi
78a0: 6e 29 3b 0a 0a 20 20 20 20 69 66 28 20 63 73 72  n);..    if( csr
78b0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  >=0 ){.      int
78c0: 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
78d0: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
78e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
78f0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
7900: 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20 70 57  _Column, csr, pW
7910: 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 69 2c 20 72  in->iArgCol+i, r
7920: 65 67 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20  eg+i);.      }. 
7930: 20 20 20 20 20 72 65 67 41 72 67 20 3d 20 72 65       regArg = re
7940: 67 3b 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61  g;.      if( fla
7950: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
7960: 5f 57 49 4e 44 4f 57 5f 53 49 5a 45 20 29 7b 0a  _WINDOW_SIZE ){.
7970: 20 20 20 20 20 20 20 20 69 66 28 20 6e 41 72 67          if( nArg
7980: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
7990: 20 72 65 67 41 72 67 20 3d 20 72 65 67 50 61 72   regArg = regPar
79a0: 74 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d  tSize;.        }
79b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
79c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
79d0: 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72  2(v, OP_SCopy, r
79e0: 65 67 50 61 72 74 53 69 7a 65 2c 20 72 65 67 2b  egPartSize, reg+
79f0: 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 20 20 7d  nArg);.        }
7a00: 0a 20 20 20 20 20 20 20 20 6e 41 72 67 2b 2b 3b  .        nArg++;
7a10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
7a20: 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
7a30: 28 20 21 28 66 6c 61 67 73 20 26 20 53 51 4c 49  ( !(flags & SQLI
7a40: 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 5f 53  TE_FUNC_WINDOW_S
7a50: 49 5a 45 29 20 29 3b 0a 20 20 20 20 20 20 72 65  IZE) );.      re
7a60: 67 41 72 67 20 3d 20 72 65 67 20 2b 20 70 57 69  gArg = reg + pWi
7a70: 6e 2d 3e 69 41 72 67 43 6f 6c 3b 0a 20 20 20 20  n->iArgCol;.    
7a80: 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 57 69 6e  }..    if( (pWin
7a90: 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61  ->pFunc->funcFla
7aa0: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
7ab0: 5f 4d 49 4e 4d 41 58 29 20 0a 20 20 20 20 20 20  _MINMAX) .      
7ac0: 26 26 20 70 57 69 6e 2d 3e 65 53 74 61 72 74 21  && pWin->eStart!
7ad0: 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 0a 20  =TK_UNBOUNDED . 
7ae0: 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20     ){.      if( 
7af0: 62 49 6e 76 65 72 73 65 3d 3d 30 20 29 7b 0a 20  bInverse==0 ){. 
7b00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
7b10: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
7b20: 64 64 49 6d 6d 2c 20 70 57 69 6e 2d 3e 72 65 67  ddImm, pWin->reg
7b30: 41 70 70 2b 31 2c 20 31 29 3b 0a 20 20 20 20 20  App+1, 1);.     
7b40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7b50: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
7b60: 2c 20 72 65 67 41 72 67 2c 20 70 57 69 6e 2d 3e  , regArg, pWin->
7b70: 72 65 67 41 70 70 29 3b 0a 20 20 20 20 20 20 20  regApp);.       
7b80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7b90: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
7ba0: 6f 72 64 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70  ord, pWin->regAp
7bb0: 70 2c 20 32 2c 20 70 57 69 6e 2d 3e 72 65 67 41  p, 2, pWin->regA
7bc0: 70 70 2b 32 29 3b 0a 20 20 20 20 20 20 20 20 73  pp+2);.        s
7bd0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
7be0: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
7bf0: 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20  , pWin->csrApp, 
7c00: 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 32 29 3b  pWin->regApp+2);
7c10: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7c20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7c30: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
7c40: 5f 53 65 65 6b 47 45 2c 20 70 57 69 6e 2d 3e 63  _SeekGE, pWin->c
7c50: 73 72 41 70 70 2c 20 30 2c 20 72 65 67 41 72 67  srApp, 0, regArg
7c60: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 1);.        sq
7c70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
7c80: 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 70 57  v, OP_Delete, pW
7c90: 69 6e 2d 3e 63 73 72 41 70 70 29 3b 0a 20 20 20  in->csrApp);.   
7ca0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7cb0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 73 71 6c 69  JumpHere(v, sqli
7cc0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
7cd0: 64 72 28 76 29 2d 32 29 3b 0a 20 20 20 20 20 20  dr(v)-2);.      
7ce0: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
7cf0: 70 57 69 6e 2d 3e 72 65 67 41 70 70 20 29 7b 0a  pWin->regApp ){.
7d00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57        assert( pW
7d10: 69 6e 2d 3e 70 46 75 6e 63 2d 3e 78 53 46 75 6e  in->pFunc->xSFun
7d20: 63 3d 3d 6e 74 68 5f 76 61 6c 75 65 53 74 65 70  c==nth_valueStep
7d30: 46 75 6e 63 20 0a 20 20 20 20 20 20 20 20 20 20  Func .          
7d40: 20 7c 7c 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2d   || pWin->pFunc-
7d50: 3e 78 53 46 75 6e 63 3d 3d 66 69 72 73 74 5f 76  >xSFunc==first_v
7d60: 61 6c 75 65 53 74 65 70 46 75 6e 63 20 0a 20 20  alueStepFunc .  
7d70: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73      );.      ass
7d80: 65 72 74 28 20 62 49 6e 76 65 72 73 65 3d 3d 30  ert( bInverse==0
7d90: 20 7c 7c 20 62 49 6e 76 65 72 73 65 3d 3d 31 20   || bInverse==1 
7da0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
7db0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7dc0: 5f 41 64 64 49 6d 6d 2c 20 70 57 69 6e 2d 3e 72  _AddImm, pWin->r
7dd0: 65 67 41 70 70 2b 31 2d 62 49 6e 76 65 72 73 65  egApp+1-bInverse
7de0: 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  , 1);.    }else 
7df0: 69 66 28 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2d  if( pWin->pFunc-
7e00: 3e 78 53 46 75 6e 63 3d 3d 6c 65 61 64 53 74 65  >xSFunc==leadSte
7e10: 70 46 75 6e 63 20 0a 20 20 20 20 20 20 20 20 20  pFunc .         
7e20: 20 20 7c 7c 20 70 57 69 6e 2d 3e 70 46 75 6e 63    || pWin->pFunc
7e30: 2d 3e 78 53 46 75 6e 63 3d 3d 6c 61 67 53 74 65  ->xSFunc==lagSte
7e40: 70 46 75 6e 63 20 0a 20 20 20 20 29 7b 0a 20 20  pFunc .    ){.  
7e50: 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a      /* no-op */.
7e60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7e70: 20 69 6e 74 20 61 64 64 72 49 66 20 3d 20 30 3b   int addrIf = 0;
7e80: 0a 20 20 20 20 20 20 69 66 28 20 70 57 69 6e 2d  .      if( pWin-
7e90: 3e 70 46 69 6c 74 65 72 20 29 7b 0a 20 20 20 20  >pFilter ){.    
7ea0: 20 20 20 20 69 6e 74 20 72 65 67 54 6d 70 3b 0a      int regTmp;.
7eb0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
7ec0: 6e 41 72 67 3d 3d 70 57 69 6e 2d 3e 70 4f 77 6e  nArg==pWin->pOwn
7ed0: 65 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  er->x.pList->nEx
7ee0: 70 72 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pr );.        if
7ef0: 28 20 63 73 72 3e 30 20 29 7b 0a 20 20 20 20 20  ( csr>0 ){.     
7f00: 20 20 20 20 20 72 65 67 54 6d 70 20 3d 20 73 71       regTmp = sq
7f10: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
7f20: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
7f30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7f40: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
7f50: 6e 2c 20 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41  n, csr, pWin->iA
7f60: 72 67 43 6f 6c 2b 6e 41 72 67 2c 72 65 67 54 6d  rgCol+nArg,regTm
7f70: 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  p);.        }els
7f80: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 67  e{.          reg
7f90: 54 6d 70 20 3d 20 72 65 67 41 72 67 20 2b 20 6e  Tmp = regArg + n
7fa0: 41 72 67 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Arg;.        }. 
7fb0: 20 20 20 20 20 20 20 61 64 64 72 49 66 20 3d 20         addrIf = 
7fc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7fd0: 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72  3(v, OP_IfNot, r
7fe0: 65 67 54 6d 70 2c 20 30 2c 20 31 29 3b 0a 20 20  egTmp, 0, 1);.  
7ff0: 20 20 20 20 20 20 69 66 28 20 63 73 72 3e 30 20        if( csr>0 
8000: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
8010: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
8020: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 54 6d  eg(pParse, regTm
8030: 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  p);.        }.  
8040: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
8050: 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e  pWin->pFunc->fun
8060: 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
8070: 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b  FUNC_NEEDCOLL ){
8080: 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  .        CollSeq
8090: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20   *pColl;.       
80a0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
80b0: 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 50  ExprNNCollSeq(pP
80c0: 61 72 73 65 2c 20 70 57 69 6e 2d 3e 70 4f 77 6e  arse, pWin->pOwn
80d0: 65 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30  er->x.pList->a[0
80e0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
80f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8100: 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65  Op4(v, OP_CollSe
8110: 71 2c 20 30 2c 30 2c 30 2c 20 28 63 6f 6e 73 74  q, 0,0,0, (const
8120: 20 63 68 61 72 2a 29 70 43 6f 6c 6c 2c 20 50 34   char*)pColl, P4
8130: 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20  _COLLSEQ);.     
8140: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
8150: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
8160: 5f 41 67 67 53 74 65 70 30 2c 20 62 49 6e 76 65  _AggStep0, bInve
8170: 72 73 65 2c 20 72 65 67 41 72 67 2c 20 70 57 69  rse, regArg, pWi
8180: 6e 2d 3e 72 65 67 41 63 63 75 6d 29 3b 0a 20 20  n->regAccum);.  
8190: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
81a0: 70 70 65 6e 64 50 34 28 76 2c 20 70 57 69 6e 2d  ppendP4(v, pWin-
81b0: 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44  >pFunc, P4_FUNCD
81c0: 45 46 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  EF);.      sqlit
81d0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
81e0: 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a 20 20 20  , (u8)nArg);.   
81f0: 20 20 20 69 66 28 20 61 64 64 72 49 66 20 29 20     if( addrIf ) 
8200: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
8210: 65 72 65 28 76 2c 20 61 64 64 72 49 66 29 3b 0a  ere(v, addrIf);.
8220: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
8230: 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 4d 20 63  ** Generate VM c
8240: 6f 64 65 20 74 6f 20 69 6e 76 6f 6b 65 20 65 69  ode to invoke ei
8250: 74 68 65 72 20 78 56 61 6c 75 65 28 29 20 28 62  ther xValue() (b
8260: 46 69 6e 61 6c 3d 3d 30 29 20 6f 72 20 78 46 69  Final==0) or xFi
8270: 6e 61 6c 69 7a 65 28 29 0a 2a 2a 20 28 62 46 69  nalize().** (bFi
8280: 6e 61 6c 3d 3d 31 29 20 66 6f 72 20 65 61 63 68  nal==1) for each
8290: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
82a0: 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   in the linked l
82b0: 69 73 74 20 73 74 61 72 74 69 6e 67 20 61 74 0a  ist starting at.
82c0: 2a 2a 20 70 4d 57 69 6e 2e 20 4f 72 2c 20 66 6f  ** pMWin. Or, fo
82d0: 72 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  r built-in windo
82e0: 77 2d 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74  w-functions that
82f0: 20 64 6f 20 6e 6f 74 20 75 73 65 20 74 68 65 20   do not use the 
8300: 73 74 61 6e 64 61 72 64 0a 2a 2a 20 41 50 49 2c  standard.** API,
8310: 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 65 71   generate the eq
8320: 75 69 76 61 6c 65 6e 74 20 56 4d 20 63 6f 64 65  uivalent VM code
8330: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8340: 20 77 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28   windowAggFinal(
8350: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 57  Parse *pParse, W
8360: 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 2c 20 69 6e  indow *pMWin, in
8370: 74 20 62 46 69 6e 61 6c 29 7b 0a 20 20 56 64 62  t bFinal){.  Vdb
8380: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
8390: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
83a0: 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 0a   Window *pWin;..
83b0: 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e    for(pWin=pMWin
83c0: 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69  ; pWin; pWin=pWi
83d0: 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20  n->pNextWin){.  
83e0: 20 20 69 66 28 20 28 70 57 69 6e 2d 3e 70 46 75    if( (pWin->pFu
83f0: 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  nc->funcFlags & 
8400: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d  SQLITE_FUNC_MINM
8410: 41 58 29 20 0a 20 20 20 20 20 26 26 20 70 57 69  AX) .     && pWi
8420: 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b 5f 55 4e  n->eStart!=TK_UN
8430: 42 4f 55 4e 44 45 44 20 0a 20 20 20 20 29 7b 0a  BOUNDED .    ){.
8440: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8450: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
8460: 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67  ll, 0, pWin->reg
8470: 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 73  Result);.      s
8480: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
8490: 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 57 69  (v, OP_Last, pWi
84a0: 6e 2d 3e 63 73 72 41 70 70 29 3b 0a 20 20 20 20  n->csrApp);.    
84b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
84c0: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
84d0: 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20  , pWin->csrApp, 
84e0: 30 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75  0, pWin->regResu
84f0: 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lt);.      sqlit
8500: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
8510: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
8520: 72 65 6e 74 41 64 64 72 28 76 29 2d 32 29 3b 0a  rentAddr(v)-2);.
8530: 20 20 20 20 20 20 69 66 28 20 62 46 69 6e 61 6c        if( bFinal
8540: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
8550: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
8560: 20 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c   OP_ResetSorter,
8570: 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 29 3b 0a   pWin->csrApp);.
8580: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
8590: 65 20 69 66 28 20 70 57 69 6e 2d 3e 72 65 67 41  e if( pWin->regA
85a0: 70 70 20 29 7b 0a 20 20 20 20 7d 65 6c 73 65 7b  pp ){.    }else{
85b0: 0a 20 20 20 20 20 20 69 66 28 20 62 46 69 6e 61  .      if( bFina
85c0: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  l==0 ){.        
85d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
85e0: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
85f0: 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74   pWin->regResult
8600: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
8610: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8620: 70 32 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61  p2(v, OP_AggFina
8630: 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75  l, pWin->regAccu
8640: 6d 2c 20 77 69 6e 64 6f 77 41 72 67 43 6f 75 6e  m, windowArgCoun
8650: 74 28 70 57 69 6e 29 29 3b 0a 20 20 20 20 20 20  t(pWin));.      
8660: 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e  sqlite3VdbeAppen
8670: 64 50 34 28 76 2c 20 70 57 69 6e 2d 3e 70 46 75  dP4(v, pWin->pFu
8680: 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  nc, P4_FUNCDEF);
8690: 0a 20 20 20 20 20 20 69 66 28 20 62 46 69 6e 61  .      if( bFina
86a0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l ){.        sql
86b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
86c0: 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 57 69 6e 2d  , OP_Copy, pWin-
86d0: 3e 72 65 67 41 63 63 75 6d 2c 20 70 57 69 6e 2d  >regAccum, pWin-
86e0: 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20  >regResult);.   
86f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8700: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
8710: 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41  l, 0, pWin->regA
8720: 63 63 75 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ccum);.      }el
8730: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
8740: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
8750: 76 2c 20 2d 31 2c 20 70 57 69 6e 2d 3e 72 65 67  v, -1, pWin->reg
8760: 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d  Result);.      }
8770: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
8780: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
8790: 6e 20 67 65 6e 65 72 61 74 65 73 20 56 4d 20 63  n generates VM c
87a0: 6f 64 65 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  ode to invoke th
87b0: 65 20 73 75 62 2d 72 6f 75 74 69 6e 65 20 61 74  e sub-routine at
87c0: 20 61 64 64 72 65 73 73 0a 2a 2a 20 6c 62 6c 46   address.** lblF
87d0: 6c 75 73 68 50 61 72 74 20 6f 6e 63 65 20 66 6f  lushPart once fo
87e0: 72 20 65 61 63 68 20 70 61 72 74 69 74 69 6f 6e  r each partition
87f0: 20 77 69 74 68 20 74 68 65 20 65 6e 74 69 72 65   with the entire
8800: 20 70 61 72 74 69 74 69 6f 6e 20 63 61 63 68 65   partition cache
8810: 64 20 69 6e 0a 2a 2a 20 74 68 65 20 57 69 6e 64  d in.** the Wind
8820: 6f 77 2e 69 45 70 68 43 73 72 20 74 65 6d 70 20  ow.iEphCsr temp 
8830: 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
8840: 20 76 6f 69 64 20 77 69 6e 64 6f 77 50 61 72 74   void windowPart
8850: 69 74 69 6f 6e 43 61 63 68 65 28 0a 20 20 50 61  itionCache(.  Pa
8860: 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 53  rse *pParse,.  S
8870: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
8880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8890: 2a 20 54 68 65 20 72 65 77 72 69 74 74 65 6e 20  * The rewritten 
88a0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
88b0: 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20   */.  WhereInfo 
88c0: 2a 70 57 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  *pWInfo,        
88d0: 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 49 6e        /* WhereIn
88e0: 66 6f 20 74 6f 20 63 61 6c 6c 20 57 68 65 72 65  fo to call Where
88f0: 45 6e 64 28 29 20 6f 6e 20 2a 2f 0a 20 20 69 6e  End() on */.  in
8900: 74 20 72 65 67 46 6c 75 73 68 50 61 72 74 2c 20  t regFlushPart, 
8910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8920: 20 52 65 67 69 73 74 65 72 20 74 6f 20 75 73 65   Register to use
8930: 20 77 69 74 68 20 47 6f 73 75 62 20 6c 62 6c 46   with Gosub lblF
8940: 6c 75 73 68 50 61 72 74 20 2a 2f 0a 20 20 69 6e  lushPart */.  in
8950: 74 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 2c 20  t lblFlushPart, 
8960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8970: 20 53 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 47   Subroutine to G
8980: 6f 73 75 62 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  osub to */.  int
8990: 20 2a 70 52 65 67 53 69 7a 65 20 20 20 20 20 20   *pRegSize      
89a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
89b0: 4f 55 54 3a 20 52 65 67 69 73 74 65 72 20 63 6f  OUT: Register co
89c0: 6e 74 61 69 6e 69 6e 67 20 70 61 72 74 69 74 69  ntaining partiti
89d0: 6f 6e 20 73 69 7a 65 20 2a 2f 0a 29 7b 0a 20 20  on size */.){.  
89e0: 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20  Window *pMWin = 
89f0: 70 2d 3e 70 57 69 6e 3b 0a 20 20 56 64 62 65 20  p->pWin;.  Vdbe 
8a00: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
8a10: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 57  dbe(pParse);.  W
8a20: 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 69  indow *pWin;.  i
8a30: 6e 74 20 69 53 75 62 43 73 72 20 3d 20 70 2d 3e  nt iSubCsr = p->
8a40: 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73  pSrc->a[0].iCurs
8a50: 6f 72 3b 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d  or;.  int nSub =
8a60: 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
8a70: 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 69 6e 74  Tab->nCol;.  int
8a80: 20 6b 3b 0a 0a 20 20 69 6e 74 20 72 65 67 20 3d   k;..  int reg =
8a90: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
8aa0: 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64  .  int regRecord
8ab0: 20 3d 20 72 65 67 2b 6e 53 75 62 3b 0a 20 20 69   = reg+nSub;.  i
8ac0: 6e 74 20 72 65 67 52 6f 77 69 64 20 3d 20 72 65  nt regRowid = re
8ad0: 67 52 65 63 6f 72 64 2b 31 3b 0a 0a 20 20 2a 70  gRecord+1;..  *p
8ae0: 52 65 67 53 69 7a 65 20 3d 20 72 65 67 52 6f 77  RegSize = regRow
8af0: 69 64 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d  id;.  pParse->nM
8b00: 65 6d 20 2b 3d 20 6e 53 75 62 20 2b 20 32 3b 0a  em += nSub + 2;.
8b10: 0a 20 20 2f 2a 20 4d 61 72 74 69 61 6c 20 74 68  .  /* Martial th
8b20: 65 20 72 6f 77 20 72 65 74 75 72 6e 65 64 20 62  e row returned b
8b30: 79 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74  y the sub-select
8b40: 20 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f   into an array o
8b50: 66 20 0a 20 20 2a 2a 20 72 65 67 69 73 74 65 72  f .  ** register
8b60: 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b  s. */.  for(k=0;
8b70: 20 6b 3c 6e 53 75 62 3b 20 6b 2b 2b 29 7b 0a 20   k<nSub; k++){. 
8b80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8b90: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
8ba0: 6e 2c 20 69 53 75 62 43 73 72 2c 20 6b 2c 20 72  n, iSubCsr, k, r
8bb0: 65 67 2b 6b 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  eg+k);.  }.  sql
8bc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
8bd0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
8be0: 20 72 65 67 2c 20 6e 53 75 62 2c 20 72 65 67 52   reg, nSub, regR
8bf0: 65 63 6f 72 64 29 3b 0a 0a 20 20 2f 2a 20 43 68  ecord);..  /* Ch
8c00: 65 63 6b 20 69 66 20 74 68 69 73 20 69 73 20 74  eck if this is t
8c10: 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 6e 65  he start of a ne
8c20: 77 20 70 61 72 74 69 74 69 6f 6e 2e 20 49 66 20  w partition. If 
8c30: 73 6f 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a  so, call the.  *
8c40: 2a 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f  * flush_partitio
8c50: 6e 20 73 75 62 2d 72 6f 75 74 69 6e 65 2e 20 20  n sub-routine.  
8c60: 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  */.  if( pMWin->
8c70: 70 50 61 72 74 69 74 69 6f 6e 20 29 7b 0a 20 20  pPartition ){.  
8c80: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
8c90: 45 78 70 72 4c 69 73 74 20 2a 70 50 61 72 74 20  ExprList *pPart 
8ca0: 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74  = pMWin->pPartit
8cb0: 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 50 61  ion;.    int nPa
8cc0: 72 74 20 3d 20 70 50 61 72 74 2d 3e 6e 45 78 70  rt = pPart->nExp
8cd0: 72 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 4e 65  r;.    int regNe
8ce0: 77 50 61 72 74 20 3d 20 72 65 67 20 2b 20 70 4d  wPart = reg + pM
8cf0: 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 3b  Win->nBufferCol;
8d00: 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
8d10: 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
8d20: 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  KeyInfoFromExprL
8d30: 69 73 74 28 70 50 61 72 73 65 2c 20 70 50 61 72  ist(pParse, pPar
8d40: 74 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 61  t, 0, 0);..    a
8d50: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
8d60: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
8d70: 6d 70 61 72 65 2c 20 72 65 67 4e 65 77 50 61 72  mpare, regNewPar
8d80: 74 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72  t, pMWin->regPar
8d90: 74 2c 6e 50 61 72 74 29 3b 0a 20 20 20 20 73 71  t,nPart);.    sq
8da0: 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
8db0: 34 28 76 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79  4(v, (void*)pKey
8dc0: 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
8dd0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
8de0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
8df0: 75 6d 70 2c 20 61 64 64 72 2b 32 2c 20 61 64 64  ump, addr+2, add
8e00: 72 2b 34 2c 20 61 64 64 72 2b 32 29 3b 0a 20 20  r+4, addr+2);.  
8e10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8e20: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op3(v, OP_Copy, 
8e30: 72 65 67 4e 65 77 50 61 72 74 2c 20 70 4d 57 69  regNewPart, pMWi
8e40: 6e 2d 3e 72 65 67 50 61 72 74 2c 20 6e 50 61 72  n->regPart, nPar
8e50: 74 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  t-1);.    sqlite
8e60: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8e70: 50 5f 47 6f 73 75 62 2c 20 72 65 67 46 6c 75 73  P_Gosub, regFlus
8e80: 68 50 61 72 74 2c 20 6c 62 6c 46 6c 75 73 68 50  hPart, lblFlushP
8e90: 61 72 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  art);.  }..  /* 
8ea0: 42 75 66 66 65 72 20 74 68 65 20 63 75 72 72 65  Buffer the curre
8eb0: 6e 74 20 72 6f 77 20 69 6e 20 74 68 65 20 65 70  nt row in the ep
8ec0: 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20 2a  hemeral table. *
8ed0: 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  /.  sqlite3VdbeA
8ee0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
8ef0: 6f 77 69 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  owid, pMWin->iEp
8f00: 68 43 73 72 2c 20 72 65 67 52 6f 77 69 64 29 3b  hCsr, regRowid);
8f10: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
8f20: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
8f30: 74 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  t, pMWin->iEphCs
8f40: 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 72 65  r, regRecord, re
8f50: 67 52 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a 20 45  gRowid);..  /* E
8f60: 6e 64 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  nd of the input 
8f70: 6c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65  loop */.  sqlite
8f80: 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
8f90: 29 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20  );..  /* Invoke 
8fa0: 22 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e  "flush_partition
8fb0: 22 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74  " to deal with t
8fc0: 68 65 20 66 69 6e 61 6c 20 28 6f 72 20 6f 6e 6c  he final (or onl
8fd0: 79 29 20 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a  y) partition */.
8fe0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8ff0: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
9000: 20 72 65 67 46 6c 75 73 68 50 61 72 74 2c 20 6c   regFlushPart, l
9010: 62 6c 46 6c 75 73 68 50 61 72 74 29 3b 0a 7d 0a  blFlushPart);.}.
9020: 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
9030: 65 20 73 75 62 2d 72 6f 75 74 69 6e 65 20 61 74  e sub-routine at
9040: 20 72 65 67 47 6f 73 75 62 20 28 67 65 6e 65 72   regGosub (gener
9050: 61 74 65 64 20 62 79 20 63 6f 64 65 20 69 6e 20  ated by code in 
9060: 73 65 6c 65 63 74 2e 63 29 20 74 6f 0a 2a 2a 20  select.c) to.** 
9070: 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  return the curre
9080: 6e 74 20 72 6f 77 20 6f 66 20 57 69 6e 64 6f 77  nt row of Window
9090: 2e 69 45 70 68 43 73 72 2e 20 49 66 20 61 6c 6c  .iEphCsr. If all
90a0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
90b0: 73 20 61 72 65 0a 2a 2a 20 61 67 67 72 65 67 61  s are.** aggrega
90c0: 74 65 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  te window functi
90d0: 6f 6e 73 20 74 68 61 74 20 75 73 65 20 74 68 65  ons that use the
90e0: 20 73 74 61 6e 64 61 72 64 20 41 50 49 2c 20 61   standard API, a
90f0: 20 73 69 6e 67 6c 65 0a 2a 2a 20 4f 50 5f 47 6f   single.** OP_Go
9100: 73 75 62 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  sub instruction 
9110: 69 73 20 61 6c 6c 20 74 68 61 74 20 74 68 69 73  is all that this
9120: 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
9130: 65 73 2e 20 45 78 74 72 61 20 56 4d 20 63 6f 64  es. Extra VM cod
9140: 65 0a 2a 2a 20 66 6f 72 20 70 65 72 2d 72 6f 77  e.** for per-row
9150: 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6f   processing is o
9160: 6e 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f  nly generated fo
9170: 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  r the following 
9180: 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 0a  built-in window.
9190: 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a  ** functions:.**
91a0: 0a 2a 2a 20 20 20 6e 74 68 5f 76 61 6c 75 65 28  .**   nth_value(
91b0: 29 0a 2a 2a 20 20 20 66 69 72 73 74 5f 76 61 6c  ).**   first_val
91c0: 75 65 28 29 0a 2a 2a 20 20 20 6c 61 67 28 29 0a  ue().**   lag().
91d0: 2a 2a 20 20 20 6c 65 61 64 28 29 0a 2a 2f 0a 73  **   lead().*/.s
91e0: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f  tatic void windo
91f0: 77 52 65 74 75 72 6e 4f 6e 65 52 6f 77 28 0a 20  wReturnOneRow(. 
9200: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a   Parse *pParse,.
9210: 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 2c    Window *pMWin,
9220: 0a 20 20 69 6e 74 20 72 65 67 47 6f 73 75 62 2c  .  int regGosub,
9230: 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75 62  .  int addrGosub
9240: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
9250: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
9260: 50 61 72 73 65 29 3b 0a 20 20 57 69 6e 64 6f 77  Parse);.  Window
9270: 20 2a 70 57 69 6e 3b 0a 20 20 66 6f 72 28 70 57   *pWin;.  for(pW
9280: 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20  in=pMWin; pWin; 
9290: 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74  pWin=pWin->pNext
92a0: 57 69 6e 29 7b 0a 20 20 20 20 46 75 6e 63 44 65  Win){.    FuncDe
92b0: 66 20 2a 70 46 75 6e 63 20 3d 20 70 57 69 6e 2d  f *pFunc = pWin-
92c0: 3e 70 46 75 6e 63 3b 0a 20 20 20 20 69 66 28 20  >pFunc;.    if( 
92d0: 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 6e  pFunc->xSFunc==n
92e0: 74 68 5f 76 61 6c 75 65 53 74 65 70 46 75 6e 63  th_valueStepFunc
92f0: 20 0a 20 20 20 20 20 7c 7c 20 70 46 75 6e 63 2d   .     || pFunc-
9300: 3e 78 53 46 75 6e 63 3d 3d 66 69 72 73 74 5f 76  >xSFunc==first_v
9310: 61 6c 75 65 53 74 65 70 46 75 6e 63 20 0a 20 20  alueStepFunc .  
9320: 20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 63    ){.      int c
9330: 73 72 20 3d 20 70 57 69 6e 2d 3e 63 73 72 41 70  sr = pWin->csrAp
9340: 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 62 6c  p;.      int lbl
9350: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
9360: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
9370: 20 20 69 6e 74 20 74 6d 70 52 65 67 20 3d 20 73    int tmpReg = s
9380: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
9390: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
93a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
93b0: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
93c0: 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74   pWin->regResult
93d0: 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 46  );..      if( pF
93e0: 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 6e 74 68  unc->xSFunc==nth
93f0: 5f 76 61 6c 75 65 53 74 65 70 46 75 6e 63 20 29  _valueStepFunc )
9400: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
9410: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
9420: 50 5f 43 6f 6c 75 6d 6e 2c 20 70 57 69 6e 2d 3e  P_Column, pWin->
9430: 69 45 70 68 43 73 72 2c 20 70 57 69 6e 2d 3e 69  iEphCsr, pWin->i
9440: 41 72 67 43 6f 6c 2b 31 2c 20 74 6d 70 52 65 67  ArgCol+1, tmpReg
9450: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
9460: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
9470: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
9480: 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 6d 70 52  Integer, 1, tmpR
9490: 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eg);.      }.   
94a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
94b0: 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20  dOp3(v, OP_Add, 
94c0: 74 6d 70 52 65 67 2c 20 70 57 69 6e 2d 3e 72 65  tmpReg, pWin->re
94d0: 67 41 70 70 2c 20 74 6d 70 52 65 67 29 3b 0a 20  gApp, tmpReg);. 
94e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
94f0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 47 74 2c  AddOp3(v, OP_Gt,
9500: 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31 2c   pWin->regApp+1,
9510: 20 6c 62 6c 2c 20 74 6d 70 52 65 67 29 3b 0a 20   lbl, tmpReg);. 
9520: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9530: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65  AddOp3(v, OP_See
9540: 6b 52 6f 77 69 64 2c 20 63 73 72 2c 20 6c 62 6c  kRowid, csr, lbl
9550: 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20  , tmpReg);.     
9560: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9570: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
9580: 20 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67   csr, pWin->iArg
9590: 43 6f 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65  Col, pWin->regRe
95a0: 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  sult);.      sql
95b0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
95c0: 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20 20  abel(v, lbl);.  
95d0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
95e0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
95f0: 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 7d  , tmpReg);.    }
9600: 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 46  .    else if( pF
9610: 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 6c 65 61  unc->xSFunc==lea
9620: 64 53 74 65 70 46 75 6e 63 20 7c 7c 20 70 46 75  dStepFunc || pFu
9630: 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 6c 61 67 53  nc->xSFunc==lagS
9640: 74 65 70 46 75 6e 63 20 29 7b 0a 20 20 20 20 20  tepFunc ){.     
9650: 20 69 6e 74 20 6e 41 72 67 20 3d 20 70 57 69 6e   int nArg = pWin
9660: 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73  ->pOwner->x.pLis
9670: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
9680: 69 6e 74 20 69 45 70 68 20 3d 20 70 4d 57 69 6e  int iEph = pMWin
9690: 2d 3e 69 45 70 68 43 73 72 3b 0a 20 20 20 20 20  ->iEphCsr;.     
96a0: 20 69 6e 74 20 63 73 72 20 3d 20 70 57 69 6e 2d   int csr = pWin-
96b0: 3e 63 73 72 41 70 70 3b 0a 20 20 20 20 20 20 69  >csrApp;.      i
96c0: 6e 74 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33  nt lbl = sqlite3
96d0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
96e0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 74 6d 70 52  ;.      int tmpR
96f0: 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  eg = sqlite3GetT
9700: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
9710: 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3c  .      if( nArg<
9720: 33 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  3 ){.        sql
9730: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
9740: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57  , OP_Null, 0, pW
9750: 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a  in->regResult);.
9760: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9770: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9780: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
9790: 75 6d 6e 2c 20 69 45 70 68 2c 20 70 57 69 6e 2d  umn, iEph, pWin-
97a0: 3e 69 41 72 67 43 6f 6c 2b 32 2c 20 70 57 69 6e  >iArgCol+2, pWin
97b0: 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20  ->regResult);.  
97c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
97d0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
97e0: 20 4f 50 5f 52 6f 77 69 64 2c 20 69 45 70 68 2c   OP_Rowid, iEph,
97f0: 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20 20   tmpReg);.      
9800: 69 66 28 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20  if( nArg<2 ){.  
9810: 20 20 20 20 20 20 69 6e 74 20 76 61 6c 20 3d 20        int val = 
9820: 28 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d  (pFunc->xSFunc==
9830: 6c 65 61 64 53 74 65 70 46 75 6e 63 20 3f 20 31  leadStepFunc ? 1
9840: 20 3a 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20   : -1);.        
9850: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9860: 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
9870: 74 6d 70 52 65 67 2c 20 76 61 6c 29 3b 0a 20 20  tmpReg, val);.  
9880: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9890: 20 20 20 69 6e 74 20 6f 70 20 3d 20 28 70 46 75     int op = (pFu
98a0: 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 6c 65 61 64  nc->xSFunc==lead
98b0: 53 74 65 70 46 75 6e 63 20 3f 20 4f 50 5f 41 64  StepFunc ? OP_Ad
98c0: 64 20 3a 20 4f 50 5f 53 75 62 74 72 61 63 74 29  d : OP_Subtract)
98d0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 6d  ;.        int tm
98e0: 70 52 65 67 32 20 3d 20 73 71 6c 69 74 65 33 47  pReg2 = sqlite3G
98f0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
9900: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
9910: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
9920: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 45 70 68 2c  OP_Column, iEph,
9930: 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 31   pWin->iArgCol+1
9940: 2c 20 74 6d 70 52 65 67 32 29 3b 0a 20 20 20 20  , tmpReg2);.    
9950: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9960: 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 74 6d 70  ddOp3(v, op, tmp
9970: 52 65 67 32 2c 20 74 6d 70 52 65 67 2c 20 74 6d  Reg2, tmpReg, tm
9980: 70 52 65 67 29 3b 0a 20 20 20 20 20 20 20 20 73  pReg);.        s
9990: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
99a0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 74 6d 70  pReg(pParse, tmp
99b0: 52 65 67 32 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  Reg2);.      }..
99c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
99d0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65  eAddOp3(v, OP_Se
99e0: 65 6b 52 6f 77 69 64 2c 20 63 73 72 2c 20 6c 62  ekRowid, csr, lb
99f0: 6c 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20  l, tmpReg);.    
9a00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9a10: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
9a20: 2c 20 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72  , csr, pWin->iAr
9a30: 67 43 6f 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 52  gCol, pWin->regR
9a40: 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 73 71  esult);.      sq
9a50: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
9a60: 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20  Label(v, lbl);. 
9a70: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
9a80: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
9a90: 65 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20  e, tmpReg);.    
9aa0: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  }.  }.  sqlite3V
9ab0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
9ac0: 47 6f 73 75 62 2c 20 72 65 67 47 6f 73 75 62 2c  Gosub, regGosub,
9ad0: 20 61 64 64 72 47 6f 73 75 62 29 3b 0a 7d 0a 0a   addrGosub);.}..
9ae0: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
9af0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
9b00: 62 79 20 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f  by windowReturnO
9b10: 6e 65 52 6f 77 28 29 20 61 6e 64 2c 20 6f 70 74  neRow() and, opt
9b20: 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 0a 2a 2a 20  ionally, the.** 
9b30: 78 49 6e 76 65 72 73 65 28 29 20 66 75 6e 63 74  xInverse() funct
9b40: 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 77 69 6e  ion for each win
9b50: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 2c 20 66 6f  dow function, fo
9b60: 72 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 72 6f  r one or more ro
9b70: 77 73 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 57  ws.** from the W
9b80: 69 6e 64 6f 77 2e 69 45 70 68 43 73 72 20 74 65  indow.iEphCsr te
9b90: 6d 70 20 74 61 62 6c 65 2e 20 54 68 69 73 20 72  mp table. This r
9ba0: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
9bb0: 20 56 4d 20 63 6f 64 65 0a 2a 2a 20 73 69 6d 69   VM code.** simi
9bc0: 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20  lar to:.**.**   
9bd0: 77 68 69 6c 65 28 20 72 65 67 43 74 72 3e 30 20  while( regCtr>0 
9be0: 29 7b 0a 2a 2a 20 20 20 20 20 72 65 67 43 74 72  ){.**     regCtr
9bf0: 2d 2d 3b 0a 2a 2a 20 20 20 20 20 77 69 6e 64 6f  --;.**     windo
9c00: 77 52 65 74 75 72 6e 4f 6e 65 52 6f 77 28 29 0a  wReturnOneRow().
9c10: 2a 2a 20 20 20 20 20 69 66 28 20 62 49 6e 76 65  **     if( bInve
9c20: 72 73 65 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  rse ){.**       
9c30: 41 67 67 53 74 65 70 20 28 78 49 6e 76 65 72 73  AggStep (xInvers
9c40: 65 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20  e).**     }.**  
9c50: 20 20 20 4e 65 78 74 20 28 57 69 6e 64 6f 77 2e     Next (Window.
9c60: 69 45 70 68 43 73 72 29 0a 2a 2a 20 20 20 7d 0a  iEphCsr).**   }.
9c70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
9c80: 69 6e 64 6f 77 52 65 74 75 72 6e 52 6f 77 73 28  indowReturnRows(
9c90: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9ca0: 2c 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69  ,.  Window *pMWi
9cb0: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
9cc0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 77      /* List of w
9cd0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
9ce0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43 74 72 2c  */.  int regCtr,
9cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d00: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
9d10: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 75 6d 62   containing numb
9d20: 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20  er of rows */.  
9d30: 69 6e 74 20 72 65 67 47 6f 73 75 62 2c 20 20 20  int regGosub,   
9d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d50: 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20  /* Register for 
9d60: 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62 20  Gosub addrGosub 
9d70: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 73  */.  int addrGos
9d80: 75 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ub,             
9d90: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
9da0: 6f 66 20 73 75 62 2d 72 6f 75 74 69 6e 65 20 66  of sub-routine f
9db0: 6f 72 20 52 65 74 75 72 6e 4f 6e 65 52 6f 77 20  or ReturnOneRow 
9dc0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 49 6e 76 41  */.  int regInvA
9dd0: 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
9de0: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
9df0: 20 72 65 67 69 73 74 65 72 73 20 66 6f 72 20 78   registers for x
9e00: 49 6e 76 65 72 73 65 20 61 72 67 73 20 2a 2f 0a  Inverse args */.
9e10: 20 20 69 6e 74 20 72 65 67 49 6e 76 53 69 7a 65    int regInvSize
9e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e30: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 63 6f    /* Register co
9e40: 6e 74 61 69 6e 69 6e 67 20 73 69 7a 65 20 6f 66  ntaining size of
9e50: 20 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 29 7b   partition */.){
9e60: 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 56  .  int addr;.  V
9e70: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
9e80: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
9e90: 0a 20 20 77 69 6e 64 6f 77 41 67 67 46 69 6e 61  .  windowAggFina
9ea0: 6c 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c  l(pParse, pMWin,
9eb0: 20 30 29 3b 0a 20 20 61 64 64 72 20 3d 20 73 71   0);.  addr = sq
9ec0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
9ed0: 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 72 65 67  v, OP_IfPos, reg
9ee0: 43 74 72 2c 20 73 71 6c 69 74 65 33 56 64 62 65  Ctr, sqlite3Vdbe
9ef0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32  CurrentAddr(v)+2
9f00: 20 2c 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56   ,1);.  sqlite3V
9f10: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
9f20: 47 6f 74 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 77  Goto, 0, 0);.  w
9f30: 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52 6f  indowReturnOneRo
9f40: 77 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c  w(pParse, pMWin,
9f50: 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47   regGosub, addrG
9f60: 6f 73 75 62 29 3b 0a 20 20 69 66 28 20 72 65 67  osub);.  if( reg
9f70: 49 6e 76 41 72 67 20 29 7b 0a 20 20 20 20 77 69  InvArg ){.    wi
9f80: 6e 64 6f 77 41 67 67 53 74 65 70 28 70 50 61 72  ndowAggStep(pPar
9f90: 73 65 2c 20 70 4d 57 69 6e 2c 20 70 4d 57 69 6e  se, pMWin, pMWin
9fa0: 2d 3e 69 45 70 68 43 73 72 2c 20 31 2c 20 72 65  ->iEphCsr, 1, re
9fb0: 67 49 6e 76 41 72 67 2c 20 72 65 67 49 6e 76 53  gInvArg, regInvS
9fc0: 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ize);.  }.  sqli
9fd0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
9fe0: 20 4f 50 5f 4e 65 78 74 2c 20 70 4d 57 69 6e 2d   OP_Next, pMWin-
9ff0: 3e 69 45 70 68 43 73 72 2c 20 61 64 64 72 29 3b  >iEphCsr, addr);
a000: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
a010: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 2b 31  mpHere(v, addr+1
a020: 29 3b 20 20 20 2f 2a 20 54 68 65 20 4f 50 5f 47  );   /* The OP_G
a030: 6f 74 6f 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  oto */.}../*.** 
a040: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
a050: 20 73 65 74 20 74 68 65 20 61 63 63 75 6d 75 6c   set the accumul
a060: 61 74 6f 72 20 72 65 67 69 73 74 65 72 20 66 6f  ator register fo
a070: 72 20 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75  r each window fu
a080: 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65  nction.** in the
a090: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 70 61 73   linked list pas
a0a0: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
a0b0: 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 4e 55  d argument to NU
a0c0: 4c 4c 2e 20 41 6e 64 20 70 65 72 66 6f 72 6d 0a  LL. And perform.
a0d0: 2a 2a 20 61 6e 79 20 65 71 75 69 76 61 6c 65 6e  ** any equivalen
a0e0: 74 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  t initialization
a0f0: 20 72 65 71 75 69 72 65 64 20 62 79 20 61 6e 79   required by any
a100: 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77   built-in window
a110: 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 69 6e   functions.** in
a120: 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74   the list..*/.st
a130: 61 74 69 63 20 69 6e 74 20 77 69 6e 64 6f 77 49  atic int windowI
a140: 6e 69 74 41 63 63 75 6d 28 50 61 72 73 65 20 2a  nitAccum(Parse *
a150: 70 50 61 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a  pParse, Window *
a160: 70 4d 57 69 6e 29 7b 0a 20 20 56 64 62 65 20 2a  pMWin){.  Vdbe *
a170: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
a180: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e  be(pParse);.  in
a190: 74 20 72 65 67 41 72 67 3b 0a 20 20 69 6e 74 20  t regArg;.  int 
a1a0: 6e 41 72 67 20 3d 20 30 3b 0a 20 20 57 69 6e 64  nArg = 0;.  Wind
a1b0: 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 66 6f 72 28  ow *pWin;.  for(
a1c0: 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e  pWin=pMWin; pWin
a1d0: 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65  ; pWin=pWin->pNe
a1e0: 78 74 57 69 6e 29 7b 0a 20 20 20 20 46 75 6e 63  xtWin){.    Func
a1f0: 44 65 66 20 2a 70 46 75 6e 63 20 3d 20 70 57 69  Def *pFunc = pWi
a200: 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 73 71  n->pFunc;.    sq
a210: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
a220: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70  v, OP_Null, 0, p
a230: 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 29 3b 0a  Win->regAccum);.
a240: 20 20 20 20 6e 41 72 67 20 3d 20 4d 41 58 28 6e      nArg = MAX(n
a250: 41 72 67 2c 20 77 69 6e 64 6f 77 41 72 67 43 6f  Arg, windowArgCo
a260: 75 6e 74 28 70 57 69 6e 29 29 3b 0a 20 20 20 20  unt(pWin));.    
a270: 69 66 28 20 70 46 75 6e 63 2d 3e 78 53 46 75 6e  if( pFunc->xSFun
a280: 63 3d 3d 6e 74 68 5f 76 61 6c 75 65 53 74 65 70  c==nth_valueStep
a290: 46 75 6e 63 0a 20 20 20 20 20 7c 7c 20 70 46 75  Func.     || pFu
a2a0: 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 66 69 72 73  nc->xSFunc==firs
a2b0: 74 5f 76 61 6c 75 65 53 74 65 70 46 75 6e 63 20  t_valueStepFunc 
a2c0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71  .    ){.      sq
a2d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
a2e0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
a2f0: 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 29 3b  , pWin->regApp);
a300: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a310: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
a320: 6e 74 65 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d  nteger, 0, pWin-
a330: 3e 72 65 67 41 70 70 2b 31 29 3b 0a 20 20 20 20  >regApp+1);.    
a340: 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 46 75 6e  }..    if( (pFun
a350: 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  c->funcFlags & S
a360: 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41  QLITE_FUNC_MINMA
a370: 58 29 20 26 26 20 70 57 69 6e 2d 3e 63 73 72 41  X) && pWin->csrA
a380: 70 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  pp ){.      asse
a390: 72 74 28 20 70 57 69 6e 2d 3e 65 53 74 61 72 74  rt( pWin->eStart
a3a0: 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29  !=TK_UNBOUNDED )
a3b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
a3c0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
a3d0: 52 65 73 65 74 53 6f 72 74 65 72 2c 20 70 57 69  ResetSorter, pWi
a3e0: 6e 2d 3e 63 73 72 41 70 70 29 3b 0a 20 20 20 20  n->csrApp);.    
a3f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a400: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
a410: 72 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41  r, 0, pWin->regA
a420: 70 70 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pp+1);.    }.  }
a430: 0a 20 20 72 65 67 41 72 67 20 3d 20 70 50 61 72  .  regArg = pPar
a440: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 70 50  se->nMem+1;.  pP
a450: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 41  arse->nMem += nA
a460: 72 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 67  rg;.  return reg
a470: 41 72 67 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  Arg;.}.../*.** T
a480: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
a490: 73 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 73 71  s the work of sq
a4a0: 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 53  lite3WindowCodeS
a4b0: 74 65 70 28 29 20 66 6f 72 20 61 6c 6c 20 22 52  tep() for all "R
a4c0: 4f 57 53 22 0a 2a 2a 20 77 69 6e 64 6f 77 20 66  OWS".** window f
a4d0: 72 61 6d 65 20 74 79 70 65 73 20 65 78 63 65 70  rame types excep
a4e0: 74 20 66 6f 72 20 22 42 45 54 57 45 45 4e 20 55  t for "BETWEEN U
a4f0: 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49  NBOUNDED PRECEDI
a500: 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54 0a 2a  NG AND CURRENT.*
a510: 2a 20 52 4f 57 22 2e 20 50 73 65 75 64 6f 2d 63  * ROW". Pseudo-c
a520: 6f 64 65 20 66 6f 72 20 65 61 63 68 20 66 6f 6c  ode for each fol
a530: 6c 6f 77 73 2e 0a 2a 2a 0a 2a 2a 20 52 4f 57 53  lows..**.** ROWS
a540: 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31 3e   BETWEEN <expr1>
a550: 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 3c   PRECEDING AND <
a560: 65 78 70 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47  expr2> FOLLOWING
a570: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 0a 2a  .**.**     ....*
a580: 2a 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 20  *       if( new 
a590: 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20  partition ){.** 
a5a0: 20 20 20 20 20 20 20 20 47 6f 73 75 62 20 66 6c          Gosub fl
a5b0: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 0a 2a 2a  ush_partition.**
a5c0: 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
a5d0: 20 20 49 6e 73 65 72 74 20 28 72 65 63 6f 72 64    Insert (record
a5e0: 20 69 6e 20 65 70 68 2d 74 61 62 6c 65 29 0a 2a   in eph-table).*
a5f0: 2a 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65  *     sqlite3Whe
a600: 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20 47  reEnd().**     G
a610: 6f 73 75 62 20 66 6c 75 73 68 5f 70 61 72 74 69  osub flush_parti
a620: 74 69 6f 6e 0a 2a 2a 20 20 0a 2a 2a 20 20 20 66  tion.**  .**   f
a630: 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 3a 0a  lush_partition:.
a640: 2a 2a 20 20 20 20 20 4f 6e 63 65 20 7b 0a 2a 2a  **     Once {.**
a650: 20 20 20 20 20 20 20 4f 70 65 6e 44 75 70 20 28         OpenDup (
a660: 69 45 70 68 43 73 72 20 2d 3e 20 63 73 72 53 74  iEphCsr -> csrSt
a670: 61 72 74 29 0a 2a 2a 20 20 20 20 20 20 20 4f 70  art).**       Op
a680: 65 6e 44 75 70 20 28 69 45 70 68 43 73 72 20 2d  enDup (iEphCsr -
a690: 3e 20 63 73 72 45 6e 64 29 0a 2a 2a 20 20 20 20  > csrEnd).**    
a6a0: 20 7d 0a 2a 2a 20 20 20 20 20 72 65 67 53 74 61   }.**     regSta
a6b0: 72 74 20 3d 20 3c 65 78 70 72 31 3e 20 20 20 20  rt = <expr1>    
a6c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 50              // P
a6d0: 52 45 43 45 44 49 4e 47 20 65 78 70 72 65 73 73  RECEDING express
a6e0: 69 6f 6e 0a 2a 2a 20 20 20 20 20 72 65 67 45 6e  ion.**     regEn
a6f0: 64 20 3d 20 3c 65 78 70 72 32 3e 20 20 20 20 20  d = <expr2>     
a700: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
a710: 46 4f 4c 4c 4f 57 49 4e 47 20 65 78 70 72 65 73  FOLLOWING expres
a720: 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 69 66 28 20  sion.**     if( 
a730: 72 65 67 53 74 61 72 74 3c 30 20 7c 7c 20 72 65  regStart<0 || re
a740: 67 45 6e 64 3c 30 20 29 7b 20 65 72 72 6f 72 21  gEnd<0 ){ error!
a750: 20 7d 0a 2a 2a 20 20 20 20 20 52 65 77 69 6e 64   }.**     Rewind
a760: 20 28 63 73 72 2c 63 73 72 53 74 61 72 74 2c 63   (csr,csrStart,c
a770: 73 72 45 6e 64 29 20 20 20 20 20 20 2f 2f 20 69  srEnd)      // i
a780: 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68  f EOF goto flush
a790: 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a  _partition_done.
a7a0: 2a 2a 20 20 20 20 20 20 20 4e 65 78 74 28 63 73  **       Next(cs
a7b0: 72 45 6e 64 29 20 20 20 20 20 20 20 20 20 20 20  rEnd)           
a7c0: 20 20 20 20 20 20 20 20 20 2f 2f 20 69 66 20 45           // if E
a7d0: 4f 46 20 73 6b 69 70 20 41 67 67 73 74 65 70 0a  OF skip Aggstep.
a7e0: 2a 2a 20 20 20 20 20 20 20 41 67 67 73 74 65 70  **       Aggstep
a7f0: 20 28 63 73 72 45 6e 64 29 0a 2a 2a 20 20 20 20   (csrEnd).**    
a800: 20 20 20 69 66 28 20 28 72 65 67 45 6e 64 2d 2d     if( (regEnd--
a810: 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20  )<=0 ){.**      
a820: 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78 56 61     AggFinal (xVa
a830: 6c 75 65 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  lue).**         
a840: 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a  Gosub addrGosub.
a850: 2a 2a 20 20 20 20 20 20 20 20 20 4e 65 78 74 28  **         Next(
a860: 63 73 72 29 20 20 20 20 20 20 20 20 20 20 20 20  csr)            
a870: 20 20 20 20 2f 2f 20 69 66 20 45 4f 46 20 67 6f      // if EOF go
a880: 74 6f 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69  to flush_partiti
a890: 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20 20  on_done.**      
a8a0: 20 20 20 69 66 28 20 28 72 65 67 53 74 61 72 74     if( (regStart
a8b0: 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20  --)<=0 ){.**    
a8c0: 20 20 20 20 20 20 20 41 67 67 53 74 65 70 20 28         AggStep (
a8d0: 63 73 72 53 74 61 72 74 2c 20 78 49 6e 76 65 72  csrStart, xInver
a8e0: 73 65 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  se).**          
a8f0: 20 4e 65 78 74 28 63 73 72 53 74 61 72 74 29 0a   Next(csrStart).
a900: 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20  **         }.** 
a910: 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 66 6c 75        }.**   flu
a920: 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e  sh_partition_don
a930: 65 3a 0a 2a 2a 20 20 20 20 20 52 65 73 65 74 53  e:.**     ResetS
a940: 6f 72 74 65 72 20 28 63 73 72 29 0a 2a 2a 20 20  orter (csr).**  
a950: 20 20 20 52 65 74 75 72 6e 0a 2a 2a 0a 2a 2a 20     Return.**.** 
a960: 52 4f 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78  ROWS BETWEEN <ex
a970: 70 72 3e 20 50 52 45 43 45 44 49 4e 47 20 20 20  pr> PRECEDING   
a980: 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57   AND CURRENT ROW
a990: 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57 45 45 4e  .** ROWS BETWEEN
a9a0: 20 43 55 52 52 45 4e 54 20 52 4f 57 20 20 20 20   CURRENT ROW    
a9b0: 20 20 20 20 20 41 4e 44 20 3c 65 78 70 72 3e 20       AND <expr> 
a9c0: 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 20 52 4f 57  FOLLOWING.** ROW
a9d0: 53 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e  S BETWEEN UNBOUN
a9e0: 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e  DED PRECEDING AN
a9f0: 44 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49  D <expr> FOLLOWI
aa00: 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 73 65  NG.**.**   These
aa10: 20 61 72 65 20 73 69 6d 69 6c 61 72 20 74 6f 20   are similar to 
aa20: 74 68 65 20 61 62 6f 76 65 2e 20 46 6f 72 20 22  the above. For "
aa30: 43 55 52 52 45 4e 54 20 52 4f 57 22 2c 20 69 6e  CURRENT ROW", in
aa40: 74 69 61 6c 69 7a 65 20 74 68 65 0a 2a 2a 20 20  tialize the.**  
aa50: 20 72 65 67 69 73 74 65 72 20 74 6f 20 30 2e 20   register to 0. 
aa60: 46 6f 72 20 22 55 4e 42 4f 55 4e 44 45 44 20 50  For "UNBOUNDED P
aa70: 52 45 43 45 44 49 4e 47 22 20 74 6f 20 69 6e 66  RECEDING" to inf
aa80: 69 6e 69 74 79 2e 0a 2a 2a 0a 2a 2a 20 52 4f 57  inity..**.** ROW
aa90: 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 3e  S BETWEEN <expr>
aaa0: 20 50 52 45 43 45 44 49 4e 47 20 20 20 20 41 4e   PRECEDING    AN
aab0: 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c  D UNBOUNDED FOLL
aac0: 4f 57 49 4e 47 0a 2a 2a 20 52 4f 57 53 20 42 45  OWING.** ROWS BE
aad0: 54 57 45 45 4e 20 43 55 52 52 45 4e 54 20 52 4f  TWEEN CURRENT RO
aae0: 57 20 20 20 20 20 20 20 20 20 41 4e 44 20 55 4e  W         AND UN
aaf0: 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e  BOUNDED FOLLOWIN
ab00: 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 77 69  G.**.**     Rewi
ab10: 6e 64 20 28 63 73 72 2c 63 73 72 53 74 61 72 74  nd (csr,csrStart
ab20: 2c 63 73 72 45 6e 64 29 20 20 20 20 2f 2f 20 69  ,csrEnd)    // i
ab30: 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68  f EOF goto flush
ab40: 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a  _partition_done.
ab50: 2a 2a 20 20 20 20 20 77 68 69 6c 65 28 20 31 20  **     while( 1 
ab60: 29 7b 0a 2a 2a 20 20 20 20 20 20 20 4e 65 78 74  ){.**       Next
ab70: 28 63 73 72 45 6e 64 29 20 20 20 20 20 20 20 20  (csrEnd)        
ab80: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 45 78 69            // Exi
ab90: 74 20 77 68 69 6c 65 28 31 29 20 61 74 20 45 4f  t while(1) at EO
aba0: 46 0a 2a 2a 20 20 20 20 20 20 20 41 67 67 73 74  F.**       Aggst
abb0: 65 70 20 28 63 73 72 45 6e 64 29 0a 2a 2a 20 20  ep (csrEnd).**  
abc0: 20 20 20 7d 0a 2a 2a 20 20 20 20 20 77 68 69 6c     }.**     whil
abd0: 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20 20  e( 1 ){.**      
abe0: 20 41 67 67 46 69 6e 61 6c 20 28 78 56 61 6c 75   AggFinal (xValu
abf0: 65 29 0a 2a 2a 20 20 20 20 20 20 20 47 6f 73 75  e).**       Gosu
ac00: 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20  b addrGosub.**  
ac10: 20 20 20 20 20 4e 65 78 74 28 63 73 72 29 20 20       Next(csr)  
ac20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac30: 20 20 20 2f 2f 20 69 66 20 45 4f 46 20 67 6f 74     // if EOF got
ac40: 6f 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f  o flush_partitio
ac50: 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20  n_done.**       
ac60: 69 66 28 20 28 72 65 67 53 74 61 72 74 2d 2d 29  if( (regStart--)
ac70: 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  <=0 ){.**       
ac80: 20 20 41 67 67 53 74 65 70 20 28 63 73 72 53 74    AggStep (csrSt
ac90: 61 72 74 2c 20 78 49 6e 76 65 72 73 65 29 0a 2a  art, xInverse).*
aca0: 2a 20 20 20 20 20 20 20 20 20 4e 65 78 74 28 63  *         Next(c
acb0: 73 72 53 74 61 72 74 29 0a 2a 2a 20 20 20 20 20  srStart).**     
acc0: 20 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a    }.**     }.**.
acd0: 2a 2a 20 20 20 46 6f 72 20 74 68 65 20 22 43 55  **   For the "CU
ace0: 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 55 4e  RRENT ROW AND UN
acf0: 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e  BOUNDED FOLLOWIN
ad00: 47 22 20 63 61 73 65 2c 20 74 68 65 20 66 69 6e  G" case, the fin
ad10: 61 6c 20 69 66 28 29 20 0a 2a 2a 20 20 20 63 6f  al if() .**   co
ad20: 6e 64 69 74 69 6f 6e 20 69 73 20 61 6c 77 61 79  ndition is alway
ad30: 73 20 74 72 75 65 20 28 61 73 20 69 66 20 72 65  s true (as if re
ad40: 67 53 74 61 72 74 20 77 65 72 65 20 69 6e 69 74  gStart were init
ad50: 69 61 6c 69 7a 65 64 20 74 6f 20 30 29 2e 0a 2a  ialized to 0)..*
ad60: 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54 57 45  *.** RANGE BETWE
ad70: 45 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20 41  EN CURRENT ROW A
ad80: 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c  ND UNBOUNDED FOL
ad90: 4c 4f 57 49 4e 47 0a 2a 2a 20 0a 2a 2a 20 20 20  LOWING.** .**   
ada0: 54 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79  This is the only
adb0: 20 52 41 4e 47 45 20 63 61 73 65 20 68 61 6e 64   RANGE case hand
adc0: 6c 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74  led by this rout
add0: 69 6e 65 2e 20 49 74 20 6d 6f 64 69 66 69 65 73  ine. It modifies
ade0: 20 74 68 65 0a 2a 2a 20 20 20 73 65 63 6f 6e 64   the.**   second
adf0: 20 77 68 69 6c 65 28 20 31 20 29 20 6c 6f 6f 70   while( 1 ) loop
ae00: 20 69 6e 20 22 52 4f 57 53 20 42 45 54 57 45 45   in "ROWS BETWEE
ae10: 4e 20 43 55 52 52 45 4e 54 20 2e 2e 2e 20 55 4e  N CURRENT ... UN
ae20: 42 4f 55 4e 44 45 44 2e 2e 2e 22 20 74 6f 0a 2a  BOUNDED..." to.*
ae30: 2a 20 20 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  *   be:.**.**   
ae40: 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 2a 2a    while( 1 ){.**
ae50: 20 20 20 20 20 20 20 41 67 67 46 69 6e 61 6c 20         AggFinal 
ae60: 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20 20 20 20  (xValue).**     
ae70: 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 2a 2a    while( 1 ){.**
ae80: 20 20 20 20 20 20 20 20 20 72 65 67 50 65 65 72           regPeer
ae90: 2b 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20 47 6f  ++.**         Go
aea0: 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a  sub addrGosub.**
aeb0: 20 20 20 20 20 20 20 20 20 4e 65 78 74 28 63 73           Next(cs
aec0: 72 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r)              
aed0: 20 20 20 20 20 20 20 2f 2f 20 69 66 20 45 4f 46         // if EOF
aee0: 20 67 6f 74 6f 20 66 6c 75 73 68 5f 70 61 72 74   goto flush_part
aef0: 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20  ition_done.**   
af00: 20 20 20 20 20 20 69 66 28 20 6e 65 77 20 70 65        if( new pe
af10: 65 72 20 29 20 62 72 65 61 6b 3b 0a 2a 2a 20 20  er ) break;.**  
af20: 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20       }.**       
af30: 77 68 69 6c 65 28 20 28 72 65 67 50 65 65 72 2d  while( (regPeer-
af40: 2d 29 3e 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20  -)>0 ){.**      
af50: 20 20 20 41 67 67 53 74 65 70 20 28 63 73 72 53     AggStep (csrS
af60: 74 61 72 74 2c 20 78 49 6e 76 65 72 73 65 29 0a  tart, xInverse).
af70: 2a 2a 20 20 20 20 20 20 20 20 20 4e 65 78 74 28  **         Next(
af80: 63 73 72 53 74 61 72 74 29 0a 2a 2a 20 20 20 20  csrStart).**    
af90: 20 20 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a     }.**     }.**
afa0: 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57 45 45 4e  .** ROWS BETWEEN
afb0: 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e   <expr> FOLLOWIN
afc0: 47 20 20 20 20 41 4e 44 20 3c 65 78 70 72 3e 20  G    AND <expr> 
afd0: 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20  FOLLOWING.**.** 
afe0: 20 20 72 65 67 45 6e 64 20 3d 20 72 65 67 45 6e    regEnd = regEn
aff0: 64 20 2d 20 72 65 67 53 74 61 72 74 0a 2a 2a 20  d - regStart.** 
b000: 20 20 52 65 77 69 6e 64 20 28 63 73 72 2c 63 73    Rewind (csr,cs
b010: 72 53 74 61 72 74 2c 63 73 72 45 6e 64 29 20 20  rStart,csrEnd)  
b020: 20 2f 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f 20   // if EOF goto 
b030: 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f  flush_partition_
b040: 64 6f 6e 65 0a 2a 2a 20 20 20 20 20 41 67 67 73  done.**     Aggs
b050: 74 65 70 20 28 63 73 72 45 6e 64 29 0a 2a 2a 20  tep (csrEnd).** 
b060: 20 20 20 20 4e 65 78 74 28 63 73 72 45 6e 64 29      Next(csrEnd)
b070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b080: 20 2f 2f 20 69 66 20 45 4f 46 20 66 61 6c 6c 2d   // if EOF fall-
b090: 74 68 72 6f 75 67 68 0a 2a 2a 20 20 20 20 20 69  through.**     i
b0a0: 66 28 20 28 72 65 67 45 6e 64 2d 2d 29 3c 3d 30  f( (regEnd--)<=0
b0b0: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28   ){.**       if(
b0c0: 20 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30   (regStart--)<=0
b0d0: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41   ){.**         A
b0e0: 67 67 46 69 6e 61 6c 20 28 78 56 61 6c 75 65 29  ggFinal (xValue)
b0f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 47 6f 73 75  .**         Gosu
b100: 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20  b addrGosub.**  
b110: 20 20 20 20 20 20 20 4e 65 78 74 28 63 73 72 29         Next(csr)
b120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
b130: 20 69 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c 75   if EOF goto flu
b140: 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e  sh_partition_don
b150: 65 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20  e.**       }.** 
b160: 20 20 20 20 20 20 41 67 67 53 74 65 70 20 28 63        AggStep (c
b170: 73 72 53 74 61 72 74 2c 20 78 49 6e 76 65 72 73  srStart, xInvers
b180: 65 29 0a 2a 2a 20 20 20 20 20 20 20 4e 65 78 74  e).**       Next
b190: 20 28 63 73 72 53 74 61 72 74 29 0a 2a 2a 20 20   (csrStart).**  
b1a0: 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 52 4f 57 53 20     }.**.** ROWS 
b1b0: 42 45 54 57 45 45 4e 20 3c 65 78 70 72 3e 20 50  BETWEEN <expr> P
b1c0: 52 45 43 45 44 49 4e 47 20 20 20 20 41 4e 44 20  RECEDING    AND 
b1d0: 3c 65 78 70 72 3e 20 50 52 45 43 45 44 49 4e 47  <expr> PRECEDING
b1e0: 0a 2a 2a 0a 2a 2a 20 20 20 52 65 70 6c 61 63 65  .**.**   Replace
b1f0: 20 74 68 65 20 62 69 74 20 61 66 74 65 72 20 22   the bit after "
b200: 52 65 77 69 6e 64 22 20 69 6e 20 74 68 65 20 61  Rewind" in the a
b210: 62 6f 76 65 20 77 69 74 68 3a 0a 2a 2a 0a 2a 2a  bove with:.**.**
b220: 20 20 20 20 20 69 66 28 20 28 72 65 67 45 6e 64       if( (regEnd
b230: 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20  --)<=0 ){.**    
b240: 20 20 20 41 67 67 53 74 65 70 20 28 63 73 72 45     AggStep (csrE
b250: 6e 64 29 0a 2a 2a 20 20 20 20 20 20 20 4e 65 78  nd).**       Nex
b260: 74 20 28 63 73 72 45 6e 64 29 0a 2a 2a 20 20 20  t (csrEnd).**   
b270: 20 20 7d 0a 2a 2a 20 20 20 20 20 41 67 67 46 69    }.**     AggFi
b280: 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20  nal (xValue).** 
b290: 20 20 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f      Gosub addrGo
b2a0: 73 75 62 0a 2a 2a 20 20 20 20 20 4e 65 78 74 28  sub.**     Next(
b2b0: 63 73 72 29 20 20 20 20 20 20 20 20 20 20 20 20  csr)            
b2c0: 20 20 20 20 20 20 2f 2f 20 69 66 20 45 4f 46 20        // if EOF 
b2d0: 67 6f 74 6f 20 66 6c 75 73 68 5f 70 61 72 74 69  goto flush_parti
b2e0: 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20  tion_done.**    
b2f0: 20 69 66 28 20 28 72 65 67 53 74 61 72 74 2d 2d   if( (regStart--
b300: 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20  )<=0 ){.**      
b310: 20 41 67 67 53 74 65 70 20 28 63 73 72 32 2c 20   AggStep (csr2, 
b320: 78 49 6e 76 65 72 73 65 29 0a 2a 2a 20 20 20 20  xInverse).**    
b330: 20 20 20 4e 65 78 74 20 28 63 73 72 32 29 0a 2a     Next (csr2).*
b340: 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2f 0a 73 74  *     }.**.*/.st
b350: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77  atic void window
b360: 43 6f 64 65 52 6f 77 45 78 70 72 53 74 65 70 28  CodeRowExprStep(
b370: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
b380: 2c 20 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 0a  , .  Select *p,.
b390: 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
b3a0: 6e 66 6f 2c 0a 20 20 69 6e 74 20 72 65 67 47 6f  nfo,.  int regGo
b3b0: 73 75 62 2c 20 0a 20 20 69 6e 74 20 61 64 64 72  sub, .  int addr
b3c0: 47 6f 73 75 62 0a 29 7b 0a 20 20 57 69 6e 64 6f  Gosub.){.  Windo
b3d0: 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57  w *pMWin = p->pW
b3e0: 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  in;.  Vdbe *v = 
b3f0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
b400: 50 61 72 73 65 29 3b 0a 20 20 57 69 6e 64 6f 77  Parse);.  Window
b410: 20 2a 70 57 69 6e 3b 0a 20 20 69 6e 74 20 6b 3b   *pWin;.  int k;
b420: 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 70 2d  .  int nSub = p-
b430: 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62  >pSrc->a[0].pTab
b440: 2d 3e 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 72 65  ->nCol;.  int re
b450: 67 46 6c 75 73 68 50 61 72 74 3b 20 20 20 20 20  gFlushPart;     
b460: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
b470: 69 73 74 65 72 20 66 6f 72 20 22 47 6f 73 75 62  ister for "Gosub
b480: 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e   flush_partition
b490: 22 20 2a 2f 0a 20 20 69 6e 74 20 6c 62 6c 46 6c  " */.  int lblFl
b4a0: 75 73 68 50 61 72 74 3b 20 20 20 20 20 20 20 20  ushPart;        
b4b0: 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
b4c0: 66 6f 72 20 22 47 6f 73 75 62 20 66 6c 75 73 68  for "Gosub flush
b4d0: 5f 70 61 72 74 69 74 69 6f 6e 22 20 2a 2f 0a 20  _partition" */. 
b4e0: 20 69 6e 74 20 6c 62 6c 46 6c 75 73 68 44 6f 6e   int lblFlushDon
b4f0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
b500: 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 22 47   /* Label for "G
b510: 6f 73 75 62 20 66 6c 75 73 68 5f 70 61 72 74 69  osub flush_parti
b520: 74 69 6f 6e 5f 64 6f 6e 65 22 20 2a 2f 0a 0a 20  tion_done" */.. 
b530: 20 69 6e 74 20 72 65 67 41 72 67 3b 0a 20 20 69   int regArg;.  i
b540: 6e 74 20 6e 41 72 67 3b 0a 20 20 69 6e 74 20 61  nt nArg;.  int a
b550: 64 64 72 3b 0a 20 20 69 6e 74 20 63 73 72 53 74  ddr;.  int csrSt
b560: 61 72 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  art = pParse->nT
b570: 61 62 2b 2b 3b 0a 20 20 69 6e 74 20 63 73 72 45  ab++;.  int csrE
b580: 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  nd = pParse->nTa
b590: 62 2b 2b 3b 0a 20 20 69 6e 74 20 72 65 67 53 74  b++;.  int regSt
b5a0: 61 72 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  art;            
b5b0: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
b5c0: 20 6f 66 20 3c 65 78 70 72 3e 20 50 52 45 43 45   of <expr> PRECE
b5d0: 44 49 4e 47 20 2a 2f 0a 20 20 69 6e 74 20 72 65  DING */.  int re
b5e0: 67 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  gEnd;           
b5f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
b600: 6c 75 65 20 6f 66 20 3c 65 78 70 72 3e 20 46 4f  lue of <expr> FO
b610: 4c 4c 4f 57 49 4e 47 20 2a 2f 0a 20 20 69 6e 74  LLOWING */.  int
b620: 20 61 64 64 72 4e 65 78 74 3b 0a 20 20 69 6e 74   addrNext;.  int
b630: 20 61 64 64 72 47 6f 74 6f 3b 0a 20 20 69 6e 74   addrGoto;.  int
b640: 20 61 64 64 72 54 6f 70 3b 0a 20 20 69 6e 74 20   addrTop;.  int 
b650: 61 64 64 72 49 66 50 6f 73 31 3b 0a 20 20 69 6e  addrIfPos1;.  in
b660: 74 20 61 64 64 72 49 66 50 6f 73 32 3b 0a 0a 20  t addrIfPos2;.. 
b670: 20 69 6e 74 20 72 65 67 50 65 65 72 20 3d 20 30   int regPeer = 0
b680: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b690: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
b6a0: 65 65 72 73 20 69 6e 20 63 75 72 72 65 6e 74 20  eers in current 
b6b0: 67 72 6f 75 70 20 2a 2f 0a 20 20 69 6e 74 20 72  group */.  int r
b6c0: 65 67 50 65 65 72 56 61 6c 20 3d 20 30 3b 20 20  egPeerVal = 0;  
b6d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
b6e0: 72 72 61 79 20 6f 66 20 76 61 6c 75 65 73 20 69  rray of values i
b6f0: 64 65 6e 74 69 66 79 69 6e 67 20 70 65 65 72 20  dentifying peer 
b700: 67 72 6f 75 70 20 2a 2f 0a 20 20 69 6e 74 20 69  group */.  int i
b710: 50 65 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  Peer = 0;       
b720: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
b730: 6f 6c 75 6d 6e 20 6f 66 66 73 65 74 20 69 6e 20  olumn offset in 
b740: 65 70 68 2d 74 61 62 6c 65 20 6f 66 20 70 65 65  eph-table of pee
b750: 72 20 76 61 6c 73 20 2a 2f 0a 20 20 69 6e 74 20  r vals */.  int 
b760: 6e 50 65 65 72 56 61 6c 3b 20 20 20 20 20 20 20  nPeerVal;       
b770: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b780: 4e 75 6d 62 65 72 20 6f 66 20 70 65 65 72 20 76  Number of peer v
b790: 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72  alues */.  int r
b7a0: 65 67 53 69 7a 65 20 3d 20 30 3b 0a 0a 20 20 61  egSize = 0;..  a
b7b0: 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 53  ssert( pMWin->eS
b7c0: 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49  tart==TK_PRECEDI
b7d0: 4e 47 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d  NG .       || pM
b7e0: 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
b7f0: 43 55 52 52 45 4e 54 20 0a 20 20 20 20 20 20 20  CURRENT .       
b800: 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  || pMWin->eStart
b810: 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 0a  ==TK_FOLLOWING .
b820: 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d         || pMWin-
b830: 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f  >eStart==TK_UNBO
b840: 55 4e 44 45 44 20 0a 20 20 29 3b 0a 20 20 61 73  UNDED .  );.  as
b850: 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 45 6e  sert( pMWin->eEn
b860: 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  d==TK_FOLLOWING 
b870: 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e  .       || pMWin
b880: 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45  ->eEnd==TK_CURRE
b890: 4e 54 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d  NT .       || pM
b8a0: 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e  Win->eEnd==TK_UN
b8b0: 42 4f 55 4e 44 45 44 20 0a 20 20 20 20 20 20 20  BOUNDED .       
b8c0: 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  || pMWin->eEnd==
b8d0: 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 0a 20 20  TK_PRECEDING .  
b8e0: 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
b8f0: 65 20 72 65 67 69 73 74 65 72 20 61 6e 64 20 6c  e register and l
b900: 61 62 65 6c 20 66 6f 72 20 74 68 65 20 22 66 6c  abel for the "fl
b910: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 20 73  ush_partition" s
b920: 75 62 2d 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20  ub-routine. */. 
b930: 20 72 65 67 46 6c 75 73 68 50 61 72 74 20 3d 20   regFlushPart = 
b940: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
b950: 20 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 20 3d    lblFlushPart =
b960: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
b970: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c 62 6c 46  Label(v);.  lblF
b980: 6c 75 73 68 44 6f 6e 65 20 3d 20 73 71 6c 69 74  lushDone = sqlit
b990: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
b9a0: 76 29 3b 0a 0a 20 20 72 65 67 53 74 61 72 74 20  v);..  regStart 
b9b0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
b9c0: 3b 0a 20 20 72 65 67 45 6e 64 20 3d 20 2b 2b 70  ;.  regEnd = ++p
b9d0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20  Parse->nMem;..  
b9e0: 77 69 6e 64 6f 77 50 61 72 74 69 74 69 6f 6e 43  windowPartitionC
b9f0: 61 63 68 65 28 70 50 61 72 73 65 2c 20 70 2c 20  ache(pParse, p, 
ba00: 70 57 49 6e 66 6f 2c 20 72 65 67 46 6c 75 73 68  pWInfo, regFlush
ba10: 50 61 72 74 2c 20 6c 62 6c 46 6c 75 73 68 50 61  Part, lblFlushPa
ba20: 72 74 2c 20 26 72 65 67 53 69 7a 65 29 3b 0a 0a  rt, &regSize);..
ba30: 20 20 61 64 64 72 47 6f 74 6f 20 3d 20 73 71 6c    addrGoto = sql
ba40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
ba50: 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 0a 20 20 2f  , OP_Goto);..  /
ba60: 2a 20 53 74 61 72 74 20 6f 66 20 22 66 6c 75 73  * Start of "flus
ba70: 68 5f 70 61 72 74 69 74 69 6f 6e 22 20 2a 2f 0a  h_partition" */.
ba80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
ba90: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c  olveLabel(v, lbl
baa0: 46 6c 75 73 68 50 61 72 74 29 3b 0a 20 20 73 71  FlushPart);.  sq
bab0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
bac0: 76 2c 20 4f 50 5f 4f 6e 63 65 2c 20 30 2c 20 73  v, OP_Once, 0, s
bad0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
bae0: 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 73  tAddr(v)+3);.  s
baf0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
bb00: 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20  (v, OP_OpenDup, 
bb10: 63 73 72 53 74 61 72 74 2c 20 70 4d 57 69 6e 2d  csrStart, pMWin-
bb20: 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 73 71 6c  >iEphCsr);.  sql
bb30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
bb40: 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 63 73  , OP_OpenDup, cs
bb50: 72 45 6e 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  rEnd, pMWin->iEp
bb60: 68 43 73 72 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  hCsr);..  /* If 
bb70: 65 69 74 68 65 72 20 72 65 67 53 74 61 72 74 20  either regStart 
bb80: 6f 72 20 72 65 67 45 6e 64 20 61 72 65 20 6e 6f  or regEnd are no
bb90: 74 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69  t non-negative i
bba0: 6e 74 65 67 65 72 73 2c 20 74 68 72 6f 77 20 0a  ntegers, throw .
bbb0: 20 20 2a 2a 20 61 6e 20 65 78 63 65 70 74 69 6f    ** an exceptio
bbc0: 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57  n.  */.  if( pMW
bbd0: 69 6e 2d 3e 70 53 74 61 72 74 20 29 7b 0a 20 20  in->pStart ){.  
bbe0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
bbf0: 65 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2d  e(pParse, pMWin-
bc00: 3e 70 53 74 61 72 74 2c 20 72 65 67 53 74 61 72  >pStart, regStar
bc10: 74 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43 68  t);.    windowCh
bc20: 65 63 6b 46 72 61 6d 65 56 61 6c 75 65 28 70 50  eckFrameValue(pP
bc30: 61 72 73 65 2c 20 72 65 67 53 74 61 72 74 2c 20  arse, regStart, 
bc40: 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d  0);.  }.  if( pM
bc50: 57 69 6e 2d 3e 70 45 6e 64 20 29 7b 0a 20 20 20  Win->pEnd ){.   
bc60: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
bc70: 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2d 3e  (pParse, pMWin->
bc80: 70 45 6e 64 2c 20 72 65 67 45 6e 64 29 3b 0a 20  pEnd, regEnd);. 
bc90: 20 20 20 77 69 6e 64 6f 77 43 68 65 63 6b 46 72     windowCheckFr
bca0: 61 6d 65 56 61 6c 75 65 28 70 50 61 72 73 65 2c  ameValue(pParse,
bcb0: 20 72 65 67 45 6e 64 2c 20 31 29 3b 0a 20 20 7d   regEnd, 1);.  }
bcc0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
bcd0: 73 20 22 52 4f 57 53 20 3c 65 78 70 72 31 3e 20  s "ROWS <expr1> 
bce0: 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e 44 20 52 4f  FOLLOWING AND RO
bcf0: 57 53 20 3c 65 78 70 72 32 3e 20 46 4f 4c 4c 4f  WS <expr2> FOLLO
bd00: 57 49 4e 47 22 2c 20 64 6f 3a 0a 20 20 2a 2a 0a  WING", do:.  **.
bd10: 20 20 2a 2a 20 20 20 69 66 28 20 72 65 67 45 6e    **   if( regEn
bd20: 64 3c 72 65 67 53 74 61 72 74 20 29 7b 0a 20 20  d<regStart ){.  
bd30: 2a 2a 20 20 20 20 20 2f 2f 20 54 68 65 20 66 72  **     // The fr
bd40: 61 6d 65 20 61 6c 77 61 79 73 20 63 6f 6e 73 69  ame always consi
bd50: 73 74 73 20 6f 66 20 30 20 72 6f 77 73 0a 20 20  sts of 0 rows.  
bd60: 2a 2a 20 20 20 20 20 72 65 67 53 74 61 72 74 20  **     regStart 
bd70: 3d 20 72 65 67 53 69 7a 65 3b 0a 20 20 2a 2a 20  = regSize;.  ** 
bd80: 20 20 7d 0a 20 20 2a 2a 20 20 20 72 65 67 45 6e    }.  **   regEn
bd90: 64 20 3d 20 72 65 67 45 6e 64 20 2d 20 72 65 67  d = regEnd - reg
bda0: 53 74 61 72 74 3b 0a 20 20 2a 2f 0a 20 20 69 66  Start;.  */.  if
bdb0: 28 20 70 4d 57 69 6e 2d 3e 70 45 6e 64 20 26 26  ( pMWin->pEnd &&
bdc0: 20 70 4d 57 69 6e 2d 3e 70 53 74 61 72 74 20 26   pMWin->pStart &
bdd0: 26 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d  & pMWin->eStart=
bde0: 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b  =TK_FOLLOWING ){
bdf0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 57  .    assert( pMW
be00: 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c  in->eEnd==TK_FOL
be10: 4c 4f 57 49 4e 47 20 29 3b 0a 20 20 20 20 73 71  LOWING );.    sq
be20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
be30: 76 2c 20 4f 50 5f 47 65 2c 20 72 65 67 53 74 61  v, OP_Ge, regSta
be40: 72 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  rt, sqlite3VdbeC
be50: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 2c  urrentAddr(v)+2,
be60: 20 72 65 67 45 6e 64 29 3b 0a 20 20 20 20 73 71   regEnd);.    sq
be70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
be80: 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 53  v, OP_Copy, regS
be90: 69 7a 65 2c 20 72 65 67 53 74 61 72 74 29 3b 0a  ize, regStart);.
bea0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
beb0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74  ddOp3(v, OP_Subt
bec0: 72 61 63 74 2c 20 72 65 67 53 74 61 72 74 2c 20  ract, regStart, 
bed0: 72 65 67 45 6e 64 2c 20 72 65 67 45 6e 64 29 3b  regEnd, regEnd);
bee0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4d 57 69  .  }..  if( pMWi
bef0: 6e 2d 3e 70 45 6e 64 20 26 26 20 70 4d 57 69 6e  n->pEnd && pMWin
bf00: 2d 3e 70 53 74 61 72 74 20 26 26 20 70 4d 57 69  ->pStart && pMWi
bf10: 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43  n->eEnd==TK_PREC
bf20: 45 44 49 4e 47 20 29 7b 0a 20 20 20 20 61 73 73  EDING ){.    ass
bf30: 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61  ert( pMWin->eSta
bf40: 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47  rt==TK_PRECEDING
bf50: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
bf60: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
bf70: 4c 65 2c 20 72 65 67 53 74 61 72 74 2c 20 73 71  Le, regStart, sq
bf80: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
bf90: 41 64 64 72 28 76 29 2b 33 2c 20 72 65 67 45 6e  Addr(v)+3, regEn
bfa0: 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  d);.    sqlite3V
bfb0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
bfc0: 43 6f 70 79 2c 20 72 65 67 53 69 7a 65 2c 20 72  Copy, regSize, r
bfd0: 65 67 53 74 61 72 74 29 3b 0a 20 20 20 20 73 71  egStart);.    sq
bfe0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
bff0: 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 53  v, OP_Copy, regS
c000: 69 7a 65 2c 20 72 65 67 45 6e 64 29 3b 0a 20 20  ize, regEnd);.  
c010: 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  }..  /* Initiali
c020: 7a 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  ze the accumulat
c030: 6f 72 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  or register for 
c040: 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63  each window func
c050: 74 69 6f 6e 20 74 6f 20 4e 55 4c 4c 20 2a 2f 0a  tion to NULL */.
c060: 20 20 72 65 67 41 72 67 20 3d 20 77 69 6e 64 6f    regArg = windo
c070: 77 49 6e 69 74 41 63 63 75 6d 28 70 50 61 72 73  wInitAccum(pPars
c080: 65 2c 20 70 4d 57 69 6e 29 3b 0a 0a 20 20 73 71  e, pMWin);..  sq
c090: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
c0a0: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4d  v, OP_Rewind, pM
c0b0: 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 6c 62  Win->iEphCsr, lb
c0c0: 6c 46 6c 75 73 68 44 6f 6e 65 29 3b 0a 20 20 73  lFlushDone);.  s
c0d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
c0e0: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 63  (v, OP_Rewind, c
c0f0: 73 72 53 74 61 72 74 2c 20 6c 62 6c 46 6c 75 73  srStart, lblFlus
c100: 68 44 6f 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65  hDone);.  sqlite
c110: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
c120: 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   1);.  sqlite3Vd
c130: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
c140: 65 77 69 6e 64 2c 20 63 73 72 45 6e 64 2c 20 6c  ewind, csrEnd, l
c150: 62 6c 46 6c 75 73 68 44 6f 6e 65 29 3b 0a 20 20  blFlushDone);.  
c160: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
c170: 65 50 35 28 76 2c 20 31 29 3b 0a 0a 20 20 2f 2a  eP5(v, 1);..  /*
c180: 20 49 6e 76 6f 6b 65 20 41 67 67 53 74 65 70 20   Invoke AggStep 
c190: 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65 61 63  function for eac
c1a0: 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  h window functio
c1b0: 6e 20 75 73 69 6e 67 20 74 68 65 20 72 6f 77 20  n using the row 
c1c0: 74 68 61 74 0a 20 20 2a 2a 20 63 73 72 45 6e 64  that.  ** csrEnd
c1d0: 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
c1e0: 73 20 74 6f 2e 20 4f 72 2c 20 69 66 20 63 73 72  s to. Or, if csr
c1f0: 45 6e 64 20 69 73 20 61 6c 72 65 61 64 79 20 61  End is already a
c200: 74 20 45 4f 46 2c 0a 20 20 2a 2a 20 64 6f 20 6e  t EOF,.  ** do n
c210: 6f 74 68 69 6e 67 2e 20 20 2a 2f 0a 20 20 61 64  othing.  */.  ad
c220: 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  drTop = sqlite3V
c230: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
c240: 29 3b 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  );.  if( pMWin->
c250: 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49  eEnd==TK_PRECEDI
c260: 4e 47 20 29 7b 0a 20 20 20 20 61 64 64 72 49 66  NG ){.    addrIf
c270: 50 6f 73 31 20 3d 20 73 71 6c 69 74 65 33 56 64  Pos1 = sqlite3Vd
c280: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
c290: 66 50 6f 73 2c 20 72 65 67 45 6e 64 2c 20 30 20  fPos, regEnd, 0 
c2a0: 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 1);.  }.  sqli
c2b0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
c2c0: 20 4f 50 5f 4e 65 78 74 2c 20 63 73 72 45 6e 64   OP_Next, csrEnd
c2d0: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
c2e0: 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a  rentAddr(v)+2);.
c2f0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
c300: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
c310: 5f 47 6f 74 6f 29 3b 0a 20 20 77 69 6e 64 6f 77  _Goto);.  window
c320: 41 67 67 53 74 65 70 28 70 50 61 72 73 65 2c 20  AggStep(pParse, 
c330: 70 4d 57 69 6e 2c 20 63 73 72 45 6e 64 2c 20 30  pMWin, csrEnd, 0
c340: 2c 20 72 65 67 41 72 67 2c 20 72 65 67 53 69 7a  , regArg, regSiz
c350: 65 29 3b 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d  e);.  if( pMWin-
c360: 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e  >eEnd==TK_UNBOUN
c370: 44 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  DED ){.    sqlit
c380: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
c390: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
c3a0: 54 6f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Top);.    sqlite
c3b0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
c3c0: 20 61 64 64 72 29 3b 0a 20 20 20 20 61 64 64 72   addr);.    addr
c3d0: 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
c3e0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
c3f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
c400: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
c410: 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
c420: 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d  if( pMWin->eEnd=
c430: 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 29 7b  =TK_PRECEDING ){
c440: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c450: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
c460: 64 72 49 66 50 6f 73 31 29 3b 0a 20 20 20 20 7d  drIfPos1);.    }
c470: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4d 57 69  .  }..  if( pMWi
c480: 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c  n->eEnd==TK_FOLL
c490: 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 61 64 64  OWING ){.    add
c4a0: 72 49 66 50 6f 73 31 20 3d 20 73 71 6c 69 74 65  rIfPos1 = sqlite
c4b0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
c4c0: 50 5f 49 66 50 6f 73 2c 20 72 65 67 45 6e 64 2c  P_IfPos, regEnd,
c4d0: 20 30 20 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 69   0 , 1);.  }.  i
c4e0: 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  f( pMWin->eStart
c4f0: 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29  ==TK_FOLLOWING )
c500: 7b 0a 20 20 20 20 61 64 64 72 49 66 50 6f 73 32  {.    addrIfPos2
c510: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
c520: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp3(v, OP_IfPos
c530: 2c 20 72 65 67 53 74 61 72 74 2c 20 30 20 2c 20  , regStart, 0 , 
c540: 31 29 3b 0a 20 20 7d 0a 20 20 77 69 6e 64 6f 77  1);.  }.  window
c550: 41 67 67 46 69 6e 61 6c 28 70 50 61 72 73 65 2c  AggFinal(pParse,
c560: 20 70 4d 57 69 6e 2c 20 30 29 3b 0a 20 20 77 69   pMWin, 0);.  wi
c570: 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52 6f 77  ndowReturnOneRow
c580: 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20  (pParse, pMWin, 
c590: 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f  regGosub, addrGo
c5a0: 73 75 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  sub);.  sqlite3V
c5b0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
c5c0: 4e 65 78 74 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  Next, pMWin->iEp
c5d0: 68 43 73 72 2c 20 73 71 6c 69 74 65 33 56 64 62  hCsr, sqlite3Vdb
c5e0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
c5f0: 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  2);.  sqlite3Vdb
c600: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
c610: 74 6f 2c 20 30 2c 20 6c 62 6c 46 6c 75 73 68 44  to, 0, lblFlushD
c620: 6f 6e 65 29 3b 0a 20 20 69 66 28 20 70 4d 57 69  one);.  if( pMWi
c630: 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f  n->eStart==TK_FO
c640: 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 73  LLOWING ){.    s
c650: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
c660: 72 65 28 76 2c 20 61 64 64 72 49 66 50 6f 73 32  re(v, addrIfPos2
c670: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4d  );.  }..  if( pM
c680: 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
c690: 43 55 52 52 45 4e 54 20 0a 20 20 20 7c 7c 20 70  CURRENT .   || p
c6a0: 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
c6b0: 5f 50 52 45 43 45 44 49 4e 47 20 0a 20 20 20 7c  _PRECEDING .   |
c6c0: 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d  | pMWin->eStart=
c6d0: 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 0a 20  =TK_FOLLOWING . 
c6e0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
c6f0: 4a 75 6d 70 48 65 72 65 20 3d 20 30 3b 0a 20 20  JumpHere = 0;.  
c700: 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74    if( pMWin->eSt
c710: 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e  art==TK_PRECEDIN
c720: 47 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4a  G ){.      addrJ
c730: 75 6d 70 48 65 72 65 20 3d 20 73 71 6c 69 74 65  umpHere = sqlite
c740: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
c750: 50 5f 49 66 50 6f 73 2c 20 72 65 67 53 74 61 72  P_IfPos, regStar
c760: 74 2c 20 30 20 2c 20 31 29 3b 0a 20 20 20 20 7d  t, 0 , 1);.    }
c770: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
c780: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
c790: 74 2c 20 63 73 72 53 74 61 72 74 2c 20 73 71 6c  t, csrStart, sql
c7a0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
c7b0: 64 64 72 28 76 29 2b 31 29 3b 0a 20 20 20 20 77  ddr(v)+1);.    w
c7c0: 69 6e 64 6f 77 41 67 67 53 74 65 70 28 70 50 61  indowAggStep(pPa
c7d0: 72 73 65 2c 20 70 4d 57 69 6e 2c 20 63 73 72 53  rse, pMWin, csrS
c7e0: 74 61 72 74 2c 20 31 2c 20 72 65 67 41 72 67 2c  tart, 1, regArg,
c7f0: 20 72 65 67 53 69 7a 65 29 3b 0a 20 20 20 20 69   regSize);.    i
c800: 66 28 20 61 64 64 72 4a 75 6d 70 48 65 72 65 20  f( addrJumpHere 
c810: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
c820: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
c830: 61 64 64 72 4a 75 6d 70 48 65 72 65 29 3b 0a 20  addrJumpHere);. 
c840: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
c850: 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46  MWin->eEnd==TK_F
c860: 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20  OLLOWING ){.    
c870: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
c880: 65 72 65 28 76 2c 20 61 64 64 72 49 66 50 6f 73  ere(v, addrIfPos
c890: 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  1);.  }.  sqlite
c8a0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
c8b0: 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 54  P_Goto, 0, addrT
c8c0: 6f 70 29 3b 0a 0a 20 20 2f 2a 20 66 6c 75 73 68  op);..  /* flush
c8d0: 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 3a  _partition_done:
c8e0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
c8f0: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
c900: 20 6c 62 6c 46 6c 75 73 68 44 6f 6e 65 29 3b 0a   lblFlushDone);.
c910: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c920: 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53  Op1(v, OP_ResetS
c930: 6f 72 74 65 72 2c 20 70 4d 57 69 6e 2d 3e 69 45  orter, pMWin->iE
c940: 70 68 43 73 72 29 3b 0a 20 20 73 71 6c 69 74 65  phCsr);.  sqlite
c950: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
c960: 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 46 6c 75  P_Return, regFlu
c970: 73 68 50 61 72 74 29 3b 0a 0a 20 20 2f 2a 20 4a  shPart);..  /* J
c980: 75 6d 70 20 74 6f 20 68 65 72 65 20 74 6f 20 73  ump to here to s
c990: 6b 69 70 20 6f 76 65 72 20 66 6c 75 73 68 5f 70  kip over flush_p
c9a0: 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 20 20 73 71  artition */.  sq
c9b0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
c9c0: 65 28 76 2c 20 61 64 64 72 47 6f 74 6f 29 3b 0a  e(v, addrGoto);.
c9d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
c9e0: 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74 68 65 20  nction does the 
c9f0: 77 6f 72 6b 20 6f 66 20 73 71 6c 69 74 65 33 57  work of sqlite3W
ca00: 69 6e 64 6f 77 43 6f 64 65 53 74 65 70 28 29 20  indowCodeStep() 
ca10: 66 6f 72 20 63 61 73 65 73 20 74 68 61 74 0a 2a  for cases that.*
ca20: 2a 20 77 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79  * would normally
ca30: 20 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20 77   be handled by w
ca40: 69 6e 64 6f 77 43 6f 64 65 44 65 66 61 75 6c 74  indowCodeDefault
ca50: 53 74 65 70 28 29 20 77 68 65 6e 20 74 68 65 72  Step() when ther
ca60: 65 20 61 72 65 0a 2a 2a 20 6f 6e 65 20 6f 72 20  e are.** one or 
ca70: 6d 6f 72 65 20 62 75 69 6c 74 2d 69 6e 20 77 69  more built-in wi
ca80: 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e 73 20 74  ndow-functions t
ca90: 68 61 74 20 72 65 71 75 69 72 65 20 74 68 65 20  hat require the 
caa0: 65 6e 74 69 72 65 20 70 61 72 74 69 74 69 6f 6e  entire partition
cab0: 0a 2a 2a 20 74 6f 20 62 65 20 63 61 63 68 65 64  .** to be cached
cac0: 20 69 6e 20 61 20 74 65 6d 70 20 74 61 62 6c 65   in a temp table
cad0: 20 62 65 66 6f 72 65 20 61 6e 79 20 72 6f 77 73   before any rows
cae0: 20 63 61 6e 20 62 65 20 72 65 74 75 72 6e 65 64   can be returned
caf0: 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2e 0a  . Additionally..
cb00: 2a 2a 20 22 52 41 4e 47 45 20 42 45 54 57 45 45  ** "RANGE BETWEE
cb10: 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20 41 4e  N CURRENT ROW AN
cb20: 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c  D UNBOUNDED FOLL
cb30: 4f 57 49 4e 47 22 20 69 73 20 61 6c 77 61 79 73  OWING" is always
cb40: 20 68 61 6e 64 6c 65 64 20 62 79 0a 2a 2a 20 74   handled by.** t
cb50: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
cb60: 0a 2a 2a 20 50 73 65 75 64 6f 2d 63 6f 64 65 20  .** Pseudo-code 
cb70: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
cb80: 20 74 68 65 20 56 4d 20 63 6f 64 65 20 67 65 6e   the VM code gen
cb90: 65 72 61 74 65 64 20 62 79 20 74 68 69 73 20 66  erated by this f
cba0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 65  unction.** for e
cbb0: 61 63 68 20 74 79 70 65 20 6f 66 20 77 69 6e 64  ach type of wind
cbc0: 6f 77 20 66 6f 6c 6c 6f 77 73 2e 0a 2a 2a 0a 2a  ow follows..**.*
cbd0: 2a 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20  * RANGE BETWEEN 
cbe0: 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44  UNBOUNDED PRECED
cbf0: 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54 20  ING AND CURRENT 
cc00: 52 4f 57 0a 2a 2a 0a 2a 2a 20 20 20 66 6c 75 73  ROW.**.**   flus
cc10: 68 5f 70 61 72 74 69 74 69 6f 6e 3a 0a 2a 2a 20  h_partition:.** 
cc20: 20 20 20 20 4f 6e 63 65 20 7b 0a 2a 2a 20 20 20      Once {.**   
cc30: 20 20 20 20 4f 70 65 6e 44 75 70 20 28 69 45 70      OpenDup (iEp
cc40: 68 43 73 72 20 2d 3e 20 63 73 72 4c 65 61 64 29  hCsr -> csrLead)
cc50: 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  .**     }.**    
cc60: 20 49 6e 74 65 67 65 72 20 63 74 72 20 30 0a 2a   Integer ctr 0.*
cc70: 2a 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f  *     foreach ro
cc80: 77 20 28 63 73 72 4c 65 61 64 29 7b 0a 2a 2a 20  w (csrLead){.** 
cc90: 20 20 20 20 20 20 69 66 28 20 6e 65 77 20 70 65        if( new pe
cca0: 65 72 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  er ){.**        
ccb0: 20 41 67 67 46 69 6e 61 6c 20 28 78 56 61 6c 75   AggFinal (xValu
ccc0: 65 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f  e).**         fo
ccd0: 72 28 69 3d 30 3b 20 69 3c 63 74 72 3b 20 69 2b  r(i=0; i<ctr; i+
cce0: 2b 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  +){.**          
ccf0: 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62   Gosub addrGosub
cd00: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 4e 65  .**           Ne
cd10: 78 74 20 69 45 70 68 43 73 72 0a 2a 2a 20 20 20  xt iEphCsr.**   
cd20: 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20        }.**      
cd30: 20 20 20 49 6e 74 65 67 65 72 20 63 74 72 20 30     Integer ctr 0
cd40: 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  .**       }.**  
cd50: 20 20 20 20 20 41 67 67 53 74 65 70 20 28 63 73       AggStep (cs
cd60: 72 4c 65 61 64 29 0a 2a 2a 20 20 20 20 20 20 20  rLead).**       
cd70: 49 6e 63 72 20 63 74 72 0a 2a 2a 20 20 20 20 20  Incr ctr.**     
cd80: 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 41 67 67 46  }.**.**     AggF
cd90: 69 6e 61 6c 20 28 78 46 69 6e 61 6c 69 7a 65 29  inal (xFinalize)
cda0: 0a 2a 2a 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  .**     for(i=0;
cdb0: 20 69 3c 63 74 72 3b 20 69 2b 2b 29 7b 0a 2a 2a   i<ctr; i++){.**
cdc0: 20 20 20 20 20 20 20 47 6f 73 75 62 20 61 64 64         Gosub add
cdd0: 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20 20  rGosub.**       
cde0: 4e 65 78 74 20 69 45 70 68 43 73 72 0a 2a 2a 20  Next iEphCsr.** 
cdf0: 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 20      }.**.**     
ce00: 52 65 73 65 74 53 6f 72 74 65 72 20 28 63 73 72  ResetSorter (csr
ce10: 29 0a 2a 2a 20 20 20 20 20 52 65 74 75 72 6e 0a  ).**     Return.
ce20: 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57 45  **.** ROWS BETWE
ce30: 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  EN UNBOUNDED PRE
ce40: 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45  CEDING AND CURRE
ce50: 4e 54 20 52 4f 57 0a 2a 2a 0a 2a 2a 20 20 20 41  NT ROW.**.**   A
ce60: 73 20 61 62 6f 76 65 2c 20 65 78 63 65 70 74 20  s above, except 
ce70: 74 68 61 74 20 74 68 65 20 22 69 66 28 20 6e 65  that the "if( ne
ce80: 77 20 70 65 65 72 20 29 22 20 62 72 61 6e 63 68  w peer )" branch
ce90: 20 69 73 20 61 6c 77 61 79 73 20 74 61 6b 65 6e   is always taken
cea0: 2e 0a 2a 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45  ..**.** RANGE BE
ceb0: 54 57 45 45 4e 20 43 55 52 52 45 4e 54 20 52 4f  TWEEN CURRENT RO
cec0: 57 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f  W AND CURRENT RO
ced0: 57 20 0a 2a 2a 0a 2a 2a 20 20 20 41 73 20 61 62  W .**.**   As ab
cee0: 6f 76 65 2c 20 65 78 63 65 70 74 20 74 68 61 74  ove, except that
cef0: 20 65 61 63 68 20 6f 66 20 74 68 65 20 66 6f 72   each of the for
cf00: 28 29 20 6c 6f 6f 70 73 20 62 65 63 6f 6d 65 73  () loops becomes
cf10: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
cf20: 66 6f 72 28 69 3d 30 3b 20 69 3c 63 74 72 3b 20  for(i=0; i<ctr; 
cf30: 69 2b 2b 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  i++){.**        
cf40: 20 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73     Gosub addrGos
cf50: 75 62 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ub.**           
cf60: 41 67 67 53 74 65 70 20 28 78 49 6e 76 65 72 73  AggStep (xInvers
cf70: 65 2c 20 69 45 70 68 43 73 72 29 0a 2a 2a 20 20  e, iEphCsr).**  
cf80: 20 20 20 20 20 20 20 20 20 4e 65 78 74 20 69 45           Next iE
cf90: 70 68 43 73 72 0a 2a 2a 20 20 20 20 20 20 20 20  phCsr.**        
cfa0: 20 7d 0a 2a 2a 0a 2a 2a 20 52 41 4e 47 45 20 42   }.**.** RANGE B
cfb0: 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44  ETWEEN UNBOUNDED
cfc0: 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 55   PRECEDING AND U
cfd0: 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49  NBOUNDED FOLLOWI
cfe0: 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 66 6c 75 73 68  NG.**.**   flush
cff0: 5f 70 61 72 74 69 74 69 6f 6e 3a 0a 2a 2a 20 20  _partition:.**  
d000: 20 20 20 4f 6e 63 65 20 7b 0a 2a 2a 20 20 20 20     Once {.**    
d010: 20 20 20 4f 70 65 6e 44 75 70 20 28 69 45 70 68     OpenDup (iEph
d020: 43 73 72 20 2d 3e 20 63 73 72 4c 65 61 64 29 0a  Csr -> csrLead).
d030: 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20  **     }.**     
d040: 66 6f 72 65 61 63 68 20 72 6f 77 20 28 63 73 72  foreach row (csr
d050: 4c 65 61 64 29 20 7b 0a 2a 2a 20 20 20 20 20 20  Lead) {.**      
d060: 20 41 67 67 53 74 65 70 20 28 63 73 72 4c 65 61   AggStep (csrLea
d070: 64 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20  d).**     }.**  
d080: 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 20 28     foreach row (
d090: 69 45 70 68 43 73 72 29 20 7b 0a 2a 2a 20 20 20  iEphCsr) {.**   
d0a0: 20 20 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f      Gosub addrGo
d0b0: 73 75 62 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20  sub.**     }.** 
d0c0: 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54 57 45 45  .** RANGE BETWEE
d0d0: 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20 41 4e  N CURRENT ROW AN
d0e0: 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c  D UNBOUNDED FOLL
d0f0: 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 66 6c  OWING.**.**   fl
d100: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 3a 0a 2a  ush_partition:.*
d110: 2a 20 20 20 20 20 4f 6e 63 65 20 7b 0a 2a 2a 20  *     Once {.** 
d120: 20 20 20 20 20 20 4f 70 65 6e 44 75 70 20 28 69        OpenDup (i
d130: 45 70 68 43 73 72 20 2d 3e 20 63 73 72 4c 65 61  EphCsr -> csrLea
d140: 64 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20  d).**     }.**  
d150: 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 20 28     foreach row (
d160: 63 73 72 4c 65 61 64 29 7b 0a 2a 2a 20 20 20 20  csrLead){.**    
d170: 20 20 20 41 67 67 53 74 65 70 20 28 63 73 72 4c     AggStep (csrL
d180: 65 61 64 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a  ead).**     }.**
d190: 20 20 20 20 20 52 65 77 69 6e 64 20 28 63 73 72       Rewind (csr
d1a0: 4c 65 61 64 29 0a 2a 2a 20 20 20 20 20 49 6e 74  Lead).**     Int
d1b0: 65 67 65 72 20 63 74 72 20 30 0a 2a 2a 20 20 20  eger ctr 0.**   
d1c0: 20 20 66 6f 72 65 61 63 68 20 72 6f 77 20 28 63    foreach row (c
d1d0: 73 72 4c 65 61 64 29 7b 0a 2a 2a 20 20 20 20 20  srLead){.**     
d1e0: 20 20 69 66 28 20 6e 65 77 20 70 65 65 72 20 29    if( new peer )
d1f0: 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 67 67  {.**         Agg
d200: 46 69 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a  Final (xValue).*
d210: 2a 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  *         for(i=
d220: 30 3b 20 69 3c 63 74 72 3b 20 69 2b 2b 29 7b 0a  0; i<ctr; i++){.
d230: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 47 6f 73  **           Gos
d240: 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20  ub addrGosub.** 
d250: 20 20 20 20 20 20 20 20 20 20 41 67 67 53 74 65            AggSte
d260: 70 20 28 78 49 6e 76 65 72 73 65 2c 20 69 45 70  p (xInverse, iEp
d270: 68 43 73 72 29 0a 2a 2a 20 20 20 20 20 20 20 20  hCsr).**        
d280: 20 20 20 4e 65 78 74 20 69 45 70 68 43 73 72 0a     Next iEphCsr.
d290: 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20  **         }.** 
d2a0: 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20          Integer 
d2b0: 63 74 72 20 30 0a 2a 2a 20 20 20 20 20 20 20 7d  ctr 0.**       }
d2c0: 0a 2a 2a 20 20 20 20 20 20 20 49 6e 63 72 20 63  .**       Incr c
d2d0: 74 72 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a  tr.**     }.**.*
d2e0: 2a 20 20 20 20 20 41 67 67 46 69 6e 61 6c 20 28  *     AggFinal (
d2f0: 78 46 69 6e 61 6c 69 7a 65 29 0a 2a 2a 20 20 20  xFinalize).**   
d300: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 63 74 72    for(i=0; i<ctr
d310: 3b 20 69 2b 2b 29 7b 0a 2a 2a 20 20 20 20 20 20  ; i++){.**      
d320: 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62   Gosub addrGosub
d330: 0a 2a 2a 20 20 20 20 20 20 20 4e 65 78 74 20 69  .**       Next i
d340: 45 70 68 43 73 72 0a 2a 2a 20 20 20 20 20 7d 0a  EphCsr.**     }.
d350: 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 73 65 74 53  **.**     ResetS
d360: 6f 72 74 65 72 20 28 63 73 72 29 0a 2a 2a 20 20  orter (csr).**  
d370: 20 20 20 52 65 74 75 72 6e 0a 2a 2f 0a 73 74 61     Return.*/.sta
d380: 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 43  tic void windowC
d390: 6f 64 65 43 61 63 68 65 53 74 65 70 28 0a 20 20  odeCacheStep(.  
d3a0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a  Parse *pParse, .
d3b0: 20 20 53 65 6c 65 63 74 20 2a 70 2c 0a 20 20 57    Select *p,.  W
d3c0: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
d3d0: 2c 0a 20 20 69 6e 74 20 72 65 67 47 6f 73 75 62  ,.  int regGosub
d3e0: 2c 20 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 73  , .  int addrGos
d3f0: 75 62 0a 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a  ub.){.  Window *
d400: 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b  pMWin = p->pWin;
d410: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
d420: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
d430: 73 65 29 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70  se);.  Window *p
d440: 57 69 6e 3b 0a 20 20 69 6e 74 20 6b 3b 0a 20 20  Win;.  int k;.  
d450: 69 6e 74 20 61 64 64 72 3b 0a 20 20 45 78 70 72  int addr;.  Expr
d460: 4c 69 73 74 20 2a 70 50 61 72 74 20 3d 20 70 4d  List *pPart = pM
d470: 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 3b  Win->pPartition;
d480: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
d490: 64 65 72 42 79 20 3d 20 70 4d 57 69 6e 2d 3e 70  derBy = pMWin->p
d4a0: 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 6e  OrderBy;.  int n
d4b0: 50 65 65 72 20 3d 20 70 4f 72 64 65 72 42 79 20  Peer = pOrderBy 
d4c0: 3f 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ? pOrderBy->nExp
d4d0: 72 20 3a 20 30 3b 0a 20 20 69 6e 74 20 72 65 67  r : 0;.  int reg
d4e0: 4e 65 77 50 65 65 72 3b 0a 0a 20 20 69 6e 74 20  NewPeer;..  int 
d4f0: 61 64 64 72 47 6f 74 6f 3b 20 20 20 20 20 20 20  addrGoto;       
d500: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
d510: 64 64 72 65 73 73 20 6f 66 20 47 6f 74 6f 20 75  ddress of Goto u
d520: 73 65 64 20 74 6f 20 6a 75 6d 70 20 66 6c 75 73  sed to jump flus
d530: 68 5f 70 61 72 2e 2e 20 2a 2f 0a 20 20 69 6e 74  h_par.. */.  int
d540: 20 61 64 64 72 4e 65 78 74 3b 20 20 20 20 20 20   addrNext;      
d550: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d560: 4a 75 6d 70 20 68 65 72 65 20 66 6f 72 20 6e 65  Jump here for ne
d570: 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  xt iteration of 
d580: 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65  loop */.  int re
d590: 67 46 6c 75 73 68 50 61 72 74 3b 0a 20 20 69 6e  gFlushPart;.  in
d5a0: 74 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 3b 0a  t lblFlushPart;.
d5b0: 20 20 69 6e 74 20 63 73 72 4c 65 61 64 3b 0a 20    int csrLead;. 
d5c0: 20 69 6e 74 20 72 65 67 43 74 72 3b 0a 20 20 69   int regCtr;.  i
d5d0: 6e 74 20 72 65 67 41 72 67 3b 20 20 20 20 20 20  nt regArg;      
d5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d5f0: 2a 20 52 65 67 69 73 74 65 72 20 61 72 72 61 79  * Register array
d600: 20 74 6f 20 6d 61 72 74 69 61 6c 20 66 75 6e 63   to martial func
d610: 74 69 6f 6e 20 61 72 67 73 20 2a 2f 0a 20 20 69  tion args */.  i
d620: 6e 74 20 72 65 67 53 69 7a 65 3b 0a 20 20 69 6e  nt regSize;.  in
d630: 74 20 6e 41 72 67 3b 0a 20 20 69 6e 74 20 6c 62  t nArg;.  int lb
d640: 6c 45 6d 70 74 79 3b 0a 20 20 69 6e 74 20 62 52  lEmpty;.  int bR
d650: 65 76 65 72 73 65 20 3d 20 70 4d 57 69 6e 2d 3e  everse = pMWin->
d660: 70 4f 72 64 65 72 42 79 20 26 26 20 70 4d 57 69  pOrderBy && pMWi
d670: 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55  n->eStart==TK_CU
d680: 52 52 45 4e 54 20 0a 20 20 20 20 20 20 20 20 20  RRENT .         
d690: 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d   && pMWin->eEnd=
d6a0: 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 3b 0a 0a  =TK_UNBOUNDED;..
d6b0: 20 20 61 73 73 65 72 74 28 20 28 70 4d 57 69 6e    assert( (pMWin
d6c0: 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42  ->eStart==TK_UNB
d6d0: 4f 55 4e 44 45 44 20 26 26 20 70 4d 57 69 6e 2d  OUNDED && pMWin-
d6e0: 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e  >eEnd==TK_CURREN
d6f0: 54 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  T) .       || (p
d700: 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
d710: 5f 55 4e 42 4f 55 4e 44 45 44 20 26 26 20 70 4d  _UNBOUNDED && pM
d720: 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e  Win->eEnd==TK_UN
d730: 42 4f 55 4e 44 45 44 29 20 0a 20 20 20 20 20 20  BOUNDED) .      
d740: 20 7c 7c 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61   || (pMWin->eSta
d750: 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 26  rt==TK_CURRENT &
d760: 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54  & pMWin->eEnd==T
d770: 4b 5f 43 55 52 52 45 4e 54 29 20 0a 20 20 20 20  K_CURRENT) .    
d780: 20 20 20 7c 7c 20 28 70 4d 57 69 6e 2d 3e 65 53     || (pMWin->eS
d790: 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54  tart==TK_CURRENT
d7a0: 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d   && pMWin->eEnd=
d7b0: 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 29 20 0a  =TK_UNBOUNDED) .
d7c0: 20 20 29 3b 0a 0a 20 20 6c 62 6c 45 6d 70 74 79    );..  lblEmpty
d7d0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
d7e0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 72 65  keLabel(v);.  re
d7f0: 67 4e 65 77 50 65 65 72 20 3d 20 70 50 61 72 73  gNewPeer = pPars
d800: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 70 50 61  e->nMem+1;.  pPa
d810: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 65  rse->nMem += nPe
d820: 65 72 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  er;..  /* Alloca
d830: 74 65 20 72 65 67 69 73 74 65 72 20 61 6e 64 20  te register and 
d840: 6c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 22 66  label for the "f
d850: 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 20  lush_partition" 
d860: 73 75 62 2d 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a  sub-routine. */.
d870: 20 20 72 65 67 46 6c 75 73 68 50 61 72 74 20 3d    regFlushPart =
d880: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
d890: 0a 20 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 20  .  lblFlushPart 
d8a0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
d8b0: 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 63 73  eLabel(v);..  cs
d8c0: 72 4c 65 61 64 20 3d 20 70 50 61 72 73 65 2d 3e  rLead = pParse->
d8d0: 6e 54 61 62 2b 2b 3b 0a 20 20 72 65 67 43 74 72  nTab++;.  regCtr
d8e0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
d8f0: 6d 3b 0a 0a 20 20 77 69 6e 64 6f 77 50 61 72 74  m;..  windowPart
d900: 69 74 69 6f 6e 43 61 63 68 65 28 70 50 61 72 73  itionCache(pPars
d910: 65 2c 20 70 2c 20 70 57 49 6e 66 6f 2c 20 72 65  e, p, pWInfo, re
d920: 67 46 6c 75 73 68 50 61 72 74 2c 20 6c 62 6c 46  gFlushPart, lblF
d930: 6c 75 73 68 50 61 72 74 2c 20 26 72 65 67 53 69  lushPart, &regSi
d940: 7a 65 29 3b 0a 20 20 61 64 64 72 47 6f 74 6f 20  ze);.  addrGoto 
d950: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
d960: 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b  Op0(v, OP_Goto);
d970: 0a 0a 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20  ..  /* Start of 
d980: 22 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e  "flush_partition
d990: 22 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  " */.  sqlite3Vd
d9a0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
d9b0: 2c 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 29 3b  , lblFlushPart);
d9c0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
d9d0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c  dOp2(v, OP_Once,
d9e0: 20 30 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43   0, sqlite3VdbeC
d9f0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29  urrentAddr(v)+2)
da00: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
da10: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
da20: 44 75 70 2c 20 63 73 72 4c 65 61 64 2c 20 70 4d  Dup, csrLead, pM
da30: 57 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 0a  Win->iEphCsr);..
da40: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
da50: 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
da60: 72 65 67 69 73 74 65 72 20 66 6f 72 20 65 61 63  register for eac
da70: 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  h window functio
da80: 6e 20 74 6f 20 4e 55 4c 4c 20 2a 2f 0a 20 20 72  n to NULL */.  r
da90: 65 67 41 72 67 20 3d 20 77 69 6e 64 6f 77 49 6e  egArg = windowIn
daa0: 69 74 41 63 63 75 6d 28 70 50 61 72 73 65 2c 20  itAccum(pParse, 
dab0: 70 4d 57 69 6e 29 3b 0a 0a 20 20 73 71 6c 69 74  pMWin);..  sqlit
dac0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
dad0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72  OP_Integer, 0, r
dae0: 65 67 43 74 72 29 3b 0a 20 20 73 71 6c 69 74 65  egCtr);.  sqlite
daf0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
db00: 50 5f 52 65 77 69 6e 64 2c 20 63 73 72 4c 65 61  P_Rewind, csrLea
db10: 64 2c 20 6c 62 6c 45 6d 70 74 79 29 3b 0a 20 20  d, lblEmpty);.  
db20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
db30: 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
db40: 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20  pMWin->iEphCsr, 
db50: 6c 62 6c 45 6d 70 74 79 29 3b 0a 0a 20 20 69 66  lblEmpty);..  if
db60: 28 20 62 52 65 76 65 72 73 65 20 29 7b 0a 20 20  ( bReverse ){.  
db70: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
db80: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
db90: 64 64 72 28 76 29 3b 0a 20 20 20 20 77 69 6e 64  ddr(v);.    wind
dba0: 6f 77 41 67 67 53 74 65 70 28 70 50 61 72 73 65  owAggStep(pParse
dbb0: 2c 20 70 4d 57 69 6e 2c 20 63 73 72 4c 65 61 64  , pMWin, csrLead
dbc0: 2c 20 30 2c 20 72 65 67 41 72 67 2c 20 72 65 67  , 0, regArg, reg
dbd0: 53 69 7a 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Size);.    sqlit
dbe0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
dbf0: 4f 50 5f 4e 65 78 74 2c 20 63 73 72 4c 65 61 64  OP_Next, csrLead
dc00: 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 73 71 6c  , addr);.    sql
dc10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
dc20: 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 63 73 72  , OP_Rewind, csr
dc30: 4c 65 61 64 2c 20 6c 62 6c 45 6d 70 74 79 29 3b  Lead, lblEmpty);
dc40: 0a 20 20 7d 0a 20 20 61 64 64 72 4e 65 78 74 20  .  }.  addrNext 
dc50: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
dc60: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20 20  rentAddr(v);..  
dc70: 69 66 28 20 70 4f 72 64 65 72 42 79 20 26 26 20  if( pOrderBy && 
dc80: 28 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b  (pMWin->eEnd==TK
dc90: 5f 43 55 52 52 45 4e 54 20 7c 7c 20 70 4d 57 69  _CURRENT || pMWi
dca0: 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55  n->eStart==TK_CU
dcb0: 52 52 45 4e 54 29 20 29 7b 0a 20 20 20 20 69 6e  RRENT) ){.    in
dcc0: 74 20 62 43 75 72 72 65 6e 74 20 3d 20 28 70 4d  t bCurrent = (pM
dcd0: 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
dce0: 43 55 52 52 45 4e 54 29 3b 0a 20 20 20 20 69 6e  CURRENT);.    in
dcf0: 74 20 61 64 64 72 4a 75 6d 70 20 3d 20 30 3b 20  t addrJump = 0; 
dd00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
dd10: 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4a 75 6d  ddress of OP_Jum
dd20: 70 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 69  p below */.    i
dd30: 66 28 20 70 4d 57 69 6e 2d 3e 65 54 79 70 65 3d  f( pMWin->eType=
dd40: 3d 54 4b 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20  =TK_RANGE ){.   
dd50: 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 4d     int iOff = pM
dd60: 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 20  Win->nBufferCol 
dd70: 2b 20 28 70 50 61 72 74 20 3f 20 70 50 61 72 74  + (pPart ? pPart
dd80: 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20  ->nExpr : 0);.  
dd90: 20 20 20 20 69 6e 74 20 72 65 67 50 65 65 72 20      int regPeer 
dda0: 3d 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74  = pMWin->regPart
ddb0: 20 2b 20 28 70 50 61 72 74 20 3f 20 70 50 61 72   + (pPart ? pPar
ddc0: 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20  t->nExpr : 0);. 
ddd0: 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
dde0: 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
ddf0: 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  KeyInfoFromExprL
de00: 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ist(pParse, pOrd
de10: 65 72 42 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20  erBy, 0, 0);.   
de20: 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 50     for(k=0; k<nP
de30: 65 65 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  eer; k++){.     
de40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
de50: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
de60: 6e 2c 20 63 73 72 4c 65 61 64 2c 20 69 4f 66 66  n, csrLead, iOff
de70: 2b 6b 2c 20 72 65 67 4e 65 77 50 65 65 72 2b 6b  +k, regNewPeer+k
de80: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
de90: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
dea0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
deb0: 43 6f 6d 70 61 72 65 2c 20 72 65 67 4e 65 77 50  Compare, regNewP
dec0: 65 65 72 2c 20 72 65 67 50 65 65 72 2c 20 6e 50  eer, regPeer, nP
ded0: 65 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eer);.      sqli
dee0: 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
def0: 76 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e  v, (void*)pKeyIn
df00: 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
df10: 0a 20 20 20 20 20 20 61 64 64 72 4a 75 6d 70 20  .      addrJump 
df20: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
df30: 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
df40: 61 64 64 72 2b 32 2c 20 30 2c 20 61 64 64 72 2b  addr+2, 0, addr+
df50: 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
df60: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
df70: 50 5f 43 6f 70 79 2c 20 72 65 67 4e 65 77 50 65  P_Copy, regNewPe
df80: 65 72 2c 20 72 65 67 50 65 65 72 2c 20 6e 50 65  er, regPeer, nPe
df90: 65 72 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  er-1);.    }..  
dfa0: 20 20 77 69 6e 64 6f 77 52 65 74 75 72 6e 52 6f    windowReturnRo
dfb0: 77 73 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  ws(pParse, pMWin
dfc0: 2c 20 72 65 67 43 74 72 2c 20 72 65 67 47 6f 73  , regCtr, regGos
dfd0: 75 62 2c 20 61 64 64 72 47 6f 73 75 62 2c 20 0a  ub, addrGosub, .
dfe0: 20 20 20 20 20 20 20 20 28 62 43 75 72 72 65 6e          (bCurren
dff0: 74 20 3f 20 72 65 67 41 72 67 20 3a 20 30 29 2c  t ? regArg : 0),
e000: 20 28 62 43 75 72 72 65 6e 74 20 3f 20 72 65 67   (bCurrent ? reg
e010: 53 69 7a 65 20 3a 20 30 29 0a 20 20 20 20 29 3b  Size : 0).    );
e020: 0a 20 20 20 20 69 66 28 20 61 64 64 72 4a 75 6d  .    if( addrJum
e030: 70 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  p ) sqlite3VdbeJ
e040: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4a  umpHere(v, addrJ
e050: 75 6d 70 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ump);.  }..  if(
e060: 20 62 52 65 76 65 72 73 65 3d 3d 30 20 29 7b 0a   bReverse==0 ){.
e070: 20 20 20 20 77 69 6e 64 6f 77 41 67 67 53 74 65      windowAggSte
e080: 70 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c  p(pParse, pMWin,
e090: 20 63 73 72 4c 65 61 64 2c 20 30 2c 20 72 65 67   csrLead, 0, reg
e0a0: 41 72 67 2c 20 72 65 67 53 69 7a 65 29 3b 0a 20  Arg, regSize);. 
e0b0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
e0c0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
e0d0: 49 6d 6d 2c 20 72 65 67 43 74 72 2c 20 31 29 3b  Imm, regCtr, 1);
e0e0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
e0f0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
e100: 20 63 73 72 4c 65 61 64 2c 20 61 64 64 72 4e 65   csrLead, addrNe
e110: 78 74 29 3b 0a 0a 20 20 77 69 6e 64 6f 77 52 65  xt);..  windowRe
e120: 74 75 72 6e 52 6f 77 73 28 70 50 61 72 73 65 2c  turnRows(pParse,
e130: 20 70 4d 57 69 6e 2c 20 72 65 67 43 74 72 2c 20   pMWin, regCtr, 
e140: 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f  regGosub, addrGo
e150: 73 75 62 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 73  sub, 0, 0);..  s
e160: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
e170: 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 45 6d 70  eLabel(v, lblEmp
e180: 74 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ty);.  sqlite3Vd
e190: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
e1a0: 65 73 65 74 53 6f 72 74 65 72 2c 20 70 4d 57 69  esetSorter, pMWi
e1b0: 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 73  n->iEphCsr);.  s
e1c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
e1d0: 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
e1e0: 65 67 46 6c 75 73 68 50 61 72 74 29 3b 0a 0a 20  egFlushPart);.. 
e1f0: 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65   /* Jump to here
e200: 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 66 6c   to skip over fl
e210: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 20 2a 2f  ush_partition */
e220: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
e230: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 47 6f  mpHere(v, addrGo
e240: 74 6f 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  to);.}.../*.** R
e250: 41 4e 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42  ANGE BETWEEN UNB
e260: 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47  OUNDED PRECEDING
e270: 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57   AND CURRENT ROW
e280: 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 0a 2a 2a 20  .**.**   ....** 
e290: 20 20 20 20 69 66 28 20 6e 65 77 20 70 61 72 74      if( new part
e2a0: 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20  ition ){.**     
e2b0: 20 20 41 67 67 46 69 6e 61 6c 20 28 78 46 69 6e    AggFinal (xFin
e2c0: 61 6c 69 7a 65 29 0a 2a 2a 20 20 20 20 20 20 20  alize).**       
e2d0: 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a  Gosub addrGosub.
e2e0: 2a 2a 20 20 20 20 20 20 20 52 65 73 65 74 53 6f  **       ResetSo
e2f0: 72 74 65 72 20 65 70 68 2d 74 61 62 6c 65 0a 2a  rter eph-table.*
e300: 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 65  *     }.**     e
e310: 6c 73 65 20 69 66 28 20 6e 65 77 20 70 65 65 72  lse if( new peer
e320: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67 67   ){.**       Agg
e330: 46 69 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a  Final (xValue).*
e340: 2a 20 20 20 20 20 20 20 47 6f 73 75 62 20 61 64  *       Gosub ad
e350: 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20  drGosub.**      
e360: 20 52 65 73 65 74 53 6f 72 74 65 72 20 65 70 68   ResetSorter eph
e370: 2d 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 7d 0a  -table.**     }.
e380: 2a 2a 20 20 20 20 20 41 67 67 53 74 65 70 0a 2a  **     AggStep.*
e390: 2a 20 20 20 20 20 49 6e 73 65 72 74 20 28 72 65  *     Insert (re
e3a0: 63 6f 72 64 20 69 6e 74 6f 20 65 70 68 2d 74 61  cord into eph-ta
e3b0: 62 6c 65 29 0a 2a 2a 20 20 20 73 71 6c 69 74 65  ble).**   sqlite
e3c0: 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20  3WhereEnd().**  
e3d0: 20 41 67 67 46 69 6e 61 6c 20 28 78 46 69 6e 61   AggFinal (xFina
e3e0: 6c 69 7a 65 29 0a 2a 2a 20 20 20 47 6f 73 75 62  lize).**   Gosub
e3f0: 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 0a 2a 2a   addrGosub.**.**
e400: 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 55   RANGE BETWEEN U
e410: 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49  NBOUNDED PRECEDI
e420: 4e 47 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44  NG AND UNBOUNDED
e430: 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a   FOLLOWING.**.**
e440: 20 20 20 41 73 20 61 62 6f 76 65 2c 20 65 78 63     As above, exc
e450: 65 70 74 20 74 61 6b 65 20 6e 6f 20 61 63 74 69  ept take no acti
e460: 6f 6e 20 66 6f 72 20 61 20 22 6e 65 77 20 70 65  on for a "new pe
e470: 65 72 22 2e 20 49 6e 76 6f 6b 65 0a 2a 2a 20 20  er". Invoke.**  
e480: 20 74 68 65 20 73 75 62 2d 72 6f 75 74 69 6e 65   the sub-routine
e490: 20 6f 6e 63 65 20 6f 6e 6c 79 20 66 6f 72 20 65   once only for e
e4a0: 61 63 68 20 70 61 72 74 69 74 69 6f 6e 2e 0a 2a  ach partition..*
e4b0: 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54 57 45  *.** RANGE BETWE
e4c0: 45 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20 41  EN CURRENT ROW A
e4d0: 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a  ND CURRENT ROW.*
e4e0: 2a 0a 2a 2a 20 20 20 41 73 20 61 62 6f 76 65 2c  *.**   As above,
e4f0: 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65   except that the
e500: 20 22 6e 65 77 20 70 65 65 72 22 20 63 6f 6e 64   "new peer" cond
e510: 69 74 69 6f 6e 20 69 73 20 68 61 6e 64 6c 65 64  ition is handled
e520: 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 73 61 6d   in the.**   sam
e530: 65 20 77 61 79 20 61 73 20 22 6e 65 77 20 70 61  e way as "new pa
e540: 72 74 69 74 69 6f 6e 22 20 28 73 6f 20 74 68 65  rtition" (so the
e550: 72 65 20 69 73 20 6e 6f 20 22 65 6c 73 65 20 69  re is no "else i
e560: 66 22 20 62 6c 6f 63 6b 29 2e 0a 2a 2a 0a 2a 2a  f" block)..**.**
e570: 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20 55 4e   ROWS BETWEEN UN
e580: 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e  BOUNDED PRECEDIN
e590: 47 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f  G AND CURRENT RO
e5a0: 57 0a 2a 2a 20 0a 2a 2a 20 20 20 41 73 20 61 62  W.** .**   As ab
e5b0: 6f 76 65 2c 20 65 78 63 65 70 74 20 61 73 73 75  ove, except assu
e5c0: 6d 65 20 65 76 65 72 79 20 72 6f 77 20 69 73 20  me every row is 
e5d0: 61 20 22 6e 65 77 20 70 65 65 72 22 2e 0a 2a 2f  a "new peer"..*/
e5e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
e5f0: 64 6f 77 43 6f 64 65 44 65 66 61 75 6c 74 53 74  dowCodeDefaultSt
e600: 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ep(.  Parse *pPa
e610: 72 73 65 2c 20 0a 20 20 53 65 6c 65 63 74 20 2a  rse, .  Select *
e620: 70 2c 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  p,.  WhereInfo *
e630: 70 57 49 6e 66 6f 2c 0a 20 20 69 6e 74 20 72 65  pWInfo,.  int re
e640: 67 47 6f 73 75 62 2c 20 0a 20 20 69 6e 74 20 61  gGosub, .  int a
e650: 64 64 72 47 6f 73 75 62 0a 29 7b 0a 20 20 57 69  ddrGosub.){.  Wi
e660: 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d  ndow *pMWin = p-
e670: 3e 70 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76  >pWin;.  Vdbe *v
e680: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
e690: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 57 69 6e  e(pParse);.  Win
e6a0: 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 69 6e 74  dow *pWin;.  int
e6b0: 20 6b 3b 0a 20 20 69 6e 74 20 69 53 75 62 43 73   k;.  int iSubCs
e6c0: 72 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  r = p->pSrc->a[0
e6d0: 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 69 6e 74  ].iCursor;.  int
e6e0: 20 6e 53 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d   nSub = p->pSrc-
e6f0: 3e 61 5b 30 5d 2e 70 54 61 62 2d 3e 6e 43 6f 6c  >a[0].pTab->nCol
e700: 3b 0a 20 20 69 6e 74 20 72 65 67 20 3d 20 70 50  ;.  int reg = pP
e710: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
e720: 69 6e 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20  int regRecord = 
e730: 72 65 67 2b 6e 53 75 62 3b 0a 20 20 69 6e 74 20  reg+nSub;.  int 
e740: 72 65 67 52 6f 77 69 64 20 3d 20 72 65 67 52 65  regRowid = regRe
e750: 63 6f 72 64 2b 31 3b 0a 20 20 69 6e 74 20 61 64  cord+1;.  int ad
e760: 64 72 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  dr;.  ExprList *
e770: 70 50 61 72 74 20 3d 20 70 4d 57 69 6e 2d 3e 70  pPart = pMWin->p
e780: 50 61 72 74 69 74 69 6f 6e 3b 0a 20 20 45 78 70  Partition;.  Exp
e790: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
e7a0: 3d 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42  = pMWin->pOrderB
e7b0: 79 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4d  y;..  assert( pM
e7c0: 57 69 6e 2d 3e 65 54 79 70 65 3d 3d 54 4b 5f 52  Win->eType==TK_R
e7d0: 41 4e 47 45 20 0a 20 20 20 20 20 20 7c 7c 20 28  ANGE .      || (
e7e0: 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
e7f0: 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 26 26 20 70  K_UNBOUNDED && p
e800: 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43  MWin->eEnd==TK_C
e810: 55 52 52 45 4e 54 29 0a 20 20 29 3b 0a 0a 20 20  URRENT).  );..  
e820: 61 73 73 65 72 74 28 20 28 70 4d 57 69 6e 2d 3e  assert( (pMWin->
e830: 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55  eStart==TK_UNBOU
e840: 4e 44 45 44 20 26 26 20 70 4d 57 69 6e 2d 3e 65  NDED && pMWin->e
e850: 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29  End==TK_CURRENT)
e860: 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 4d 57 69  .       || (pMWi
e870: 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e  n->eStart==TK_UN
e880: 42 4f 55 4e 44 45 44 20 26 26 20 70 4d 57 69 6e  BOUNDED && pMWin
e890: 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55  ->eEnd==TK_UNBOU
e8a0: 4e 44 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20  NDED).       || 
e8b0: 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d  (pMWin->eStart==
e8c0: 54 4b 5f 43 55 52 52 45 4e 54 20 26 26 20 70 4d  TK_CURRENT && pM
e8d0: 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55  Win->eEnd==TK_CU
e8e0: 52 52 45 4e 54 29 0a 20 20 20 20 20 20 20 7c 7c  RRENT).       ||
e8f0: 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d   (pMWin->eStart=
e900: 3d 54 4b 5f 43 55 52 52 45 4e 54 20 26 26 20 70  =TK_CURRENT && p
e910: 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55  MWin->eEnd==TK_U
e920: 4e 42 4f 55 4e 44 45 44 20 26 26 20 21 70 4f 72  NBOUNDED && !pOr
e930: 64 65 72 42 79 29 0a 20 20 29 3b 0a 0a 20 20 69  derBy).  );..  i
e940: 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  f( pMWin->eEnd==
e950: 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a  TK_UNBOUNDED ){.
e960: 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30      pOrderBy = 0
e970: 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 72 73 65 2d  ;.  }..  pParse-
e980: 3e 6e 4d 65 6d 20 2b 3d 20 6e 53 75 62 20 2b 20  >nMem += nSub + 
e990: 32 3b 0a 0a 20 20 2f 2a 20 4d 61 72 74 69 61 6c  2;..  /* Martial
e9a0: 20 74 68 65 20 72 6f 77 20 72 65 74 75 72 6e 65   the row returne
e9b0: 64 20 62 79 20 74 68 65 20 73 75 62 2d 73 65 6c  d by the sub-sel
e9c0: 65 63 74 20 69 6e 74 6f 20 61 6e 20 61 72 72 61  ect into an arra
e9d0: 79 20 6f 66 20 0a 20 20 2a 2a 20 72 65 67 69 73  y of .  ** regis
e9e0: 74 65 72 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 6b  ters. */.  for(k
e9f0: 3d 30 3b 20 6b 3c 6e 53 75 62 3b 20 6b 2b 2b 29  =0; k<nSub; k++)
ea00: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
ea10: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
ea20: 6c 75 6d 6e 2c 20 69 53 75 62 43 73 72 2c 20 6b  lumn, iSubCsr, k
ea30: 2c 20 72 65 67 2b 6b 29 3b 0a 20 20 7d 0a 0a 20  , reg+k);.  }.. 
ea40: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69   /* Check if thi
ea50: 73 20 69 73 20 74 68 65 20 73 74 61 72 74 20 6f  s is the start o
ea60: 66 20 61 20 6e 65 77 20 70 61 72 74 69 74 69 6f  f a new partitio
ea70: 6e 20 6f 72 20 70 65 65 72 20 67 72 6f 75 70 2e  n or peer group.
ea80: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 74 20   */.  if( pPart 
ea90: 7c 7c 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  || pOrderBy ){. 
eaa0: 20 20 20 69 6e 74 20 6e 50 61 72 74 20 3d 20 28     int nPart = (
eab0: 70 50 61 72 74 20 3f 20 70 50 61 72 74 2d 3e 6e  pPart ? pPart->n
eac0: 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 69  Expr : 0);.    i
ead0: 6e 74 20 61 64 64 72 47 6f 74 6f 20 3d 20 30 3b  nt addrGoto = 0;
eae0: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4a 75 6d  .    int addrJum
eaf0: 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e  p = 0;.    int n
eb00: 50 65 65 72 20 3d 20 28 70 4f 72 64 65 72 42 79  Peer = (pOrderBy
eb10: 20 3f 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   ? pOrderBy->nEx
eb20: 70 72 20 3a 20 30 29 3b 0a 0a 20 20 20 20 69 66  pr : 0);..    if
eb30: 28 20 70 50 61 72 74 20 29 7b 0a 20 20 20 20 20  ( pPart ){.     
eb40: 20 69 6e 74 20 72 65 67 4e 65 77 50 61 72 74 20   int regNewPart 
eb50: 3d 20 72 65 67 20 2b 20 70 4d 57 69 6e 2d 3e 6e  = reg + pMWin->n
eb60: 42 75 66 66 65 72 43 6f 6c 3b 0a 20 20 20 20 20  BufferCol;.     
eb70: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
eb80: 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  fo = sqlite3KeyI
eb90: 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
eba0: 70 50 61 72 73 65 2c 20 70 50 61 72 74 2c 20 30  pParse, pPart, 0
ebb0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 64 64 72  , 0);.      addr
ebc0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
ebd0: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp3(v, OP_Compa
ebe0: 72 65 2c 20 72 65 67 4e 65 77 50 61 72 74 2c 20  re, regNewPart, 
ebf0: 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c 6e  pMWin->regPart,n
ec00: 50 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Part);.      sql
ec10: 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
ec20: 28 76 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79 49  (v, (void*)pKeyI
ec30: 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
ec40: 3b 0a 20 20 20 20 20 20 61 64 64 72 4a 75 6d 70  ;.      addrJump
ec50: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
ec60: 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
ec70: 20 61 64 64 72 2b 32 2c 20 30 2c 20 61 64 64 72   addr+2, 0, addr
ec80: 2b 32 29 3b 0a 20 20 20 20 20 20 77 69 6e 64 6f  +2);.      windo
ec90: 77 41 67 67 46 69 6e 61 6c 28 70 50 61 72 73 65  wAggFinal(pParse
eca0: 2c 20 70 4d 57 69 6e 2c 20 31 29 3b 0a 20 20 20  , pMWin, 1);.   
ecb0: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
ecc0: 29 7b 0a 20 20 20 20 20 20 20 20 61 64 64 72 47  ){.        addrG
ecd0: 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33 56 64 62  oto = sqlite3Vdb
ece0: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f  eAddOp0(v, OP_Go
ecf0: 74 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  to);.      }.   
ed00: 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 72 64   }..    if( pOrd
ed10: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e  erBy ){.      in
ed20: 74 20 72 65 67 4e 65 77 50 65 65 72 20 3d 20 72  t regNewPeer = r
ed30: 65 67 20 2b 20 70 4d 57 69 6e 2d 3e 6e 42 75 66  eg + pMWin->nBuf
ed40: 66 65 72 43 6f 6c 20 2b 20 6e 50 61 72 74 3b 0a  ferCol + nPart;.
ed50: 20 20 20 20 20 20 69 6e 74 20 72 65 67 50 65 65        int regPee
ed60: 72 20 3d 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61  r = pMWin->regPa
ed70: 72 74 20 2b 20 6e 50 61 72 74 3b 0a 0a 20 20 20  rt + nPart;..   
ed80: 20 20 20 69 66 28 20 61 64 64 72 4a 75 6d 70 20     if( addrJump 
ed90: 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
eda0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 4a 75 6d  pHere(v, addrJum
edb0: 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d  p);.      if( pM
edc0: 57 69 6e 2d 3e 65 54 79 70 65 3d 3d 54 4b 5f 52  Win->eType==TK_R
edd0: 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20  ANGE ){.        
ede0: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
edf0: 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
ee00: 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
ee10: 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
ee20: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
ee30: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
ee40: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
ee50: 6f 6d 70 61 72 65 2c 20 72 65 67 4e 65 77 50 65  ompare, regNewPe
ee60: 65 72 2c 20 72 65 67 50 65 65 72 2c 20 6e 50 65  er, regPeer, nPe
ee70: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  er);.        sql
ee80: 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
ee90: 28 76 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79 49  (v, (void*)pKeyI
eea0: 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
eeb0: 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72 4a 75  ;.        addrJu
eec0: 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  mp = sqlite3Vdbe
eed0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
eee0: 70 2c 20 61 64 64 72 2b 32 2c 20 30 2c 20 61 64  p, addr+2, 0, ad
eef0: 64 72 2b 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c  dr+2);.      }el
ef00: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 64 64 72  se{.        addr
ef10: 4a 75 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  Jump = 0;.      
ef20: 7d 0a 20 20 20 20 20 20 77 69 6e 64 6f 77 41 67  }.      windowAg
ef30: 67 46 69 6e 61 6c 28 70 50 61 72 73 65 2c 20 70  gFinal(pParse, p
ef40: 4d 57 69 6e 2c 20 70 4d 57 69 6e 2d 3e 65 53 74  MWin, pMWin->eSt
ef50: 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29  art==TK_CURRENT)
ef60: 3b 0a 20 20 20 20 20 20 69 66 28 20 61 64 64 72  ;.      if( addr
ef70: 47 6f 74 6f 20 29 20 73 71 6c 69 74 65 33 56 64  Goto ) sqlite3Vd
ef80: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
ef90: 64 72 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a 0a  drGoto);.    }..
efa0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
efb0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
efc0: 6e 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43  nd, pMWin->iEphC
efd0: 73 72 2c 73 71 6c 69 74 65 33 56 64 62 65 43 75  sr,sqlite3VdbeCu
efe0: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b  rrentAddr(v)+3);
eff0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
f000: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
f010: 75 62 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64  ub, regGosub, ad
f020: 64 72 47 6f 73 75 62 29 3b 0a 20 20 20 20 73 71  drGosub);.    sq
f030: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
f040: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4d 57 69  v, OP_Next, pMWi
f050: 6e 2d 3e 69 45 70 68 43 73 72 2c 20 73 71 6c 69  n->iEphCsr, sqli
f060: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
f070: 64 72 28 76 29 2d 31 29 3b 0a 0a 20 20 20 20 73  dr(v)-1);..    s
f080: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
f090: 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74  (v, OP_ResetSort
f0a0: 65 72 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43  er, pMWin->iEphC
f0b0: 73 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  sr);.    sqlite3
f0c0: 56 64 62 65 41 64 64 4f 70 33 28 0a 20 20 20 20  VdbeAddOp3(.    
f0d0: 20 20 20 20 76 2c 20 4f 50 5f 43 6f 70 79 2c 20      v, OP_Copy, 
f0e0: 72 65 67 2b 70 4d 57 69 6e 2d 3e 6e 42 75 66 66  reg+pMWin->nBuff
f0f0: 65 72 43 6f 6c 2c 20 70 4d 57 69 6e 2d 3e 72 65  erCol, pMWin->re
f100: 67 50 61 72 74 2c 20 6e 50 61 72 74 2b 6e 50 65  gPart, nPart+nPe
f110: 65 72 2d 31 0a 20 20 20 20 29 3b 0a 0a 20 20 20  er-1.    );..   
f120: 20 69 66 28 20 61 64 64 72 4a 75 6d 70 20 29 20   if( addrJump ) 
f130: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
f140: 65 72 65 28 76 2c 20 61 64 64 72 4a 75 6d 70 29  ere(v, addrJump)
f150: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 76 6f  ;.  }..  /* Invo
f160: 6b 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e  ke step function
f170: 20 66 6f 72 20 77 69 6e 64 6f 77 20 66 75 6e 63   for window func
f180: 74 69 6f 6e 73 20 2a 2f 0a 20 20 77 69 6e 64 6f  tions */.  windo
f190: 77 41 67 67 53 74 65 70 28 70 50 61 72 73 65 2c  wAggStep(pParse,
f1a0: 20 70 4d 57 69 6e 2c 20 2d 31 2c 20 30 2c 20 72   pMWin, -1, 0, r
f1b0: 65 67 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 42 75  eg, 0);..  /* Bu
f1c0: 66 66 65 72 20 74 68 65 20 63 75 72 72 65 6e 74  ffer the current
f1d0: 20 72 6f 77 20 69 6e 20 74 68 65 20 65 70 68 65   row in the ephe
f1e0: 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20 2a 2f 0a  meral table. */.
f1f0: 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 6e 42 75    if( pMWin->nBu
f200: 66 66 65 72 43 6f 6c 3e 30 20 29 7b 0a 20 20 20  fferCol>0 ){.   
f210: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f220: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
f230: 6f 72 64 2c 20 72 65 67 2c 20 70 4d 57 69 6e 2d  ord, reg, pMWin-
f240: 3e 6e 42 75 66 66 65 72 43 6f 6c 2c 20 72 65 67  >nBufferCol, reg
f250: 52 65 63 6f 72 64 29 3b 0a 20 20 7d 65 6c 73 65  Record);.  }else
f260: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
f270: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 42 6c  eAddOp2(v, OP_Bl
f280: 6f 62 2c 20 30 2c 20 72 65 67 52 65 63 6f 72 64  ob, 0, regRecord
f290: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
f2a0: 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28 76  beAppendP4(v, (v
f2b0: 6f 69 64 2a 29 22 22 2c 20 30 29 3b 0a 20 20 7d  oid*)"", 0);.  }
f2c0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
f2d0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
f2e0: 77 69 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  wid, pMWin->iEph
f2f0: 43 73 72 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  Csr, regRowid);.
f300: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f310: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
f320: 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
f330: 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 72 65 67  , regRecord, reg
f340: 52 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a 20 45 6e  Rowid);..  /* En
f350: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
f360: 63 61 6e 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 73  can loop. */.  s
f370: 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
f380: 57 49 6e 66 6f 29 3b 0a 0a 20 20 77 69 6e 64 6f  WInfo);..  windo
f390: 77 41 67 67 46 69 6e 61 6c 28 70 50 61 72 73 65  wAggFinal(pParse
f3a0: 2c 20 70 4d 57 69 6e 2c 20 31 29 3b 0a 20 20 73  , pMWin, 1);.  s
f3b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
f3c0: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70  (v, OP_Rewind, p
f3d0: 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 73 71  MWin->iEphCsr,sq
f3e0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
f3f0: 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 73 71  Addr(v)+3);.  sq
f400: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
f410: 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
f420: 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62  Gosub, addrGosub
f430: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
f440: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
f450: 74 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  t, pMWin->iEphCs
f460: 72 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  r, sqlite3VdbeCu
f470: 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 29 3b  rrentAddr(v)-1);
f480: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
f490: 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
f4a0: 64 75 70 6c 69 63 61 74 65 20 6f 66 20 74 68 65  duplicate of the
f4b0: 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 69   Window object i
f4c0: 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65 0a  ndicated by the.
f4d0: 2a 2a 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  ** third argumen
f4e0: 74 2e 20 53 65 74 20 74 68 65 20 57 69 6e 64 6f  t. Set the Windo
f4f0: 77 2e 70 4f 77 6e 65 72 20 66 69 65 6c 64 20 6f  w.pOwner field o
f500: 66 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  f the new object
f510: 20 74 6f 0a 2a 2a 20 70 4f 77 6e 65 72 2e 0a 2a   to.** pOwner..*
f520: 2f 0a 57 69 6e 64 6f 77 20 2a 73 71 6c 69 74 65  /.Window *sqlite
f530: 33 57 69 6e 64 6f 77 44 75 70 28 73 71 6c 69 74  3WindowDup(sqlit
f540: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4f  e3 *db, Expr *pO
f550: 77 6e 65 72 2c 20 57 69 6e 64 6f 77 20 2a 70 29  wner, Window *p)
f560: 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4e 65 77  {.  Window *pNew
f570: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b   = 0;.  if( p ){
f580: 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
f590: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
f5a0: 64 62 2c 20 73 69 7a 65 6f 66 28 57 69 6e 64 6f  db, sizeof(Windo
f5b0: 77 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  w));.    if( pNe
f5c0: 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  w ){.      pNew-
f5d0: 3e 70 46 69 6c 74 65 72 20 3d 20 73 71 6c 69 74  >pFilter = sqlit
f5e0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
f5f0: 3e 70 46 69 6c 74 65 72 2c 20 30 29 3b 0a 20 20  >pFilter, 0);.  
f600: 20 20 20 20 70 4e 65 77 2d 3e 70 50 61 72 74 69      pNew->pParti
f610: 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78  tion = sqlite3Ex
f620: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
f630: 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20 30 29 3b  >pPartition, 0);
f640: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4f 72  .      pNew->pOr
f650: 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45  derBy = sqlite3E
f660: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
f670: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a  ->pOrderBy, 0);.
f680: 20 20 20 20 20 20 70 4e 65 77 2d 3e 65 54 79 70        pNew->eTyp
f690: 65 20 3d 20 70 2d 3e 65 54 79 70 65 3b 0a 20 20  e = p->eType;.  
f6a0: 20 20 20 20 70 4e 65 77 2d 3e 65 45 6e 64 20 3d      pNew->eEnd =
f6b0: 20 70 2d 3e 65 45 6e 64 3b 0a 20 20 20 20 20 20   p->eEnd;.      
f6c0: 70 4e 65 77 2d 3e 65 53 74 61 72 74 20 3d 20 70  pNew->eStart = p
f6d0: 2d 3e 65 53 74 61 72 74 3b 0a 20 20 20 20 20 20  ->eStart;.      
f6e0: 70 4e 65 77 2d 3e 70 53 74 61 72 74 20 3d 20 73  pNew->pStart = s
f6f0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
f700: 2c 20 70 2d 3e 70 53 74 61 72 74 2c 20 30 29 3b  , p->pStart, 0);
f710: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 45 6e  .      pNew->pEn
f720: 64 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  d = sqlite3ExprD
f730: 75 70 28 64 62 2c 20 70 2d 3e 70 45 6e 64 2c 20  up(db, p->pEnd, 
f740: 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  0);.      pNew->
f750: 70 4f 77 6e 65 72 20 3d 20 70 4f 77 6e 65 72 3b  pOwner = pOwner;
f760: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
f770: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
f780: 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  ** sqlite3WhereB
f790: 65 67 69 6e 28 29 20 68 61 73 20 61 6c 72 65 61  egin() has alrea
f7a0: 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 66  dy been called f
f7b0: 6f 72 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  or the SELECT st
f7c0: 61 74 65 6d 65 6e 74 20 0a 2a 2a 20 70 61 73 73  atement .** pass
f7d0: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
f7e0: 20 61 72 67 75 6d 65 6e 74 20 77 68 65 6e 20 74   argument when t
f7f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
f800: 69 6e 76 6f 6b 65 64 2e 20 49 74 20 67 65 6e 65  invoked. It gene
f810: 72 61 74 65 73 0a 2a 2a 20 63 6f 64 65 20 74 6f  rates.** code to
f820: 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 57 69   populate the Wi
f830: 6e 64 6f 77 2e 72 65 67 52 65 73 75 6c 74 20 72  ndow.regResult r
f840: 65 67 69 73 74 65 72 20 66 6f 72 20 65 61 63 68  egister for each
f850: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
f860: 20 61 6e 64 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74   and.** invoke t
f870: 68 65 20 73 75 62 2d 72 6f 75 74 69 6e 65 20 61  he sub-routine a
f880: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64  t instruction ad
f890: 64 72 47 6f 73 75 62 20 6f 6e 63 65 20 66 6f 72  drGosub once for
f8a0: 20 65 61 63 68 20 72 6f 77 2e 0a 2a 2a 20 54 68   each row..** Th
f8b0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  is function call
f8c0: 73 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  s sqlite3WhereEn
f8d0: 64 28 29 20 62 65 66 6f 72 65 20 72 65 74 75 72  d() before retur
f8e0: 6e 69 6e 67 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73  ning. .*/.void s
f8f0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65  qlite3WindowCode
f900: 53 74 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70  Step(.  Parse *p
f910: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
f920: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
f930: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
f940: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
f950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f960: 20 52 65 77 72 69 74 74 65 6e 20 53 45 4c 45 43   Rewritten SELEC
f970: 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
f980: 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
f990: 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
f9a0: 20 2f 2a 20 43 6f 6e 74 65 78 74 20 72 65 74 75   /* Context retu
f9b0: 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 57  rned by sqlite3W
f9c0: 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20  hereBegin() */. 
f9d0: 20 69 6e 74 20 72 65 67 47 6f 73 75 62 2c 20 20   int regGosub,  
f9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9f0: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72   /* Register for
fa00: 20 4f 50 5f 47 6f 73 75 62 20 2a 2f 0a 20 20 69   OP_Gosub */.  i
fa10: 6e 74 20 61 64 64 72 47 6f 73 75 62 20 20 20 20  nt addrGosub    
fa20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fa30: 2a 20 4f 50 5f 47 6f 73 75 62 20 68 65 72 65 20  * OP_Gosub here 
fa40: 74 6f 20 72 65 74 75 72 6e 20 65 61 63 68 20 72  to return each r
fa50: 6f 77 20 2a 2f 0a 29 7b 0a 20 20 57 69 6e 64 6f  ow */.){.  Windo
fa60: 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57  w *pMWin = p->pW
fa70: 69 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20  in;..  /* There 
fa80: 61 72 65 20 74 68 72 65 65 20 64 69 66 66 65 72  are three differ
fa90: 65 6e 74 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  ent functions th
faa0: 61 74 20 6d 61 79 20 62 65 20 75 73 65 64 20 74  at may be used t
fab0: 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 0a 20 20  o do the work.  
fac0: 2a 2a 20 6f 66 20 74 68 69 73 20 6f 6e 65 2c 20  ** of this one, 
fad0: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
fae0: 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 20 61 6e   window frame an
faf0: 64 20 74 68 65 20 73 70 65 63 69 66 69 63 20 62  d the specific b
fb00: 75 69 6c 74 2d 69 6e 0a 20 20 2a 2a 20 77 69 6e  uilt-in.  ** win
fb10: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 75 73  dow functions us
fb20: 65 64 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 2a  ed (if any)..  *
fb30: 2a 0a 20 20 2a 2a 20 77 69 6e 64 6f 77 43 6f 64  *.  ** windowCod
fb40: 65 52 6f 77 45 78 70 72 53 74 65 70 28 29 20 68  eRowExprStep() h
fb50: 61 6e 64 6c 65 73 20 61 6c 6c 20 22 52 4f 57 53  andles all "ROWS
fb60: 22 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 73 2c  " window frames,
fb70: 20 65 78 63 65 70 74 20 66 6f 72 3a 0a 20 20 2a   except for:.  *
fb80: 2a 0a 20 20 2a 2a 20 20 20 52 4f 57 53 20 42 45  *.  **   ROWS BE
fb90: 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20  TWEEN UNBOUNDED 
fba0: 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 43 55  PRECEDING AND CU
fbb0: 52 52 45 4e 54 20 52 4f 57 0a 20 20 2a 2a 0a 20  RRENT ROW.  **. 
fbc0: 20 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f   ** The exceptio
fbd0: 6e 20 69 73 20 62 65 63 61 75 73 65 20 77 69 6e  n is because win
fbe0: 64 6f 77 43 6f 64 65 52 6f 77 45 78 70 72 53 74  dowCodeRowExprSt
fbf0: 65 70 28 29 20 69 6d 70 6c 65 6d 65 6e 74 73 20  ep() implements 
fc00: 61 6c 6c 20 77 69 6e 64 6f 77 0a 20 20 2a 2a 20  all window.  ** 
fc10: 66 72 61 6d 65 20 74 79 70 65 73 20 62 79 20 63  frame types by c
fc20: 61 63 68 69 6e 67 20 74 68 65 20 65 6e 74 69 72  aching the entir
fc30: 65 20 70 61 72 74 69 74 69 6f 6e 20 69 6e 20 61  e partition in a
fc40: 20 74 65 6d 70 20 74 61 62 6c 65 2c 20 61 6e 64   temp table, and
fc50: 0a 20 20 2a 2a 20 22 52 4f 57 53 20 42 45 54 57  .  ** "ROWS BETW
fc60: 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52  EEN UNBOUNDED PR
fc70: 45 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52  ECEDING AND CURR
fc80: 45 4e 54 20 52 4f 57 22 20 69 73 20 65 61 73 79  ENT ROW" is easy
fc90: 20 65 6e 6f 75 67 68 20 74 6f 0a 20 20 2a 2a 20   enough to.  ** 
fca0: 69 6d 70 6c 65 6d 65 6e 74 20 77 69 74 68 6f 75  implement withou
fcb0: 74 20 73 75 63 68 20 61 20 63 61 63 68 65 2e 0a  t such a cache..
fcc0: 20 20 2a 2a 0a 20 20 2a 2a 20 77 69 6e 64 6f 77    **.  ** window
fcd0: 43 6f 64 65 43 61 63 68 65 53 74 65 70 28 29 20  CodeCacheStep() 
fce0: 69 73 20 75 73 65 64 20 66 6f 72 3a 0a 20 20 2a  is used for:.  *
fcf0: 2a 0a 20 20 2a 2a 20 20 20 52 41 4e 47 45 20 42  *.  **   RANGE B
fd00: 45 54 57 45 45 4e 20 43 55 52 52 45 4e 54 20 52  ETWEEN CURRENT R
fd10: 4f 57 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44  OW AND UNBOUNDED
fd20: 20 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20 2a 2a 0a   FOLLOWING.  **.
fd30: 20 20 2a 2a 20 49 74 20 69 73 20 61 6c 73 6f 20    ** It is also 
fd40: 75 73 65 64 20 66 6f 72 20 61 6e 79 74 68 69 6e  used for anythin
fd50: 67 20 6e 6f 74 20 68 61 6e 64 6c 65 64 20 62 79  g not handled by
fd60: 20 77 69 6e 64 6f 77 43 6f 64 65 52 6f 77 45 78   windowCodeRowEx
fd70: 70 72 53 74 65 70 28 29 20 0a 20 20 2a 2a 20 74  prStep() .  ** t
fd80: 68 61 74 20 69 6e 76 6f 6b 65 73 20 61 20 62 75  hat invokes a bu
fd90: 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75  ilt-in window fu
fda0: 6e 63 74 69 6f 6e 20 74 68 61 74 20 72 65 71 75  nction that requ
fdb0: 69 72 65 73 20 74 68 65 20 65 6e 74 69 72 65 20  ires the entire 
fdc0: 0a 20 20 2a 2a 20 70 61 72 74 69 74 69 6f 6e 20  .  ** partition 
fdd0: 74 6f 20 62 65 20 63 61 63 68 65 64 20 69 6e 20  to be cached in 
fde0: 61 20 74 65 6d 70 20 74 61 62 6c 65 20 62 65 66  a temp table bef
fdf0: 6f 72 65 20 61 6e 79 20 72 6f 77 73 20 61 72 65  ore any rows are
fe00: 20 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20 28   returned.  ** (
fe10: 65 2e 67 2e 20 6e 74 68 5f 76 61 6c 75 65 28 29  e.g. nth_value()
fe20: 20 6f 72 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b   or percent_rank
fe30: 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46  ())..  **.  ** F
fe40: 69 6e 61 6c 6c 79 2c 20 61 73 73 75 6d 69 6e 67  inally, assuming
fe50: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 62 75 69   there is no bui
fe60: 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e  lt-in window fun
fe70: 63 74 69 6f 6e 20 74 68 61 74 20 72 65 71 75 69  ction that requi
fe80: 72 65 73 0a 20 20 2a 2a 20 74 68 65 20 70 61 72  res.  ** the par
fe90: 74 69 74 69 6f 6e 20 74 6f 20 62 65 20 63 61 63  tition to be cac
fea0: 68 65 64 2c 20 77 69 6e 64 6f 77 43 6f 64 65 44  hed, windowCodeD
feb0: 65 66 61 75 6c 74 53 74 65 70 28 29 20 69 73 20  efaultStep() is 
fec0: 75 73 65 64 20 66 6f 72 3a 0a 20 20 2a 2a 0a 20  used for:.  **. 
fed0: 20 2a 2a 20 20 20 52 41 4e 47 45 20 42 45 54 57   **   RANGE BETW
fee0: 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52  EEN UNBOUNDED PR
fef0: 45 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52  ECEDING AND CURR
ff00: 45 4e 54 20 52 4f 57 20 0a 20 20 2a 2a 20 20 20  ENT ROW .  **   
ff10: 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 55 4e  RANGE BETWEEN UN
ff20: 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e  BOUNDED PRECEDIN
ff30: 47 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20  G AND UNBOUNDED 
ff40: 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20 2a 2a 20 20  FOLLOWING.  **  
ff50: 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 43   RANGE BETWEEN C
ff60: 55 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 43  URRENT ROW AND C
ff70: 55 52 52 45 4e 54 20 52 4f 57 20 0a 20 20 2a 2a  URRENT ROW .  **
ff80: 20 20 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20     ROWS BETWEEN 
ff90: 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44  UNBOUNDED PRECED
ffa0: 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54 20  ING AND CURRENT 
ffb0: 52 4f 57 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 69  ROW.  **.  ** wi
ffc0: 6e 64 6f 77 43 6f 64 65 44 65 66 61 75 6c 74 53  ndowCodeDefaultS
ffd0: 74 65 70 28 29 20 69 73 20 74 68 65 20 6f 6e 6c  tep() is the onl
ffe0: 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 68 72  y one of the thr
fff0: 65 65 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61  ee functions tha
10000 74 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  t.  ** does not 
10010 63 61 63 68 65 20 65 61 63 68 20 70 61 72 74 69  cache each parti
10020 74 69 6f 6e 20 69 6e 20 61 20 74 65 6d 70 20 74  tion in a temp t
10030 61 62 6c 65 20 62 65 66 6f 72 65 20 62 65 67 69  able before begi
10040 6e 6e 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 72 65  nning to.  ** re
10050 74 75 72 6e 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a  turn rows..  */.
10060 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 54 79    if( pMWin->eTy
10070 70 65 3d 3d 54 4b 5f 52 4f 57 53 20 0a 20 20 20  pe==TK_ROWS .   
10080 26 26 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72  && (pMWin->eStar
10090 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 7c  t!=TK_UNBOUNDED|
100a0 7c 70 4d 57 69 6e 2d 3e 65 45 6e 64 21 3d 54 4b  |pMWin->eEnd!=TK
100b0 5f 43 55 52 52 45 4e 54 7c 7c 21 70 4d 57 69 6e  _CURRENT||!pMWin
100c0 2d 3e 70 4f 72 64 65 72 42 79 29 0a 20 20 29 7b  ->pOrderBy).  ){
100d0 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 52  .    windowCodeR
100e0 6f 77 45 78 70 72 53 74 65 70 28 70 50 61 72 73  owExprStep(pPars
100f0 65 2c 20 70 2c 20 70 57 49 6e 66 6f 2c 20 72 65  e, p, pWInfo, re
10100 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75  gGosub, addrGosu
10110 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  b);.  }else{.   
10120 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20   Window *pWin;. 
10130 20 20 20 69 6e 74 20 62 43 61 63 68 65 20 3d 20     int bCache = 
10140 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
10150 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20   /* True to use 
10160 43 61 63 68 65 53 74 65 70 28 29 20 2a 2f 0a 0a  CacheStep() */..
10170 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65      if( pMWin->e
10180 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e  Start==TK_CURREN
10190 54 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64  T && pMWin->eEnd
101a0 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29  ==TK_UNBOUNDED )
101b0 7b 0a 20 20 20 20 20 20 62 43 61 63 68 65 20 3d  {.      bCache =
101c0 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
101d0 20 20 20 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d       for(pWin=pM
101e0 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d  Win; pWin; pWin=
101f0 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b  pWin->pNextWin){
10200 0a 20 20 20 20 20 20 20 20 46 75 6e 63 44 65 66  .        FuncDef
10210 20 2a 70 46 75 6e 63 20 3d 20 70 57 69 6e 2d 3e   *pFunc = pWin->
10220 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 69  pFunc;.        i
10230 66 28 20 28 70 46 75 6e 63 2d 3e 66 75 6e 63 46  f( (pFunc->funcF
10240 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
10250 4e 43 5f 57 49 4e 44 4f 57 5f 53 49 5a 45 29 0a  NC_WINDOW_SIZE).
10260 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 46 75           || (pFu
10270 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 6e 74 68 5f  nc->xSFunc==nth_
10280 76 61 6c 75 65 53 74 65 70 46 75 6e 63 29 0a 20  valueStepFunc). 
10290 20 20 20 20 20 20 20 20 7c 7c 20 28 70 46 75 6e          || (pFun
102a0 63 2d 3e 78 53 46 75 6e 63 3d 3d 66 69 72 73 74  c->xSFunc==first
102b0 5f 76 61 6c 75 65 53 74 65 70 46 75 6e 63 29 0a  _valueStepFunc).
102c0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 46 75           || (pFu
102d0 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 6c 65 61 64  nc->xSFunc==lead
102e0 53 74 65 70 46 75 6e 63 29 0a 20 20 20 20 20 20  StepFunc).      
102f0 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d 3e 78 53     || (pFunc->xS
10300 46 75 6e 63 3d 3d 6c 61 67 53 74 65 70 46 75 6e  Func==lagStepFun
10310 63 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  c).        ){.  
10320 20 20 20 20 20 20 20 20 62 43 61 63 68 65 20 3d          bCache =
10330 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   1;.          br
10340 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
10350 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
10360 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    /* Otherwise, 
10370 63 61 6c 6c 20 77 69 6e 64 6f 77 43 6f 64 65 44  call windowCodeD
10380 65 66 61 75 6c 74 53 74 65 70 28 29 2e 20 20 2a  efaultStep().  *
10390 2f 0a 20 20 20 20 69 66 28 20 62 43 61 63 68 65  /.    if( bCache
103a0 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 64 6f 77   ){.      window
103b0 43 6f 64 65 43 61 63 68 65 53 74 65 70 28 70 50  CodeCacheStep(pP
103c0 61 72 73 65 2c 20 70 2c 20 70 57 49 6e 66 6f 2c  arse, p, pWInfo,
103d0 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47   regGosub, addrG
103e0 6f 73 75 62 29 3b 0a 20 20 20 20 7d 65 6c 73 65  osub);.    }else
103f0 7b 0a 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f  {.      windowCo
10400 64 65 44 65 66 61 75 6c 74 53 74 65 70 28 70 50  deDefaultStep(pP
10410 61 72 73 65 2c 20 70 2c 20 70 57 49 6e 66 6f 2c  arse, p, pWInfo,
10420 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47   regGosub, addrG
10430 6f 73 75 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  osub);.    }.  }
10440 0a 7d 0a 0a                                      .}..