/ Hex Artifact Content
Login

Artifact 3fc03f5ac20516d218933bc9eaf37863a511d9b9fffb3e37a9409e7a25efca99:


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 28 70 50 61 72 74 20 3f 20 70 50  rt = (pPart ? pP
8cd0: 61 72 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b  art->nExpr : 0);
8ce0: 0a 20 20 20 20 69 6e 74 20 72 65 67 4e 65 77 50  .    int regNewP
8cf0: 61 72 74 20 3d 20 72 65 67 20 2b 20 70 4d 57 69  art = reg + pMWi
8d00: 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 3b 0a 20  n->nBufferCol;. 
8d10: 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
8d20: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65  Info = sqlite3Ke
8d30: 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
8d40: 74 28 70 50 61 72 73 65 2c 20 70 50 61 72 74 2c  t(pParse, pPart,
8d50: 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 61 64 64   0, 0);..    add
8d60: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
8d70: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp3(v, OP_Comp
8d80: 61 72 65 2c 20 72 65 67 4e 65 77 50 61 72 74 2c  are, regNewPart,
8d90: 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c   pMWin->regPart,
8da0: 6e 50 61 72 74 29 3b 0a 20 20 20 20 73 71 6c 69  nPart);.    sqli
8db0: 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
8dc0: 76 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e  v, (void*)pKeyIn
8dd0: 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
8de0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8df0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
8e00: 70 2c 20 61 64 64 72 2b 32 2c 20 61 64 64 72 2b  p, addr+2, addr+
8e10: 34 2c 20 61 64 64 72 2b 32 29 3b 0a 20 20 20 20  4, addr+2);.    
8e20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8e30: 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65  3(v, OP_Copy, re
8e40: 67 4e 65 77 50 61 72 74 2c 20 70 4d 57 69 6e 2d  gNewPart, pMWin-
8e50: 3e 72 65 67 50 61 72 74 2c 20 6e 50 61 72 74 2d  >regPart, nPart-
8e60: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
8e70: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8e80: 47 6f 73 75 62 2c 20 72 65 67 46 6c 75 73 68 50  Gosub, regFlushP
8e90: 61 72 74 2c 20 6c 62 6c 46 6c 75 73 68 50 61 72  art, lblFlushPar
8ea0: 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 75  t);.  }..  /* Bu
8eb0: 66 66 65 72 20 74 68 65 20 63 75 72 72 65 6e 74  ffer the current
8ec0: 20 72 6f 77 20 69 6e 20 74 68 65 20 65 70 68 65   row in the ephe
8ed0: 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20 2a 2f 0a  meral table. */.
8ee0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8ef0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
8f00: 69 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43  id, pMWin->iEphC
8f10: 73 72 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  sr, regRowid);. 
8f20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8f30: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
8f40: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c   pMWin->iEphCsr,
8f50: 20 72 65 67 52 65 63 6f 72 64 2c 20 72 65 67 52   regRecord, regR
8f60: 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a 20 45 6e 64  owid);..  /* End
8f70: 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f   of the input lo
8f80: 6f 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57  op */.  sqlite3W
8f90: 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
8fa0: 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 22 66  ..  /* Invoke "f
8fb0: 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 20  lush_partition" 
8fc0: 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 65  to deal with the
8fd0: 20 66 69 6e 61 6c 20 28 6f 72 20 6f 6e 6c 79 29   final (or only)
8fe0: 20 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 20 20   partition */.  
8ff0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9000: 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
9010: 65 67 46 6c 75 73 68 50 61 72 74 2c 20 6c 62 6c  egFlushPart, lbl
9020: 46 6c 75 73 68 50 61 72 74 29 3b 0a 7d 0a 0a 2f  FlushPart);.}../
9030: 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
9040: 73 75 62 2d 72 6f 75 74 69 6e 65 20 61 74 20 72  sub-routine at r
9050: 65 67 47 6f 73 75 62 20 28 67 65 6e 65 72 61 74  egGosub (generat
9060: 65 64 20 62 79 20 63 6f 64 65 20 69 6e 20 73 65  ed by code in se
9070: 6c 65 63 74 2e 63 29 20 74 6f 0a 2a 2a 20 72 65  lect.c) to.** re
9080: 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
9090: 20 72 6f 77 20 6f 66 20 57 69 6e 64 6f 77 2e 69   row of Window.i
90a0: 45 70 68 43 73 72 2e 20 49 66 20 61 6c 6c 20 77  EphCsr. If all w
90b0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
90c0: 61 72 65 0a 2a 2a 20 61 67 67 72 65 67 61 74 65  are.** aggregate
90d0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
90e0: 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20 73  s that use the s
90f0: 74 61 6e 64 61 72 64 20 41 50 49 2c 20 61 20 73  tandard API, a s
9100: 69 6e 67 6c 65 0a 2a 2a 20 4f 50 5f 47 6f 73 75  ingle.** OP_Gosu
9110: 62 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73  b instruction is
9120: 20 61 6c 6c 20 74 68 61 74 20 74 68 69 73 20 72   all that this r
9130: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
9140: 2e 20 45 78 74 72 61 20 56 4d 20 63 6f 64 65 0a  . Extra VM code.
9150: 2a 2a 20 66 6f 72 20 70 65 72 2d 72 6f 77 20 70  ** for per-row p
9160: 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6f 6e 6c  rocessing is onl
9170: 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  y generated for 
9180: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 75  the following bu
9190: 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 0a 2a 2a  ilt-in window.**
91a0: 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a   functions:.**.*
91b0: 2a 20 20 20 6e 74 68 5f 76 61 6c 75 65 28 29 0a  *   nth_value().
91c0: 2a 2a 20 20 20 66 69 72 73 74 5f 76 61 6c 75 65  **   first_value
91d0: 28 29 0a 2a 2a 20 20 20 6c 61 67 28 29 0a 2a 2a  ().**   lag().**
91e0: 20 20 20 6c 65 61 64 28 29 0a 2a 2f 0a 73 74 61     lead().*/.sta
91f0: 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 52  tic void windowR
9200: 65 74 75 72 6e 4f 6e 65 52 6f 77 28 0a 20 20 50  eturnOneRow(.  P
9210: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20  arse *pParse,.  
9220: 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 2c 0a 20  Window *pMWin,. 
9230: 20 69 6e 74 20 72 65 67 47 6f 73 75 62 2c 0a 20   int regGosub,. 
9240: 20 69 6e 74 20 61 64 64 72 47 6f 73 75 62 0a 29   int addrGosub.)
9250: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
9260: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
9270: 72 73 65 29 3b 0a 20 20 57 69 6e 64 6f 77 20 2a  rse);.  Window *
9280: 70 57 69 6e 3b 0a 20 20 66 6f 72 28 70 57 69 6e  pWin;.  for(pWin
9290: 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57  =pMWin; pWin; pW
92a0: 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69  in=pWin->pNextWi
92b0: 6e 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 20  n){.    FuncDef 
92c0: 2a 70 46 75 6e 63 20 3d 20 70 57 69 6e 2d 3e 70  *pFunc = pWin->p
92d0: 46 75 6e 63 3b 0a 20 20 20 20 69 66 28 20 70 46  Func;.    if( pF
92e0: 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 6e 74 68  unc->xSFunc==nth
92f0: 5f 76 61 6c 75 65 53 74 65 70 46 75 6e 63 20 0a  _valueStepFunc .
9300: 20 20 20 20 20 7c 7c 20 70 46 75 6e 63 2d 3e 78       || pFunc->x
9310: 53 46 75 6e 63 3d 3d 66 69 72 73 74 5f 76 61 6c  SFunc==first_val
9320: 75 65 53 74 65 70 46 75 6e 63 20 0a 20 20 20 20  ueStepFunc .    
9330: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 63 73 72  ){.      int csr
9340: 20 3d 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 3b   = pWin->csrApp;
9350: 0a 20 20 20 20 20 20 69 6e 74 20 6c 62 6c 20 3d  .      int lbl =
9360: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
9370: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
9380: 69 6e 74 20 74 6d 70 52 65 67 20 3d 20 73 71 6c  int tmpReg = sql
9390: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
93a0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
93b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
93c0: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70  v, OP_Null, 0, p
93d0: 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b  Win->regResult);
93e0: 0a 0a 20 20 20 20 20 20 69 66 28 20 70 46 75 6e  ..      if( pFun
93f0: 63 2d 3e 78 53 46 75 6e 63 3d 3d 6e 74 68 5f 76  c->xSFunc==nth_v
9400: 61 6c 75 65 53 74 65 70 46 75 6e 63 20 29 7b 0a  alueStepFunc ){.
9410: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
9420: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
9430: 43 6f 6c 75 6d 6e 2c 20 70 57 69 6e 2d 3e 69 45  Column, pWin->iE
9440: 70 68 43 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72  phCsr, pWin->iAr
9450: 67 43 6f 6c 2b 31 2c 20 74 6d 70 52 65 67 29 3b  gCol+1, tmpReg);
9460: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9470: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9480: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
9490: 74 65 67 65 72 2c 20 31 2c 20 74 6d 70 52 65 67  teger, 1, tmpReg
94a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
94b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
94c0: 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20 74 6d  p3(v, OP_Add, tm
94d0: 70 52 65 67 2c 20 70 57 69 6e 2d 3e 72 65 67 41  pReg, pWin->regA
94e0: 70 70 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20  pp, tmpReg);.   
94f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9500: 64 4f 70 33 28 76 2c 20 4f 50 5f 47 74 2c 20 70  dOp3(v, OP_Gt, p
9510: 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31 2c 20 6c  Win->regApp+1, l
9520: 62 6c 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20  bl, tmpReg);.   
9530: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9540: 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52  dOp3(v, OP_SeekR
9550: 6f 77 69 64 2c 20 63 73 72 2c 20 6c 62 6c 2c 20  owid, csr, lbl, 
9560: 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20 20 73  tmpReg);.      s
9570: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
9580: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63  (v, OP_Column, c
9590: 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f  sr, pWin->iArgCo
95a0: 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75  l, pWin->regResu
95b0: 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lt);.      sqlit
95c0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
95d0: 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20 20 20 20  el(v, lbl);.    
95e0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
95f0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
9600: 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 7d 0a 20  tmpReg);.    }. 
9610: 20 20 20 65 6c 73 65 20 69 66 28 20 70 46 75 6e     else if( pFun
9620: 63 2d 3e 78 53 46 75 6e 63 3d 3d 6c 65 61 64 53  c->xSFunc==leadS
9630: 74 65 70 46 75 6e 63 20 7c 7c 20 70 46 75 6e 63  tepFunc || pFunc
9640: 2d 3e 78 53 46 75 6e 63 3d 3d 6c 61 67 53 74 65  ->xSFunc==lagSte
9650: 70 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 69  pFunc ){.      i
9660: 6e 74 20 6e 41 72 67 20 3d 20 70 57 69 6e 2d 3e  nt nArg = pWin->
9670: 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 2d  pOwner->x.pList-
9680: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e  >nExpr;.      in
9690: 74 20 69 45 70 68 20 3d 20 70 57 69 6e 2d 3e 69  t iEph = pWin->i
96a0: 45 70 68 43 73 72 3b 0a 20 20 20 20 20 20 69 6e  EphCsr;.      in
96b0: 74 20 63 73 72 20 3d 20 70 57 69 6e 2d 3e 63 73  t csr = pWin->cs
96c0: 72 41 70 70 3b 0a 20 20 20 20 20 20 69 6e 74 20  rApp;.      int 
96d0: 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  lbl = sqlite3Vdb
96e0: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
96f0: 20 20 20 20 20 69 6e 74 20 74 6d 70 52 65 67 20       int tmpReg 
9700: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
9710: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 0a 20 20  Reg(pParse);..  
9720: 20 20 20 20 69 66 28 20 6e 41 72 67 3c 33 20 29      if( nArg<3 )
9730: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
9740: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
9750: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d  P_Null, 0, pWin-
9760: 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20  >regResult);.   
9770: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9780: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9790: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
97a0: 2c 20 69 45 70 68 2c 20 70 57 69 6e 2d 3e 69 41  , iEph, pWin->iA
97b0: 72 67 43 6f 6c 2b 32 2c 20 70 57 69 6e 2d 3e 72  rgCol+2, pWin->r
97c0: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
97d0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
97e0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
97f0: 5f 52 6f 77 69 64 2c 20 69 45 70 68 2c 20 74 6d  _Rowid, iEph, tm
9800: 70 52 65 67 29 3b 0a 20 20 20 20 20 20 69 66 28  pReg);.      if(
9810: 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20 20 20   nArg<2 ){.     
9820: 20 20 20 69 6e 74 20 76 61 6c 20 3d 20 28 70 46     int val = (pF
9830: 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 6c 65 61  unc->xSFunc==lea
9840: 64 53 74 65 70 46 75 6e 63 20 3f 20 31 20 3a 20  dStepFunc ? 1 : 
9850: 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  -1);.        sql
9860: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
9870: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 6d 70  , OP_AddImm, tmp
9880: 52 65 67 2c 20 76 61 6c 29 3b 0a 20 20 20 20 20  Reg, val);.     
9890: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
98a0: 69 6e 74 20 6f 70 20 3d 20 28 70 46 75 6e 63 2d  int op = (pFunc-
98b0: 3e 78 53 46 75 6e 63 3d 3d 6c 65 61 64 53 74 65  >xSFunc==leadSte
98c0: 70 46 75 6e 63 20 3f 20 4f 50 5f 41 64 64 20 3a  pFunc ? OP_Add :
98d0: 20 4f 50 5f 53 75 62 74 72 61 63 74 29 3b 0a 20   OP_Subtract);. 
98e0: 20 20 20 20 20 20 20 69 6e 74 20 74 6d 70 52 65         int tmpRe
98f0: 67 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  g2 = sqlite3GetT
9900: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
9910: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
9920: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
9930: 43 6f 6c 75 6d 6e 2c 20 69 45 70 68 2c 20 70 57  Column, iEph, pW
9940: 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 31 2c 20 74  in->iArgCol+1, t
9950: 6d 70 52 65 67 32 29 3b 0a 20 20 20 20 20 20 20  mpReg2);.       
9960: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9970: 70 33 28 76 2c 20 6f 70 2c 20 74 6d 70 52 65 67  p3(v, op, tmpReg
9980: 32 2c 20 74 6d 70 52 65 67 2c 20 74 6d 70 52 65  2, tmpReg, tmpRe
9990: 67 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  g);.        sqli
99a0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
99b0: 67 28 70 50 61 72 73 65 2c 20 74 6d 70 52 65 67  g(pParse, tmpReg
99c0: 32 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  2);.      }..   
99d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
99e0: 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52  dOp3(v, OP_SeekR
99f0: 6f 77 69 64 2c 20 63 73 72 2c 20 6c 62 6c 2c 20  owid, csr, lbl, 
9a00: 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20 20 73  tmpReg);.      s
9a10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
9a20: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63  (v, OP_Column, c
9a30: 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f  sr, pWin->iArgCo
9a40: 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75  l, pWin->regResu
9a50: 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lt);.      sqlit
9a60: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
9a70: 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20 20 20 20  el(v, lbl);.    
9a80: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
9a90: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
9aa0: 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 7d 0a 20  tmpReg);.    }. 
9ab0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
9ac0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
9ad0: 75 62 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64  ub, regGosub, ad
9ae0: 64 72 47 6f 73 75 62 29 3b 0a 7d 0a 0a 2f 2a 0a  drGosub);.}../*.
9af0: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 63 6f  ** Invoke the co
9b00: 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  de generated by 
9b10: 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52  windowReturnOneR
9b20: 6f 77 28 29 20 61 6e 64 2c 20 6f 70 74 69 6f 6e  ow() and, option
9b30: 61 6c 6c 79 2c 20 74 68 65 0a 2a 2a 20 78 49 6e  ally, the.** xIn
9b40: 76 65 72 73 65 28 29 20 66 75 6e 63 74 69 6f 6e  verse() function
9b50: 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77   for each window
9b60: 20 66 75 6e 63 74 69 6f 6e 2c 20 66 6f 72 20 6f   function, for o
9b70: 6e 65 20 6f 72 20 6d 6f 72 65 20 72 6f 77 73 0a  ne or more rows.
9b80: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 57 69 6e 64  ** from the Wind
9b90: 6f 77 2e 69 45 70 68 43 73 72 20 74 65 6d 70 20  ow.iEphCsr temp 
9ba0: 74 61 62 6c 65 2e 20 54 68 69 73 20 72 6f 75 74  table. This rout
9bb0: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 56 4d  ine generates VM
9bc0: 20 63 6f 64 65 0a 2a 2a 20 73 69 6d 69 6c 61 72   code.** similar
9bd0: 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 77 68 69   to:.**.**   whi
9be0: 6c 65 28 20 72 65 67 43 74 72 3e 30 20 29 7b 0a  le( regCtr>0 ){.
9bf0: 2a 2a 20 20 20 20 20 72 65 67 43 74 72 2d 2d 3b  **     regCtr--;
9c00: 0a 2a 2a 20 20 20 20 20 77 69 6e 64 6f 77 52 65  .**     windowRe
9c10: 74 75 72 6e 4f 6e 65 52 6f 77 28 29 0a 2a 2a 20  turnOneRow().** 
9c20: 20 20 20 20 69 66 28 20 62 49 6e 76 65 72 73 65      if( bInverse
9c30: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67 67   ){.**       Agg
9c40: 53 74 65 70 20 28 78 49 6e 76 65 72 73 65 29 0a  Step (xInverse).
9c50: 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20  **     }.**     
9c60: 4e 65 78 74 20 28 57 69 6e 64 6f 77 2e 69 45 70  Next (Window.iEp
9c70: 68 43 73 72 29 0a 2a 2a 20 20 20 7d 0a 2a 2f 0a  hCsr).**   }.*/.
9c80: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64  static void wind
9c90: 6f 77 52 65 74 75 72 6e 52 6f 77 73 28 0a 20 20  owReturnRows(.  
9ca0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20  Parse *pParse,. 
9cb0: 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 2c 20   Window *pMWin, 
9cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cd0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 77 69 6e 64   /* List of wind
9ce0: 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  ow functions */.
9cf0: 20 20 69 6e 74 20 72 65 67 43 74 72 2c 20 20 20    int regCtr,   
9d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d10: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 63 6f    /* Register co
9d20: 6e 74 61 69 6e 69 6e 67 20 6e 75 6d 62 65 72 20  ntaining number 
9d30: 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74  of rows */.  int
9d40: 20 72 65 67 47 6f 73 75 62 2c 20 20 20 20 20 20   regGosub,      
9d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9d60: 52 65 67 69 73 74 65 72 20 66 6f 72 20 47 6f 73  Register for Gos
9d70: 75 62 20 61 64 64 72 47 6f 73 75 62 20 2a 2f 0a  ub addrGosub */.
9d80: 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75 62 2c    int addrGosub,
9d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9da0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
9db0: 73 75 62 2d 72 6f 75 74 69 6e 65 20 66 6f 72 20  sub-routine for 
9dc0: 52 65 74 75 72 6e 4f 6e 65 52 6f 77 20 2a 2f 0a  ReturnOneRow */.
9dd0: 20 20 69 6e 74 20 72 65 67 49 6e 76 41 72 67 2c    int regInvArg,
9de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9df0: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 72 65    /* Array of re
9e00: 67 69 73 74 65 72 73 20 66 6f 72 20 78 49 6e 76  gisters for xInv
9e10: 65 72 73 65 20 61 72 67 73 20 2a 2f 0a 20 20 69  erse args */.  i
9e20: 6e 74 20 72 65 67 49 6e 76 53 69 7a 65 20 20 20  nt regInvSize   
9e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9e40: 2a 20 52 65 67 69 73 74 65 72 20 63 6f 6e 74 61  * Register conta
9e50: 69 6e 69 6e 67 20 73 69 7a 65 20 6f 66 20 70 61  ining size of pa
9e60: 72 74 69 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  rtition */.){.  
9e70: 69 6e 74 20 61 64 64 72 3b 0a 20 20 56 64 62 65  int addr;.  Vdbe
9e80: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
9e90: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
9ea0: 77 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 70  windowAggFinal(p
9eb0: 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 30 29  Parse, pMWin, 0)
9ec0: 3b 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74  ;.  addr = sqlit
9ed0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
9ee0: 4f 50 5f 49 66 50 6f 73 2c 20 72 65 67 43 74 72  OP_IfPos, regCtr
9ef0: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
9f00: 72 65 6e 74 41 64 64 72 28 76 29 2b 32 20 2c 31  rentAddr(v)+2 ,1
9f10: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
9f20: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
9f30: 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 77 69 6e 64  o, 0, 0);.  wind
9f40: 6f 77 52 65 74 75 72 6e 4f 6e 65 52 6f 77 28 70  owReturnOneRow(p
9f50: 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 72 65  Parse, pMWin, re
9f60: 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75  gGosub, addrGosu
9f70: 62 29 3b 0a 20 20 69 66 28 20 72 65 67 49 6e 76  b);.  if( regInv
9f80: 41 72 67 20 29 7b 0a 20 20 20 20 77 69 6e 64 6f  Arg ){.    windo
9f90: 77 41 67 67 53 74 65 70 28 70 50 61 72 73 65 2c  wAggStep(pParse,
9fa0: 20 70 4d 57 69 6e 2c 20 70 4d 57 69 6e 2d 3e 69   pMWin, pMWin->i
9fb0: 45 70 68 43 73 72 2c 20 31 2c 20 72 65 67 49 6e  EphCsr, 1, regIn
9fc0: 76 41 72 67 2c 20 72 65 67 49 6e 76 53 69 7a 65  vArg, regInvSize
9fd0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
9fe0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
9ff0: 5f 4e 65 78 74 2c 20 70 4d 57 69 6e 2d 3e 69 45  _Next, pMWin->iE
a000: 70 68 43 73 72 2c 20 61 64 64 72 29 3b 0a 20 20  phCsr, addr);.  
a010: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
a020: 65 72 65 28 76 2c 20 61 64 64 72 2b 31 29 3b 20  ere(v, addr+1); 
a030: 20 20 2f 2a 20 54 68 65 20 4f 50 5f 47 6f 74 6f    /* The OP_Goto
a040: 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   */.}../*.** Gen
a050: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 65  erate code to se
a060: 74 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  t the accumulato
a070: 72 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 65  r register for e
a080: 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  ach window funct
a090: 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 6c 69  ion.** in the li
a0a0: 6e 6b 65 64 20 6c 69 73 74 20 70 61 73 73 65 64  nked list passed
a0b0: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
a0c0: 72 67 75 6d 65 6e 74 20 74 6f 20 4e 55 4c 4c 2e  rgument to NULL.
a0d0: 20 41 6e 64 20 70 65 72 66 6f 72 6d 0a 2a 2a 20   And perform.** 
a0e0: 61 6e 79 20 65 71 75 69 76 61 6c 65 6e 74 20 69  any equivalent i
a0f0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 72 65  nitialization re
a100: 71 75 69 72 65 64 20 62 79 20 61 6e 79 20 62 75  quired by any bu
a110: 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75  ilt-in window fu
a120: 6e 63 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 74 68  nctions.** in th
a130: 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
a140: 63 20 69 6e 74 20 77 69 6e 64 6f 77 49 6e 69 74  c int windowInit
a150: 41 63 63 75 6d 28 50 61 72 73 65 20 2a 70 50 61  Accum(Parse *pPa
a160: 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70 4d 57  rse, Window *pMW
a170: 69 6e 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  in){.  Vdbe *v =
a180: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
a190: 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72  pParse);.  int r
a1a0: 65 67 41 72 67 3b 0a 20 20 69 6e 74 20 6e 41 72  egArg;.  int nAr
a1b0: 67 20 3d 20 30 3b 0a 20 20 57 69 6e 64 6f 77 20  g = 0;.  Window 
a1c0: 2a 70 57 69 6e 3b 0a 20 20 66 6f 72 28 70 57 69  *pWin;.  for(pWi
a1d0: 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70  n=pMWin; pWin; p
a1e0: 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57  Win=pWin->pNextW
a1f0: 69 6e 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66  in){.    FuncDef
a200: 20 2a 70 46 75 6e 63 20 3d 20 70 57 69 6e 2d 3e   *pFunc = pWin->
a210: 70 46 75 6e 63 3b 0a 20 20 20 20 73 71 6c 69 74  pFunc;.    sqlit
a220: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
a230: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e  OP_Null, 0, pWin
a240: 2d 3e 72 65 67 41 63 63 75 6d 29 3b 0a 20 20 20  ->regAccum);.   
a250: 20 6e 41 72 67 20 3d 20 4d 41 58 28 6e 41 72 67   nArg = MAX(nArg
a260: 2c 20 77 69 6e 64 6f 77 41 72 67 43 6f 75 6e 74  , windowArgCount
a270: 28 70 57 69 6e 29 29 3b 0a 20 20 20 20 69 66 28  (pWin));.    if(
a280: 20 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d   pFunc->xSFunc==
a290: 6e 74 68 5f 76 61 6c 75 65 53 74 65 70 46 75 6e  nth_valueStepFun
a2a0: 63 0a 20 20 20 20 20 7c 7c 20 70 46 75 6e 63 2d  c.     || pFunc-
a2b0: 3e 78 53 46 75 6e 63 3d 3d 66 69 72 73 74 5f 76  >xSFunc==first_v
a2c0: 61 6c 75 65 53 74 65 70 46 75 6e 63 20 0a 20 20  alueStepFunc .  
a2d0: 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74    ){.      sqlit
a2e0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
a2f0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70  OP_Integer, 0, p
a300: 57 69 6e 2d 3e 72 65 67 41 70 70 29 3b 0a 20 20  Win->regApp);.  
a310: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a320: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
a330: 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65  ger, 0, pWin->re
a340: 67 41 70 70 2b 31 29 3b 0a 20 20 20 20 7d 0a 0a  gApp+1);.    }..
a350: 20 20 20 20 69 66 28 20 28 70 46 75 6e 63 2d 3e      if( (pFunc->
a360: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
a370: 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 20  TE_FUNC_MINMAX) 
a380: 26 26 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 20  && pWin->csrApp 
a390: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
a3a0: 20 70 57 69 6e 2d 3e 65 53 74 61 72 74 21 3d 54   pWin->eStart!=T
a3b0: 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 3b 0a 20  K_UNBOUNDED );. 
a3c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a3d0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73  AddOp1(v, OP_Res
a3e0: 65 74 53 6f 72 74 65 72 2c 20 70 57 69 6e 2d 3e  etSorter, pWin->
a3f0: 63 73 72 41 70 70 29 3b 0a 20 20 20 20 20 20 73  csrApp);.      s
a400: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
a410: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
a420: 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b  0, pWin->regApp+
a430: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1);.    }.  }.  
a440: 72 65 67 41 72 67 20 3d 20 70 50 61 72 73 65 2d  regArg = pParse-
a450: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 70 50 61 72 73  >nMem+1;.  pPars
a460: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 41 72 67 3b  e->nMem += nArg;
a470: 0a 20 20 72 65 74 75 72 6e 20 72 65 67 41 72 67  .  return regArg
a480: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
a490: 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74   function does t
a4a0: 68 65 20 77 6f 72 6b 20 6f 66 20 73 71 6c 69 74  he work of sqlit
a4b0: 65 33 57 69 6e 64 6f 77 43 6f 64 65 53 74 65 70  e3WindowCodeStep
a4c0: 28 29 20 66 6f 72 20 61 6c 6c 20 22 52 4f 57 53  () for all "ROWS
a4d0: 22 0a 2a 2a 20 77 69 6e 64 6f 77 20 66 72 61 6d  ".** window fram
a4e0: 65 20 74 79 70 65 73 20 65 78 63 65 70 74 20 66  e types except f
a4f0: 6f 72 20 22 42 45 54 57 45 45 4e 20 55 4e 42 4f  or "BETWEEN UNBO
a500: 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20  UNDED PRECEDING 
a510: 41 4e 44 20 43 55 52 52 45 4e 54 0a 2a 2a 20 52  AND CURRENT.** R
a520: 4f 57 22 2e 20 50 73 65 75 64 6f 2d 63 6f 64 65  OW". Pseudo-code
a530: 20 66 6f 72 20 65 61 63 68 20 66 6f 6c 6c 6f 77   for each follow
a540: 73 2e 0a 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42 45  s..**.** ROWS BE
a550: 54 57 45 45 4e 20 3c 65 78 70 72 31 3e 20 50 52  TWEEN <expr1> PR
a560: 45 43 45 44 49 4e 47 20 41 4e 44 20 3c 65 78 70  ECEDING AND <exp
a570: 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a  r2> FOLLOWING.**
a580: 0a 2a 2a 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20  .**     ....**  
a590: 20 20 20 20 20 69 66 28 20 6e 65 77 20 70 61 72       if( new par
a5a0: 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20  tition ){.**    
a5b0: 20 20 20 20 20 47 6f 73 75 62 20 66 6c 75 73 68       Gosub flush
a5c0: 5f 70 61 72 74 69 74 69 6f 6e 0a 2a 2a 20 20 20  _partition.**   
a5d0: 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 49      }.**       I
a5e0: 6e 73 65 72 74 20 28 72 65 63 6f 72 64 20 69 6e  nsert (record in
a5f0: 20 65 70 68 2d 74 61 62 6c 65 29 0a 2a 2a 20 20   eph-table).**  
a600: 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
a610: 6e 64 28 29 0a 2a 2a 20 20 20 20 20 47 6f 73 75  nd().**     Gosu
a620: 62 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f  b flush_partitio
a630: 6e 0a 2a 2a 20 20 0a 2a 2a 20 20 20 66 6c 75 73  n.**  .**   flus
a640: 68 5f 70 61 72 74 69 74 69 6f 6e 3a 0a 2a 2a 20  h_partition:.** 
a650: 20 20 20 20 4f 6e 63 65 20 7b 0a 2a 2a 20 20 20      Once {.**   
a660: 20 20 20 20 4f 70 65 6e 44 75 70 20 28 69 45 70      OpenDup (iEp
a670: 68 43 73 72 20 2d 3e 20 63 73 72 53 74 61 72 74  hCsr -> csrStart
a680: 29 0a 2a 2a 20 20 20 20 20 20 20 4f 70 65 6e 44  ).**       OpenD
a690: 75 70 20 28 69 45 70 68 43 73 72 20 2d 3e 20 63  up (iEphCsr -> c
a6a0: 73 72 45 6e 64 29 0a 2a 2a 20 20 20 20 20 7d 0a  srEnd).**     }.
a6b0: 2a 2a 20 20 20 20 20 72 65 67 53 74 61 72 74 20  **     regStart 
a6c0: 3d 20 3c 65 78 70 72 31 3e 20 20 20 20 20 20 20  = <expr1>       
a6d0: 20 20 20 20 20 20 20 20 20 2f 2f 20 50 52 45 43           // PREC
a6e0: 45 44 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e  EDING expression
a6f0: 0a 2a 2a 20 20 20 20 20 72 65 67 45 6e 64 20 3d  .**     regEnd =
a700: 20 3c 65 78 70 72 32 3e 20 20 20 20 20 20 20 20   <expr2>        
a710: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 46 4f 4c            // FOL
a720: 4c 4f 57 49 4e 47 20 65 78 70 72 65 73 73 69 6f  LOWING expressio
a730: 6e 0a 2a 2a 20 20 20 20 20 69 66 28 20 72 65 67  n.**     if( reg
a740: 53 74 61 72 74 3c 30 20 7c 7c 20 72 65 67 45 6e  Start<0 || regEn
a750: 64 3c 30 20 29 7b 20 65 72 72 6f 72 21 20 7d 0a  d<0 ){ error! }.
a760: 2a 2a 20 20 20 20 20 52 65 77 69 6e 64 20 28 63  **     Rewind (c
a770: 73 72 2c 63 73 72 53 74 61 72 74 2c 63 73 72 45  sr,csrStart,csrE
a780: 6e 64 29 20 20 20 20 20 20 2f 2f 20 69 66 20 45  nd)      // if E
a790: 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68 5f 70 61  OF goto flush_pa
a7a0: 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20  rtition_done.** 
a7b0: 20 20 20 20 20 20 4e 65 78 74 28 63 73 72 45 6e        Next(csrEn
a7c0: 64 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d)              
a7d0: 20 20 20 20 20 20 2f 2f 20 69 66 20 45 4f 46 20        // if EOF 
a7e0: 73 6b 69 70 20 41 67 67 73 74 65 70 0a 2a 2a 20  skip Aggstep.** 
a7f0: 20 20 20 20 20 20 41 67 67 73 74 65 70 20 28 63        Aggstep (c
a800: 73 72 45 6e 64 29 0a 2a 2a 20 20 20 20 20 20 20  srEnd).**       
a810: 69 66 28 20 28 72 65 67 45 6e 64 2d 2d 29 3c 3d  if( (regEnd--)<=
a820: 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  0 ){.**         
a830: 41 67 67 46 69 6e 61 6c 20 28 78 56 61 6c 75 65  AggFinal (xValue
a840: 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 47 6f 73  ).**         Gos
a850: 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20  ub addrGosub.** 
a860: 20 20 20 20 20 20 20 20 4e 65 78 74 28 63 73 72          Next(csr
a870: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
a880: 20 2f 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f 20   // if EOF goto 
a890: 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f  flush_partition_
a8a0: 64 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  done.**         
a8b0: 69 66 28 20 28 72 65 67 53 74 61 72 74 2d 2d 29  if( (regStart--)
a8c0: 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  <=0 ){.**       
a8d0: 20 20 20 20 41 67 67 53 74 65 70 20 28 63 73 72      AggStep (csr
a8e0: 53 74 61 72 74 2c 20 78 49 6e 76 65 72 73 65 29  Start, xInverse)
a8f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 4e 65  .**           Ne
a900: 78 74 28 63 73 72 53 74 61 72 74 29 0a 2a 2a 20  xt(csrStart).** 
a910: 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20          }.**    
a920: 20 20 20 7d 0a 2a 2a 20 20 20 66 6c 75 73 68 5f     }.**   flush_
a930: 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 3a 0a  partition_done:.
a940: 2a 2a 20 20 20 20 20 52 65 73 65 74 53 6f 72 74  **     ResetSort
a950: 65 72 20 28 63 73 72 29 0a 2a 2a 20 20 20 20 20  er (csr).**     
a960: 52 65 74 75 72 6e 0a 2a 2a 0a 2a 2a 20 52 4f 57  Return.**.** ROW
a970: 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 3e  S BETWEEN <expr>
a980: 20 50 52 45 43 45 44 49 4e 47 20 20 20 20 41 4e   PRECEDING    AN
a990: 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a  D CURRENT ROW.**
a9a0: 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20 43 55   ROWS BETWEEN CU
a9b0: 52 52 45 4e 54 20 52 4f 57 20 20 20 20 20 20 20  RRENT ROW       
a9c0: 20 20 41 4e 44 20 3c 65 78 70 72 3e 20 46 4f 4c    AND <expr> FOL
a9d0: 4c 4f 57 49 4e 47 0a 2a 2a 20 52 4f 57 53 20 42  LOWING.** ROWS B
a9e0: 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44  ETWEEN UNBOUNDED
a9f0: 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 3c   PRECEDING AND <
aa00: 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a  expr> FOLLOWING.
aa10: 2a 2a 0a 2a 2a 20 20 20 54 68 65 73 65 20 61 72  **.**   These ar
aa20: 65 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65  e similar to the
aa30: 20 61 62 6f 76 65 2e 20 46 6f 72 20 22 43 55 52   above. For "CUR
aa40: 52 45 4e 54 20 52 4f 57 22 2c 20 69 6e 74 69 61  RENT ROW", intia
aa50: 6c 69 7a 65 20 74 68 65 0a 2a 2a 20 20 20 72 65  lize the.**   re
aa60: 67 69 73 74 65 72 20 74 6f 20 30 2e 20 46 6f 72  gister to 0. For
aa70: 20 22 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43   "UNBOUNDED PREC
aa80: 45 44 49 4e 47 22 20 74 6f 20 69 6e 66 69 6e 69  EDING" to infini
aa90: 74 79 2e 0a 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42  ty..**.** ROWS B
aaa0: 45 54 57 45 45 4e 20 3c 65 78 70 72 3e 20 50 52  ETWEEN <expr> PR
aab0: 45 43 45 44 49 4e 47 20 20 20 20 41 4e 44 20 55  ECEDING    AND U
aac0: 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49  NBOUNDED FOLLOWI
aad0: 4e 47 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57 45  NG.** ROWS BETWE
aae0: 45 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20 20  EN CURRENT ROW  
aaf0: 20 20 20 20 20 20 20 41 4e 44 20 55 4e 42 4f 55         AND UNBOU
ab00: 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a  NDED FOLLOWING.*
ab10: 2a 0a 2a 2a 20 20 20 20 20 52 65 77 69 6e 64 20  *.**     Rewind 
ab20: 28 63 73 72 2c 63 73 72 53 74 61 72 74 2c 63 73  (csr,csrStart,cs
ab30: 72 45 6e 64 29 20 20 20 20 2f 2f 20 69 66 20 45  rEnd)    // if E
ab40: 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68 5f 70 61  OF goto flush_pa
ab50: 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20  rtition_done.** 
ab60: 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a      while( 1 ){.
ab70: 2a 2a 20 20 20 20 20 20 20 4e 65 78 74 28 63 73  **       Next(cs
ab80: 72 45 6e 64 29 20 20 20 20 20 20 20 20 20 20 20  rEnd)           
ab90: 20 20 20 20 20 20 20 2f 2f 20 45 78 69 74 20 77         // Exit w
aba0: 68 69 6c 65 28 31 29 20 61 74 20 45 4f 46 0a 2a  hile(1) at EOF.*
abb0: 2a 20 20 20 20 20 20 20 41 67 67 73 74 65 70 20  *       Aggstep 
abc0: 28 63 73 72 45 6e 64 29 0a 2a 2a 20 20 20 20 20  (csrEnd).**     
abd0: 7d 0a 2a 2a 20 20 20 20 20 77 68 69 6c 65 28 20  }.**     while( 
abe0: 31 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67  1 ){.**       Ag
abf0: 67 46 69 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a  gFinal (xValue).
ac00: 2a 2a 20 20 20 20 20 20 20 47 6f 73 75 62 20 61  **       Gosub a
ac10: 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20  ddrGosub.**     
ac20: 20 20 4e 65 78 74 28 63 73 72 29 20 20 20 20 20    Next(csr)     
ac30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac40: 2f 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f 20 66  // if EOF goto f
ac50: 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64  lush_partition_d
ac60: 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 69 66 28  one.**       if(
ac70: 20 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30   (regStart--)<=0
ac80: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41   ){.**         A
ac90: 67 67 53 74 65 70 20 28 63 73 72 53 74 61 72 74  ggStep (csrStart
aca0: 2c 20 78 49 6e 76 65 72 73 65 29 0a 2a 2a 20 20  , xInverse).**  
acb0: 20 20 20 20 20 20 20 4e 65 78 74 28 63 73 72 53         Next(csrS
acc0: 74 61 72 74 29 0a 2a 2a 20 20 20 20 20 20 20 7d  tart).**       }
acd0: 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20  .**     }.**.** 
ace0: 20 20 46 6f 72 20 74 68 65 20 22 43 55 52 52 45    For the "CURRE
acf0: 4e 54 20 52 4f 57 20 41 4e 44 20 55 4e 42 4f 55  NT ROW AND UNBOU
ad00: 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 22 20  NDED FOLLOWING" 
ad10: 63 61 73 65 2c 20 74 68 65 20 66 69 6e 61 6c 20  case, the final 
ad20: 69 66 28 29 20 0a 2a 2a 20 20 20 63 6f 6e 64 69  if() .**   condi
ad30: 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 74  tion is always t
ad40: 72 75 65 20 28 61 73 20 69 66 20 72 65 67 53 74  rue (as if regSt
ad50: 61 72 74 20 77 65 72 65 20 69 6e 69 74 69 61 6c  art were initial
ad60: 69 7a 65 64 20 74 6f 20 30 29 2e 0a 2a 2a 0a 2a  ized to 0)..**.*
ad70: 2a 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20  * RANGE BETWEEN 
ad80: 43 55 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20  CURRENT ROW AND 
ad90: 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57  UNBOUNDED FOLLOW
ada0: 49 4e 47 0a 2a 2a 20 0a 2a 2a 20 20 20 54 68 69  ING.** .**   Thi
adb0: 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 52 41  s is the only RA
adc0: 4e 47 45 20 63 61 73 65 20 68 61 6e 64 6c 65 64  NGE case handled
add0: 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
ade0: 2e 20 49 74 20 6d 6f 64 69 66 69 65 73 20 74 68  . It modifies th
adf0: 65 0a 2a 2a 20 20 20 73 65 63 6f 6e 64 20 77 68  e.**   second wh
ae00: 69 6c 65 28 20 31 20 29 20 6c 6f 6f 70 20 69 6e  ile( 1 ) loop in
ae10: 20 22 52 4f 57 53 20 42 45 54 57 45 45 4e 20 43   "ROWS BETWEEN C
ae20: 55 52 52 45 4e 54 20 2e 2e 2e 20 55 4e 42 4f 55  URRENT ... UNBOU
ae30: 4e 44 45 44 2e 2e 2e 22 20 74 6f 0a 2a 2a 20 20  NDED..." to.**  
ae40: 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 77   be:.**.**     w
ae50: 68 69 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20  hile( 1 ){.**   
ae60: 20 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78 56      AggFinal (xV
ae70: 61 6c 75 65 29 0a 2a 2a 20 20 20 20 20 20 20 77  alue).**       w
ae80: 68 69 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20  hile( 1 ){.**   
ae90: 20 20 20 20 20 20 72 65 67 50 65 65 72 2b 2b 0a        regPeer++.
aea0: 2a 2a 20 20 20 20 20 20 20 20 20 47 6f 73 75 62  **         Gosub
aeb0: 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20   addrGosub.**   
aec0: 20 20 20 20 20 20 4e 65 78 74 28 63 73 72 29 20        Next(csr) 
aed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aee0: 20 20 20 20 2f 2f 20 69 66 20 45 4f 46 20 67 6f      // if EOF go
aef0: 74 6f 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69  to flush_partiti
af00: 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20 20  on_done.**      
af10: 20 20 20 69 66 28 20 6e 65 77 20 70 65 65 72 20     if( new peer 
af20: 29 20 62 72 65 61 6b 3b 0a 2a 2a 20 20 20 20 20  ) break;.**     
af30: 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 77 68 69    }.**       whi
af40: 6c 65 28 20 28 72 65 67 50 65 65 72 2d 2d 29 3e  le( (regPeer--)>
af50: 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  0 ){.**         
af60: 41 67 67 53 74 65 70 20 28 63 73 72 53 74 61 72  AggStep (csrStar
af70: 74 2c 20 78 49 6e 76 65 72 73 65 29 0a 2a 2a 20  t, xInverse).** 
af80: 20 20 20 20 20 20 20 20 4e 65 78 74 28 63 73 72          Next(csr
af90: 53 74 61 72 74 29 0a 2a 2a 20 20 20 20 20 20 20  Start).**       
afa0: 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a  }.**     }.**.**
afb0: 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20 3c 65   ROWS BETWEEN <e
afc0: 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 20  xpr> FOLLOWING  
afd0: 20 20 41 4e 44 20 3c 65 78 70 72 3e 20 46 4f 4c    AND <expr> FOL
afe0: 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 72  LOWING.**.**   r
aff0: 65 67 45 6e 64 20 3d 20 72 65 67 45 6e 64 20 2d  egEnd = regEnd -
b000: 20 72 65 67 53 74 61 72 74 0a 2a 2a 20 20 20 52   regStart.**   R
b010: 65 77 69 6e 64 20 28 63 73 72 2c 63 73 72 53 74  ewind (csr,csrSt
b020: 61 72 74 2c 63 73 72 45 6e 64 29 20 20 20 2f 2f  art,csrEnd)   //
b030: 20 69 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c 75   if EOF goto flu
b040: 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e  sh_partition_don
b050: 65 0a 2a 2a 20 20 20 20 20 41 67 67 73 74 65 70  e.**     Aggstep
b060: 20 28 63 73 72 45 6e 64 29 0a 2a 2a 20 20 20 20   (csrEnd).**    
b070: 20 4e 65 78 74 28 63 73 72 45 6e 64 29 20 20 20   Next(csrEnd)   
b080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
b090: 20 69 66 20 45 4f 46 20 66 61 6c 6c 2d 74 68 72   if EOF fall-thr
b0a0: 6f 75 67 68 0a 2a 2a 20 20 20 20 20 69 66 28 20  ough.**     if( 
b0b0: 28 72 65 67 45 6e 64 2d 2d 29 3c 3d 30 20 29 7b  (regEnd--)<=0 ){
b0c0: 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 28 72  .**       if( (r
b0d0: 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20 29 7b  egStart--)<=0 ){
b0e0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 67 67 46  .**         AggF
b0f0: 69 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a  inal (xValue).**
b100: 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20 61           Gosub a
b110: 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20  ddrGosub.**     
b120: 20 20 20 20 4e 65 78 74 28 63 73 72 29 20 20 20      Next(csr)   
b130: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 69 66             // if
b140: 20 45 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68 5f   EOF goto flush_
b150: 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a  partition_done.*
b160: 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  *       }.**    
b170: 20 20 20 41 67 67 53 74 65 70 20 28 63 73 72 53     AggStep (csrS
b180: 74 61 72 74 2c 20 78 49 6e 76 65 72 73 65 29 0a  tart, xInverse).
b190: 2a 2a 20 20 20 20 20 20 20 4e 65 78 74 20 28 63  **       Next (c
b1a0: 73 72 53 74 61 72 74 29 0a 2a 2a 20 20 20 20 20  srStart).**     
b1b0: 7d 0a 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42 45 54  }.**.** ROWS BET
b1c0: 57 45 45 4e 20 3c 65 78 70 72 3e 20 50 52 45 43  WEEN <expr> PREC
b1d0: 45 44 49 4e 47 20 20 20 20 41 4e 44 20 3c 65 78  EDING    AND <ex
b1e0: 70 72 3e 20 50 52 45 43 45 44 49 4e 47 0a 2a 2a  pr> PRECEDING.**
b1f0: 0a 2a 2a 20 20 20 52 65 70 6c 61 63 65 20 74 68  .**   Replace th
b200: 65 20 62 69 74 20 61 66 74 65 72 20 22 52 65 77  e bit after "Rew
b210: 69 6e 64 22 20 69 6e 20 74 68 65 20 61 62 6f 76  ind" in the abov
b220: 65 20 77 69 74 68 3a 0a 2a 2a 0a 2a 2a 20 20 20  e with:.**.**   
b230: 20 20 69 66 28 20 28 72 65 67 45 6e 64 2d 2d 29    if( (regEnd--)
b240: 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  <=0 ){.**       
b250: 41 67 67 53 74 65 70 20 28 63 73 72 45 6e 64 29  AggStep (csrEnd)
b260: 0a 2a 2a 20 20 20 20 20 20 20 4e 65 78 74 20 28  .**       Next (
b270: 63 73 72 45 6e 64 29 0a 2a 2a 20 20 20 20 20 7d  csrEnd).**     }
b280: 0a 2a 2a 20 20 20 20 20 41 67 67 46 69 6e 61 6c  .**     AggFinal
b290: 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20 20 20   (xValue).**    
b2a0: 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62   Gosub addrGosub
b2b0: 0a 2a 2a 20 20 20 20 20 4e 65 78 74 28 63 73 72  .**     Next(csr
b2c0: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
b2d0: 20 20 20 2f 2f 20 69 66 20 45 4f 46 20 67 6f 74     // if EOF got
b2e0: 6f 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f  o flush_partitio
b2f0: 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20 69 66  n_done.**     if
b300: 28 20 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d  ( (regStart--)<=
b310: 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67  0 ){.**       Ag
b320: 67 53 74 65 70 20 28 63 73 72 32 2c 20 78 49 6e  gStep (csr2, xIn
b330: 76 65 72 73 65 29 0a 2a 2a 20 20 20 20 20 20 20  verse).**       
b340: 4e 65 78 74 20 28 63 73 72 32 29 0a 2a 2a 20 20  Next (csr2).**  
b350: 20 20 20 7d 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69     }.**.*/.stati
b360: 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 43 6f 64  c void windowCod
b370: 65 52 6f 77 45 78 70 72 53 74 65 70 28 0a 20 20  eRowExprStep(.  
b380: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a  Parse *pParse, .
b390: 20 20 53 65 6c 65 63 74 20 2a 70 2c 0a 20 20 57    Select *p,.  W
b3a0: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
b3b0: 2c 0a 20 20 69 6e 74 20 72 65 67 47 6f 73 75 62  ,.  int regGosub
b3c0: 2c 20 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 73  , .  int addrGos
b3d0: 75 62 0a 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a  ub.){.  Window *
b3e0: 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b  pMWin = p->pWin;
b3f0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
b400: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
b410: 73 65 29 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70  se);.  Window *p
b420: 57 69 6e 3b 0a 20 20 69 6e 74 20 6b 3b 0a 20 20  Win;.  int k;.  
b430: 69 6e 74 20 6e 53 75 62 20 3d 20 70 2d 3e 70 53  int nSub = p->pS
b440: 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 2d 3e 6e  rc->a[0].pTab->n
b450: 43 6f 6c 3b 0a 20 20 69 6e 74 20 72 65 67 46 6c  Col;.  int regFl
b460: 75 73 68 50 61 72 74 3b 20 20 20 20 20 20 20 20  ushPart;        
b470: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
b480: 65 72 20 66 6f 72 20 22 47 6f 73 75 62 20 66 6c  er for "Gosub fl
b490: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 20 2a  ush_partition" *
b4a0: 2f 0a 20 20 69 6e 74 20 6c 62 6c 46 6c 75 73 68  /.  int lblFlush
b4b0: 50 61 72 74 3b 20 20 20 20 20 20 20 20 20 20 20  Part;           
b4c0: 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72      /* Label for
b4d0: 20 22 47 6f 73 75 62 20 66 6c 75 73 68 5f 70 61   "Gosub flush_pa
b4e0: 72 74 69 74 69 6f 6e 22 20 2a 2f 0a 20 20 69 6e  rtition" */.  in
b4f0: 74 20 6c 62 6c 46 6c 75 73 68 44 6f 6e 65 3b 20  t lblFlushDone; 
b500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b510: 20 4c 61 62 65 6c 20 66 6f 72 20 22 47 6f 73 75   Label for "Gosu
b520: 62 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f  b flush_partitio
b530: 6e 5f 64 6f 6e 65 22 20 2a 2f 0a 0a 20 20 69 6e  n_done" */..  in
b540: 74 20 72 65 67 41 72 67 3b 0a 20 20 69 6e 74 20  t regArg;.  int 
b550: 6e 41 72 67 3b 0a 20 20 69 6e 74 20 61 64 64 72  nArg;.  int addr
b560: 3b 0a 20 20 69 6e 74 20 63 73 72 53 74 61 72 74  ;.  int csrStart
b570: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
b580: 2b 3b 0a 20 20 69 6e 74 20 63 73 72 45 6e 64 20  +;.  int csrEnd 
b590: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
b5a0: 3b 0a 20 20 69 6e 74 20 72 65 67 53 74 61 72 74  ;.  int regStart
b5b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b5c0: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
b5d0: 20 3c 65 78 70 72 3e 20 50 52 45 43 45 44 49 4e   <expr> PRECEDIN
b5e0: 47 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45 6e  G */.  int regEn
b5f0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
b600: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
b610: 20 6f 66 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f   of <expr> FOLLO
b620: 57 49 4e 47 20 2a 2f 0a 20 20 69 6e 74 20 61 64  WING */.  int ad
b630: 64 72 4e 65 78 74 3b 0a 20 20 69 6e 74 20 61 64  drNext;.  int ad
b640: 64 72 47 6f 74 6f 3b 0a 20 20 69 6e 74 20 61 64  drGoto;.  int ad
b650: 64 72 54 6f 70 3b 0a 20 20 69 6e 74 20 61 64 64  drTop;.  int add
b660: 72 49 66 50 6f 73 31 3b 0a 20 20 69 6e 74 20 61  rIfPos1;.  int a
b670: 64 64 72 49 66 50 6f 73 32 3b 0a 0a 20 20 69 6e  ddrIfPos2;..  in
b680: 74 20 72 65 67 50 65 65 72 20 3d 20 30 3b 20 20  t regPeer = 0;  
b690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b6a0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 65 65 72  * Number of peer
b6b0: 73 20 69 6e 20 63 75 72 72 65 6e 74 20 67 72 6f  s in current gro
b6c0: 75 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50  up */.  int regP
b6d0: 65 65 72 56 61 6c 20 3d 20 30 3b 20 20 20 20 20  eerVal = 0;     
b6e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
b6f0: 79 20 6f 66 20 76 61 6c 75 65 73 20 69 64 65 6e  y of values iden
b700: 74 69 66 79 69 6e 67 20 70 65 65 72 20 67 72 6f  tifying peer gro
b710: 75 70 20 2a 2f 0a 20 20 69 6e 74 20 69 50 65 65  up */.  int iPee
b720: 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
b730: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
b740: 6d 6e 20 6f 66 66 73 65 74 20 69 6e 20 65 70 68  mn offset in eph
b750: 2d 74 61 62 6c 65 20 6f 66 20 70 65 65 72 20 76  -table of peer v
b760: 61 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 65  als */.  int nPe
b770: 65 72 56 61 6c 3b 20 20 20 20 20 20 20 20 20 20  erVal;          
b780: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
b790: 62 65 72 20 6f 66 20 70 65 65 72 20 76 61 6c 75  ber of peer valu
b7a0: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 53  es */.  int regS
b7b0: 69 7a 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  ize = 0;..  asse
b7c0: 72 74 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72  rt( pMWin->eStar
b7d0: 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20  t==TK_PRECEDING 
b7e0: 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e  .       || pMWin
b7f0: 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52  ->eStart==TK_CUR
b800: 52 45 4e 54 20 0a 20 20 20 20 20 20 20 7c 7c 20  RENT .       || 
b810: 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
b820: 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 0a 20 20 20  K_FOLLOWING .   
b830: 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53      || pMWin->eS
b840: 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44  tart==TK_UNBOUND
b850: 45 44 20 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  ED .  );.  asser
b860: 74 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  t( pMWin->eEnd==
b870: 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 0a 20 20  TK_FOLLOWING .  
b880: 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65       || pMWin->e
b890: 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20  End==TK_CURRENT 
b8a0: 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e  .       || pMWin
b8b0: 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55  ->eEnd==TK_UNBOU
b8c0: 4e 44 45 44 20 0a 20 20 20 20 20 20 20 7c 7c 20  NDED .       || 
b8d0: 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f  pMWin->eEnd==TK_
b8e0: 50 52 45 43 45 44 49 4e 47 20 0a 20 20 29 3b 0a  PRECEDING .  );.
b8f0: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 72  .  /* Allocate r
b900: 65 67 69 73 74 65 72 20 61 6e 64 20 6c 61 62 65  egister and labe
b910: 6c 20 66 6f 72 20 74 68 65 20 22 66 6c 75 73 68  l for the "flush
b920: 5f 70 61 72 74 69 74 69 6f 6e 22 20 73 75 62 2d  _partition" sub-
b930: 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 72 65  routine. */.  re
b940: 67 46 6c 75 73 68 50 61 72 74 20 3d 20 2b 2b 70  gFlushPart = ++p
b950: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6c  Parse->nMem;.  l
b960: 62 6c 46 6c 75 73 68 50 61 72 74 20 3d 20 73 71  blFlushPart = sq
b970: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
b980: 65 6c 28 76 29 3b 0a 20 20 6c 62 6c 46 6c 75 73  el(v);.  lblFlus
b990: 68 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56  hDone = sqlite3V
b9a0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
b9b0: 0a 0a 20 20 72 65 67 53 74 61 72 74 20 3d 20 2b  ..  regStart = +
b9c0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
b9d0: 20 72 65 67 45 6e 64 20 3d 20 2b 2b 70 50 61 72   regEnd = ++pPar
b9e0: 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 77 69 6e  se->nMem;..  win
b9f0: 64 6f 77 50 61 72 74 69 74 69 6f 6e 43 61 63 68  dowPartitionCach
ba00: 65 28 70 50 61 72 73 65 2c 20 70 2c 20 70 57 49  e(pParse, p, pWI
ba10: 6e 66 6f 2c 20 72 65 67 46 6c 75 73 68 50 61 72  nfo, regFlushPar
ba20: 74 2c 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 2c  t, lblFlushPart,
ba30: 20 26 72 65 67 53 69 7a 65 29 3b 0a 0a 20 20 61   &regSize);..  a
ba40: 64 64 72 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65  ddrGoto = sqlite
ba50: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
ba60: 50 5f 47 6f 74 6f 29 3b 0a 0a 20 20 2f 2a 20 53  P_Goto);..  /* S
ba70: 74 61 72 74 20 6f 66 20 22 66 6c 75 73 68 5f 70  tart of "flush_p
ba80: 61 72 74 69 74 69 6f 6e 22 20 2a 2f 0a 20 20 73  artition" */.  s
ba90: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
baa0: 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 46 6c 75  eLabel(v, lblFlu
bab0: 73 68 50 61 72 74 29 3b 0a 20 20 73 71 6c 69 74  shPart);.  sqlit
bac0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
bad0: 4f 50 5f 4f 6e 63 65 2c 20 30 2c 20 73 71 6c 69  OP_Once, 0, sqli
bae0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
baf0: 64 72 28 76 29 2b 33 29 3b 0a 20 20 73 71 6c 69  dr(v)+3);.  sqli
bb00: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
bb10: 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 63 73 72   OP_OpenDup, csr
bb20: 53 74 61 72 74 2c 20 70 4d 57 69 6e 2d 3e 69 45  Start, pMWin->iE
bb30: 70 68 43 73 72 29 3b 0a 20 20 73 71 6c 69 74 65  phCsr);.  sqlite
bb40: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
bb50: 50 5f 4f 70 65 6e 44 75 70 2c 20 63 73 72 45 6e  P_OpenDup, csrEn
bb60: 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  d, pMWin->iEphCs
bb70: 72 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 65 69 74  r);..  /* If eit
bb80: 68 65 72 20 72 65 67 53 74 61 72 74 20 6f 72 20  her regStart or 
bb90: 72 65 67 45 6e 64 20 61 72 65 20 6e 6f 74 20 6e  regEnd are not n
bba0: 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65  on-negative inte
bbb0: 67 65 72 73 2c 20 74 68 72 6f 77 20 0a 20 20 2a  gers, throw .  *
bbc0: 2a 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 2e 20  * an exception. 
bbd0: 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d   */.  if( pMWin-
bbe0: 3e 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 73  >pStart ){.    s
bbf0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
bc00: 50 61 72 73 65 2c 20 70 4d 57 69 6e 2d 3e 70 53  Parse, pMWin->pS
bc10: 74 61 72 74 2c 20 72 65 67 53 74 61 72 74 29 3b  tart, regStart);
bc20: 0a 20 20 20 20 77 69 6e 64 6f 77 43 68 65 63 6b  .    windowCheck
bc30: 46 72 61 6d 65 56 61 6c 75 65 28 70 50 61 72 73  FrameValue(pPars
bc40: 65 2c 20 72 65 67 53 74 61 72 74 2c 20 30 29 3b  e, regStart, 0);
bc50: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d 57 69 6e  .  }.  if( pMWin
bc60: 2d 3e 70 45 6e 64 20 29 7b 0a 20 20 20 20 73 71  ->pEnd ){.    sq
bc70: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
bc80: 61 72 73 65 2c 20 70 4d 57 69 6e 2d 3e 70 45 6e  arse, pMWin->pEn
bc90: 64 2c 20 72 65 67 45 6e 64 29 3b 0a 20 20 20 20  d, regEnd);.    
bca0: 77 69 6e 64 6f 77 43 68 65 63 6b 46 72 61 6d 65  windowCheckFrame
bcb0: 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 72 65  Value(pParse, re
bcc0: 67 45 6e 64 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20  gEnd, 1);.  }.. 
bcd0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 22   /* If this is "
bce0: 52 4f 57 53 20 3c 65 78 70 72 31 3e 20 46 4f 4c  ROWS <expr1> FOL
bcf0: 4c 4f 57 49 4e 47 20 41 4e 44 20 52 4f 57 53 20  LOWING AND ROWS 
bd00: 3c 65 78 70 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e  <expr2> FOLLOWIN
bd10: 47 22 2c 20 64 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  G", do:.  **.  *
bd20: 2a 20 20 20 69 66 28 20 72 65 67 45 6e 64 3c 72  *   if( regEnd<r
bd30: 65 67 53 74 61 72 74 20 29 7b 0a 20 20 2a 2a 20  egStart ){.  ** 
bd40: 20 20 20 20 2f 2f 20 54 68 65 20 66 72 61 6d 65      // The frame
bd50: 20 61 6c 77 61 79 73 20 63 6f 6e 73 69 73 74 73   always consists
bd60: 20 6f 66 20 30 20 72 6f 77 73 0a 20 20 2a 2a 20   of 0 rows.  ** 
bd70: 20 20 20 20 72 65 67 53 74 61 72 74 20 3d 20 72      regStart = r
bd80: 65 67 53 69 7a 65 3b 0a 20 20 2a 2a 20 20 20 7d  egSize;.  **   }
bd90: 0a 20 20 2a 2a 20 20 20 72 65 67 45 6e 64 20 3d  .  **   regEnd =
bda0: 20 72 65 67 45 6e 64 20 2d 20 72 65 67 53 74 61   regEnd - regSta
bdb0: 72 74 3b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  rt;.  */.  if( p
bdc0: 4d 57 69 6e 2d 3e 70 45 6e 64 20 26 26 20 70 4d  MWin->pEnd && pM
bdd0: 57 69 6e 2d 3e 70 53 74 61 72 74 20 26 26 20 70  Win->pStart && p
bde0: 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
bdf0: 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20  _FOLLOWING ){.  
be00: 20 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d    assert( pMWin-
be10: 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57  >eEnd==TK_FOLLOW
be20: 49 4e 47 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ING );.    sqlit
be30: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
be40: 4f 50 5f 47 65 2c 20 72 65 67 53 74 61 72 74 2c  OP_Ge, regStart,
be50: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
be60: 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 72 65  entAddr(v)+2, re
be70: 67 45 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  gEnd);.    sqlit
be80: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
be90: 4f 50 5f 43 6f 70 79 2c 20 72 65 67 53 69 7a 65  OP_Copy, regSize
bea0: 2c 20 72 65 67 53 74 61 72 74 29 3b 0a 20 20 20  , regStart);.   
beb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bec0: 70 33 28 76 2c 20 4f 50 5f 53 75 62 74 72 61 63  p3(v, OP_Subtrac
bed0: 74 2c 20 72 65 67 53 74 61 72 74 2c 20 72 65 67  t, regStart, reg
bee0: 45 6e 64 2c 20 72 65 67 45 6e 64 29 3b 0a 20 20  End, regEnd);.  
bef0: 7d 0a 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  }..  if( pMWin->
bf00: 70 45 6e 64 20 26 26 20 70 4d 57 69 6e 2d 3e 70  pEnd && pMWin->p
bf10: 53 74 61 72 74 20 26 26 20 70 4d 57 69 6e 2d 3e  Start && pMWin->
bf20: 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49  eEnd==TK_PRECEDI
bf30: 4e 47 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  NG ){.    assert
bf40: 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d  ( pMWin->eStart=
bf50: 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 29 3b  =TK_PRECEDING );
bf60: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
bf70: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4c 65 2c  AddOp3(v, OP_Le,
bf80: 20 72 65 67 53 74 61 72 74 2c 20 73 71 6c 69 74   regStart, sqlit
bf90: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
bfa0: 72 28 76 29 2b 33 2c 20 72 65 67 45 6e 64 29 3b  r(v)+3, regEnd);
bfb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
bfc0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70  AddOp2(v, OP_Cop
bfd0: 79 2c 20 72 65 67 53 69 7a 65 2c 20 72 65 67 53  y, regSize, regS
bfe0: 74 61 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  tart);.    sqlit
bff0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
c000: 4f 50 5f 43 6f 70 79 2c 20 72 65 67 53 69 7a 65  OP_Copy, regSize
c010: 2c 20 72 65 67 45 6e 64 29 3b 0a 20 20 7d 0a 0a  , regEnd);.  }..
c020: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
c030: 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
c040: 72 65 67 69 73 74 65 72 20 66 6f 72 20 65 61 63  register for eac
c050: 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  h window functio
c060: 6e 20 74 6f 20 4e 55 4c 4c 20 2a 2f 0a 20 20 72  n to NULL */.  r
c070: 65 67 41 72 67 20 3d 20 77 69 6e 64 6f 77 49 6e  egArg = windowIn
c080: 69 74 41 63 63 75 6d 28 70 50 61 72 73 65 2c 20  itAccum(pParse, 
c090: 70 4d 57 69 6e 29 3b 0a 0a 20 20 73 71 6c 69 74  pMWin);..  sqlit
c0a0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
c0b0: 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4d 57 69 6e  OP_Rewind, pMWin
c0c0: 2d 3e 69 45 70 68 43 73 72 2c 20 6c 62 6c 46 6c  ->iEphCsr, lblFl
c0d0: 75 73 68 44 6f 6e 65 29 3b 0a 20 20 73 71 6c 69  ushDone);.  sqli
c0e0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
c0f0: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 63 73 72 53   OP_Rewind, csrS
c100: 74 61 72 74 2c 20 6c 62 6c 46 6c 75 73 68 44 6f  tart, lblFlushDo
c110: 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ne);.  sqlite3Vd
c120: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29  beChangeP5(v, 1)
c130: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
c140: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
c150: 6e 64 2c 20 63 73 72 45 6e 64 2c 20 6c 62 6c 46  nd, csrEnd, lblF
c160: 6c 75 73 68 44 6f 6e 65 29 3b 0a 20 20 73 71 6c  lushDone);.  sql
c170: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
c180: 28 76 2c 20 31 29 3b 0a 0a 20 20 2f 2a 20 49 6e  (v, 1);..  /* In
c190: 76 6f 6b 65 20 41 67 67 53 74 65 70 20 66 75 6e  voke AggStep fun
c1a0: 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 77  ction for each w
c1b0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 75  indow function u
c1c0: 73 69 6e 67 20 74 68 65 20 72 6f 77 20 74 68 61  sing the row tha
c1d0: 74 0a 20 20 2a 2a 20 63 73 72 45 6e 64 20 63 75  t.  ** csrEnd cu
c1e0: 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
c1f0: 6f 2e 20 4f 72 2c 20 69 66 20 63 73 72 45 6e 64  o. Or, if csrEnd
c200: 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 45   is already at E
c210: 4f 46 2c 0a 20 20 2a 2a 20 64 6f 20 6e 6f 74 68  OF,.  ** do noth
c220: 69 6e 67 2e 20 20 2a 2f 0a 20 20 61 64 64 72 54  ing.  */.  addrT
c230: 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
c240: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
c250: 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e    if( pMWin->eEn
c260: 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20  d==TK_PRECEDING 
c270: 29 7b 0a 20 20 20 20 61 64 64 72 49 66 50 6f 73  ){.    addrIfPos
c280: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
c290: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp3(v, OP_IfPo
c2a0: 73 2c 20 72 65 67 45 6e 64 2c 20 30 20 2c 20 31  s, regEnd, 0 , 1
c2b0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
c2c0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
c2d0: 5f 4e 65 78 74 2c 20 63 73 72 45 6e 64 2c 20 73  _Next, csrEnd, s
c2e0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
c2f0: 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 61  tAddr(v)+2);.  a
c300: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
c310: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f  eAddOp0(v, OP_Go
c320: 74 6f 29 3b 0a 20 20 77 69 6e 64 6f 77 41 67 67  to);.  windowAgg
c330: 53 74 65 70 28 70 50 61 72 73 65 2c 20 70 4d 57  Step(pParse, pMW
c340: 69 6e 2c 20 63 73 72 45 6e 64 2c 20 30 2c 20 72  in, csrEnd, 0, r
c350: 65 67 41 72 67 2c 20 72 65 67 53 69 7a 65 29 3b  egArg, regSize);
c360: 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45  .  if( pMWin->eE
c370: 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  nd==TK_UNBOUNDED
c380: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
c390: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
c3a0: 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 54 6f 70  Goto, 0, addrTop
c3b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
c3c0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
c3d0: 64 72 29 3b 0a 20 20 20 20 61 64 64 72 54 6f 70  dr);.    addrTop
c3e0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
c3f0: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
c400: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
c410: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
c420: 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 69 66 28  , addr);.    if(
c430: 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b   pMWin->eEnd==TK
c440: 5f 50 52 45 43 45 44 49 4e 47 20 29 7b 0a 20 20  _PRECEDING ){.  
c450: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
c460: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49  umpHere(v, addrI
c470: 66 50 6f 73 31 29 3b 0a 20 20 20 20 7d 0a 20 20  fPos1);.    }.  
c480: 7d 0a 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  }..  if( pMWin->
c490: 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49  eEnd==TK_FOLLOWI
c4a0: 4e 47 20 29 7b 0a 20 20 20 20 61 64 64 72 49 66  NG ){.    addrIf
c4b0: 50 6f 73 31 20 3d 20 73 71 6c 69 74 65 33 56 64  Pos1 = sqlite3Vd
c4c0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
c4d0: 66 50 6f 73 2c 20 72 65 67 45 6e 64 2c 20 30 20  fPos, regEnd, 0 
c4e0: 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 1);.  }.  if( 
c4f0: 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
c500: 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20  K_FOLLOWING ){. 
c510: 20 20 20 61 64 64 72 49 66 50 6f 73 32 20 3d 20     addrIfPos2 = 
c520: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c530: 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 72  3(v, OP_IfPos, r
c540: 65 67 53 74 61 72 74 2c 20 30 20 2c 20 31 29 3b  egStart, 0 , 1);
c550: 0a 20 20 7d 0a 20 20 77 69 6e 64 6f 77 41 67 67  .  }.  windowAgg
c560: 46 69 6e 61 6c 28 70 50 61 72 73 65 2c 20 70 4d  Final(pParse, pM
c570: 57 69 6e 2c 20 30 29 3b 0a 20 20 77 69 6e 64 6f  Win, 0);.  windo
c580: 77 52 65 74 75 72 6e 4f 6e 65 52 6f 77 28 70 50  wReturnOneRow(pP
c590: 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 72 65 67  arse, pMWin, reg
c5a0: 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62  Gosub, addrGosub
c5b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
c5c0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
c5d0: 74 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  t, pMWin->iEphCs
c5e0: 72 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  r, sqlite3VdbeCu
c5f0: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b  rrentAddr(v)+2);
c600: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
c610: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
c620: 20 30 2c 20 6c 62 6c 46 6c 75 73 68 44 6f 6e 65   0, lblFlushDone
c630: 29 3b 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  );.  if( pMWin->
c640: 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f  eStart==TK_FOLLO
c650: 57 49 4e 47 20 29 7b 0a 20 20 20 20 73 71 6c 69  WING ){.    sqli
c660: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
c670: 76 2c 20 61 64 64 72 49 66 50 6f 73 32 29 3b 0a  v, addrIfPos2);.
c680: 20 20 7d 0a 0a 20 20 69 66 28 20 70 4d 57 69 6e    }..  if( pMWin
c690: 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52  ->eStart==TK_CUR
c6a0: 52 45 4e 54 20 0a 20 20 20 7c 7c 20 70 4d 57 69  RENT .   || pMWi
c6b0: 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 50 52  n->eStart==TK_PR
c6c0: 45 43 45 44 49 4e 47 20 0a 20 20 20 7c 7c 20 70  ECEDING .   || p
c6d0: 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
c6e0: 5f 46 4f 4c 4c 4f 57 49 4e 47 20 0a 20 20 29 7b  _FOLLOWING .  ){
c6f0: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4a 75 6d  .    int addrJum
c700: 70 48 65 72 65 20 3d 20 30 3b 0a 20 20 20 20 69  pHere = 0;.    i
c710: 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  f( pMWin->eStart
c720: 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 29  ==TK_PRECEDING )
c730: 7b 0a 20 20 20 20 20 20 61 64 64 72 4a 75 6d 70  {.      addrJump
c740: 48 65 72 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Here = sqlite3Vd
c750: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
c760: 66 50 6f 73 2c 20 72 65 67 53 74 61 72 74 2c 20  fPos, regStart, 
c770: 30 20 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  0 , 1);.    }.  
c780: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c790: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
c7a0: 63 73 72 53 74 61 72 74 2c 20 73 71 6c 69 74 65  csrStart, sqlite
c7b0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
c7c0: 28 76 29 2b 31 29 3b 0a 20 20 20 20 77 69 6e 64  (v)+1);.    wind
c7d0: 6f 77 41 67 67 53 74 65 70 28 70 50 61 72 73 65  owAggStep(pParse
c7e0: 2c 20 70 4d 57 69 6e 2c 20 63 73 72 53 74 61 72  , pMWin, csrStar
c7f0: 74 2c 20 31 2c 20 72 65 67 41 72 67 2c 20 72 65  t, 1, regArg, re
c800: 67 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20  gSize);.    if( 
c810: 61 64 64 72 4a 75 6d 70 48 65 72 65 20 29 7b 0a  addrJumpHere ){.
c820: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c830: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
c840: 72 4a 75 6d 70 48 65 72 65 29 3b 0a 20 20 20 20  rJumpHere);.    
c850: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d 57 69  }.  }.  if( pMWi
c860: 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c  n->eEnd==TK_FOLL
c870: 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 73 71 6c  OWING ){.    sql
c880: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
c890: 28 76 2c 20 61 64 64 72 49 66 50 6f 73 31 29 3b  (v, addrIfPos1);
c8a0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
c8b0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
c8c0: 6f 74 6f 2c 20 30 2c 20 61 64 64 72 54 6f 70 29  oto, 0, addrTop)
c8d0: 3b 0a 0a 20 20 2f 2a 20 66 6c 75 73 68 5f 70 61  ;..  /* flush_pa
c8e0: 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 3a 20 2a 2f  rtition_done: */
c8f0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
c900: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62  solveLabel(v, lb
c910: 6c 46 6c 75 73 68 44 6f 6e 65 29 3b 0a 20 20 73  lFlushDone);.  s
c920: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
c930: 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74  (v, OP_ResetSort
c940: 65 72 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43  er, pMWin->iEphC
c950: 73 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  sr);.  sqlite3Vd
c960: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
c970: 65 74 75 72 6e 2c 20 72 65 67 46 6c 75 73 68 50  eturn, regFlushP
c980: 61 72 74 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  art);..  /* Jump
c990: 20 74 6f 20 68 65 72 65 20 74 6f 20 73 6b 69 70   to here to skip
c9a0: 20 6f 76 65 72 20 66 6c 75 73 68 5f 70 61 72 74   over flush_part
c9b0: 69 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  ition */.  sqlit
c9c0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
c9d0: 2c 20 61 64 64 72 47 6f 74 6f 29 3b 0a 7d 0a 0a  , addrGoto);.}..
c9e0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
c9f0: 69 6f 6e 20 64 6f 65 73 20 74 68 65 20 77 6f 72  ion does the wor
ca00: 6b 20 6f 66 20 73 71 6c 69 74 65 33 57 69 6e 64  k of sqlite3Wind
ca10: 6f 77 43 6f 64 65 53 74 65 70 28 29 20 66 6f 72  owCodeStep() for
ca20: 20 63 61 73 65 73 20 74 68 61 74 0a 2a 2a 20 77   cases that.** w
ca30: 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65  ould normally be
ca40: 20 68 61 6e 64 6c 65 64 20 62 79 20 77 69 6e 64   handled by wind
ca50: 6f 77 43 6f 64 65 44 65 66 61 75 6c 74 53 74 65  owCodeDefaultSte
ca60: 70 28 29 20 77 68 65 6e 20 74 68 65 72 65 20 61  p() when there a
ca70: 72 65 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f 72  re.** one or mor
ca80: 65 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  e built-in windo
ca90: 77 2d 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74  w-functions that
caa0: 20 72 65 71 75 69 72 65 20 74 68 65 20 65 6e 74   require the ent
cab0: 69 72 65 20 70 61 72 74 69 74 69 6f 6e 0a 2a 2a  ire partition.**
cac0: 20 74 6f 20 62 65 20 63 61 63 68 65 64 20 69 6e   to be cached in
cad0: 20 61 20 74 65 6d 70 20 74 61 62 6c 65 20 62 65   a temp table be
cae0: 66 6f 72 65 20 61 6e 79 20 72 6f 77 73 20 63 61  fore any rows ca
caf0: 6e 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 41  n be returned. A
cb00: 64 64 69 74 69 6f 6e 61 6c 6c 79 2e 0a 2a 2a 20  dditionally..** 
cb10: 22 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 43  "RANGE BETWEEN C
cb20: 55 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 55  URRENT ROW AND U
cb30: 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49  NBOUNDED FOLLOWI
cb40: 4e 47 22 20 69 73 20 61 6c 77 61 79 73 20 68 61  NG" is always ha
cb50: 6e 64 6c 65 64 20 62 79 0a 2a 2a 20 74 68 69 73  ndled by.** this
cb60: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
cb70: 20 50 73 65 75 64 6f 2d 63 6f 64 65 20 63 6f 72   Pseudo-code cor
cb80: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
cb90: 65 20 56 4d 20 63 6f 64 65 20 67 65 6e 65 72 61  e VM code genera
cba0: 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
cbb0: 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 65 61 63 68  tion.** for each
cbc0: 20 74 79 70 65 20 6f 66 20 77 69 6e 64 6f 77 20   type of window 
cbd0: 66 6f 6c 6c 6f 77 73 2e 0a 2a 2a 0a 2a 2a 20 52  follows..**.** R
cbe0: 41 4e 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42  ANGE BETWEEN UNB
cbf0: 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47  OUNDED PRECEDING
cc00: 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57   AND CURRENT ROW
cc10: 0a 2a 2a 0a 2a 2a 20 20 20 66 6c 75 73 68 5f 70  .**.**   flush_p
cc20: 61 72 74 69 74 69 6f 6e 3a 0a 2a 2a 20 20 20 20  artition:.**    
cc30: 20 4f 6e 63 65 20 7b 0a 2a 2a 20 20 20 20 20 20   Once {.**      
cc40: 20 4f 70 65 6e 44 75 70 20 28 69 45 70 68 43 73   OpenDup (iEphCs
cc50: 72 20 2d 3e 20 63 73 72 4c 65 61 64 29 0a 2a 2a  r -> csrLead).**
cc60: 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 49 6e       }.**     In
cc70: 74 65 67 65 72 20 63 74 72 20 30 0a 2a 2a 20 20  teger ctr 0.**  
cc80: 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 20 28     foreach row (
cc90: 63 73 72 4c 65 61 64 29 7b 0a 2a 2a 20 20 20 20  csrLead){.**    
cca0: 20 20 20 69 66 28 20 6e 65 77 20 70 65 65 72 20     if( new peer 
ccb0: 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 67  ){.**         Ag
ccc0: 67 46 69 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a  gFinal (xValue).
ccd0: 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  **         for(i
cce0: 3d 30 3b 20 69 3c 63 74 72 3b 20 69 2b 2b 29 7b  =0; i<ctr; i++){
ccf0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 47 6f  .**           Go
cd00: 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a  sub addrGosub.**
cd10: 20 20 20 20 20 20 20 20 20 20 20 4e 65 78 74 20             Next 
cd20: 69 45 70 68 43 73 72 0a 2a 2a 20 20 20 20 20 20  iEphCsr.**      
cd30: 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20     }.**         
cd40: 49 6e 74 65 67 65 72 20 63 74 72 20 30 0a 2a 2a  Integer ctr 0.**
cd50: 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
cd60: 20 20 41 67 67 53 74 65 70 20 28 63 73 72 4c 65    AggStep (csrLe
cd70: 61 64 29 0a 2a 2a 20 20 20 20 20 20 20 49 6e 63  ad).**       Inc
cd80: 72 20 63 74 72 0a 2a 2a 20 20 20 20 20 7d 0a 2a  r ctr.**     }.*
cd90: 2a 0a 2a 2a 20 20 20 20 20 41 67 67 46 69 6e 61  *.**     AggFina
cda0: 6c 20 28 78 46 69 6e 61 6c 69 7a 65 29 0a 2a 2a  l (xFinalize).**
cdb0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
cdc0: 63 74 72 3b 20 69 2b 2b 29 7b 0a 2a 2a 20 20 20  ctr; i++){.**   
cdd0: 20 20 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f      Gosub addrGo
cde0: 73 75 62 0a 2a 2a 20 20 20 20 20 20 20 4e 65 78  sub.**       Nex
cdf0: 74 20 69 45 70 68 43 73 72 0a 2a 2a 20 20 20 20  t iEphCsr.**    
ce00: 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 73   }.**.**     Res
ce10: 65 74 53 6f 72 74 65 72 20 28 63 73 72 29 0a 2a  etSorter (csr).*
ce20: 2a 20 20 20 20 20 52 65 74 75 72 6e 0a 2a 2a 0a  *     Return.**.
ce30: 2a 2a 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20  ** ROWS BETWEEN 
ce40: 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44  UNBOUNDED PRECED
ce50: 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54 20  ING AND CURRENT 
ce60: 52 4f 57 0a 2a 2a 0a 2a 2a 20 20 20 41 73 20 61  ROW.**.**   As a
ce70: 62 6f 76 65 2c 20 65 78 63 65 70 74 20 74 68 61  bove, except tha
ce80: 74 20 74 68 65 20 22 69 66 28 20 6e 65 77 20 70  t the "if( new p
ce90: 65 65 72 20 29 22 20 62 72 61 6e 63 68 20 69 73  eer )" branch is
cea0: 20 61 6c 77 61 79 73 20 74 61 6b 65 6e 2e 0a 2a   always taken..*
ceb0: 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54 57 45  *.** RANGE BETWE
cec0: 45 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20 41  EN CURRENT ROW A
ced0: 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 20 0a  ND CURRENT ROW .
cee0: 2a 2a 0a 2a 2a 20 20 20 41 73 20 61 62 6f 76 65  **.**   As above
cef0: 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 65 61  , except that ea
cf00: 63 68 20 6f 66 20 74 68 65 20 66 6f 72 28 29 20  ch of the for() 
cf10: 6c 6f 6f 70 73 20 62 65 63 6f 6d 65 73 3a 0a 2a  loops becomes:.*
cf20: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72  *.**         for
cf30: 28 69 3d 30 3b 20 69 3c 63 74 72 3b 20 69 2b 2b  (i=0; i<ctr; i++
cf40: 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ){.**           
cf50: 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a  Gosub addrGosub.
cf60: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 67 67  **           Agg
cf70: 53 74 65 70 20 28 78 49 6e 76 65 72 73 65 2c 20  Step (xInverse, 
cf80: 69 45 70 68 43 73 72 29 0a 2a 2a 20 20 20 20 20  iEphCsr).**     
cf90: 20 20 20 20 20 20 4e 65 78 74 20 69 45 70 68 43        Next iEphC
cfa0: 73 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a  sr.**         }.
cfb0: 2a 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54 57  **.** RANGE BETW
cfc0: 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52  EEN UNBOUNDED PR
cfd0: 45 43 45 44 49 4e 47 20 41 4e 44 20 55 4e 42 4f  ECEDING AND UNBO
cfe0: 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a  UNDED FOLLOWING.
cff0: 2a 2a 0a 2a 2a 20 20 20 66 6c 75 73 68 5f 70 61  **.**   flush_pa
d000: 72 74 69 74 69 6f 6e 3a 0a 2a 2a 20 20 20 20 20  rtition:.**     
d010: 4f 6e 63 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20  Once {.**       
d020: 4f 70 65 6e 44 75 70 20 28 69 45 70 68 43 73 72  OpenDup (iEphCsr
d030: 20 2d 3e 20 63 73 72 4c 65 61 64 29 0a 2a 2a 20   -> csrLead).** 
d040: 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 66 6f 72      }.**     for
d050: 65 61 63 68 20 72 6f 77 20 28 63 73 72 4c 65 61  each row (csrLea
d060: 64 29 20 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67  d) {.**       Ag
d070: 67 53 74 65 70 20 28 63 73 72 4c 65 61 64 29 0a  gStep (csrLead).
d080: 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20  **     }.**     
d090: 66 6f 72 65 61 63 68 20 72 6f 77 20 28 69 45 70  foreach row (iEp
d0a0: 68 43 73 72 29 20 7b 0a 2a 2a 20 20 20 20 20 20  hCsr) {.**      
d0b0: 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62   Gosub addrGosub
d0c0: 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 0a 2a 2a  .**     }.** .**
d0d0: 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 43   RANGE BETWEEN C
d0e0: 55 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 55  URRENT ROW AND U
d0f0: 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49  NBOUNDED FOLLOWI
d100: 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 66 6c 75 73 68  NG.**.**   flush
d110: 5f 70 61 72 74 69 74 69 6f 6e 3a 0a 2a 2a 20 20  _partition:.**  
d120: 20 20 20 4f 6e 63 65 20 7b 0a 2a 2a 20 20 20 20     Once {.**    
d130: 20 20 20 4f 70 65 6e 44 75 70 20 28 69 45 70 68     OpenDup (iEph
d140: 43 73 72 20 2d 3e 20 63 73 72 4c 65 61 64 29 0a  Csr -> csrLead).
d150: 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20  **     }.**     
d160: 66 6f 72 65 61 63 68 20 72 6f 77 20 28 63 73 72  foreach row (csr
d170: 4c 65 61 64 29 7b 0a 2a 2a 20 20 20 20 20 20 20  Lead){.**       
d180: 41 67 67 53 74 65 70 20 28 63 73 72 4c 65 61 64  AggStep (csrLead
d190: 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20  ).**     }.**   
d1a0: 20 20 52 65 77 69 6e 64 20 28 63 73 72 4c 65 61    Rewind (csrLea
d1b0: 64 29 0a 2a 2a 20 20 20 20 20 49 6e 74 65 67 65  d).**     Intege
d1c0: 72 20 63 74 72 20 30 0a 2a 2a 20 20 20 20 20 66  r ctr 0.**     f
d1d0: 6f 72 65 61 63 68 20 72 6f 77 20 28 63 73 72 4c  oreach row (csrL
d1e0: 65 61 64 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69  ead){.**       i
d1f0: 66 28 20 6e 65 77 20 70 65 65 72 20 29 7b 0a 2a  f( new peer ){.*
d200: 2a 20 20 20 20 20 20 20 20 20 41 67 67 46 69 6e  *         AggFin
d210: 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20  al (xValue).**  
d220: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
d230: 69 3c 63 74 72 3b 20 69 2b 2b 29 7b 0a 2a 2a 20  i<ctr; i++){.** 
d240: 20 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20            Gosub 
d250: 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20  addrGosub.**    
d260: 20 20 20 20 20 20 20 41 67 67 53 74 65 70 20 28         AggStep (
d270: 78 49 6e 76 65 72 73 65 2c 20 69 45 70 68 43 73  xInverse, iEphCs
d280: 72 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  r).**           
d290: 4e 65 78 74 20 69 45 70 68 43 73 72 0a 2a 2a 20  Next iEphCsr.** 
d2a0: 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20          }.**    
d2b0: 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 74 72       Integer ctr
d2c0: 20 30 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a   0.**       }.**
d2d0: 20 20 20 20 20 20 20 49 6e 63 72 20 63 74 72 0a         Incr ctr.
d2e0: 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20  **     }.**.**  
d2f0: 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78 46 69     AggFinal (xFi
d300: 6e 61 6c 69 7a 65 29 0a 2a 2a 20 20 20 20 20 66  nalize).**     f
d310: 6f 72 28 69 3d 30 3b 20 69 3c 63 74 72 3b 20 69  or(i=0; i<ctr; i
d320: 2b 2b 29 7b 0a 2a 2a 20 20 20 20 20 20 20 47 6f  ++){.**       Go
d330: 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a  sub addrGosub.**
d340: 20 20 20 20 20 20 20 4e 65 78 74 20 69 45 70 68         Next iEph
d350: 43 73 72 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a  Csr.**     }.**.
d360: 2a 2a 20 20 20 20 20 52 65 73 65 74 53 6f 72 74  **     ResetSort
d370: 65 72 20 28 63 73 72 29 0a 2a 2a 20 20 20 20 20  er (csr).**     
d380: 52 65 74 75 72 6e 0a 2a 2f 0a 73 74 61 74 69 63  Return.*/.static
d390: 20 76 6f 69 64 20 77 69 6e 64 6f 77 43 6f 64 65   void windowCode
d3a0: 43 61 63 68 65 53 74 65 70 28 0a 20 20 50 61 72  CacheStep(.  Par
d3b0: 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 53  se *pParse, .  S
d3c0: 65 6c 65 63 74 20 2a 70 2c 0a 20 20 57 68 65 72  elect *p,.  Wher
d3d0: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20  eInfo *pWInfo,. 
d3e0: 20 69 6e 74 20 72 65 67 47 6f 73 75 62 2c 20 0a   int regGosub, .
d3f0: 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75 62 0a    int addrGosub.
d400: 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57  ){.  Window *pMW
d410: 69 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b 0a 20 20  in = p->pWin;.  
d420: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
d430: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
d440: 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e  ;.  Window *pWin
d450: 3b 0a 20 20 69 6e 74 20 6b 3b 0a 20 20 69 6e 74  ;.  int k;.  int
d460: 20 61 64 64 72 3b 0a 20 20 45 78 70 72 4c 69 73   addr;.  ExprLis
d470: 74 20 2a 70 50 61 72 74 20 3d 20 70 4d 57 69 6e  t *pPart = pMWin
d480: 2d 3e 70 50 61 72 74 69 74 69 6f 6e 3b 0a 20 20  ->pPartition;.  
d490: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
d4a0: 42 79 20 3d 20 70 4d 57 69 6e 2d 3e 70 4f 72 64  By = pMWin->pOrd
d4b0: 65 72 42 79 3b 0a 20 20 69 6e 74 20 6e 50 65 65  erBy;.  int nPee
d4c0: 72 20 3d 20 70 4f 72 64 65 72 42 79 20 3f 20 70  r = pOrderBy ? p
d4d0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 3a  OrderBy->nExpr :
d4e0: 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 4e 65 77   0;.  int regNew
d4f0: 50 65 65 72 3b 0a 0a 20 20 69 6e 74 20 61 64 64  Peer;..  int add
d500: 72 47 6f 74 6f 3b 20 20 20 20 20 20 20 20 20 20  rGoto;          
d510: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
d520: 65 73 73 20 6f 66 20 47 6f 74 6f 20 75 73 65 64  ess of Goto used
d530: 20 74 6f 20 6a 75 6d 70 20 66 6c 75 73 68 5f 70   to jump flush_p
d540: 61 72 2e 2e 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ar.. */.  int ad
d550: 64 72 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20  drNext;         
d560: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
d570: 70 20 68 65 72 65 20 66 6f 72 20 6e 65 78 74 20  p here for next 
d580: 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 6c 6f 6f  iteration of loo
d590: 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 6c  p */.  int regFl
d5a0: 75 73 68 50 61 72 74 3b 0a 20 20 69 6e 74 20 6c  ushPart;.  int l
d5b0: 62 6c 46 6c 75 73 68 50 61 72 74 3b 0a 20 20 69  blFlushPart;.  i
d5c0: 6e 74 20 63 73 72 4c 65 61 64 3b 0a 20 20 69 6e  nt csrLead;.  in
d5d0: 74 20 72 65 67 43 74 72 3b 0a 20 20 69 6e 74 20  t regCtr;.  int 
d5e0: 72 65 67 41 72 67 3b 20 20 20 20 20 20 20 20 20  regArg;         
d5f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
d600: 65 67 69 73 74 65 72 20 61 72 72 61 79 20 74 6f  egister array to
d610: 20 6d 61 72 74 69 61 6c 20 66 75 6e 63 74 69 6f   martial functio
d620: 6e 20 61 72 67 73 20 2a 2f 0a 20 20 69 6e 74 20  n args */.  int 
d630: 72 65 67 53 69 7a 65 3b 0a 20 20 69 6e 74 20 6e  regSize;.  int n
d640: 41 72 67 3b 0a 20 20 69 6e 74 20 6c 62 6c 45 6d  Arg;.  int lblEm
d650: 70 74 79 3b 0a 20 20 69 6e 74 20 62 52 65 76 65  pty;.  int bReve
d660: 72 73 65 20 3d 20 70 4d 57 69 6e 2d 3e 70 4f 72  rse = pMWin->pOr
d670: 64 65 72 42 79 20 26 26 20 70 4d 57 69 6e 2d 3e  derBy && pMWin->
d680: 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45  eStart==TK_CURRE
d690: 4e 54 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  NT .          &&
d6a0: 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b   pMWin->eEnd==TK
d6b0: 5f 55 4e 42 4f 55 4e 44 45 44 3b 0a 0a 20 20 61  _UNBOUNDED;..  a
d6c0: 73 73 65 72 74 28 20 28 70 4d 57 69 6e 2d 3e 65  ssert( (pMWin->e
d6d0: 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e  Start==TK_UNBOUN
d6e0: 44 45 44 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45  DED && pMWin->eE
d6f0: 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29 20  nd==TK_CURRENT) 
d700: 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 4d 57 69  .       || (pMWi
d710: 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e  n->eStart==TK_UN
d720: 42 4f 55 4e 44 45 44 20 26 26 20 70 4d 57 69 6e  BOUNDED && pMWin
d730: 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55  ->eEnd==TK_UNBOU
d740: 4e 44 45 44 29 20 0a 20 20 20 20 20 20 20 7c 7c  NDED) .       ||
d750: 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d   (pMWin->eStart=
d760: 3d 54 4b 5f 43 55 52 52 45 4e 54 20 26 26 20 70  =TK_CURRENT && p
d770: 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43  MWin->eEnd==TK_C
d780: 55 52 52 45 4e 54 29 20 0a 20 20 20 20 20 20 20  URRENT) .       
d790: 7c 7c 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72  || (pMWin->eStar
d7a0: 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 26 26  t==TK_CURRENT &&
d7b0: 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b   pMWin->eEnd==TK
d7c0: 5f 55 4e 42 4f 55 4e 44 45 44 29 20 0a 20 20 29  _UNBOUNDED) .  )
d7d0: 3b 0a 0a 20 20 6c 62 6c 45 6d 70 74 79 20 3d 20  ;..  lblEmpty = 
d7e0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
d7f0: 61 62 65 6c 28 76 29 3b 0a 20 20 72 65 67 4e 65  abel(v);.  regNe
d800: 77 50 65 65 72 20 3d 20 70 50 61 72 73 65 2d 3e  wPeer = pParse->
d810: 6e 4d 65 6d 2b 31 3b 0a 20 20 70 50 61 72 73 65  nMem+1;.  pParse
d820: 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 65 65 72 3b  ->nMem += nPeer;
d830: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
d840: 72 65 67 69 73 74 65 72 20 61 6e 64 20 6c 61 62  register and lab
d850: 65 6c 20 66 6f 72 20 74 68 65 20 22 66 6c 75 73  el for the "flus
d860: 68 5f 70 61 72 74 69 74 69 6f 6e 22 20 73 75 62  h_partition" sub
d870: 2d 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 72  -routine. */.  r
d880: 65 67 46 6c 75 73 68 50 61 72 74 20 3d 20 2b 2b  egFlushPart = ++
d890: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
d8a0: 6c 62 6c 46 6c 75 73 68 50 61 72 74 20 3d 20 73  lblFlushPart = s
d8b0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
d8c0: 62 65 6c 28 76 29 3b 0a 0a 20 20 63 73 72 4c 65  bel(v);..  csrLe
d8d0: 61 64 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ad = pParse->nTa
d8e0: 62 2b 2b 3b 0a 20 20 72 65 67 43 74 72 20 3d 20  b++;.  regCtr = 
d8f0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
d900: 0a 20 20 77 69 6e 64 6f 77 50 61 72 74 69 74 69  .  windowPartiti
d910: 6f 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c 20  onCache(pParse, 
d920: 70 2c 20 70 57 49 6e 66 6f 2c 20 72 65 67 46 6c  p, pWInfo, regFl
d930: 75 73 68 50 61 72 74 2c 20 6c 62 6c 46 6c 75 73  ushPart, lblFlus
d940: 68 50 61 72 74 2c 20 26 72 65 67 53 69 7a 65 29  hPart, &regSize)
d950: 3b 0a 20 20 61 64 64 72 47 6f 74 6f 20 3d 20 73  ;.  addrGoto = s
d960: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
d970: 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 0a 20  (v, OP_Goto);.. 
d980: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 22 66 6c   /* Start of "fl
d990: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 20 2a  ush_partition" *
d9a0: 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
d9b0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
d9c0: 62 6c 46 6c 75 73 68 50 61 72 74 29 3b 0a 20 20  blFlushPart);.  
d9d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d9e0: 32 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c 20 30 2c  2(v, OP_Once, 0,
d9f0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
da00: 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20  entAddr(v)+2);. 
da10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
da20: 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70  p2(v, OP_OpenDup
da30: 2c 20 63 73 72 4c 65 61 64 2c 20 70 4d 57 69 6e  , csrLead, pMWin
da40: 2d 3e 69 45 70 68 43 73 72 29 3b 0a 0a 20 20 2f  ->iEphCsr);..  /
da50: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
da60: 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67   accumulator reg
da70: 69 73 74 65 72 20 66 6f 72 20 65 61 63 68 20 77  ister for each w
da80: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 74  indow function t
da90: 6f 20 4e 55 4c 4c 20 2a 2f 0a 20 20 72 65 67 41  o NULL */.  regA
daa0: 72 67 20 3d 20 77 69 6e 64 6f 77 49 6e 69 74 41  rg = windowInitA
dab0: 63 63 75 6d 28 70 50 61 72 73 65 2c 20 70 4d 57  ccum(pParse, pMW
dac0: 69 6e 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56  in);..  sqlite3V
dad0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
dae0: 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 43  Integer, 0, regC
daf0: 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  tr);.  sqlite3Vd
db00: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
db10: 65 77 69 6e 64 2c 20 63 73 72 4c 65 61 64 2c 20  ewind, csrLead, 
db20: 6c 62 6c 45 6d 70 74 79 29 3b 0a 20 20 73 71 6c  lblEmpty);.  sql
db30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
db40: 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4d 57  , OP_Rewind, pMW
db50: 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 6c 62 6c  in->iEphCsr, lbl
db60: 45 6d 70 74 79 29 3b 0a 0a 20 20 69 66 28 20 62  Empty);..  if( b
db70: 52 65 76 65 72 73 65 20 29 7b 0a 20 20 20 20 69  Reverse ){.    i
db80: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
db90: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
dba0: 28 76 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 41  (v);.    windowA
dbb0: 67 67 53 74 65 70 28 70 50 61 72 73 65 2c 20 70  ggStep(pParse, p
dbc0: 4d 57 69 6e 2c 20 63 73 72 4c 65 61 64 2c 20 30  MWin, csrLead, 0
dbd0: 2c 20 72 65 67 41 72 67 2c 20 72 65 67 53 69 7a  , regArg, regSiz
dbe0: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  e);.    sqlite3V
dbf0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
dc00: 4e 65 78 74 2c 20 63 73 72 4c 65 61 64 2c 20 61  Next, csrLead, a
dc10: 64 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ddr);.    sqlite
dc20: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
dc30: 50 5f 52 65 77 69 6e 64 2c 20 63 73 72 4c 65 61  P_Rewind, csrLea
dc40: 64 2c 20 6c 62 6c 45 6d 70 74 79 29 3b 0a 20 20  d, lblEmpty);.  
dc50: 7d 0a 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73  }.  addrNext = s
dc60: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
dc70: 74 41 64 64 72 28 76 29 3b 0a 0a 20 20 69 66 28  tAddr(v);..  if(
dc80: 20 70 4f 72 64 65 72 42 79 20 26 26 20 28 70 4d   pOrderBy && (pM
dc90: 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55  Win->eEnd==TK_CU
dca0: 52 52 45 4e 54 20 7c 7c 20 70 4d 57 69 6e 2d 3e  RRENT || pMWin->
dcb0: 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45  eStart==TK_CURRE
dcc0: 4e 54 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 62  NT) ){.    int b
dcd0: 43 75 72 72 65 6e 74 20 3d 20 28 70 4d 57 69 6e  Current = (pMWin
dce0: 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52  ->eStart==TK_CUR
dcf0: 52 45 4e 54 29 3b 0a 20 20 20 20 69 6e 74 20 61  RENT);.    int a
dd00: 64 64 72 4a 75 6d 70 20 3d 20 30 3b 20 20 20 20  ddrJump = 0;    
dd10: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
dd20: 65 73 73 20 6f 66 20 4f 50 5f 4a 75 6d 70 20 62  ess of OP_Jump b
dd30: 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 69 66 28 20  elow */.    if( 
dd40: 70 4d 57 69 6e 2d 3e 65 54 79 70 65 3d 3d 54 4b  pMWin->eType==TK
dd50: 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20  _RANGE ){.      
dd60: 69 6e 74 20 69 4f 66 66 20 3d 20 70 4d 57 69 6e  int iOff = pMWin
dd70: 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 20 2b 20 28  ->nBufferCol + (
dd80: 70 50 61 72 74 20 3f 20 70 50 61 72 74 2d 3e 6e  pPart ? pPart->n
dd90: 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 20  Expr : 0);.     
dda0: 20 69 6e 74 20 72 65 67 50 65 65 72 20 3d 20 70   int regPeer = p
ddb0: 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 20 2b 20  MWin->regPart + 
ddc0: 28 70 50 61 72 74 20 3f 20 70 50 61 72 74 2d 3e  (pPart ? pPart->
ddd0: 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20  nExpr : 0);.    
dde0: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
ddf0: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
de00: 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
de10: 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
de20: 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  y, 0, 0);.      
de30: 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 50 65 65 72  for(k=0; k<nPeer
de40: 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
de50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
de60: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
de70: 63 73 72 4c 65 61 64 2c 20 69 4f 66 66 2b 6b 2c  csrLead, iOff+k,
de80: 20 72 65 67 4e 65 77 50 65 65 72 2b 6b 29 3b 0a   regNewPeer+k);.
de90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 64        }.      ad
dea0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
deb0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d  AddOp3(v, OP_Com
dec0: 70 61 72 65 2c 20 72 65 67 4e 65 77 50 65 65 72  pare, regNewPeer
ded0: 2c 20 72 65 67 50 65 65 72 2c 20 6e 50 65 65 72  , regPeer, nPeer
dee0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
def0: 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20  VdbeAppendP4(v, 
df00: 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2c  (void*)pKeyInfo,
df10: 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
df20: 20 20 20 20 61 64 64 72 4a 75 6d 70 20 3d 20 73      addrJump = s
df30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
df40: 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64  (v, OP_Jump, add
df50: 72 2b 32 2c 20 30 2c 20 61 64 64 72 2b 32 29 3b  r+2, 0, addr+2);
df60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
df70: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
df80: 6f 70 79 2c 20 72 65 67 4e 65 77 50 65 65 72 2c  opy, regNewPeer,
df90: 20 72 65 67 50 65 65 72 2c 20 6e 50 65 65 72 2d   regPeer, nPeer-
dfa0: 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77  1);.    }..    w
dfb0: 69 6e 64 6f 77 52 65 74 75 72 6e 52 6f 77 73 28  indowReturnRows(
dfc0: 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 72  pParse, pMWin, r
dfd0: 65 67 43 74 72 2c 20 72 65 67 47 6f 73 75 62 2c  egCtr, regGosub,
dfe0: 20 61 64 64 72 47 6f 73 75 62 2c 20 0a 20 20 20   addrGosub, .   
dff0: 20 20 20 20 20 28 62 43 75 72 72 65 6e 74 20 3f       (bCurrent ?
e000: 20 72 65 67 41 72 67 20 3a 20 30 29 2c 20 28 62   regArg : 0), (b
e010: 43 75 72 72 65 6e 74 20 3f 20 72 65 67 53 69 7a  Current ? regSiz
e020: 65 20 3a 20 30 29 0a 20 20 20 20 29 3b 0a 20 20  e : 0).    );.  
e030: 20 20 69 66 28 20 61 64 64 72 4a 75 6d 70 20 29    if( addrJump )
e040: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
e050: 48 65 72 65 28 76 2c 20 61 64 64 72 4a 75 6d 70  Here(v, addrJump
e060: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 52  );.  }..  if( bR
e070: 65 76 65 72 73 65 3d 3d 30 20 29 7b 0a 20 20 20  everse==0 ){.   
e080: 20 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28 70   windowAggStep(p
e090: 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 63 73  Parse, pMWin, cs
e0a0: 72 4c 65 61 64 2c 20 30 2c 20 72 65 67 41 72 67  rLead, 0, regArg
e0b0: 2c 20 72 65 67 53 69 7a 65 29 3b 0a 20 20 7d 0a  , regSize);.  }.
e0c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e0d0: 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
e0e0: 2c 20 72 65 67 43 74 72 2c 20 31 29 3b 0a 20 20  , regCtr, 1);.  
e0f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e100: 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 63 73  2(v, OP_Next, cs
e110: 72 4c 65 61 64 2c 20 61 64 64 72 4e 65 78 74 29  rLead, addrNext)
e120: 3b 0a 0a 20 20 77 69 6e 64 6f 77 52 65 74 75 72  ;..  windowRetur
e130: 6e 52 6f 77 73 28 70 50 61 72 73 65 2c 20 70 4d  nRows(pParse, pM
e140: 57 69 6e 2c 20 72 65 67 43 74 72 2c 20 72 65 67  Win, regCtr, reg
e150: 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62  Gosub, addrGosub
e160: 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 73 71 6c 69  , 0, 0);..  sqli
e170: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
e180: 62 65 6c 28 76 2c 20 6c 62 6c 45 6d 70 74 79 29  bel(v, lblEmpty)
e190: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
e1a0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 65  ddOp1(v, OP_Rese
e1b0: 74 53 6f 72 74 65 72 2c 20 70 4d 57 69 6e 2d 3e  tSorter, pMWin->
e1c0: 69 45 70 68 43 73 72 29 3b 0a 20 20 73 71 6c 69  iEphCsr);.  sqli
e1d0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
e1e0: 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 46   OP_Return, regF
e1f0: 6c 75 73 68 50 61 72 74 29 3b 0a 0a 20 20 2f 2a  lushPart);..  /*
e200: 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 74 6f   Jump to here to
e210: 20 73 6b 69 70 20 6f 76 65 72 20 66 6c 75 73 68   skip over flush
e220: 5f 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 20 20  _partition */.  
e230: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
e240: 65 72 65 28 76 2c 20 61 64 64 72 47 6f 74 6f 29  ere(v, addrGoto)
e250: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 41 4e 47  ;.}.../*.** RANG
e260: 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e  E BETWEEN UNBOUN
e270: 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e  DED PRECEDING AN
e280: 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a  D CURRENT ROW.**
e290: 0a 2a 2a 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20  .**   ....**    
e2a0: 20 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69   if( new partiti
e2b0: 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41  on ){.**       A
e2c0: 67 67 46 69 6e 61 6c 20 28 78 46 69 6e 61 6c 69  ggFinal (xFinali
e2d0: 7a 65 29 0a 2a 2a 20 20 20 20 20 20 20 47 6f 73  ze).**       Gos
e2e0: 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20  ub addrGosub.** 
e2f0: 20 20 20 20 20 20 52 65 73 65 74 53 6f 72 74 65        ResetSorte
e300: 72 20 65 70 68 2d 74 61 62 6c 65 0a 2a 2a 20 20  r eph-table.**  
e310: 20 20 20 7d 0a 2a 2a 20 20 20 20 20 65 6c 73 65     }.**     else
e320: 20 69 66 28 20 6e 65 77 20 70 65 65 72 20 29 7b   if( new peer ){
e330: 0a 2a 2a 20 20 20 20 20 20 20 41 67 67 46 69 6e  .**       AggFin
e340: 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20  al (xValue).**  
e350: 20 20 20 20 20 47 6f 73 75 62 20 61 64 64 72 47       Gosub addrG
e360: 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20 20 52 65  osub.**       Re
e370: 73 65 74 53 6f 72 74 65 72 20 65 70 68 2d 74 61  setSorter eph-ta
e380: 62 6c 65 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20  ble.**     }.** 
e390: 20 20 20 20 41 67 67 53 74 65 70 0a 2a 2a 20 20      AggStep.**  
e3a0: 20 20 20 49 6e 73 65 72 74 20 28 72 65 63 6f 72     Insert (recor
e3b0: 64 20 69 6e 74 6f 20 65 70 68 2d 74 61 62 6c 65  d into eph-table
e3c0: 29 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 57 68  ).**   sqlite3Wh
e3d0: 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 41 67  ereEnd().**   Ag
e3e0: 67 46 69 6e 61 6c 20 28 78 46 69 6e 61 6c 69 7a  gFinal (xFinaliz
e3f0: 65 29 0a 2a 2a 20 20 20 47 6f 73 75 62 20 61 64  e).**   Gosub ad
e400: 64 72 47 6f 73 75 62 0a 2a 2a 0a 2a 2a 20 52 41  drGosub.**.** RA
e410: 4e 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f  NGE BETWEEN UNBO
e420: 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20  UNDED PRECEDING 
e430: 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f  AND UNBOUNDED FO
e440: 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20  LLOWING.**.**   
e450: 41 73 20 61 62 6f 76 65 2c 20 65 78 63 65 70 74  As above, except
e460: 20 74 61 6b 65 20 6e 6f 20 61 63 74 69 6f 6e 20   take no action 
e470: 66 6f 72 20 61 20 22 6e 65 77 20 70 65 65 72 22  for a "new peer"
e480: 2e 20 49 6e 76 6f 6b 65 0a 2a 2a 20 20 20 74 68  . Invoke.**   th
e490: 65 20 73 75 62 2d 72 6f 75 74 69 6e 65 20 6f 6e  e sub-routine on
e4a0: 63 65 20 6f 6e 6c 79 20 66 6f 72 20 65 61 63 68  ce only for each
e4b0: 20 70 61 72 74 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a   partition..**.*
e4c0: 2a 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20  * RANGE BETWEEN 
e4d0: 43 55 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20  CURRENT ROW AND 
e4e0: 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a 0a 2a  CURRENT ROW.**.*
e4f0: 2a 20 20 20 41 73 20 61 62 6f 76 65 2c 20 65 78  *   As above, ex
e500: 63 65 70 74 20 74 68 61 74 20 74 68 65 20 22 6e  cept that the "n
e510: 65 77 20 70 65 65 72 22 20 63 6f 6e 64 69 74 69  ew peer" conditi
e520: 6f 6e 20 69 73 20 68 61 6e 64 6c 65 64 20 69 6e  on is handled in
e530: 20 74 68 65 0a 2a 2a 20 20 20 73 61 6d 65 20 77   the.**   same w
e540: 61 79 20 61 73 20 22 6e 65 77 20 70 61 72 74 69  ay as "new parti
e550: 74 69 6f 6e 22 20 28 73 6f 20 74 68 65 72 65 20  tion" (so there 
e560: 69 73 20 6e 6f 20 22 65 6c 73 65 20 69 66 22 20  is no "else if" 
e570: 62 6c 6f 63 6b 29 2e 0a 2a 2a 0a 2a 2a 20 52 4f  block)..**.** RO
e580: 57 53 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55  WS BETWEEN UNBOU
e590: 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41  NDED PRECEDING A
e5a0: 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a  ND CURRENT ROW.*
e5b0: 2a 20 0a 2a 2a 20 20 20 41 73 20 61 62 6f 76 65  * .**   As above
e5c0: 2c 20 65 78 63 65 70 74 20 61 73 73 75 6d 65 20  , except assume 
e5d0: 65 76 65 72 79 20 72 6f 77 20 69 73 20 61 20 22  every row is a "
e5e0: 6e 65 77 20 70 65 65 72 22 2e 0a 2a 2f 0a 73 74  new peer"..*/.st
e5f0: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77  atic void window
e600: 43 6f 64 65 44 65 66 61 75 6c 74 53 74 65 70 28  CodeDefaultStep(
e610: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
e620: 2c 20 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 0a  , .  Select *p,.
e630: 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
e640: 6e 66 6f 2c 0a 20 20 69 6e 74 20 72 65 67 47 6f  nfo,.  int regGo
e650: 73 75 62 2c 20 0a 20 20 69 6e 74 20 61 64 64 72  sub, .  int addr
e660: 47 6f 73 75 62 0a 29 7b 0a 20 20 57 69 6e 64 6f  Gosub.){.  Windo
e670: 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57  w *pMWin = p->pW
e680: 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  in;.  Vdbe *v = 
e690: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
e6a0: 50 61 72 73 65 29 3b 0a 20 20 57 69 6e 64 6f 77  Parse);.  Window
e6b0: 20 2a 70 57 69 6e 3b 0a 20 20 69 6e 74 20 6b 3b   *pWin;.  int k;
e6c0: 0a 20 20 69 6e 74 20 69 53 75 62 43 73 72 20 3d  .  int iSubCsr =
e6d0: 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 69   p->pSrc->a[0].i
e6e0: 43 75 72 73 6f 72 3b 0a 20 20 69 6e 74 20 6e 53  Cursor;.  int nS
e6f0: 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  ub = p->pSrc->a[
e700: 30 5d 2e 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  0].pTab->nCol;. 
e710: 20 69 6e 74 20 72 65 67 20 3d 20 70 50 61 72 73   int reg = pPars
e720: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 69 6e 74  e->nMem+1;.  int
e730: 20 72 65 67 52 65 63 6f 72 64 20 3d 20 72 65 67   regRecord = reg
e740: 2b 6e 53 75 62 3b 0a 20 20 69 6e 74 20 72 65 67  +nSub;.  int reg
e750: 52 6f 77 69 64 20 3d 20 72 65 67 52 65 63 6f 72  Rowid = regRecor
e760: 64 2b 31 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b  d+1;.  int addr;
e770: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 50 61  .  ExprList *pPa
e780: 72 74 20 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72  rt = pMWin->pPar
e790: 74 69 74 69 6f 6e 3b 0a 20 20 45 78 70 72 4c 69  tition;.  ExprLi
e7a0: 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
e7b0: 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 3b 0a  MWin->pOrderBy;.
e7c0: 0a 20 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e  .  assert( pMWin
e7d0: 2d 3e 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47  ->eType==TK_RANG
e7e0: 45 20 0a 20 20 20 20 20 20 7c 7c 20 28 70 4d 57  E .      || (pMW
e7f0: 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55  in->eStart==TK_U
e800: 4e 42 4f 55 4e 44 45 44 20 26 26 20 70 4d 57 69  NBOUNDED && pMWi
e810: 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52  n->eEnd==TK_CURR
e820: 45 4e 54 29 0a 20 20 29 3b 0a 0a 20 20 61 73 73  ENT).  );..  ass
e830: 65 72 74 28 20 28 70 4d 57 69 6e 2d 3e 65 53 74  ert( (pMWin->eSt
e840: 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  art==TK_UNBOUNDE
e850: 44 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64  D && pMWin->eEnd
e860: 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29 0a 20 20  ==TK_CURRENT).  
e870: 20 20 20 20 20 7c 7c 20 28 70 4d 57 69 6e 2d 3e       || (pMWin->
e880: 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55  eStart==TK_UNBOU
e890: 4e 44 45 44 20 26 26 20 70 4d 57 69 6e 2d 3e 65  NDED && pMWin->e
e8a0: 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  End==TK_UNBOUNDE
e8b0: 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 4d  D).       || (pM
e8c0: 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
e8d0: 43 55 52 52 45 4e 54 20 26 26 20 70 4d 57 69 6e  CURRENT && pMWin
e8e0: 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45  ->eEnd==TK_CURRE
e8f0: 4e 54 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  NT).       || (p
e900: 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
e910: 5f 43 55 52 52 45 4e 54 20 26 26 20 70 4d 57 69  _CURRENT && pMWi
e920: 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f  n->eEnd==TK_UNBO
e930: 55 4e 44 45 44 20 26 26 20 21 70 4f 72 64 65 72  UNDED && !pOrder
e940: 42 79 29 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20  By).  );..  if( 
e950: 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f  pMWin->eEnd==TK_
e960: 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20  UNBOUNDED ){.   
e970: 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   pOrderBy = 0;. 
e980: 20 7d 0a 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d   }..  pParse->nM
e990: 65 6d 20 2b 3d 20 6e 53 75 62 20 2b 20 32 3b 0a  em += nSub + 2;.
e9a0: 0a 20 20 2f 2a 20 4d 61 72 74 69 61 6c 20 74 68  .  /* Martial th
e9b0: 65 20 72 6f 77 20 72 65 74 75 72 6e 65 64 20 62  e row returned b
e9c0: 79 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74  y the sub-select
e9d0: 20 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f   into an array o
e9e0: 66 20 0a 20 20 2a 2a 20 72 65 67 69 73 74 65 72  f .  ** register
e9f0: 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b  s. */.  for(k=0;
ea00: 20 6b 3c 6e 53 75 62 3b 20 6b 2b 2b 29 7b 0a 20   k<nSub; k++){. 
ea10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ea20: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
ea30: 6e 2c 20 69 53 75 62 43 73 72 2c 20 6b 2c 20 72  n, iSubCsr, k, r
ea40: 65 67 2b 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eg+k);.  }..  /*
ea50: 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 69   Check if this i
ea60: 73 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  s the start of a
ea70: 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 20 6f   new partition o
ea80: 72 20 70 65 65 72 20 67 72 6f 75 70 2e 20 2a 2f  r peer group. */
ea90: 0a 20 20 69 66 28 20 70 50 61 72 74 20 7c 7c 20  .  if( pPart || 
eaa0: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
eab0: 69 6e 74 20 6e 50 61 72 74 20 3d 20 28 70 50 61  int nPart = (pPa
eac0: 72 74 20 3f 20 70 50 61 72 74 2d 3e 6e 45 78 70  rt ? pPart->nExp
ead0: 72 20 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74 20  r : 0);.    int 
eae0: 61 64 64 72 47 6f 74 6f 20 3d 20 30 3b 0a 20 20  addrGoto = 0;.  
eaf0: 20 20 69 6e 74 20 61 64 64 72 4a 75 6d 70 20 3d    int addrJump =
eb00: 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 50 65 65   0;.    int nPee
eb10: 72 20 3d 20 28 70 4f 72 64 65 72 42 79 20 3f 20  r = (pOrderBy ? 
eb20: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
eb30: 3a 20 30 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  : 0);..    if( p
eb40: 50 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69 6e  Part ){.      in
eb50: 74 20 72 65 67 4e 65 77 50 61 72 74 20 3d 20 72  t regNewPart = r
eb60: 65 67 20 2b 20 70 4d 57 69 6e 2d 3e 6e 42 75 66  eg + pMWin->nBuf
eb70: 66 65 72 43 6f 6c 3b 0a 20 20 20 20 20 20 4b 65  ferCol;.      Ke
eb80: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
eb90: 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
eba0: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
ebb0: 72 73 65 2c 20 70 50 61 72 74 2c 20 30 2c 20 30  rse, pPart, 0, 0
ebc0: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
ebd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ebe0: 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  3(v, OP_Compare,
ebf0: 20 72 65 67 4e 65 77 50 61 72 74 2c 20 70 4d 57   regNewPart, pMW
ec00: 69 6e 2d 3e 72 65 67 50 61 72 74 2c 6e 50 61 72  in->regPart,nPar
ec10: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
ec20: 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c  3VdbeAppendP4(v,
ec30: 20 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f   (void*)pKeyInfo
ec40: 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
ec50: 20 20 20 20 20 61 64 64 72 4a 75 6d 70 20 3d 20       addrJump = 
ec60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ec70: 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64  3(v, OP_Jump, ad
ec80: 64 72 2b 32 2c 20 30 2c 20 61 64 64 72 2b 32 29  dr+2, 0, addr+2)
ec90: 3b 0a 20 20 20 20 20 20 77 69 6e 64 6f 77 41 67  ;.      windowAg
eca0: 67 46 69 6e 61 6c 28 70 50 61 72 73 65 2c 20 70  gFinal(pParse, p
ecb0: 4d 57 69 6e 2c 20 31 29 3b 0a 20 20 20 20 20 20  MWin, 1);.      
ecc0: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
ecd0: 20 20 20 20 20 20 20 20 61 64 64 72 47 6f 74 6f          addrGoto
ece0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
ecf0: 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29  dOp0(v, OP_Goto)
ed00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
ed10: 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42  .    if( pOrderB
ed20: 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  y ){.      int r
ed30: 65 67 4e 65 77 50 65 65 72 20 3d 20 72 65 67 20  egNewPeer = reg 
ed40: 2b 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72  + pMWin->nBuffer
ed50: 43 6f 6c 20 2b 20 6e 50 61 72 74 3b 0a 20 20 20  Col + nPart;.   
ed60: 20 20 20 69 6e 74 20 72 65 67 50 65 65 72 20 3d     int regPeer =
ed70: 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 20   pMWin->regPart 
ed80: 2b 20 6e 50 61 72 74 3b 0a 0a 20 20 20 20 20 20  + nPart;..      
ed90: 69 66 28 20 61 64 64 72 4a 75 6d 70 20 29 20 73  if( addrJump ) s
eda0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
edb0: 72 65 28 76 2c 20 61 64 64 72 4a 75 6d 70 29 3b  re(v, addrJump);
edc0: 0a 20 20 20 20 20 20 69 66 28 20 70 4d 57 69 6e  .      if( pMWin
edd0: 2d 3e 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47  ->eType==TK_RANG
ede0: 45 20 29 7b 0a 20 20 20 20 20 20 20 20 4b 65 79  E ){.        Key
edf0: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
ee00: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46   sqlite3KeyInfoF
ee10: 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
ee20: 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 2c  se, pOrderBy, 0,
ee30: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64   0);.        add
ee40: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
ee50: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp3(v, OP_Comp
ee60: 61 72 65 2c 20 72 65 67 4e 65 77 50 65 65 72 2c  are, regNewPeer,
ee70: 20 72 65 67 50 65 65 72 2c 20 6e 50 65 65 72 29   regPeer, nPeer)
ee80: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
ee90: 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c  3VdbeAppendP4(v,
eea0: 20 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f   (void*)pKeyInfo
eeb0: 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
eec0: 20 20 20 20 20 20 20 61 64 64 72 4a 75 6d 70 20         addrJump 
eed0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
eee0: 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
eef0: 61 64 64 72 2b 32 2c 20 30 2c 20 61 64 64 72 2b  addr+2, 0, addr+
ef00: 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  2);.      }else{
ef10: 0a 20 20 20 20 20 20 20 20 61 64 64 72 4a 75 6d  .        addrJum
ef20: 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  p = 0;.      }. 
ef30: 20 20 20 20 20 77 69 6e 64 6f 77 41 67 67 46 69       windowAggFi
ef40: 6e 61 6c 28 70 50 61 72 73 65 2c 20 70 4d 57 69  nal(pParse, pMWi
ef50: 6e 2c 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  n, pMWin->eStart
ef60: 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29 3b 0a 20  ==TK_CURRENT);. 
ef70: 20 20 20 20 20 69 66 28 20 61 64 64 72 47 6f 74       if( addrGot
ef80: 6f 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  o ) sqlite3VdbeJ
ef90: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 47  umpHere(v, addrG
efa0: 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  oto);.    }..   
efb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
efc0: 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
efd0: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c   pMWin->iEphCsr,
efe0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
eff0: 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20  ntAddr(v)+3);.  
f000: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f010: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
f020: 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47   regGosub, addrG
f030: 6f 73 75 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  osub);.    sqlit
f040: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
f050: 4f 50 5f 4e 65 78 74 2c 20 70 4d 57 69 6e 2d 3e  OP_Next, pMWin->
f060: 69 45 70 68 43 73 72 2c 20 73 71 6c 69 74 65 33  iEphCsr, sqlite3
f070: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
f080: 76 29 2d 31 29 3b 0a 0a 20 20 20 20 73 71 6c 69  v)-1);..    sqli
f090: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
f0a0: 20 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c   OP_ResetSorter,
f0b0: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29   pMWin->iEphCsr)
f0c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
f0d0: 65 41 64 64 4f 70 33 28 0a 20 20 20 20 20 20 20  eAddOp3(.       
f0e0: 20 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67   v, OP_Copy, reg
f0f0: 2b 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43  +pMWin->nBufferC
f100: 6f 6c 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61  ol, pMWin->regPa
f110: 72 74 2c 20 6e 50 61 72 74 2b 6e 50 65 65 72 2d  rt, nPart+nPeer-
f120: 31 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 69 66  1.    );..    if
f130: 28 20 61 64 64 72 4a 75 6d 70 20 29 20 73 71 6c  ( addrJump ) sql
f140: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
f150: 28 76 2c 20 61 64 64 72 4a 75 6d 70 29 3b 0a 20  (v, addrJump);. 
f160: 20 7d 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20   }..  /* Invoke 
f170: 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 66 6f  step function fo
f180: 72 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  r window functio
f190: 6e 73 20 2a 2f 0a 20 20 77 69 6e 64 6f 77 41 67  ns */.  windowAg
f1a0: 67 53 74 65 70 28 70 50 61 72 73 65 2c 20 70 4d  gStep(pParse, pM
f1b0: 57 69 6e 2c 20 2d 31 2c 20 30 2c 20 72 65 67 2c  Win, -1, 0, reg,
f1c0: 20 30 29 3b 0a 0a 20 20 2f 2a 20 42 75 66 66 65   0);..  /* Buffe
f1d0: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  r the current ro
f1e0: 77 20 69 6e 20 74 68 65 20 65 70 68 65 6d 65 72  w in the ephemer
f1f0: 61 6c 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 69  al table. */.  i
f200: 66 28 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65  f( pMWin->nBuffe
f210: 72 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 73 71  rCol>0 ){.    sq
f220: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
f230: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
f240: 2c 20 72 65 67 2c 20 70 4d 57 69 6e 2d 3e 6e 42  , reg, pMWin->nB
f250: 75 66 66 65 72 43 6f 6c 2c 20 72 65 67 52 65 63  ufferCol, regRec
f260: 6f 72 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ord);.  }else{. 
f270: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f280: 64 4f 70 32 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c  dOp2(v, OP_Blob,
f290: 20 30 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a   0, regRecord);.
f2a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f2b0: 70 70 65 6e 64 50 34 28 76 2c 20 28 76 6f 69 64  ppendP4(v, (void
f2c0: 2a 29 22 22 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  *)"", 0);.  }.  
f2d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f2e0: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
f2f0: 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
f300: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 73  , regRowid);.  s
f310: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
f320: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70  (v, OP_Insert, p
f330: 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 72  MWin->iEphCsr, r
f340: 65 67 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77  egRecord, regRow
f350: 69 64 29 3b 0a 0a 20 20 2f 2a 20 45 6e 64 20 74  id);..  /* End t
f360: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
f370: 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 73 71 6c 69   loop. */.  sqli
f380: 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
f390: 66 6f 29 3b 0a 0a 20 20 77 69 6e 64 6f 77 41 67  fo);..  windowAg
f3a0: 67 46 69 6e 61 6c 28 70 50 61 72 73 65 2c 20 70  gFinal(pParse, p
f3b0: 4d 57 69 6e 2c 20 31 29 3b 0a 20 20 73 71 6c 69  MWin, 1);.  sqli
f3c0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f3d0: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4d 57 69   OP_Rewind, pMWi
f3e0: 6e 2d 3e 69 45 70 68 43 73 72 2c 73 71 6c 69 74  n->iEphCsr,sqlit
f3f0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
f400: 72 28 76 29 2b 33 29 3b 0a 20 20 73 71 6c 69 74  r(v)+3);.  sqlit
f410: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
f420: 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 47 6f 73  OP_Gosub, regGos
f430: 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a  ub, addrGosub);.
f440: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f450: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
f460: 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20  pMWin->iEphCsr, 
f470: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
f480: 6e 74 41 64 64 72 28 76 29 2d 31 29 3b 0a 7d 0a  ntAddr(v)-1);.}.
f490: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
f4a0: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64 75 70  and return a dup
f4b0: 6c 69 63 61 74 65 20 6f 66 20 74 68 65 20 57 69  licate of the Wi
f4c0: 6e 64 6f 77 20 6f 62 6a 65 63 74 20 69 6e 64 69  ndow object indi
f4d0: 63 61 74 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  cated by the.** 
f4e0: 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 2e 20  third argument. 
f4f0: 53 65 74 20 74 68 65 20 57 69 6e 64 6f 77 2e 70  Set the Window.p
f500: 4f 77 6e 65 72 20 66 69 65 6c 64 20 6f 66 20 74  Owner field of t
f510: 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 74 6f  he new object to
f520: 0a 2a 2a 20 70 4f 77 6e 65 72 2e 0a 2a 2f 0a 57  .** pOwner..*/.W
f530: 69 6e 64 6f 77 20 2a 73 71 6c 69 74 65 33 57 69  indow *sqlite3Wi
f540: 6e 64 6f 77 44 75 70 28 73 71 6c 69 74 65 33 20  ndowDup(sqlite3 
f550: 2a 64 62 2c 20 45 78 70 72 20 2a 70 4f 77 6e 65  *db, Expr *pOwne
f560: 72 2c 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20  r, Window *p){. 
f570: 20 57 69 6e 64 6f 77 20 2a 70 4e 65 77 20 3d 20   Window *pNew = 
f580: 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  0;.  if( p ){.  
f590: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
f5a0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
f5b0: 20 73 69 7a 65 6f 66 28 57 69 6e 64 6f 77 29 29   sizeof(Window))
f5c0: 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20 29  ;.    if( pNew )
f5d0: 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 46  {.      pNew->pF
f5e0: 69 6c 74 65 72 20 3d 20 73 71 6c 69 74 65 33 45  ilter = sqlite3E
f5f0: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 46  xprDup(db, p->pF
f600: 69 6c 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  ilter, 0);.     
f610: 20 70 4e 65 77 2d 3e 70 50 61 72 74 69 74 69 6f   pNew->pPartitio
f620: 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  n = sqlite3ExprL
f630: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 50  istDup(db, p->pP
f640: 61 72 74 69 74 69 6f 6e 2c 20 30 29 3b 0a 20 20  artition, 0);.  
f650: 20 20 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72      pNew->pOrder
f660: 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
f670: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
f680: 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 20 20 20  OrderBy, 0);.   
f690: 20 20 20 70 4e 65 77 2d 3e 65 54 79 70 65 20 3d     pNew->eType =
f6a0: 20 70 2d 3e 65 54 79 70 65 3b 0a 20 20 20 20 20   p->eType;.     
f6b0: 20 70 4e 65 77 2d 3e 65 45 6e 64 20 3d 20 70 2d   pNew->eEnd = p-
f6c0: 3e 65 45 6e 64 3b 0a 20 20 20 20 20 20 70 4e 65  >eEnd;.      pNe
f6d0: 77 2d 3e 65 53 74 61 72 74 20 3d 20 70 2d 3e 65  w->eStart = p->e
f6e0: 53 74 61 72 74 3b 0a 20 20 20 20 20 20 70 4e 65  Start;.      pNe
f6f0: 77 2d 3e 70 53 74 61 72 74 20 3d 20 73 71 6c 69  w->pStart = sqli
f700: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
f710: 4e 65 77 2d 3e 70 53 74 61 72 74 2c 20 30 29 3b  New->pStart, 0);
f720: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 45 6e  .      pNew->pEn
f730: 64 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  d = sqlite3ExprD
f740: 75 70 28 64 62 2c 20 70 4e 65 77 2d 3e 70 45 6e  up(db, pNew->pEn
f750: 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65  d, 0);.      pNe
f760: 77 2d 3e 70 4f 77 6e 65 72 20 3d 20 70 4f 77 6e  w->pOwner = pOwn
f770: 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  er;.    }.  }.  
f780: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
f790: 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65  /*.** sqlite3Whe
f7a0: 72 65 42 65 67 69 6e 28 29 20 68 61 73 20 61 6c  reBegin() has al
f7b0: 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65  ready been calle
f7c0: 64 20 66 6f 72 20 74 68 65 20 53 45 4c 45 43 54  d for the SELECT
f7d0: 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a 20 70   statement .** p
f7e0: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
f7f0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 77 68 65  ond argument whe
f800: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
f810: 69 73 20 69 6e 76 6f 6b 65 64 2e 20 49 74 20 67  is invoked. It g
f820: 65 6e 65 72 61 74 65 73 0a 2a 2a 20 63 6f 64 65  enerates.** code
f830: 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65   to populate the
f840: 20 57 69 6e 64 6f 77 2e 72 65 67 52 65 73 75 6c   Window.regResul
f850: 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 65  t register for e
f860: 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  ach window funct
f870: 69 6f 6e 20 61 6e 64 0a 2a 2a 20 69 6e 76 6f 6b  ion and.** invok
f880: 65 20 74 68 65 20 73 75 62 2d 72 6f 75 74 69 6e  e the sub-routin
f890: 65 20 61 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  e at instruction
f8a0: 20 61 64 64 72 47 6f 73 75 62 20 6f 6e 63 65 20   addrGosub once 
f8b0: 66 6f 72 20 65 61 63 68 20 72 6f 77 2e 0a 2a 2a  for each row..**
f8c0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
f8d0: 61 6c 6c 73 20 73 71 6c 69 74 65 33 57 68 65 72  alls sqlite3Wher
f8e0: 65 45 6e 64 28 29 20 62 65 66 6f 72 65 20 72 65  eEnd() before re
f8f0: 74 75 72 6e 69 6e 67 2e 20 0a 2a 2f 0a 76 6f 69  turning. .*/.voi
f900: 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43  d sqlite3WindowC
f910: 6f 64 65 53 74 65 70 28 0a 20 20 50 61 72 73 65  odeStep(.  Parse
f920: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
f930: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
f940: 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
f950: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
f960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f970: 20 2f 2a 20 52 65 77 72 69 74 74 65 6e 20 53 45   /* Rewritten SE
f980: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
f990: 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  /.  WhereInfo *p
f9a0: 57 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  WInfo,          
f9b0: 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 72      /* Context r
f9c0: 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
f9d0: 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a  e3WhereBegin() *
f9e0: 2f 0a 20 20 69 6e 74 20 72 65 67 47 6f 73 75 62  /.  int regGosub
f9f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
fa00: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
fa10: 66 6f 72 20 4f 50 5f 47 6f 73 75 62 20 2a 2f 0a  for OP_Gosub */.
fa20: 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75 62 20    int addrGosub 
fa30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa40: 20 20 2f 2a 20 4f 50 5f 47 6f 73 75 62 20 68 65    /* OP_Gosub he
fa50: 72 65 20 74 6f 20 72 65 74 75 72 6e 20 65 61 63  re to return eac
fa60: 68 20 72 6f 77 20 2a 2f 0a 29 7b 0a 20 20 57 69  h row */.){.  Wi
fa70: 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d  ndow *pMWin = p-
fa80: 3e 70 57 69 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65  >pWin;..  /* The
fa90: 72 65 20 61 72 65 20 74 68 72 65 65 20 64 69 66  re are three dif
faa0: 66 65 72 65 6e 74 20 66 75 6e 63 74 69 6f 6e 73  ferent functions
fab0: 20 74 68 61 74 20 6d 61 79 20 62 65 20 75 73 65   that may be use
fac0: 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b  d to do the work
fad0: 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 6f 6e  .  ** of this on
fae0: 65 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  e, depending on 
faf0: 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61 6d 65  the window frame
fb00: 20 61 6e 64 20 74 68 65 20 73 70 65 63 69 66 69   and the specifi
fb10: 63 20 62 75 69 6c 74 2d 69 6e 0a 20 20 2a 2a 20  c built-in.  ** 
fb20: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73  window functions
fb30: 20 75 73 65 64 20 28 69 66 20 61 6e 79 29 2e 0a   used (if any)..
fb40: 20 20 2a 2a 0a 20 20 2a 2a 20 77 69 6e 64 6f 77    **.  ** window
fb50: 43 6f 64 65 52 6f 77 45 78 70 72 53 74 65 70 28  CodeRowExprStep(
fb60: 29 20 68 61 6e 64 6c 65 73 20 61 6c 6c 20 22 52  ) handles all "R
fb70: 4f 57 53 22 20 77 69 6e 64 6f 77 20 66 72 61 6d  OWS" window fram
fb80: 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72 3a 0a  es, except for:.
fb90: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 52 4f 57 53    **.  **   ROWS
fba0: 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44   BETWEEN UNBOUND
fbb0: 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44  ED PRECEDING AND
fbc0: 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 20 20 2a   CURRENT ROW.  *
fbd0: 2a 0a 20 20 2a 2a 20 54 68 65 20 65 78 63 65 70  *.  ** The excep
fbe0: 74 69 6f 6e 20 69 73 20 62 65 63 61 75 73 65 20  tion is because 
fbf0: 77 69 6e 64 6f 77 43 6f 64 65 52 6f 77 45 78 70  windowCodeRowExp
fc00: 72 53 74 65 70 28 29 20 69 6d 70 6c 65 6d 65 6e  rStep() implemen
fc10: 74 73 20 61 6c 6c 20 77 69 6e 64 6f 77 0a 20 20  ts all window.  
fc20: 2a 2a 20 66 72 61 6d 65 20 74 79 70 65 73 20 62  ** frame types b
fc30: 79 20 63 61 63 68 69 6e 67 20 74 68 65 20 65 6e  y caching the en
fc40: 74 69 72 65 20 70 61 72 74 69 74 69 6f 6e 20 69  tire partition i
fc50: 6e 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2c 20  n a temp table, 
fc60: 61 6e 64 0a 20 20 2a 2a 20 22 52 4f 57 53 20 42  and.  ** "ROWS B
fc70: 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44  ETWEEN UNBOUNDED
fc80: 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 43   PRECEDING AND C
fc90: 55 52 52 45 4e 54 20 52 4f 57 22 20 69 73 20 65  URRENT ROW" is e
fca0: 61 73 79 20 65 6e 6f 75 67 68 20 74 6f 0a 20 20  asy enough to.  
fcb0: 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 77 69 74  ** implement wit
fcc0: 68 6f 75 74 20 73 75 63 68 20 61 20 63 61 63 68  hout such a cach
fcd0: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 69 6e  e..  **.  ** win
fce0: 64 6f 77 43 6f 64 65 43 61 63 68 65 53 74 65 70  dowCodeCacheStep
fcf0: 28 29 20 69 73 20 75 73 65 64 20 66 6f 72 3a 0a  () is used for:.
fd00: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 52 41 4e 47    **.  **   RANG
fd10: 45 20 42 45 54 57 45 45 4e 20 43 55 52 52 45 4e  E BETWEEN CURREN
fd20: 54 20 52 4f 57 20 41 4e 44 20 55 4e 42 4f 55 4e  T ROW AND UNBOUN
fd30: 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20  DED FOLLOWING.  
fd40: 2a 2a 0a 20 20 2a 2a 20 49 74 20 69 73 20 61 6c  **.  ** It is al
fd50: 73 6f 20 75 73 65 64 20 66 6f 72 20 61 6e 79 74  so used for anyt
fd60: 68 69 6e 67 20 6e 6f 74 20 68 61 6e 64 6c 65 64  hing not handled
fd70: 20 62 79 20 77 69 6e 64 6f 77 43 6f 64 65 52 6f   by windowCodeRo
fd80: 77 45 78 70 72 53 74 65 70 28 29 20 0a 20 20 2a  wExprStep() .  *
fd90: 2a 20 74 68 61 74 20 69 6e 76 6f 6b 65 73 20 61  * that invokes a
fda0: 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77   built-in window
fdb0: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 72   function that r
fdc0: 65 71 75 69 72 65 73 20 74 68 65 20 65 6e 74 69  equires the enti
fdd0: 72 65 20 0a 20 20 2a 2a 20 70 61 72 74 69 74 69  re .  ** partiti
fde0: 6f 6e 20 74 6f 20 62 65 20 63 61 63 68 65 64 20  on to be cached 
fdf0: 69 6e 20 61 20 74 65 6d 70 20 74 61 62 6c 65 20  in a temp table 
fe00: 62 65 66 6f 72 65 20 61 6e 79 20 72 6f 77 73 20  before any rows 
fe10: 61 72 65 20 72 65 74 75 72 6e 65 64 0a 20 20 2a  are returned.  *
fe20: 2a 20 28 65 2e 67 2e 20 6e 74 68 5f 76 61 6c 75  * (e.g. nth_valu
fe30: 65 28 29 20 6f 72 20 70 65 72 63 65 6e 74 5f 72  e() or percent_r
fe40: 61 6e 6b 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a  ank())..  **.  *
fe50: 2a 20 46 69 6e 61 6c 6c 79 2c 20 61 73 73 75 6d  * Finally, assum
fe60: 69 6e 67 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ing there is no 
fe70: 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20  built-in window 
fe80: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 72 65  function that re
fe90: 71 75 69 72 65 73 0a 20 20 2a 2a 20 74 68 65 20  quires.  ** the 
fea0: 70 61 72 74 69 74 69 6f 6e 20 74 6f 20 62 65 20  partition to be 
feb0: 63 61 63 68 65 64 2c 20 77 69 6e 64 6f 77 43 6f  cached, windowCo
fec0: 64 65 44 65 66 61 75 6c 74 53 74 65 70 28 29 20  deDefaultStep() 
fed0: 69 73 20 75 73 65 64 20 66 6f 72 3a 0a 20 20 2a  is used for:.  *
fee0: 2a 0a 20 20 2a 2a 20 20 20 52 41 4e 47 45 20 42  *.  **   RANGE B
fef0: 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44  ETWEEN UNBOUNDED
ff00: 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 43   PRECEDING AND C
ff10: 55 52 52 45 4e 54 20 52 4f 57 20 0a 20 20 2a 2a  URRENT ROW .  **
ff20: 20 20 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e     RANGE BETWEEN
ff30: 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45   UNBOUNDED PRECE
ff40: 44 49 4e 47 20 41 4e 44 20 55 4e 42 4f 55 4e 44  DING AND UNBOUND
ff50: 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20 2a  ED FOLLOWING.  *
ff60: 2a 20 20 20 52 41 4e 47 45 20 42 45 54 57 45 45  *   RANGE BETWEE
ff70: 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20 41 4e  N CURRENT ROW AN
ff80: 44 20 43 55 52 52 45 4e 54 20 52 4f 57 20 0a 20  D CURRENT ROW . 
ff90: 20 2a 2a 20 20 20 52 4f 57 53 20 42 45 54 57 45   **   ROWS BETWE
ffa0: 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  EN UNBOUNDED PRE
ffb0: 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45  CEDING AND CURRE
ffc0: 4e 54 20 52 4f 57 0a 20 20 2a 2a 0a 20 20 2a 2a  NT ROW.  **.  **
ffd0: 20 77 69 6e 64 6f 77 43 6f 64 65 44 65 66 61 75   windowCodeDefau
ffe0: 6c 74 53 74 65 70 28 29 20 69 73 20 74 68 65 20  ltStep() is the 
fff0: 6f 6e 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  only one of the 
10000 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 20  three functions 
10010 74 68 61 74 0a 20 20 2a 2a 20 64 6f 65 73 20 6e  that.  ** does n
10020 6f 74 20 63 61 63 68 65 20 65 61 63 68 20 70 61  ot cache each pa
10030 72 74 69 74 69 6f 6e 20 69 6e 20 61 20 74 65 6d  rtition in a tem
10040 70 20 74 61 62 6c 65 20 62 65 66 6f 72 65 20 62  p table before b
10050 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 20 20 2a 2a  eginning to.  **
10060 20 72 65 74 75 72 6e 20 72 6f 77 73 2e 0a 20 20   return rows..  
10070 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  */.  if( pMWin->
10080 65 54 79 70 65 3d 3d 54 4b 5f 52 4f 57 53 20 0a  eType==TK_ROWS .
10090 20 20 20 26 26 20 28 70 4d 57 69 6e 2d 3e 65 53     && (pMWin->eS
100a0 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44  tart!=TK_UNBOUND
100b0 45 44 7c 7c 70 4d 57 69 6e 2d 3e 65 45 6e 64 21  ED||pMWin->eEnd!
100c0 3d 54 4b 5f 43 55 52 52 45 4e 54 7c 7c 21 70 4d  =TK_CURRENT||!pM
100d0 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 29 0a 20  Win->pOrderBy). 
100e0 20 29 7b 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f   ){.    windowCo
100f0 64 65 52 6f 77 45 78 70 72 53 74 65 70 28 70 50  deRowExprStep(pP
10100 61 72 73 65 2c 20 70 2c 20 70 57 49 6e 66 6f 2c  arse, p, pWInfo,
10110 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47   regGosub, addrG
10120 6f 73 75 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  osub);.  }else{.
10130 20 20 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e      Window *pWin
10140 3b 0a 20 20 20 20 69 6e 74 20 62 43 61 63 68 65  ;.    int bCache
10150 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
10160 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75      /* True to u
10170 73 65 20 43 61 63 68 65 53 74 65 70 28 29 20 2a  se CacheStep() *
10180 2f 0a 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e  /..    if( pMWin
10190 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52  ->eStart==TK_CUR
101a0 52 45 4e 54 20 26 26 20 70 4d 57 69 6e 2d 3e 65  RENT && pMWin->e
101b0 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  End==TK_UNBOUNDE
101c0 44 20 29 7b 0a 20 20 20 20 20 20 62 43 61 63 68  D ){.      bCach
101d0 65 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  e = 1;.    }else
101e0 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 57 69 6e  {.      for(pWin
101f0 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57  =pMWin; pWin; pW
10200 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69  in=pWin->pNextWi
10210 6e 29 7b 0a 20 20 20 20 20 20 20 20 46 75 6e 63  n){.        Func
10220 44 65 66 20 2a 70 46 75 6e 63 20 3d 20 70 57 69  Def *pFunc = pWi
10230 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20  n->pFunc;.      
10240 20 20 69 66 28 20 28 70 46 75 6e 63 2d 3e 66 75    if( (pFunc->fu
10250 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
10260 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 5f 53 49 5a  _FUNC_WINDOW_SIZ
10270 45 29 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  E).         || (
10280 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 6e  pFunc->xSFunc==n
10290 74 68 5f 76 61 6c 75 65 53 74 65 70 46 75 6e 63  th_valueStepFunc
102a0 29 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70  ).         || (p
102b0 46 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 66 69  Func->xSFunc==fi
102c0 72 73 74 5f 76 61 6c 75 65 53 74 65 70 46 75 6e  rst_valueStepFun
102d0 63 29 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  c).         || (
102e0 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 6c  pFunc->xSFunc==l
102f0 65 61 64 53 74 65 70 46 75 6e 63 29 0a 20 20 20  eadStepFunc).   
10300 20 20 20 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d        || (pFunc-
10310 3e 78 53 46 75 6e 63 3d 3d 6c 61 67 53 74 65 70  >xSFunc==lagStep
10320 46 75 6e 63 29 0a 20 20 20 20 20 20 20 20 29 7b  Func).        ){
10330 0a 20 20 20 20 20 20 20 20 20 20 62 43 61 63 68  .          bCach
10340 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  e = 1;.         
10350 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
10360 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
10370 0a 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73  .    /* Otherwis
10380 65 2c 20 63 61 6c 6c 20 77 69 6e 64 6f 77 43 6f  e, call windowCo
10390 64 65 44 65 66 61 75 6c 74 53 74 65 70 28 29 2e  deDefaultStep().
103a0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 43 61    */.    if( bCa
103b0 63 68 65 20 29 7b 0a 20 20 20 20 20 20 77 69 6e  che ){.      win
103c0 64 6f 77 43 6f 64 65 43 61 63 68 65 53 74 65 70  dowCodeCacheStep
103d0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 57 49 6e  (pParse, p, pWIn
103e0 66 6f 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64  fo, regGosub, ad
103f0 64 72 47 6f 73 75 62 29 3b 0a 20 20 20 20 7d 65  drGosub);.    }e
10400 6c 73 65 7b 0a 20 20 20 20 20 20 77 69 6e 64 6f  lse{.      windo
10410 77 43 6f 64 65 44 65 66 61 75 6c 74 53 74 65 70  wCodeDefaultStep
10420 28 70 50 61 72 73 65 2c 20 70 2c 20 70 57 49 6e  (pParse, p, pWIn
10430 66 6f 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64  fo, regGosub, ad
10440 64 72 47 6f 73 75 62 29 3b 0a 20 20 20 20 7d 0a  drGosub);.    }.
10450 20 20 7d 0a 7d 0a 0a                               }.}..