/ Hex Artifact Content
Login

Artifact d80ec071618365ed740495848c1ea05a674bf83c498acff10b3ab7a4209a37cc:


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 69 66 28 20 70 2d  [0]);.    if( p-
2c00: 3e 70 56 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  >pVal==0 ){.    
2c10: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
2c20: 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74  _error_nomem(pCt
2c30: 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  x);.    }else{. 
2c40: 20 20 20 20 20 70 2d 3e 6e 56 61 6c 2b 2b 3b 0a       p->nVal++;.
2c50: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74      }.  }.}.stat
2c60: 69 63 20 76 6f 69 64 20 6c 61 73 74 5f 76 61 6c  ic void last_val
2c70: 75 65 49 6e 76 46 75 6e 63 28 0a 20 20 73 71 6c  ueInvFunc(.  sql
2c80: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
2c90: 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c  tx, .  int nArg,
2ca0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
2cb0: 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20 73 74   **apArg.){.  st
2cc0: 72 75 63 74 20 4c 61 73 74 56 61 6c 75 65 43 74  ruct LastValueCt
2cd0: 78 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72  x *p;.  p = (str
2ce0: 75 63 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78  uct LastValueCtx
2cf0: 20 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65   *)sqlite3_aggre
2d00: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74  gate_context(pCt
2d10: 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  x, sizeof(*p));.
2d20: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70    if( p ){.    p
2d30: 2d 3e 6e 56 61 6c 2d 2d 3b 0a 20 20 20 20 69 66  ->nVal--;.    if
2d40: 28 20 70 2d 3e 6e 56 61 6c 3d 3d 30 20 29 7b 0a  ( p->nVal==0 ){.
2d50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
2d60: 6c 75 65 5f 66 72 65 65 28 70 2d 3e 70 56 61 6c  lue_free(p->pVal
2d70: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 56 61 6c  );.      p->pVal
2d80: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
2d90: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 61  }.static void la
2da0: 73 74 5f 76 61 6c 75 65 56 61 6c 75 65 46 75 6e  st_valueValueFun
2db0: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
2dc0: 74 20 2a 70 43 74 78 29 7b 0a 20 20 73 74 72 75  t *pCtx){.  stru
2dd0: 63 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 20  ct LastValueCtx 
2de0: 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63  *p;.  p = (struc
2df0: 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 20 2a  t LastValueCtx *
2e00: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
2e10: 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c  te_context(pCtx,
2e20: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
2e30: 69 66 28 20 70 20 26 26 20 70 2d 3e 70 56 61 6c  if( p && p->pVal
2e40: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
2e50: 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 70 43 74  result_value(pCt
2e60: 78 2c 20 70 2d 3e 70 56 61 6c 29 3b 0a 20 20 7d  x, p->pVal);.  }
2e70: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  .}.static void l
2e80: 61 73 74 5f 76 61 6c 75 65 46 69 6e 61 6c 69 7a  ast_valueFinaliz
2e90: 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  eFunc(sqlite3_co
2ea0: 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20 20  ntext *pCtx){.  
2eb0: 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75 65  struct LastValue
2ec0: 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73  Ctx *p;.  p = (s
2ed0: 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75 65 43  truct LastValueC
2ee0: 74 78 20 2a 29 73 71 6c 69 74 65 33 5f 61 67 67  tx *)sqlite3_agg
2ef0: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70  regate_context(p
2f00: 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  Ctx, sizeof(*p))
2f10: 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e  ;.  if( p && p->
2f20: 70 56 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69  pVal ){.    sqli
2f30: 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65  te3_result_value
2f40: 28 70 43 74 78 2c 20 70 2d 3e 70 56 61 6c 29 3b  (pCtx, p->pVal);
2f50: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  .    sqlite3_val
2f60: 75 65 5f 66 72 65 65 28 70 2d 3e 70 56 61 6c 29  ue_free(p->pVal)
2f70: 3b 0a 20 20 20 20 70 2d 3e 70 56 61 6c 20 3d 20  ;.    p->pVal = 
2f80: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
2f90: 4e 6f 2d 6f 70 20 69 6d 70 6c 65 6d 65 6e 74 61  No-op implementa
2fa0: 74 69 6f 6e 73 20 6f 66 20 6e 74 68 5f 76 61 6c  tions of nth_val
2fb0: 75 65 28 29 2c 20 66 69 72 73 74 5f 76 61 6c 75  ue(), first_valu
2fc0: 65 28 29 2c 20 6c 65 61 64 28 29 20 61 6e 64 20  e(), lead() and 
2fd0: 6c 61 67 28 29 2e 0a 2a 2a 20 54 68 65 73 65 20  lag()..** These 
2fe0: 61 72 65 20 61 6c 6c 20 69 6d 70 6c 65 6d 65 6e  are all implemen
2ff0: 74 65 64 20 69 6e 6c 69 6e 65 20 75 73 69 6e 67  ted inline using
3000: 20 56 44 42 45 20 69 6e 73 74 72 75 63 74 69 6f   VDBE instructio
3010: 6e 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ns. .*/.static v
3020: 6f 69 64 20 6e 74 68 5f 76 61 6c 75 65 53 74 65  oid nth_valueSte
3030: 70 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  pFunc(sqlite3_co
3040: 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 69 6e 74  ntext *pCtx, int
3050: 20 6e 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   n, sqlite3_valu
3060: 65 20 2a 2a 61 29 7b 7d 0a 73 74 61 74 69 63 20  e **a){}.static 
3070: 76 6f 69 64 20 6e 74 68 5f 76 61 6c 75 65 49 6e  void nth_valueIn
3080: 76 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  vFunc(sqlite3_co
3090: 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 69 6e 74  ntext *pCtx, int
30a0: 20 6e 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   n, sqlite3_valu
30b0: 65 20 2a 2a 61 70 29 7b 7d 0a 73 74 61 74 69 63  e **ap){}.static
30c0: 20 76 6f 69 64 20 6e 74 68 5f 76 61 6c 75 65 56   void nth_valueV
30d0: 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33  alueFunc(sqlite3
30e0: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b  _context *pCtx){
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 53 74 65 70 46 75 6e  rst_valueStepFun
3110: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
3120: 74 20 2a 70 2c 20 69 6e 74 20 6e 2c 20 73 71 6c  t *p, int n, sql
3130: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 29  ite3_value **ap)
3140: 7b 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  {}.static void f
3150: 69 72 73 74 5f 76 61 6c 75 65 49 6e 76 46 75 6e  irst_valueInvFun
3160: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
3170: 74 20 2a 70 2c 20 69 6e 74 20 6e 2c 20 73 71 6c  t *p, int n, sql
3180: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 29  ite3_value **ap)
3190: 7b 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  {}.static void f
31a0: 69 72 73 74 5f 76 61 6c 75 65 56 61 6c 75 65 46  irst_valueValueF
31b0: 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
31c0: 65 78 74 20 2a 70 43 74 78 29 7b 7d 0a 73 74 61  ext *pCtx){}.sta
31d0: 74 69 63 20 76 6f 69 64 20 6c 65 61 64 53 74 65  tic void leadSte
31e0: 70 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  pFunc(sqlite3_co
31f0: 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 69 6e 74  ntext *pCtx, int
3200: 20 6e 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   n, sqlite3_valu
3210: 65 20 2a 2a 61 70 29 7b 7d 0a 73 74 61 74 69 63  e **ap){}.static
3220: 20 76 6f 69 64 20 6c 65 61 64 49 6e 76 46 75 6e   void leadInvFun
3230: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
3240: 74 20 2a 70 43 74 78 2c 20 69 6e 74 20 6e 2c 20  t *pCtx, int n, 
3250: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
3260: 61 70 29 7b 7d 0a 73 74 61 74 69 63 20 76 6f 69  ap){}.static voi
3270: 64 20 6c 65 61 64 56 61 6c 75 65 46 75 6e 63 28  d leadValueFunc(
3280: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
3290: 2a 70 43 74 78 29 7b 7d 0a 73 74 61 74 69 63 20  *pCtx){}.static 
32a0: 76 6f 69 64 20 6c 61 67 53 74 65 70 46 75 6e 63  void lagStepFunc
32b0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
32c0: 20 2a 70 43 74 78 2c 20 69 6e 74 20 6e 2c 20 73   *pCtx, int n, s
32d0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
32e0: 70 29 7b 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  p){}.static void
32f0: 20 6c 61 67 49 6e 76 46 75 6e 63 28 73 71 6c 69   lagInvFunc(sqli
3300: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
3310: 78 2c 20 69 6e 74 20 6e 2c 20 73 71 6c 69 74 65  x, int n, sqlite
3320: 33 5f 76 61 6c 75 65 20 2a 2a 61 70 29 7b 7d 0a  3_value **ap){}.
3330: 73 74 61 74 69 63 20 76 6f 69 64 20 6c 61 67 56  static void lagV
3340: 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33  alueFunc(sqlite3
3350: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b  _context *pCtx){
3360: 7d 0a 0a 23 64 65 66 69 6e 65 20 57 49 4e 44 4f  }..#define WINDO
3370: 57 46 55 4e 43 28 6e 61 6d 65 2c 6e 41 72 67 2c  WFUNC(name,nArg,
3380: 65 78 74 72 61 29 20 7b 20 20 20 20 20 20 20 20  extra) {        
3390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
33b0: 20 20 6e 41 72 67 2c 20 28 53 51 4c 49 54 45 5f    nArg, (SQLITE_
33c0: 55 54 46 38 7c 53 51 4c 49 54 45 5f 46 55 4e 43  UTF8|SQLITE_FUNC
33d0: 5f 57 49 4e 44 4f 57 7c 65 78 74 72 61 29 2c 20  _WINDOW|extra), 
33e0: 30 2c 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  0, 0,           
33f0: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6e             \.  n
3400: 61 6d 65 20 23 23 20 53 74 65 70 46 75 6e 63 2c  ame ## StepFunc,
3410: 20 6e 61 6d 65 20 23 23 20 56 61 6c 75 65 46 75   name ## ValueFu
3420: 6e 63 2c 20 6e 61 6d 65 20 23 23 20 56 61 6c 75  nc, name ## Valu
3430: 65 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20  eFunc,          
3440: 20 20 20 20 20 20 20 20 5c 0a 20 20 6e 61 6d 65          \.  name
3450: 20 23 23 20 49 6e 76 46 75 6e 63 2c 20 23 6e 61   ## InvFunc, #na
3460: 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  me              
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: 20 5c 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 57 49   \.}..#define WI
34a0: 4e 44 4f 57 46 55 4e 43 46 28 6e 61 6d 65 2c 6e  NDOWFUNCF(name,n
34b0: 41 72 67 2c 65 78 74 72 61 29 20 7b 20 20 20 20  Arg,extra) {    
34c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34e0: 20 5c 0a 20 20 6e 41 72 67 2c 20 28 53 51 4c 49   \.  nArg, (SQLI
34f0: 54 45 5f 55 54 46 38 7c 53 51 4c 49 54 45 5f 46  TE_UTF8|SQLITE_F
3500: 55 4e 43 5f 57 49 4e 44 4f 57 7c 65 78 74 72 61  UNC_WINDOW|extra
3510: 29 2c 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20  ), 0, 0,        
3520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
3530: 20 20 6e 61 6d 65 20 23 23 20 53 74 65 70 46 75    name ## StepFu
3540: 6e 63 2c 20 6e 61 6d 65 20 23 23 20 46 69 6e 61  nc, name ## Fina
3550: 6c 69 7a 65 46 75 6e 63 2c 20 6e 61 6d 65 20 23  lizeFunc, name #
3560: 23 20 56 61 6c 75 65 46 75 6e 63 2c 20 20 20 20  # ValueFunc,    
3570: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6e             \.  n
3580: 61 6d 65 20 23 23 20 49 6e 76 46 75 6e 63 2c 20  ame ## InvFunc, 
3590: 23 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20  #name           
35a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c0: 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52      \.}../*.** R
35d0: 65 67 69 73 74 65 72 20 74 68 6f 73 65 20 62 75  egister those bu
35e0: 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75  ilt-in window fu
35f0: 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 61 72 65  nctions that are
3600: 20 6e 6f 74 20 61 6c 73 6f 20 61 67 67 72 65 67   not also aggreg
3610: 61 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ates..*/.void sq
3620: 6c 69 74 65 33 57 69 6e 64 6f 77 46 75 6e 63 74  lite3WindowFunct
3630: 69 6f 6e 73 28 76 6f 69 64 29 7b 0a 20 20 73 74  ions(void){.  st
3640: 61 74 69 63 20 46 75 6e 63 44 65 66 20 61 57 69  atic FuncDef aWi
3650: 6e 64 6f 77 46 75 6e 63 73 5b 5d 20 3d 20 7b 0a  ndowFuncs[] = {.
3660: 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 28 72      WINDOWFUNC(r
3670: 6f 77 5f 6e 75 6d 62 65 72 2c 20 30 2c 20 30 29  ow_number, 0, 0)
3680: 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43  ,.    WINDOWFUNC
3690: 28 64 65 6e 73 65 5f 72 61 6e 6b 2c 20 30 2c 20  (dense_rank, 0, 
36a0: 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46 55  0),.    WINDOWFU
36b0: 4e 43 28 72 61 6e 6b 2c 20 30 2c 20 30 29 2c 0a  NC(rank, 0, 0),.
36c0: 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 28 70      WINDOWFUNC(p
36d0: 65 72 63 65 6e 74 5f 72 61 6e 6b 2c 20 30 2c 20  ercent_rank, 0, 
36e0: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44  SQLITE_FUNC_WIND
36f0: 4f 57 5f 53 49 5a 45 29 2c 0a 20 20 20 20 57 49  OW_SIZE),.    WI
3700: 4e 44 4f 57 46 55 4e 43 28 63 75 6d 65 5f 64 69  NDOWFUNC(cume_di
3710: 73 74 2c 20 30 2c 20 53 51 4c 49 54 45 5f 46 55  st, 0, SQLITE_FU
3720: 4e 43 5f 57 49 4e 44 4f 57 5f 53 49 5a 45 29 2c  NC_WINDOW_SIZE),
3730: 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 28  .    WINDOWFUNC(
3740: 6e 74 69 6c 65 2c 20 31 2c 20 53 51 4c 49 54 45  ntile, 1, SQLITE
3750: 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 5f 53 49 5a  _FUNC_WINDOW_SIZ
3760: 45 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46 55  E),.    WINDOWFU
3770: 4e 43 46 28 6c 61 73 74 5f 76 61 6c 75 65 2c 20  NCF(last_value, 
3780: 31 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f  1, 0),.    WINDO
3790: 57 46 55 4e 43 28 6e 74 68 5f 76 61 6c 75 65 2c  WFUNC(nth_value,
37a0: 20 32 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44   2, 0),.    WIND
37b0: 4f 57 46 55 4e 43 28 66 69 72 73 74 5f 76 61 6c  OWFUNC(first_val
37c0: 75 65 2c 20 31 2c 20 30 29 2c 0a 20 20 20 20 57  ue, 1, 0),.    W
37d0: 49 4e 44 4f 57 46 55 4e 43 28 6c 65 61 64 2c 20  INDOWFUNC(lead, 
37e0: 31 2c 20 30 29 2c 20 57 49 4e 44 4f 57 46 55 4e  1, 0), WINDOWFUN
37f0: 43 28 6c 65 61 64 2c 20 32 2c 20 30 29 2c 20 57  C(lead, 2, 0), W
3800: 49 4e 44 4f 57 46 55 4e 43 28 6c 65 61 64 2c 20  INDOWFUNC(lead, 
3810: 33 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f  3, 0),.    WINDO
3820: 57 46 55 4e 43 28 6c 61 67 2c 20 31 2c 20 30 29  WFUNC(lag, 1, 0)
3830: 2c 20 20 57 49 4e 44 4f 57 46 55 4e 43 28 6c 61  ,  WINDOWFUNC(la
3840: 67 2c 20 32 2c 20 30 29 2c 20 20 57 49 4e 44 4f  g, 2, 0),  WINDO
3850: 57 46 55 4e 43 28 6c 61 67 2c 20 33 2c 20 30 29  WFUNC(lag, 3, 0)
3860: 2c 0a 20 20 7d 3b 0a 20 20 73 71 6c 69 74 65 33  ,.  };.  sqlite3
3870: 49 6e 73 65 72 74 42 75 69 6c 74 69 6e 46 75 6e  InsertBuiltinFun
3880: 63 73 28 61 57 69 6e 64 6f 77 46 75 6e 63 73 2c  cs(aWindowFuncs,
3890: 20 41 72 72 61 79 53 69 7a 65 28 61 57 69 6e 64   ArraySize(aWind
38a0: 6f 77 46 75 6e 63 73 29 29 3b 0a 7d 0a 0a 2f 2a  owFuncs));.}../*
38b0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
38c0: 6e 20 69 73 20 63 61 6c 6c 65 64 20 69 6d 6d 65  n is called imme
38d0: 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 72 65  diately after re
38e0: 73 6f 6c 76 69 6e 67 20 74 68 65 20 66 75 6e 63  solving the func
38f0: 74 69 6f 6e 20 6e 61 6d 65 0a 2a 2a 20 66 6f 72  tion name.** for
3900: 20 61 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69   a window functi
3910: 6f 6e 20 77 69 74 68 69 6e 20 61 20 53 45 4c 45  on within a SELE
3920: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 41 72  CT statement. Ar
3930: 67 75 6d 65 6e 74 20 70 4c 69 73 74 20 69 73 20  gument pList is 
3940: 61 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74  a.** linked list
3950: 20 6f 66 20 57 49 4e 44 4f 57 20 64 65 66 69 6e   of WINDOW defin
3960: 69 74 69 6f 6e 73 20 66 6f 72 20 74 68 65 20 63  itions for the c
3970: 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74  urrent SELECT st
3980: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 41 72 67 75  atement..** Argu
3990: 6d 65 6e 74 20 70 46 75 6e 63 20 69 73 20 74 68  ment pFunc is th
39a0: 65 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e  e function defin
39b0: 69 74 69 6f 6e 20 6a 75 73 74 20 72 65 73 6f 6c  ition just resol
39c0: 76 65 64 20 61 6e 64 20 70 57 69 6e 0a 2a 2a 20  ved and pWin.** 
39d0: 69 73 20 74 68 65 20 57 69 6e 64 6f 77 20 6f 62  is the Window ob
39e0: 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74 69 6e  ject representin
39f0: 67 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  g the associated
3a00: 20 4f 56 45 52 20 63 6c 61 75 73 65 2e 20 54 68   OVER clause. Th
3a10: 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 75  is.** function u
3a20: 70 64 61 74 65 73 20 74 68 65 20 63 6f 6e 74 65  pdates the conte
3a30: 6e 74 73 20 6f 66 20 70 57 69 6e 20 61 73 20 66  nts of pWin as f
3a40: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
3a50: 2a 20 49 66 20 74 68 65 20 4f 56 45 52 20 63 6c  * If the OVER cl
3a60: 61 75 73 65 20 72 65 66 65 72 65 64 20 74 6f 20  ause refered to 
3a70: 61 20 6e 61 6d 65 64 20 77 69 6e 64 6f 77 20 28  a named window (
3a80: 61 73 20 69 6e 20 22 6d 61 78 28 78 29 20 4f 56  as in "max(x) OV
3a90: 45 52 20 77 69 6e 22 29 2c 0a 2a 2a 20 20 20 20  ER win"),.**    
3aa0: 20 73 65 61 72 63 68 20 6c 69 73 74 20 70 4c 69   search list pLi
3ab0: 73 74 20 66 6f 72 20 61 20 6d 61 74 63 68 69 6e  st for a matchin
3ac0: 67 20 57 49 4e 44 4f 57 20 64 65 66 69 6e 69 74  g WINDOW definit
3ad0: 69 6f 6e 2c 20 61 6e 64 20 75 70 64 61 74 65 20  ion, and update 
3ae0: 70 57 69 6e 0a 2a 2a 20 20 20 20 20 61 63 63 6f  pWin.**     acco
3af0: 72 64 69 6e 67 6c 79 2e 20 49 66 20 6e 6f 20 73  rdingly. If no s
3b00: 75 63 68 20 57 49 4e 44 4f 57 20 63 6c 61 75 73  uch WINDOW claus
3b10: 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20  e can be found, 
3b20: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 0a 2a  leave an error.*
3b30: 2a 20 20 20 20 20 69 6e 20 70 50 61 72 73 65 2e  *     in pParse.
3b40: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68  .**.**   * If th
3b50: 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  e function is a 
3b60: 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20  built-in window 
3b70: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 72 65  function that re
3b80: 71 75 69 72 65 73 20 74 68 65 0a 2a 2a 20 20 20  quires the.**   
3b90: 20 20 77 69 6e 64 6f 77 20 74 6f 20 62 65 20 63    window to be c
3ba0: 6f 65 72 63 65 64 20 28 73 65 65 20 22 42 55 49  oerced (see "BUI
3bb0: 4c 54 2d 49 4e 20 57 49 4e 44 4f 57 20 46 55 4e  LT-IN WINDOW FUN
3bc0: 43 54 49 4f 4e 53 22 20 61 74 20 74 68 65 20 74  CTIONS" at the t
3bd0: 6f 70 0a 2a 2a 20 20 20 20 20 6f 66 20 74 68 69  op.**     of thi
3be0: 73 20 66 69 6c 65 29 2c 20 70 57 69 6e 20 69 73  s file), pWin is
3bf0: 20 75 70 64 61 74 65 64 20 68 65 72 65 2e 0a 2a   updated here..*
3c00: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69  /.void sqlite3Wi
3c10: 6e 64 6f 77 55 70 64 61 74 65 28 0a 20 20 50 61  ndowUpdate(.  Pa
3c20: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20  rse *pParse, .  
3c30: 57 69 6e 64 6f 77 20 2a 70 4c 69 73 74 2c 20 20  Window *pList,  
3c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c50: 2f 2a 20 4c 69 73 74 20 6f 66 20 6e 61 6d 65 64  /* List of named
3c60: 20 77 69 6e 64 6f 77 73 20 66 6f 72 20 74 68 69   windows for thi
3c70: 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 57 69  s SELECT */.  Wi
3c80: 6e 64 6f 77 20 2a 70 57 69 6e 2c 20 20 20 20 20  ndow *pWin,     
3c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3ca0: 20 57 69 6e 64 6f 77 20 66 72 61 6d 65 20 74 6f   Window frame to
3cb0: 20 75 70 64 61 74 65 20 2a 2f 0a 20 20 46 75 6e   update */.  Fun
3cc0: 63 44 65 66 20 2a 70 46 75 6e 63 20 20 20 20 20  cDef *pFunc     
3cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3ce0: 57 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  Window function 
3cf0: 64 65 66 69 6e 69 74 69 6f 6e 20 2a 2f 0a 29 7b  definition */.){
3d00: 0a 20 20 69 66 28 20 70 57 69 6e 2d 3e 7a 4e 61  .  if( pWin->zNa
3d10: 6d 65 20 29 7b 0a 20 20 20 20 57 69 6e 64 6f 77  me ){.    Window
3d20: 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70   *p;.    for(p=p
3d30: 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  List; p; p=p->pN
3d40: 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 20 20 69  extWin){.      i
3d50: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
3d60: 70 28 70 2d 3e 7a 4e 61 6d 65 2c 20 70 57 69 6e  p(p->zName, pWin
3d70: 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ->zName)==0 ) br
3d80: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
3d90: 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( p==0 ){.     
3da0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
3db0: 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
3dc0: 68 20 77 69 6e 64 6f 77 3a 20 25 73 22 2c 20 70  h window: %s", p
3dd0: 57 69 6e 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Win->zName);.   
3de0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
3df0: 0a 20 20 20 20 70 57 69 6e 2d 3e 70 50 61 72 74  .    pWin->pPart
3e00: 69 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 45  ition = sqlite3E
3e10: 78 70 72 4c 69 73 74 44 75 70 28 70 50 61 72 73  xprListDup(pPars
3e20: 65 2d 3e 64 62 2c 20 70 2d 3e 70 50 61 72 74 69  e->db, p->pParti
3e30: 74 69 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 70 57  tion, 0);.    pW
3e40: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73  in->pOrderBy = s
3e50: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
3e60: 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d  p(pParse->db, p-
3e70: 3e 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 20  >pOrderBy, 0);. 
3e80: 20 20 20 70 57 69 6e 2d 3e 70 53 74 61 72 74 20     pWin->pStart 
3e90: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
3ea0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e  (pParse->db, p->
3eb0: 70 53 74 61 72 74 2c 20 30 29 3b 0a 20 20 20 20  pStart, 0);.    
3ec0: 70 57 69 6e 2d 3e 70 45 6e 64 20 3d 20 73 71 6c  pWin->pEnd = sql
3ed0: 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72  ite3ExprDup(pPar
3ee0: 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 45 6e 64 2c  se->db, p->pEnd,
3ef0: 20 30 29 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 65   0);.    pWin->e
3f00: 53 74 61 72 74 20 3d 20 70 2d 3e 65 53 74 61 72  Start = p->eStar
3f10: 74 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 65 45 6e  t;.    pWin->eEn
3f20: 64 20 3d 20 70 2d 3e 65 45 6e 64 3b 0a 20 20 7d  d = p->eEnd;.  }
3f30: 0a 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 66 75  .  if( pFunc->fu
3f40: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
3f50: 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 20 29 7b 0a  _FUNC_WINDOW ){.
3f60: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
3f70: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
3f80: 20 20 69 66 28 20 70 57 69 6e 2d 3e 70 46 69 6c    if( pWin->pFil
3f90: 74 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ter ){.      sql
3fa0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
3fb0: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
3fc0: 22 46 49 4c 54 45 52 20 63 6c 61 75 73 65 20 6d  "FILTER clause m
3fd0: 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20  ay only be used 
3fe0: 77 69 74 68 20 61 67 67 72 65 67 61 74 65 20 77  with aggregate w
3ff0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 22  indow functions"
4000: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 65  .      );.    }e
4010: 6c 73 65 0a 20 20 20 20 69 66 28 20 70 46 75 6e  lse.    if( pFun
4020: 63 2d 3e 78 53 46 75 6e 63 3d 3d 72 6f 77 5f 6e  c->xSFunc==row_n
4030: 75 6d 62 65 72 53 74 65 70 46 75 6e 63 20 7c 7c  umberStepFunc ||
4040: 20 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d   pFunc->xSFunc==
4050: 6e 74 69 6c 65 53 74 65 70 46 75 6e 63 20 29 7b  ntileStepFunc ){
4060: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
4070: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 57 69  prDelete(db, pWi
4080: 6e 2d 3e 70 53 74 61 72 74 29 3b 0a 20 20 20 20  n->pStart);.    
4090: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
40a0: 65 74 65 28 64 62 2c 20 70 57 69 6e 2d 3e 70 45  ete(db, pWin->pE
40b0: 6e 64 29 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d  nd);.      pWin-
40c0: 3e 70 53 74 61 72 74 20 3d 20 70 57 69 6e 2d 3e  >pStart = pWin->
40d0: 70 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  pEnd = 0;.      
40e0: 70 57 69 6e 2d 3e 65 54 79 70 65 20 3d 20 54 4b  pWin->eType = TK
40f0: 5f 52 4f 57 53 3b 0a 20 20 20 20 20 20 70 57 69  _ROWS;.      pWi
4100: 6e 2d 3e 65 53 74 61 72 74 20 3d 20 54 4b 5f 55  n->eStart = TK_U
4110: 4e 42 4f 55 4e 44 45 44 3b 0a 20 20 20 20 20 20  NBOUNDED;.      
4120: 70 57 69 6e 2d 3e 65 45 6e 64 20 3d 20 54 4b 5f  pWin->eEnd = TK_
4130: 43 55 52 52 45 4e 54 3b 0a 20 20 20 20 7d 65 6c  CURRENT;.    }el
4140: 73 65 0a 0a 20 20 20 20 69 66 28 20 70 46 75 6e  se..    if( pFun
4150: 63 2d 3e 78 53 46 75 6e 63 3d 3d 64 65 6e 73 65  c->xSFunc==dense
4160: 5f 72 61 6e 6b 53 74 65 70 46 75 6e 63 20 7c 7c  _rankStepFunc ||
4170: 20 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d   pFunc->xSFunc==
4180: 72 61 6e 6b 53 74 65 70 46 75 6e 63 0a 20 20 20  rankStepFunc.   
4190: 20 20 7c 7c 20 70 46 75 6e 63 2d 3e 78 53 46 75    || pFunc->xSFu
41a0: 6e 63 3d 3d 70 65 72 63 65 6e 74 5f 72 61 6e 6b  nc==percent_rank
41b0: 53 74 65 70 46 75 6e 63 20 7c 7c 20 70 46 75 6e  StepFunc || pFun
41c0: 63 2d 3e 78 53 46 75 6e 63 3d 3d 63 75 6d 65 5f  c->xSFunc==cume_
41d0: 64 69 73 74 53 74 65 70 46 75 6e 63 0a 20 20 20  distStepFunc.   
41e0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
41f0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
4200: 70 57 69 6e 2d 3e 70 53 74 61 72 74 29 3b 0a 20  pWin->pStart);. 
4210: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
4220: 44 65 6c 65 74 65 28 64 62 2c 20 70 57 69 6e 2d  Delete(db, pWin-
4230: 3e 70 45 6e 64 29 3b 0a 20 20 20 20 20 20 70 57  >pEnd);.      pW
4240: 69 6e 2d 3e 70 53 74 61 72 74 20 3d 20 70 57 69  in->pStart = pWi
4250: 6e 2d 3e 70 45 6e 64 20 3d 20 30 3b 0a 20 20 20  n->pEnd = 0;.   
4260: 20 20 20 70 57 69 6e 2d 3e 65 54 79 70 65 20 3d     pWin->eType =
4270: 20 54 4b 5f 52 41 4e 47 45 3b 0a 20 20 20 20 20   TK_RANGE;.     
4280: 20 70 57 69 6e 2d 3e 65 53 74 61 72 74 20 3d 20   pWin->eStart = 
4290: 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 3b 0a 20 20  TK_UNBOUNDED;.  
42a0: 20 20 20 20 70 57 69 6e 2d 3e 65 45 6e 64 20 3d      pWin->eEnd =
42b0: 20 54 4b 5f 43 55 52 52 45 4e 54 3b 0a 20 20 20   TK_CURRENT;.   
42c0: 20 7d 0a 20 20 7d 0a 20 20 70 57 69 6e 2d 3e 70   }.  }.  pWin->p
42d0: 46 75 6e 63 20 3d 20 70 46 75 6e 63 3b 0a 7d 0a  Func = pFunc;.}.
42e0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65 78 74 20 6f  ./*.** Context o
42f0: 62 6a 65 63 74 20 70 61 73 73 65 64 20 74 68 72  bject passed thr
4300: 6f 75 67 68 20 73 71 6c 69 74 65 33 57 61 6c 6b  ough sqlite3Walk
4310: 45 78 70 72 4c 69 73 74 28 29 20 74 6f 0a 2a 2a  ExprList() to.**
4320: 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77   selectWindowRew
4330: 72 69 74 65 45 78 70 72 43 62 28 29 20 62 79 20  riteExprCb() by 
4340: 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72  selectWindowRewr
4350: 69 74 65 45 4c 69 73 74 28 29 2e 0a 2a 2f 0a 74  iteEList()..*/.t
4360: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57 69  ypedef struct Wi
4370: 6e 64 6f 77 52 65 77 72 69 74 65 20 57 69 6e 64  ndowRewrite Wind
4380: 6f 77 52 65 77 72 69 74 65 3b 0a 73 74 72 75 63  owRewrite;.struc
4390: 74 20 57 69 6e 64 6f 77 52 65 77 72 69 74 65 20  t WindowRewrite 
43a0: 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e  {.  Window *pWin
43b0: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 53  ;.  ExprList *pS
43c0: 75 62 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61  ub;.};../*.** Ca
43d0: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
43e0: 75 73 65 64 20 62 79 20 73 65 6c 65 63 74 57 69  used by selectWi
43f0: 6e 64 6f 77 52 65 77 72 69 74 65 45 4c 69 73 74  ndowRewriteEList
4400: 28 29 2e 20 49 66 20 6e 65 63 65 73 73 61 72 79  (). If necessary
4410: 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  ,.** this functi
4420: 6f 6e 20 61 70 70 65 6e 64 73 20 74 6f 20 74 68  on appends to th
4430: 65 20 6f 75 74 70 75 74 20 65 78 70 72 65 73 73  e output express
4440: 69 6f 6e 2d 6c 69 73 74 20 61 6e 64 20 75 70 64  ion-list and upd
4450: 61 74 65 73 20 0a 2a 2a 20 65 78 70 72 65 73 73  ates .** express
4460: 69 6f 6e 20 28 2a 70 70 45 78 70 72 29 20 69 6e  ion (*ppExpr) in
4470: 20 70 6c 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69   place..*/.stati
4480: 63 20 69 6e 74 20 73 65 6c 65 63 74 57 69 6e 64  c int selectWind
4490: 6f 77 52 65 77 72 69 74 65 45 78 70 72 43 62 28  owRewriteExprCb(
44a0: 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
44b0: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
44c0: 20 73 74 72 75 63 74 20 57 69 6e 64 6f 77 52 65   struct WindowRe
44d0: 77 72 69 74 65 20 2a 70 20 3d 20 70 57 61 6c 6b  write *p = pWalk
44e0: 65 72 2d 3e 75 2e 70 52 65 77 72 69 74 65 3b 0a  er->u.pRewrite;.
44f0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
4500: 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
4510: 65 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45  e;..  switch( pE
4520: 78 70 72 2d 3e 6f 70 20 29 7b 0a 0a 20 20 20 20  xpr->op ){..    
4530: 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  case TK_FUNCTION
4540: 3a 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  :.      if( pExp
4550: 72 2d 3e 70 57 69 6e 3d 3d 30 20 29 7b 0a 20 20  r->pWin==0 ){.  
4560: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4570: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4580: 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a    Window *pWin;.
4590: 20 20 20 20 20 20 20 20 66 6f 72 28 70 57 69 6e          for(pWin
45a0: 3d 70 2d 3e 70 57 69 6e 3b 20 70 57 69 6e 3b 20  =p->pWin; pWin; 
45b0: 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74  pWin=pWin->pNext
45c0: 57 69 6e 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Win){.          
45d0: 69 66 28 20 70 45 78 70 72 2d 3e 70 57 69 6e 3d  if( pExpr->pWin=
45e0: 3d 70 57 69 6e 20 29 7b 0a 20 20 20 20 20 20 20  =pWin ){.       
45f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69       assert( pWi
4600: 6e 2d 3e 70 4f 77 6e 65 72 3d 3d 70 45 78 70 72  n->pOwner==pExpr
4610: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
4620: 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
4630: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
4640: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
4650: 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
4660: 72 6f 75 67 68 2e 20 20 2a 2f 0a 0a 20 20 20 20  rough.  */..    
4670: 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
4680: 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  TION:.    case T
4690: 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
46a0: 20 20 45 78 70 72 20 2a 70 44 75 70 20 3d 20 73    Expr *pDup = s
46b0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50  qlite3ExprDup(pP
46c0: 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c  arse->db, pExpr,
46d0: 20 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 53   0);.      p->pS
46e0: 75 62 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ub = sqlite3Expr
46f0: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
4700: 65 2c 20 70 2d 3e 70 53 75 62 2c 20 70 44 75 70  e, p->pSub, pDup
4710: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
4720: 70 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pSub ){.        
4730: 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50  assert( ExprHasP
4740: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
4750: 50 5f 53 74 61 74 69 63 29 3d 3d 30 20 29 3b 0a  P_Static)==0 );.
4760: 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74 50          ExprSetP
4770: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
4780: 50 5f 53 74 61 74 69 63 29 3b 0a 20 20 20 20 20  P_Static);.     
4790: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
47a0: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
47b0: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20   pExpr);.       
47c0: 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72   ExprClearProper
47d0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 74 61  ty(pExpr, EP_Sta
47e0: 74 69 63 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  tic);.        me
47f0: 6d 73 65 74 28 70 45 78 70 72 2c 20 30 2c 20 73  mset(pExpr, 0, s
4800: 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 0a 20  izeof(Expr));.. 
4810: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
4820: 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20   = TK_COLUMN;.  
4830: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
4840: 6c 75 6d 6e 20 3d 20 70 2d 3e 70 53 75 62 2d 3e  lumn = p->pSub->
4850: 6e 45 78 70 72 2d 31 3b 0a 20 20 20 20 20 20 20  nExpr-1;.       
4860: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
4870: 20 70 2d 3e 70 57 69 6e 2d 3e 69 45 70 68 43 73   p->pWin->iEphCs
4880: 72 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  r;.      }..    
4890: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
48a0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 2f 2a 20      default: /* 
48b0: 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 62  no-op */.      b
48c0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  reak;.  }..  ret
48d0: 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
48e0: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73  ;.}.static int s
48f0: 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69  electWindowRewri
4900: 74 65 53 65 6c 65 63 74 43 62 28 57 61 6c 6b 65  teSelectCb(Walke
4910: 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
4920: 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
4930: 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
4940: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72  ;.}.../*.** Iter
4950: 61 74 65 20 74 68 72 6f 75 67 68 20 65 61 63 68  ate through each
4960: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 65   expression in e
4970: 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 70  xpression-list p
4980: 45 4c 69 73 74 2e 20 46 6f 72 20 65 61 63 68 3a  EList. For each:
4990: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 4b 5f 43 4f  .**.**   * TK_CO
49a0: 4c 55 4d 4e 2c 0a 2a 2a 20 20 20 2a 20 61 67 67  LUMN,.**   * agg
49b0: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c  regate function,
49c0: 20 6f 72 0a 2a 2a 20 20 20 2a 20 77 69 6e 64 6f   or.**   * windo
49d0: 77 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  w function with 
49e0: 61 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20  a Window object 
49f0: 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 6d 65  that is not a me
4a00: 6d 62 65 72 20 6f 66 20 74 68 65 20 0a 2a 2a 20  mber of the .** 
4a10: 20 20 20 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20      linked list 
4a20: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
4a30: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 28 70  cond argument (p
4a40: 57 69 6e 29 0a 2a 2a 0a 2a 2a 20 41 70 70 65 6e  Win).**.** Appen
4a50: 64 20 74 68 65 20 6e 6f 64 65 20 74 6f 20 6f 75  d the node to ou
4a60: 74 70 75 74 20 65 78 70 72 65 73 73 69 6f 6e 2d  tput expression-
4a70: 6c 69 73 74 20 28 2a 70 70 53 75 62 29 2e 20 41  list (*ppSub). A
4a80: 6e 64 20 72 65 70 6c 61 63 65 20 69 74 0a 2a 2a  nd replace it.**
4a90: 20 77 69 74 68 20 61 20 54 4b 5f 43 4f 4c 55 4d   with a TK_COLUM
4aa0: 4e 20 74 68 61 74 20 72 65 61 64 73 20 74 68 65  N that reads the
4ab0: 20 28 4e 2d 31 29 74 68 20 65 6c 65 6d 65 6e 74   (N-1)th element
4ac0: 20 6f 66 20 74 61 62 6c 65 20 0a 2a 2a 20 70 57   of table .** pW
4ad0: 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 77 68 65  in->iEphCsr, whe
4ae0: 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  re N is the numb
4af0: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
4b00: 6e 20 28 2a 70 70 53 75 62 29 20 61 66 74 65 72  n (*ppSub) after
4b10: 0a 2a 2a 20 61 70 70 65 6e 64 69 6e 67 20 74 68  .** appending th
4b20: 65 20 6e 65 77 20 6f 6e 65 2e 0a 2a 2f 0a 73 74  e new one..*/.st
4b30: 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74  atic void select
4b40: 57 69 6e 64 6f 77 52 65 77 72 69 74 65 45 4c 69  WindowRewriteELi
4b50: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
4b60: 72 73 65 2c 20 0a 20 20 57 69 6e 64 6f 77 20 2a  rse, .  Window *
4b70: 70 57 69 6e 2c 0a 20 20 45 78 70 72 4c 69 73 74  pWin,.  ExprList
4b80: 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20   *pEList,       
4b90: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 77 72 69          /* Rewri
4ba0: 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  te expressions i
4bb0: 6e 20 74 68 69 73 20 6c 69 73 74 20 2a 2f 0a 20  n this list */. 
4bc0: 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 53 75   ExprList **ppSu
4bd0: 62 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b               
4be0: 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 75 62 2d   /* IN/OUT: Sub-
4bf0: 73 65 6c 65 63 74 20 65 78 70 72 65 73 73 69 6f  select expressio
4c00: 6e 2d 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 57  n-list */.){.  W
4c10: 61 6c 6b 65 72 20 73 57 61 6c 6b 65 72 3b 0a 20  alker sWalker;. 
4c20: 20 57 69 6e 64 6f 77 52 65 77 72 69 74 65 20 73   WindowRewrite s
4c30: 52 65 77 72 69 74 65 3b 0a 0a 20 20 6d 65 6d 73  Rewrite;..  mems
4c40: 65 74 28 26 73 57 61 6c 6b 65 72 2c 20 30 2c 20  et(&sWalker, 0, 
4c50: 73 69 7a 65 6f 66 28 57 61 6c 6b 65 72 29 29 3b  sizeof(Walker));
4c60: 0a 20 20 6d 65 6d 73 65 74 28 26 73 52 65 77 72  .  memset(&sRewr
4c70: 69 74 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57  ite, 0, sizeof(W
4c80: 69 6e 64 6f 77 52 65 77 72 69 74 65 29 29 3b 0a  indowRewrite));.
4c90: 0a 20 20 73 52 65 77 72 69 74 65 2e 70 53 75 62  .  sRewrite.pSub
4ca0: 20 3d 20 2a 70 70 53 75 62 3b 0a 20 20 73 52 65   = *ppSub;.  sRe
4cb0: 77 72 69 74 65 2e 70 57 69 6e 20 3d 20 70 57 69  write.pWin = pWi
4cc0: 6e 3b 0a 0a 20 20 73 57 61 6c 6b 65 72 2e 70 50  n;..  sWalker.pP
4cd0: 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
4ce0: 20 73 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61   sWalker.xExprCa
4cf0: 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 57  llback = selectW
4d00: 69 6e 64 6f 77 52 65 77 72 69 74 65 45 78 70 72  indowRewriteExpr
4d10: 43 62 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 78 53  Cb;.  sWalker.xS
4d20: 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
4d30: 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72  selectWindowRewr
4d40: 69 74 65 53 65 6c 65 63 74 43 62 3b 0a 20 20 73  iteSelectCb;.  s
4d50: 57 61 6c 6b 65 72 2e 75 2e 70 52 65 77 72 69 74  Walker.u.pRewrit
4d60: 65 20 3d 20 26 73 52 65 77 72 69 74 65 3b 0a 0a  e = &sRewrite;..
4d70: 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 57    (void)sqlite3W
4d80: 61 6c 6b 45 78 70 72 4c 69 73 74 28 26 73 57 61  alkExprList(&sWa
4d90: 6c 6b 65 72 2c 20 70 45 4c 69 73 74 29 3b 0a 0a  lker, pEList);..
4da0: 20 20 2a 70 70 53 75 62 20 3d 20 73 52 65 77 72    *ppSub = sRewr
4db0: 69 74 65 2e 70 53 75 62 3b 0a 7d 0a 0a 2f 2a 0a  ite.pSub;.}../*.
4dc0: 2a 2a 20 41 70 70 65 6e 64 20 61 20 63 6f 70 79  ** Append a copy
4dd0: 20 6f 66 20 65 61 63 68 20 65 78 70 72 65 73 73   of each express
4de0: 69 6f 6e 20 69 6e 20 65 78 70 72 65 73 73 69 6f  ion in expressio
4df0: 6e 2d 6c 69 73 74 20 70 41 70 70 65 6e 64 20 74  n-list pAppend t
4e00: 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  o.** expression 
4e10: 6c 69 73 74 20 70 4c 69 73 74 2e 20 52 65 74 75  list pList. Retu
4e20: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
4e30: 74 68 65 20 72 65 73 75 6c 74 20 6c 69 73 74 2e  the result list.
4e40: 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 4c  .*/.static ExprL
4e50: 69 73 74 20 2a 65 78 70 72 4c 69 73 74 41 70 70  ist *exprListApp
4e60: 65 6e 64 4c 69 73 74 28 0a 20 20 50 61 72 73 65  endList(.  Parse
4e70: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
4e80: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
4e90: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
4ea0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
4eb0: 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68     /* List to wh
4ec0: 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d  ich to append. M
4ed0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
4ee0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 41 70 70    ExprList *pApp
4ef0: 65 6e 64 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  end       /* Lis
4f00: 74 20 6f 66 20 76 61 6c 75 65 73 20 74 6f 20 61  t of values to a
4f10: 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20  ppend. Might be 
4f20: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  NULL */.){.  if(
4f30: 20 70 41 70 70 65 6e 64 20 29 7b 0a 20 20 20 20   pAppend ){.    
4f40: 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e  int i;.    int n
4f50: 49 6e 69 74 20 3d 20 70 4c 69 73 74 20 3f 20 70  Init = pList ? p
4f60: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b  List->nExpr : 0;
4f70: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
4f80: 70 41 70 70 65 6e 64 2d 3e 6e 45 78 70 72 3b 20  pAppend->nExpr; 
4f90: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
4fa0: 20 2a 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33   *pDup = sqlite3
4fb0: 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e  ExprDup(pParse->
4fc0: 64 62 2c 20 70 41 70 70 65 6e 64 2d 3e 61 5b 69  db, pAppend->a[i
4fd0: 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  ].pExpr, 0);.   
4fe0: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
4ff0: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
5000: 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20  (pParse, pList, 
5010: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 69 66 28  pDup);.      if(
5020: 20 70 4c 69 73 74 20 29 20 70 4c 69 73 74 2d 3e   pList ) pList->
5030: 61 5b 6e 49 6e 69 74 2b 69 5d 2e 73 6f 72 74 4f  a[nInit+i].sortO
5040: 72 64 65 72 20 3d 20 70 41 70 70 65 6e 64 2d 3e  rder = pAppend->
5050: 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[i].sortOrder;.
5060: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
5070: 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
5080: 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43 54  ** If the SELECT
5090: 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65   statement passe
50a0: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
50b0: 61 72 67 75 6d 65 6e 74 20 64 6f 65 73 20 6e 6f  argument does no
50c0: 74 20 69 6e 76 6f 6b 65 0a 2a 2a 20 61 6e 79 20  t invoke.** any 
50d0: 53 51 4c 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  SQL window funct
50e0: 69 6f 6e 73 2c 20 74 68 69 73 20 66 75 6e 63 74  ions, this funct
50f0: 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
5100: 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 0a 2a  Otherwise, it .*
5110: 2a 20 72 65 77 72 69 74 65 73 20 74 68 65 20 53  * rewrites the S
5120: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
5130: 73 6f 20 74 68 61 74 20 77 69 6e 64 6f 77 20 66  so that window f
5140: 75 6e 63 74 69 6f 6e 20 78 53 74 65 70 20 66 75  unction xStep fu
5150: 6e 63 74 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 69  nctions.** are i
5160: 6e 76 6f 6b 65 64 20 69 6e 20 74 68 65 20 63 6f  nvoked in the co
5170: 72 72 65 63 74 20 6f 72 64 65 72 20 61 73 20 64  rrect order as d
5180: 65 73 63 72 69 62 65 64 20 75 6e 64 65 72 20 22  escribed under "
5190: 53 45 4c 45 43 54 20 52 45 57 52 49 54 49 4e 47  SELECT REWRITING
51a0: 22 0a 2a 2a 20 61 74 20 74 68 65 20 74 6f 70 20  ".** at the top 
51b0: 6f 66 20 74 68 69 73 20 66 69 6c 65 2e 0a 2a 2f  of this file..*/
51c0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 69 6e 64  .int sqlite3Wind
51d0: 6f 77 52 65 77 72 69 74 65 28 50 61 72 73 65 20  owRewrite(Parse 
51e0: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
51f0: 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *p){.  int rc = 
5200: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
5210: 20 70 2d 3e 70 57 69 6e 20 29 7b 0a 20 20 20 20   p->pWin ){.    
5220: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
5230: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
5240: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
5250: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
5260: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 53  Parse->db;.    S
5270: 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 30 3b  elect *pSub = 0;
5280: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5290: 54 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  The subquery */.
52a0: 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72      SrcList *pSr
52b0: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  c = p->pSrc;.   
52c0: 20 45 78 70 72 20 2a 70 57 68 65 72 65 20 3d 20   Expr *pWhere = 
52d0: 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 45  p->pWhere;.    E
52e0: 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42  xprList *pGroupB
52f0: 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
5300: 0a 20 20 20 20 45 78 70 72 20 2a 70 48 61 76 69  .    Expr *pHavi
5310: 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b  ng = p->pHaving;
5320: 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
5330: 53 6f 72 74 20 3d 20 30 3b 0a 0a 20 20 20 20 45  Sort = 0;..    E
5340: 78 70 72 4c 69 73 74 20 2a 70 53 75 62 6c 69 73  xprList *pSublis
5350: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  t = 0;       /* 
5360: 45 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  Expression list 
5370: 66 6f 72 20 73 75 62 2d 71 75 65 72 79 20 2a 2f  for sub-query */
5380: 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57  .    Window *pMW
5390: 69 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b 20 20 20  in = p->pWin;   
53a0: 20 20 20 2f 2a 20 4d 61 73 74 65 72 20 77 69 6e     /* Master win
53b0: 64 6f 77 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  dow object */.  
53c0: 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 20    Window *pWin; 
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53e0: 2f 2a 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74  /* Window object
53f0: 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 0a 20 20   iterator */..  
5400: 20 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20    p->pSrc = 0;. 
5410: 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 30     p->pWhere = 0
5420: 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42  ;.    p->pGroupB
5430: 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 48  y = 0;.    p->pH
5440: 61 76 69 6e 67 20 3d 20 30 3b 0a 0a 20 20 20 20  aving = 0;..    
5450: 2f 2a 20 41 73 73 69 67 6e 20 61 20 63 75 72 73  /* Assign a curs
5460: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  or number for th
5470: 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  e ephemeral tabl
5480: 65 20 75 73 65 64 20 74 6f 20 62 75 66 66 65 72  e used to buffer
5490: 20 72 6f 77 73 2e 0a 20 20 20 20 2a 2a 20 54 68   rows..    ** Th
54a0: 65 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  e OpenEphemeral 
54b0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 63  instruction is c
54c0: 6f 64 65 64 20 6c 61 74 65 72 2c 20 61 66 74 65  oded later, afte
54d0: 72 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 68 6f  r it is known ho
54e0: 77 0a 20 20 20 20 2a 2a 20 6d 61 6e 79 20 63 6f  w.    ** many co
54f0: 6c 75 6d 6e 73 20 74 68 65 20 74 61 62 6c 65 20  lumns the table 
5500: 77 69 6c 6c 20 68 61 76 65 2e 20 20 2a 2f 0a 20  will have.  */. 
5510: 20 20 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73     pMWin->iEphCs
5520: 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
5530: 2b 2b 3b 0a 0a 20 20 20 20 73 65 6c 65 63 74 57  ++;..    selectW
5540: 69 6e 64 6f 77 52 65 77 72 69 74 65 45 4c 69 73  indowRewriteELis
5550: 74 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c  t(pParse, pMWin,
5560: 20 70 2d 3e 70 45 4c 69 73 74 2c 20 26 70 53 75   p->pEList, &pSu
5570: 62 6c 69 73 74 29 3b 0a 20 20 20 20 73 65 6c 65  blist);.    sele
5580: 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65 45  ctWindowRewriteE
5590: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4d 57  List(pParse, pMW
55a0: 69 6e 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  in, p->pOrderBy,
55b0: 20 26 70 53 75 62 6c 69 73 74 29 3b 0a 20 20 20   &pSublist);.   
55c0: 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43   pMWin->nBufferC
55d0: 6f 6c 20 3d 20 28 70 53 75 62 6c 69 73 74 20 3f  ol = (pSublist ?
55e0: 20 70 53 75 62 6c 69 73 74 2d 3e 6e 45 78 70 72   pSublist->nExpr
55f0: 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 43   : 0);..    /* C
5600: 72 65 61 74 65 20 74 68 65 20 4f 52 44 45 52 20  reate the ORDER 
5610: 42 59 20 63 6c 61 75 73 65 20 66 6f 72 20 74 68  BY clause for th
5620: 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 54 68  e sub-select. Th
5630: 69 73 20 69 73 20 74 68 65 20 63 6f 6e 63 61 74  is is the concat
5640: 65 6e 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6f  enation.    ** o
5650: 66 20 74 68 65 20 77 69 6e 64 6f 77 20 50 41 52  f the window PAR
5660: 54 49 54 49 4f 4e 20 61 6e 64 20 4f 52 44 45 52  TITION and ORDER
5670: 20 42 59 20 63 6c 61 75 73 65 73 2e 20 41 70 70   BY clauses. App
5680: 65 6e 64 20 74 68 65 20 73 61 6d 65 20 0a 20 20  end the same .  
5690: 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73    ** expressions
56a0: 20 74 6f 20 74 68 65 20 73 75 62 2d 73 65 6c 65   to the sub-sele
56b0: 63 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ct expression li
56c0: 73 74 2e 20 54 68 65 79 20 61 72 65 20 72 65 71  st. They are req
56d0: 75 69 72 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  uired to.    ** 
56e0: 66 69 67 75 72 65 20 6f 75 74 20 77 68 65 72 65  figure out where
56f0: 20 62 6f 75 6e 64 61 72 69 65 73 20 66 6f 72 20   boundaries for 
5700: 70 61 72 74 69 74 69 6f 6e 73 20 61 6e 64 20 73  partitions and s
5710: 65 74 73 20 6f 66 20 70 65 65 72 20 72 6f 77 73  ets of peer rows
5720: 2e 20 20 2a 2f 0a 20 20 20 20 70 53 6f 72 74 20  .  */.    pSort 
5730: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
5740: 74 44 75 70 28 64 62 2c 20 70 4d 57 69 6e 2d 3e  tDup(db, pMWin->
5750: 70 50 61 72 74 69 74 69 6f 6e 2c 20 30 29 3b 0a  pPartition, 0);.
5760: 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70      if( pMWin->p
5770: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
5780: 20 70 53 6f 72 74 20 3d 20 65 78 70 72 4c 69 73   pSort = exprLis
5790: 74 41 70 70 65 6e 64 4c 69 73 74 28 70 50 61 72  tAppendList(pPar
57a0: 73 65 2c 20 70 53 6f 72 74 2c 20 70 4d 57 69 6e  se, pSort, pMWin
57b0: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
57c0: 20 7d 0a 20 20 20 20 70 53 75 62 6c 69 73 74 20   }.    pSublist 
57d0: 3d 20 65 78 70 72 4c 69 73 74 41 70 70 65 6e 64  = exprListAppend
57e0: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 75  List(pParse, pSu
57f0: 62 6c 69 73 74 2c 20 70 53 6f 72 74 29 3b 0a 0a  blist, pSort);..
5800: 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68      /* Append th
5810: 65 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73  e arguments pass
5820: 65 64 20 74 6f 20 65 61 63 68 20 77 69 6e 64 6f  ed to each windo
5830: 77 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 74 68  w function to th
5840: 65 0a 20 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c  e.    ** sub-sel
5850: 65 63 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  ect expression l
5860: 69 73 74 2e 20 41 6c 73 6f 20 61 6c 6c 6f 63 61  ist. Also alloca
5870: 74 65 20 74 77 6f 20 72 65 67 69 73 74 65 72 73  te two registers
5880: 20 66 6f 72 20 65 61 63 68 0a 20 20 20 20 2a 2a   for each.    **
5890: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
58a0: 20 2d 20 6f 6e 65 20 66 6f 72 20 74 68 65 20 61   - one for the a
58b0: 63 63 75 6d 75 6c 61 74 6f 72 2c 20 61 6e 6f 74  ccumulator, anot
58c0: 68 65 72 20 66 6f 72 20 69 6e 74 65 72 69 6d 0a  her for interim.
58d0: 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 73 2e 20      ** results. 
58e0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 57 69 6e   */.    for(pWin
58f0: 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57  =pMWin; pWin; pW
5900: 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69  in=pWin->pNextWi
5910: 6e 29 7b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e  n){.      pWin->
5920: 69 41 72 67 43 6f 6c 20 3d 20 28 70 53 75 62 6c  iArgCol = (pSubl
5930: 69 73 74 20 3f 20 70 53 75 62 6c 69 73 74 2d 3e  ist ? pSublist->
5940: 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20  nExpr : 0);.    
5950: 20 20 70 53 75 62 6c 69 73 74 20 3d 20 65 78 70    pSublist = exp
5960: 72 4c 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28  rListAppendList(
5970: 70 50 61 72 73 65 2c 20 70 53 75 62 6c 69 73 74  pParse, pSublist
5980: 2c 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e  , pWin->pOwner->
5990: 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  x.pList);.      
59a0: 69 66 28 20 70 57 69 6e 2d 3e 70 46 69 6c 74 65  if( pWin->pFilte
59b0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  r ){.        Exp
59c0: 72 20 2a 70 46 69 6c 74 65 72 20 3d 20 73 71 6c  r *pFilter = sql
59d0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
59e0: 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72 2c 20 30  pWin->pFilter, 0
59f0: 29 3b 0a 20 20 20 20 20 20 20 20 70 53 75 62 6c  );.        pSubl
5a00: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
5a10: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
5a20: 73 65 2c 20 70 53 75 62 6c 69 73 74 2c 20 70 46  se, pSublist, pF
5a30: 69 6c 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  ilter);.      }.
5a40: 20 20 20 20 20 20 70 57 69 6e 2d 3e 72 65 67 41        pWin->regA
5a50: 63 63 75 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  ccum = ++pParse-
5a60: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 57 69  >nMem;.      pWi
5a70: 6e 2d 3e 72 65 67 52 65 73 75 6c 74 20 3d 20 2b  n->regResult = +
5a80: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
5a90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5aa0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
5ab0: 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41  l, 0, pWin->regA
5ac0: 63 63 75 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ccum);.    }..  
5ad0: 20 20 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33    pSub = sqlite3
5ae0: 53 65 6c 65 63 74 4e 65 77 28 0a 20 20 20 20 20  SelectNew(.     
5af0: 20 20 20 70 50 61 72 73 65 2c 20 70 53 75 62 6c     pParse, pSubl
5b00: 69 73 74 2c 20 70 53 72 63 2c 20 70 57 68 65 72  ist, pSrc, pWher
5b10: 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 70 48 61  e, pGroupBy, pHa
5b20: 76 69 6e 67 2c 20 70 53 6f 72 74 2c 20 30 2c 20  ving, pSort, 0, 
5b30: 30 0a 20 20 20 20 29 3b 0a 20 20 20 20 70 2d 3e  0.    );.    p->
5b40: 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  pSrc = sqlite3Sr
5b50: 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20  cListAppend(db, 
5b60: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 61 73  0, 0, 0);.    as
5b70: 73 65 72 74 28 20 70 2d 3e 70 53 72 63 20 7c 7c  sert( p->pSrc ||
5b80: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
5b90: 64 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  d );.    if( p->
5ba0: 70 53 72 63 20 29 7b 0a 20 20 20 20 20 20 69 6e  pSrc ){.      in
5bb0: 74 20 69 54 61 62 3b 0a 20 20 20 20 20 20 45 78  t iTab;.      Ex
5bc0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
5bd0: 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 53 72 63  0;.      p->pSrc
5be0: 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 3d  ->a[0].pSelect =
5bf0: 20 70 53 75 62 3b 0a 20 20 20 20 20 20 73 71 6c   pSub;.      sql
5c00: 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
5c10: 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
5c20: 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 20   p->pSrc);.     
5c30: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 61   if( sqlite3Expa
5c40: 6e 64 53 75 62 71 75 65 72 79 28 70 50 61 72 73  ndSubquery(pPars
5c50: 65 2c 20 26 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  e, &p->pSrc->a[0
5c60: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ]) ){.        rc
5c70: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
5c80: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5c90: 20 20 20 20 20 20 70 53 75 62 2d 3e 73 65 6c 46        pSub->selF
5ca0: 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e  lags |= SF_Expan
5cb0: 64 65 64 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ded;.        p->
5cc0: 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f  selFlags &= ~SF_
5cd0: 41 67 67 72 65 67 61 74 65 3b 0a 20 20 20 20 20  Aggregate;.     
5ce0: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
5cf0: 50 72 65 70 28 70 50 61 72 73 65 2c 20 70 53 75  Prep(pParse, pSu
5d00: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  b, 0);.      }..
5d10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5d20: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
5d30: 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 4d 57  enEphemeral, pMW
5d40: 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 70 53 75  in->iEphCsr, pSu
5d50: 62 6c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  blist->nExpr);. 
5d60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5d70: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
5d80: 65 74 65 28 64 62 2c 20 70 53 75 62 29 3b 0a 20  ete(db, pSub);. 
5d90: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d     }.    if( db-
5da0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
5db0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
5dc0: 4d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  M;.  }..  return
5dd0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72   rc;.}../*.** Fr
5de0: 65 65 20 74 68 65 20 57 69 6e 64 6f 77 20 6f 62  ee the Window ob
5df0: 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
5e00: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
5e10: 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
5e20: 74 65 33 57 69 6e 64 6f 77 44 65 6c 65 74 65 28  te3WindowDelete(
5e30: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 6e  sqlite3 *db, Win
5e40: 64 6f 77 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  dow *p){.  if( p
5e50: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
5e60: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
5e70: 3e 70 46 69 6c 74 65 72 29 3b 0a 20 20 20 20 73  >pFilter);.    s
5e80: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
5e90: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 61 72  lete(db, p->pPar
5ea0: 74 69 74 69 6f 6e 29 3b 0a 20 20 20 20 73 71 6c  tition);.    sql
5eb0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
5ec0: 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  te(db, p->pOrder
5ed0: 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  By);.    sqlite3
5ee0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
5ef0: 2d 3e 70 45 6e 64 29 3b 0a 20 20 20 20 73 71 6c  ->pEnd);.    sql
5f00: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
5f10: 62 2c 20 70 2d 3e 70 53 74 61 72 74 29 3b 0a 20  b, p->pStart);. 
5f20: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
5f30: 28 64 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a  (db, p->zName);.
5f40: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
5f50: 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a  e(db, p);.  }.}.
5f60: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
5f70: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 57  linked list of W
5f80: 69 6e 64 6f 77 20 6f 62 6a 65 63 74 73 20 73 74  indow objects st
5f90: 61 72 74 69 6e 67 20 61 74 20 74 68 65 20 73 65  arting at the se
5fa0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
5fb0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69  /.void sqlite3Wi
5fc0: 6e 64 6f 77 4c 69 73 74 44 65 6c 65 74 65 28 73  ndowListDelete(s
5fd0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 6e 64  qlite3 *db, Wind
5fe0: 6f 77 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28  ow *p){.  while(
5ff0: 20 70 20 29 7b 0a 20 20 20 20 57 69 6e 64 6f 77   p ){.    Window
6000: 20 2a 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65   *pNext = p->pNe
6010: 78 74 57 69 6e 3b 0a 20 20 20 20 73 71 6c 69 74  xtWin;.    sqlit
6020: 65 33 57 69 6e 64 6f 77 44 65 6c 65 74 65 28 64  e3WindowDelete(d
6030: 62 2c 20 70 29 3b 0a 20 20 20 20 70 20 3d 20 70  b, p);.    p = p
6040: 4e 65 78 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Next;.  }.}../*.
6050: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  ** Allocate and 
6060: 72 65 74 75 72 6e 20 61 20 6e 65 77 20 57 69 6e  return a new Win
6070: 64 6f 77 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 57  dow object..*/.W
6080: 69 6e 64 6f 77 20 2a 73 71 6c 69 74 65 33 57 69  indow *sqlite3Wi
6090: 6e 64 6f 77 41 6c 6c 6f 63 28 0a 20 20 50 61 72  ndowAlloc(.  Par
60a0: 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 69  se *pParse, .  i
60b0: 6e 74 20 65 54 79 70 65 2c 0a 20 20 69 6e 74 20  nt eType,.  int 
60c0: 65 53 74 61 72 74 2c 20 45 78 70 72 20 2a 70 53  eStart, Expr *pS
60d0: 74 61 72 74 2c 0a 20 20 69 6e 74 20 65 45 6e 64  tart,.  int eEnd
60e0: 2c 20 45 78 70 72 20 2a 70 45 6e 64 0a 29 7b 0a  , Expr *pEnd.){.
60f0: 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 20 3d    Window *pWin =
6100: 20 28 57 69 6e 64 6f 77 2a 29 73 71 6c 69 74 65   (Window*)sqlite
6110: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50  3DbMallocZero(pP
6120: 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66  arse->db, sizeof
6130: 28 57 69 6e 64 6f 77 29 29 3b 0a 0a 20 20 69 66  (Window));..  if
6140: 28 20 70 57 69 6e 20 29 7b 0a 20 20 20 20 70 57  ( pWin ){.    pW
6150: 69 6e 2d 3e 65 54 79 70 65 20 3d 20 65 54 79 70  in->eType = eTyp
6160: 65 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 65 53 74  e;.    pWin->eSt
6170: 61 72 74 20 3d 20 65 53 74 61 72 74 3b 0a 20 20  art = eStart;.  
6180: 20 20 70 57 69 6e 2d 3e 65 45 6e 64 20 3d 20 65    pWin->eEnd = e
6190: 45 6e 64 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70  End;.    pWin->p
61a0: 45 6e 64 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20  End = pEnd;.    
61b0: 70 57 69 6e 2d 3e 70 53 74 61 72 74 20 3d 20 70  pWin->pStart = p
61c0: 53 74 61 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Start;.  }else{.
61d0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
61e0: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
61f0: 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20 73 71 6c  , pEnd);.    sql
6200: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
6210: 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 74 61 72  Parse->db, pStar
6220: 74 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  t);.  }..  retur
6230: 6e 20 70 57 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pWin;.}../*.**
6240: 20 41 74 74 61 63 68 20 77 69 6e 64 6f 77 20 6f   Attach window o
6250: 62 6a 65 63 74 20 70 57 69 6e 20 74 6f 20 65 78  bject pWin to ex
6260: 70 72 65 73 73 69 6f 6e 20 70 2e 0a 2a 2f 0a 76  pression p..*/.v
6270: 6f 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f  oid sqlite3Windo
6280: 77 41 74 74 61 63 68 28 50 61 72 73 65 20 2a 70  wAttach(Parse *p
6290: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 2c 20  Parse, Expr *p, 
62a0: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 29 7b 0a 20  Window *pWin){. 
62b0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70 2d   if( p ){.    p-
62c0: 3e 70 57 69 6e 20 3d 20 70 57 69 6e 3b 0a 20 20  >pWin = pWin;.  
62d0: 20 20 69 66 28 20 70 57 69 6e 20 29 20 70 57 69    if( pWin ) pWi
62e0: 6e 2d 3e 70 4f 77 6e 65 72 20 3d 20 70 3b 0a 20  n->pOwner = p;. 
62f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
6300: 74 65 33 57 69 6e 64 6f 77 44 65 6c 65 74 65 28  te3WindowDelete(
6310: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 57 69 6e  pParse->db, pWin
6320: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
6330: 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20  Return 0 if the 
6340: 74 77 6f 20 77 69 6e 64 6f 77 20 6f 62 6a 65 63  two window objec
6350: 74 73 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c  ts are identical
6360: 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 74  , or non-zero ot
6370: 68 65 72 77 69 73 65 2e 0a 2a 2a 20 49 64 65 6e  herwise..** Iden
6380: 74 69 63 61 6c 20 77 69 6e 64 6f 77 20 6f 62 6a  tical window obj
6390: 65 63 74 73 20 63 61 6e 20 62 65 20 70 72 6f 63  ects can be proc
63a0: 65 73 73 65 64 20 69 6e 20 61 20 73 69 6e 67 6c  essed in a singl
63b0: 65 20 73 63 61 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  e scan..*/.int s
63c0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 6d 70  qlite3WindowComp
63d0: 61 72 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  are(Parse *pPars
63e0: 65 2c 20 57 69 6e 64 6f 77 20 2a 70 31 2c 20 57  e, Window *p1, W
63f0: 69 6e 64 6f 77 20 2a 70 32 29 7b 0a 20 20 69 66  indow *p2){.  if
6400: 28 20 70 31 2d 3e 65 54 79 70 65 21 3d 70 32 2d  ( p1->eType!=p2-
6410: 3e 65 54 79 70 65 20 29 20 72 65 74 75 72 6e 20  >eType ) return 
6420: 31 3b 0a 20 20 69 66 28 20 70 31 2d 3e 65 53 74  1;.  if( p1->eSt
6430: 61 72 74 21 3d 70 32 2d 3e 65 53 74 61 72 74 20  art!=p2->eStart 
6440: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
6450: 28 20 70 31 2d 3e 65 45 6e 64 21 3d 70 32 2d 3e  ( p1->eEnd!=p2->
6460: 65 45 6e 64 20 29 20 72 65 74 75 72 6e 20 31 3b  eEnd ) return 1;
6470: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
6480: 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  prCompare(pParse
6490: 2c 20 70 31 2d 3e 70 53 74 61 72 74 2c 20 70 32  , p1->pStart, p2
64a0: 2d 3e 70 53 74 61 72 74 2c 20 2d 31 29 20 29 20  ->pStart, -1) ) 
64b0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
64c0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
64d0: 72 65 28 70 50 61 72 73 65 2c 20 70 31 2d 3e 70  re(pParse, p1->p
64e0: 45 6e 64 2c 20 70 32 2d 3e 70 45 6e 64 2c 20 2d  End, p2->pEnd, -
64f0: 31 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  1) ) return 1;. 
6500: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
6510: 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 31 2d 3e  ListCompare(p1->
6520: 70 50 61 72 74 69 74 69 6f 6e 2c 20 70 32 2d 3e  pPartition, p2->
6530: 70 50 61 72 74 69 74 69 6f 6e 2c 20 2d 31 29 20  pPartition, -1) 
6540: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
6550: 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  ( sqlite3ExprLis
6560: 74 43 6f 6d 70 61 72 65 28 70 31 2d 3e 70 4f 72  tCompare(p1->pOr
6570: 64 65 72 42 79 2c 20 70 32 2d 3e 70 4f 72 64 65  derBy, p2->pOrde
6580: 72 42 79 2c 20 2d 31 29 20 29 20 72 65 74 75 72  rBy, -1) ) retur
6590: 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  n 1;.  return 0;
65a0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
65b0: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 63 6f 64  is called by cod
65c0: 65 20 69 6e 20 73 65 6c 65 63 74 2e 63 20 62 65  e in select.c be
65d0: 66 6f 72 65 20 69 74 20 63 61 6c 6c 73 20 73 71  fore it calls sq
65e0: 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
65f0: 29 0a 2a 2a 20 74 6f 20 62 65 67 69 6e 20 69 74  ).** to begin it
6600: 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20  erating through 
6610: 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 72 65  the sub-query re
6620: 73 75 6c 74 73 2e 20 49 74 20 69 73 20 75 73 65  sults. It is use
6630: 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 2a 2a  d to allocate.**
6640: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
6650: 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 63 75  registers and cu
6660: 72 73 6f 72 73 20 75 73 65 64 20 62 79 20 73 71  rsors used by sq
6670: 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 53  lite3WindowCodeS
6680: 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tep()..*/.void s
6690: 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65  qlite3WindowCode
66a0: 49 6e 69 74 28 50 61 72 73 65 20 2a 70 50 61 72  Init(Parse *pPar
66b0: 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69  se, Window *pMWi
66c0: 6e 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57  n){.  Window *pW
66d0: 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  in;.  Vdbe *v = 
66e0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
66f0: 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 6e 50  Parse);.  int nP
6700: 61 72 74 20 3d 20 28 70 4d 57 69 6e 2d 3e 70 50  art = (pMWin->pP
6710: 61 72 74 69 74 69 6f 6e 20 3f 20 70 4d 57 69 6e  artition ? pMWin
6720: 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2d 3e 6e 45  ->pPartition->nE
6730: 78 70 72 20 3a 20 30 29 3b 0a 20 20 6e 50 61 72  xpr : 0);.  nPar
6740: 74 20 2b 3d 20 28 70 4d 57 69 6e 2d 3e 70 4f 72  t += (pMWin->pOr
6750: 64 65 72 42 79 20 3f 20 70 4d 57 69 6e 2d 3e 70  derBy ? pMWin->p
6760: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 3a  OrderBy->nExpr :
6770: 20 30 29 3b 0a 20 20 69 66 28 20 6e 50 61 72 74   0);.  if( nPart
6780: 20 29 7b 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 72   ){.    pMWin->r
6790: 65 67 50 61 72 74 20 3d 20 70 50 61 72 73 65 2d  egPart = pParse-
67a0: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
67b0: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 61  rse->nMem += nPa
67c0: 72 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  rt;.    sqlite3V
67d0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
67e0: 4e 75 6c 6c 2c 20 30 2c 20 70 4d 57 69 6e 2d 3e  Null, 0, pMWin->
67f0: 72 65 67 50 61 72 74 2c 20 70 4d 57 69 6e 2d 3e  regPart, pMWin->
6800: 72 65 67 50 61 72 74 2b 6e 50 61 72 74 2d 31 29  regPart+nPart-1)
6810: 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 57 69  ;.  }..  for(pWi
6820: 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70  n=pMWin; pWin; p
6830: 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57  Win=pWin->pNextW
6840: 69 6e 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66  in){.    FuncDef
6850: 20 2a 70 20 3d 20 70 57 69 6e 2d 3e 70 46 75 6e   *p = pWin->pFun
6860: 63 3b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 66  c;.    if( (p->f
6870: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
6880: 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 20 26  E_FUNC_MINMAX) &
6890: 26 20 70 57 69 6e 2d 3e 65 53 74 61 72 74 21 3d  & pWin->eStart!=
68a0: 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a  TK_UNBOUNDED ){.
68b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6c        /* The inl
68c0: 69 6e 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ine versions of 
68d0: 6d 69 6e 28 29 20 61 6e 64 20 6d 61 78 28 29 20  min() and max() 
68e0: 72 65 71 75 69 72 65 20 61 20 73 69 6e 67 6c 65  require a single
68f0: 20 65 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 20   ephemeral.     
6900: 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 33 20   ** table and 3 
6910: 72 65 67 69 73 74 65 72 73 2e 20 54 68 65 20 72  registers. The r
6920: 65 67 69 73 74 65 72 73 20 61 72 65 20 75 73 65  egisters are use
6930: 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  d as follows:.  
6940: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
6950: 20 20 72 65 67 41 70 70 2b 30 3a 20 73 6c 6f 74    regApp+0: slot
6960: 20 74 6f 20 63 6f 70 79 20 6d 69 6e 28 29 2f 6d   to copy min()/m
6970: 61 78 28 29 20 61 72 67 75 6d 65 6e 74 20 74 6f  ax() argument to
6980: 20 66 6f 72 20 4d 61 6b 65 52 65 63 6f 72 64 0a   for MakeRecord.
6990: 20 20 20 20 20 20 2a 2a 20 20 20 72 65 67 41 70        **   regAp
69a0: 70 2b 31 3a 20 69 6e 74 65 67 65 72 20 76 61 6c  p+1: integer val
69b0: 75 65 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72  ue used to ensur
69c0: 65 20 6b 65 79 73 20 61 72 65 20 75 6e 69 71 75  e keys are uniqu
69d0: 65 0a 20 20 20 20 20 20 2a 2a 20 20 20 72 65 67  e.      **   reg
69e0: 41 70 70 2b 32 3a 20 6f 75 74 70 75 74 20 6f 66  App+2: output of
69f0: 20 4d 61 6b 65 52 65 63 6f 72 64 0a 20 20 20 20   MakeRecord.    
6a00: 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c    */.      ExprL
6a10: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 57 69  ist *pList = pWi
6a20: 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69  n->pOwner->x.pLi
6a30: 73 74 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66  st;.      KeyInf
6a40: 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71  o *pKeyInfo = sq
6a50: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d  lite3KeyInfoFrom
6a60: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
6a70: 20 70 4c 69 73 74 2c 20 30 2c 20 30 29 3b 0a 20   pList, 0, 0);. 
6a80: 20 20 20 20 20 70 57 69 6e 2d 3e 63 73 72 41 70       pWin->csrAp
6a90: 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  p = pParse->nTab
6aa0: 2b 2b 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e  ++;.      pWin->
6ab0: 72 65 67 41 70 70 20 3d 20 70 50 61 72 73 65 2d  regApp = pParse-
6ac0: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 70  >nMem+1;.      p
6ad0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 33  Parse->nMem += 3
6ae0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79  ;.      if( pKey
6af0: 49 6e 66 6f 20 26 26 20 70 57 69 6e 2d 3e 70 46  Info && pWin->pF
6b00: 75 6e 63 2d 3e 7a 4e 61 6d 65 5b 31 5d 3d 3d 27  unc->zName[1]=='
6b10: 69 27 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  i' ){.        as
6b20: 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  sert( pKeyInfo->
6b30: 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 3d 3d 30  aSortOrder[0]==0
6b40: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79   );.        pKey
6b50: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
6b60: 5b 30 5d 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  [0] = 1;.      }
6b70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6b80: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
6b90: 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 57  penEphemeral, pW
6ba0: 69 6e 2d 3e 63 73 72 41 70 70 2c 20 32 29 3b 0a  in->csrApp, 2);.
6bb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6bc0: 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 4b 65  eAppendP4(v, pKe
6bd0: 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
6be0: 4f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  O);.      sqlite
6bf0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6c00: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 57  P_Integer, 0, pW
6c10: 69 6e 2d 3e 72 65 67 41 70 70 2b 31 29 3b 0a 20  in->regApp+1);. 
6c20: 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66     }.    else if
6c30: 28 20 70 2d 3e 78 53 46 75 6e 63 3d 3d 6e 74 68  ( p->xSFunc==nth
6c40: 5f 76 61 6c 75 65 53 74 65 70 46 75 6e 63 20 7c  _valueStepFunc |
6c50: 7c 20 70 2d 3e 78 53 46 75 6e 63 3d 3d 66 69 72  | p->xSFunc==fir
6c60: 73 74 5f 76 61 6c 75 65 53 74 65 70 46 75 6e 63  st_valueStepFunc
6c70: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c 6c   ){.      /* All
6c80: 6f 63 61 74 65 20 74 77 6f 20 72 65 67 69 73 74  ocate two regist
6c90: 65 72 73 20 61 74 20 70 57 69 6e 2d 3e 72 65 67  ers at pWin->reg
6ca0: 41 70 70 2e 20 54 68 65 73 65 20 77 69 6c 6c 20  App. These will 
6cb0: 62 65 20 75 73 65 64 20 74 6f 0a 20 20 20 20 20  be used to.     
6cc0: 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 73 74   ** store the st
6cd0: 61 72 74 20 61 6e 64 20 65 6e 64 20 69 6e 64 65  art and end inde
6ce0: 78 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  x of the current
6cf0: 20 66 72 61 6d 65 2e 20 20 2a 2f 0a 20 20 20 20   frame.  */.    
6d00: 20 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d    assert( pMWin-
6d10: 3e 69 45 70 68 43 73 72 20 29 3b 0a 20 20 20 20  >iEphCsr );.    
6d20: 20 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 20 3d    pWin->regApp =
6d30: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
6d40: 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 63 73 72  .      pWin->csr
6d50: 41 70 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  App = pParse->nT
6d60: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61 72  ab++;.      pPar
6d70: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 32 3b 0a 20  se->nMem += 2;. 
6d80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6d90: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
6da0: 6e 44 75 70 2c 20 70 57 69 6e 2d 3e 63 73 72 41  nDup, pWin->csrA
6db0: 70 70 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43  pp, pMWin->iEphC
6dc0: 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65  sr);.    }.    e
6dd0: 6c 73 65 20 69 66 28 20 70 2d 3e 78 53 46 75 6e  lse if( p->xSFun
6de0: 63 3d 3d 6c 65 61 64 53 74 65 70 46 75 6e 63 20  c==leadStepFunc 
6df0: 7c 7c 20 70 2d 3e 78 53 46 75 6e 63 3d 3d 6c 61  || p->xSFunc==la
6e00: 67 53 74 65 70 46 75 6e 63 20 29 7b 0a 20 20 20  gStepFunc ){.   
6e10: 20 20 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e     assert( pMWin
6e20: 2d 3e 69 45 70 68 43 73 72 20 29 3b 0a 20 20 20  ->iEphCsr );.   
6e30: 20 20 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 20     pWin->csrApp 
6e40: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
6e50: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
6e60: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
6e70: 4f 70 65 6e 44 75 70 2c 20 70 57 69 6e 2d 3e 63  OpenDup, pWin->c
6e80: 73 72 41 70 70 2c 20 70 4d 57 69 6e 2d 3e 69 45  srApp, pMWin->iE
6e90: 70 68 43 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20  phCsr);.    }.  
6ea0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 22 50 52  }.}../*.** A "PR
6eb0: 45 43 45 44 49 4e 47 20 3c 65 78 70 72 3e 22 20  ECEDING <expr>" 
6ec0: 28 62 45 6e 64 3d 3d 30 29 20 6f 72 20 22 46 4f  (bEnd==0) or "FO
6ed0: 4c 4c 4f 57 49 4e 47 20 3c 65 78 70 72 3e 22 20  LLOWING <expr>" 
6ee0: 28 62 45 6e 64 3d 3d 31 29 20 68 61 73 20 6a 75  (bEnd==1) has ju
6ef0: 73 74 20 0a 2a 2a 20 62 65 65 6e 20 65 76 61 6c  st .** been eval
6f00: 75 61 74 65 64 20 61 6e 64 20 74 68 65 20 72 65  uated and the re
6f10: 73 75 6c 74 20 6c 65 66 74 20 69 6e 20 72 65 67  sult left in reg
6f20: 69 73 74 65 72 20 72 65 67 2e 20 54 68 69 73 20  ister reg. This 
6f30: 66 75 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61 74  function generat
6f40: 65 73 0a 2a 2a 20 56 4d 20 63 6f 64 65 20 74 6f  es.** VM code to
6f50: 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   check that the 
6f60: 76 61 6c 75 65 20 69 73 20 61 20 6e 6f 6e 2d 6e  value is a non-n
6f70: 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72 20  egative integer 
6f80: 61 6e 64 20 74 68 72 6f 77 73 0a 2a 2a 20 61 6e  and throws.** an
6f90: 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20 69 74   exception if it
6fa0: 20 69 73 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74   is not..*/.stat
6fb0: 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 43 68  ic void windowCh
6fc0: 65 63 6b 46 72 61 6d 65 56 61 6c 75 65 28 50 61  eckFrameValue(Pa
6fd0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
6fe0: 20 72 65 67 2c 20 69 6e 74 20 62 45 6e 64 29 7b   reg, int bEnd){
6ff0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
7000: 63 68 61 72 20 2a 61 7a 45 72 72 5b 5d 20 3d 20  char *azErr[] = 
7010: 7b 0a 20 20 20 20 22 66 72 61 6d 65 20 73 74 61  {.    "frame sta
7020: 72 74 69 6e 67 20 6f 66 66 73 65 74 20 6d 75 73  rting offset mus
7030: 74 20 62 65 20 61 20 6e 6f 6e 2d 6e 65 67 61 74  t be a non-negat
7040: 69 76 65 20 69 6e 74 65 67 65 72 22 2c 0a 20 20  ive integer",.  
7050: 20 20 22 66 72 61 6d 65 20 65 6e 64 69 6e 67 20    "frame ending 
7060: 6f 66 66 73 65 74 20 6d 75 73 74 20 62 65 20 61  offset must be a
7070: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e   non-negative in
7080: 74 65 67 65 72 22 0a 20 20 7d 3b 0a 20 20 56 64  teger".  };.  Vd
7090: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
70a0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
70b0: 20 20 69 6e 74 20 72 65 67 5a 65 72 6f 20 3d 20    int regZero = 
70c0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
70d0: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  g(pParse);.  sql
70e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
70f0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
7100: 20 72 65 67 5a 65 72 6f 29 3b 0a 20 20 73 71 6c   regZero);.  sql
7110: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
7120: 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
7130: 72 65 67 2c 20 73 71 6c 69 74 65 33 56 64 62 65  reg, sqlite3Vdbe
7140: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32  CurrentAddr(v)+2
7150: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
7160: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 47 65 2c  AddOp3(v, OP_Ge,
7170: 20 72 65 67 5a 65 72 6f 2c 20 73 71 6c 69 74 65   regZero, sqlite
7180: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
7190: 28 76 29 2b 32 2c 20 72 65 67 29 3b 0a 20 20 73  (v)+2, reg);.  s
71a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
71b0: 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c  (v, OP_Halt, SQL
71c0: 49 54 45 5f 45 52 52 4f 52 2c 20 4f 45 5f 41 62  ITE_ERROR, OE_Ab
71d0: 6f 72 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ort);.  sqlite3V
71e0: 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28  dbeAppendP4(v, (
71f0: 76 6f 69 64 2a 29 61 7a 45 72 72 5b 62 45 6e 64  void*)azErr[bEnd
7200: 5d 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20  ], P4_STATIC);. 
7210: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
7220: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
7230: 65 67 5a 65 72 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  egZero);.}../*.*
7240: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
7250: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
7260: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 77   passed to the w
7270: 69 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e 20 61  indow-function a
7280: 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
7290: 68 20 74 68 65 20 6f 62 6a 65 63 74 20 70 61 73  h the object pas
72a0: 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
72b0: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
72c0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
72d0: 61 74 69 63 20 69 6e 74 20 77 69 6e 64 6f 77 41  atic int windowA
72e0: 72 67 43 6f 75 6e 74 28 57 69 6e 64 6f 77 20 2a  rgCount(Window *
72f0: 70 57 69 6e 29 7b 0a 20 20 45 78 70 72 4c 69 73  pWin){.  ExprLis
7300: 74 20 2a 70 4c 69 73 74 20 3d 20 70 57 69 6e 2d  t *pList = pWin-
7310: 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74  >pOwner->x.pList
7320: 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 4c 69 73  ;.  return (pLis
7330: 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  t ? pList->nExpr
7340: 20 3a 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   : 0);.}../*.** 
7350: 47 65 6e 65 72 61 74 65 20 56 4d 20 63 6f 64 65  Generate VM code
7360: 20 74 6f 20 69 6e 76 6f 6b 65 20 65 69 74 68 65   to invoke eithe
7370: 72 20 78 53 74 65 70 28 29 20 28 69 66 20 62 49  r xStep() (if bI
7380: 6e 76 65 72 73 65 20 69 73 20 30 29 20 6f 72 20  nverse is 0) or 
7390: 0a 2a 2a 20 78 49 6e 76 65 72 73 65 20 28 69 66  .** xInverse (if
73a0: 20 62 49 6e 76 65 72 73 65 20 69 73 20 6e 6f 6e   bInverse is non
73b0: 2d 7a 65 72 6f 29 20 66 6f 72 20 65 61 63 68 20  -zero) for each 
73c0: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
73d0: 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65  in the .** linke
73e0: 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67 20  d list starting 
73f0: 61 74 20 70 4d 57 69 6e 2e 20 4f 72 2c 20 66 6f  at pMWin. Or, fo
7400: 72 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  r built-in windo
7410: 77 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 74  w functions.** t
7420: 68 61 74 20 64 6f 20 6e 6f 74 20 75 73 65 20 74  hat do not use t
7430: 68 65 20 73 74 61 6e 64 61 72 64 20 66 75 6e 63  he standard func
7440: 74 69 6f 6e 20 41 50 49 2c 20 67 65 6e 65 72 61  tion API, genera
7450: 74 65 20 74 68 65 20 72 65 71 75 69 72 65 64 0a  te the required.
7460: 2a 2a 20 69 6e 6c 69 6e 65 20 56 4d 20 63 6f 64  ** inline VM cod
7470: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75  e..**.** If argu
7480: 6d 65 6e 74 20 63 73 72 20 69 73 20 67 72 65 61  ment csr is grea
7490: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
74a0: 6c 20 74 6f 20 30 2c 20 74 68 65 6e 20 61 72 67  l to 0, then arg
74b0: 75 6d 65 6e 74 20 72 65 67 20 69 73 0a 2a 2a 20  ument reg is.** 
74c0: 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74  the first regist
74d0: 65 72 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f  er in an array o
74e0: 66 20 72 65 67 69 73 74 65 72 73 20 67 75 61 72  f registers guar
74f0: 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 61 72  anteed to be lar
7500: 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 20 74 6f 20  ge.** enough to 
7510: 68 6f 6c 64 20 74 68 65 20 61 72 72 61 79 20 6f  hold the array o
7520: 66 20 61 72 67 75 6d 65 6e 74 73 20 66 6f 72 20  f arguments for 
7530: 65 61 63 68 20 66 75 6e 63 74 69 6f 6e 2e 20 49  each function. I
7540: 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20 74  n this case.** t
7550: 68 65 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  he arguments are
7560: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
7570: 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
7580: 6f 66 20 63 73 72 20 69 6e 74 6f 20 74 68 65 0a  of csr into the.
7590: 2a 2a 20 61 72 72 61 79 20 6f 66 20 72 65 67 69  ** array of regi
75a0: 73 74 65 72 73 20 62 65 66 6f 72 65 20 69 6e 76  sters before inv
75b0: 6f 6b 69 6e 67 20 4f 50 5f 41 67 67 53 74 65 70  oking OP_AggStep
75c0: 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 63  ..**.** Or, if c
75d0: 73 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  sr is less than 
75e0: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 61  zero, then the a
75f0: 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
7600: 73 20 61 74 20 72 65 67 20 69 73 0a 2a 2a 20 61  s at reg is.** a
7610: 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64  lready populated
7620: 20 77 69 74 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e   with all column
7630: 73 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65  s from the curre
7640: 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 73 75  nt row of the su
7650: 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49  b-query..**.** I
7660: 66 20 61 72 67 75 6d 65 6e 74 20 72 65 67 50 61  f argument regPa
7670: 72 74 53 69 7a 65 20 69 73 20 6e 6f 6e 2d 7a 65  rtSize is non-ze
7680: 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61  ro, then it is a
7690: 20 72 65 67 69 73 74 65 72 20 63 6f 6e 74 61 69   register contai
76a0: 6e 69 6e 67 20 74 68 65 0a 2a 2a 20 6e 75 6d 62  ning the.** numb
76b0: 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
76c0: 65 20 63 75 72 72 65 6e 74 20 70 61 72 74 69 74  e current partit
76d0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
76e0: 6f 69 64 20 77 69 6e 64 6f 77 41 67 67 53 74 65  oid windowAggSte
76f0: 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  p(.  Parse *pPar
7700: 73 65 2c 20 0a 20 20 57 69 6e 64 6f 77 20 2a 70  se, .  Window *p
7710: 4d 57 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20  MWin,           
7720: 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 65 64         /* Linked
7730: 20 6c 69 73 74 20 6f 66 20 77 69 6e 64 6f 77 20   list of window 
7740: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  functions */.  i
7750: 6e 74 20 63 73 72 2c 20 20 20 20 20 20 20 20 20  nt csr,         
7760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7770: 2a 20 52 65 61 64 20 61 72 67 75 6d 65 6e 74 73  * Read arguments
7780: 20 66 72 6f 6d 20 74 68 69 73 20 63 75 72 73 6f   from this curso
7790: 72 20 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 76 65  r */.  int bInve
77a0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
77b0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
77c0: 6f 20 69 6e 76 6f 6b 65 20 78 49 6e 76 65 72 73  o invoke xInvers
77d0: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 78 53 74  e instead of xSt
77e0: 65 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 2c  ep */.  int reg,
77f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7800: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
7810: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 2a 2f   of registers */
7820: 0a 20 20 69 6e 74 20 72 65 67 50 61 72 74 53 69  .  int regPartSi
7830: 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
7840: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 63     /* Register c
7850: 6f 6e 74 61 69 6e 69 6e 67 20 73 69 7a 65 20 6f  ontaining size o
7860: 66 20 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 29  f partition */.)
7870: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
7880: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
7890: 72 73 65 29 3b 0a 20 20 57 69 6e 64 6f 77 20 2a  rse);.  Window *
78a0: 70 57 69 6e 3b 0a 20 20 66 6f 72 28 70 57 69 6e  pWin;.  for(pWin
78b0: 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57  =pMWin; pWin; pW
78c0: 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69  in=pWin->pNextWi
78d0: 6e 29 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67  n){.    int flag
78e0: 73 20 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2d  s = pWin->pFunc-
78f0: 3e 66 75 6e 63 46 6c 61 67 73 3b 0a 20 20 20 20  >funcFlags;.    
7900: 69 6e 74 20 72 65 67 41 72 67 3b 0a 20 20 20 20  int regArg;.    
7910: 69 6e 74 20 6e 41 72 67 20 3d 20 77 69 6e 64 6f  int nArg = windo
7920: 77 41 72 67 43 6f 75 6e 74 28 70 57 69 6e 29 3b  wArgCount(pWin);
7930: 0a 0a 20 20 20 20 69 66 28 20 63 73 72 3e 3d 30  ..    if( csr>=0
7940: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
7950: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
7960: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
7970: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7980: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
7990: 6c 75 6d 6e 2c 20 63 73 72 2c 20 70 57 69 6e 2d  lumn, csr, pWin-
79a0: 3e 69 41 72 67 43 6f 6c 2b 69 2c 20 72 65 67 2b  >iArgCol+i, reg+
79b0: 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i);.      }.    
79c0: 20 20 72 65 67 41 72 67 20 3d 20 72 65 67 3b 0a    regArg = reg;.
79d0: 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 73 20        if( flags 
79e0: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49  & SQLITE_FUNC_WI
79f0: 4e 44 4f 57 5f 53 49 5a 45 20 29 7b 0a 20 20 20  NDOW_SIZE ){.   
7a00: 20 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 30       if( nArg==0
7a10: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
7a20: 67 41 72 67 20 3d 20 72 65 67 50 61 72 74 53 69  gArg = regPartSi
7a30: 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ze;.        }els
7a40: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
7a50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
7a60: 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 65 67 50  , OP_SCopy, regP
7a70: 61 72 74 53 69 7a 65 2c 20 72 65 67 2b 6e 41 72  artSize, reg+nAr
7a80: 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  g);.        }.  
7a90: 20 20 20 20 20 20 6e 41 72 67 2b 2b 3b 0a 20 20        nArg++;.  
7aa0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
7ab0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
7ac0: 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
7ad0: 46 55 4e 43 5f 57 49 4e 44 4f 57 5f 53 49 5a 45  FUNC_WINDOW_SIZE
7ae0: 29 20 29 3b 0a 20 20 20 20 20 20 72 65 67 41 72  ) );.      regAr
7af0: 67 20 3d 20 72 65 67 20 2b 20 70 57 69 6e 2d 3e  g = reg + pWin->
7b00: 69 41 72 67 43 6f 6c 3b 0a 20 20 20 20 7d 0a 0a  iArgCol;.    }..
7b10: 20 20 20 20 69 66 28 20 28 70 57 69 6e 2d 3e 70      if( (pWin->p
7b20: 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20  Func->funcFlags 
7b30: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49  & SQLITE_FUNC_MI
7b40: 4e 4d 41 58 29 20 0a 20 20 20 20 20 20 26 26 20  NMAX) .      && 
7b50: 70 57 69 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b  pWin->eStart!=TK
7b60: 5f 55 4e 42 4f 55 4e 44 45 44 20 0a 20 20 20 20  _UNBOUNDED .    
7b70: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 49 6e  ){.      if( bIn
7b80: 76 65 72 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20  verse==0 ){.    
7b90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7ba0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
7bb0: 6d 6d 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70  mm, pWin->regApp
7bc0: 2b 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  +1, 1);.        
7bd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7be0: 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72  2(v, OP_SCopy, r
7bf0: 65 67 41 72 67 2c 20 70 57 69 6e 2d 3e 72 65 67  egArg, pWin->reg
7c00: 41 70 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71  App);.        sq
7c10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
7c20: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
7c30: 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2c 20  , pWin->regApp, 
7c40: 32 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b  2, pWin->regApp+
7c50: 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2);.        sqli
7c60: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
7c70: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
7c80: 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20 70 57 69  Win->csrApp, pWi
7c90: 6e 2d 3e 72 65 67 41 70 70 2b 32 29 3b 0a 20 20  n->regApp+2);.  
7ca0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7cb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7cc0: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 53 65  dOp4Int(v, OP_Se
7cd0: 65 6b 47 45 2c 20 70 57 69 6e 2d 3e 63 73 72 41  ekGE, pWin->csrA
7ce0: 70 70 2c 20 30 2c 20 72 65 67 41 72 67 2c 20 31  pp, 0, regArg, 1
7cf0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
7d00: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
7d10: 4f 50 5f 44 65 6c 65 74 65 2c 20 70 57 69 6e 2d  OP_Delete, pWin-
7d20: 3e 63 73 72 41 70 70 29 3b 0a 20 20 20 20 20 20  >csrApp);.      
7d30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
7d40: 70 48 65 72 65 28 76 2c 20 73 71 6c 69 74 65 33  pHere(v, sqlite3
7d50: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
7d60: 76 29 2d 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20  v)-2);.      }. 
7d70: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57 69     }else if( pWi
7d80: 6e 2d 3e 72 65 67 41 70 70 20 29 7b 0a 20 20 20  n->regApp ){.   
7d90: 20 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 2d     assert( pWin-
7da0: 3e 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d  >pFunc->xSFunc==
7db0: 6e 74 68 5f 76 61 6c 75 65 53 74 65 70 46 75 6e  nth_valueStepFun
7dc0: 63 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  c .           ||
7dd0: 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 78 53   pWin->pFunc->xS
7de0: 46 75 6e 63 3d 3d 66 69 72 73 74 5f 76 61 6c 75  Func==first_valu
7df0: 65 53 74 65 70 46 75 6e 63 20 0a 20 20 20 20 20  eStepFunc .     
7e00: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
7e10: 28 20 62 49 6e 76 65 72 73 65 3d 3d 30 20 7c 7c  ( bInverse==0 ||
7e20: 20 62 49 6e 76 65 72 73 65 3d 3d 31 20 29 3b 0a   bInverse==1 );.
7e30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7e40: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
7e50: 64 49 6d 6d 2c 20 70 57 69 6e 2d 3e 72 65 67 41  dImm, pWin->regA
7e60: 70 70 2b 31 2d 62 49 6e 76 65 72 73 65 2c 20 31  pp+1-bInverse, 1
7e70: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
7e80: 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 78 53   pWin->pFunc->xS
7e90: 46 75 6e 63 3d 3d 6c 65 61 64 53 74 65 70 46 75  Func==leadStepFu
7ea0: 6e 63 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  nc .           |
7eb0: 7c 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 78  | pWin->pFunc->x
7ec0: 53 46 75 6e 63 3d 3d 6c 61 67 53 74 65 70 46 75  SFunc==lagStepFu
7ed0: 6e 63 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  nc .    ){.     
7ee0: 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20   /* no-op */.   
7ef0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
7f00: 74 20 61 64 64 72 49 66 20 3d 20 30 3b 0a 20 20  t addrIf = 0;.  
7f10: 20 20 20 20 69 66 28 20 70 57 69 6e 2d 3e 70 46      if( pWin->pF
7f20: 69 6c 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20  ilter ){.       
7f30: 20 69 6e 74 20 72 65 67 54 6d 70 3b 0a 20 20 20   int regTmp;.   
7f40: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 41 72       assert( nAr
7f50: 67 3d 3d 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d  g==pWin->pOwner-
7f60: 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  >x.pList->nExpr 
7f70: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  );.        if( c
7f80: 73 72 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  sr>0 ){.        
7f90: 20 20 72 65 67 54 6d 70 20 3d 20 73 71 6c 69 74    regTmp = sqlit
7fa0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
7fb0: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rse);.          
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 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
7fe0: 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43  csr, pWin->iArgC
7ff0: 6f 6c 2b 6e 41 72 67 2c 72 65 67 54 6d 70 29 3b  ol+nArg,regTmp);
8000: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
8010: 20 20 20 20 20 20 20 20 20 20 72 65 67 54 6d 70            regTmp
8020: 20 3d 20 72 65 67 41 72 67 20 2b 20 6e 41 72 67   = regArg + nArg
8030: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8040: 20 20 20 20 61 64 64 72 49 66 20 3d 20 73 71 6c      addrIf = sql
8050: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
8060: 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 54  , OP_IfNot, regT
8070: 6d 70 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 20  mp, 0, 1);.     
8080: 20 20 20 69 66 28 20 63 73 72 3e 30 20 29 7b 0a     if( csr>0 ){.
8090: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
80a0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
80b0: 70 50 61 72 73 65 2c 20 72 65 67 54 6d 70 29 3b  pParse, regTmp);
80c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
80d0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 57 69   }.      if( pWi
80e0: 6e 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c  n->pFunc->funcFl
80f0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
8100: 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20  C_NEEDCOLL ){.  
8110: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
8120: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 43  Coll;.        pC
8130: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
8140: 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  rNNCollSeq(pPars
8150: 65 2c 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d  e, pWin->pOwner-
8160: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  >x.pList->a[0].p
8170: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73  Expr);.        s
8180: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
8190: 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20  (v, OP_CollSeq, 
81a0: 30 2c 30 2c 30 2c 20 28 63 6f 6e 73 74 20 63 68  0,0,0, (const ch
81b0: 61 72 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  ar*)pColl, P4_CO
81c0: 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a  LLSEQ);.      }.
81d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
81e0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 67  eAddOp3(v, OP_Ag
81f0: 67 53 74 65 70 30 2c 20 62 49 6e 76 65 72 73 65  gStep0, bInverse
8200: 2c 20 72 65 67 41 72 67 2c 20 70 57 69 6e 2d 3e  , regArg, pWin->
8210: 72 65 67 41 63 63 75 6d 29 3b 0a 20 20 20 20 20  regAccum);.     
8220: 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65   sqlite3VdbeAppe
8230: 6e 64 50 34 28 76 2c 20 70 57 69 6e 2d 3e 70 46  ndP4(v, pWin->pF
8240: 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  unc, P4_FUNCDEF)
8250: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
8260: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28  dbeChangeP5(v, (
8270: 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20 20 20  u8)nArg);.      
8280: 69 66 28 20 61 64 64 72 49 66 20 29 20 73 71 6c  if( addrIf ) sql
8290: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
82a0: 28 76 2c 20 61 64 64 72 49 66 29 3b 0a 20 20 20  (v, addrIf);.   
82b0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
82c0: 47 65 6e 65 72 61 74 65 20 56 4d 20 63 6f 64 65  Generate VM code
82d0: 20 74 6f 20 69 6e 76 6f 6b 65 20 65 69 74 68 65   to invoke eithe
82e0: 72 20 78 56 61 6c 75 65 28 29 20 28 62 46 69 6e  r xValue() (bFin
82f0: 61 6c 3d 3d 30 29 20 6f 72 20 78 46 69 6e 61 6c  al==0) or xFinal
8300: 69 7a 65 28 29 0a 2a 2a 20 28 62 46 69 6e 61 6c  ize().** (bFinal
8310: 3d 3d 31 29 20 66 6f 72 20 65 61 63 68 20 77 69  ==1) for each wi
8320: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 69 6e  ndow function in
8330: 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
8340: 20 73 74 61 72 74 69 6e 67 20 61 74 0a 2a 2a 20   starting at.** 
8350: 70 4d 57 69 6e 2e 20 4f 72 2c 20 66 6f 72 20 62  pMWin. Or, for b
8360: 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 2d 66  uilt-in window-f
8370: 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 64 6f  unctions that do
8380: 20 6e 6f 74 20 75 73 65 20 74 68 65 20 73 74 61   not use the sta
8390: 6e 64 61 72 64 0a 2a 2a 20 41 50 49 2c 20 67 65  ndard.** API, ge
83a0: 6e 65 72 61 74 65 20 74 68 65 20 65 71 75 69 76  nerate the equiv
83b0: 61 6c 65 6e 74 20 56 4d 20 63 6f 64 65 2e 0a 2a  alent VM code..*
83c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
83d0: 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 50 61 72  ndowAggFinal(Par
83e0: 73 65 20 2a 70 50 61 72 73 65 2c 20 57 69 6e 64  se *pParse, Wind
83f0: 6f 77 20 2a 70 4d 57 69 6e 2c 20 69 6e 74 20 62  ow *pMWin, int b
8400: 46 69 6e 61 6c 29 7b 0a 20 20 56 64 62 65 20 2a  Final){.  Vdbe *
8410: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
8420: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 57 69  be(pParse);.  Wi
8430: 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 0a 20 20 66  ndow *pWin;..  f
8440: 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70  or(pWin=pMWin; p
8450: 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e  Win; pWin=pWin->
8460: 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 69  pNextWin){.    i
8470: 66 28 20 28 70 57 69 6e 2d 3e 70 46 75 6e 63 2d  f( (pWin->pFunc-
8480: 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
8490: 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29  ITE_FUNC_MINMAX)
84a0: 20 0a 20 20 20 20 20 26 26 20 70 57 69 6e 2d 3e   .     && pWin->
84b0: 65 53 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55  eStart!=TK_UNBOU
84c0: 4e 44 45 44 20 0a 20 20 20 20 29 7b 0a 20 20 20  NDED .    ){.   
84d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
84e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
84f0: 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73   0, pWin->regRes
8500: 75 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ult);.      sqli
8510: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
8520: 20 4f 50 5f 4c 61 73 74 2c 20 70 57 69 6e 2d 3e   OP_Last, pWin->
8530: 63 73 72 41 70 70 29 3b 0a 20 20 20 20 20 20 73  csrApp);.      s
8540: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
8550: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70  (v, OP_Column, p
8560: 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20 30 2c 20  Win->csrApp, 0, 
8570: 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29  pWin->regResult)
8580: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
8590: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 73  dbeJumpHere(v, s
85a0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
85b0: 74 41 64 64 72 28 76 29 2d 32 29 3b 0a 20 20 20  tAddr(v)-2);.   
85c0: 20 20 20 69 66 28 20 62 46 69 6e 61 6c 20 29 7b     if( bFinal ){
85d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
85e0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
85f0: 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20 70 57  _ResetSorter, pW
8600: 69 6e 2d 3e 63 73 72 41 70 70 29 3b 0a 20 20 20  in->csrApp);.   
8610: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
8620: 66 28 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 20  f( pWin->regApp 
8630: 29 7b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ){.    }else{.  
8640: 20 20 20 20 69 66 28 20 62 46 69 6e 61 6c 3d 3d      if( bFinal==
8650: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
8660: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
8670: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57  , OP_Null, 0, pW
8680: 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a  in->regResult);.
8690: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
86a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
86b0: 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20  v, OP_AggFinal, 
86c0: 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 2c 20  pWin->regAccum, 
86d0: 77 69 6e 64 6f 77 41 72 67 43 6f 75 6e 74 28 70  windowArgCount(p
86e0: 57 69 6e 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  Win));.      sql
86f0: 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
8700: 28 76 2c 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2c  (v, pWin->pFunc,
8710: 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
8720: 20 20 20 20 69 66 28 20 62 46 69 6e 61 6c 20 29      if( bFinal )
8730: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8740: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8750: 50 5f 43 6f 70 79 2c 20 70 57 69 6e 2d 3e 72 65  P_Copy, pWin->re
8760: 67 41 63 63 75 6d 2c 20 70 57 69 6e 2d 3e 72 65  gAccum, pWin->re
8770: 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20  gResult);.      
8780: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8790: 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
87a0: 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75  0, pWin->regAccu
87b0: 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  m);.      }else{
87c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
87d0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
87e0: 2d 31 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73  -1, pWin->regRes
87f0: 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ult);.      }.  
8800: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
8810: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 67   This function g
8820: 65 6e 65 72 61 74 65 73 20 56 4d 20 63 6f 64 65  enerates VM code
8830: 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 73   to invoke the s
8840: 75 62 2d 72 6f 75 74 69 6e 65 20 61 74 20 61 64  ub-routine at ad
8850: 64 72 65 73 73 0a 2a 2a 20 6c 62 6c 46 6c 75 73  dress.** lblFlus
8860: 68 50 61 72 74 20 6f 6e 63 65 20 66 6f 72 20 65  hPart once for e
8870: 61 63 68 20 70 61 72 74 69 74 69 6f 6e 20 77 69  ach partition wi
8880: 74 68 20 74 68 65 20 65 6e 74 69 72 65 20 70 61  th the entire pa
8890: 72 74 69 74 69 6f 6e 20 63 61 63 68 65 64 20 69  rtition cached i
88a0: 6e 0a 2a 2a 20 74 68 65 20 57 69 6e 64 6f 77 2e  n.** the Window.
88b0: 69 45 70 68 43 73 72 20 74 65 6d 70 20 74 61 62  iEphCsr temp tab
88c0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
88d0: 69 64 20 77 69 6e 64 6f 77 50 61 72 74 69 74 69  id windowPartiti
88e0: 6f 6e 43 61 63 68 65 28 0a 20 20 50 61 72 73 65  onCache(.  Parse
88f0: 20 2a 70 50 61 72 73 65 2c 0a 20 20 53 65 6c 65   *pParse,.  Sele
8900: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
8910: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
8920: 68 65 20 72 65 77 72 69 74 74 65 6e 20 53 45 4c  he rewritten SEL
8930: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
8940: 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
8950: 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
8960: 20 20 20 2f 2a 20 57 68 65 72 65 49 6e 66 6f 20     /* WhereInfo 
8970: 74 6f 20 63 61 6c 6c 20 57 68 65 72 65 45 6e 64  to call WhereEnd
8980: 28 29 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  () on */.  int r
8990: 65 67 46 6c 75 73 68 50 61 72 74 2c 20 20 20 20  egFlushPart,    
89a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
89b0: 67 69 73 74 65 72 20 74 6f 20 75 73 65 20 77 69  gister to use wi
89c0: 74 68 20 47 6f 73 75 62 20 6c 62 6c 46 6c 75 73  th Gosub lblFlus
89d0: 68 50 61 72 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  hPart */.  int l
89e0: 62 6c 46 6c 75 73 68 50 61 72 74 2c 20 20 20 20  blFlushPart,    
89f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75             /* Su
8a00: 62 72 6f 75 74 69 6e 65 20 74 6f 20 47 6f 73 75  broutine to Gosu
8a10: 62 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  b to */.  int *p
8a20: 52 65 67 53 69 7a 65 20 20 20 20 20 20 20 20 20  RegSize         
8a30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
8a40: 3a 20 52 65 67 69 73 74 65 72 20 63 6f 6e 74 61  : Register conta
8a50: 69 6e 69 6e 67 20 70 61 72 74 69 74 69 6f 6e 20  ining partition 
8a60: 73 69 7a 65 20 2a 2f 0a 29 7b 0a 20 20 57 69 6e  size */.){.  Win
8a70: 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e  dow *pMWin = p->
8a80: 70 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20  pWin;.  Vdbe *v 
8a90: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
8aa0: 28 70 50 61 72 73 65 29 3b 0a 20 20 57 69 6e 64  (pParse);.  Wind
8ab0: 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 69 6e 74 20  ow *pWin;.  int 
8ac0: 69 53 75 62 43 73 72 20 3d 20 70 2d 3e 70 53 72  iSubCsr = p->pSr
8ad0: 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b  c->a[0].iCursor;
8ae0: 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 70 2d  .  int nSub = p-
8af0: 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62  >pSrc->a[0].pTab
8b00: 2d 3e 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 6b 3b  ->nCol;.  int k;
8b10: 0a 0a 20 20 69 6e 74 20 72 65 67 20 3d 20 70 50  ..  int reg = pP
8b20: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
8b30: 69 6e 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20  int regRecord = 
8b40: 72 65 67 2b 6e 53 75 62 3b 0a 20 20 69 6e 74 20  reg+nSub;.  int 
8b50: 72 65 67 52 6f 77 69 64 20 3d 20 72 65 67 52 65  regRowid = regRe
8b60: 63 6f 72 64 2b 31 3b 0a 0a 20 20 2a 70 52 65 67  cord+1;..  *pReg
8b70: 53 69 7a 65 20 3d 20 72 65 67 52 6f 77 69 64 3b  Size = regRowid;
8b80: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  .  pParse->nMem 
8b90: 2b 3d 20 6e 53 75 62 20 2b 20 32 3b 0a 0a 20 20  += nSub + 2;..  
8ba0: 2f 2a 20 4d 61 72 74 69 61 6c 20 74 68 65 20 72  /* Martial the r
8bb0: 6f 77 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ow returned by t
8bc0: 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20 69 6e  he sub-select in
8bd0: 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 0a  to an array of .
8be0: 20 20 2a 2a 20 72 65 67 69 73 74 65 72 73 2e 20    ** registers. 
8bf0: 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c  */.  for(k=0; k<
8c00: 6e 53 75 62 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  nSub; k++){.    
8c10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8c20: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
8c30: 69 53 75 62 43 73 72 2c 20 6b 2c 20 72 65 67 2b  iSubCsr, k, reg+
8c40: 6b 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  k);.  }.  sqlite
8c50: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
8c60: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
8c70: 67 2c 20 6e 53 75 62 2c 20 72 65 67 52 65 63 6f  g, nSub, regReco
8c80: 72 64 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  rd);..  /* Check
8c90: 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
8ca0: 73 74 61 72 74 20 6f 66 20 61 20 6e 65 77 20 70  start of a new p
8cb0: 61 72 74 69 74 69 6f 6e 2e 20 49 66 20 73 6f 2c  artition. If so,
8cc0: 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 66   call the.  ** f
8cd0: 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 20 73  lush_partition s
8ce0: 75 62 2d 72 6f 75 74 69 6e 65 2e 20 20 2a 2f 0a  ub-routine.  */.
8cf0: 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70 50 61    if( pMWin->pPa
8d00: 72 74 69 74 69 6f 6e 20 29 7b 0a 20 20 20 20 69  rtition ){.    i
8d10: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 45 78 70  nt addr;.    Exp
8d20: 72 4c 69 73 74 20 2a 70 50 61 72 74 20 3d 20 70  rList *pPart = p
8d30: 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e  MWin->pPartition
8d40: 3b 0a 20 20 20 20 69 6e 74 20 6e 50 61 72 74 20  ;.    int nPart 
8d50: 3d 20 70 50 61 72 74 2d 3e 6e 45 78 70 72 3b 0a  = pPart->nExpr;.
8d60: 20 20 20 20 69 6e 74 20 72 65 67 4e 65 77 50 61      int regNewPa
8d70: 72 74 20 3d 20 72 65 67 20 2b 20 70 4d 57 69 6e  rt = reg + pMWin
8d80: 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 3b 0a 20 20  ->nBufferCol;.  
8d90: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
8da0: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
8db0: 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
8dc0: 28 70 50 61 72 73 65 2c 20 70 50 61 72 74 2c 20  (pParse, pPart, 
8dd0: 30 2c 20 30 29 3b 0a 0a 20 20 20 20 61 64 64 72  0, 0);..    addr
8de0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
8df0: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp3(v, OP_Compa
8e00: 72 65 2c 20 72 65 67 4e 65 77 50 61 72 74 2c 20  re, regNewPart, 
8e10: 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c 6e  pMWin->regPart,n
8e20: 50 61 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Part);.    sqlit
8e30: 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76  e3VdbeAppendP4(v
8e40: 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66  , (void*)pKeyInf
8e50: 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
8e60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8e70: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
8e80: 2c 20 61 64 64 72 2b 32 2c 20 61 64 64 72 2b 34  , addr+2, addr+4
8e90: 2c 20 61 64 64 72 2b 32 29 3b 0a 20 20 20 20 73  , addr+2);.    s
8ea0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
8eb0: 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67  (v, OP_Copy, reg
8ec0: 4e 65 77 50 61 72 74 2c 20 70 4d 57 69 6e 2d 3e  NewPart, pMWin->
8ed0: 72 65 67 50 61 72 74 2c 20 6e 50 61 72 74 2d 31  regPart, nPart-1
8ee0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
8ef0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
8f00: 6f 73 75 62 2c 20 72 65 67 46 6c 75 73 68 50 61  osub, regFlushPa
8f10: 72 74 2c 20 6c 62 6c 46 6c 75 73 68 50 61 72 74  rt, lblFlushPart
8f20: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 75 66  );.  }..  /* Buf
8f30: 66 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  fer the current 
8f40: 72 6f 77 20 69 6e 20 74 68 65 20 65 70 68 65 6d  row in the ephem
8f50: 65 72 61 6c 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  eral table. */. 
8f60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8f70: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
8f80: 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  d, pMWin->iEphCs
8f90: 72 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  r, regRowid);.  
8fa0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8fb0: 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
8fc0: 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20  pMWin->iEphCsr, 
8fd0: 72 65 67 52 65 63 6f 72 64 2c 20 72 65 67 52 6f  regRecord, regRo
8fe0: 77 69 64 29 3b 0a 0a 20 20 2f 2a 20 45 6e 64 20  wid);..  /* End 
8ff0: 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f  of the input loo
9000: 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 68  p */.  sqlite3Wh
9010: 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
9020: 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 22 66 6c  .  /* Invoke "fl
9030: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 20 74  ush_partition" t
9040: 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 65 20  o deal with the 
9050: 66 69 6e 61 6c 20 28 6f 72 20 6f 6e 6c 79 29 20  final (or only) 
9060: 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 20 20 73  partition */.  s
9070: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
9080: 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
9090: 67 46 6c 75 73 68 50 61 72 74 2c 20 6c 62 6c 46  gFlushPart, lblF
90a0: 6c 75 73 68 50 61 72 74 29 3b 0a 7d 0a 0a 2f 2a  lushPart);.}../*
90b0: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73  .** Invoke the s
90c0: 75 62 2d 72 6f 75 74 69 6e 65 20 61 74 20 72 65  ub-routine at re
90d0: 67 47 6f 73 75 62 20 28 67 65 6e 65 72 61 74 65  gGosub (generate
90e0: 64 20 62 79 20 63 6f 64 65 20 69 6e 20 73 65 6c  d by code in sel
90f0: 65 63 74 2e 63 29 20 74 6f 0a 2a 2a 20 72 65 74  ect.c) to.** ret
9100: 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  urn the current 
9110: 72 6f 77 20 6f 66 20 57 69 6e 64 6f 77 2e 69 45  row of Window.iE
9120: 70 68 43 73 72 2e 20 49 66 20 61 6c 6c 20 77 69  phCsr. If all wi
9130: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 61  ndow functions a
9140: 72 65 0a 2a 2a 20 61 67 67 72 65 67 61 74 65 20  re.** aggregate 
9150: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73  window functions
9160: 20 74 68 61 74 20 75 73 65 20 74 68 65 20 73 74   that use the st
9170: 61 6e 64 61 72 64 20 41 50 49 2c 20 61 20 73 69  andard API, a si
9180: 6e 67 6c 65 0a 2a 2a 20 4f 50 5f 47 6f 73 75 62  ngle.** OP_Gosub
9190: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
91a0: 61 6c 6c 20 74 68 61 74 20 74 68 69 73 20 72 6f  all that this ro
91b0: 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 2e  utine generates.
91c0: 20 45 78 74 72 61 20 56 4d 20 63 6f 64 65 0a 2a   Extra VM code.*
91d0: 2a 20 66 6f 72 20 70 65 72 2d 72 6f 77 20 70 72  * for per-row pr
91e0: 6f 63 65 73 73 69 6e 67 20 69 73 20 6f 6e 6c 79  ocessing is only
91f0: 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74   generated for t
9200: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 75 69  he following bui
9210: 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 0a 2a 2a 20  lt-in window.** 
9220: 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  functions:.**.**
9230: 20 20 20 6e 74 68 5f 76 61 6c 75 65 28 29 0a 2a     nth_value().*
9240: 2a 20 20 20 66 69 72 73 74 5f 76 61 6c 75 65 28  *   first_value(
9250: 29 0a 2a 2a 20 20 20 6c 61 67 28 29 0a 2a 2a 20  ).**   lag().** 
9260: 20 20 6c 65 61 64 28 29 0a 2a 2f 0a 73 74 61 74    lead().*/.stat
9270: 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 52 65  ic void windowRe
9280: 74 75 72 6e 4f 6e 65 52 6f 77 28 0a 20 20 50 61  turnOneRow(.  Pa
9290: 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 57  rse *pParse,.  W
92a0: 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 2c 0a 20 20  indow *pMWin,.  
92b0: 69 6e 74 20 72 65 67 47 6f 73 75 62 2c 0a 20 20  int regGosub,.  
92c0: 69 6e 74 20 61 64 64 72 47 6f 73 75 62 0a 29 7b  int addrGosub.){
92d0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
92e0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
92f0: 73 65 29 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70  se);.  Window *p
9300: 57 69 6e 3b 0a 20 20 66 6f 72 28 70 57 69 6e 3d  Win;.  for(pWin=
9310: 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69  pMWin; pWin; pWi
9320: 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e  n=pWin->pNextWin
9330: 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a  ){.    FuncDef *
9340: 70 46 75 6e 63 20 3d 20 70 57 69 6e 2d 3e 70 46  pFunc = pWin->pF
9350: 75 6e 63 3b 0a 20 20 20 20 69 66 28 20 70 46 75  unc;.    if( pFu
9360: 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 6e 74 68 5f  nc->xSFunc==nth_
9370: 76 61 6c 75 65 53 74 65 70 46 75 6e 63 20 0a 20  valueStepFunc . 
9380: 20 20 20 20 7c 7c 20 70 46 75 6e 63 2d 3e 78 53      || pFunc->xS
9390: 46 75 6e 63 3d 3d 66 69 72 73 74 5f 76 61 6c 75  Func==first_valu
93a0: 65 53 74 65 70 46 75 6e 63 20 0a 20 20 20 20 29  eStepFunc .    )
93b0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 63 73 72 20  {.      int csr 
93c0: 3d 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 3b 0a  = pWin->csrApp;.
93d0: 20 20 20 20 20 20 69 6e 74 20 6c 62 6c 20 3d 20        int lbl = 
93e0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
93f0: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
9400: 6e 74 20 74 6d 70 52 65 67 20 3d 20 73 71 6c 69  nt tmpReg = sqli
9410: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
9420: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
9430: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
9440: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57  , OP_Null, 0, pW
9450: 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a  in->regResult);.
9460: 0a 20 20 20 20 20 20 69 66 28 20 70 46 75 6e 63  .      if( pFunc
9470: 2d 3e 78 53 46 75 6e 63 3d 3d 6e 74 68 5f 76 61  ->xSFunc==nth_va
9480: 6c 75 65 53 74 65 70 46 75 6e 63 20 29 7b 0a 20  lueStepFunc ){. 
9490: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
94a0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
94b0: 6f 6c 75 6d 6e 2c 20 70 4d 57 69 6e 2d 3e 69 45  olumn, pMWin->iE
94c0: 70 68 43 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72  phCsr, pWin->iAr
94d0: 67 43 6f 6c 2b 31 2c 74 6d 70 52 65 67 29 3b 0a  gCol+1,tmpReg);.
94e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
94f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9500: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
9510: 65 67 65 72 2c 20 31 2c 20 74 6d 70 52 65 67 29  eger, 1, tmpReg)
9520: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9530: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9540: 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20 74 6d 70  3(v, OP_Add, tmp
9550: 52 65 67 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70  Reg, pWin->regAp
9560: 70 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20  p, tmpReg);.    
9570: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9580: 4f 70 33 28 76 2c 20 4f 50 5f 47 74 2c 20 70 57  Op3(v, OP_Gt, pW
9590: 69 6e 2d 3e 72 65 67 41 70 70 2b 31 2c 20 6c 62  in->regApp+1, lb
95a0: 6c 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20  l, tmpReg);.    
95b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
95c0: 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f  Op3(v, OP_SeekRo
95d0: 77 69 64 2c 20 63 73 72 2c 20 6c 62 6c 2c 20 74  wid, csr, lbl, t
95e0: 6d 70 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71  mpReg);.      sq
95f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
9600: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73  v, OP_Column, cs
9610: 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c  r, pWin->iArgCol
9620: 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c  , pWin->regResul
9630: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
9640: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
9650: 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20 20 20 20 20  l(v, lbl);.     
9660: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
9670: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 74  empReg(pParse, t
9680: 6d 70 52 65 67 29 3b 0a 20 20 20 20 7d 0a 20 20  mpReg);.    }.  
9690: 20 20 65 6c 73 65 20 69 66 28 20 70 46 75 6e 63    else if( pFunc
96a0: 2d 3e 78 53 46 75 6e 63 3d 3d 6c 65 61 64 53 74  ->xSFunc==leadSt
96b0: 65 70 46 75 6e 63 20 7c 7c 20 70 46 75 6e 63 2d  epFunc || pFunc-
96c0: 3e 78 53 46 75 6e 63 3d 3d 6c 61 67 53 74 65 70  >xSFunc==lagStep
96d0: 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 69 6e  Func ){.      in
96e0: 74 20 6e 41 72 67 20 3d 20 70 57 69 6e 2d 3e 70  t nArg = pWin->p
96f0: 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  Owner->x.pList->
9700: 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74  nExpr;.      int
9710: 20 69 45 70 68 20 3d 20 70 4d 57 69 6e 2d 3e 69   iEph = pMWin->i
9720: 45 70 68 43 73 72 3b 0a 20 20 20 20 20 20 69 6e  EphCsr;.      in
9730: 74 20 63 73 72 20 3d 20 70 57 69 6e 2d 3e 63 73  t csr = pWin->cs
9740: 72 41 70 70 3b 0a 20 20 20 20 20 20 69 6e 74 20  rApp;.      int 
9750: 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  lbl = sqlite3Vdb
9760: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
9770: 20 20 20 20 20 69 6e 74 20 74 6d 70 52 65 67 20       int tmpReg 
9780: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
9790: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 0a 20 20  Reg(pParse);..  
97a0: 20 20 20 20 69 66 28 20 6e 41 72 67 3c 33 20 29      if( nArg<3 )
97b0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
97c0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
97d0: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d  P_Null, 0, pWin-
97e0: 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20  >regResult);.   
97f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9800: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9810: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
9820: 2c 20 69 45 70 68 2c 20 70 57 69 6e 2d 3e 69 41  , iEph, pWin->iA
9830: 72 67 43 6f 6c 2b 32 2c 20 70 57 69 6e 2d 3e 72  rgCol+2, pWin->r
9840: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
9850: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
9860: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
9870: 5f 52 6f 77 69 64 2c 20 69 45 70 68 2c 20 74 6d  _Rowid, iEph, tm
9880: 70 52 65 67 29 3b 0a 20 20 20 20 20 20 69 66 28  pReg);.      if(
9890: 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20 20 20   nArg<2 ){.     
98a0: 20 20 20 69 6e 74 20 76 61 6c 20 3d 20 28 70 46     int val = (pF
98b0: 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 6c 65 61  unc->xSFunc==lea
98c0: 64 53 74 65 70 46 75 6e 63 20 3f 20 31 20 3a 20  dStepFunc ? 1 : 
98d0: 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  -1);.        sql
98e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
98f0: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 6d 70  , OP_AddImm, tmp
9900: 52 65 67 2c 20 76 61 6c 29 3b 0a 20 20 20 20 20  Reg, val);.     
9910: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9920: 69 6e 74 20 6f 70 20 3d 20 28 70 46 75 6e 63 2d  int op = (pFunc-
9930: 3e 78 53 46 75 6e 63 3d 3d 6c 65 61 64 53 74 65  >xSFunc==leadSte
9940: 70 46 75 6e 63 20 3f 20 4f 50 5f 41 64 64 20 3a  pFunc ? OP_Add :
9950: 20 4f 50 5f 53 75 62 74 72 61 63 74 29 3b 0a 20   OP_Subtract);. 
9960: 20 20 20 20 20 20 20 69 6e 74 20 74 6d 70 52 65         int tmpRe
9970: 67 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  g2 = sqlite3GetT
9980: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
9990: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
99a0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
99b0: 43 6f 6c 75 6d 6e 2c 20 69 45 70 68 2c 20 70 57  Column, iEph, pW
99c0: 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 31 2c 20 74  in->iArgCol+1, t
99d0: 6d 70 52 65 67 32 29 3b 0a 20 20 20 20 20 20 20  mpReg2);.       
99e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
99f0: 70 33 28 76 2c 20 6f 70 2c 20 74 6d 70 52 65 67  p3(v, op, tmpReg
9a00: 32 2c 20 74 6d 70 52 65 67 2c 20 74 6d 70 52 65  2, tmpReg, tmpRe
9a10: 67 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  g);.        sqli
9a20: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
9a30: 67 28 70 50 61 72 73 65 2c 20 74 6d 70 52 65 67  g(pParse, tmpReg
9a40: 32 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  2);.      }..   
9a50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9a60: 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52  dOp3(v, OP_SeekR
9a70: 6f 77 69 64 2c 20 63 73 72 2c 20 6c 62 6c 2c 20  owid, csr, lbl, 
9a80: 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20 20 73  tmpReg);.      s
9a90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
9aa0: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63  (v, OP_Column, c
9ab0: 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f  sr, pWin->iArgCo
9ac0: 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75  l, pWin->regResu
9ad0: 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lt);.      sqlit
9ae0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
9af0: 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20 20 20 20  el(v, lbl);.    
9b00: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
9b10: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
9b20: 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 7d 0a 20  tmpReg);.    }. 
9b30: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
9b40: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
9b50: 75 62 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64  ub, regGosub, ad
9b60: 64 72 47 6f 73 75 62 29 3b 0a 7d 0a 0a 2f 2a 0a  drGosub);.}../*.
9b70: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 63 6f  ** Invoke the co
9b80: 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  de generated by 
9b90: 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52  windowReturnOneR
9ba0: 6f 77 28 29 20 61 6e 64 2c 20 6f 70 74 69 6f 6e  ow() and, option
9bb0: 61 6c 6c 79 2c 20 74 68 65 0a 2a 2a 20 78 49 6e  ally, the.** xIn
9bc0: 76 65 72 73 65 28 29 20 66 75 6e 63 74 69 6f 6e  verse() function
9bd0: 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77   for each window
9be0: 20 66 75 6e 63 74 69 6f 6e 2c 20 66 6f 72 20 6f   function, for o
9bf0: 6e 65 20 6f 72 20 6d 6f 72 65 20 72 6f 77 73 0a  ne or more rows.
9c00: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 57 69 6e 64  ** from the Wind
9c10: 6f 77 2e 69 45 70 68 43 73 72 20 74 65 6d 70 20  ow.iEphCsr temp 
9c20: 74 61 62 6c 65 2e 20 54 68 69 73 20 72 6f 75 74  table. This rout
9c30: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 56 4d  ine generates VM
9c40: 20 63 6f 64 65 0a 2a 2a 20 73 69 6d 69 6c 61 72   code.** similar
9c50: 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 77 68 69   to:.**.**   whi
9c60: 6c 65 28 20 72 65 67 43 74 72 3e 30 20 29 7b 0a  le( regCtr>0 ){.
9c70: 2a 2a 20 20 20 20 20 72 65 67 43 74 72 2d 2d 3b  **     regCtr--;
9c80: 0a 2a 2a 20 20 20 20 20 77 69 6e 64 6f 77 52 65  .**     windowRe
9c90: 74 75 72 6e 4f 6e 65 52 6f 77 28 29 0a 2a 2a 20  turnOneRow().** 
9ca0: 20 20 20 20 69 66 28 20 62 49 6e 76 65 72 73 65      if( bInverse
9cb0: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67 67   ){.**       Agg
9cc0: 53 74 65 70 20 28 78 49 6e 76 65 72 73 65 29 0a  Step (xInverse).
9cd0: 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20  **     }.**     
9ce0: 4e 65 78 74 20 28 57 69 6e 64 6f 77 2e 69 45 70  Next (Window.iEp
9cf0: 68 43 73 72 29 0a 2a 2a 20 20 20 7d 0a 2a 2f 0a  hCsr).**   }.*/.
9d00: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64  static void wind
9d10: 6f 77 52 65 74 75 72 6e 52 6f 77 73 28 0a 20 20  owReturnRows(.  
9d20: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20  Parse *pParse,. 
9d30: 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 2c 20   Window *pMWin, 
9d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d50: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 77 69 6e 64   /* List of wind
9d60: 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  ow functions */.
9d70: 20 20 69 6e 74 20 72 65 67 43 74 72 2c 20 20 20    int regCtr,   
9d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d90: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 63 6f    /* Register co
9da0: 6e 74 61 69 6e 69 6e 67 20 6e 75 6d 62 65 72 20  ntaining number 
9db0: 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74  of rows */.  int
9dc0: 20 72 65 67 47 6f 73 75 62 2c 20 20 20 20 20 20   regGosub,      
9dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9de0: 52 65 67 69 73 74 65 72 20 66 6f 72 20 47 6f 73  Register for Gos
9df0: 75 62 20 61 64 64 72 47 6f 73 75 62 20 2a 2f 0a  ub addrGosub */.
9e00: 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75 62 2c    int addrGosub,
9e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e20: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
9e30: 73 75 62 2d 72 6f 75 74 69 6e 65 20 66 6f 72 20  sub-routine for 
9e40: 52 65 74 75 72 6e 4f 6e 65 52 6f 77 20 2a 2f 0a  ReturnOneRow */.
9e50: 20 20 69 6e 74 20 72 65 67 49 6e 76 41 72 67 2c    int regInvArg,
9e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e70: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 72 65    /* Array of re
9e80: 67 69 73 74 65 72 73 20 66 6f 72 20 78 49 6e 76  gisters for xInv
9e90: 65 72 73 65 20 61 72 67 73 20 2a 2f 0a 20 20 69  erse args */.  i
9ea0: 6e 74 20 72 65 67 49 6e 76 53 69 7a 65 20 20 20  nt regInvSize   
9eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9ec0: 2a 20 52 65 67 69 73 74 65 72 20 63 6f 6e 74 61  * Register conta
9ed0: 69 6e 69 6e 67 20 73 69 7a 65 20 6f 66 20 70 61  ining size of pa
9ee0: 72 74 69 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  rtition */.){.  
9ef0: 69 6e 74 20 61 64 64 72 3b 0a 20 20 56 64 62 65  int addr;.  Vdbe
9f00: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
9f10: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
9f20: 77 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 70  windowAggFinal(p
9f30: 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 30 29  Parse, pMWin, 0)
9f40: 3b 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74  ;.  addr = sqlit
9f50: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
9f60: 4f 50 5f 49 66 50 6f 73 2c 20 72 65 67 43 74 72  OP_IfPos, regCtr
9f70: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
9f80: 72 65 6e 74 41 64 64 72 28 76 29 2b 32 20 2c 31  rentAddr(v)+2 ,1
9f90: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
9fa0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
9fb0: 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 77 69 6e 64  o, 0, 0);.  wind
9fc0: 6f 77 52 65 74 75 72 6e 4f 6e 65 52 6f 77 28 70  owReturnOneRow(p
9fd0: 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 72 65  Parse, pMWin, re
9fe0: 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75  gGosub, addrGosu
9ff0: 62 29 3b 0a 20 20 69 66 28 20 72 65 67 49 6e 76  b);.  if( regInv
a000: 41 72 67 20 29 7b 0a 20 20 20 20 77 69 6e 64 6f  Arg ){.    windo
a010: 77 41 67 67 53 74 65 70 28 70 50 61 72 73 65 2c  wAggStep(pParse,
a020: 20 70 4d 57 69 6e 2c 20 70 4d 57 69 6e 2d 3e 69   pMWin, pMWin->i
a030: 45 70 68 43 73 72 2c 20 31 2c 20 72 65 67 49 6e  EphCsr, 1, regIn
a040: 76 41 72 67 2c 20 72 65 67 49 6e 76 53 69 7a 65  vArg, regInvSize
a050: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
a060: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
a070: 5f 4e 65 78 74 2c 20 70 4d 57 69 6e 2d 3e 69 45  _Next, pMWin->iE
a080: 70 68 43 73 72 2c 20 61 64 64 72 29 3b 0a 20 20  phCsr, addr);.  
a090: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
a0a0: 65 72 65 28 76 2c 20 61 64 64 72 2b 31 29 3b 20  ere(v, addr+1); 
a0b0: 20 20 2f 2a 20 54 68 65 20 4f 50 5f 47 6f 74 6f    /* The OP_Goto
a0c0: 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   */.}../*.** Gen
a0d0: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 65  erate code to se
a0e0: 74 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  t the accumulato
a0f0: 72 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 65  r register for e
a100: 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  ach window funct
a110: 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 6c 69  ion.** in the li
a120: 6e 6b 65 64 20 6c 69 73 74 20 70 61 73 73 65 64  nked list passed
a130: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
a140: 72 67 75 6d 65 6e 74 20 74 6f 20 4e 55 4c 4c 2e  rgument to NULL.
a150: 20 41 6e 64 20 70 65 72 66 6f 72 6d 0a 2a 2a 20   And perform.** 
a160: 61 6e 79 20 65 71 75 69 76 61 6c 65 6e 74 20 69  any equivalent i
a170: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 72 65  nitialization re
a180: 71 75 69 72 65 64 20 62 79 20 61 6e 79 20 62 75  quired by any bu
a190: 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75  ilt-in window fu
a1a0: 6e 63 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 74 68  nctions.** in th
a1b0: 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
a1c0: 63 20 69 6e 74 20 77 69 6e 64 6f 77 49 6e 69 74  c int windowInit
a1d0: 41 63 63 75 6d 28 50 61 72 73 65 20 2a 70 50 61  Accum(Parse *pPa
a1e0: 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70 4d 57  rse, Window *pMW
a1f0: 69 6e 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  in){.  Vdbe *v =
a200: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
a210: 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72  pParse);.  int r
a220: 65 67 41 72 67 3b 0a 20 20 69 6e 74 20 6e 41 72  egArg;.  int nAr
a230: 67 20 3d 20 30 3b 0a 20 20 57 69 6e 64 6f 77 20  g = 0;.  Window 
a240: 2a 70 57 69 6e 3b 0a 20 20 66 6f 72 28 70 57 69  *pWin;.  for(pWi
a250: 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70  n=pMWin; pWin; p
a260: 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57  Win=pWin->pNextW
a270: 69 6e 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66  in){.    FuncDef
a280: 20 2a 70 46 75 6e 63 20 3d 20 70 57 69 6e 2d 3e   *pFunc = pWin->
a290: 70 46 75 6e 63 3b 0a 20 20 20 20 73 71 6c 69 74  pFunc;.    sqlit
a2a0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
a2b0: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e  OP_Null, 0, pWin
a2c0: 2d 3e 72 65 67 41 63 63 75 6d 29 3b 0a 20 20 20  ->regAccum);.   
a2d0: 20 6e 41 72 67 20 3d 20 4d 41 58 28 6e 41 72 67   nArg = MAX(nArg
a2e0: 2c 20 77 69 6e 64 6f 77 41 72 67 43 6f 75 6e 74  , windowArgCount
a2f0: 28 70 57 69 6e 29 29 3b 0a 20 20 20 20 69 66 28  (pWin));.    if(
a300: 20 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d   pFunc->xSFunc==
a310: 6e 74 68 5f 76 61 6c 75 65 53 74 65 70 46 75 6e  nth_valueStepFun
a320: 63 0a 20 20 20 20 20 7c 7c 20 70 46 75 6e 63 2d  c.     || pFunc-
a330: 3e 78 53 46 75 6e 63 3d 3d 66 69 72 73 74 5f 76  >xSFunc==first_v
a340: 61 6c 75 65 53 74 65 70 46 75 6e 63 20 0a 20 20  alueStepFunc .  
a350: 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74    ){.      sqlit
a360: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
a370: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70  OP_Integer, 0, p
a380: 57 69 6e 2d 3e 72 65 67 41 70 70 29 3b 0a 20 20  Win->regApp);.  
a390: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a3a0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
a3b0: 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65  ger, 0, pWin->re
a3c0: 67 41 70 70 2b 31 29 3b 0a 20 20 20 20 7d 0a 0a  gApp+1);.    }..
a3d0: 20 20 20 20 69 66 28 20 28 70 46 75 6e 63 2d 3e      if( (pFunc->
a3e0: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
a3f0: 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 20  TE_FUNC_MINMAX) 
a400: 26 26 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 20  && pWin->csrApp 
a410: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
a420: 20 70 57 69 6e 2d 3e 65 53 74 61 72 74 21 3d 54   pWin->eStart!=T
a430: 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 3b 0a 20  K_UNBOUNDED );. 
a440: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a450: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73  AddOp1(v, OP_Res
a460: 65 74 53 6f 72 74 65 72 2c 20 70 57 69 6e 2d 3e  etSorter, pWin->
a470: 63 73 72 41 70 70 29 3b 0a 20 20 20 20 20 20 73  csrApp);.      s
a480: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
a490: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
a4a0: 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b  0, pWin->regApp+
a4b0: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1);.    }.  }.  
a4c0: 72 65 67 41 72 67 20 3d 20 70 50 61 72 73 65 2d  regArg = pParse-
a4d0: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 70 50 61 72 73  >nMem+1;.  pPars
a4e0: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 41 72 67 3b  e->nMem += nArg;
a4f0: 0a 20 20 72 65 74 75 72 6e 20 72 65 67 41 72 67  .  return regArg
a500: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
a510: 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74   function does t
a520: 68 65 20 77 6f 72 6b 20 6f 66 20 73 71 6c 69 74  he work of sqlit
a530: 65 33 57 69 6e 64 6f 77 43 6f 64 65 53 74 65 70  e3WindowCodeStep
a540: 28 29 20 66 6f 72 20 61 6c 6c 20 22 52 4f 57 53  () for all "ROWS
a550: 22 0a 2a 2a 20 77 69 6e 64 6f 77 20 66 72 61 6d  ".** window fram
a560: 65 20 74 79 70 65 73 20 65 78 63 65 70 74 20 66  e types except f
a570: 6f 72 20 22 42 45 54 57 45 45 4e 20 55 4e 42 4f  or "BETWEEN UNBO
a580: 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20  UNDED PRECEDING 
a590: 41 4e 44 20 43 55 52 52 45 4e 54 0a 2a 2a 20 52  AND CURRENT.** R
a5a0: 4f 57 22 2e 20 50 73 65 75 64 6f 2d 63 6f 64 65  OW". Pseudo-code
a5b0: 20 66 6f 72 20 65 61 63 68 20 66 6f 6c 6c 6f 77   for each follow
a5c0: 73 2e 0a 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42 45  s..**.** ROWS BE
a5d0: 54 57 45 45 4e 20 3c 65 78 70 72 31 3e 20 50 52  TWEEN <expr1> PR
a5e0: 45 43 45 44 49 4e 47 20 41 4e 44 20 3c 65 78 70  ECEDING AND <exp
a5f0: 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a  r2> FOLLOWING.**
a600: 0a 2a 2a 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20  .**     ....**  
a610: 20 20 20 20 20 69 66 28 20 6e 65 77 20 70 61 72       if( new par
a620: 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20  tition ){.**    
a630: 20 20 20 20 20 47 6f 73 75 62 20 66 6c 75 73 68       Gosub flush
a640: 5f 70 61 72 74 69 74 69 6f 6e 0a 2a 2a 20 20 20  _partition.**   
a650: 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 49      }.**       I
a660: 6e 73 65 72 74 20 28 72 65 63 6f 72 64 20 69 6e  nsert (record in
a670: 20 65 70 68 2d 74 61 62 6c 65 29 0a 2a 2a 20 20   eph-table).**  
a680: 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
a690: 6e 64 28 29 0a 2a 2a 20 20 20 20 20 47 6f 73 75  nd().**     Gosu
a6a0: 62 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f  b flush_partitio
a6b0: 6e 0a 2a 2a 20 20 0a 2a 2a 20 20 20 66 6c 75 73  n.**  .**   flus
a6c0: 68 5f 70 61 72 74 69 74 69 6f 6e 3a 0a 2a 2a 20  h_partition:.** 
a6d0: 20 20 20 20 4f 6e 63 65 20 7b 0a 2a 2a 20 20 20      Once {.**   
a6e0: 20 20 20 20 4f 70 65 6e 44 75 70 20 28 69 45 70      OpenDup (iEp
a6f0: 68 43 73 72 20 2d 3e 20 63 73 72 53 74 61 72 74  hCsr -> csrStart
a700: 29 0a 2a 2a 20 20 20 20 20 20 20 4f 70 65 6e 44  ).**       OpenD
a710: 75 70 20 28 69 45 70 68 43 73 72 20 2d 3e 20 63  up (iEphCsr -> c
a720: 73 72 45 6e 64 29 0a 2a 2a 20 20 20 20 20 7d 0a  srEnd).**     }.
a730: 2a 2a 20 20 20 20 20 72 65 67 53 74 61 72 74 20  **     regStart 
a740: 3d 20 3c 65 78 70 72 31 3e 20 20 20 20 20 20 20  = <expr1>       
a750: 20 20 20 20 20 20 20 20 20 2f 2f 20 50 52 45 43           // PREC
a760: 45 44 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e  EDING expression
a770: 0a 2a 2a 20 20 20 20 20 72 65 67 45 6e 64 20 3d  .**     regEnd =
a780: 20 3c 65 78 70 72 32 3e 20 20 20 20 20 20 20 20   <expr2>        
a790: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 46 4f 4c            // FOL
a7a0: 4c 4f 57 49 4e 47 20 65 78 70 72 65 73 73 69 6f  LOWING expressio
a7b0: 6e 0a 2a 2a 20 20 20 20 20 69 66 28 20 72 65 67  n.**     if( reg
a7c0: 53 74 61 72 74 3c 30 20 7c 7c 20 72 65 67 45 6e  Start<0 || regEn
a7d0: 64 3c 30 20 29 7b 20 65 72 72 6f 72 21 20 7d 0a  d<0 ){ error! }.
a7e0: 2a 2a 20 20 20 20 20 52 65 77 69 6e 64 20 28 63  **     Rewind (c
a7f0: 73 72 2c 63 73 72 53 74 61 72 74 2c 63 73 72 45  sr,csrStart,csrE
a800: 6e 64 29 20 20 20 20 20 20 2f 2f 20 69 66 20 45  nd)      // if E
a810: 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68 5f 70 61  OF goto flush_pa
a820: 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20  rtition_done.** 
a830: 20 20 20 20 20 20 4e 65 78 74 28 63 73 72 45 6e        Next(csrEn
a840: 64 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d)              
a850: 20 20 20 20 20 20 2f 2f 20 69 66 20 45 4f 46 20        // if EOF 
a860: 73 6b 69 70 20 41 67 67 73 74 65 70 0a 2a 2a 20  skip Aggstep.** 
a870: 20 20 20 20 20 20 41 67 67 73 74 65 70 20 28 63        Aggstep (c
a880: 73 72 45 6e 64 29 0a 2a 2a 20 20 20 20 20 20 20  srEnd).**       
a890: 69 66 28 20 28 72 65 67 45 6e 64 2d 2d 29 3c 3d  if( (regEnd--)<=
a8a0: 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  0 ){.**         
a8b0: 41 67 67 46 69 6e 61 6c 20 28 78 56 61 6c 75 65  AggFinal (xValue
a8c0: 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 47 6f 73  ).**         Gos
a8d0: 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20  ub addrGosub.** 
a8e0: 20 20 20 20 20 20 20 20 4e 65 78 74 28 63 73 72          Next(csr
a8f0: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
a900: 20 2f 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f 20   // if EOF goto 
a910: 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f  flush_partition_
a920: 64 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  done.**         
a930: 69 66 28 20 28 72 65 67 53 74 61 72 74 2d 2d 29  if( (regStart--)
a940: 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  <=0 ){.**       
a950: 20 20 20 20 41 67 67 53 74 65 70 20 28 63 73 72      AggStep (csr
a960: 53 74 61 72 74 2c 20 78 49 6e 76 65 72 73 65 29  Start, xInverse)
a970: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 4e 65  .**           Ne
a980: 78 74 28 63 73 72 53 74 61 72 74 29 0a 2a 2a 20  xt(csrStart).** 
a990: 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20          }.**    
a9a0: 20 20 20 7d 0a 2a 2a 20 20 20 66 6c 75 73 68 5f     }.**   flush_
a9b0: 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 3a 0a  partition_done:.
a9c0: 2a 2a 20 20 20 20 20 52 65 73 65 74 53 6f 72 74  **     ResetSort
a9d0: 65 72 20 28 63 73 72 29 0a 2a 2a 20 20 20 20 20  er (csr).**     
a9e0: 52 65 74 75 72 6e 0a 2a 2a 0a 2a 2a 20 52 4f 57  Return.**.** ROW
a9f0: 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 3e  S BETWEEN <expr>
aa00: 20 50 52 45 43 45 44 49 4e 47 20 20 20 20 41 4e   PRECEDING    AN
aa10: 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a  D CURRENT ROW.**
aa20: 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20 43 55   ROWS BETWEEN CU
aa30: 52 52 45 4e 54 20 52 4f 57 20 20 20 20 20 20 20  RRENT ROW       
aa40: 20 20 41 4e 44 20 3c 65 78 70 72 3e 20 46 4f 4c    AND <expr> FOL
aa50: 4c 4f 57 49 4e 47 0a 2a 2a 20 52 4f 57 53 20 42  LOWING.** ROWS B
aa60: 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44  ETWEEN UNBOUNDED
aa70: 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 3c   PRECEDING AND <
aa80: 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a  expr> FOLLOWING.
aa90: 2a 2a 0a 2a 2a 20 20 20 54 68 65 73 65 20 61 72  **.**   These ar
aaa0: 65 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65  e similar to the
aab0: 20 61 62 6f 76 65 2e 20 46 6f 72 20 22 43 55 52   above. For "CUR
aac0: 52 45 4e 54 20 52 4f 57 22 2c 20 69 6e 74 69 61  RENT ROW", intia
aad0: 6c 69 7a 65 20 74 68 65 0a 2a 2a 20 20 20 72 65  lize the.**   re
aae0: 67 69 73 74 65 72 20 74 6f 20 30 2e 20 46 6f 72  gister to 0. For
aaf0: 20 22 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43   "UNBOUNDED PREC
ab00: 45 44 49 4e 47 22 20 74 6f 20 69 6e 66 69 6e 69  EDING" to infini
ab10: 74 79 2e 0a 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42  ty..**.** ROWS B
ab20: 45 54 57 45 45 4e 20 3c 65 78 70 72 3e 20 50 52  ETWEEN <expr> PR
ab30: 45 43 45 44 49 4e 47 20 20 20 20 41 4e 44 20 55  ECEDING    AND U
ab40: 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49  NBOUNDED FOLLOWI
ab50: 4e 47 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57 45  NG.** ROWS BETWE
ab60: 45 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20 20  EN CURRENT ROW  
ab70: 20 20 20 20 20 20 20 41 4e 44 20 55 4e 42 4f 55         AND UNBOU
ab80: 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a  NDED FOLLOWING.*
ab90: 2a 0a 2a 2a 20 20 20 20 20 52 65 77 69 6e 64 20  *.**     Rewind 
aba0: 28 63 73 72 2c 63 73 72 53 74 61 72 74 2c 63 73  (csr,csrStart,cs
abb0: 72 45 6e 64 29 20 20 20 20 2f 2f 20 69 66 20 45  rEnd)    // if E
abc0: 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68 5f 70 61  OF goto flush_pa
abd0: 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20  rtition_done.** 
abe0: 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a      while( 1 ){.
abf0: 2a 2a 20 20 20 20 20 20 20 4e 65 78 74 28 63 73  **       Next(cs
ac00: 72 45 6e 64 29 20 20 20 20 20 20 20 20 20 20 20  rEnd)           
ac10: 20 20 20 20 20 20 20 2f 2f 20 45 78 69 74 20 77         // Exit w
ac20: 68 69 6c 65 28 31 29 20 61 74 20 45 4f 46 0a 2a  hile(1) at EOF.*
ac30: 2a 20 20 20 20 20 20 20 41 67 67 73 74 65 70 20  *       Aggstep 
ac40: 28 63 73 72 45 6e 64 29 0a 2a 2a 20 20 20 20 20  (csrEnd).**     
ac50: 7d 0a 2a 2a 20 20 20 20 20 77 68 69 6c 65 28 20  }.**     while( 
ac60: 31 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67  1 ){.**       Ag
ac70: 67 46 69 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a  gFinal (xValue).
ac80: 2a 2a 20 20 20 20 20 20 20 47 6f 73 75 62 20 61  **       Gosub a
ac90: 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20  ddrGosub.**     
aca0: 20 20 4e 65 78 74 28 63 73 72 29 20 20 20 20 20    Next(csr)     
acb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
acc0: 2f 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f 20 66  // if EOF goto f
acd0: 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64  lush_partition_d
ace0: 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 69 66 28  one.**       if(
acf0: 20 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30   (regStart--)<=0
ad00: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41   ){.**         A
ad10: 67 67 53 74 65 70 20 28 63 73 72 53 74 61 72 74  ggStep (csrStart
ad20: 2c 20 78 49 6e 76 65 72 73 65 29 0a 2a 2a 20 20  , xInverse).**  
ad30: 20 20 20 20 20 20 20 4e 65 78 74 28 63 73 72 53         Next(csrS
ad40: 74 61 72 74 29 0a 2a 2a 20 20 20 20 20 20 20 7d  tart).**       }
ad50: 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20  .**     }.**.** 
ad60: 20 20 46 6f 72 20 74 68 65 20 22 43 55 52 52 45    For the "CURRE
ad70: 4e 54 20 52 4f 57 20 41 4e 44 20 55 4e 42 4f 55  NT ROW AND UNBOU
ad80: 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 22 20  NDED FOLLOWING" 
ad90: 63 61 73 65 2c 20 74 68 65 20 66 69 6e 61 6c 20  case, the final 
ada0: 69 66 28 29 20 0a 2a 2a 20 20 20 63 6f 6e 64 69  if() .**   condi
adb0: 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 74  tion is always t
adc0: 72 75 65 20 28 61 73 20 69 66 20 72 65 67 53 74  rue (as if regSt
add0: 61 72 74 20 77 65 72 65 20 69 6e 69 74 69 61 6c  art were initial
ade0: 69 7a 65 64 20 74 6f 20 30 29 2e 0a 2a 2a 0a 2a  ized to 0)..**.*
adf0: 2a 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20  * RANGE BETWEEN 
ae00: 43 55 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20  CURRENT ROW AND 
ae10: 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57  UNBOUNDED FOLLOW
ae20: 49 4e 47 0a 2a 2a 20 0a 2a 2a 20 20 20 54 68 69  ING.** .**   Thi
ae30: 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 52 41  s is the only RA
ae40: 4e 47 45 20 63 61 73 65 20 68 61 6e 64 6c 65 64  NGE case handled
ae50: 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
ae60: 2e 20 49 74 20 6d 6f 64 69 66 69 65 73 20 74 68  . It modifies th
ae70: 65 0a 2a 2a 20 20 20 73 65 63 6f 6e 64 20 77 68  e.**   second wh
ae80: 69 6c 65 28 20 31 20 29 20 6c 6f 6f 70 20 69 6e  ile( 1 ) loop in
ae90: 20 22 52 4f 57 53 20 42 45 54 57 45 45 4e 20 43   "ROWS BETWEEN C
aea0: 55 52 52 45 4e 54 20 2e 2e 2e 20 55 4e 42 4f 55  URRENT ... UNBOU
aeb0: 4e 44 45 44 2e 2e 2e 22 20 74 6f 0a 2a 2a 20 20  NDED..." to.**  
aec0: 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 77   be:.**.**     w
aed0: 68 69 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20  hile( 1 ){.**   
aee0: 20 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78 56      AggFinal (xV
aef0: 61 6c 75 65 29 0a 2a 2a 20 20 20 20 20 20 20 77  alue).**       w
af00: 68 69 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20  hile( 1 ){.**   
af10: 20 20 20 20 20 20 72 65 67 50 65 65 72 2b 2b 0a        regPeer++.
af20: 2a 2a 20 20 20 20 20 20 20 20 20 47 6f 73 75 62  **         Gosub
af30: 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20   addrGosub.**   
af40: 20 20 20 20 20 20 4e 65 78 74 28 63 73 72 29 20        Next(csr) 
af50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af60: 20 20 20 20 2f 2f 20 69 66 20 45 4f 46 20 67 6f      // if EOF go
af70: 74 6f 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69  to flush_partiti
af80: 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20 20  on_done.**      
af90: 20 20 20 69 66 28 20 6e 65 77 20 70 65 65 72 20     if( new peer 
afa0: 29 20 62 72 65 61 6b 3b 0a 2a 2a 20 20 20 20 20  ) break;.**     
afb0: 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 77 68 69    }.**       whi
afc0: 6c 65 28 20 28 72 65 67 50 65 65 72 2d 2d 29 3e  le( (regPeer--)>
afd0: 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  0 ){.**         
afe0: 41 67 67 53 74 65 70 20 28 63 73 72 53 74 61 72  AggStep (csrStar
aff0: 74 2c 20 78 49 6e 76 65 72 73 65 29 0a 2a 2a 20  t, xInverse).** 
b000: 20 20 20 20 20 20 20 20 4e 65 78 74 28 63 73 72          Next(csr
b010: 53 74 61 72 74 29 0a 2a 2a 20 20 20 20 20 20 20  Start).**       
b020: 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a  }.**     }.**.**
b030: 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20 3c 65   ROWS BETWEEN <e
b040: 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 20  xpr> FOLLOWING  
b050: 20 20 41 4e 44 20 3c 65 78 70 72 3e 20 46 4f 4c    AND <expr> FOL
b060: 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 72  LOWING.**.**   r
b070: 65 67 45 6e 64 20 3d 20 72 65 67 45 6e 64 20 2d  egEnd = regEnd -
b080: 20 72 65 67 53 74 61 72 74 0a 2a 2a 20 20 20 52   regStart.**   R
b090: 65 77 69 6e 64 20 28 63 73 72 2c 63 73 72 53 74  ewind (csr,csrSt
b0a0: 61 72 74 2c 63 73 72 45 6e 64 29 20 20 20 2f 2f  art,csrEnd)   //
b0b0: 20 69 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c 75   if EOF goto flu
b0c0: 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e  sh_partition_don
b0d0: 65 0a 2a 2a 20 20 20 20 20 41 67 67 73 74 65 70  e.**     Aggstep
b0e0: 20 28 63 73 72 45 6e 64 29 0a 2a 2a 20 20 20 20   (csrEnd).**    
b0f0: 20 4e 65 78 74 28 63 73 72 45 6e 64 29 20 20 20   Next(csrEnd)   
b100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
b110: 20 69 66 20 45 4f 46 20 66 61 6c 6c 2d 74 68 72   if EOF fall-thr
b120: 6f 75 67 68 0a 2a 2a 20 20 20 20 20 69 66 28 20  ough.**     if( 
b130: 28 72 65 67 45 6e 64 2d 2d 29 3c 3d 30 20 29 7b  (regEnd--)<=0 ){
b140: 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 28 72  .**       if( (r
b150: 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20 29 7b  egStart--)<=0 ){
b160: 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 67 67 46  .**         AggF
b170: 69 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a  inal (xValue).**
b180: 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20 61           Gosub a
b190: 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20  ddrGosub.**     
b1a0: 20 20 20 20 4e 65 78 74 28 63 73 72 29 20 20 20      Next(csr)   
b1b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 69 66             // if
b1c0: 20 45 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68 5f   EOF goto flush_
b1d0: 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a  partition_done.*
b1e0: 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  *       }.**    
b1f0: 20 20 20 41 67 67 53 74 65 70 20 28 63 73 72 53     AggStep (csrS
b200: 74 61 72 74 2c 20 78 49 6e 76 65 72 73 65 29 0a  tart, xInverse).
b210: 2a 2a 20 20 20 20 20 20 20 4e 65 78 74 20 28 63  **       Next (c
b220: 73 72 53 74 61 72 74 29 0a 2a 2a 20 20 20 20 20  srStart).**     
b230: 7d 0a 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42 45 54  }.**.** ROWS BET
b240: 57 45 45 4e 20 3c 65 78 70 72 3e 20 50 52 45 43  WEEN <expr> PREC
b250: 45 44 49 4e 47 20 20 20 20 41 4e 44 20 3c 65 78  EDING    AND <ex
b260: 70 72 3e 20 50 52 45 43 45 44 49 4e 47 0a 2a 2a  pr> PRECEDING.**
b270: 0a 2a 2a 20 20 20 52 65 70 6c 61 63 65 20 74 68  .**   Replace th
b280: 65 20 62 69 74 20 61 66 74 65 72 20 22 52 65 77  e bit after "Rew
b290: 69 6e 64 22 20 69 6e 20 74 68 65 20 61 62 6f 76  ind" in the abov
b2a0: 65 20 77 69 74 68 3a 0a 2a 2a 0a 2a 2a 20 20 20  e with:.**.**   
b2b0: 20 20 69 66 28 20 28 72 65 67 45 6e 64 2d 2d 29    if( (regEnd--)
b2c0: 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  <=0 ){.**       
b2d0: 41 67 67 53 74 65 70 20 28 63 73 72 45 6e 64 29  AggStep (csrEnd)
b2e0: 0a 2a 2a 20 20 20 20 20 20 20 4e 65 78 74 20 28  .**       Next (
b2f0: 63 73 72 45 6e 64 29 0a 2a 2a 20 20 20 20 20 7d  csrEnd).**     }
b300: 0a 2a 2a 20 20 20 20 20 41 67 67 46 69 6e 61 6c  .**     AggFinal
b310: 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20 20 20   (xValue).**    
b320: 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62   Gosub addrGosub
b330: 0a 2a 2a 20 20 20 20 20 4e 65 78 74 28 63 73 72  .**     Next(csr
b340: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
b350: 20 20 20 2f 2f 20 69 66 20 45 4f 46 20 67 6f 74     // if EOF got
b360: 6f 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f  o flush_partitio
b370: 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20 69 66  n_done.**     if
b380: 28 20 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d  ( (regStart--)<=
b390: 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67  0 ){.**       Ag
b3a0: 67 53 74 65 70 20 28 63 73 72 32 2c 20 78 49 6e  gStep (csr2, xIn
b3b0: 76 65 72 73 65 29 0a 2a 2a 20 20 20 20 20 20 20  verse).**       
b3c0: 4e 65 78 74 20 28 63 73 72 32 29 0a 2a 2a 20 20  Next (csr2).**  
b3d0: 20 20 20 7d 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69     }.**.*/.stati
b3e0: 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 43 6f 64  c void windowCod
b3f0: 65 52 6f 77 45 78 70 72 53 74 65 70 28 0a 20 20  eRowExprStep(.  
b400: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a  Parse *pParse, .
b410: 20 20 53 65 6c 65 63 74 20 2a 70 2c 0a 20 20 57    Select *p,.  W
b420: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
b430: 2c 0a 20 20 69 6e 74 20 72 65 67 47 6f 73 75 62  ,.  int regGosub
b440: 2c 20 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 73  , .  int addrGos
b450: 75 62 0a 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a  ub.){.  Window *
b460: 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b  pMWin = p->pWin;
b470: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
b480: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
b490: 73 65 29 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70  se);.  Window *p
b4a0: 57 69 6e 3b 0a 20 20 69 6e 74 20 6b 3b 0a 20 20  Win;.  int k;.  
b4b0: 69 6e 74 20 6e 53 75 62 20 3d 20 70 2d 3e 70 53  int nSub = p->pS
b4c0: 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 2d 3e 6e  rc->a[0].pTab->n
b4d0: 43 6f 6c 3b 0a 20 20 69 6e 74 20 72 65 67 46 6c  Col;.  int regFl
b4e0: 75 73 68 50 61 72 74 3b 20 20 20 20 20 20 20 20  ushPart;        
b4f0: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
b500: 65 72 20 66 6f 72 20 22 47 6f 73 75 62 20 66 6c  er for "Gosub fl
b510: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 20 2a  ush_partition" *
b520: 2f 0a 20 20 69 6e 74 20 6c 62 6c 46 6c 75 73 68  /.  int lblFlush
b530: 50 61 72 74 3b 20 20 20 20 20 20 20 20 20 20 20  Part;           
b540: 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72      /* Label for
b550: 20 22 47 6f 73 75 62 20 66 6c 75 73 68 5f 70 61   "Gosub flush_pa
b560: 72 74 69 74 69 6f 6e 22 20 2a 2f 0a 20 20 69 6e  rtition" */.  in
b570: 74 20 6c 62 6c 46 6c 75 73 68 44 6f 6e 65 3b 20  t lblFlushDone; 
b580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b590: 20 4c 61 62 65 6c 20 66 6f 72 20 22 47 6f 73 75   Label for "Gosu
b5a0: 62 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f  b flush_partitio
b5b0: 6e 5f 64 6f 6e 65 22 20 2a 2f 0a 0a 20 20 69 6e  n_done" */..  in
b5c0: 74 20 72 65 67 41 72 67 3b 0a 20 20 69 6e 74 20  t regArg;.  int 
b5d0: 6e 41 72 67 3b 0a 20 20 69 6e 74 20 61 64 64 72  nArg;.  int addr
b5e0: 3b 0a 20 20 69 6e 74 20 63 73 72 53 74 61 72 74  ;.  int csrStart
b5f0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
b600: 2b 3b 0a 20 20 69 6e 74 20 63 73 72 45 6e 64 20  +;.  int csrEnd 
b610: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
b620: 3b 0a 20 20 69 6e 74 20 72 65 67 53 74 61 72 74  ;.  int regStart
b630: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b640: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
b650: 20 3c 65 78 70 72 3e 20 50 52 45 43 45 44 49 4e   <expr> PRECEDIN
b660: 47 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45 6e  G */.  int regEn
b670: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
b680: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
b690: 20 6f 66 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f   of <expr> FOLLO
b6a0: 57 49 4e 47 20 2a 2f 0a 20 20 69 6e 74 20 61 64  WING */.  int ad
b6b0: 64 72 4e 65 78 74 3b 0a 20 20 69 6e 74 20 61 64  drNext;.  int ad
b6c0: 64 72 47 6f 74 6f 3b 0a 20 20 69 6e 74 20 61 64  drGoto;.  int ad
b6d0: 64 72 54 6f 70 3b 0a 20 20 69 6e 74 20 61 64 64  drTop;.  int add
b6e0: 72 49 66 50 6f 73 31 3b 0a 20 20 69 6e 74 20 61  rIfPos1;.  int a
b6f0: 64 64 72 49 66 50 6f 73 32 3b 0a 0a 20 20 69 6e  ddrIfPos2;..  in
b700: 74 20 72 65 67 50 65 65 72 20 3d 20 30 3b 20 20  t regPeer = 0;  
b710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b720: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 65 65 72  * Number of peer
b730: 73 20 69 6e 20 63 75 72 72 65 6e 74 20 67 72 6f  s in current gro
b740: 75 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50  up */.  int regP
b750: 65 65 72 56 61 6c 20 3d 20 30 3b 20 20 20 20 20  eerVal = 0;     
b760: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
b770: 79 20 6f 66 20 76 61 6c 75 65 73 20 69 64 65 6e  y of values iden
b780: 74 69 66 79 69 6e 67 20 70 65 65 72 20 67 72 6f  tifying peer gro
b790: 75 70 20 2a 2f 0a 20 20 69 6e 74 20 69 50 65 65  up */.  int iPee
b7a0: 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
b7b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
b7c0: 6d 6e 20 6f 66 66 73 65 74 20 69 6e 20 65 70 68  mn offset in eph
b7d0: 2d 74 61 62 6c 65 20 6f 66 20 70 65 65 72 20 76  -table of peer v
b7e0: 61 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 65  als */.  int nPe
b7f0: 65 72 56 61 6c 3b 20 20 20 20 20 20 20 20 20 20  erVal;          
b800: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
b810: 62 65 72 20 6f 66 20 70 65 65 72 20 76 61 6c 75  ber of peer valu
b820: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 53  es */.  int regS
b830: 69 7a 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  ize = 0;..  asse
b840: 72 74 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72  rt( pMWin->eStar
b850: 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20  t==TK_PRECEDING 
b860: 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e  .       || pMWin
b870: 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52  ->eStart==TK_CUR
b880: 52 45 4e 54 20 0a 20 20 20 20 20 20 20 7c 7c 20  RENT .       || 
b890: 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
b8a0: 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 0a 20 20 20  K_FOLLOWING .   
b8b0: 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53      || pMWin->eS
b8c0: 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44  tart==TK_UNBOUND
b8d0: 45 44 20 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  ED .  );.  asser
b8e0: 74 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  t( pMWin->eEnd==
b8f0: 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 0a 20 20  TK_FOLLOWING .  
b900: 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65       || pMWin->e
b910: 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20  End==TK_CURRENT 
b920: 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e  .       || pMWin
b930: 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55  ->eEnd==TK_UNBOU
b940: 4e 44 45 44 20 0a 20 20 20 20 20 20 20 7c 7c 20  NDED .       || 
b950: 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f  pMWin->eEnd==TK_
b960: 50 52 45 43 45 44 49 4e 47 20 0a 20 20 29 3b 0a  PRECEDING .  );.
b970: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 72  .  /* Allocate r
b980: 65 67 69 73 74 65 72 20 61 6e 64 20 6c 61 62 65  egister and labe
b990: 6c 20 66 6f 72 20 74 68 65 20 22 66 6c 75 73 68  l for the "flush
b9a0: 5f 70 61 72 74 69 74 69 6f 6e 22 20 73 75 62 2d  _partition" sub-
b9b0: 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 72 65  routine. */.  re
b9c0: 67 46 6c 75 73 68 50 61 72 74 20 3d 20 2b 2b 70  gFlushPart = ++p
b9d0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6c  Parse->nMem;.  l
b9e0: 62 6c 46 6c 75 73 68 50 61 72 74 20 3d 20 73 71  blFlushPart = sq
b9f0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
ba00: 65 6c 28 76 29 3b 0a 20 20 6c 62 6c 46 6c 75 73  el(v);.  lblFlus
ba10: 68 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56  hDone = sqlite3V
ba20: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
ba30: 0a 0a 20 20 72 65 67 53 74 61 72 74 20 3d 20 2b  ..  regStart = +
ba40: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
ba50: 20 72 65 67 45 6e 64 20 3d 20 2b 2b 70 50 61 72   regEnd = ++pPar
ba60: 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 77 69 6e  se->nMem;..  win
ba70: 64 6f 77 50 61 72 74 69 74 69 6f 6e 43 61 63 68  dowPartitionCach
ba80: 65 28 70 50 61 72 73 65 2c 20 70 2c 20 70 57 49  e(pParse, p, pWI
ba90: 6e 66 6f 2c 20 72 65 67 46 6c 75 73 68 50 61 72  nfo, regFlushPar
baa0: 74 2c 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 2c  t, lblFlushPart,
bab0: 20 26 72 65 67 53 69 7a 65 29 3b 0a 0a 20 20 61   &regSize);..  a
bac0: 64 64 72 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65  ddrGoto = sqlite
bad0: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
bae0: 50 5f 47 6f 74 6f 29 3b 0a 0a 20 20 2f 2a 20 53  P_Goto);..  /* S
baf0: 74 61 72 74 20 6f 66 20 22 66 6c 75 73 68 5f 70  tart of "flush_p
bb00: 61 72 74 69 74 69 6f 6e 22 20 2a 2f 0a 20 20 73  artition" */.  s
bb10: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
bb20: 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 46 6c 75  eLabel(v, lblFlu
bb30: 73 68 50 61 72 74 29 3b 0a 20 20 73 71 6c 69 74  shPart);.  sqlit
bb40: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
bb50: 4f 50 5f 4f 6e 63 65 2c 20 30 2c 20 73 71 6c 69  OP_Once, 0, sqli
bb60: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
bb70: 64 72 28 76 29 2b 33 29 3b 0a 20 20 73 71 6c 69  dr(v)+3);.  sqli
bb80: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
bb90: 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 63 73 72   OP_OpenDup, csr
bba0: 53 74 61 72 74 2c 20 70 4d 57 69 6e 2d 3e 69 45  Start, pMWin->iE
bbb0: 70 68 43 73 72 29 3b 0a 20 20 73 71 6c 69 74 65  phCsr);.  sqlite
bbc0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
bbd0: 50 5f 4f 70 65 6e 44 75 70 2c 20 63 73 72 45 6e  P_OpenDup, csrEn
bbe0: 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  d, pMWin->iEphCs
bbf0: 72 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 65 69 74  r);..  /* If eit
bc00: 68 65 72 20 72 65 67 53 74 61 72 74 20 6f 72 20  her regStart or 
bc10: 72 65 67 45 6e 64 20 61 72 65 20 6e 6f 74 20 6e  regEnd are not n
bc20: 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65  on-negative inte
bc30: 67 65 72 73 2c 20 74 68 72 6f 77 20 0a 20 20 2a  gers, throw .  *
bc40: 2a 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 2e 20  * an exception. 
bc50: 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d   */.  if( pMWin-
bc60: 3e 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 73  >pStart ){.    s
bc70: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
bc80: 50 61 72 73 65 2c 20 70 4d 57 69 6e 2d 3e 70 53  Parse, pMWin->pS
bc90: 74 61 72 74 2c 20 72 65 67 53 74 61 72 74 29 3b  tart, regStart);
bca0: 0a 20 20 20 20 77 69 6e 64 6f 77 43 68 65 63 6b  .    windowCheck
bcb0: 46 72 61 6d 65 56 61 6c 75 65 28 70 50 61 72 73  FrameValue(pPars
bcc0: 65 2c 20 72 65 67 53 74 61 72 74 2c 20 30 29 3b  e, regStart, 0);
bcd0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d 57 69 6e  .  }.  if( pMWin
bce0: 2d 3e 70 45 6e 64 20 29 7b 0a 20 20 20 20 73 71  ->pEnd ){.    sq
bcf0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
bd00: 61 72 73 65 2c 20 70 4d 57 69 6e 2d 3e 70 45 6e  arse, pMWin->pEn
bd10: 64 2c 20 72 65 67 45 6e 64 29 3b 0a 20 20 20 20  d, regEnd);.    
bd20: 77 69 6e 64 6f 77 43 68 65 63 6b 46 72 61 6d 65  windowCheckFrame
bd30: 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 72 65  Value(pParse, re
bd40: 67 45 6e 64 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20  gEnd, 1);.  }.. 
bd50: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 22   /* If this is "
bd60: 52 4f 57 53 20 3c 65 78 70 72 31 3e 20 46 4f 4c  ROWS <expr1> FOL
bd70: 4c 4f 57 49 4e 47 20 41 4e 44 20 52 4f 57 53 20  LOWING AND ROWS 
bd80: 3c 65 78 70 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e  <expr2> FOLLOWIN
bd90: 47 22 2c 20 64 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  G", do:.  **.  *
bda0: 2a 20 20 20 69 66 28 20 72 65 67 45 6e 64 3c 72  *   if( regEnd<r
bdb0: 65 67 53 74 61 72 74 20 29 7b 0a 20 20 2a 2a 20  egStart ){.  ** 
bdc0: 20 20 20 20 2f 2f 20 54 68 65 20 66 72 61 6d 65      // The frame
bdd0: 20 61 6c 77 61 79 73 20 63 6f 6e 73 69 73 74 73   always consists
bde0: 20 6f 66 20 30 20 72 6f 77 73 0a 20 20 2a 2a 20   of 0 rows.  ** 
bdf0: 20 20 20 20 72 65 67 53 74 61 72 74 20 3d 20 72      regStart = r
be00: 65 67 53 69 7a 65 3b 0a 20 20 2a 2a 20 20 20 7d  egSize;.  **   }
be10: 0a 20 20 2a 2a 20 20 20 72 65 67 45 6e 64 20 3d  .  **   regEnd =
be20: 20 72 65 67 45 6e 64 20 2d 20 72 65 67 53 74 61   regEnd - regSta
be30: 72 74 3b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  rt;.  */.  if( p
be40: 4d 57 69 6e 2d 3e 70 45 6e 64 20 26 26 20 70 4d  MWin->pEnd && pM
be50: 57 69 6e 2d 3e 70 53 74 61 72 74 20 26 26 20 70  Win->pStart && p
be60: 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
be70: 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20  _FOLLOWING ){.  
be80: 20 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d    assert( pMWin-
be90: 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57  >eEnd==TK_FOLLOW
bea0: 49 4e 47 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ING );.    sqlit
beb0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
bec0: 4f 50 5f 47 65 2c 20 72 65 67 53 74 61 72 74 2c  OP_Ge, regStart,
bed0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
bee0: 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 72 65  entAddr(v)+2, re
bef0: 67 45 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  gEnd);.    sqlit
bf00: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
bf10: 4f 50 5f 43 6f 70 79 2c 20 72 65 67 53 69 7a 65  OP_Copy, regSize
bf20: 2c 20 72 65 67 53 74 61 72 74 29 3b 0a 20 20 20  , regStart);.   
bf30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bf40: 70 33 28 76 2c 20 4f 50 5f 53 75 62 74 72 61 63  p3(v, OP_Subtrac
bf50: 74 2c 20 72 65 67 53 74 61 72 74 2c 20 72 65 67  t, regStart, reg
bf60: 45 6e 64 2c 20 72 65 67 45 6e 64 29 3b 0a 20 20  End, regEnd);.  
bf70: 7d 0a 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  }..  if( pMWin->
bf80: 70 45 6e 64 20 26 26 20 70 4d 57 69 6e 2d 3e 70  pEnd && pMWin->p
bf90: 53 74 61 72 74 20 26 26 20 70 4d 57 69 6e 2d 3e  Start && pMWin->
bfa0: 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49  eEnd==TK_PRECEDI
bfb0: 4e 47 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  NG ){.    assert
bfc0: 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d  ( pMWin->eStart=
bfd0: 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 29 3b  =TK_PRECEDING );
bfe0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
bff0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4c 65 2c  AddOp3(v, OP_Le,
c000: 20 72 65 67 53 74 61 72 74 2c 20 73 71 6c 69 74   regStart, sqlit
c010: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
c020: 72 28 76 29 2b 33 2c 20 72 65 67 45 6e 64 29 3b  r(v)+3, regEnd);
c030: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
c040: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70  AddOp2(v, OP_Cop
c050: 79 2c 20 72 65 67 53 69 7a 65 2c 20 72 65 67 53  y, regSize, regS
c060: 74 61 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  tart);.    sqlit
c070: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
c080: 4f 50 5f 43 6f 70 79 2c 20 72 65 67 53 69 7a 65  OP_Copy, regSize
c090: 2c 20 72 65 67 45 6e 64 29 3b 0a 20 20 7d 0a 0a  , regEnd);.  }..
c0a0: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
c0b0: 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
c0c0: 72 65 67 69 73 74 65 72 20 66 6f 72 20 65 61 63  register for eac
c0d0: 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  h window functio
c0e0: 6e 20 74 6f 20 4e 55 4c 4c 20 2a 2f 0a 20 20 72  n to NULL */.  r
c0f0: 65 67 41 72 67 20 3d 20 77 69 6e 64 6f 77 49 6e  egArg = windowIn
c100: 69 74 41 63 63 75 6d 28 70 50 61 72 73 65 2c 20  itAccum(pParse, 
c110: 70 4d 57 69 6e 29 3b 0a 0a 20 20 73 71 6c 69 74  pMWin);..  sqlit
c120: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
c130: 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4d 57 69 6e  OP_Rewind, pMWin
c140: 2d 3e 69 45 70 68 43 73 72 2c 20 6c 62 6c 46 6c  ->iEphCsr, lblFl
c150: 75 73 68 44 6f 6e 65 29 3b 0a 20 20 73 71 6c 69  ushDone);.  sqli
c160: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
c170: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 63 73 72 53   OP_Rewind, csrS
c180: 74 61 72 74 2c 20 6c 62 6c 46 6c 75 73 68 44 6f  tart, lblFlushDo
c190: 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ne);.  sqlite3Vd
c1a0: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29  beChangeP5(v, 1)
c1b0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
c1c0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
c1d0: 6e 64 2c 20 63 73 72 45 6e 64 2c 20 6c 62 6c 46  nd, csrEnd, lblF
c1e0: 6c 75 73 68 44 6f 6e 65 29 3b 0a 20 20 73 71 6c  lushDone);.  sql
c1f0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
c200: 28 76 2c 20 31 29 3b 0a 0a 20 20 2f 2a 20 49 6e  (v, 1);..  /* In
c210: 76 6f 6b 65 20 41 67 67 53 74 65 70 20 66 75 6e  voke AggStep fun
c220: 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 77  ction for each w
c230: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 75  indow function u
c240: 73 69 6e 67 20 74 68 65 20 72 6f 77 20 74 68 61  sing the row tha
c250: 74 0a 20 20 2a 2a 20 63 73 72 45 6e 64 20 63 75  t.  ** csrEnd cu
c260: 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
c270: 6f 2e 20 4f 72 2c 20 69 66 20 63 73 72 45 6e 64  o. Or, if csrEnd
c280: 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 45   is already at E
c290: 4f 46 2c 0a 20 20 2a 2a 20 64 6f 20 6e 6f 74 68  OF,.  ** do noth
c2a0: 69 6e 67 2e 20 20 2a 2f 0a 20 20 61 64 64 72 54  ing.  */.  addrT
c2b0: 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
c2c0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
c2d0: 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e    if( pMWin->eEn
c2e0: 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20  d==TK_PRECEDING 
c2f0: 29 7b 0a 20 20 20 20 61 64 64 72 49 66 50 6f 73  ){.    addrIfPos
c300: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
c310: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp3(v, OP_IfPo
c320: 73 2c 20 72 65 67 45 6e 64 2c 20 30 20 2c 20 31  s, regEnd, 0 , 1
c330: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
c340: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
c350: 5f 4e 65 78 74 2c 20 63 73 72 45 6e 64 2c 20 73  _Next, csrEnd, s
c360: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
c370: 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 61  tAddr(v)+2);.  a
c380: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
c390: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f  eAddOp0(v, OP_Go
c3a0: 74 6f 29 3b 0a 20 20 77 69 6e 64 6f 77 41 67 67  to);.  windowAgg
c3b0: 53 74 65 70 28 70 50 61 72 73 65 2c 20 70 4d 57  Step(pParse, pMW
c3c0: 69 6e 2c 20 63 73 72 45 6e 64 2c 20 30 2c 20 72  in, csrEnd, 0, r
c3d0: 65 67 41 72 67 2c 20 72 65 67 53 69 7a 65 29 3b  egArg, regSize);
c3e0: 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45  .  if( pMWin->eE
c3f0: 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  nd==TK_UNBOUNDED
c400: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
c410: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
c420: 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 54 6f 70  Goto, 0, addrTop
c430: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
c440: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
c450: 64 72 29 3b 0a 20 20 20 20 61 64 64 72 54 6f 70  dr);.    addrTop
c460: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
c470: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
c480: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
c490: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
c4a0: 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 69 66 28  , addr);.    if(
c4b0: 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b   pMWin->eEnd==TK
c4c0: 5f 50 52 45 43 45 44 49 4e 47 20 29 7b 0a 20 20  _PRECEDING ){.  
c4d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
c4e0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49  umpHere(v, addrI
c4f0: 66 50 6f 73 31 29 3b 0a 20 20 20 20 7d 0a 20 20  fPos1);.    }.  
c500: 7d 0a 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  }..  if( pMWin->
c510: 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49  eEnd==TK_FOLLOWI
c520: 4e 47 20 29 7b 0a 20 20 20 20 61 64 64 72 49 66  NG ){.    addrIf
c530: 50 6f 73 31 20 3d 20 73 71 6c 69 74 65 33 56 64  Pos1 = sqlite3Vd
c540: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
c550: 66 50 6f 73 2c 20 72 65 67 45 6e 64 2c 20 30 20  fPos, regEnd, 0 
c560: 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 1);.  }.  if( 
c570: 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
c580: 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20  K_FOLLOWING ){. 
c590: 20 20 20 61 64 64 72 49 66 50 6f 73 32 20 3d 20     addrIfPos2 = 
c5a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c5b0: 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 72  3(v, OP_IfPos, r
c5c0: 65 67 53 74 61 72 74 2c 20 30 20 2c 20 31 29 3b  egStart, 0 , 1);
c5d0: 0a 20 20 7d 0a 20 20 77 69 6e 64 6f 77 41 67 67  .  }.  windowAgg
c5e0: 46 69 6e 61 6c 28 70 50 61 72 73 65 2c 20 70 4d  Final(pParse, pM
c5f0: 57 69 6e 2c 20 30 29 3b 0a 20 20 77 69 6e 64 6f  Win, 0);.  windo
c600: 77 52 65 74 75 72 6e 4f 6e 65 52 6f 77 28 70 50  wReturnOneRow(pP
c610: 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 72 65 67  arse, pMWin, reg
c620: 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62  Gosub, addrGosub
c630: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
c640: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
c650: 74 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  t, pMWin->iEphCs
c660: 72 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  r, sqlite3VdbeCu
c670: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b  rrentAddr(v)+2);
c680: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
c690: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
c6a0: 20 30 2c 20 6c 62 6c 46 6c 75 73 68 44 6f 6e 65   0, lblFlushDone
c6b0: 29 3b 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  );.  if( pMWin->
c6c0: 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f  eStart==TK_FOLLO
c6d0: 57 49 4e 47 20 29 7b 0a 20 20 20 20 73 71 6c 69  WING ){.    sqli
c6e0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
c6f0: 76 2c 20 61 64 64 72 49 66 50 6f 73 32 29 3b 0a  v, addrIfPos2);.
c700: 20 20 7d 0a 0a 20 20 69 66 28 20 70 4d 57 69 6e    }..  if( pMWin
c710: 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52  ->eStart==TK_CUR
c720: 52 45 4e 54 20 0a 20 20 20 7c 7c 20 70 4d 57 69  RENT .   || pMWi
c730: 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 50 52  n->eStart==TK_PR
c740: 45 43 45 44 49 4e 47 20 0a 20 20 20 7c 7c 20 70  ECEDING .   || p
c750: 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
c760: 5f 46 4f 4c 4c 4f 57 49 4e 47 20 0a 20 20 29 7b  _FOLLOWING .  ){
c770: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4a 75 6d  .    int addrJum
c780: 70 48 65 72 65 20 3d 20 30 3b 0a 20 20 20 20 69  pHere = 0;.    i
c790: 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  f( pMWin->eStart
c7a0: 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 29  ==TK_PRECEDING )
c7b0: 7b 0a 20 20 20 20 20 20 61 64 64 72 4a 75 6d 70  {.      addrJump
c7c0: 48 65 72 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Here = sqlite3Vd
c7d0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
c7e0: 66 50 6f 73 2c 20 72 65 67 53 74 61 72 74 2c 20  fPos, regStart, 
c7f0: 30 20 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  0 , 1);.    }.  
c800: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c810: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
c820: 63 73 72 53 74 61 72 74 2c 20 73 71 6c 69 74 65  csrStart, sqlite
c830: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
c840: 28 76 29 2b 31 29 3b 0a 20 20 20 20 77 69 6e 64  (v)+1);.    wind
c850: 6f 77 41 67 67 53 74 65 70 28 70 50 61 72 73 65  owAggStep(pParse
c860: 2c 20 70 4d 57 69 6e 2c 20 63 73 72 53 74 61 72  , pMWin, csrStar
c870: 74 2c 20 31 2c 20 72 65 67 41 72 67 2c 20 72 65  t, 1, regArg, re
c880: 67 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20  gSize);.    if( 
c890: 61 64 64 72 4a 75 6d 70 48 65 72 65 20 29 7b 0a  addrJumpHere ){.
c8a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c8b0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
c8c0: 72 4a 75 6d 70 48 65 72 65 29 3b 0a 20 20 20 20  rJumpHere);.    
c8d0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d 57 69  }.  }.  if( pMWi
c8e0: 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c  n->eEnd==TK_FOLL
c8f0: 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 73 71 6c  OWING ){.    sql
c900: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
c910: 28 76 2c 20 61 64 64 72 49 66 50 6f 73 31 29 3b  (v, addrIfPos1);
c920: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
c930: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
c940: 6f 74 6f 2c 20 30 2c 20 61 64 64 72 54 6f 70 29  oto, 0, addrTop)
c950: 3b 0a 0a 20 20 2f 2a 20 66 6c 75 73 68 5f 70 61  ;..  /* flush_pa
c960: 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 3a 20 2a 2f  rtition_done: */
c970: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
c980: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62  solveLabel(v, lb
c990: 6c 46 6c 75 73 68 44 6f 6e 65 29 3b 0a 20 20 73  lFlushDone);.  s
c9a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
c9b0: 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74  (v, OP_ResetSort
c9c0: 65 72 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43  er, pMWin->iEphC
c9d0: 73 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  sr);.  sqlite3Vd
c9e0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
c9f0: 65 74 75 72 6e 2c 20 72 65 67 46 6c 75 73 68 50  eturn, regFlushP
ca00: 61 72 74 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  art);..  /* Jump
ca10: 20 74 6f 20 68 65 72 65 20 74 6f 20 73 6b 69 70   to here to skip
ca20: 20 6f 76 65 72 20 66 6c 75 73 68 5f 70 61 72 74   over flush_part
ca30: 69 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  ition */.  sqlit
ca40: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
ca50: 2c 20 61 64 64 72 47 6f 74 6f 29 3b 0a 7d 0a 0a  , addrGoto);.}..
ca60: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
ca70: 69 6f 6e 20 64 6f 65 73 20 74 68 65 20 77 6f 72  ion does the wor
ca80: 6b 20 6f 66 20 73 71 6c 69 74 65 33 57 69 6e 64  k of sqlite3Wind
ca90: 6f 77 43 6f 64 65 53 74 65 70 28 29 20 66 6f 72  owCodeStep() for
caa0: 20 63 61 73 65 73 20 74 68 61 74 0a 2a 2a 20 77   cases that.** w
cab0: 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65  ould normally be
cac0: 20 68 61 6e 64 6c 65 64 20 62 79 20 77 69 6e 64   handled by wind
cad0: 6f 77 43 6f 64 65 44 65 66 61 75 6c 74 53 74 65  owCodeDefaultSte
cae0: 70 28 29 20 77 68 65 6e 20 74 68 65 72 65 20 61  p() when there a
caf0: 72 65 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f 72  re.** one or mor
cb00: 65 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  e built-in windo
cb10: 77 2d 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74  w-functions that
cb20: 20 72 65 71 75 69 72 65 20 74 68 65 20 65 6e 74   require the ent
cb30: 69 72 65 20 70 61 72 74 69 74 69 6f 6e 0a 2a 2a  ire partition.**
cb40: 20 74 6f 20 62 65 20 63 61 63 68 65 64 20 69 6e   to be cached in
cb50: 20 61 20 74 65 6d 70 20 74 61 62 6c 65 20 62 65   a temp table be
cb60: 66 6f 72 65 20 61 6e 79 20 72 6f 77 73 20 63 61  fore any rows ca
cb70: 6e 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 41  n be returned. A
cb80: 64 64 69 74 69 6f 6e 61 6c 6c 79 2e 0a 2a 2a 20  dditionally..** 
cb90: 22 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 43  "RANGE BETWEEN C
cba0: 55 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 55  URRENT ROW AND U
cbb0: 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49  NBOUNDED FOLLOWI
cbc0: 4e 47 22 20 69 73 20 61 6c 77 61 79 73 20 68 61  NG" is always ha
cbd0: 6e 64 6c 65 64 20 62 79 0a 2a 2a 20 74 68 69 73  ndled by.** this
cbe0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
cbf0: 20 50 73 65 75 64 6f 2d 63 6f 64 65 20 63 6f 72   Pseudo-code cor
cc00: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
cc10: 65 20 56 4d 20 63 6f 64 65 20 67 65 6e 65 72 61  e VM code genera
cc20: 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
cc30: 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 65 61 63 68  tion.** for each
cc40: 20 74 79 70 65 20 6f 66 20 77 69 6e 64 6f 77 20   type of window 
cc50: 66 6f 6c 6c 6f 77 73 2e 0a 2a 2a 0a 2a 2a 20 52  follows..**.** R
cc60: 41 4e 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42  ANGE BETWEEN UNB
cc70: 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47  OUNDED PRECEDING
cc80: 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57   AND CURRENT ROW
cc90: 0a 2a 2a 0a 2a 2a 20 20 20 66 6c 75 73 68 5f 70  .**.**   flush_p
cca0: 61 72 74 69 74 69 6f 6e 3a 0a 2a 2a 20 20 20 20  artition:.**    
ccb0: 20 4f 6e 63 65 20 7b 0a 2a 2a 20 20 20 20 20 20   Once {.**      
ccc0: 20 4f 70 65 6e 44 75 70 20 28 69 45 70 68 43 73   OpenDup (iEphCs
ccd0: 72 20 2d 3e 20 63 73 72 4c 65 61 64 29 0a 2a 2a  r -> csrLead).**
cce0: 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 49 6e       }.**     In
ccf0: 74 65 67 65 72 20 63 74 72 20 30 0a 2a 2a 20 20  teger ctr 0.**  
cd00: 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 20 28     foreach row (
cd10: 63 73 72 4c 65 61 64 29 7b 0a 2a 2a 20 20 20 20  csrLead){.**    
cd20: 20 20 20 69 66 28 20 6e 65 77 20 70 65 65 72 20     if( new peer 
cd30: 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 67  ){.**         Ag
cd40: 67 46 69 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a  gFinal (xValue).
cd50: 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  **         for(i
cd60: 3d 30 3b 20 69 3c 63 74 72 3b 20 69 2b 2b 29 7b  =0; i<ctr; i++){
cd70: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 47 6f  .**           Go
cd80: 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a  sub addrGosub.**
cd90: 20 20 20 20 20 20 20 20 20 20 20 4e 65 78 74 20             Next 
cda0: 69 45 70 68 43 73 72 0a 2a 2a 20 20 20 20 20 20  iEphCsr.**      
cdb0: 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20     }.**         
cdc0: 49 6e 74 65 67 65 72 20 63 74 72 20 30 0a 2a 2a  Integer ctr 0.**
cdd0: 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
cde0: 20 20 41 67 67 53 74 65 70 20 28 63 73 72 4c 65    AggStep (csrLe
cdf0: 61 64 29 0a 2a 2a 20 20 20 20 20 20 20 49 6e 63  ad).**       Inc
ce00: 72 20 63 74 72 0a 2a 2a 20 20 20 20 20 7d 0a 2a  r ctr.**     }.*
ce10: 2a 0a 2a 2a 20 20 20 20 20 41 67 67 46 69 6e 61  *.**     AggFina
ce20: 6c 20 28 78 46 69 6e 61 6c 69 7a 65 29 0a 2a 2a  l (xFinalize).**
ce30: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
ce40: 63 74 72 3b 20 69 2b 2b 29 7b 0a 2a 2a 20 20 20  ctr; i++){.**   
ce50: 20 20 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f      Gosub addrGo
ce60: 73 75 62 0a 2a 2a 20 20 20 20 20 20 20 4e 65 78  sub.**       Nex
ce70: 74 20 69 45 70 68 43 73 72 0a 2a 2a 20 20 20 20  t iEphCsr.**    
ce80: 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 73   }.**.**     Res
ce90: 65 74 53 6f 72 74 65 72 20 28 63 73 72 29 0a 2a  etSorter (csr).*
cea0: 2a 20 20 20 20 20 52 65 74 75 72 6e 0a 2a 2a 0a  *     Return.**.
ceb0: 2a 2a 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20  ** ROWS BETWEEN 
cec0: 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44  UNBOUNDED PRECED
ced0: 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54 20  ING AND CURRENT 
cee0: 52 4f 57 0a 2a 2a 0a 2a 2a 20 20 20 41 73 20 61  ROW.**.**   As a
cef0: 62 6f 76 65 2c 20 65 78 63 65 70 74 20 74 68 61  bove, except tha
cf00: 74 20 74 68 65 20 22 69 66 28 20 6e 65 77 20 70  t the "if( new p
cf10: 65 65 72 20 29 22 20 62 72 61 6e 63 68 20 69 73  eer )" branch is
cf20: 20 61 6c 77 61 79 73 20 74 61 6b 65 6e 2e 0a 2a   always taken..*
cf30: 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54 57 45  *.** RANGE BETWE
cf40: 45 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20 41  EN CURRENT ROW A
cf50: 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 20 0a  ND CURRENT ROW .
cf60: 2a 2a 0a 2a 2a 20 20 20 41 73 20 61 62 6f 76 65  **.**   As above
cf70: 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 65 61  , except that ea
cf80: 63 68 20 6f 66 20 74 68 65 20 66 6f 72 28 29 20  ch of the for() 
cf90: 6c 6f 6f 70 73 20 62 65 63 6f 6d 65 73 3a 0a 2a  loops becomes:.*
cfa0: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72  *.**         for
cfb0: 28 69 3d 30 3b 20 69 3c 63 74 72 3b 20 69 2b 2b  (i=0; i<ctr; i++
cfc0: 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ){.**           
cfd0: 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a  Gosub addrGosub.
cfe0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 67 67  **           Agg
cff0: 53 74 65 70 20 28 78 49 6e 76 65 72 73 65 2c 20  Step (xInverse, 
d000: 69 45 70 68 43 73 72 29 0a 2a 2a 20 20 20 20 20  iEphCsr).**     
d010: 20 20 20 20 20 20 4e 65 78 74 20 69 45 70 68 43        Next iEphC
d020: 73 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a  sr.**         }.
d030: 2a 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54 57  **.** RANGE BETW
d040: 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52  EEN UNBOUNDED PR
d050: 45 43 45 44 49 4e 47 20 41 4e 44 20 55 4e 42 4f  ECEDING AND UNBO
d060: 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a  UNDED FOLLOWING.
d070: 2a 2a 0a 2a 2a 20 20 20 66 6c 75 73 68 5f 70 61  **.**   flush_pa
d080: 72 74 69 74 69 6f 6e 3a 0a 2a 2a 20 20 20 20 20  rtition:.**     
d090: 4f 6e 63 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20  Once {.**       
d0a0: 4f 70 65 6e 44 75 70 20 28 69 45 70 68 43 73 72  OpenDup (iEphCsr
d0b0: 20 2d 3e 20 63 73 72 4c 65 61 64 29 0a 2a 2a 20   -> csrLead).** 
d0c0: 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 66 6f 72      }.**     for
d0d0: 65 61 63 68 20 72 6f 77 20 28 63 73 72 4c 65 61  each row (csrLea
d0e0: 64 29 20 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67  d) {.**       Ag
d0f0: 67 53 74 65 70 20 28 63 73 72 4c 65 61 64 29 0a  gStep (csrLead).
d100: 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20  **     }.**     
d110: 66 6f 72 65 61 63 68 20 72 6f 77 20 28 69 45 70  foreach row (iEp
d120: 68 43 73 72 29 20 7b 0a 2a 2a 20 20 20 20 20 20  hCsr) {.**      
d130: 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62   Gosub addrGosub
d140: 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 0a 2a 2a  .**     }.** .**
d150: 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 43   RANGE BETWEEN C
d160: 55 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 55  URRENT ROW AND U
d170: 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49  NBOUNDED FOLLOWI
d180: 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 66 6c 75 73 68  NG.**.**   flush
d190: 5f 70 61 72 74 69 74 69 6f 6e 3a 0a 2a 2a 20 20  _partition:.**  
d1a0: 20 20 20 4f 6e 63 65 20 7b 0a 2a 2a 20 20 20 20     Once {.**    
d1b0: 20 20 20 4f 70 65 6e 44 75 70 20 28 69 45 70 68     OpenDup (iEph
d1c0: 43 73 72 20 2d 3e 20 63 73 72 4c 65 61 64 29 0a  Csr -> csrLead).
d1d0: 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20  **     }.**     
d1e0: 66 6f 72 65 61 63 68 20 72 6f 77 20 28 63 73 72  foreach row (csr
d1f0: 4c 65 61 64 29 7b 0a 2a 2a 20 20 20 20 20 20 20  Lead){.**       
d200: 41 67 67 53 74 65 70 20 28 63 73 72 4c 65 61 64  AggStep (csrLead
d210: 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20  ).**     }.**   
d220: 20 20 52 65 77 69 6e 64 20 28 63 73 72 4c 65 61    Rewind (csrLea
d230: 64 29 0a 2a 2a 20 20 20 20 20 49 6e 74 65 67 65  d).**     Intege
d240: 72 20 63 74 72 20 30 0a 2a 2a 20 20 20 20 20 66  r ctr 0.**     f
d250: 6f 72 65 61 63 68 20 72 6f 77 20 28 63 73 72 4c  oreach row (csrL
d260: 65 61 64 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69  ead){.**       i
d270: 66 28 20 6e 65 77 20 70 65 65 72 20 29 7b 0a 2a  f( new peer ){.*
d280: 2a 20 20 20 20 20 20 20 20 20 41 67 67 46 69 6e  *         AggFin
d290: 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20  al (xValue).**  
d2a0: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
d2b0: 69 3c 63 74 72 3b 20 69 2b 2b 29 7b 0a 2a 2a 20  i<ctr; i++){.** 
d2c0: 20 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20            Gosub 
d2d0: 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20  addrGosub.**    
d2e0: 20 20 20 20 20 20 20 41 67 67 53 74 65 70 20 28         AggStep (
d2f0: 78 49 6e 76 65 72 73 65 2c 20 69 45 70 68 43 73  xInverse, iEphCs
d300: 72 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  r).**           
d310: 4e 65 78 74 20 69 45 70 68 43 73 72 0a 2a 2a 20  Next iEphCsr.** 
d320: 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20          }.**    
d330: 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 74 72       Integer ctr
d340: 20 30 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a   0.**       }.**
d350: 20 20 20 20 20 20 20 49 6e 63 72 20 63 74 72 0a         Incr ctr.
d360: 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20  **     }.**.**  
d370: 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78 46 69     AggFinal (xFi
d380: 6e 61 6c 69 7a 65 29 0a 2a 2a 20 20 20 20 20 66  nalize).**     f
d390: 6f 72 28 69 3d 30 3b 20 69 3c 63 74 72 3b 20 69  or(i=0; i<ctr; i
d3a0: 2b 2b 29 7b 0a 2a 2a 20 20 20 20 20 20 20 47 6f  ++){.**       Go
d3b0: 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a  sub addrGosub.**
d3c0: 20 20 20 20 20 20 20 4e 65 78 74 20 69 45 70 68         Next iEph
d3d0: 43 73 72 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a  Csr.**     }.**.
d3e0: 2a 2a 20 20 20 20 20 52 65 73 65 74 53 6f 72 74  **     ResetSort
d3f0: 65 72 20 28 63 73 72 29 0a 2a 2a 20 20 20 20 20  er (csr).**     
d400: 52 65 74 75 72 6e 0a 2a 2f 0a 73 74 61 74 69 63  Return.*/.static
d410: 20 76 6f 69 64 20 77 69 6e 64 6f 77 43 6f 64 65   void windowCode
d420: 43 61 63 68 65 53 74 65 70 28 0a 20 20 50 61 72  CacheStep(.  Par
d430: 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 53  se *pParse, .  S
d440: 65 6c 65 63 74 20 2a 70 2c 0a 20 20 57 68 65 72  elect *p,.  Wher
d450: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20  eInfo *pWInfo,. 
d460: 20 69 6e 74 20 72 65 67 47 6f 73 75 62 2c 20 0a   int regGosub, .
d470: 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75 62 0a    int addrGosub.
d480: 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57  ){.  Window *pMW
d490: 69 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b 0a 20 20  in = p->pWin;.  
d4a0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
d4b0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
d4c0: 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e  ;.  Window *pWin
d4d0: 3b 0a 20 20 69 6e 74 20 6b 3b 0a 20 20 69 6e 74  ;.  int k;.  int
d4e0: 20 61 64 64 72 3b 0a 20 20 45 78 70 72 4c 69 73   addr;.  ExprLis
d4f0: 74 20 2a 70 50 61 72 74 20 3d 20 70 4d 57 69 6e  t *pPart = pMWin
d500: 2d 3e 70 50 61 72 74 69 74 69 6f 6e 3b 0a 20 20  ->pPartition;.  
d510: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
d520: 42 79 20 3d 20 70 4d 57 69 6e 2d 3e 70 4f 72 64  By = pMWin->pOrd
d530: 65 72 42 79 3b 0a 20 20 69 6e 74 20 6e 50 65 65  erBy;.  int nPee
d540: 72 20 3d 20 70 4f 72 64 65 72 42 79 20 3f 20 70  r = pOrderBy ? p
d550: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 3a  OrderBy->nExpr :
d560: 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 4e 65 77   0;.  int regNew
d570: 50 65 65 72 3b 0a 0a 20 20 69 6e 74 20 61 64 64  Peer;..  int add
d580: 72 47 6f 74 6f 3b 20 20 20 20 20 20 20 20 20 20  rGoto;          
d590: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
d5a0: 65 73 73 20 6f 66 20 47 6f 74 6f 20 75 73 65 64  ess of Goto used
d5b0: 20 74 6f 20 6a 75 6d 70 20 66 6c 75 73 68 5f 70   to jump flush_p
d5c0: 61 72 2e 2e 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ar.. */.  int ad
d5d0: 64 72 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20  drNext;         
d5e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
d5f0: 70 20 68 65 72 65 20 66 6f 72 20 6e 65 78 74 20  p here for next 
d600: 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 6c 6f 6f  iteration of loo
d610: 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 6c  p */.  int regFl
d620: 75 73 68 50 61 72 74 3b 0a 20 20 69 6e 74 20 6c  ushPart;.  int l
d630: 62 6c 46 6c 75 73 68 50 61 72 74 3b 0a 20 20 69  blFlushPart;.  i
d640: 6e 74 20 63 73 72 4c 65 61 64 3b 0a 20 20 69 6e  nt csrLead;.  in
d650: 74 20 72 65 67 43 74 72 3b 0a 20 20 69 6e 74 20  t regCtr;.  int 
d660: 72 65 67 41 72 67 3b 20 20 20 20 20 20 20 20 20  regArg;         
d670: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
d680: 65 67 69 73 74 65 72 20 61 72 72 61 79 20 74 6f  egister array to
d690: 20 6d 61 72 74 69 61 6c 20 66 75 6e 63 74 69 6f   martial functio
d6a0: 6e 20 61 72 67 73 20 2a 2f 0a 20 20 69 6e 74 20  n args */.  int 
d6b0: 72 65 67 53 69 7a 65 3b 0a 20 20 69 6e 74 20 6e  regSize;.  int n
d6c0: 41 72 67 3b 0a 20 20 69 6e 74 20 6c 62 6c 45 6d  Arg;.  int lblEm
d6d0: 70 74 79 3b 0a 20 20 69 6e 74 20 62 52 65 76 65  pty;.  int bReve
d6e0: 72 73 65 20 3d 20 70 4d 57 69 6e 2d 3e 70 4f 72  rse = pMWin->pOr
d6f0: 64 65 72 42 79 20 26 26 20 70 4d 57 69 6e 2d 3e  derBy && pMWin->
d700: 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45  eStart==TK_CURRE
d710: 4e 54 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  NT .          &&
d720: 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b   pMWin->eEnd==TK
d730: 5f 55 4e 42 4f 55 4e 44 45 44 3b 0a 0a 20 20 61  _UNBOUNDED;..  a
d740: 73 73 65 72 74 28 20 28 70 4d 57 69 6e 2d 3e 65  ssert( (pMWin->e
d750: 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e  Start==TK_UNBOUN
d760: 44 45 44 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45  DED && pMWin->eE
d770: 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29 20  nd==TK_CURRENT) 
d780: 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 4d 57 69  .       || (pMWi
d790: 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e  n->eStart==TK_UN
d7a0: 42 4f 55 4e 44 45 44 20 26 26 20 70 4d 57 69 6e  BOUNDED && pMWin
d7b0: 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55  ->eEnd==TK_UNBOU
d7c0: 4e 44 45 44 29 20 0a 20 20 20 20 20 20 20 7c 7c  NDED) .       ||
d7d0: 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d   (pMWin->eStart=
d7e0: 3d 54 4b 5f 43 55 52 52 45 4e 54 20 26 26 20 70  =TK_CURRENT && p
d7f0: 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43  MWin->eEnd==TK_C
d800: 55 52 52 45 4e 54 29 20 0a 20 20 20 20 20 20 20  URRENT) .       
d810: 7c 7c 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72  || (pMWin->eStar
d820: 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 26 26  t==TK_CURRENT &&
d830: 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b   pMWin->eEnd==TK
d840: 5f 55 4e 42 4f 55 4e 44 45 44 29 20 0a 20 20 29  _UNBOUNDED) .  )
d850: 3b 0a 0a 20 20 6c 62 6c 45 6d 70 74 79 20 3d 20  ;..  lblEmpty = 
d860: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
d870: 61 62 65 6c 28 76 29 3b 0a 20 20 72 65 67 4e 65  abel(v);.  regNe
d880: 77 50 65 65 72 20 3d 20 70 50 61 72 73 65 2d 3e  wPeer = pParse->
d890: 6e 4d 65 6d 2b 31 3b 0a 20 20 70 50 61 72 73 65  nMem+1;.  pParse
d8a0: 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 65 65 72 3b  ->nMem += nPeer;
d8b0: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
d8c0: 72 65 67 69 73 74 65 72 20 61 6e 64 20 6c 61 62  register and lab
d8d0: 65 6c 20 66 6f 72 20 74 68 65 20 22 66 6c 75 73  el for the "flus
d8e0: 68 5f 70 61 72 74 69 74 69 6f 6e 22 20 73 75 62  h_partition" sub
d8f0: 2d 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 72  -routine. */.  r
d900: 65 67 46 6c 75 73 68 50 61 72 74 20 3d 20 2b 2b  egFlushPart = ++
d910: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
d920: 6c 62 6c 46 6c 75 73 68 50 61 72 74 20 3d 20 73  lblFlushPart = s
d930: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
d940: 62 65 6c 28 76 29 3b 0a 0a 20 20 63 73 72 4c 65  bel(v);..  csrLe
d950: 61 64 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ad = pParse->nTa
d960: 62 2b 2b 3b 0a 20 20 72 65 67 43 74 72 20 3d 20  b++;.  regCtr = 
d970: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
d980: 0a 20 20 77 69 6e 64 6f 77 50 61 72 74 69 74 69  .  windowPartiti
d990: 6f 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c 20  onCache(pParse, 
d9a0: 70 2c 20 70 57 49 6e 66 6f 2c 20 72 65 67 46 6c  p, pWInfo, regFl
d9b0: 75 73 68 50 61 72 74 2c 20 6c 62 6c 46 6c 75 73  ushPart, lblFlus
d9c0: 68 50 61 72 74 2c 20 26 72 65 67 53 69 7a 65 29  hPart, &regSize)
d9d0: 3b 0a 20 20 61 64 64 72 47 6f 74 6f 20 3d 20 73  ;.  addrGoto = s
d9e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
d9f0: 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 0a 20  (v, OP_Goto);.. 
da00: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 22 66 6c   /* Start of "fl
da10: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 20 2a  ush_partition" *
da20: 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
da30: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
da40: 62 6c 46 6c 75 73 68 50 61 72 74 29 3b 0a 20 20  blFlushPart);.  
da50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
da60: 32 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c 20 30 2c  2(v, OP_Once, 0,
da70: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
da80: 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20  entAddr(v)+2);. 
da90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
daa0: 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70  p2(v, OP_OpenDup
dab0: 2c 20 63 73 72 4c 65 61 64 2c 20 70 4d 57 69 6e  , csrLead, pMWin
dac0: 2d 3e 69 45 70 68 43 73 72 29 3b 0a 0a 20 20 2f  ->iEphCsr);..  /
dad0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
dae0: 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67   accumulator reg
daf0: 69 73 74 65 72 20 66 6f 72 20 65 61 63 68 20 77  ister for each w
db00: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 74  indow function t
db10: 6f 20 4e 55 4c 4c 20 2a 2f 0a 20 20 72 65 67 41  o NULL */.  regA
db20: 72 67 20 3d 20 77 69 6e 64 6f 77 49 6e 69 74 41  rg = windowInitA
db30: 63 63 75 6d 28 70 50 61 72 73 65 2c 20 70 4d 57  ccum(pParse, pMW
db40: 69 6e 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56  in);..  sqlite3V
db50: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
db60: 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 43  Integer, 0, regC
db70: 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  tr);.  sqlite3Vd
db80: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
db90: 65 77 69 6e 64 2c 20 63 73 72 4c 65 61 64 2c 20  ewind, csrLead, 
dba0: 6c 62 6c 45 6d 70 74 79 29 3b 0a 20 20 73 71 6c  lblEmpty);.  sql
dbb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
dbc0: 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4d 57  , OP_Rewind, pMW
dbd0: 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 6c 62 6c  in->iEphCsr, lbl
dbe0: 45 6d 70 74 79 29 3b 0a 0a 20 20 69 66 28 20 62  Empty);..  if( b
dbf0: 52 65 76 65 72 73 65 20 29 7b 0a 20 20 20 20 69  Reverse ){.    i
dc00: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
dc10: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
dc20: 28 76 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 41  (v);.    windowA
dc30: 67 67 53 74 65 70 28 70 50 61 72 73 65 2c 20 70  ggStep(pParse, p
dc40: 4d 57 69 6e 2c 20 63 73 72 4c 65 61 64 2c 20 30  MWin, csrLead, 0
dc50: 2c 20 72 65 67 41 72 67 2c 20 72 65 67 53 69 7a  , regArg, regSiz
dc60: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  e);.    sqlite3V
dc70: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
dc80: 4e 65 78 74 2c 20 63 73 72 4c 65 61 64 2c 20 61  Next, csrLead, a
dc90: 64 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ddr);.    sqlite
dca0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
dcb0: 50 5f 52 65 77 69 6e 64 2c 20 63 73 72 4c 65 61  P_Rewind, csrLea
dcc0: 64 2c 20 6c 62 6c 45 6d 70 74 79 29 3b 0a 20 20  d, lblEmpty);.  
dcd0: 7d 0a 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73  }.  addrNext = s
dce0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
dcf0: 74 41 64 64 72 28 76 29 3b 0a 0a 20 20 69 66 28  tAddr(v);..  if(
dd00: 20 70 4f 72 64 65 72 42 79 20 26 26 20 28 70 4d   pOrderBy && (pM
dd10: 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55  Win->eEnd==TK_CU
dd20: 52 52 45 4e 54 20 7c 7c 20 70 4d 57 69 6e 2d 3e  RRENT || pMWin->
dd30: 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45  eStart==TK_CURRE
dd40: 4e 54 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 62  NT) ){.    int b
dd50: 43 75 72 72 65 6e 74 20 3d 20 28 70 4d 57 69 6e  Current = (pMWin
dd60: 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52  ->eStart==TK_CUR
dd70: 52 45 4e 54 29 3b 0a 20 20 20 20 69 6e 74 20 61  RENT);.    int a
dd80: 64 64 72 4a 75 6d 70 20 3d 20 30 3b 20 20 20 20  ddrJump = 0;    
dd90: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
dda0: 65 73 73 20 6f 66 20 4f 50 5f 4a 75 6d 70 20 62  ess of OP_Jump b
ddb0: 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 69 66 28 20  elow */.    if( 
ddc0: 70 4d 57 69 6e 2d 3e 65 54 79 70 65 3d 3d 54 4b  pMWin->eType==TK
ddd0: 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20  _RANGE ){.      
dde0: 69 6e 74 20 69 4f 66 66 20 3d 20 70 4d 57 69 6e  int iOff = pMWin
ddf0: 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 20 2b 20 28  ->nBufferCol + (
de00: 70 50 61 72 74 20 3f 20 70 50 61 72 74 2d 3e 6e  pPart ? pPart->n
de10: 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 20  Expr : 0);.     
de20: 20 69 6e 74 20 72 65 67 50 65 65 72 20 3d 20 70   int regPeer = p
de30: 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 20 2b 20  MWin->regPart + 
de40: 28 70 50 61 72 74 20 3f 20 70 50 61 72 74 2d 3e  (pPart ? pPart->
de50: 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20  nExpr : 0);.    
de60: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
de70: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
de80: 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
de90: 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
dea0: 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  y, 0, 0);.      
deb0: 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 50 65 65 72  for(k=0; k<nPeer
dec0: 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
ded0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dee0: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
def0: 63 73 72 4c 65 61 64 2c 20 69 4f 66 66 2b 6b 2c  csrLead, iOff+k,
df00: 20 72 65 67 4e 65 77 50 65 65 72 2b 6b 29 3b 0a   regNewPeer+k);.
df10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 64        }.      ad
df20: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
df30: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d  AddOp3(v, OP_Com
df40: 70 61 72 65 2c 20 72 65 67 4e 65 77 50 65 65 72  pare, regNewPeer
df50: 2c 20 72 65 67 50 65 65 72 2c 20 6e 50 65 65 72  , regPeer, nPeer
df60: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
df70: 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20  VdbeAppendP4(v, 
df80: 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2c  (void*)pKeyInfo,
df90: 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
dfa0: 20 20 20 20 61 64 64 72 4a 75 6d 70 20 3d 20 73      addrJump = s
dfb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
dfc0: 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64  (v, OP_Jump, add
dfd0: 72 2b 32 2c 20 30 2c 20 61 64 64 72 2b 32 29 3b  r+2, 0, addr+2);
dfe0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
dff0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
e000: 6f 70 79 2c 20 72 65 67 4e 65 77 50 65 65 72 2c  opy, regNewPeer,
e010: 20 72 65 67 50 65 65 72 2c 20 6e 50 65 65 72 2d   regPeer, nPeer-
e020: 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77  1);.    }..    w
e030: 69 6e 64 6f 77 52 65 74 75 72 6e 52 6f 77 73 28  indowReturnRows(
e040: 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 72  pParse, pMWin, r
e050: 65 67 43 74 72 2c 20 72 65 67 47 6f 73 75 62 2c  egCtr, regGosub,
e060: 20 61 64 64 72 47 6f 73 75 62 2c 20 0a 20 20 20   addrGosub, .   
e070: 20 20 20 20 20 28 62 43 75 72 72 65 6e 74 20 3f       (bCurrent ?
e080: 20 72 65 67 41 72 67 20 3a 20 30 29 2c 20 28 62   regArg : 0), (b
e090: 43 75 72 72 65 6e 74 20 3f 20 72 65 67 53 69 7a  Current ? regSiz
e0a0: 65 20 3a 20 30 29 0a 20 20 20 20 29 3b 0a 20 20  e : 0).    );.  
e0b0: 20 20 69 66 28 20 61 64 64 72 4a 75 6d 70 20 29    if( addrJump )
e0c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
e0d0: 48 65 72 65 28 76 2c 20 61 64 64 72 4a 75 6d 70  Here(v, addrJump
e0e0: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 52  );.  }..  if( bR
e0f0: 65 76 65 72 73 65 3d 3d 30 20 29 7b 0a 20 20 20  everse==0 ){.   
e100: 20 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28 70   windowAggStep(p
e110: 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 63 73  Parse, pMWin, cs
e120: 72 4c 65 61 64 2c 20 30 2c 20 72 65 67 41 72 67  rLead, 0, regArg
e130: 2c 20 72 65 67 53 69 7a 65 29 3b 0a 20 20 7d 0a  , regSize);.  }.
e140: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e150: 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
e160: 2c 20 72 65 67 43 74 72 2c 20 31 29 3b 0a 20 20  , regCtr, 1);.  
e170: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e180: 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 63 73  2(v, OP_Next, cs
e190: 72 4c 65 61 64 2c 20 61 64 64 72 4e 65 78 74 29  rLead, addrNext)
e1a0: 3b 0a 0a 20 20 77 69 6e 64 6f 77 52 65 74 75 72  ;..  windowRetur
e1b0: 6e 52 6f 77 73 28 70 50 61 72 73 65 2c 20 70 4d  nRows(pParse, pM
e1c0: 57 69 6e 2c 20 72 65 67 43 74 72 2c 20 72 65 67  Win, regCtr, reg
e1d0: 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62  Gosub, addrGosub
e1e0: 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 73 71 6c 69  , 0, 0);..  sqli
e1f0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
e200: 62 65 6c 28 76 2c 20 6c 62 6c 45 6d 70 74 79 29  bel(v, lblEmpty)
e210: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
e220: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 65  ddOp1(v, OP_Rese
e230: 74 53 6f 72 74 65 72 2c 20 70 4d 57 69 6e 2d 3e  tSorter, pMWin->
e240: 69 45 70 68 43 73 72 29 3b 0a 20 20 73 71 6c 69  iEphCsr);.  sqli
e250: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
e260: 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 46   OP_Return, regF
e270: 6c 75 73 68 50 61 72 74 29 3b 0a 0a 20 20 2f 2a  lushPart);..  /*
e280: 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 74 6f   Jump to here to
e290: 20 73 6b 69 70 20 6f 76 65 72 20 66 6c 75 73 68   skip over flush
e2a0: 5f 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 20 20  _partition */.  
e2b0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
e2c0: 65 72 65 28 76 2c 20 61 64 64 72 47 6f 74 6f 29  ere(v, addrGoto)
e2d0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 41 4e 47  ;.}.../*.** RANG
e2e0: 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e  E BETWEEN UNBOUN
e2f0: 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e  DED PRECEDING AN
e300: 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a  D CURRENT ROW.**
e310: 0a 2a 2a 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20  .**   ....**    
e320: 20 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69   if( new partiti
e330: 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41  on ){.**       A
e340: 67 67 46 69 6e 61 6c 20 28 78 46 69 6e 61 6c 69  ggFinal (xFinali
e350: 7a 65 29 0a 2a 2a 20 20 20 20 20 20 20 47 6f 73  ze).**       Gos
e360: 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20  ub addrGosub.** 
e370: 20 20 20 20 20 20 52 65 73 65 74 53 6f 72 74 65        ResetSorte
e380: 72 20 65 70 68 2d 74 61 62 6c 65 0a 2a 2a 20 20  r eph-table.**  
e390: 20 20 20 7d 0a 2a 2a 20 20 20 20 20 65 6c 73 65     }.**     else
e3a0: 20 69 66 28 20 6e 65 77 20 70 65 65 72 20 29 7b   if( new peer ){
e3b0: 0a 2a 2a 20 20 20 20 20 20 20 41 67 67 46 69 6e  .**       AggFin
e3c0: 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20  al (xValue).**  
e3d0: 20 20 20 20 20 47 6f 73 75 62 20 61 64 64 72 47       Gosub addrG
e3e0: 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20 20 52 65  osub.**       Re
e3f0: 73 65 74 53 6f 72 74 65 72 20 65 70 68 2d 74 61  setSorter eph-ta
e400: 62 6c 65 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20  ble.**     }.** 
e410: 20 20 20 20 41 67 67 53 74 65 70 0a 2a 2a 20 20      AggStep.**  
e420: 20 20 20 49 6e 73 65 72 74 20 28 72 65 63 6f 72     Insert (recor
e430: 64 20 69 6e 74 6f 20 65 70 68 2d 74 61 62 6c 65  d into eph-table
e440: 29 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 57 68  ).**   sqlite3Wh
e450: 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 41 67  ereEnd().**   Ag
e460: 67 46 69 6e 61 6c 20 28 78 46 69 6e 61 6c 69 7a  gFinal (xFinaliz
e470: 65 29 0a 2a 2a 20 20 20 47 6f 73 75 62 20 61 64  e).**   Gosub ad
e480: 64 72 47 6f 73 75 62 0a 2a 2a 0a 2a 2a 20 52 41  drGosub.**.** RA
e490: 4e 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f  NGE BETWEEN UNBO
e4a0: 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20  UNDED PRECEDING 
e4b0: 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f  AND UNBOUNDED FO
e4c0: 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20  LLOWING.**.**   
e4d0: 41 73 20 61 62 6f 76 65 2c 20 65 78 63 65 70 74  As above, except
e4e0: 20 74 61 6b 65 20 6e 6f 20 61 63 74 69 6f 6e 20   take no action 
e4f0: 66 6f 72 20 61 20 22 6e 65 77 20 70 65 65 72 22  for a "new peer"
e500: 2e 20 49 6e 76 6f 6b 65 0a 2a 2a 20 20 20 74 68  . Invoke.**   th
e510: 65 20 73 75 62 2d 72 6f 75 74 69 6e 65 20 6f 6e  e sub-routine on
e520: 63 65 20 6f 6e 6c 79 20 66 6f 72 20 65 61 63 68  ce only for each
e530: 20 70 61 72 74 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a   partition..**.*
e540: 2a 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20  * RANGE BETWEEN 
e550: 43 55 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20  CURRENT ROW AND 
e560: 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a 0a 2a  CURRENT ROW.**.*
e570: 2a 20 20 20 41 73 20 61 62 6f 76 65 2c 20 65 78  *   As above, ex
e580: 63 65 70 74 20 74 68 61 74 20 74 68 65 20 22 6e  cept that the "n
e590: 65 77 20 70 65 65 72 22 20 63 6f 6e 64 69 74 69  ew peer" conditi
e5a0: 6f 6e 20 69 73 20 68 61 6e 64 6c 65 64 20 69 6e  on is handled in
e5b0: 20 74 68 65 0a 2a 2a 20 20 20 73 61 6d 65 20 77   the.**   same w
e5c0: 61 79 20 61 73 20 22 6e 65 77 20 70 61 72 74 69  ay as "new parti
e5d0: 74 69 6f 6e 22 20 28 73 6f 20 74 68 65 72 65 20  tion" (so there 
e5e0: 69 73 20 6e 6f 20 22 65 6c 73 65 20 69 66 22 20  is no "else if" 
e5f0: 62 6c 6f 63 6b 29 2e 0a 2a 2a 0a 2a 2a 20 52 4f  block)..**.** RO
e600: 57 53 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55  WS BETWEEN UNBOU
e610: 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41  NDED PRECEDING A
e620: 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a  ND CURRENT ROW.*
e630: 2a 20 0a 2a 2a 20 20 20 41 73 20 61 62 6f 76 65  * .**   As above
e640: 2c 20 65 78 63 65 70 74 20 61 73 73 75 6d 65 20  , except assume 
e650: 65 76 65 72 79 20 72 6f 77 20 69 73 20 61 20 22  every row is a "
e660: 6e 65 77 20 70 65 65 72 22 2e 0a 2a 2f 0a 73 74  new peer"..*/.st
e670: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77  atic void window
e680: 43 6f 64 65 44 65 66 61 75 6c 74 53 74 65 70 28  CodeDefaultStep(
e690: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
e6a0: 2c 20 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 0a  , .  Select *p,.
e6b0: 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
e6c0: 6e 66 6f 2c 0a 20 20 69 6e 74 20 72 65 67 47 6f  nfo,.  int regGo
e6d0: 73 75 62 2c 20 0a 20 20 69 6e 74 20 61 64 64 72  sub, .  int addr
e6e0: 47 6f 73 75 62 0a 29 7b 0a 20 20 57 69 6e 64 6f  Gosub.){.  Windo
e6f0: 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57  w *pMWin = p->pW
e700: 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  in;.  Vdbe *v = 
e710: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
e720: 50 61 72 73 65 29 3b 0a 20 20 57 69 6e 64 6f 77  Parse);.  Window
e730: 20 2a 70 57 69 6e 3b 0a 20 20 69 6e 74 20 6b 3b   *pWin;.  int k;
e740: 0a 20 20 69 6e 74 20 69 53 75 62 43 73 72 20 3d  .  int iSubCsr =
e750: 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 69   p->pSrc->a[0].i
e760: 43 75 72 73 6f 72 3b 0a 20 20 69 6e 74 20 6e 53  Cursor;.  int nS
e770: 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  ub = p->pSrc->a[
e780: 30 5d 2e 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  0].pTab->nCol;. 
e790: 20 69 6e 74 20 72 65 67 20 3d 20 70 50 61 72 73   int reg = pPars
e7a0: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 69 6e 74  e->nMem+1;.  int
e7b0: 20 72 65 67 52 65 63 6f 72 64 20 3d 20 72 65 67   regRecord = reg
e7c0: 2b 6e 53 75 62 3b 0a 20 20 69 6e 74 20 72 65 67  +nSub;.  int reg
e7d0: 52 6f 77 69 64 20 3d 20 72 65 67 52 65 63 6f 72  Rowid = regRecor
e7e0: 64 2b 31 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b  d+1;.  int addr;
e7f0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 50 61  .  ExprList *pPa
e800: 72 74 20 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72  rt = pMWin->pPar
e810: 74 69 74 69 6f 6e 3b 0a 20 20 45 78 70 72 4c 69  tition;.  ExprLi
e820: 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
e830: 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 3b 0a  MWin->pOrderBy;.
e840: 0a 20 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e  .  assert( pMWin
e850: 2d 3e 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47  ->eType==TK_RANG
e860: 45 20 0a 20 20 20 20 20 20 7c 7c 20 28 70 4d 57  E .      || (pMW
e870: 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55  in->eStart==TK_U
e880: 4e 42 4f 55 4e 44 45 44 20 26 26 20 70 4d 57 69  NBOUNDED && pMWi
e890: 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52  n->eEnd==TK_CURR
e8a0: 45 4e 54 29 0a 20 20 29 3b 0a 0a 20 20 61 73 73  ENT).  );..  ass
e8b0: 65 72 74 28 20 28 70 4d 57 69 6e 2d 3e 65 53 74  ert( (pMWin->eSt
e8c0: 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  art==TK_UNBOUNDE
e8d0: 44 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64  D && pMWin->eEnd
e8e0: 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29 0a 20 20  ==TK_CURRENT).  
e8f0: 20 20 20 20 20 7c 7c 20 28 70 4d 57 69 6e 2d 3e       || (pMWin->
e900: 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55  eStart==TK_UNBOU
e910: 4e 44 45 44 20 26 26 20 70 4d 57 69 6e 2d 3e 65  NDED && pMWin->e
e920: 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  End==TK_UNBOUNDE
e930: 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 4d  D).       || (pM
e940: 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
e950: 43 55 52 52 45 4e 54 20 26 26 20 70 4d 57 69 6e  CURRENT && pMWin
e960: 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45  ->eEnd==TK_CURRE
e970: 4e 54 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  NT).       || (p
e980: 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
e990: 5f 43 55 52 52 45 4e 54 20 26 26 20 70 4d 57 69  _CURRENT && pMWi
e9a0: 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f  n->eEnd==TK_UNBO
e9b0: 55 4e 44 45 44 20 26 26 20 21 70 4f 72 64 65 72  UNDED && !pOrder
e9c0: 42 79 29 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20  By).  );..  if( 
e9d0: 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f  pMWin->eEnd==TK_
e9e0: 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20  UNBOUNDED ){.   
e9f0: 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   pOrderBy = 0;. 
ea00: 20 7d 0a 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d   }..  pParse->nM
ea10: 65 6d 20 2b 3d 20 6e 53 75 62 20 2b 20 32 3b 0a  em += nSub + 2;.
ea20: 0a 20 20 2f 2a 20 4d 61 72 74 69 61 6c 20 74 68  .  /* Martial th
ea30: 65 20 72 6f 77 20 72 65 74 75 72 6e 65 64 20 62  e row returned b
ea40: 79 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74  y the sub-select
ea50: 20 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f   into an array o
ea60: 66 20 0a 20 20 2a 2a 20 72 65 67 69 73 74 65 72  f .  ** register
ea70: 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b  s. */.  for(k=0;
ea80: 20 6b 3c 6e 53 75 62 3b 20 6b 2b 2b 29 7b 0a 20   k<nSub; k++){. 
ea90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
eaa0: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
eab0: 6e 2c 20 69 53 75 62 43 73 72 2c 20 6b 2c 20 72  n, iSubCsr, k, r
eac0: 65 67 2b 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eg+k);.  }..  /*
ead0: 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 69   Check if this i
eae0: 73 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  s the start of a
eaf0: 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 20 6f   new partition o
eb00: 72 20 70 65 65 72 20 67 72 6f 75 70 2e 20 2a 2f  r peer group. */
eb10: 0a 20 20 69 66 28 20 70 50 61 72 74 20 7c 7c 20  .  if( pPart || 
eb20: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
eb30: 69 6e 74 20 6e 50 61 72 74 20 3d 20 28 70 50 61  int nPart = (pPa
eb40: 72 74 20 3f 20 70 50 61 72 74 2d 3e 6e 45 78 70  rt ? pPart->nExp
eb50: 72 20 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74 20  r : 0);.    int 
eb60: 61 64 64 72 47 6f 74 6f 20 3d 20 30 3b 0a 20 20  addrGoto = 0;.  
eb70: 20 20 69 6e 74 20 61 64 64 72 4a 75 6d 70 20 3d    int addrJump =
eb80: 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 50 65 65   0;.    int nPee
eb90: 72 20 3d 20 28 70 4f 72 64 65 72 42 79 20 3f 20  r = (pOrderBy ? 
eba0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
ebb0: 3a 20 30 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  : 0);..    if( p
ebc0: 50 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69 6e  Part ){.      in
ebd0: 74 20 72 65 67 4e 65 77 50 61 72 74 20 3d 20 72  t regNewPart = r
ebe0: 65 67 20 2b 20 70 4d 57 69 6e 2d 3e 6e 42 75 66  eg + pMWin->nBuf
ebf0: 66 65 72 43 6f 6c 3b 0a 20 20 20 20 20 20 4b 65  ferCol;.      Ke
ec00: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
ec10: 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
ec20: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
ec30: 72 73 65 2c 20 70 50 61 72 74 2c 20 30 2c 20 30  rse, pPart, 0, 0
ec40: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
ec50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ec60: 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  3(v, OP_Compare,
ec70: 20 72 65 67 4e 65 77 50 61 72 74 2c 20 70 4d 57   regNewPart, pMW
ec80: 69 6e 2d 3e 72 65 67 50 61 72 74 2c 6e 50 61 72  in->regPart,nPar
ec90: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
eca0: 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c  3VdbeAppendP4(v,
ecb0: 20 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f   (void*)pKeyInfo
ecc0: 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
ecd0: 20 20 20 20 20 61 64 64 72 4a 75 6d 70 20 3d 20       addrJump = 
ece0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ecf0: 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64  3(v, OP_Jump, ad
ed00: 64 72 2b 32 2c 20 30 2c 20 61 64 64 72 2b 32 29  dr+2, 0, addr+2)
ed10: 3b 0a 20 20 20 20 20 20 77 69 6e 64 6f 77 41 67  ;.      windowAg
ed20: 67 46 69 6e 61 6c 28 70 50 61 72 73 65 2c 20 70  gFinal(pParse, p
ed30: 4d 57 69 6e 2c 20 31 29 3b 0a 20 20 20 20 20 20  MWin, 1);.      
ed40: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
ed50: 20 20 20 20 20 20 20 20 61 64 64 72 47 6f 74 6f          addrGoto
ed60: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
ed70: 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29  dOp0(v, OP_Goto)
ed80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
ed90: 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42  .    if( pOrderB
eda0: 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  y ){.      int r
edb0: 65 67 4e 65 77 50 65 65 72 20 3d 20 72 65 67 20  egNewPeer = reg 
edc0: 2b 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72  + pMWin->nBuffer
edd0: 43 6f 6c 20 2b 20 6e 50 61 72 74 3b 0a 20 20 20  Col + nPart;.   
ede0: 20 20 20 69 6e 74 20 72 65 67 50 65 65 72 20 3d     int regPeer =
edf0: 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 20   pMWin->regPart 
ee00: 2b 20 6e 50 61 72 74 3b 0a 0a 20 20 20 20 20 20  + nPart;..      
ee10: 69 66 28 20 61 64 64 72 4a 75 6d 70 20 29 20 73  if( addrJump ) s
ee20: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
ee30: 72 65 28 76 2c 20 61 64 64 72 4a 75 6d 70 29 3b  re(v, addrJump);
ee40: 0a 20 20 20 20 20 20 69 66 28 20 70 4d 57 69 6e  .      if( pMWin
ee50: 2d 3e 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47  ->eType==TK_RANG
ee60: 45 20 29 7b 0a 20 20 20 20 20 20 20 20 4b 65 79  E ){.        Key
ee70: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
ee80: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46   sqlite3KeyInfoF
ee90: 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
eea0: 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 2c  se, pOrderBy, 0,
eeb0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64   0);.        add
eec0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
eed0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp3(v, OP_Comp
eee0: 61 72 65 2c 20 72 65 67 4e 65 77 50 65 65 72 2c  are, regNewPeer,
eef0: 20 72 65 67 50 65 65 72 2c 20 6e 50 65 65 72 29   regPeer, nPeer)
ef00: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
ef10: 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c  3VdbeAppendP4(v,
ef20: 20 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f   (void*)pKeyInfo
ef30: 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
ef40: 20 20 20 20 20 20 20 61 64 64 72 4a 75 6d 70 20         addrJump 
ef50: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
ef60: 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
ef70: 61 64 64 72 2b 32 2c 20 30 2c 20 61 64 64 72 2b  addr+2, 0, addr+
ef80: 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  2);.      }else{
ef90: 0a 20 20 20 20 20 20 20 20 61 64 64 72 4a 75 6d  .        addrJum
efa0: 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  p = 0;.      }. 
efb0: 20 20 20 20 20 77 69 6e 64 6f 77 41 67 67 46 69       windowAggFi
efc0: 6e 61 6c 28 70 50 61 72 73 65 2c 20 70 4d 57 69  nal(pParse, pMWi
efd0: 6e 2c 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  n, pMWin->eStart
efe0: 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29 3b 0a 20  ==TK_CURRENT);. 
eff0: 20 20 20 20 20 69 66 28 20 61 64 64 72 47 6f 74       if( addrGot
f000: 6f 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  o ) sqlite3VdbeJ
f010: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 47  umpHere(v, addrG
f020: 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  oto);.    }..   
f030: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f040: 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
f050: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c   pMWin->iEphCsr,
f060: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
f070: 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20  ntAddr(v)+3);.  
f080: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f090: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
f0a0: 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47   regGosub, addrG
f0b0: 6f 73 75 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  osub);.    sqlit
f0c0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
f0d0: 4f 50 5f 4e 65 78 74 2c 20 70 4d 57 69 6e 2d 3e  OP_Next, pMWin->
f0e0: 69 45 70 68 43 73 72 2c 20 73 71 6c 69 74 65 33  iEphCsr, sqlite3
f0f0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
f100: 76 29 2d 31 29 3b 0a 0a 20 20 20 20 73 71 6c 69  v)-1);..    sqli
f110: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
f120: 20 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c   OP_ResetSorter,
f130: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29   pMWin->iEphCsr)
f140: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
f150: 65 41 64 64 4f 70 33 28 0a 20 20 20 20 20 20 20  eAddOp3(.       
f160: 20 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67   v, OP_Copy, reg
f170: 2b 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43  +pMWin->nBufferC
f180: 6f 6c 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61  ol, pMWin->regPa
f190: 72 74 2c 20 6e 50 61 72 74 2b 6e 50 65 65 72 2d  rt, nPart+nPeer-
f1a0: 31 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 69 66  1.    );..    if
f1b0: 28 20 61 64 64 72 4a 75 6d 70 20 29 20 73 71 6c  ( addrJump ) sql
f1c0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
f1d0: 28 76 2c 20 61 64 64 72 4a 75 6d 70 29 3b 0a 20  (v, addrJump);. 
f1e0: 20 7d 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20   }..  /* Invoke 
f1f0: 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 66 6f  step function fo
f200: 72 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  r window functio
f210: 6e 73 20 2a 2f 0a 20 20 77 69 6e 64 6f 77 41 67  ns */.  windowAg
f220: 67 53 74 65 70 28 70 50 61 72 73 65 2c 20 70 4d  gStep(pParse, pM
f230: 57 69 6e 2c 20 2d 31 2c 20 30 2c 20 72 65 67 2c  Win, -1, 0, reg,
f240: 20 30 29 3b 0a 0a 20 20 2f 2a 20 42 75 66 66 65   0);..  /* Buffe
f250: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  r the current ro
f260: 77 20 69 6e 20 74 68 65 20 65 70 68 65 6d 65 72  w in the ephemer
f270: 61 6c 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 69  al table. */.  i
f280: 66 28 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65  f( pMWin->nBuffe
f290: 72 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 73 71  rCol>0 ){.    sq
f2a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
f2b0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
f2c0: 2c 20 72 65 67 2c 20 70 4d 57 69 6e 2d 3e 6e 42  , reg, pMWin->nB
f2d0: 75 66 66 65 72 43 6f 6c 2c 20 72 65 67 52 65 63  ufferCol, regRec
f2e0: 6f 72 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ord);.  }else{. 
f2f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f300: 64 4f 70 32 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c  dOp2(v, OP_Blob,
f310: 20 30 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a   0, regRecord);.
f320: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f330: 70 70 65 6e 64 50 34 28 76 2c 20 28 76 6f 69 64  ppendP4(v, (void
f340: 2a 29 22 22 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  *)"", 0);.  }.  
f350: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f360: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
f370: 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
f380: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 73  , regRowid);.  s
f390: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
f3a0: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70  (v, OP_Insert, p
f3b0: 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 72  MWin->iEphCsr, r
f3c0: 65 67 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77  egRecord, regRow
f3d0: 69 64 29 3b 0a 0a 20 20 2f 2a 20 45 6e 64 20 74  id);..  /* End t
f3e0: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
f3f0: 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 73 71 6c 69   loop. */.  sqli
f400: 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
f410: 66 6f 29 3b 0a 0a 20 20 77 69 6e 64 6f 77 41 67  fo);..  windowAg
f420: 67 46 69 6e 61 6c 28 70 50 61 72 73 65 2c 20 70  gFinal(pParse, p
f430: 4d 57 69 6e 2c 20 31 29 3b 0a 20 20 73 71 6c 69  MWin, 1);.  sqli
f440: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f450: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4d 57 69   OP_Rewind, pMWi
f460: 6e 2d 3e 69 45 70 68 43 73 72 2c 73 71 6c 69 74  n->iEphCsr,sqlit
f470: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
f480: 72 28 76 29 2b 33 29 3b 0a 20 20 73 71 6c 69 74  r(v)+3);.  sqlit
f490: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
f4a0: 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 47 6f 73  OP_Gosub, regGos
f4b0: 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a  ub, addrGosub);.
f4c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f4d0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
f4e0: 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20  pMWin->iEphCsr, 
f4f0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
f500: 6e 74 41 64 64 72 28 76 29 2d 31 29 3b 0a 7d 0a  ntAddr(v)-1);.}.
f510: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
f520: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64 75 70  and return a dup
f530: 6c 69 63 61 74 65 20 6f 66 20 74 68 65 20 57 69  licate of the Wi
f540: 6e 64 6f 77 20 6f 62 6a 65 63 74 20 69 6e 64 69  ndow object indi
f550: 63 61 74 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  cated by the.** 
f560: 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 2e 20  third argument. 
f570: 53 65 74 20 74 68 65 20 57 69 6e 64 6f 77 2e 70  Set the Window.p
f580: 4f 77 6e 65 72 20 66 69 65 6c 64 20 6f 66 20 74  Owner field of t
f590: 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 74 6f  he new object to
f5a0: 0a 2a 2a 20 70 4f 77 6e 65 72 2e 0a 2a 2f 0a 57  .** pOwner..*/.W
f5b0: 69 6e 64 6f 77 20 2a 73 71 6c 69 74 65 33 57 69  indow *sqlite3Wi
f5c0: 6e 64 6f 77 44 75 70 28 73 71 6c 69 74 65 33 20  ndowDup(sqlite3 
f5d0: 2a 64 62 2c 20 45 78 70 72 20 2a 70 4f 77 6e 65  *db, Expr *pOwne
f5e0: 72 2c 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20  r, Window *p){. 
f5f0: 20 57 69 6e 64 6f 77 20 2a 70 4e 65 77 20 3d 20   Window *pNew = 
f600: 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  0;.  if( p ){.  
f610: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
f620: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
f630: 20 73 69 7a 65 6f 66 28 57 69 6e 64 6f 77 29 29   sizeof(Window))
f640: 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20 29  ;.    if( pNew )
f650: 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 46  {.      pNew->pF
f660: 69 6c 74 65 72 20 3d 20 73 71 6c 69 74 65 33 45  ilter = sqlite3E
f670: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 46  xprDup(db, p->pF
f680: 69 6c 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  ilter, 0);.     
f690: 20 70 4e 65 77 2d 3e 70 50 61 72 74 69 74 69 6f   pNew->pPartitio
f6a0: 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  n = sqlite3ExprL
f6b0: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 50  istDup(db, p->pP
f6c0: 61 72 74 69 74 69 6f 6e 2c 20 30 29 3b 0a 20 20  artition, 0);.  
f6d0: 20 20 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72      pNew->pOrder
f6e0: 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
f6f0: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
f700: 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 20 20 20  OrderBy, 0);.   
f710: 20 20 20 70 4e 65 77 2d 3e 65 54 79 70 65 20 3d     pNew->eType =
f720: 20 70 2d 3e 65 54 79 70 65 3b 0a 20 20 20 20 20   p->eType;.     
f730: 20 70 4e 65 77 2d 3e 65 45 6e 64 20 3d 20 70 2d   pNew->eEnd = p-
f740: 3e 65 45 6e 64 3b 0a 20 20 20 20 20 20 70 4e 65  >eEnd;.      pNe
f750: 77 2d 3e 65 53 74 61 72 74 20 3d 20 70 2d 3e 65  w->eStart = p->e
f760: 53 74 61 72 74 3b 0a 20 20 20 20 20 20 70 4e 65  Start;.      pNe
f770: 77 2d 3e 70 53 74 61 72 74 20 3d 20 73 71 6c 69  w->pStart = sqli
f780: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
f790: 2d 3e 70 53 74 61 72 74 2c 20 30 29 3b 0a 20 20  ->pStart, 0);.  
f7a0: 20 20 20 20 70 4e 65 77 2d 3e 70 45 6e 64 20 3d      pNew->pEnd =
f7b0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
f7c0: 64 62 2c 20 70 2d 3e 70 45 6e 64 2c 20 30 29 3b  db, p->pEnd, 0);
f7d0: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4f 77  .      pNew->pOw
f7e0: 6e 65 72 20 3d 20 70 4f 77 6e 65 72 3b 0a 20 20  ner = pOwner;.  
f7f0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
f800: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
f810: 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
f820: 6e 28 29 20 68 61 73 20 61 6c 72 65 61 64 79 20  n() has already 
f830: 62 65 65 6e 20 63 61 6c 6c 65 64 20 66 6f 72 20  been called for 
f840: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
f850: 6d 65 6e 74 20 0a 2a 2a 20 70 61 73 73 65 64 20  ment .** passed 
f860: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
f870: 67 75 6d 65 6e 74 20 77 68 65 6e 20 74 68 69 73  gument when this
f880: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76   function is inv
f890: 6f 6b 65 64 2e 20 49 74 20 67 65 6e 65 72 61 74  oked. It generat
f8a0: 65 73 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 70 6f  es.** code to po
f8b0: 70 75 6c 61 74 65 20 74 68 65 20 57 69 6e 64 6f  pulate the Windo
f8c0: 77 2e 72 65 67 52 65 73 75 6c 74 20 72 65 67 69  w.regResult regi
f8d0: 73 74 65 72 20 66 6f 72 20 65 61 63 68 20 77 69  ster for each wi
f8e0: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 61 6e  ndow function an
f8f0: 64 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20  d.** invoke the 
f900: 73 75 62 2d 72 6f 75 74 69 6e 65 20 61 74 20 69  sub-routine at i
f910: 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72 47  nstruction addrG
f920: 6f 73 75 62 20 6f 6e 63 65 20 66 6f 72 20 65 61  osub once for ea
f930: 63 68 20 72 6f 77 2e 0a 2a 2a 20 54 68 69 73 20  ch row..** This 
f940: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 73  function calls s
f950: 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
f960: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
f970: 67 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  g. .*/.void sqli
f980: 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 53 74 65  te3WindowCodeSte
f990: 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  p(.  Parse *pPar
f9a0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
f9b0: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
f9c0: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
f9d0: 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
f9e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
f9f0: 77 72 69 74 74 65 6e 20 53 45 4c 45 43 54 20 73  written SELECT s
fa00: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 57 68  tatement */.  Wh
fa10: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
fa20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fa30: 20 43 6f 6e 74 65 78 74 20 72 65 74 75 72 6e 65   Context returne
fa40: 64 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72  d by sqlite3Wher
fa50: 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e  eBegin() */.  in
fa60: 74 20 72 65 67 47 6f 73 75 62 2c 20 20 20 20 20  t regGosub,     
fa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fa80: 20 52 65 67 69 73 74 65 72 20 66 6f 72 20 4f 50   Register for OP
fa90: 5f 47 6f 73 75 62 20 2a 2f 0a 20 20 69 6e 74 20  _Gosub */.  int 
faa0: 61 64 64 72 47 6f 73 75 62 20 20 20 20 20 20 20  addrGosub       
fab0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
fac0: 50 5f 47 6f 73 75 62 20 68 65 72 65 20 74 6f 20  P_Gosub here to 
fad0: 72 65 74 75 72 6e 20 65 61 63 68 20 72 6f 77 20  return each row 
fae0: 2a 2f 0a 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a  */.){.  Window *
faf0: 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b  pMWin = p->pWin;
fb00: 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65  ..  /* There are
fb10: 20 74 68 72 65 65 20 64 69 66 66 65 72 65 6e 74   three different
fb20: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
fb30: 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f 20 64  may be used to d
fb40: 6f 20 74 68 65 20 77 6f 72 6b 0a 20 20 2a 2a 20  o the work.  ** 
fb50: 6f 66 20 74 68 69 73 20 6f 6e 65 2c 20 64 65 70  of this one, dep
fb60: 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 77 69  ending on the wi
fb70: 6e 64 6f 77 20 66 72 61 6d 65 20 61 6e 64 20 74  ndow frame and t
fb80: 68 65 20 73 70 65 63 69 66 69 63 20 62 75 69 6c  he specific buil
fb90: 74 2d 69 6e 0a 20 20 2a 2a 20 77 69 6e 64 6f 77  t-in.  ** window
fba0: 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 64 20   functions used 
fbb0: 28 69 66 20 61 6e 79 29 2e 0a 20 20 2a 2a 0a 20  (if any)..  **. 
fbc0: 20 2a 2a 20 77 69 6e 64 6f 77 43 6f 64 65 52 6f   ** windowCodeRo
fbd0: 77 45 78 70 72 53 74 65 70 28 29 20 68 61 6e 64  wExprStep() hand
fbe0: 6c 65 73 20 61 6c 6c 20 22 52 4f 57 53 22 20 77  les all "ROWS" w
fbf0: 69 6e 64 6f 77 20 66 72 61 6d 65 73 2c 20 65 78  indow frames, ex
fc00: 63 65 70 74 20 66 6f 72 3a 0a 20 20 2a 2a 0a 20  cept for:.  **. 
fc10: 20 2a 2a 20 20 20 52 4f 57 53 20 42 45 54 57 45   **   ROWS BETWE
fc20: 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  EN UNBOUNDED PRE
fc30: 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45  CEDING AND CURRE
fc40: 4e 54 20 52 4f 57 0a 20 20 2a 2a 0a 20 20 2a 2a  NT ROW.  **.  **
fc50: 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69   The exception i
fc60: 73 20 62 65 63 61 75 73 65 20 77 69 6e 64 6f 77  s because window
fc70: 43 6f 64 65 52 6f 77 45 78 70 72 53 74 65 70 28  CodeRowExprStep(
fc80: 29 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 6c 6c  ) implements all
fc90: 20 77 69 6e 64 6f 77 0a 20 20 2a 2a 20 66 72 61   window.  ** fra
fca0: 6d 65 20 74 79 70 65 73 20 62 79 20 63 61 63 68  me types by cach
fcb0: 69 6e 67 20 74 68 65 20 65 6e 74 69 72 65 20 70  ing the entire p
fcc0: 61 72 74 69 74 69 6f 6e 20 69 6e 20 61 20 74 65  artition in a te
fcd0: 6d 70 20 74 61 62 6c 65 2c 20 61 6e 64 0a 20 20  mp table, and.  
fce0: 2a 2a 20 22 52 4f 57 53 20 42 45 54 57 45 45 4e  ** "ROWS BETWEEN
fcf0: 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45   UNBOUNDED PRECE
fd00: 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54  DING AND CURRENT
fd10: 20 52 4f 57 22 20 69 73 20 65 61 73 79 20 65 6e   ROW" is easy en
fd20: 6f 75 67 68 20 74 6f 0a 20 20 2a 2a 20 69 6d 70  ough to.  ** imp
fd30: 6c 65 6d 65 6e 74 20 77 69 74 68 6f 75 74 20 73  lement without s
fd40: 75 63 68 20 61 20 63 61 63 68 65 2e 0a 20 20 2a  uch a cache..  *
fd50: 2a 0a 20 20 2a 2a 20 77 69 6e 64 6f 77 43 6f 64  *.  ** windowCod
fd60: 65 43 61 63 68 65 53 74 65 70 28 29 20 69 73 20  eCacheStep() is 
fd70: 75 73 65 64 20 66 6f 72 3a 0a 20 20 2a 2a 0a 20  used for:.  **. 
fd80: 20 2a 2a 20 20 20 52 41 4e 47 45 20 42 45 54 57   **   RANGE BETW
fd90: 45 45 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20  EEN CURRENT ROW 
fda0: 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f  AND UNBOUNDED FO
fdb0: 4c 4c 4f 57 49 4e 47 0a 20 20 2a 2a 0a 20 20 2a  LLOWING.  **.  *
fdc0: 2a 20 49 74 20 69 73 20 61 6c 73 6f 20 75 73 65  * It is also use
fdd0: 64 20 66 6f 72 20 61 6e 79 74 68 69 6e 67 20 6e  d for anything n
fde0: 6f 74 20 68 61 6e 64 6c 65 64 20 62 79 20 77 69  ot handled by wi
fdf0: 6e 64 6f 77 43 6f 64 65 52 6f 77 45 78 70 72 53  ndowCodeRowExprS
fe00: 74 65 70 28 29 20 0a 20 20 2a 2a 20 74 68 61 74  tep() .  ** that
fe10: 20 69 6e 76 6f 6b 65 73 20 61 20 62 75 69 6c 74   invokes a built
fe20: 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  -in window funct
fe30: 69 6f 6e 20 74 68 61 74 20 72 65 71 75 69 72 65  ion that require
fe40: 73 20 74 68 65 20 65 6e 74 69 72 65 20 0a 20 20  s the entire .  
fe50: 2a 2a 20 70 61 72 74 69 74 69 6f 6e 20 74 6f 20  ** partition to 
fe60: 62 65 20 63 61 63 68 65 64 20 69 6e 20 61 20 74  be cached in a t
fe70: 65 6d 70 20 74 61 62 6c 65 20 62 65 66 6f 72 65  emp table before
fe80: 20 61 6e 79 20 72 6f 77 73 20 61 72 65 20 72 65   any rows are re
fe90: 74 75 72 6e 65 64 0a 20 20 2a 2a 20 28 65 2e 67  turned.  ** (e.g
fea0: 2e 20 6e 74 68 5f 76 61 6c 75 65 28 29 20 6f 72  . nth_value() or
feb0: 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b 28 29 29   percent_rank())
fec0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 69 6e 61  ..  **.  ** Fina
fed0: 6c 6c 79 2c 20 61 73 73 75 6d 69 6e 67 20 74 68  lly, assuming th
fee0: 65 72 65 20 69 73 20 6e 6f 20 62 75 69 6c 74 2d  ere is no built-
fef0: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
ff00: 6f 6e 20 74 68 61 74 20 72 65 71 75 69 72 65 73  on that requires
ff10: 0a 20 20 2a 2a 20 74 68 65 20 70 61 72 74 69 74  .  ** the partit
ff20: 69 6f 6e 20 74 6f 20 62 65 20 63 61 63 68 65 64  ion to be cached
ff30: 2c 20 77 69 6e 64 6f 77 43 6f 64 65 44 65 66 61  , windowCodeDefa
ff40: 75 6c 74 53 74 65 70 28 29 20 69 73 20 75 73 65  ultStep() is use
ff50: 64 20 66 6f 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  d for:.  **.  **
ff60: 20 20 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e     RANGE BETWEEN
ff70: 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45   UNBOUNDED PRECE
ff80: 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54  DING AND CURRENT
ff90: 20 52 4f 57 20 0a 20 20 2a 2a 20 20 20 52 41 4e   ROW .  **   RAN
ffa0: 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55  GE BETWEEN UNBOU
ffb0: 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41  NDED PRECEDING A
ffc0: 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c  ND UNBOUNDED FOL
ffd0: 4c 4f 57 49 4e 47 0a 20 20 2a 2a 20 20 20 52 41  LOWING.  **   RA
ffe0: 4e 47 45 20 42 45 54 57 45 45 4e 20 43 55 52 52  NGE BETWEEN CURR
fff0: 45 4e 54 20 52 4f 57 20 41 4e 44 20 43 55 52 52  ENT ROW AND CURR
10000 45 4e 54 20 52 4f 57 20 0a 20 20 2a 2a 20 20 20  ENT ROW .  **   
10010 52 4f 57 53 20 42 45 54 57 45 45 4e 20 55 4e 42  ROWS BETWEEN UNB
10020 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47  OUNDED PRECEDING
10030 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57   AND CURRENT ROW
10040 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 69 6e 64 6f  .  **.  ** windo
10050 77 43 6f 64 65 44 65 66 61 75 6c 74 53 74 65 70  wCodeDefaultStep
10060 28 29 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 6f  () is the only o
10070 6e 65 20 6f 66 20 74 68 65 20 74 68 72 65 65 20  ne of the three 
10080 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 0a 20  functions that. 
10090 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 63 61 63   ** does not cac
100a0 68 65 20 65 61 63 68 20 70 61 72 74 69 74 69 6f  he each partitio
100b0 6e 20 69 6e 20 61 20 74 65 6d 70 20 74 61 62 6c  n in a temp tabl
100c0 65 20 62 65 66 6f 72 65 20 62 65 67 69 6e 6e 69  e before beginni
100d0 6e 67 20 74 6f 0a 20 20 2a 2a 20 72 65 74 75 72  ng to.  ** retur
100e0 6e 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 69  n rows..  */.  i
100f0 66 28 20 70 4d 57 69 6e 2d 3e 65 54 79 70 65 3d  f( pMWin->eType=
10100 3d 54 4b 5f 52 4f 57 53 20 0a 20 20 20 26 26 20  =TK_ROWS .   && 
10110 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 21 3d  (pMWin->eStart!=
10120 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 7c 7c 70 4d  TK_UNBOUNDED||pM
10130 57 69 6e 2d 3e 65 45 6e 64 21 3d 54 4b 5f 43 55  Win->eEnd!=TK_CU
10140 52 52 45 4e 54 7c 7c 21 70 4d 57 69 6e 2d 3e 70  RRENT||!pMWin->p
10150 4f 72 64 65 72 42 79 29 0a 20 20 29 7b 0a 20 20  OrderBy).  ){.  
10160 20 20 77 69 6e 64 6f 77 43 6f 64 65 52 6f 77 45    windowCodeRowE
10170 78 70 72 53 74 65 70 28 70 50 61 72 73 65 2c 20  xprStep(pParse, 
10180 70 2c 20 70 57 49 6e 66 6f 2c 20 72 65 67 47 6f  p, pWInfo, regGo
10190 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b  sub, addrGosub);
101a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 57 69  .  }else{.    Wi
101b0 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 20 20  ndow *pWin;.    
101c0 69 6e 74 20 62 43 61 63 68 65 20 3d 20 30 3b 20  int bCache = 0; 
101d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
101e0 20 54 72 75 65 20 74 6f 20 75 73 65 20 43 61 63   True to use Cac
101f0 68 65 53 74 65 70 28 29 20 2a 2f 0a 0a 20 20 20  heStep() */..   
10200 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61   if( pMWin->eSta
10210 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 26  rt==TK_CURRENT &
10220 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54  & pMWin->eEnd==T
10230 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20  K_UNBOUNDED ){. 
10240 20 20 20 20 20 62 43 61 63 68 65 20 3d 20 31 3b       bCache = 1;
10250 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10260 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e    for(pWin=pMWin
10270 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69  ; pWin; pWin=pWi
10280 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20  n->pNextWin){.  
10290 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
102a0 46 75 6e 63 20 3d 20 70 57 69 6e 2d 3e 70 46 75  Func = pWin->pFu
102b0 6e 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  nc;.        if( 
102c0 28 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67  (pFunc->funcFlag
102d0 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
102e0 57 49 4e 44 4f 57 5f 53 49 5a 45 29 0a 20 20 20  WINDOW_SIZE).   
102f0 20 20 20 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d        || (pFunc-
10300 3e 78 53 46 75 6e 63 3d 3d 6e 74 68 5f 76 61 6c  >xSFunc==nth_val
10310 75 65 53 74 65 70 46 75 6e 63 29 0a 20 20 20 20  ueStepFunc).    
10320 20 20 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d 3e       || (pFunc->
10330 78 53 46 75 6e 63 3d 3d 66 69 72 73 74 5f 76 61  xSFunc==first_va
10340 6c 75 65 53 74 65 70 46 75 6e 63 29 0a 20 20 20  lueStepFunc).   
10350 20 20 20 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d        || (pFunc-
10360 3e 78 53 46 75 6e 63 3d 3d 6c 65 61 64 53 74 65  >xSFunc==leadSte
10370 70 46 75 6e 63 29 0a 20 20 20 20 20 20 20 20 20  pFunc).         
10380 7c 7c 20 28 70 46 75 6e 63 2d 3e 78 53 46 75 6e  || (pFunc->xSFun
10390 63 3d 3d 6c 61 67 53 74 65 70 46 75 6e 63 29 0a  c==lagStepFunc).
103a0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
103b0 20 20 20 20 20 62 43 61 63 68 65 20 3d 20 31 3b       bCache = 1;
103c0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
103d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
103e0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
103f0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 63 61 6c  * Otherwise, cal
10400 6c 20 77 69 6e 64 6f 77 43 6f 64 65 44 65 66 61  l windowCodeDefa
10410 75 6c 74 53 74 65 70 28 29 2e 20 20 2a 2f 0a 20  ultStep().  */. 
10420 20 20 20 69 66 28 20 62 43 61 63 68 65 20 29 7b     if( bCache ){
10430 0a 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64  .      windowCod
10440 65 43 61 63 68 65 53 74 65 70 28 70 50 61 72 73  eCacheStep(pPars
10450 65 2c 20 70 2c 20 70 57 49 6e 66 6f 2c 20 72 65  e, p, pWInfo, re
10460 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75  gGosub, addrGosu
10470 62 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  b);.    }else{. 
10480 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 44       windowCodeD
10490 65 66 61 75 6c 74 53 74 65 70 28 70 50 61 72 73  efaultStep(pPars
104a0 65 2c 20 70 2c 20 70 57 49 6e 66 6f 2c 20 72 65  e, p, pWInfo, re
104b0 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75  gGosub, addrGosu
104c0 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  b);.    }.  }.}.
104d0 0a                                               .