/ Hex Artifact Content
Login

Artifact ca0d94d256bc52b7815b3c73b00468d0de84021f0d7be1d18588584dc96996b4:


0000: 2f 2a 0a 2a 2a 20 32 30 31 38 20 4d 61 79 20 30  /*.** 2018 May 0
0010: 38 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  8.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
0180: 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 6e  liteInt.h"..#ifn
0190: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
01a0: 57 49 4e 44 4f 57 46 55 4e 43 0a 0a 2f 2a 0a 2a  WINDOWFUNC../*.*
01b0: 2a 20 53 45 4c 45 43 54 20 52 45 57 52 49 54 49  * SELECT REWRITI
01c0: 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 41 6e 79 20 53  NG.**.**   Any S
01d0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
01e0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  that contains on
01f0: 65 20 6f 72 20 6d 6f 72 65 20 77 69 6e 64 6f 77  e or more window
0200: 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 0a 2a 2a   functions in.**
0210: 20 20 20 65 69 74 68 65 72 20 74 68 65 20 73 65     either the se
0220: 6c 65 63 74 20 6c 69 73 74 20 6f 72 20 4f 52 44  lect list or ORD
0230: 45 52 20 42 59 20 63 6c 61 75 73 65 20 28 74 68  ER BY clause (th
0240: 65 20 6f 6e 6c 79 20 74 77 6f 20 70 6c 61 63 65  e only two place
0250: 73 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20 66 75  s window.**   fu
0260: 6e 63 74 69 6f 6e 73 20 6d 61 79 20 62 65 20 75  nctions may be u
0270: 73 65 64 29 20 69 73 20 74 72 61 6e 73 66 6f 72  sed) is transfor
0280: 6d 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20  med by function 
0290: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 52 65 77  sqlite3WindowRew
02a0: 72 69 74 65 28 29 0a 2a 2a 20 20 20 69 6e 20 6f  rite().**   in o
02b0: 72 64 65 72 20 74 6f 20 73 75 70 70 6f 72 74 20  rder to support 
02c0: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
02d0: 70 72 6f 63 65 73 73 69 6e 67 2e 20 46 6f 72 20  processing. For 
02e0: 65 78 61 6d 70 6c 65 2c 20 77 69 74 68 20 74 68  example, with th
02f0: 65 0a 2a 2a 20 20 20 73 63 68 65 6d 61 3a 0a 2a  e.**   schema:.*
0300: 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20  *.**     CREATE 
0310: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63  TABLE t1(a, b, c
0320: 2c 20 64 2c 20 65 2c 20 66 2c 20 67 29 3b 0a 2a  , d, e, f, g);.*
0330: 2a 0a 2a 2a 20 20 20 74 68 65 20 73 74 61 74 65  *.**   the state
0340: 6d 65 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment:.**.**     
0350: 53 45 4c 45 43 54 20 61 2b 31 2c 20 6d 61 78 28  SELECT a+1, max(
0360: 62 29 20 4f 56 45 52 20 28 50 41 52 54 49 54 49  b) OVER (PARTITI
0370: 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20 42 59  ON BY c ORDER BY
0380: 20 64 29 20 46 52 4f 4d 20 74 31 20 4f 52 44 45   d) FROM t1 ORDE
0390: 52 20 42 59 20 65 3b 0a 2a 2a 0a 2a 2a 20 20 20  R BY e;.**.**   
03a0: 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74  is transformed t
03b0: 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  o:.**.**     SEL
03c0: 45 43 54 20 61 2b 31 2c 20 6d 61 78 28 62 29 20  ECT a+1, max(b) 
03d0: 4f 56 45 52 20 28 50 41 52 54 49 54 49 4f 4e 20  OVER (PARTITION 
03e0: 42 59 20 63 20 4f 52 44 45 52 20 42 59 20 64 29  BY c ORDER BY d)
03f0: 20 46 52 4f 4d 20 28 0a 2a 2a 20 20 20 20 20 20   FROM (.**      
0400: 20 20 20 53 45 4c 45 43 54 20 61 2c 20 65 2c 20     SELECT a, e, 
0410: 63 2c 20 64 2c 20 62 20 46 52 4f 4d 20 74 31 20  c, d, b FROM t1 
0420: 4f 52 44 45 52 20 42 59 20 63 2c 20 64 0a 2a 2a  ORDER BY c, d.**
0430: 20 20 20 20 20 29 20 4f 52 44 45 52 20 42 59 20       ) ORDER BY 
0440: 65 3b 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66  e;.**.**   The f
0450: 6c 61 74 74 65 6e 69 6e 67 20 6f 70 74 69 6d 69  lattening optimi
0460: 7a 61 74 69 6f 6e 20 69 73 20 64 69 73 61 62 6c  zation is disabl
0470: 65 64 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69  ed when processi
0480: 6e 67 20 74 68 69 73 20 74 72 61 6e 73 66 6f 72  ng this transfor
0490: 6d 65 64 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  med.**   SELECT 
04a0: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
04b0: 61 6c 6c 6f 77 73 20 74 68 65 20 69 6d 70 6c 65  allows the imple
04c0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
04d0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
04e0: 0a 2a 2a 20 20 20 28 69 6e 20 74 68 69 73 20 63  .**   (in this c
04f0: 61 73 65 20 6d 61 78 28 29 29 20 74 6f 20 70 72  ase max()) to pr
0500: 6f 63 65 73 73 20 72 6f 77 73 20 73 6f 72 74 65  ocess rows sorte
0510: 64 20 69 6e 20 6f 72 64 65 72 20 6f 66 20 28 63  d in order of (c
0520: 2c 20 64 29 2c 20 77 68 69 63 68 0a 2a 2a 20 20  , d), which.**  
0530: 20 6d 61 6b 65 73 20 74 68 69 6e 67 73 20 65 61   makes things ea
0540: 73 69 65 72 20 66 6f 72 20 6f 62 76 69 6f 75 73  sier for obvious
0550: 20 72 65 61 73 6f 6e 73 2e 20 4d 6f 72 65 20 67   reasons. More g
0560: 65 6e 65 72 61 6c 6c 79 3a 0a 2a 2a 0a 2a 2a 20  enerally:.**.** 
0570: 20 20 20 20 2a 20 46 52 4f 4d 2c 20 57 48 45 52      * FROM, WHER
0580: 45 2c 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20  E, GROUP BY and 
0590: 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73 20 61  HAVING clauses a
05a0: 72 65 20 61 6c 6c 20 6d 6f 76 65 64 20 74 6f 20  re all moved to 
05b0: 0a 2a 2a 20 20 20 20 20 20 20 74 68 65 20 73 75  .**       the su
05c0: 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  b-query..**.**  
05d0: 20 20 20 2a 20 4f 52 44 45 52 20 42 59 2c 20 4c     * ORDER BY, L
05e0: 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
05f0: 72 65 6d 61 69 6e 20 70 61 72 74 20 6f 66 20 74  remain part of t
0600: 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 2e  he parent query.
0610: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 65 72  .**.**     * Ter
0620: 6d 69 6e 61 6c 73 20 66 72 6f 6d 20 65 61 63 68  minals from each
0630: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
0640: 6f 6e 20 74 72 65 65 73 20 74 68 61 74 20 6d 61  on trees that ma
0650: 6b 65 20 75 70 20 74 68 65 20 0a 2a 2a 20 20 20  ke up the .**   
0660: 20 20 20 20 73 65 6c 65 63 74 2d 6c 69 73 74 20      select-list 
0670: 61 6e 64 20 4f 52 44 45 52 20 42 59 20 65 78 70  and ORDER BY exp
0680: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20  ressions in the 
0690: 70 61 72 65 6e 74 20 71 75 65 72 79 20 61 72 65  parent query are
06a0: 0a 2a 2a 20 20 20 20 20 20 20 73 65 6c 65 63 74  .**       select
06b0: 65 64 20 62 79 20 74 68 65 20 73 75 62 2d 71 75  ed by the sub-qu
06c0: 65 72 79 2e 20 46 6f 72 20 74 68 65 20 70 75 72  ery. For the pur
06d0: 70 6f 73 65 73 20 6f 66 20 74 68 65 20 74 72 61  poses of the tra
06e0: 6e 73 66 6f 72 6d 61 74 69 6f 6e 2c 0a 2a 2a 20  nsformation,.** 
06f0: 20 20 20 20 20 20 74 65 72 6d 69 6e 61 6c 73 20        terminals 
0700: 61 72 65 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72  are column refer
0710: 65 6e 63 65 73 20 61 6e 64 20 61 67 67 72 65 67  ences and aggreg
0720: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  ate functions..*
0730: 2a 0a 2a 2a 20 20 20 49 66 20 74 68 65 72 65 20  *.**   If there 
0740: 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  is more than one
0750: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
0760: 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 74   in the SELECT t
0770: 68 61 74 20 75 73 65 73 0a 2a 2a 20 20 20 74 68  hat uses.**   th
0780: 65 20 73 61 6d 65 20 77 69 6e 64 6f 77 20 64 65  e same window de
0790: 63 6c 61 72 61 74 69 6f 6e 20 28 74 68 65 20 4f  claration (the O
07a0: 56 45 52 20 62 69 74 29 2c 20 74 68 65 6e 20 61  VER bit), then a
07b0: 20 73 69 6e 67 6c 65 20 73 63 61 6e 20 6d 61 79   single scan may
07c0: 0a 2a 2a 20 20 20 62 65 20 75 73 65 64 20 74 6f  .**   be used to
07d0: 20 70 72 6f 63 65 73 73 20 6d 6f 72 65 20 74 68   process more th
07e0: 61 6e 20 6f 6e 65 20 77 69 6e 64 6f 77 20 66 75  an one window fu
07f0: 6e 63 74 69 6f 6e 2e 20 46 6f 72 20 65 78 61 6d  nction. For exam
0800: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ple:.**.**     S
0810: 45 4c 45 43 54 20 6d 61 78 28 62 29 20 4f 56 45  ELECT max(b) OVE
0820: 52 20 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20  R (PARTITION BY 
0830: 63 20 4f 52 44 45 52 20 42 59 20 64 29 2c 20 0a  c ORDER BY d), .
0840: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 6d 69  **            mi
0850: 6e 28 65 29 20 4f 56 45 52 20 28 50 41 52 54 49  n(e) OVER (PARTI
0860: 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20  TION BY c ORDER 
0870: 42 59 20 64 29 20 0a 2a 2a 20 20 20 20 20 46 52  BY d) .**     FR
0880: 4f 4d 20 74 31 3b 0a 2a 2a 0a 2a 2a 20 20 20 69  OM t1;.**.**   i
0890: 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  s transformed in
08a0: 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73   the same way as
08b0: 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f   the example abo
08c0: 76 65 2e 20 48 6f 77 65 76 65 72 3a 0a 2a 2a 0a  ve. However:.**.
08d0: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 6d 61  **     SELECT ma
08e0: 78 28 62 29 20 4f 56 45 52 20 28 50 41 52 54 49  x(b) OVER (PARTI
08f0: 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20  TION BY c ORDER 
0900: 42 59 20 64 29 2c 20 0a 2a 2a 20 20 20 20 20 20  BY d), .**      
0910: 20 20 20 20 20 20 6d 69 6e 28 65 29 20 4f 56 45        min(e) OVE
0920: 52 20 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20  R (PARTITION BY 
0930: 61 20 4f 52 44 45 52 20 42 59 20 62 29 20 0a 2a  a ORDER BY b) .*
0940: 2a 20 20 20 20 20 46 52 4f 4d 20 74 31 3b 0a 2a  *     FROM t1;.*
0950: 2a 0a 2a 2a 20 20 20 4d 75 73 74 20 62 65 20 74  *.**   Must be t
0960: 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 2a  ransformed to:.*
0970: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
0980: 6d 61 78 28 62 29 20 4f 56 45 52 20 28 50 41 52  max(b) OVER (PAR
0990: 54 49 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45  TITION BY c ORDE
09a0: 52 20 42 59 20 64 29 20 46 52 4f 4d 20 28 0a 2a  R BY d) FROM (.*
09b0: 2a 20 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  *         SELECT
09c0: 20 65 2c 20 6d 69 6e 28 65 29 20 4f 56 45 52 20   e, min(e) OVER 
09d0: 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20 61 20  (PARTITION BY a 
09e0: 4f 52 44 45 52 20 42 59 20 62 29 2c 20 63 2c 20  ORDER BY b), c, 
09f0: 64 2c 20 62 20 46 52 4f 4d 0a 2a 2a 20 20 20 20  d, b FROM.**    
0a00: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 2c         SELECT a,
0a10: 20 65 2c 20 63 2c 20 64 2c 20 62 20 46 52 4f 4d   e, c, d, b FROM
0a20: 20 74 31 20 4f 52 44 45 52 20 42 59 20 61 2c 20   t1 ORDER BY a, 
0a30: 62 0a 2a 2a 20 20 20 20 20 20 20 20 20 29 20 4f  b.**         ) O
0a40: 52 44 45 52 20 42 59 20 63 2c 20 64 0a 2a 2a 20  RDER BY c, d.** 
0a50: 20 20 20 20 29 20 4f 52 44 45 52 20 42 59 20 65      ) ORDER BY e
0a60: 3b 0a 2a 2a 0a 2a 2a 20 20 20 73 6f 20 74 68 61  ;.**.**   so tha
0a70: 74 20 62 6f 74 68 20 6d 69 6e 28 29 20 61 6e 64  t both min() and
0a80: 20 6d 61 78 28 29 20 6d 61 79 20 70 72 6f 63 65   max() may proce
0a90: 73 73 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6f  ss rows in the o
0aa0: 72 64 65 72 20 64 65 66 69 6e 65 64 20 62 79 0a  rder defined by.
0ab0: 2a 2a 20 20 20 74 68 65 69 72 20 72 65 73 70 65  **   their respe
0ac0: 63 74 69 76 65 20 77 69 6e 64 6f 77 20 64 65 63  ctive window dec
0ad0: 6c 61 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  larations..**.**
0ae0: 20 49 4e 54 45 52 46 41 43 45 20 57 49 54 48 20   INTERFACE WITH 
0af0: 53 45 4c 45 43 54 2e 43 0a 2a 2a 0a 2a 2a 20 20  SELECT.C.**.**  
0b00: 20 57 68 65 6e 20 70 72 6f 63 65 73 73 69 6e 67   When processing
0b10: 20 74 68 65 20 72 65 77 72 69 74 74 65 6e 20 53   the rewritten S
0b20: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
0b30: 20 63 6f 64 65 20 69 6e 20 73 65 6c 65 63 74 2e   code in select.
0b40: 63 20 63 61 6c 6c 73 0a 2a 2a 20 20 20 73 71 6c  c calls.**   sql
0b50: 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
0b60: 20 74 6f 20 62 65 67 69 6e 20 69 74 65 72 61 74   to begin iterat
0b70: 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68 65 20  ing through the 
0b80: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 0a 2a  results of the.*
0b90: 2a 20 20 20 73 75 62 2d 71 75 65 72 79 2c 20 77  *   sub-query, w
0ba0: 68 69 63 68 20 69 73 20 61 6c 77 61 79 73 20 69  hich is always i
0bb0: 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
0bc0: 63 6f 2d 72 6f 75 74 69 6e 65 2e 20 49 74 20 74  co-routine. It t
0bd0: 68 65 6e 20 63 61 6c 6c 73 0a 2a 2a 20 20 20 73  hen calls.**   s
0be0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65  qlite3WindowCode
0bf0: 53 74 65 70 28 29 20 74 6f 20 70 72 6f 63 65 73  Step() to proces
0c00: 73 20 72 6f 77 73 20 61 6e 64 20 66 69 6e 69 73  s rows and finis
0c10: 68 20 74 68 65 20 73 63 61 6e 20 62 79 20 63 61  h the scan by ca
0c20: 6c 6c 69 6e 67 0a 2a 2a 20 20 20 73 71 6c 69 74  lling.**   sqlit
0c30: 65 33 57 68 65 72 65 45 6e 64 28 29 2e 0a 2a 2a  e3WhereEnd()..**
0c40: 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 57 69 6e  .**   sqlite3Win
0c50: 64 6f 77 43 6f 64 65 53 74 65 70 28 29 20 67 65  dowCodeStep() ge
0c60: 6e 65 72 61 74 65 73 20 56 4d 20 63 6f 64 65 20  nerates VM code 
0c70: 73 6f 20 74 68 61 74 2c 20 66 6f 72 20 65 61 63  so that, for eac
0c80: 68 20 72 6f 77 20 72 65 74 75 72 6e 65 64 0a 2a  h row returned.*
0c90: 2a 20 20 20 62 79 20 74 68 65 20 73 75 62 2d 71  *   by the sub-q
0ca0: 75 65 72 79 20 61 20 73 75 62 2d 72 6f 75 74 69  uery a sub-routi
0cb0: 6e 65 20 28 4f 50 5f 47 6f 73 75 62 29 20 63 6f  ne (OP_Gosub) co
0cc0: 64 65 64 20 62 79 20 73 65 6c 65 63 74 2e 63 20  ded by select.c 
0cd0: 69 73 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2a 20 20  is invoked..**  
0ce0: 20 57 68 65 6e 20 74 68 65 20 73 75 62 2d 72 6f   When the sub-ro
0cf0: 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64  utine is invoked
0d00: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 68  :.**.**     * Th
0d10: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 61 6c 6c  e results of all
0d20: 20 77 69 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e   window-function
0d30: 73 20 66 6f 72 20 74 68 65 20 72 6f 77 20 61 72  s for the row ar
0d40: 65 20 73 74 6f 72 65 64 0a 2a 2a 20 20 20 20 20  e stored.**     
0d50: 20 20 69 6e 20 74 68 65 20 61 73 73 6f 63 69 61    in the associa
0d60: 74 65 64 20 57 69 6e 64 6f 77 2e 72 65 67 52 65  ted Window.regRe
0d70: 73 75 6c 74 20 72 65 67 69 73 74 65 72 73 2e 0a  sult registers..
0d80: 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 68 65 20  **.**     * The 
0d90: 72 65 71 75 69 72 65 64 20 74 65 72 6d 69 6e 61  required termina
0da0: 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f  l values are sto
0db0: 72 65 64 20 69 6e 20 74 68 65 20 63 75 72 72 65  red in the curre
0dc0: 6e 74 20 72 6f 77 20 6f 66 0a 2a 2a 20 20 20 20  nt row of.**    
0dd0: 20 20 20 74 65 6d 70 20 74 61 62 6c 65 20 57 69     temp table Wi
0de0: 6e 64 6f 77 2e 69 45 70 68 43 73 72 2e 0a 2a 2a  ndow.iEphCsr..**
0df0: 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 63 61  .**   In some ca
0e00: 73 65 73 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  ses, depending o
0e10: 6e 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61  n the window fra
0e20: 6d 65 20 61 6e 64 20 74 68 65 20 73 70 65 63 69  me and the speci
0e30: 66 69 63 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20  fic window.**   
0e40: 66 75 6e 63 74 69 6f 6e 73 20 69 6e 76 6f 6b 65  functions invoke
0e50: 64 2c 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  d, sqlite3Window
0e60: 43 6f 64 65 53 74 65 70 28 29 20 63 61 63 68 65  CodeStep() cache
0e70: 73 20 65 61 63 68 20 65 6e 74 69 72 65 20 70 61  s each entire pa
0e80: 72 74 69 74 69 6f 6e 0a 2a 2a 20 20 20 69 6e 20  rtition.**   in 
0e90: 61 20 74 65 6d 70 20 74 61 62 6c 65 20 62 65 66  a temp table bef
0ea0: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 61 6e  ore returning an
0eb0: 79 20 72 6f 77 73 2e 20 49 6e 20 6f 74 68 65 72  y rows. In other
0ec0: 20 63 61 73 65 73 20 69 74 20 64 6f 65 73 20 6e   cases it does n
0ed0: 6f 74 2e 0a 2a 2a 20 20 20 54 68 69 73 20 64 65  ot..**   This de
0ee0: 74 61 69 6c 20 69 73 20 65 6e 63 61 70 73 75 6c  tail is encapsul
0ef0: 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 69 73  ated within this
0f00: 20 66 69 6c 65 2c 20 74 68 65 20 63 6f 64 65 20   file, the code 
0f10: 67 65 6e 65 72 61 74 65 64 20 62 79 0a 2a 2a 20  generated by.** 
0f20: 20 20 73 65 6c 65 63 74 2e 63 20 69 73 20 74 68    select.c is th
0f30: 65 20 73 61 6d 65 20 69 6e 20 65 69 74 68 65 72  e same in either
0f40: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 55 49   case..**.** BUI
0f50: 4c 54 2d 49 4e 20 57 49 4e 44 4f 57 20 46 55 4e  LT-IN WINDOW FUN
0f60: 43 54 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 54  CTIONS.**.**   T
0f70: 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  his implementati
0f80: 6f 6e 20 66 65 61 74 75 72 65 73 20 74 68 65 20  on features the 
0f90: 66 6f 6c 6c 6f 77 69 6e 67 20 62 75 69 6c 74 2d  following built-
0fa0: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
0fb0: 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72  ons:.**.**     r
0fc0: 6f 77 5f 6e 75 6d 62 65 72 28 29 0a 2a 2a 20 20  ow_number().**  
0fd0: 20 20 20 72 61 6e 6b 28 29 0a 2a 2a 20 20 20 20     rank().**    
0fe0: 20 64 65 6e 73 65 5f 72 61 6e 6b 28 29 0a 2a 2a   dense_rank().**
0ff0: 20 20 20 20 20 70 65 72 63 65 6e 74 5f 72 61 6e       percent_ran
1000: 6b 28 29 0a 2a 2a 20 20 20 20 20 63 75 6d 65 5f  k().**     cume_
1010: 64 69 73 74 28 29 0a 2a 2a 20 20 20 20 20 6e 74  dist().**     nt
1020: 69 6c 65 28 4e 29 0a 2a 2a 20 20 20 20 20 6c 65  ile(N).**     le
1030: 61 64 28 65 78 70 72 20 5b 2c 20 6f 66 66 73 65  ad(expr [, offse
1040: 74 20 5b 2c 20 64 65 66 61 75 6c 74 5d 5d 29 0a  t [, default]]).
1050: 2a 2a 20 20 20 20 20 6c 61 67 28 65 78 70 72 20  **     lag(expr 
1060: 5b 2c 20 6f 66 66 73 65 74 20 5b 2c 20 64 65 66  [, offset [, def
1070: 61 75 6c 74 5d 5d 29 0a 2a 2a 20 20 20 20 20 66  ault]]).**     f
1080: 69 72 73 74 5f 76 61 6c 75 65 28 65 78 70 72 29  irst_value(expr)
1090: 0a 2a 2a 20 20 20 20 20 6c 61 73 74 5f 76 61 6c  .**     last_val
10a0: 75 65 28 65 78 70 72 29 0a 2a 2a 20 20 20 20 20  ue(expr).**     
10b0: 6e 74 68 5f 76 61 6c 75 65 28 65 78 70 72 2c 20  nth_value(expr, 
10c0: 4e 29 0a 2a 2a 20 20 20 0a 2a 2a 20 20 20 54 68  N).**   .**   Th
10d0: 65 73 65 20 61 72 65 20 74 68 65 20 73 61 6d 65  ese are the same
10e0: 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77   built-in window
10f0: 20 66 75 6e 63 74 69 6f 6e 73 20 73 75 70 70 6f   functions suppo
1100: 72 74 65 64 20 62 79 20 50 6f 73 74 67 72 65 73  rted by Postgres
1110: 2e 20 0a 2a 2a 20 20 20 41 6c 74 68 6f 75 67 68  . .**   Although
1120: 20 74 68 65 20 62 65 68 61 76 69 6f 75 72 20 6f   the behaviour o
1130: 66 20 61 67 67 72 65 67 61 74 65 20 77 69 6e 64  f aggregate wind
1140: 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 28 66 75  ow functions (fu
1150: 6e 63 74 69 6f 6e 73 20 74 68 61 74 0a 2a 2a 20  nctions that.** 
1160: 20 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 73    can be used as
1170: 20 65 69 74 68 65 72 20 61 67 67 72 65 67 61 74   either aggregat
1180: 65 73 20 6f 72 20 77 69 6e 64 6f 77 20 66 75 6e  es or window fun
1190: 74 69 6f 6e 73 29 20 61 6c 6c 6f 77 73 20 74 68  tions) allows th
11a0: 65 6d 20 74 6f 0a 2a 2a 20 20 20 62 65 20 69 6d  em to.**   be im
11b0: 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20  plemented using 
11c0: 61 6e 20 41 50 49 2c 20 62 75 69 6c 74 2d 69 6e  an API, built-in
11d0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
11e0: 73 20 61 72 65 20 6d 75 63 68 20 6d 6f 72 65 0a  s are much more.
11f0: 2a 2a 20 20 20 65 73 6f 74 65 72 69 63 2e 20 41  **   esoteric. A
1200: 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 73 6f 6d  dditionally, som
1210: 65 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  e window functio
1220: 6e 73 20 28 65 2e 67 2e 20 6e 74 68 5f 76 61 6c  ns (e.g. nth_val
1230: 75 65 28 29 29 20 0a 2a 2a 20 20 20 6d 61 79 20  ue()) .**   may 
1240: 6f 6e 6c 79 20 62 65 20 69 6d 70 6c 65 6d 65 6e  only be implemen
1250: 74 65 64 20 62 79 20 63 61 63 68 69 6e 67 20 74  ted by caching t
1260: 68 65 20 65 6e 74 69 72 65 20 70 61 72 74 69 74  he entire partit
1270: 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a  ion in memory..*
1280: 2a 20 20 20 41 73 20 73 75 63 68 2c 20 73 6f 6d  *   As such, som
1290: 65 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  e built-in windo
12a0: 77 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 20  w functions use 
12b0: 74 68 65 20 73 61 6d 65 20 41 50 49 20 61 73 20  the same API as 
12c0: 61 67 67 72 65 67 61 74 65 0a 2a 2a 20 20 20 77  aggregate.**   w
12d0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
12e0: 61 6e 64 20 73 6f 6d 65 20 61 72 65 20 69 6d 70  and some are imp
12f0: 6c 65 6d 65 6e 74 65 64 20 64 69 72 65 63 74 6c  lemented directl
1300: 79 20 75 73 69 6e 67 20 56 44 42 45 20 0a 2a 2a  y using VDBE .**
1310: 20 20 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e     instructions.
1320: 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 66   Additionally, f
1330: 6f 72 20 74 68 6f 73 65 20 66 75 6e 63 74 69 6f  or those functio
1340: 6e 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20  ns that use the 
1350: 41 50 49 2c 20 74 68 65 0a 2a 2a 20 20 20 77 69  API, the.**   wi
1360: 6e 64 6f 77 20 66 72 61 6d 65 20 69 73 20 73 6f  ndow frame is so
1370: 6d 65 74 69 6d 65 73 20 6d 6f 64 69 66 69 65 64  metimes modified
1380: 20 62 65 66 6f 72 65 20 74 68 65 20 53 45 4c 45   before the SELE
1390: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a  CT statement is.
13a0: 2a 2a 20 20 20 72 65 77 72 69 74 74 65 6e 2e 20  **   rewritten. 
13b0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 72 65 67  For example, reg
13c0: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 73  ardless of the s
13d0: 70 65 63 69 66 69 65 64 20 77 69 6e 64 6f 77 20  pecified window 
13e0: 66 72 61 6d 65 2c 20 74 68 65 0a 2a 2a 20 20 20  frame, the.**   
13f0: 72 6f 77 5f 6e 75 6d 62 65 72 28 29 20 66 75 6e  row_number() fun
1400: 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 75 73 65  ction always use
1410: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 4f 57  s:.**.**     ROW
1420: 53 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e  S BETWEEN UNBOUN
1430: 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e  DED PRECEDING AN
1440: 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a  D CURRENT ROW.**
1450: 0a 2a 2a 20 20 20 53 65 65 20 73 71 6c 69 74 65  .**   See sqlite
1460: 33 57 69 6e 64 6f 77 55 70 64 61 74 65 28 29 20  3WindowUpdate() 
1470: 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  for details..**.
1480: 2a 2a 20 20 20 41 73 20 77 65 6c 6c 20 61 73 20  **   As well as 
1490: 73 6f 6d 65 20 6f 66 20 74 68 65 20 62 75 69 6c  some of the buil
14a0: 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63  t-in window func
14b0: 74 69 6f 6e 73 2c 20 61 67 67 72 65 67 61 74 65  tions, aggregate
14c0: 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20 66 75 6e   window.**   fun
14d0: 63 74 69 6f 6e 73 20 6d 69 6e 28 29 20 61 6e 64  ctions min() and
14e0: 20 6d 61 78 28 29 20 61 72 65 20 69 6d 70 6c 65   max() are imple
14f0: 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 56 44 42  mented using VDB
1500: 45 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 69  E instructions i
1510: 66 0a 2a 2a 20 20 20 74 68 65 20 73 74 61 72 74  f.**   the start
1520: 20 6f 66 20 74 68 65 20 77 69 6e 64 6f 77 20 66   of the window f
1530: 72 61 6d 65 20 69 73 20 64 65 63 6c 61 72 65 64  rame is declared
1540: 20 61 73 20 61 6e 79 74 68 69 6e 67 20 6f 74 68   as anything oth
1550: 65 72 20 74 68 61 6e 20 0a 2a 2a 20 20 20 55 4e  er than .**   UN
1560: 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e  BOUNDED PRECEDIN
1570: 47 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  G..*/../*.** Imp
1580: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 62  lementation of b
1590: 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66  uilt-in window f
15a0: 75 6e 63 74 69 6f 6e 20 72 6f 77 5f 6e 75 6d 62  unction row_numb
15b0: 65 72 28 29 2e 20 41 73 73 75 6d 65 73 20 74 68  er(). Assumes th
15c0: 61 74 20 74 68 65 0a 2a 2a 20 77 69 6e 64 6f 77  at the.** window
15d0: 20 66 72 61 6d 65 20 68 61 73 20 62 65 65 6e 20   frame has been 
15e0: 63 6f 65 72 63 65 64 20 74 6f 3a 0a 2a 2a 0a 2a  coerced to:.**.*
15f0: 2a 20 20 20 52 4f 57 53 20 42 45 54 57 45 45 4e  *   ROWS BETWEEN
1600: 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45   UNBOUNDED PRECE
1610: 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54  DING AND CURRENT
1620: 20 52 4f 57 0a 2a 2f 0a 73 74 61 74 69 63 20 76   ROW.*/.static v
1630: 6f 69 64 20 72 6f 77 5f 6e 75 6d 62 65 72 53 74  oid row_numberSt
1640: 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  epFunc(.  sqlite
1650: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
1660: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
1670: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
1680: 61 70 41 72 67 0a 29 7b 0a 20 20 69 36 34 20 2a  apArg.){.  i64 *
1690: 70 20 3d 20 28 69 36 34 2a 29 73 71 6c 69 74 65  p = (i64*)sqlite
16a0: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
16b0: 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66  ext(pCtx, sizeof
16c0: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29  (*p));.  if( p )
16d0: 20 28 2a 70 29 2b 2b 3b 0a 20 20 55 4e 55 53 45   (*p)++;.  UNUSE
16e0: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72 67  D_PARAMETER(nArg
16f0: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1700: 4d 45 54 45 52 28 61 70 41 72 67 29 3b 0a 7d 0a  METER(apArg);.}.
1710: 73 74 61 74 69 63 20 76 6f 69 64 20 72 6f 77 5f  static void row_
1720: 6e 75 6d 62 65 72 56 61 6c 75 65 46 75 6e 63 28  numberValueFunc(
1730: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1740: 2a 70 43 74 78 29 7b 0a 20 20 69 36 34 20 2a 70  *pCtx){.  i64 *p
1750: 20 3d 20 28 69 36 34 2a 29 73 71 6c 69 74 65 33   = (i64*)sqlite3
1760: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
1770: 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28  xt(pCtx, sizeof(
1780: 2a 70 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  *p));.  sqlite3_
1790: 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74  result_int64(pCt
17a0: 78 2c 20 28 70 20 3f 20 2a 70 20 3a 20 30 29 29  x, (p ? *p : 0))
17b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65  ;.}../*.** Conte
17c0: 78 74 20 6f 62 6a 65 63 74 20 74 79 70 65 20 75  xt object type u
17d0: 73 65 64 20 62 79 20 72 61 6e 6b 28 29 2c 20 64  sed by rank(), d
17e0: 65 6e 73 65 5f 72 61 6e 6b 28 29 2c 20 70 65 72  ense_rank(), per
17f0: 63 65 6e 74 5f 72 61 6e 6b 28 29 20 61 6e 64 0a  cent_rank() and.
1800: 2a 2a 20 63 75 6d 65 5f 64 69 73 74 28 29 2e 0a  ** cume_dist()..
1810: 2a 2f 0a 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  */.struct CallCo
1820: 75 6e 74 20 7b 0a 20 20 69 36 34 20 6e 56 61 6c  unt {.  i64 nVal
1830: 75 65 3b 0a 20 20 69 36 34 20 6e 53 74 65 70 3b  ue;.  i64 nStep;
1840: 0a 20 20 69 36 34 20 6e 54 6f 74 61 6c 3b 0a 7d  .  i64 nTotal;.}
1850: 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  ;../*.** Impleme
1860: 6e 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74  ntation of built
1870: 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  -in window funct
1880: 69 6f 6e 20 64 65 6e 73 65 5f 72 61 6e 6b 28 29  ion dense_rank()
1890: 2e 20 41 73 73 75 6d 65 73 20 74 68 61 74 0a 2a  . Assumes that.*
18a0: 2a 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61  * the window fra
18b0: 6d 65 20 68 61 73 20 62 65 65 6e 20 73 65 74 20  me has been set 
18c0: 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e 47  to:.**.**   RANG
18d0: 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e  E BETWEEN UNBOUN
18e0: 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e  DED PRECEDING AN
18f0: 44 20 43 55 52 52 45 4e 54 20 52 4f 57 20 0a 2a  D CURRENT ROW .*
1900: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65  /.static void de
1910: 6e 73 65 5f 72 61 6e 6b 53 74 65 70 46 75 6e 63  nse_rankStepFunc
1920: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
1930: 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e  ext *pCtx, .  in
1940: 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65  t nArg,.  sqlite
1950: 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a  3_value **apArg.
1960: 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61 6c 6c  ){.  struct Call
1970: 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70 20 3d 20  Count *p;.  p = 
1980: 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e  (struct CallCoun
1990: 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65  t*)sqlite3_aggre
19a0: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74  gate_context(pCt
19b0: 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  x, sizeof(*p));.
19c0: 20 20 69 66 28 20 70 20 29 20 70 2d 3e 6e 53 74    if( p ) p->nSt
19d0: 65 70 20 3d 20 31 3b 0a 20 20 55 4e 55 53 45 44  ep = 1;.  UNUSED
19e0: 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72 67 29  _PARAMETER(nArg)
19f0: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1a00: 45 54 45 52 28 61 70 41 72 67 29 3b 0a 7d 0a 73  ETER(apArg);.}.s
1a10: 74 61 74 69 63 20 76 6f 69 64 20 64 65 6e 73 65  tatic void dense
1a20: 5f 72 61 6e 6b 56 61 6c 75 65 46 75 6e 63 28 73  _rankValueFunc(s
1a30: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1a40: 70 43 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20  pCtx){.  struct 
1a50: 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20  CallCount *p;.  
1a60: 70 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c  p = (struct Call
1a70: 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61  Count*)sqlite3_a
1a80: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
1a90: 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70  (pCtx, sizeof(*p
1aa0: 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ));.  if( p ){. 
1ab0: 20 20 20 69 66 28 20 70 2d 3e 6e 53 74 65 70 20     if( p->nStep 
1ac0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61 6c  ){.      p->nVal
1ad0: 75 65 2b 2b 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  ue++;.      p->n
1ae0: 53 74 65 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Step = 0;.    }.
1af0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
1b00: 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 70  lt_int64(pCtx, p
1b10: 2d 3e 6e 56 61 6c 75 65 29 3b 0a 20 20 7d 0a 7d  ->nValue);.  }.}
1b20: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
1b30: 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74 2d  tation of built-
1b40: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
1b50: 6f 6e 20 72 61 6e 6b 28 29 2e 20 41 73 73 75 6d  on rank(). Assum
1b60: 65 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 77  es that.** the w
1b70: 69 6e 64 6f 77 20 66 72 61 6d 65 20 68 61 73 20  indow frame has 
1b80: 62 65 65 6e 20 73 65 74 20 74 6f 3a 0a 2a 2a 0a  been set to:.**.
1b90: 2a 2a 20 20 20 52 41 4e 47 45 20 42 45 54 57 45  **   RANGE BETWE
1ba0: 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  EN UNBOUNDED PRE
1bb0: 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45  CEDING AND CURRE
1bc0: 4e 54 20 52 4f 57 20 0a 2a 2f 0a 73 74 61 74 69  NT ROW .*/.stati
1bd0: 63 20 76 6f 69 64 20 72 61 6e 6b 53 74 65 70 46  c void rankStepF
1be0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
1bf0: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
1c00: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
1c10: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41  ite3_value **apA
1c20: 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 43  rg.){.  struct C
1c30: 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70  allCount *p;.  p
1c40: 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43   = (struct CallC
1c50: 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67  ount*)sqlite3_ag
1c60: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
1c70: 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29  pCtx, sizeof(*p)
1c80: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
1c90: 20 20 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 20 20    p->nStep++;.  
1ca0: 20 20 69 66 28 20 70 2d 3e 6e 56 61 6c 75 65 3d    if( p->nValue=
1cb0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  =0 ){.      p->n
1cc0: 56 61 6c 75 65 20 3d 20 70 2d 3e 6e 53 74 65 70  Value = p->nStep
1cd0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 55 4e  ;.    }.  }.  UN
1ce0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
1cf0: 41 72 67 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  Arg);.  UNUSED_P
1d00: 41 52 41 4d 45 54 45 52 28 61 70 41 72 67 29 3b  ARAMETER(apArg);
1d10: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  .}.static void r
1d20: 61 6e 6b 56 61 6c 75 65 46 75 6e 63 28 73 71 6c  ankValueFunc(sql
1d30: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
1d40: 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61  tx){.  struct Ca
1d50: 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70 20  llCount *p;.  p 
1d60: 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  = (struct CallCo
1d70: 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67  unt*)sqlite3_agg
1d80: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70  regate_context(p
1d90: 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  Ctx, sizeof(*p))
1da0: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
1db0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1dc0: 69 6e 74 36 34 28 70 43 74 78 2c 20 70 2d 3e 6e  int64(pCtx, p->n
1dd0: 56 61 6c 75 65 29 3b 0a 20 20 20 20 70 2d 3e 6e  Value);.    p->n
1de0: 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d  Value = 0;.  }.}
1df0: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
1e00: 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74 2d  tation of built-
1e10: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
1e20: 6f 6e 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b 28  on percent_rank(
1e30: 29 2e 20 41 73 73 75 6d 65 73 20 74 68 61 74 0a  ). Assumes that.
1e40: 2a 2a 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72  ** the window fr
1e50: 61 6d 65 20 68 61 73 20 62 65 65 6e 20 73 65 74  ame has been set
1e60: 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e   to:.**.**   RAN
1e70: 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55  GE BETWEEN UNBOU
1e80: 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41  NDED PRECEDING A
1e90: 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 20 0a  ND CURRENT ROW .
1ea0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
1eb0: 65 72 63 65 6e 74 5f 72 61 6e 6b 53 74 65 70 46  ercent_rankStepF
1ec0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
1ed0: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
1ee0: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
1ef0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41  ite3_value **apA
1f00: 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 43  rg.){.  struct C
1f10: 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 55  allCount *p;.  U
1f20: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1f30: 6e 41 72 67 29 3b 20 61 73 73 65 72 74 28 20 6e  nArg); assert( n
1f40: 41 72 67 3d 3d 31 20 29 3b 0a 0a 20 20 70 20 3d  Arg==1 );..  p =
1f50: 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75   (struct CallCou
1f60: 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72  nt*)sqlite3_aggr
1f70: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43  egate_context(pC
1f80: 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b  tx, sizeof(*p));
1f90: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
1fa0: 69 66 28 20 70 2d 3e 6e 54 6f 74 61 6c 3d 3d 30  if( p->nTotal==0
1fb0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 54 6f   ){.      p->nTo
1fc0: 74 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  tal = sqlite3_va
1fd0: 6c 75 65 5f 69 6e 74 36 34 28 61 70 41 72 67 5b  lue_int64(apArg[
1fe0: 30 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  0]);.    }.    p
1ff0: 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 20 20 20 20 69  ->nStep++;.    i
2000: 66 28 20 70 2d 3e 6e 56 61 6c 75 65 3d 3d 30 20  f( p->nValue==0 
2010: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61 6c  ){.      p->nVal
2020: 75 65 20 3d 20 70 2d 3e 6e 53 74 65 70 3b 0a 20  ue = p->nStep;. 
2030: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69     }.  }.}.stati
2040: 63 20 76 6f 69 64 20 70 65 72 63 65 6e 74 5f 72  c void percent_r
2050: 61 6e 6b 56 61 6c 75 65 46 75 6e 63 28 73 71 6c  ankValueFunc(sql
2060: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
2070: 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61  tx){.  struct Ca
2080: 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70 20  llCount *p;.  p 
2090: 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  = (struct CallCo
20a0: 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67  unt*)sqlite3_agg
20b0: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70  regate_context(p
20c0: 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  Ctx, sizeof(*p))
20d0: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
20e0: 20 69 66 28 20 70 2d 3e 6e 54 6f 74 61 6c 3e 31   if( p->nTotal>1
20f0: 20 29 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65   ){.      double
2100: 20 72 20 3d 20 28 64 6f 75 62 6c 65 29 28 70 2d   r = (double)(p-
2110: 3e 6e 56 61 6c 75 65 2d 31 29 20 2f 20 28 64 6f  >nValue-1) / (do
2120: 75 62 6c 65 29 28 70 2d 3e 6e 54 6f 74 61 6c 2d  uble)(p->nTotal-
2130: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
2140: 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28  3_result_double(
2150: 70 43 74 78 2c 20 72 29 3b 0a 20 20 20 20 7d 65  pCtx, r);.    }e
2160: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
2170: 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65  e3_result_double
2180: 28 70 43 74 78 2c 20 30 2e 30 29 3b 0a 20 20 20  (pCtx, 0.0);.   
2190: 20 7d 0a 20 20 20 20 70 2d 3e 6e 56 61 6c 75 65   }.    p->nValue
21a0: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
21b0: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
21c0: 6e 20 6f 66 20 62 75 69 6c 74 2d 69 6e 20 77 69  n of built-in wi
21d0: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 63 75  ndow function cu
21e0: 6d 65 5f 64 69 73 74 28 29 2e 20 41 73 73 75 6d  me_dist(). Assum
21f0: 65 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 77  es that.** the w
2200: 69 6e 64 6f 77 20 66 72 61 6d 65 20 68 61 73 20  indow frame has 
2210: 62 65 65 6e 20 73 65 74 20 74 6f 3a 0a 2a 2a 0a  been set to:.**.
2220: 2a 2a 20 20 20 52 41 4e 47 45 20 42 45 54 57 45  **   RANGE BETWE
2230: 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  EN UNBOUNDED PRE
2240: 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45  CEDING AND CURRE
2250: 4e 54 20 52 4f 57 20 0a 2a 2f 0a 73 74 61 74 69  NT ROW .*/.stati
2260: 63 20 76 6f 69 64 20 63 75 6d 65 5f 64 69 73 74  c void cume_dist
2270: 53 74 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69  StepFunc(.  sqli
2280: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
2290: 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  x, .  int nArg,.
22a0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
22b0: 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72  **apArg.){.  str
22c0: 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 20 2a 70  uct CallCount *p
22d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 41 72 67  ;.  assert( nArg
22e0: 3d 3d 31 20 29 3b 20 55 4e 55 53 45 44 5f 50 41  ==1 ); UNUSED_PA
22f0: 52 41 4d 45 54 45 52 28 6e 41 72 67 29 3b 0a 0a  RAMETER(nArg);..
2300: 20 20 70 20 3d 20 28 73 74 72 75 63 74 20 43 61    p = (struct Ca
2310: 6c 6c 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33  llCount*)sqlite3
2320: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
2330: 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28  xt(pCtx, sizeof(
2340: 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b  *p));.  if( p ){
2350: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 54 6f 74  .    if( p->nTot
2360: 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  al==0 ){.      p
2370: 2d 3e 6e 54 6f 74 61 6c 20 3d 20 73 71 6c 69 74  ->nTotal = sqlit
2380: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61  e3_value_int64(a
2390: 70 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 7d 0a  pArg[0]);.    }.
23a0: 20 20 20 20 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a      p->nStep++;.
23b0: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
23c0: 64 20 63 75 6d 65 5f 64 69 73 74 56 61 6c 75 65  d cume_distValue
23d0: 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Func(sqlite3_con
23e0: 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20 20 73  text *pCtx){.  s
23f0: 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 20  truct CallCount 
2400: 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63  *p;.  p = (struc
2410: 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29 73 71 6c  t CallCount*)sql
2420: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
2430: 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a  ontext(pCtx, siz
2440: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20  eof(*p));.  if( 
2450: 70 20 26 26 20 70 2d 3e 6e 54 6f 74 61 6c 20 29  p && p->nTotal )
2460: 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d  {.    double r =
2470: 20 28 64 6f 75 62 6c 65 29 28 70 2d 3e 6e 53 74   (double)(p->nSt
2480: 65 70 29 20 2f 20 28 64 6f 75 62 6c 65 29 28 70  ep) / (double)(p
2490: 2d 3e 6e 54 6f 74 61 6c 29 3b 0a 20 20 20 20 73  ->nTotal);.    s
24a0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f  qlite3_result_do
24b0: 75 62 6c 65 28 70 43 74 78 2c 20 72 29 3b 0a 20  uble(pCtx, r);. 
24c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74   }.}../*.** Cont
24d0: 65 78 74 20 6f 62 6a 65 63 74 20 66 6f 72 20 6e  ext object for n
24e0: 74 69 6c 65 28 29 20 77 69 6e 64 6f 77 20 66 75  tile() window fu
24f0: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 72 75 63  nction..*/.struc
2500: 74 20 4e 74 69 6c 65 43 74 78 20 7b 0a 20 20 69  t NtileCtx {.  i
2510: 36 34 20 6e 54 6f 74 61 6c 3b 20 20 20 20 20 20  64 nTotal;      
2520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2530: 2a 20 54 6f 74 61 6c 20 72 6f 77 73 20 69 6e 20  * Total rows in 
2540: 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 20 20 69  partition */.  i
2550: 36 34 20 6e 50 61 72 61 6d 3b 20 20 20 20 20 20  64 nParam;      
2560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2570: 2a 20 50 61 72 61 6d 65 74 65 72 20 70 61 73 73  * Parameter pass
2580: 65 64 20 74 6f 20 6e 74 69 6c 65 28 4e 29 20 2a  ed to ntile(N) *
2590: 2f 0a 20 20 69 36 34 20 69 52 6f 77 3b 20 20 20  /.  i64 iRow;   
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72      /* Current r
25c0: 6f 77 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ow */.};../*.** 
25d0: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
25e0: 66 20 6e 74 69 6c 65 28 29 2e 20 54 68 69 73 20  f ntile(). This 
25f0: 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65  assumes that the
2600: 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 20 68 61   window frame ha
2610: 73 0a 2a 2a 20 62 65 65 6e 20 63 6f 65 72 63 65  s.** been coerce
2620: 64 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 4f  d to:.**.**   RO
2630: 57 53 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  WS UNBOUNDED PRE
2640: 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45  CEDING AND CURRE
2650: 4e 54 20 52 4f 57 0a 2a 2f 0a 73 74 61 74 69 63  NT ROW.*/.static
2660: 20 76 6f 69 64 20 6e 74 69 6c 65 53 74 65 70 46   void ntileStepF
2670: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
2680: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
2690: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
26a0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41  ite3_value **apA
26b0: 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 4e  rg.){.  struct N
26c0: 74 69 6c 65 43 74 78 20 2a 70 3b 0a 20 20 61 73  tileCtx *p;.  as
26d0: 73 65 72 74 28 20 6e 41 72 67 3d 3d 32 20 29 3b  sert( nArg==2 );
26e0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
26f0: 52 28 6e 41 72 67 29 3b 0a 20 20 70 20 3d 20 28  R(nArg);.  p = (
2700: 73 74 72 75 63 74 20 4e 74 69 6c 65 43 74 78 2a  struct NtileCtx*
2710: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
2720: 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c  te_context(pCtx,
2730: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
2740: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  if( p ){.    if(
2750: 20 70 2d 3e 6e 54 6f 74 61 6c 3d 3d 30 20 29 7b   p->nTotal==0 ){
2760: 0a 20 20 20 20 20 20 70 2d 3e 6e 50 61 72 61 6d  .      p->nParam
2770: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
2780: 5f 69 6e 74 36 34 28 61 70 41 72 67 5b 30 5d 29  _int64(apArg[0])
2790: 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 54 6f 74 61  ;.      p->nTota
27a0: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  l = sqlite3_valu
27b0: 65 5f 69 6e 74 36 34 28 61 70 41 72 67 5b 31 5d  e_int64(apArg[1]
27c0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
27d0: 6e 50 61 72 61 6d 3c 3d 30 20 29 7b 0a 20 20 20  nParam<=0 ){.   
27e0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
27f0: 75 6c 74 5f 65 72 72 6f 72 28 0a 20 20 20 20 20  ult_error(.     
2800: 20 20 20 20 20 20 20 70 43 74 78 2c 20 22 61 72         pCtx, "ar
2810: 67 75 6d 65 6e 74 20 6f 66 20 6e 74 69 6c 65 20  gument of ntile 
2820: 6d 75 73 74 20 62 65 20 61 20 70 6f 73 69 74 69  must be a positi
2830: 76 65 20 69 6e 74 65 67 65 72 22 2c 20 2d 31 0a  ve integer", -1.
2840: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
2850: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e   }.    }.    p->
2860: 69 52 6f 77 2b 2b 3b 0a 20 20 7d 0a 7d 0a 73 74  iRow++;.  }.}.st
2870: 61 74 69 63 20 76 6f 69 64 20 6e 74 69 6c 65 56  atic void ntileV
2880: 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33  alueFunc(sqlite3
2890: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b  _context *pCtx){
28a0: 0a 20 20 73 74 72 75 63 74 20 4e 74 69 6c 65 43  .  struct NtileC
28b0: 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74  tx *p;.  p = (st
28c0: 72 75 63 74 20 4e 74 69 6c 65 43 74 78 2a 29 73  ruct NtileCtx*)s
28d0: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
28e0: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
28f0: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
2900: 28 20 70 20 26 26 20 70 2d 3e 6e 50 61 72 61 6d  ( p && p->nParam
2910: 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53  >0 ){.    int nS
2920: 69 7a 65 20 3d 20 28 70 2d 3e 6e 54 6f 74 61 6c  ize = (p->nTotal
2930: 20 2f 20 70 2d 3e 6e 50 61 72 61 6d 29 3b 0a 20   / p->nParam);. 
2940: 20 20 20 69 66 28 20 6e 53 69 7a 65 3d 3d 30 20     if( nSize==0 
2950: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2960: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43  _result_int64(pC
2970: 74 78 2c 20 70 2d 3e 69 52 6f 77 29 3b 0a 20 20  tx, p->iRow);.  
2980: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
2990: 36 34 20 6e 4c 61 72 67 65 20 3d 20 70 2d 3e 6e  64 nLarge = p->n
29a0: 54 6f 74 61 6c 20 2d 20 70 2d 3e 6e 50 61 72 61  Total - p->nPara
29b0: 6d 2a 6e 53 69 7a 65 3b 0a 20 20 20 20 20 20 69  m*nSize;.      i
29c0: 36 34 20 69 53 6d 61 6c 6c 20 3d 20 6e 4c 61 72  64 iSmall = nLar
29d0: 67 65 2a 28 6e 53 69 7a 65 2b 31 29 3b 0a 20 20  ge*(nSize+1);.  
29e0: 20 20 20 20 69 36 34 20 69 52 6f 77 20 3d 20 70      i64 iRow = p
29f0: 2d 3e 69 52 6f 77 2d 31 3b 0a 0a 20 20 20 20 20  ->iRow-1;..     
2a00: 20 61 73 73 65 72 74 28 20 28 6e 4c 61 72 67 65   assert( (nLarge
2a10: 2a 28 6e 53 69 7a 65 2b 31 29 20 2b 20 28 70 2d  *(nSize+1) + (p-
2a20: 3e 6e 50 61 72 61 6d 2d 6e 4c 61 72 67 65 29 2a  >nParam-nLarge)*
2a30: 6e 53 69 7a 65 29 3d 3d 70 2d 3e 6e 54 6f 74 61  nSize)==p->nTota
2a40: 6c 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  l );..      if( 
2a50: 69 52 6f 77 3c 69 53 6d 61 6c 6c 20 29 7b 0a 20  iRow<iSmall ){. 
2a60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
2a70: 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78  esult_int64(pCtx
2a80: 2c 20 31 20 2b 20 69 52 6f 77 2f 28 6e 53 69 7a  , 1 + iRow/(nSiz
2a90: 65 2b 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  e+1));.      }el
2aa0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
2ab0: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
2ac0: 28 70 43 74 78 2c 20 31 20 2b 20 6e 4c 61 72 67  (pCtx, 1 + nLarg
2ad0: 65 20 2b 20 28 69 52 6f 77 2d 69 53 6d 61 6c 6c  e + (iRow-iSmall
2ae0: 29 2f 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  )/nSize);.      
2af0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
2b00: 2a 0a 2a 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a  *.** Context obj
2b10: 65 63 74 20 66 6f 72 20 6c 61 73 74 5f 76 61 6c  ect for last_val
2b20: 75 65 28 29 20 77 69 6e 64 6f 77 20 66 75 6e 63  ue() window func
2b30: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  tion..*/.struct 
2b40: 4c 61 73 74 56 61 6c 75 65 43 74 78 20 7b 0a 20  LastValueCtx {. 
2b50: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
2b60: 70 56 61 6c 3b 0a 20 20 69 6e 74 20 6e 56 61 6c  pVal;.  int nVal
2b70: 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  ;.};../*.** Impl
2b80: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6c 61  ementation of la
2b90: 73 74 5f 76 61 6c 75 65 28 29 2e 0a 2a 2f 0a 73  st_value()..*/.s
2ba0: 74 61 74 69 63 20 76 6f 69 64 20 6c 61 73 74 5f  tatic void last_
2bb0: 76 61 6c 75 65 53 74 65 70 46 75 6e 63 28 0a 20  valueStepFunc(. 
2bc0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
2bd0: 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
2be0: 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
2bf0: 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a  alue **apArg.){.
2c00: 20 20 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c    struct LastVal
2c10: 75 65 43 74 78 20 2a 70 3b 0a 20 20 55 4e 55 53  ueCtx *p;.  UNUS
2c20: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72  ED_PARAMETER(nAr
2c30: 67 29 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63  g);.  p = (struc
2c40: 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 2a 29  t LastValueCtx*)
2c50: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
2c60: 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20  e_context(pCtx, 
2c70: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69  sizeof(*p));.  i
2c80: 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( p ){.    sqli
2c90: 74 65 33 5f 76 61 6c 75 65 5f 66 72 65 65 28 70  te3_value_free(p
2ca0: 2d 3e 70 56 61 6c 29 3b 0a 20 20 20 20 70 2d 3e  ->pVal);.    p->
2cb0: 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76  pVal = sqlite3_v
2cc0: 61 6c 75 65 5f 64 75 70 28 61 70 41 72 67 5b 30  alue_dup(apArg[0
2cd0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  ]);.    if( p->p
2ce0: 56 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Val==0 ){.      
2cf0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
2d00: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29  rror_nomem(pCtx)
2d10: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2d20: 20 20 20 70 2d 3e 6e 56 61 6c 2b 2b 3b 0a 20 20     p->nVal++;.  
2d30: 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63    }.  }.}.static
2d40: 20 76 6f 69 64 20 6c 61 73 74 5f 76 61 6c 75 65   void last_value
2d50: 49 6e 76 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  InvFunc(.  sqlit
2d60: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
2d70: 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  , .  int nArg,. 
2d80: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
2d90: 2a 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72 75  *apArg.){.  stru
2da0: 63 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 20  ct LastValueCtx 
2db0: 2a 70 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  *p;.  UNUSED_PAR
2dc0: 41 4d 45 54 45 52 28 6e 41 72 67 29 3b 0a 20 20  AMETER(nArg);.  
2dd0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2de0: 28 61 70 41 72 67 29 3b 0a 20 20 70 20 3d 20 28  (apArg);.  p = (
2df0: 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75 65  struct LastValue
2e00: 43 74 78 2a 29 73 71 6c 69 74 65 33 5f 61 67 67  Ctx*)sqlite3_agg
2e10: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70  regate_context(p
2e20: 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  Ctx, sizeof(*p))
2e30: 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
2e40: 29 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 6c  ) ){.    p->nVal
2e50: 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  --;.    if( p->n
2e60: 56 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Val==0 ){.      
2e70: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 66 72  sqlite3_value_fr
2e80: 65 65 28 70 2d 3e 70 56 61 6c 29 3b 0a 20 20 20  ee(p->pVal);.   
2e90: 20 20 20 70 2d 3e 70 56 61 6c 20 3d 20 30 3b 0a     p->pVal = 0;.
2ea0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74      }.  }.}.stat
2eb0: 69 63 20 76 6f 69 64 20 6c 61 73 74 5f 76 61 6c  ic void last_val
2ec0: 75 65 56 61 6c 75 65 46 75 6e 63 28 73 71 6c 69  ueValueFunc(sqli
2ed0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
2ee0: 78 29 7b 0a 20 20 73 74 72 75 63 74 20 4c 61 73  x){.  struct Las
2ef0: 74 56 61 6c 75 65 43 74 78 20 2a 70 3b 0a 20 20  tValueCtx *p;.  
2f00: 70 20 3d 20 28 73 74 72 75 63 74 20 4c 61 73 74  p = (struct Last
2f10: 56 61 6c 75 65 43 74 78 2a 29 73 71 6c 69 74 65  ValueCtx*)sqlite
2f20: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
2f30: 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66  ext(pCtx, sizeof
2f40: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 26  (*p));.  if( p &
2f50: 26 20 70 2d 3e 70 56 61 6c 20 29 7b 0a 20 20 20  & p->pVal ){.   
2f60: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2f70: 76 61 6c 75 65 28 70 43 74 78 2c 20 70 2d 3e 70  value(pCtx, p->p
2f80: 56 61 6c 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  Val);.  }.}.stat
2f90: 69 63 20 76 6f 69 64 20 6c 61 73 74 5f 76 61 6c  ic void last_val
2fa0: 75 65 46 69 6e 61 6c 69 7a 65 46 75 6e 63 28 73  ueFinalizeFunc(s
2fb0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
2fc0: 70 43 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20  pCtx){.  struct 
2fd0: 4c 61 73 74 56 61 6c 75 65 43 74 78 20 2a 70 3b  LastValueCtx *p;
2fe0: 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74 20 4c  .  p = (struct L
2ff0: 61 73 74 56 61 6c 75 65 43 74 78 2a 29 73 71 6c  astValueCtx*)sql
3000: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
3010: 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a  ontext(pCtx, siz
3020: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20  eof(*p));.  if( 
3030: 70 20 26 26 20 70 2d 3e 70 56 61 6c 20 29 7b 0a  p && p->pVal ){.
3040: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
3050: 6c 74 5f 76 61 6c 75 65 28 70 43 74 78 2c 20 70  lt_value(pCtx, p
3060: 2d 3e 70 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c  ->pVal);.    sql
3070: 69 74 65 33 5f 76 61 6c 75 65 5f 66 72 65 65 28  ite3_value_free(
3080: 70 2d 3e 70 56 61 6c 29 3b 0a 20 20 20 20 70 2d  p->pVal);.    p-
3090: 3e 70 56 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 7d  >pVal = 0;.  }.}
30a0: 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 74 69 63 20 6e  ../*.** Static n
30b0: 61 6d 65 73 20 66 6f 72 20 74 68 65 20 62 75 69  ames for the bui
30c0: 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e  lt-in window fun
30d0: 63 74 69 6f 6e 20 6e 61 6d 65 73 2e 20 20 54 68  ction names.  Th
30e0: 65 73 65 20 73 74 61 74 69 63 0a 2a 2a 20 6e 61  ese static.** na
30f0: 6d 65 73 20 61 72 65 20 75 73 65 64 2c 20 72 61  mes are used, ra
3100: 74 68 65 72 20 74 68 61 6e 20 73 74 72 69 6e 67  ther than string
3110: 20 6c 69 74 65 72 61 6c 73 2c 20 73 6f 20 74 68   literals, so th
3120: 61 74 20 46 75 6e 63 44 65 66 20 6f 62 6a 65 63  at FuncDef objec
3130: 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 61 73 73  ts.** can be ass
3140: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 70  ociated with a p
3150: 61 72 74 69 63 75 6c 61 72 20 77 69 6e 64 6f 77  articular window
3160: 20 66 75 6e 63 74 69 6f 6e 20 62 79 20 64 69 72   function by dir
3170: 65 63 74 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f  ect.** compariso
3180: 6e 20 6f 66 20 74 68 65 20 7a 4e 61 6d 65 20 70  n of the zName p
3190: 6f 69 6e 74 65 72 2e 20 20 45 78 61 6d 70 6c 65  ointer.  Example
31a0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 66  :.**.**       if
31b0: 28 20 70 46 75 6e 63 44 65 66 2d 3e 7a 4e 61 6d  ( pFuncDef->zNam
31c0: 65 3d 3d 72 6f 77 5f 76 61 6c 75 65 4e 61 6d 65  e==row_valueName
31d0: 20 29 7b 20 2e 2e 2e 20 7d 0a 2a 2f 0a 73 74 61   ){ ... }.*/.sta
31e0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 72  tic const char r
31f0: 6f 77 5f 6e 75 6d 62 65 72 4e 61 6d 65 5b 5d 20  ow_numberName[] 
3200: 3d 20 20 20 22 72 6f 77 5f 6e 75 6d 62 65 72 22  =   "row_number"
3210: 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  ;.static const c
3220: 68 61 72 20 64 65 6e 73 65 5f 72 61 6e 6b 4e 61  har dense_rankNa
3230: 6d 65 5b 5d 20 3d 20 20 20 22 64 65 6e 73 65 5f  me[] =   "dense_
3240: 72 61 6e 6b 22 3b 0a 73 74 61 74 69 63 20 63 6f  rank";.static co
3250: 6e 73 74 20 63 68 61 72 20 72 61 6e 6b 4e 61 6d  nst char rankNam
3260: 65 5b 5d 20 3d 20 20 20 20 20 20 20 20 20 22 72  e[] =         "r
3270: 61 6e 6b 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e  ank";.static con
3280: 73 74 20 63 68 61 72 20 70 65 72 63 65 6e 74 5f  st char percent_
3290: 72 61 6e 6b 4e 61 6d 65 5b 5d 20 3d 20 22 70 65  rankName[] = "pe
32a0: 72 63 65 6e 74 5f 72 61 6e 6b 22 3b 0a 73 74 61  rcent_rank";.sta
32b0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 63  tic const char c
32c0: 75 6d 65 5f 64 69 73 74 4e 61 6d 65 5b 5d 20 3d  ume_distName[] =
32d0: 20 20 20 20 22 63 75 6d 65 5f 64 69 73 74 22 3b      "cume_dist";
32e0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
32f0: 61 72 20 6e 74 69 6c 65 4e 61 6d 65 5b 5d 20 3d  ar ntileName[] =
3300: 20 20 20 20 20 20 20 20 22 6e 74 69 6c 65 22 3b          "ntile";
3310: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
3320: 61 72 20 6c 61 73 74 5f 76 61 6c 75 65 4e 61 6d  ar last_valueNam
3330: 65 5b 5d 20 3d 20 20 20 22 6c 61 73 74 5f 76 61  e[] =   "last_va
3340: 6c 75 65 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e  lue";.static con
3350: 73 74 20 63 68 61 72 20 6e 74 68 5f 76 61 6c 75  st char nth_valu
3360: 65 4e 61 6d 65 5b 5d 20 3d 20 20 20 20 22 6e 74  eName[] =    "nt
3370: 68 5f 76 61 6c 75 65 22 3b 0a 73 74 61 74 69 63  h_value";.static
3380: 20 63 6f 6e 73 74 20 63 68 61 72 20 66 69 72 73   const char firs
3390: 74 5f 76 61 6c 75 65 4e 61 6d 65 5b 5d 20 3d 20  t_valueName[] = 
33a0: 20 22 66 69 72 73 74 5f 76 61 6c 75 65 22 3b 0a   "first_value";.
33b0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
33c0: 72 20 6c 65 61 64 4e 61 6d 65 5b 5d 20 3d 20 20  r leadName[] =  
33d0: 20 20 20 20 20 20 20 22 6c 65 61 64 22 3b 0a 73         "lead";.s
33e0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
33f0: 20 6c 61 67 4e 61 6d 65 5b 5d 20 3d 20 20 20 20   lagName[] =    
3400: 20 20 20 20 20 20 22 6c 61 67 22 3b 0a 0a 2f 2a        "lag";../*
3410: 0a 2a 2a 20 4e 6f 2d 6f 70 20 69 6d 70 6c 65 6d  .** No-op implem
3420: 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 78 53 74  entations of xSt
3430: 65 70 28 29 20 61 6e 64 20 78 46 69 6e 61 6c 69  ep() and xFinali
3440: 7a 65 28 29 2e 20 20 55 73 65 64 20 61 73 20 70  ze().  Used as p
3450: 6c 61 63 65 2d 68 6f 6c 64 65 72 73 0a 2a 2a 20  lace-holders.** 
3460: 66 6f 72 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e  for built-in win
3470: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  dow functions th
3480: 61 74 20 6e 65 76 65 72 20 63 61 6c 6c 20 74 68  at never call th
3490: 6f 73 65 20 69 6e 74 65 72 66 61 63 65 73 2e 0a  ose interfaces..
34a0: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 6f 6f 70 56 61  **.** The noopVa
34b0: 6c 75 65 46 75 6e 63 28 29 20 69 73 20 63 61 6c  lueFunc() is cal
34c0: 6c 65 64 20 62 75 74 20 69 73 20 65 78 70 65 63  led but is expec
34d0: 74 65 64 20 74 6f 20 64 6f 20 6e 6f 74 68 69 6e  ted to do nothin
34e0: 67 2e 20 20 54 68 65 0a 2a 2a 20 6e 6f 6f 70 53  g.  The.** noopS
34f0: 74 65 70 46 75 6e 63 28 29 20 69 73 20 6e 65 76  tepFunc() is nev
3500: 65 72 20 63 61 6c 6c 65 64 2c 20 61 6e 64 20 73  er called, and s
3510: 6f 20 69 74 20 69 73 20 6d 61 72 6b 65 64 20 77  o it is marked w
3520: 69 74 68 20 4e 4f 5f 54 45 53 54 20 74 6f 0a 2a  ith NO_TEST to.*
3530: 2a 20 6c 65 74 20 74 68 65 20 74 65 73 74 20 63  * let the test c
3540: 6f 76 65 72 61 67 65 20 72 6f 75 74 69 6e 65 20  overage routine 
3550: 6b 6e 6f 77 20 6e 6f 74 20 74 6f 20 65 78 70 65  know not to expe
3560: 63 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ct this function
3570: 20 74 6f 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65   to be.** invoke
3580: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
3590: 64 20 6e 6f 6f 70 53 74 65 70 46 75 6e 63 28 20  d noopStepFunc( 
35a0: 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20     /*NO_TEST*/. 
35b0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
35c0: 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 4e 4f   *p,        /*NO
35d0: 5f 54 45 53 54 2a 2f 0a 20 20 69 6e 74 20 6e 2c  _TEST*/.  int n,
35e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35f0: 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f       /*NO_TEST*/
3600: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
3610: 20 2a 2a 61 20 20 20 20 20 20 20 20 20 20 2f 2a   **a          /*
3620: 4e 4f 5f 54 45 53 54 2a 2f 0a 29 7b 20 20 20 20  NO_TEST*/.){    
3630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3640: 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54         /*NO_TEST
3650: 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  */.  UNUSED_PARA
3660: 4d 45 54 45 52 28 70 29 3b 20 20 20 20 20 20 20  METER(p);       
3670: 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 55 4e  /*NO_TEST*/.  UN
3680: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
3690: 29 3b 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45  );       /*NO_TE
36a0: 53 54 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41  ST*/.  UNUSED_PA
36b0: 52 41 4d 45 54 45 52 28 61 29 3b 20 20 20 20 20  RAMETER(a);     
36c0: 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20    /*NO_TEST*/.  
36d0: 61 73 73 65 72 74 28 30 29 3b 20 20 20 20 20 20  assert(0);      
36e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f             /*NO_
36f0: 54 45 53 54 2a 2f 0a 7d 20 20 20 20 20 20 20 20  TEST*/.}        
3700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3710: 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a      /*NO_TEST*/.
3720: 73 74 61 74 69 63 20 76 6f 69 64 20 6e 6f 6f 70  static void noop
3730: 56 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74 65  ValueFunc(sqlite
3740: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 29 7b 20 55  3_context *p){ U
3750: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
3760: 70 29 3b 20 2f 2a 6e 6f 2d 6f 70 2a 2f 20 7d 0a  p); /*no-op*/ }.
3770: 0a 2f 2a 20 57 69 6e 64 6f 77 20 66 75 6e 63 74  ./* Window funct
3780: 69 6f 6e 73 20 74 68 61 74 20 75 73 65 20 61 6c  ions that use al
3790: 6c 20 77 69 6e 64 6f 77 20 69 6e 74 65 72 66 61  l window interfa
37a0: 63 65 73 3a 20 78 53 74 65 70 2c 20 78 46 69 6e  ces: xStep, xFin
37b0: 61 6c 2c 0a 2a 2a 20 78 56 61 6c 75 65 2c 20 61  al,.** xValue, a
37c0: 6e 64 20 78 49 6e 76 65 72 73 65 20 2a 2f 0a 23  nd xInverse */.#
37d0: 64 65 66 69 6e 65 20 57 49 4e 44 4f 57 46 55 4e  define WINDOWFUN
37e0: 43 41 4c 4c 28 6e 61 6d 65 2c 6e 41 72 67 2c 65  CALL(name,nArg,e
37f0: 78 74 72 61 29 20 7b 20 20 20 20 20 20 20 20 20  xtra) {         
3800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3810: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6e 41            \.  nA
3820: 72 67 2c 20 28 53 51 4c 49 54 45 5f 55 54 46 38  rg, (SQLITE_UTF8
3830: 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e  |SQLITE_FUNC_WIN
3840: 44 4f 57 7c 65 78 74 72 61 29 2c 20 30 2c 20 30  DOW|extra), 0, 0
3850: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3860: 20 20 20 20 20 20 20 5c 0a 20 20 6e 61 6d 65 20         \.  name 
3870: 23 23 20 53 74 65 70 46 75 6e 63 2c 20 6e 61 6d  ## StepFunc, nam
3880: 65 20 23 23 20 46 69 6e 61 6c 69 7a 65 46 75 6e  e ## FinalizeFun
3890: 63 2c 20 6e 61 6d 65 20 23 23 20 56 61 6c 75 65  c, name ## Value
38a0: 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Func,           
38b0: 20 20 20 20 5c 0a 20 20 6e 61 6d 65 20 23 23 20      \.  name ## 
38c0: 49 6e 76 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23  InvFunc, name ##
38d0: 20 4e 61 6d 65 2c 20 7b 30 7d 20 20 20 20 20 20   Name, {0}      
38e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3900: 20 5c 0a 7d 0a 0a 2f 2a 20 57 69 6e 64 6f 77 20   \.}../* Window 
3910: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 61  functions that a
3920: 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75  re implemented u
3930: 73 69 6e 67 20 62 79 74 65 63 6f 64 65 20 61 6e  sing bytecode an
3940: 64 20 74 68 75 73 20 68 61 76 65 0a 2a 2a 20 6e  d thus have.** n
3950: 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 73 20 66 6f  o-op routines fo
3960: 72 20 74 68 65 69 72 20 6d 65 74 68 6f 64 73 20  r their methods 
3970: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 44 4f  */.#define WINDO
3980: 57 46 55 4e 43 4e 4f 4f 50 28 6e 61 6d 65 2c 6e  WFUNCNOOP(name,n
3990: 41 72 67 2c 65 78 74 72 61 29 20 7b 20 20 20 20  Arg,extra) {    
39a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
39c0: 20 20 6e 41 72 67 2c 20 28 53 51 4c 49 54 45 5f    nArg, (SQLITE_
39d0: 55 54 46 38 7c 53 51 4c 49 54 45 5f 46 55 4e 43  UTF8|SQLITE_FUNC
39e0: 5f 57 49 4e 44 4f 57 7c 65 78 74 72 61 29 2c 20  _WINDOW|extra), 
39f0: 30 2c 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  0, 0,           
3a00: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6e             \.  n
3a10: 6f 6f 70 53 74 65 70 46 75 6e 63 2c 20 6e 6f 6f  oopStepFunc, noo
3a20: 70 56 61 6c 75 65 46 75 6e 63 2c 20 6e 6f 6f 70  pValueFunc, noop
3a30: 56 61 6c 75 65 46 75 6e 63 2c 20 20 20 20 20 20  ValueFunc,      
3a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a50: 20 20 20 20 20 20 20 20 5c 0a 20 20 6e 6f 6f 70          \.  noop
3a60: 53 74 65 70 46 75 6e 63 2c 20 6e 61 6d 65 20 23  StepFunc, name #
3a70: 23 20 4e 61 6d 65 2c 20 7b 30 7d 20 20 20 20 20  # Name, {0}     
3a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3aa0: 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 20 57 69 6e       \.}../* Win
3ab0: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  dow functions th
3ac0: 61 74 20 75 73 65 20 61 6c 6c 20 77 69 6e 64 6f  at use all windo
3ad0: 77 20 69 6e 74 65 72 66 61 63 65 73 3a 20 78 53  w interfaces: xS
3ae0: 74 65 70 2c 20 74 68 65 0a 2a 2a 20 73 61 6d 65  tep, the.** same
3af0: 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 78 46 69   routine for xFi
3b00: 6e 61 6c 69 7a 65 20 61 6e 64 20 78 56 61 6c 75  nalize and xValu
3b10: 65 20 61 6e 64 20 77 68 69 63 68 20 6e 65 76 65  e and which neve
3b20: 72 20 63 61 6c 6c 0a 2a 2a 20 78 49 6e 76 65 72  r call.** xInver
3b30: 73 65 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  se. */.#define W
3b40: 49 4e 44 4f 57 46 55 4e 43 58 28 6e 61 6d 65 2c  INDOWFUNCX(name,
3b50: 6e 41 72 67 2c 65 78 74 72 61 29 20 7b 20 20 20  nArg,extra) {   
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b80: 20 20 5c 0a 20 20 6e 41 72 67 2c 20 28 53 51 4c    \.  nArg, (SQL
3b90: 49 54 45 5f 55 54 46 38 7c 53 51 4c 49 54 45 5f  ITE_UTF8|SQLITE_
3ba0: 46 55 4e 43 5f 57 49 4e 44 4f 57 7c 65 78 74 72  FUNC_WINDOW|extr
3bb0: 61 29 2c 20 30 2c 20 30 2c 20 20 20 20 20 20 20  a), 0, 0,       
3bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
3bd0: 0a 20 20 6e 61 6d 65 20 23 23 20 53 74 65 70 46  .  name ## StepF
3be0: 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20 56 61 6c  unc, name ## Val
3bf0: 75 65 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20  ueFunc, name ## 
3c00: 56 61 6c 75 65 46 75 6e 63 2c 20 20 20 20 20 20  ValueFunc,      
3c10: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
3c20: 6e 6f 6f 70 53 74 65 70 46 75 6e 63 2c 20 6e 61  noopStepFunc, na
3c30: 6d 65 20 23 23 20 4e 61 6d 65 2c 20 7b 30 7d 20  me ## Name, {0} 
3c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c60: 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 0a 2f           \.}.../
3c70: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 74 68  *.** Register th
3c80: 6f 73 65 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e  ose built-in win
3c90: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  dow functions th
3ca0: 61 74 20 61 72 65 20 6e 6f 74 20 61 6c 73 6f 20  at are not also 
3cb0: 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2f 0a 76  aggregates..*/.v
3cc0: 6f 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f  oid sqlite3Windo
3cd0: 77 46 75 6e 63 74 69 6f 6e 73 28 76 6f 69 64 29  wFunctions(void)
3ce0: 7b 0a 20 20 73 74 61 74 69 63 20 46 75 6e 63 44  {.  static FuncD
3cf0: 65 66 20 61 57 69 6e 64 6f 77 46 75 6e 63 73 5b  ef aWindowFuncs[
3d00: 5d 20 3d 20 7b 0a 20 20 20 20 57 49 4e 44 4f 57  ] = {.    WINDOW
3d10: 46 55 4e 43 58 28 72 6f 77 5f 6e 75 6d 62 65 72  FUNCX(row_number
3d20: 2c 20 30 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e  , 0, 0),.    WIN
3d30: 44 4f 57 46 55 4e 43 58 28 64 65 6e 73 65 5f 72  DOWFUNCX(dense_r
3d40: 61 6e 6b 2c 20 30 2c 20 30 29 2c 0a 20 20 20 20  ank, 0, 0),.    
3d50: 57 49 4e 44 4f 57 46 55 4e 43 58 28 72 61 6e 6b  WINDOWFUNCX(rank
3d60: 2c 20 30 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e  , 0, 0),.    WIN
3d70: 44 4f 57 46 55 4e 43 58 28 70 65 72 63 65 6e 74  DOWFUNCX(percent
3d80: 5f 72 61 6e 6b 2c 20 30 2c 20 53 51 4c 49 54 45  _rank, 0, SQLITE
3d90: 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 5f 53 49 5a  _FUNC_WINDOW_SIZ
3da0: 45 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46 55  E),.    WINDOWFU
3db0: 4e 43 58 28 63 75 6d 65 5f 64 69 73 74 2c 20 30  NCX(cume_dist, 0
3dc0: 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49  , SQLITE_FUNC_WI
3dd0: 4e 44 4f 57 5f 53 49 5a 45 29 2c 0a 20 20 20 20  NDOW_SIZE),.    
3de0: 57 49 4e 44 4f 57 46 55 4e 43 58 28 6e 74 69 6c  WINDOWFUNCX(ntil
3df0: 65 2c 20 31 2c 20 53 51 4c 49 54 45 5f 46 55 4e  e, 1, SQLITE_FUN
3e00: 43 5f 57 49 4e 44 4f 57 5f 53 49 5a 45 29 2c 0a  C_WINDOW_SIZE),.
3e10: 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 41 4c      WINDOWFUNCAL
3e20: 4c 28 6c 61 73 74 5f 76 61 6c 75 65 2c 20 31 2c  L(last_value, 1,
3e30: 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46   0),.    WINDOWF
3e40: 55 4e 43 4e 4f 4f 50 28 6e 74 68 5f 76 61 6c 75  UNCNOOP(nth_valu
3e50: 65 2c 20 32 2c 20 30 29 2c 0a 20 20 20 20 57 49  e, 2, 0),.    WI
3e60: 4e 44 4f 57 46 55 4e 43 4e 4f 4f 50 28 66 69 72  NDOWFUNCNOOP(fir
3e70: 73 74 5f 76 61 6c 75 65 2c 20 31 2c 20 30 29 2c  st_value, 1, 0),
3e80: 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e  .    WINDOWFUNCN
3e90: 4f 4f 50 28 6c 65 61 64 2c 20 31 2c 20 30 29 2c  OOP(lead, 1, 0),
3ea0: 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e  .    WINDOWFUNCN
3eb0: 4f 4f 50 28 6c 65 61 64 2c 20 32 2c 20 30 29 2c  OOP(lead, 2, 0),
3ec0: 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e  .    WINDOWFUNCN
3ed0: 4f 4f 50 28 6c 65 61 64 2c 20 33 2c 20 30 29 2c  OOP(lead, 3, 0),
3ee0: 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e  .    WINDOWFUNCN
3ef0: 4f 4f 50 28 6c 61 67 2c 20 31 2c 20 30 29 2c 0a  OOP(lag, 1, 0),.
3f00: 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f      WINDOWFUNCNO
3f10: 4f 50 28 6c 61 67 2c 20 32 2c 20 30 29 2c 0a 20  OP(lag, 2, 0),. 
3f20: 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f 4f     WINDOWFUNCNOO
3f30: 50 28 6c 61 67 2c 20 33 2c 20 30 29 2c 0a 20 20  P(lag, 3, 0),.  
3f40: 7d 3b 0a 20 20 73 71 6c 69 74 65 33 49 6e 73 65  };.  sqlite3Inse
3f50: 72 74 42 75 69 6c 74 69 6e 46 75 6e 63 73 28 61  rtBuiltinFuncs(a
3f60: 57 69 6e 64 6f 77 46 75 6e 63 73 2c 20 41 72 72  WindowFuncs, Arr
3f70: 61 79 53 69 7a 65 28 61 57 69 6e 64 6f 77 46 75  aySize(aWindowFu
3f80: 6e 63 73 29 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  ncs));.}..static
3f90: 20 57 69 6e 64 6f 77 20 2a 77 69 6e 64 6f 77 46   Window *windowF
3fa0: 69 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72 73  ind(Parse *pPars
3fb0: 65 2c 20 57 69 6e 64 6f 77 20 2a 70 4c 69 73 74  e, Window *pList
3fc0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
3fd0: 61 6d 65 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a  ame){.  Window *
3fe0: 70 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  p;.  for(p=pList
3ff0: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 57  ; p; p=p->pNextW
4000: 69 6e 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  in){.    if( sql
4010: 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 7a  ite3StrICmp(p->z
4020: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20  Name, zName)==0 
4030: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69  ) break;.  }.  i
4040: 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73  f( p==0 ){.    s
4050: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
4060: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
4070: 77 69 6e 64 6f 77 3a 20 25 73 22 2c 20 7a 4e 61  window: %s", zNa
4080: 6d 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  me);.  }.  retur
4090: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n p;.}../*.** Th
40a0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
40b0: 61 6c 6c 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  alled immediatel
40c0: 79 20 61 66 74 65 72 20 72 65 73 6f 6c 76 69 6e  y after resolvin
40d0: 67 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e  g the function n
40e0: 61 6d 65 0a 2a 2a 20 66 6f 72 20 61 20 77 69 6e  ame.** for a win
40f0: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  dow function wit
4100: 68 69 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61  hin a SELECT sta
4110: 74 65 6d 65 6e 74 2e 20 41 72 67 75 6d 65 6e 74  tement. Argument
4120: 20 70 4c 69 73 74 20 69 73 20 61 0a 2a 2a 20 6c   pList is a.** l
4130: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 57 49  inked list of WI
4140: 4e 44 4f 57 20 64 65 66 69 6e 69 74 69 6f 6e 73  NDOW definitions
4150: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
4160: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
4170: 74 2e 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  t..** Argument p
4180: 46 75 6e 63 20 69 73 20 74 68 65 20 66 75 6e 63  Func is the func
4190: 74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20  tion definition 
41a0: 6a 75 73 74 20 72 65 73 6f 6c 76 65 64 20 61 6e  just resolved an
41b0: 64 20 70 57 69 6e 0a 2a 2a 20 69 73 20 74 68 65  d pWin.** is the
41c0: 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 72   Window object r
41d0: 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20  epresenting the 
41e0: 61 73 73 6f 63 69 61 74 65 64 20 4f 56 45 52 20  associated OVER 
41f0: 63 6c 61 75 73 65 2e 20 54 68 69 73 0a 2a 2a 20  clause. This.** 
4200: 66 75 6e 63 74 69 6f 6e 20 75 70 64 61 74 65 73  function updates
4210: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
4220: 20 70 57 69 6e 20 61 73 20 66 6f 6c 6c 6f 77 73   pWin as follows
4230: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74  :.**.**   * If t
4240: 68 65 20 4f 56 45 52 20 63 6c 61 75 73 65 20 72  he OVER clause r
4250: 65 66 65 72 65 64 20 74 6f 20 61 20 6e 61 6d 65  efered to a name
4260: 64 20 77 69 6e 64 6f 77 20 28 61 73 20 69 6e 20  d window (as in 
4270: 22 6d 61 78 28 78 29 20 4f 56 45 52 20 77 69 6e  "max(x) OVER win
4280: 22 29 2c 0a 2a 2a 20 20 20 20 20 73 65 61 72 63  "),.**     searc
4290: 68 20 6c 69 73 74 20 70 4c 69 73 74 20 66 6f 72  h list pList for
42a0: 20 61 20 6d 61 74 63 68 69 6e 67 20 57 49 4e 44   a matching WIND
42b0: 4f 57 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 61  OW definition, a
42c0: 6e 64 20 75 70 64 61 74 65 20 70 57 69 6e 0a 2a  nd update pWin.*
42d0: 2a 20 20 20 20 20 61 63 63 6f 72 64 69 6e 67 6c  *     accordingl
42e0: 79 2e 20 49 66 20 6e 6f 20 73 75 63 68 20 57 49  y. If no such WI
42f0: 4e 44 4f 57 20 63 6c 61 75 73 65 20 63 61 6e 20  NDOW clause can 
4300: 62 65 20 66 6f 75 6e 64 2c 20 6c 65 61 76 65 20  be found, leave 
4310: 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 20 20 20 20  an error.**     
4320: 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a  in pParse..**.**
4330: 20 20 20 2a 20 49 66 20 74 68 65 20 66 75 6e 63     * If the func
4340: 74 69 6f 6e 20 69 73 20 61 20 62 75 69 6c 74 2d  tion is a built-
4350: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
4360: 6f 6e 20 74 68 61 74 20 72 65 71 75 69 72 65 73  on that requires
4370: 20 74 68 65 0a 2a 2a 20 20 20 20 20 77 69 6e 64   the.**     wind
4380: 6f 77 20 74 6f 20 62 65 20 63 6f 65 72 63 65 64  ow to be coerced
4390: 20 28 73 65 65 20 22 42 55 49 4c 54 2d 49 4e 20   (see "BUILT-IN 
43a0: 57 49 4e 44 4f 57 20 46 55 4e 43 54 49 4f 4e 53  WINDOW FUNCTIONS
43b0: 22 20 61 74 20 74 68 65 20 74 6f 70 0a 2a 2a 20  " at the top.** 
43c0: 20 20 20 20 6f 66 20 74 68 69 73 20 66 69 6c 65      of this file
43d0: 29 2c 20 70 57 69 6e 20 69 73 20 75 70 64 61 74  ), pWin is updat
43e0: 65 64 20 68 65 72 65 2e 0a 2a 2f 0a 76 6f 69 64  ed here..*/.void
43f0: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 55 70   sqlite3WindowUp
4400: 64 61 74 65 28 0a 20 20 50 61 72 73 65 20 2a 70  date(.  Parse *p
4410: 50 61 72 73 65 2c 20 0a 20 20 57 69 6e 64 6f 77  Parse, .  Window
4420: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
4430: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
4440: 74 20 6f 66 20 6e 61 6d 65 64 20 77 69 6e 64 6f  t of named windo
4450: 77 73 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45  ws for this SELE
4460: 43 54 20 2a 2f 0a 20 20 57 69 6e 64 6f 77 20 2a  CT */.  Window *
4470: 70 57 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20  pWin,           
4480: 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6e 64 6f          /* Windo
4490: 77 20 66 72 61 6d 65 20 74 6f 20 75 70 64 61 74  w frame to updat
44a0: 65 20 2a 2f 0a 20 20 46 75 6e 63 44 65 66 20 2a  e */.  FuncDef *
44b0: 70 46 75 6e 63 20 20 20 20 20 20 20 20 20 20 20  pFunc           
44c0: 20 20 20 20 20 20 20 2f 2a 20 57 69 6e 64 6f 77         /* Window
44d0: 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69   function defini
44e0: 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  tion */.){.  if(
44f0: 20 70 57 69 6e 2d 3e 7a 4e 61 6d 65 20 26 26 20   pWin->zName && 
4500: 70 57 69 6e 2d 3e 65 54 79 70 65 3d 3d 30 20 29  pWin->eType==0 )
4510: 7b 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a 70 20  {.    Window *p 
4520: 3d 20 77 69 6e 64 6f 77 46 69 6e 64 28 70 50 61  = windowFind(pPa
4530: 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 57 69 6e  rse, pList, pWin
4540: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ->zName);.    if
4550: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
4560: 0a 20 20 20 20 70 57 69 6e 2d 3e 70 50 61 72 74  .    pWin->pPart
4570: 69 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 45  ition = sqlite3E
4580: 78 70 72 4c 69 73 74 44 75 70 28 70 50 61 72 73  xprListDup(pPars
4590: 65 2d 3e 64 62 2c 20 70 2d 3e 70 50 61 72 74 69  e->db, p->pParti
45a0: 74 69 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 70 57  tion, 0);.    pW
45b0: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73  in->pOrderBy = s
45c0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
45d0: 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d  p(pParse->db, p-
45e0: 3e 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 20  >pOrderBy, 0);. 
45f0: 20 20 20 70 57 69 6e 2d 3e 70 53 74 61 72 74 20     pWin->pStart 
4600: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
4610: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e  (pParse->db, p->
4620: 70 53 74 61 72 74 2c 20 30 29 3b 0a 20 20 20 20  pStart, 0);.    
4630: 70 57 69 6e 2d 3e 70 45 6e 64 20 3d 20 73 71 6c  pWin->pEnd = sql
4640: 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72  ite3ExprDup(pPar
4650: 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 45 6e 64 2c  se->db, p->pEnd,
4660: 20 30 29 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 65   0);.    pWin->e
4670: 53 74 61 72 74 20 3d 20 70 2d 3e 65 53 74 61 72  Start = p->eStar
4680: 74 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 65 45 6e  t;.    pWin->eEn
4690: 64 20 3d 20 70 2d 3e 65 45 6e 64 3b 0a 20 20 20  d = p->eEnd;.   
46a0: 20 70 57 69 6e 2d 3e 65 54 79 70 65 20 3d 20 70   pWin->eType = p
46b0: 2d 3e 65 54 79 70 65 3b 0a 20 20 7d 65 6c 73 65  ->eType;.  }else
46c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e  {.    sqlite3Win
46d0: 64 6f 77 43 68 61 69 6e 28 70 50 61 72 73 65 2c  dowChain(pParse,
46e0: 20 70 57 69 6e 2c 20 70 4c 69 73 74 29 3b 0a 20   pWin, pList);. 
46f0: 20 7d 0a 20 20 69 66 28 20 28 70 57 69 6e 2d 3e   }.  if( (pWin->
4700: 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 29  eType==TK_RANGE)
4710: 0a 20 20 20 26 26 20 28 70 57 69 6e 2d 3e 70 53  .   && (pWin->pS
4720: 74 61 72 74 20 7c 7c 20 70 57 69 6e 2d 3e 70 45  tart || pWin->pE
4730: 6e 64 29 20 0a 20 20 20 26 26 20 28 70 57 69 6e  nd) .   && (pWin
4740: 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c  ->pOrderBy==0 ||
4750: 20 70 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 2d   pWin->pOrderBy-
4760: 3e 6e 45 78 70 72 21 3d 31 29 0a 20 20 29 7b 0a  >nExpr!=1).  ){.
4770: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
4780: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
4790: 20 20 20 22 52 41 4e 47 45 20 77 69 74 68 20 6f     "RANGE with o
47a0: 66 66 73 65 74 20 50 52 45 43 45 44 49 4e 47 2f  ffset PRECEDING/
47b0: 46 4f 4c 4c 4f 57 49 4e 47 20 72 65 71 75 69 72  FOLLOWING requir
47c0: 65 73 20 6f 6e 65 20 4f 52 44 45 52 20 42 59 20  es one ORDER BY 
47d0: 65 78 70 72 65 73 73 69 6f 6e 22 0a 20 20 20 20  expression".    
47e0: 29 3b 0a 20 20 7d 65 6c 73 65 0a 20 20 69 66 28  );.  }else.  if(
47f0: 20 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67   pFunc->funcFlag
4800: 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
4810: 57 49 4e 44 4f 57 20 29 7b 0a 20 20 20 20 73 71  WINDOW ){.    sq
4820: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
4830: 73 65 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28 20  se->db;.    if( 
4840: 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72 20 29 7b  pWin->pFilter ){
4850: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
4860: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
4870: 20 20 20 20 20 20 20 20 20 20 22 46 49 4c 54 45            "FILTE
4880: 52 20 63 6c 61 75 73 65 20 6d 61 79 20 6f 6e 6c  R clause may onl
4890: 79 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61  y be used with a
48a0: 67 67 72 65 67 61 74 65 20 77 69 6e 64 6f 77 20  ggregate window 
48b0: 66 75 6e 63 74 69 6f 6e 73 22 0a 20 20 20 20 20  functions".     
48c0: 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 20 20   );.    }else.  
48d0: 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 7a 4e 61    if( pFunc->zNa
48e0: 6d 65 3d 3d 72 6f 77 5f 6e 75 6d 62 65 72 4e 61  me==row_numberNa
48f0: 6d 65 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61  me || pFunc->zNa
4900: 6d 65 3d 3d 6e 74 69 6c 65 4e 61 6d 65 20 29 7b  me==ntileName ){
4910: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
4920: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 57 69  prDelete(db, pWi
4930: 6e 2d 3e 70 53 74 61 72 74 29 3b 0a 20 20 20 20  n->pStart);.    
4940: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
4950: 65 74 65 28 64 62 2c 20 70 57 69 6e 2d 3e 70 45  ete(db, pWin->pE
4960: 6e 64 29 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d  nd);.      pWin-
4970: 3e 70 53 74 61 72 74 20 3d 20 70 57 69 6e 2d 3e  >pStart = pWin->
4980: 70 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  pEnd = 0;.      
4990: 70 57 69 6e 2d 3e 65 54 79 70 65 20 3d 20 54 4b  pWin->eType = TK
49a0: 5f 52 4f 57 53 3b 0a 20 20 20 20 20 20 70 57 69  _ROWS;.      pWi
49b0: 6e 2d 3e 65 53 74 61 72 74 20 3d 20 54 4b 5f 55  n->eStart = TK_U
49c0: 4e 42 4f 55 4e 44 45 44 3b 0a 20 20 20 20 20 20  NBOUNDED;.      
49d0: 70 57 69 6e 2d 3e 65 45 6e 64 20 3d 20 54 4b 5f  pWin->eEnd = TK_
49e0: 43 55 52 52 45 4e 54 3b 0a 20 20 20 20 7d 65 6c  CURRENT;.    }el
49f0: 73 65 0a 0a 20 20 20 20 69 66 28 20 70 46 75 6e  se..    if( pFun
4a00: 63 2d 3e 7a 4e 61 6d 65 3d 3d 64 65 6e 73 65 5f  c->zName==dense_
4a10: 72 61 6e 6b 4e 61 6d 65 20 7c 7c 20 70 46 75 6e  rankName || pFun
4a20: 63 2d 3e 7a 4e 61 6d 65 3d 3d 72 61 6e 6b 4e 61  c->zName==rankNa
4a30: 6d 65 0a 20 20 20 20 20 7c 7c 20 70 46 75 6e 63  me.     || pFunc
4a40: 2d 3e 7a 4e 61 6d 65 3d 3d 70 65 72 63 65 6e 74  ->zName==percent
4a50: 5f 72 61 6e 6b 4e 61 6d 65 20 7c 7c 20 70 46 75  _rankName || pFu
4a60: 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 63 75 6d 65 5f  nc->zName==cume_
4a70: 64 69 73 74 4e 61 6d 65 0a 20 20 20 20 29 7b 0a  distName.    ){.
4a80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
4a90: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 57 69 6e  rDelete(db, pWin
4aa0: 2d 3e 70 53 74 61 72 74 29 3b 0a 20 20 20 20 20  ->pStart);.     
4ab0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
4ac0: 74 65 28 64 62 2c 20 70 57 69 6e 2d 3e 70 45 6e  te(db, pWin->pEn
4ad0: 64 29 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e  d);.      pWin->
4ae0: 70 53 74 61 72 74 20 3d 20 70 57 69 6e 2d 3e 70  pStart = pWin->p
4af0: 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  End = 0;.      p
4b00: 57 69 6e 2d 3e 65 54 79 70 65 20 3d 20 54 4b 5f  Win->eType = TK_
4b10: 52 41 4e 47 45 3b 0a 20 20 20 20 20 20 70 57 69  RANGE;.      pWi
4b20: 6e 2d 3e 65 53 74 61 72 74 20 3d 20 54 4b 5f 55  n->eStart = TK_U
4b30: 4e 42 4f 55 4e 44 45 44 3b 0a 20 20 20 20 20 20  NBOUNDED;.      
4b40: 70 57 69 6e 2d 3e 65 45 6e 64 20 3d 20 54 4b 5f  pWin->eEnd = TK_
4b50: 43 55 52 52 45 4e 54 3b 0a 20 20 20 20 7d 0a 20  CURRENT;.    }. 
4b60: 20 7d 0a 20 20 70 57 69 6e 2d 3e 70 46 75 6e 63   }.  pWin->pFunc
4b70: 20 3d 20 70 46 75 6e 63 3b 0a 7d 0a 0a 2f 2a 0a   = pFunc;.}../*.
4b80: 2a 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63  ** Context objec
4b90: 74 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  t passed through
4ba0: 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
4bb0: 4c 69 73 74 28 29 20 74 6f 0a 2a 2a 20 73 65 6c  List() to.** sel
4bc0: 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65  ectWindowRewrite
4bd0: 45 78 70 72 43 62 28 29 20 62 79 20 73 65 6c 65  ExprCb() by sele
4be0: 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65 45  ctWindowRewriteE
4bf0: 4c 69 73 74 28 29 2e 0a 2a 2f 0a 74 79 70 65 64  List()..*/.typed
4c00: 65 66 20 73 74 72 75 63 74 20 57 69 6e 64 6f 77  ef struct Window
4c10: 52 65 77 72 69 74 65 20 57 69 6e 64 6f 77 52 65  Rewrite WindowRe
4c20: 77 72 69 74 65 3b 0a 73 74 72 75 63 74 20 57 69  write;.struct Wi
4c30: 6e 64 6f 77 52 65 77 72 69 74 65 20 7b 0a 20 20  ndowRewrite {.  
4c40: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20  Window *pWin;.  
4c50: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20  SrcList *pSrc;. 
4c60: 20 45 78 70 72 4c 69 73 74 20 2a 70 53 75 62 3b   ExprList *pSub;
4c70: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 53  .  Select *pSubS
4c80: 65 6c 65 63 74 3b 20 20 20 20 20 20 20 20 20 20  elect;          
4c90: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 75     /* Current su
4ca0: 62 2d 73 65 6c 65 63 74 2c 20 69 66 20 61 6e 79  b-select, if any
4cb0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61   */.};../*.** Ca
4cc0: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
4cd0: 75 73 65 64 20 62 79 20 73 65 6c 65 63 74 57 69  used by selectWi
4ce0: 6e 64 6f 77 52 65 77 72 69 74 65 45 4c 69 73 74  ndowRewriteEList
4cf0: 28 29 2e 20 49 66 20 6e 65 63 65 73 73 61 72 79  (). If necessary
4d00: 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  ,.** this functi
4d10: 6f 6e 20 61 70 70 65 6e 64 73 20 74 6f 20 74 68  on appends to th
4d20: 65 20 6f 75 74 70 75 74 20 65 78 70 72 65 73 73  e output express
4d30: 69 6f 6e 2d 6c 69 73 74 20 61 6e 64 20 75 70 64  ion-list and upd
4d40: 61 74 65 73 20 0a 2a 2a 20 65 78 70 72 65 73 73  ates .** express
4d50: 69 6f 6e 20 28 2a 70 70 45 78 70 72 29 20 69 6e  ion (*ppExpr) in
4d60: 20 70 6c 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69   place..*/.stati
4d70: 63 20 69 6e 74 20 73 65 6c 65 63 74 57 69 6e 64  c int selectWind
4d80: 6f 77 52 65 77 72 69 74 65 45 78 70 72 43 62 28  owRewriteExprCb(
4d90: 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
4da0: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
4db0: 20 73 74 72 75 63 74 20 57 69 6e 64 6f 77 52 65   struct WindowRe
4dc0: 77 72 69 74 65 20 2a 70 20 3d 20 70 57 61 6c 6b  write *p = pWalk
4dd0: 65 72 2d 3e 75 2e 70 52 65 77 72 69 74 65 3b 0a  er->u.pRewrite;.
4de0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
4df0: 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
4e00: 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  e;..  /* If this
4e10: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69   function is bei
4e20: 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77  ng called from w
4e30: 69 74 68 69 6e 20 61 20 73 63 61 6c 61 72 20 73  ithin a scalar s
4e40: 75 62 2d 73 65 6c 65 63 74 0a 20 20 2a 2a 20 74  ub-select.  ** t
4e50: 68 61 74 20 75 73 65 64 20 62 79 20 74 68 65 20  hat used by the 
4e60: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
4e70: 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64   being processed
4e80: 2c 20 6f 6e 6c 79 20 70 72 6f 63 65 73 73 0a 20  , only process. 
4e90: 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 20 65 78   ** TK_COLUMN ex
4ea0: 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72  pressions that r
4eb0: 65 66 65 72 20 74 6f 20 69 74 20 28 74 68 65 20  efer to it (the 
4ec0: 6f 75 74 65 72 20 53 45 4c 45 43 54 29 2e 20 44  outer SELECT). D
4ed0: 6f 0a 20 20 2a 2a 20 6e 6f 74 20 70 72 6f 63 65  o.  ** not proce
4ee0: 73 73 20 61 67 67 72 65 67 61 74 65 73 20 6f 72  ss aggregates or
4ef0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
4f00: 73 20 61 74 20 61 6c 6c 2c 20 61 73 20 74 68 65  s at all, as the
4f10: 79 20 62 65 6c 6f 6e 67 0a 20 20 2a 2a 20 74 6f  y belong.  ** to
4f20: 20 74 68 65 20 73 63 61 6c 61 72 20 73 75 62 2d   the scalar sub-
4f30: 73 65 6c 65 63 74 2e 20 20 2a 2f 0a 20 20 69 66  select.  */.  if
4f40: 28 20 70 2d 3e 70 53 75 62 53 65 6c 65 63 74 20  ( p->pSubSelect 
4f50: 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  ){.    if( pExpr
4f60: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
4f70: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
4f80: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
4f90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
4fa0: 6e 74 20 6e 53 72 63 20 3d 20 70 2d 3e 70 53 72  nt nSrc = p->pSr
4fb0: 63 2d 3e 6e 53 72 63 3b 0a 20 20 20 20 20 20 69  c->nSrc;.      i
4fc0: 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
4fd0: 69 3d 30 3b 20 69 3c 6e 53 72 63 3b 20 69 2b 2b  i=0; i<nSrc; i++
4fe0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
4ff0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 2d  Expr->iTable==p-
5000: 3e 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72  >pSrc->a[i].iCur
5010: 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  sor ) break;.   
5020: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
5030: 3d 3d 6e 53 72 63 20 29 20 72 65 74 75 72 6e 20  ==nSrc ) return 
5040: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
5050: 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63    }.  }..  switc
5060: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
5070: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
5080: 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28  CTION:.      if(
5090: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
50a0: 79 28 70 45 78 70 72 2c 20 45 50 5f 57 69 6e 46  y(pExpr, EP_WinF
50b0: 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  unc) ){.        
50c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c  break;.      }el
50d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 57 69 6e 64  se{.        Wind
50e0: 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 20 20 20 20  ow *pWin;.      
50f0: 20 20 66 6f 72 28 70 57 69 6e 3d 70 2d 3e 70 57    for(pWin=p->pW
5100: 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70  in; pWin; pWin=p
5110: 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a  Win->pNextWin){.
5120: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
5130: 78 70 72 2d 3e 79 2e 70 57 69 6e 3d 3d 70 57 69  xpr->y.pWin==pWi
5140: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
5150: 20 61 73 73 65 72 74 28 20 70 57 69 6e 2d 3e 70   assert( pWin->p
5160: 4f 77 6e 65 72 3d 3d 70 45 78 70 72 20 29 3b 0a  Owner==pExpr );.
5170: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
5180: 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
5190: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
51a0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
51b0: 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67    /* Fall throug
51c0: 68 2e 20 20 2a 2f 0a 0a 20 20 20 20 63 61 73 65  h.  */..    case
51d0: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
51e0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
51f0: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78  LUMN: {.      Ex
5200: 70 72 20 2a 70 44 75 70 20 3d 20 73 71 6c 69 74  pr *pDup = sqlit
5210: 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65  e3ExprDup(pParse
5220: 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b  ->db, pExpr, 0);
5230: 0a 20 20 20 20 20 20 70 2d 3e 70 53 75 62 20 3d  .      p->pSub =
5240: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
5250: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
5260: 2d 3e 70 53 75 62 2c 20 70 44 75 70 29 3b 0a 20  ->pSub, pDup);. 
5270: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 53 75 62       if( p->pSub
5280: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
5290: 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  rt( ExprHasPrope
52a0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 74  rty(pExpr, EP_St
52b0: 61 74 69 63 29 3d 3d 30 20 29 3b 0a 20 20 20 20  atic)==0 );.    
52c0: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
52d0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 74  rty(pExpr, EP_St
52e0: 61 74 69 63 29 3b 0a 20 20 20 20 20 20 20 20 73  atic);.        s
52f0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
5300: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78  (pParse->db, pEx
5310: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70  pr);.        Exp
5320: 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 70  rClearProperty(p
5330: 45 78 70 72 2c 20 45 50 5f 53 74 61 74 69 63 29  Expr, EP_Static)
5340: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ;.        memset
5350: 28 70 45 78 70 72 2c 20 30 2c 20 73 69 7a 65 6f  (pExpr, 0, sizeo
5360: 66 28 45 78 70 72 29 29 3b 0a 0a 20 20 20 20 20  f(Expr));..     
5370: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
5380: 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20  K_COLUMN;.      
5390: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
53a0: 20 3d 20 70 2d 3e 70 53 75 62 2d 3e 6e 45 78 70   = p->pSub->nExp
53b0: 72 2d 31 3b 0a 20 20 20 20 20 20 20 20 70 45 78  r-1;.        pEx
53c0: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 2d 3e  pr->iTable = p->
53d0: 70 57 69 6e 2d 3e 69 45 70 68 43 73 72 3b 0a 20  pWin->iEphCsr;. 
53e0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62 72       }..      br
53f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
5400: 64 65 66 61 75 6c 74 3a 20 2f 2a 20 6e 6f 2d 6f  default: /* no-o
5410: 70 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  p */.      break
5420: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
5430: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
5440: 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63  static int selec
5450: 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65 53 65  tWindowRewriteSe
5460: 6c 65 63 74 43 62 28 57 61 6c 6b 65 72 20 2a 70  lectCb(Walker *p
5470: 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
5480: 70 53 65 6c 65 63 74 29 7b 0a 20 20 73 74 72 75  pSelect){.  stru
5490: 63 74 20 57 69 6e 64 6f 77 52 65 77 72 69 74 65  ct WindowRewrite
54a0: 20 2a 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75   *p = pWalker->u
54b0: 2e 70 52 65 77 72 69 74 65 3b 0a 20 20 53 65 6c  .pRewrite;.  Sel
54c0: 65 63 74 20 2a 70 53 61 76 65 20 3d 20 70 2d 3e  ect *pSave = p->
54d0: 70 53 75 62 53 65 6c 65 63 74 3b 0a 20 20 69 66  pSubSelect;.  if
54e0: 28 20 70 53 61 76 65 3d 3d 70 53 65 6c 65 63 74  ( pSave==pSelect
54f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   ){.    return W
5500: 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d  RC_Continue;.  }
5510: 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 70 53 75  else{.    p->pSu
5520: 62 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63  bSelect = pSelec
5530: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61  t;.    sqlite3Wa
5540: 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
5550: 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  , pSelect);.    
5560: 70 2d 3e 70 53 75 62 53 65 6c 65 63 74 20 3d 20  p->pSubSelect = 
5570: 70 53 61 76 65 3b 0a 20 20 7d 0a 20 20 72 65 74  pSave;.  }.  ret
5580: 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 7d  urn WRC_Prune;.}
5590: 0a 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 65  .../*.** Iterate
55a0: 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78   through each ex
55b0: 70 72 65 73 73 69 6f 6e 20 69 6e 20 65 78 70 72  pression in expr
55c0: 65 73 73 69 6f 6e 2d 6c 69 73 74 20 70 45 4c 69  ession-list pELi
55d0: 73 74 2e 20 46 6f 72 20 65 61 63 68 3a 0a 2a 2a  st. For each:.**
55e0: 0a 2a 2a 20 20 20 2a 20 54 4b 5f 43 4f 4c 55 4d  .**   * TK_COLUM
55f0: 4e 2c 0a 2a 2a 20 20 20 2a 20 61 67 67 72 65 67  N,.**   * aggreg
5600: 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 72  ate function, or
5610: 0a 2a 2a 20 20 20 2a 20 77 69 6e 64 6f 77 20 66  .**   * window f
5620: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 61 20 57  unction with a W
5630: 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 74 68 61  indow object tha
5640: 74 20 69 73 20 6e 6f 74 20 61 20 6d 65 6d 62 65  t is not a membe
5650: 72 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20 20  r of the .**    
5660: 20 57 69 6e 64 6f 77 20 6c 69 73 74 20 70 61 73   Window list pas
5670: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
5680: 64 20 61 72 67 75 6d 65 6e 74 20 28 70 57 69 6e  d argument (pWin
5690: 29 2e 0a 2a 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  )..**.** Append 
56a0: 74 68 65 20 6e 6f 64 65 20 74 6f 20 6f 75 74 70  the node to outp
56b0: 75 74 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69  ut expression-li
56c0: 73 74 20 28 2a 70 70 53 75 62 29 2e 20 41 6e 64  st (*ppSub). And
56d0: 20 72 65 70 6c 61 63 65 20 69 74 0a 2a 2a 20 77   replace it.** w
56e0: 69 74 68 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20  ith a TK_COLUMN 
56f0: 74 68 61 74 20 72 65 61 64 73 20 74 68 65 20 28  that reads the (
5700: 4e 2d 31 29 74 68 20 65 6c 65 6d 65 6e 74 20 6f  N-1)th element o
5710: 66 20 74 61 62 6c 65 20 0a 2a 2a 20 70 57 69 6e  f table .** pWin
5720: 2d 3e 69 45 70 68 43 73 72 2c 20 77 68 65 72 65  ->iEphCsr, where
5730: 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   N is the number
5740: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
5750: 28 2a 70 70 53 75 62 29 20 61 66 74 65 72 0a 2a  (*ppSub) after.*
5760: 2a 20 61 70 70 65 6e 64 69 6e 67 20 74 68 65 20  * appending the 
5770: 6e 65 77 20 6f 6e 65 2e 0a 2a 2f 0a 73 74 61 74  new one..*/.stat
5780: 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 57 69  ic void selectWi
5790: 6e 64 6f 77 52 65 77 72 69 74 65 45 4c 69 73 74  ndowRewriteEList
57a0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
57b0: 65 2c 20 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57  e, .  Window *pW
57c0: 69 6e 2c 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  in,.  SrcList *p
57d0: 53 72 63 2c 0a 20 20 45 78 70 72 4c 69 73 74 20  Src,.  ExprList 
57e0: 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 20  *pEList,        
57f0: 20 20 20 20 20 20 20 2f 2a 20 52 65 77 72 69 74         /* Rewrit
5800: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  e expressions in
5810: 20 74 68 69 73 20 6c 69 73 74 20 2a 2f 0a 20 20   this list */.  
5820: 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 53 75 62  ExprList **ppSub
5830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5840: 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 75 62 2d 73  /* IN/OUT: Sub-s
5850: 65 6c 65 63 74 20 65 78 70 72 65 73 73 69 6f 6e  elect expression
5860: 2d 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 57 61  -list */.){.  Wa
5870: 6c 6b 65 72 20 73 57 61 6c 6b 65 72 3b 0a 20 20  lker sWalker;.  
5880: 57 69 6e 64 6f 77 52 65 77 72 69 74 65 20 73 52  WindowRewrite sR
5890: 65 77 72 69 74 65 3b 0a 0a 20 20 6d 65 6d 73 65  ewrite;..  memse
58a0: 74 28 26 73 57 61 6c 6b 65 72 2c 20 30 2c 20 73  t(&sWalker, 0, s
58b0: 69 7a 65 6f 66 28 57 61 6c 6b 65 72 29 29 3b 0a  izeof(Walker));.
58c0: 20 20 6d 65 6d 73 65 74 28 26 73 52 65 77 72 69    memset(&sRewri
58d0: 74 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57 69  te, 0, sizeof(Wi
58e0: 6e 64 6f 77 52 65 77 72 69 74 65 29 29 3b 0a 0a  ndowRewrite));..
58f0: 20 20 73 52 65 77 72 69 74 65 2e 70 53 75 62 20    sRewrite.pSub 
5900: 3d 20 2a 70 70 53 75 62 3b 0a 20 20 73 52 65 77  = *ppSub;.  sRew
5910: 72 69 74 65 2e 70 57 69 6e 20 3d 20 70 57 69 6e  rite.pWin = pWin
5920: 3b 0a 20 20 73 52 65 77 72 69 74 65 2e 70 53 72  ;.  sRewrite.pSr
5930: 63 20 3d 20 70 53 72 63 3b 0a 0a 20 20 73 57 61  c = pSrc;..  sWa
5940: 6c 6b 65 72 2e 70 50 61 72 73 65 20 3d 20 70 50  lker.pParse = pP
5950: 61 72 73 65 3b 0a 20 20 73 57 61 6c 6b 65 72 2e  arse;.  sWalker.
5960: 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
5970: 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72  selectWindowRewr
5980: 69 74 65 45 78 70 72 43 62 3b 0a 20 20 73 57 61  iteExprCb;.  sWa
5990: 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c  lker.xSelectCall
59a0: 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 57 69 6e  back = selectWin
59b0: 64 6f 77 52 65 77 72 69 74 65 53 65 6c 65 63 74  dowRewriteSelect
59c0: 43 62 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 75 2e  Cb;.  sWalker.u.
59d0: 70 52 65 77 72 69 74 65 20 3d 20 26 73 52 65 77  pRewrite = &sRew
59e0: 72 69 74 65 3b 0a 0a 20 20 28 76 6f 69 64 29 73  rite;..  (void)s
59f0: 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69  qlite3WalkExprLi
5a00: 73 74 28 26 73 57 61 6c 6b 65 72 2c 20 70 45 4c  st(&sWalker, pEL
5a10: 69 73 74 29 3b 0a 0a 20 20 2a 70 70 53 75 62 20  ist);..  *ppSub 
5a20: 3d 20 73 52 65 77 72 69 74 65 2e 70 53 75 62 3b  = sRewrite.pSub;
5a30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
5a40: 20 61 20 63 6f 70 79 20 6f 66 20 65 61 63 68 20   a copy of each 
5a50: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 65 78  expression in ex
5a60: 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 70 41  pression-list pA
5a70: 70 70 65 6e 64 20 74 6f 0a 2a 2a 20 65 78 70 72  ppend to.** expr
5a80: 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 4c 69 73  ession list pLis
5a90: 74 2e 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  t. Return a poin
5aa0: 74 65 72 20 74 6f 20 74 68 65 20 72 65 73 75 6c  ter to the resul
5ab0: 74 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  t list..*/.stati
5ac0: 63 20 45 78 70 72 4c 69 73 74 20 2a 65 78 70 72  c ExprList *expr
5ad0: 4c 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28 0a  ListAppendList(.
5ae0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
5af0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
5b00: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
5b10: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
5b20: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  t,        /* Lis
5b30: 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70  t to which to ap
5b40: 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e  pend. Might be N
5b50: 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
5b60: 74 20 2a 70 41 70 70 65 6e 64 20 20 20 20 20 20  t *pAppend      
5b70: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75   /* List of valu
5b80: 65 73 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69  es to append. Mi
5b90: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29  ght be NULL */.)
5ba0: 7b 0a 20 20 69 66 28 20 70 41 70 70 65 6e 64 20  {.  if( pAppend 
5bb0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
5bc0: 20 20 69 6e 74 20 6e 49 6e 69 74 20 3d 20 70 4c    int nInit = pL
5bd0: 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78  ist ? pList->nEx
5be0: 70 72 20 3a 20 30 3b 0a 20 20 20 20 66 6f 72 28  pr : 0;.    for(
5bf0: 69 3d 30 3b 20 69 3c 70 41 70 70 65 6e 64 2d 3e  i=0; i<pAppend->
5c00: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
5c10: 20 20 20 45 78 70 72 20 2a 70 44 75 70 20 3d 20     Expr *pDup = 
5c20: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
5c30: 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 70 70 65  Parse->db, pAppe
5c40: 6e 64 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  nd->a[i].pExpr, 
5c50: 30 29 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 20  0);.      pList 
5c60: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
5c70: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
5c80: 70 4c 69 73 74 2c 20 70 44 75 70 29 3b 0a 20 20  pList, pDup);.  
5c90: 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 20      if( pList ) 
5ca0: 70 4c 69 73 74 2d 3e 61 5b 6e 49 6e 69 74 2b 69  pList->a[nInit+i
5cb0: 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 41  ].sortOrder = pA
5cc0: 70 70 65 6e 64 2d 3e 61 5b 69 5d 2e 73 6f 72 74  ppend->a[i].sort
5cd0: 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  Order;.    }.  }
5ce0: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
5cf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
5d00: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
5d10: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
5d20: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
5d30: 64 6f 65 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 0a  does not invoke.
5d40: 2a 2a 20 61 6e 79 20 53 51 4c 20 77 69 6e 64 6f  ** any SQL windo
5d50: 77 20 66 75 6e 63 74 69 6f 6e 73 2c 20 74 68 69  w functions, thi
5d60: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
5d70: 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
5d80: 2c 20 69 74 20 0a 2a 2a 20 72 65 77 72 69 74 65  , it .** rewrite
5d90: 73 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  s the SELECT sta
5da0: 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77  tement so that w
5db0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 78  indow function x
5dc0: 53 74 65 70 20 66 75 6e 63 74 69 6f 6e 73 0a 2a  Step functions.*
5dd0: 2a 20 61 72 65 20 69 6e 76 6f 6b 65 64 20 69 6e  * are invoked in
5de0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64   the correct ord
5df0: 65 72 20 61 73 20 64 65 73 63 72 69 62 65 64 20  er as described 
5e00: 75 6e 64 65 72 20 22 53 45 4c 45 43 54 20 52 45  under "SELECT RE
5e10: 57 52 49 54 49 4e 47 22 0a 2a 2a 20 61 74 20 74  WRITING".** at t
5e20: 68 65 20 74 6f 70 20 6f 66 20 74 68 69 73 20 66  he top of this f
5e30: 69 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ile..*/.int sqli
5e40: 74 65 33 57 69 6e 64 6f 77 52 65 77 72 69 74 65  te3WindowRewrite
5e50: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
5e60: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e  Select *p){.  in
5e70: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
5e80: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 57 69 6e 20  ;.  if( p->pWin 
5e90: 26 26 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  && p->pPrior==0 
5ea0: 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  ){.    Vdbe *v =
5eb0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
5ec0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 73 71 6c  pParse);.    sql
5ed0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
5ee0: 65 2d 3e 64 62 3b 0a 20 20 20 20 53 65 6c 65 63  e->db;.    Selec
5ef0: 74 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20  t *pSub = 0;    
5f00: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
5f10: 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  subquery */.    
5f20: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20  SrcList *pSrc = 
5f30: 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 45 78 70  p->pSrc;.    Exp
5f40: 72 20 2a 70 57 68 65 72 65 20 3d 20 70 2d 3e 70  r *pWhere = p->p
5f50: 57 68 65 72 65 3b 0a 20 20 20 20 45 78 70 72 4c  Where;.    ExprL
5f60: 69 73 74 20 2a 70 47 72 6f 75 70 42 79 20 3d 20  ist *pGroupBy = 
5f70: 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  p->pGroupBy;.   
5f80: 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 20 3d   Expr *pHaving =
5f90: 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 20   p->pHaving;.   
5fa0: 20 45 78 70 72 4c 69 73 74 20 2a 70 53 6f 72 74   ExprList *pSort
5fb0: 20 3d 20 30 3b 0a 0a 20 20 20 20 45 78 70 72 4c   = 0;..    ExprL
5fc0: 69 73 74 20 2a 70 53 75 62 6c 69 73 74 20 3d 20  ist *pSublist = 
5fd0: 30 3b 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72  0;       /* Expr
5fe0: 65 73 73 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20  ession list for 
5ff0: 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 20  sub-query */.   
6000: 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d   Window *pMWin =
6010: 20 70 2d 3e 70 57 69 6e 3b 20 20 20 20 20 20 2f   p->pWin;      /
6020: 2a 20 4d 61 73 74 65 72 20 77 69 6e 64 6f 77 20  * Master window 
6030: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 57 69  object */.    Wi
6040: 6e 64 6f 77 20 2a 70 57 69 6e 3b 20 20 20 20 20  ndow *pWin;     
6050: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
6060: 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 69 74 65  indow object ite
6070: 72 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 70 2d  rator */..    p-
6080: 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 70  >pSrc = 0;.    p
6090: 2d 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20  ->pWhere = 0;.  
60a0: 20 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20    p->pGroupBy = 
60b0: 30 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e  0;.    p->pHavin
60c0: 67 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43  g = 0;..    /* C
60d0: 72 65 61 74 65 20 74 68 65 20 4f 52 44 45 52 20  reate the ORDER 
60e0: 42 59 20 63 6c 61 75 73 65 20 66 6f 72 20 74 68  BY clause for th
60f0: 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 54 68  e sub-select. Th
6100: 69 73 20 69 73 20 74 68 65 20 63 6f 6e 63 61 74  is is the concat
6110: 65 6e 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6f  enation.    ** o
6120: 66 20 74 68 65 20 77 69 6e 64 6f 77 20 50 41 52  f the window PAR
6130: 54 49 54 49 4f 4e 20 61 6e 64 20 4f 52 44 45 52  TITION and ORDER
6140: 20 42 59 20 63 6c 61 75 73 65 73 2e 20 54 68 65   BY clauses. The
6150: 6e 2c 20 69 66 20 74 68 69 73 20 6d 61 6b 65 73  n, if this makes
6160: 20 69 74 0a 20 20 20 20 2a 2a 20 72 65 64 75 6e   it.    ** redun
6170: 64 61 6e 74 2c 20 72 65 6d 6f 76 65 20 74 68 65  dant, remove the
6180: 20 4f 52 44 45 52 20 42 59 20 66 72 6f 6d 20 74   ORDER BY from t
6190: 68 65 20 70 61 72 65 6e 74 20 53 45 4c 45 43 54  he parent SELECT
61a0: 2e 20 20 2a 2f 0a 20 20 20 20 70 53 6f 72 74 20  .  */.    pSort 
61b0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
61c0: 74 44 75 70 28 64 62 2c 20 70 4d 57 69 6e 2d 3e  tDup(db, pMWin->
61d0: 70 50 61 72 74 69 74 69 6f 6e 2c 20 30 29 3b 0a  pPartition, 0);.
61e0: 20 20 20 20 70 53 6f 72 74 20 3d 20 65 78 70 72      pSort = expr
61f0: 4c 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28 70  ListAppendList(p
6200: 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 4d  Parse, pSort, pM
6210: 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  Win->pOrderBy);.
6220: 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 26 26      if( pSort &&
6230: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
6240: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
6250: 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65  3ExprListCompare
6260: 28 70 53 6f 72 74 2c 20 70 2d 3e 70 4f 72 64 65  (pSort, p->pOrde
6270: 72 42 79 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20  rBy, -1)==0 ){. 
6280: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
6290: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
62a0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
62b0: 20 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72         p->pOrder
62c0: 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  By = 0;.      }.
62d0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 73      }..    /* As
62e0: 73 69 67 6e 20 61 20 63 75 72 73 6f 72 20 6e 75  sign a cursor nu
62f0: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 65 70 68  mber for the eph
6300: 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 75 73 65  emeral table use
6310: 64 20 74 6f 20 62 75 66 66 65 72 20 72 6f 77 73  d to buffer rows
6320: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 4f 70 65  ..    ** The Ope
6330: 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72  nEphemeral instr
6340: 75 63 74 69 6f 6e 20 69 73 20 63 6f 64 65 64 20  uction is coded 
6350: 6c 61 74 65 72 2c 20 61 66 74 65 72 20 69 74 20  later, after it 
6360: 69 73 20 6b 6e 6f 77 6e 20 68 6f 77 0a 20 20 20  is known how.   
6370: 20 2a 2a 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73   ** many columns
6380: 20 74 68 65 20 74 61 62 6c 65 20 77 69 6c 6c 20   the table will 
6390: 68 61 76 65 2e 20 20 2a 2f 0a 20 20 20 20 70 4d  have.  */.    pM
63a0: 57 69 6e 2d 3e 69 45 70 68 43 73 72 20 3d 20 70  Win->iEphCsr = p
63b0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
63c0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20     pParse->nTab 
63d0: 2b 3d 20 33 3b 0a 0a 20 20 20 20 73 65 6c 65 63  += 3;..    selec
63e0: 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65 45 4c  tWindowRewriteEL
63f0: 69 73 74 28 70 50 61 72 73 65 2c 20 70 4d 57 69  ist(pParse, pMWi
6400: 6e 2c 20 70 53 72 63 2c 20 70 2d 3e 70 45 4c 69  n, pSrc, p->pELi
6410: 73 74 2c 20 26 70 53 75 62 6c 69 73 74 29 3b 0a  st, &pSublist);.
6420: 20 20 20 20 73 65 6c 65 63 74 57 69 6e 64 6f 77      selectWindow
6430: 52 65 77 72 69 74 65 45 4c 69 73 74 28 70 50 61  RewriteEList(pPa
6440: 72 73 65 2c 20 70 4d 57 69 6e 2c 20 70 53 72 63  rse, pMWin, pSrc
6450: 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 26  , p->pOrderBy, &
6460: 70 53 75 62 6c 69 73 74 29 3b 0a 20 20 20 20 70  pSublist);.    p
6470: 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c  MWin->nBufferCol
6480: 20 3d 20 28 70 53 75 62 6c 69 73 74 20 3f 20 70   = (pSublist ? p
6490: 53 75 62 6c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  Sublist->nExpr :
64a0: 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 70 70   0);..    /* App
64b0: 65 6e 64 20 74 68 65 20 50 41 52 54 49 54 49 4f  end the PARTITIO
64c0: 4e 20 42 59 20 61 6e 64 20 4f 52 44 45 52 20 42  N BY and ORDER B
64d0: 59 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 6f  Y expressions to
64e0: 20 74 68 65 20 74 6f 20 74 68 65 20 0a 20 20 20   the to the .   
64f0: 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 20 65   ** sub-select e
6500: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20  xpression list. 
6510: 54 68 65 79 20 61 72 65 20 72 65 71 75 69 72 65  They are require
6520: 64 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20  d to figure out 
6530: 77 68 65 72 65 20 0a 20 20 20 20 2a 2a 20 62 6f  where .    ** bo
6540: 75 6e 64 61 72 69 65 73 20 66 6f 72 20 70 61 72  undaries for par
6550: 74 69 74 69 6f 6e 73 20 61 6e 64 20 73 65 74 73  titions and sets
6560: 20 6f 66 20 70 65 65 72 20 72 6f 77 73 20 6c 69   of peer rows li
6570: 65 2e 20 20 2a 2f 0a 20 20 20 20 70 53 75 62 6c  e.  */.    pSubl
6580: 69 73 74 20 3d 20 65 78 70 72 4c 69 73 74 41 70  ist = exprListAp
6590: 70 65 6e 64 4c 69 73 74 28 70 50 61 72 73 65 2c  pendList(pParse,
65a0: 20 70 53 75 62 6c 69 73 74 2c 20 70 4d 57 69 6e   pSublist, pMWin
65b0: 2d 3e 70 50 61 72 74 69 74 69 6f 6e 29 3b 0a 20  ->pPartition);. 
65c0: 20 20 20 70 53 75 62 6c 69 73 74 20 3d 20 65 78     pSublist = ex
65d0: 70 72 4c 69 73 74 41 70 70 65 6e 64 4c 69 73 74  prListAppendList
65e0: 28 70 50 61 72 73 65 2c 20 70 53 75 62 6c 69 73  (pParse, pSublis
65f0: 74 2c 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72  t, pMWin->pOrder
6600: 42 79 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 70 70  By);..    /* App
6610: 65 6e 64 20 74 68 65 20 61 72 67 75 6d 65 6e 74  end the argument
6620: 73 20 70 61 73 73 65 64 20 74 6f 20 65 61 63 68  s passed to each
6630: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
6640: 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 73   to the.    ** s
6650: 75 62 2d 73 65 6c 65 63 74 20 65 78 70 72 65 73  ub-select expres
6660: 73 69 6f 6e 20 6c 69 73 74 2e 20 41 6c 73 6f 20  sion list. Also 
6670: 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 72 65 67  allocate two reg
6680: 69 73 74 65 72 73 20 66 6f 72 20 65 61 63 68 0a  isters for each.
6690: 20 20 20 20 2a 2a 20 77 69 6e 64 6f 77 20 66 75      ** window fu
66a0: 6e 63 74 69 6f 6e 20 2d 20 6f 6e 65 20 66 6f 72  nction - one for
66b0: 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72   the accumulator
66c0: 2c 20 61 6e 6f 74 68 65 72 20 66 6f 72 20 69 6e  , another for in
66d0: 74 65 72 69 6d 0a 20 20 20 20 2a 2a 20 72 65 73  terim.    ** res
66e0: 75 6c 74 73 2e 20 20 2a 2f 0a 20 20 20 20 66 6f  ults.  */.    fo
66f0: 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57  r(pWin=pMWin; pW
6700: 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70  in; pWin=pWin->p
6710: 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 20 20  NextWin){.      
6720: 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 20 3d 20  pWin->iArgCol = 
6730: 28 70 53 75 62 6c 69 73 74 20 3f 20 70 53 75 62  (pSublist ? pSub
6740: 6c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29  list->nExpr : 0)
6750: 3b 0a 20 20 20 20 20 20 70 53 75 62 6c 69 73 74  ;.      pSublist
6760: 20 3d 20 65 78 70 72 4c 69 73 74 41 70 70 65 6e   = exprListAppen
6770: 64 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53  dList(pParse, pS
6780: 75 62 6c 69 73 74 2c 20 70 57 69 6e 2d 3e 70 4f  ublist, pWin->pO
6790: 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  wner->x.pList);.
67a0: 20 20 20 20 20 20 69 66 28 20 70 57 69 6e 2d 3e        if( pWin->
67b0: 70 46 69 6c 74 65 72 20 29 7b 0a 20 20 20 20 20  pFilter ){.     
67c0: 20 20 20 45 78 70 72 20 2a 70 46 69 6c 74 65 72     Expr *pFilter
67d0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
67e0: 70 28 64 62 2c 20 70 57 69 6e 2d 3e 70 46 69 6c  p(db, pWin->pFil
67f0: 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ter, 0);.       
6800: 20 70 53 75 62 6c 69 73 74 20 3d 20 73 71 6c 69   pSublist = sqli
6810: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
6820: 64 28 70 50 61 72 73 65 2c 20 70 53 75 62 6c 69  d(pParse, pSubli
6830: 73 74 2c 20 70 46 69 6c 74 65 72 29 3b 0a 20 20  st, pFilter);.  
6840: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 57 69 6e      }.      pWin
6850: 2d 3e 72 65 67 41 63 63 75 6d 20 3d 20 2b 2b 70  ->regAccum = ++p
6860: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
6870: 20 20 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75     pWin->regResu
6880: 6c 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  lt = ++pParse->n
6890: 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Mem;.      sqlit
68a0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
68b0: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e  OP_Null, 0, pWin
68c0: 2d 3e 72 65 67 41 63 63 75 6d 29 3b 0a 20 20 20  ->regAccum);.   
68d0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
68e0: 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
68f0: 42 59 20 6f 72 20 50 41 52 54 49 54 49 4f 4e 20  BY or PARTITION 
6900: 42 59 20 63 6c 61 75 73 65 2c 20 61 6e 64 20 74  BY clause, and t
6910: 68 65 20 77 69 6e 64 6f 77 0a 20 20 20 20 2a 2a  he window.    **
6920: 20 66 75 6e 63 74 69 6f 6e 20 61 63 63 65 70 74   function accept
6930: 73 20 7a 65 72 6f 20 61 72 67 75 6d 65 6e 74 73  s zero arguments
6940: 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  , and there are 
6950: 6e 6f 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 73  no other columns
6960: 0a 20 20 20 20 2a 2a 20 73 65 6c 65 63 74 65 64  .    ** selected
6970: 20 28 65 2e 67 2e 20 22 53 45 4c 45 43 54 20 72   (e.g. "SELECT r
6980: 6f 77 5f 6e 75 6d 62 65 72 28 29 20 4f 56 45 52  ow_number() OVER
6990: 20 28 29 20 46 52 4f 4d 20 74 31 22 29 2c 20 69   () FROM t1"), i
69a0: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 0a 20 20  t is possible.  
69b0: 20 20 2a 2a 20 74 68 61 74 20 70 53 75 62 6c 69    ** that pSubli
69c0: 73 74 20 69 73 20 73 74 69 6c 6c 20 4e 55 4c 4c  st is still NULL
69d0: 20 68 65 72 65 2e 20 41 64 64 20 61 20 63 6f 6e   here. Add a con
69e0: 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  stant expression
69f0: 20 68 65 72 65 20 74 6f 20 0a 20 20 20 20 2a 2a   here to .    **
6a00: 20 6b 65 65 70 20 65 76 65 72 79 74 68 69 6e 67   keep everything
6a10: 20 6c 65 67 61 6c 20 69 6e 20 74 68 69 73 20 63   legal in this c
6a20: 61 73 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  ase. .    */.   
6a30: 20 69 66 28 20 70 53 75 62 6c 69 73 74 3d 3d 30   if( pSublist==0
6a40: 20 29 7b 0a 20 20 20 20 20 20 70 53 75 62 6c 69   ){.      pSubli
6a50: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
6a60: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
6a70: 65 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  e, 0, .         
6a80: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
6a90: 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52  c(db, TK_INTEGER
6aa0: 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b  , &sqlite3IntTok
6ab0: 65 6e 73 5b 30 5d 2c 20 30 29 0a 20 20 20 20 20  ens[0], 0).     
6ac0: 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70   );.    }..    p
6ad0: 53 75 62 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  Sub = sqlite3Sel
6ae0: 65 63 74 4e 65 77 28 0a 20 20 20 20 20 20 20 20  ectNew(.        
6af0: 70 50 61 72 73 65 2c 20 70 53 75 62 6c 69 73 74  pParse, pSublist
6b00: 2c 20 70 53 72 63 2c 20 70 57 68 65 72 65 2c 20  , pSrc, pWhere, 
6b10: 70 47 72 6f 75 70 42 79 2c 20 70 48 61 76 69 6e  pGroupBy, pHavin
6b20: 67 2c 20 70 53 6f 72 74 2c 20 30 2c 20 30 0a 20  g, pSort, 0, 0. 
6b30: 20 20 20 29 3b 0a 20 20 20 20 70 2d 3e 70 53 72     );.    p->pSr
6b40: 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
6b50: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
6b60: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69   0, 0, 0);.    i
6b70: 66 28 20 70 2d 3e 70 53 72 63 20 29 7b 0a 20 20  f( p->pSrc ){.  
6b80: 20 20 20 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30      p->pSrc->a[0
6b90: 5d 2e 70 53 65 6c 65 63 74 20 3d 20 70 53 75 62  ].pSelect = pSub
6ba0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
6bb0: 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
6bc0: 6f 72 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ors(pParse, p->p
6bd0: 53 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Src);.      if( 
6be0: 73 71 6c 69 74 65 33 45 78 70 61 6e 64 53 75 62  sqlite3ExpandSub
6bf0: 71 75 65 72 79 28 70 50 61 72 73 65 2c 20 26 70  query(pParse, &p
6c00: 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 29 20 29 7b  ->pSrc->a[0]) ){
6c10: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
6c20: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
6c30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6c40: 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
6c50: 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a  |= SF_Expanded;.
6c60: 20 20 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c          p->selFl
6c70: 61 67 73 20 26 3d 20 7e 53 46 5f 41 67 67 72 65  ags &= ~SF_Aggre
6c80: 67 61 74 65 3b 0a 20 20 20 20 20 20 20 20 73 71  gate;.        sq
6c90: 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28  lite3SelectPrep(
6ca0: 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 30 29  pParse, pSub, 0)
6cb0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
6cc0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6cd0: 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
6ce0: 65 6d 65 72 61 6c 2c 20 70 4d 57 69 6e 2d 3e 69  emeral, pMWin->i
6cf0: 45 70 68 43 73 72 2c 20 70 53 75 62 6c 69 73 74  EphCsr, pSublist
6d00: 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
6d10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6d20: 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c  2(v, OP_OpenDup,
6d30: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2b   pMWin->iEphCsr+
6d40: 31 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  1, pMWin->iEphCs
6d50: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
6d60: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6d70: 50 5f 4f 70 65 6e 44 75 70 2c 20 70 4d 57 69 6e  P_OpenDup, pMWin
6d80: 2d 3e 69 45 70 68 43 73 72 2b 32 2c 20 70 4d 57  ->iEphCsr+2, pMW
6d90: 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20  in->iEphCsr);.  
6da0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6db0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
6dc0: 44 75 70 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  Dup, pMWin->iEph
6dd0: 43 73 72 2b 33 2c 20 70 4d 57 69 6e 2d 3e 69 45  Csr+3, pMWin->iE
6de0: 70 68 43 73 72 29 3b 0a 20 20 20 20 7d 65 6c 73  phCsr);.    }els
6df0: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
6e00: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
6e10: 20 70 53 75 62 29 3b 0a 20 20 20 20 7d 0a 20 20   pSub);.    }.  
6e20: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
6e30: 46 61 69 6c 65 64 20 29 20 72 63 20 3d 20 53 51  Failed ) rc = SQ
6e40: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
6e50: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
6e60: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
6e70: 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 70 61  Window object pa
6e80: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
6e90: 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  nd argument..*/.
6ea0: 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64  void sqlite3Wind
6eb0: 6f 77 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  owDelete(sqlite3
6ec0: 20 2a 64 62 2c 20 57 69 6e 64 6f 77 20 2a 70 29   *db, Window *p)
6ed0: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
6ee0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
6ef0: 74 65 28 64 62 2c 20 70 2d 3e 70 46 69 6c 74 65  te(db, p->pFilte
6f00: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  r);.    sqlite3E
6f10: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
6f20: 2c 20 70 2d 3e 70 50 61 72 74 69 74 69 6f 6e 29  , p->pPartition)
6f30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
6f40: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
6f50: 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
6f60: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
6f70: 65 74 65 28 64 62 2c 20 70 2d 3e 70 45 6e 64 29  ete(db, p->pEnd)
6f80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
6f90: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
6fa0: 53 74 61 72 74 29 3b 0a 20 20 20 20 73 71 6c 69  Start);.    sqli
6fb0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
6fc0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
6fd0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
6fe0: 2d 3e 7a 42 61 73 65 29 3b 0a 20 20 20 20 73 71  ->zBase);.    sq
6ff0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
7000: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
7010: 20 46 72 65 65 20 74 68 65 20 6c 69 6e 6b 65 64   Free the linked
7020: 20 6c 69 73 74 20 6f 66 20 57 69 6e 64 6f 77 20   list of Window 
7030: 6f 62 6a 65 63 74 73 20 73 74 61 72 74 69 6e 67  objects starting
7040: 20 61 74 20 74 68 65 20 73 65 63 6f 6e 64 20 61   at the second a
7050: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  rgument..*/.void
7060: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4c 69   sqlite3WindowLi
7070: 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  stDelete(sqlite3
7080: 20 2a 64 62 2c 20 57 69 6e 64 6f 77 20 2a 70 29   *db, Window *p)
7090: 7b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  {.  while( p ){.
70a0: 20 20 20 20 57 69 6e 64 6f 77 20 2a 70 4e 65 78      Window *pNex
70b0: 74 20 3d 20 70 2d 3e 70 4e 65 78 74 57 69 6e 3b  t = p->pNextWin;
70c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64  .    sqlite3Wind
70d0: 6f 77 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b  owDelete(db, p);
70e0: 0a 20 20 20 20 70 20 3d 20 70 4e 65 78 74 3b 0a  .    p = pNext;.
70f0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65    }.}../*.** The
7100: 20 61 72 67 75 6d 65 6e 74 20 65 78 70 72 65 73   argument expres
7110: 73 69 6f 6e 20 69 73 20 61 6e 20 50 52 45 43 45  sion is an PRECE
7120: 44 49 4e 47 20 6f 72 20 46 4f 4c 4c 4f 57 49 4e  DING or FOLLOWIN
7130: 47 20 6f 66 66 73 65 74 2e 20 20 54 68 65 0a 2a  G offset.  The.*
7140: 2a 20 76 61 6c 75 65 20 73 68 6f 75 6c 64 20 62  * value should b
7150: 65 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65  e a non-negative
7160: 20 69 6e 74 65 67 65 72 2e 20 20 49 66 20 74 68   integer.  If th
7170: 65 20 76 61 6c 75 65 20 69 73 20 6e 6f 74 20 61  e value is not a
7180: 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 2c 20 63 68  .** constant, ch
7190: 61 6e 67 65 20 69 74 20 74 6f 20 4e 55 4c 4c 2e  ange it to NULL.
71a0: 20 20 54 68 65 20 66 61 63 74 20 74 68 61 74 20    The fact that 
71b0: 69 74 20 69 73 20 74 68 65 6e 20 61 20 6e 6f 6e  it is then a non
71c0: 2d 6e 65 67 61 74 69 76 65 0a 2a 2a 20 69 6e 74  -negative.** int
71d0: 65 67 65 72 20 77 69 6c 6c 20 62 65 20 63 61 75  eger will be cau
71e0: 67 68 74 20 6c 61 74 65 72 2e 20 20 42 75 74 20  ght later.  But 
71f0: 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  it is important 
7200: 6e 6f 74 20 74 6f 20 6c 65 61 76 65 0a 2a 2a 20  not to leave.** 
7210: 76 61 72 69 61 62 6c 65 20 76 61 6c 75 65 73 20  variable values 
7220: 69 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  in the expressio
7230: 6e 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69  n tree..*/.stati
7240: 63 20 45 78 70 72 20 2a 73 71 6c 69 74 65 33 57  c Expr *sqlite3W
7250: 69 6e 64 6f 77 4f 66 66 73 65 74 45 78 70 72 28  indowOffsetExpr(
7260: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
7270: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69  xpr *pExpr){.  i
7280: 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 45 78 70  f( 0==sqlite3Exp
7290: 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 78 70  rIsConstant(pExp
72a0: 72 29 20 29 7b 0a 20 20 20 20 69 66 28 20 49 4e  r) ){.    if( IN
72b0: 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29  _RENAME_OBJECT )
72c0: 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 45 78   sqlite3RenameEx
72d0: 70 72 55 6e 6d 61 70 28 70 50 61 72 73 65 2c 20  prUnmap(pParse, 
72e0: 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69  pExpr);.    sqli
72f0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50  te3ExprDelete(pP
7300: 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 29  arse->db, pExpr)
7310: 3b 0a 20 20 20 20 70 45 78 70 72 20 3d 20 73 71  ;.    pExpr = sq
7320: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70  lite3ExprAlloc(p
7330: 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 4e 55  Parse->db, TK_NU
7340: 4c 4c 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  LL, 0, 0);.  }. 
7350: 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d   return pExpr;.}
7360: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
7370: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 6e 65   and return a ne
7380: 77 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20  w Window object 
7390: 64 65 73 63 72 69 62 69 6e 67 20 61 20 57 69 6e  describing a Win
73a0: 64 6f 77 20 44 65 66 69 6e 69 74 69 6f 6e 2e 0a  dow Definition..
73b0: 2a 2f 0a 57 69 6e 64 6f 77 20 2a 73 71 6c 69 74  */.Window *sqlit
73c0: 65 33 57 69 6e 64 6f 77 41 6c 6c 6f 63 28 0a 20  e3WindowAlloc(. 
73d0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
73e0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
73f0: 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 65  ntext */.  int e
7400: 54 79 70 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Type,        /* 
7410: 46 72 61 6d 65 20 74 79 70 65 2e 20 54 4b 5f 52  Frame type. TK_R
7420: 41 4e 47 45 20 6f 72 20 54 4b 5f 52 4f 57 53 20  ANGE or TK_ROWS 
7430: 2a 2f 0a 20 20 69 6e 74 20 65 53 74 61 72 74 2c  */.  int eStart,
7440: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20         /* Start 
7450: 74 79 70 65 3a 20 43 55 52 52 45 4e 54 2c 20 50  type: CURRENT, P
7460: 52 45 43 45 44 49 4e 47 2c 20 46 4f 4c 4c 4f 57  RECEDING, FOLLOW
7470: 49 4e 47 2c 20 55 4e 42 4f 55 4e 44 45 44 20 2a  ING, UNBOUNDED *
7480: 2f 0a 20 20 45 78 70 72 20 2a 70 53 74 61 72 74  /.  Expr *pStart
7490: 2c 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 77  ,     /* Start w
74a0: 69 6e 64 6f 77 20 73 69 7a 65 20 69 66 20 54 4b  indow size if TK
74b0: 5f 50 52 45 43 45 44 49 4e 47 20 6f 72 20 46 4f  _PRECEDING or FO
74c0: 4c 4c 4f 57 49 4e 47 20 2a 2f 0a 20 20 69 6e 74  LLOWING */.  int
74d0: 20 65 45 6e 64 2c 20 20 20 20 20 20 20 20 20 2f   eEnd,         /
74e0: 2a 20 45 6e 64 20 74 79 70 65 3a 20 43 55 52 52  * End type: CURR
74f0: 45 4e 54 2c 20 46 4f 4c 4c 4f 57 49 4e 47 2c 20  ENT, FOLLOWING, 
7500: 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 2c 20 50 52  TK_UNBOUNDED, PR
7510: 45 43 45 44 49 4e 47 20 2a 2f 0a 20 20 45 78 70  ECEDING */.  Exp
7520: 72 20 2a 70 45 6e 64 20 20 20 20 20 20 20 20 2f  r *pEnd        /
7530: 2a 20 45 6e 64 20 77 69 6e 64 6f 77 20 73 69 7a  * End window siz
7540: 65 20 69 66 20 54 4b 5f 46 4f 4c 4c 4f 57 49 4e  e if TK_FOLLOWIN
7550: 47 20 6f 72 20 50 52 45 43 45 44 49 4e 47 20 2a  G or PRECEDING *
7560: 2f 0a 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70  /.){.  Window *p
7570: 57 69 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 62  Win = 0;.  int b
7580: 49 6d 70 6c 69 63 69 74 46 72 61 6d 65 20 3d 20  ImplicitFrame = 
7590: 30 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 72 20  0;..  /* Parser 
75a0: 61 73 73 75 72 65 73 20 74 68 65 20 66 6f 6c 6c  assures the foll
75b0: 6f 77 69 6e 67 3a 20 2a 2f 0a 20 20 61 73 73 65  owing: */.  asse
75c0: 72 74 28 20 65 54 79 70 65 3d 3d 30 20 7c 7c 20  rt( eType==0 || 
75d0: 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 20  eType==TK_RANGE 
75e0: 7c 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 52 4f 57  || eType==TK_ROW
75f0: 53 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 47  S || eType==TK_G
7600: 52 4f 55 50 53 20 29 3b 0a 20 20 61 73 73 65 72  ROUPS );.  asser
7610: 74 28 20 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55  t( eStart==TK_CU
7620: 52 52 45 4e 54 20 7c 7c 20 65 53 74 61 72 74 3d  RRENT || eStart=
7630: 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 0a 20 20  =TK_PRECEDING.  
7640: 20 20 20 20 20 20 20 20 20 7c 7c 20 65 53 74 61           || eSta
7650: 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  rt==TK_UNBOUNDED
7660: 20 7c 7c 20 65 53 74 61 72 74 3d 3d 54 4b 5f 46   || eStart==TK_F
7670: 4f 4c 4c 4f 57 49 4e 47 20 29 3b 0a 20 20 61 73  OLLOWING );.  as
7680: 73 65 72 74 28 20 65 45 6e 64 3d 3d 54 4b 5f 43  sert( eEnd==TK_C
7690: 55 52 52 45 4e 54 20 7c 7c 20 65 45 6e 64 3d 3d  URRENT || eEnd==
76a0: 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20 20  TK_FOLLOWING.   
76b0: 20 20 20 20 20 20 20 20 7c 7c 20 65 45 6e 64 3d          || eEnd=
76c0: 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 7c 7c  =TK_UNBOUNDED ||
76d0: 20 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44   eEnd==TK_PRECED
76e0: 49 4e 47 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ING );.  assert(
76f0: 20 28 65 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45   (eStart==TK_PRE
7700: 43 45 44 49 4e 47 20 7c 7c 20 65 53 74 61 72 74  CEDING || eStart
7710: 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 29 3d  ==TK_FOLLOWING)=
7720: 3d 28 70 53 74 61 72 74 21 3d 30 29 20 29 3b 0a  =(pStart!=0) );.
7730: 20 20 61 73 73 65 72 74 28 20 28 65 45 6e 64 3d    assert( (eEnd=
7740: 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 7c 7c  =TK_FOLLOWING ||
7750: 20 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44   eEnd==TK_PRECED
7760: 49 4e 47 29 3d 3d 28 70 45 6e 64 21 3d 30 29 20  ING)==(pEnd!=0) 
7770: 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d  );..  if( eType=
7780: 3d 30 20 29 7b 0a 20 20 20 20 62 49 6d 70 6c 69  =0 ){.    bImpli
7790: 63 69 74 46 72 61 6d 65 20 3d 20 31 3b 0a 20 20  citFrame = 1;.  
77a0: 20 20 65 54 79 70 65 20 3d 20 54 4b 5f 52 41 4e    eType = TK_RAN
77b0: 47 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64  GE;.  }..  /* Ad
77c0: 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 0a  ditionally, the.
77d0: 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 62 6f    ** starting bo
77e0: 75 6e 64 61 72 79 20 74 79 70 65 20 6d 61 79 20  undary type may 
77f0: 6e 6f 74 20 6f 63 63 75 72 20 65 61 72 6c 69 65  not occur earlie
7800: 72 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  r in the followi
7810: 6e 67 20 6c 69 73 74 20 74 68 61 6e 0a 20 20 2a  ng list than.  *
7820: 2a 20 74 68 65 20 65 6e 64 69 6e 67 20 62 6f 75  * the ending bou
7830: 6e 64 61 72 79 20 74 79 70 65 3a 0a 20 20 2a 2a  ndary type:.  **
7840: 0a 20 20 2a 2a 20 20 20 55 4e 42 4f 55 4e 44 45  .  **   UNBOUNDE
7850: 44 20 50 52 45 43 45 44 49 4e 47 0a 20 20 2a 2a  D PRECEDING.  **
7860: 20 20 20 3c 65 78 70 72 3e 20 50 52 45 43 45 44     <expr> PRECED
7870: 49 4e 47 0a 20 20 2a 2a 20 20 20 43 55 52 52 45  ING.  **   CURRE
7880: 4e 54 20 52 4f 57 0a 20 20 2a 2a 20 20 20 3c 65  NT ROW.  **   <e
7890: 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 20  xpr> FOLLOWING. 
78a0: 20 2a 2a 20 20 20 55 4e 42 4f 55 4e 44 45 44 20   **   UNBOUNDED 
78b0: 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20 2a 2a 0a 20  FOLLOWING.  **. 
78c0: 20 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 65   ** The parser e
78d0: 6e 73 75 72 65 73 20 74 68 61 74 20 22 55 4e 42  nsures that "UNB
78e0: 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47  OUNDED PRECEDING
78f0: 22 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  " cannot be used
7900: 20 61 73 20 61 6e 20 65 6e 64 69 6e 67 0a 20 20   as an ending.  
7910: 2a 2a 20 62 6f 75 6e 64 61 72 79 2c 20 61 6e 64  ** boundary, and
7920: 20 74 68 61 6e 20 22 55 4e 42 4f 55 4e 44 45 44   than "UNBOUNDED
7930: 20 46 4f 4c 4c 4f 57 49 4e 47 22 20 63 61 6e 6e   FOLLOWING" cann
7940: 6f 74 20 62 65 20 75 73 65 64 20 61 73 20 61 20  ot be used as a 
7950: 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 66 72  starting.  ** fr
7960: 61 6d 65 20 62 6f 75 6e 64 61 72 79 2e 0a 20 20  ame boundary..  
7970: 2a 2f 0a 20 20 69 66 28 20 28 65 53 74 61 72 74  */.  if( (eStart
7980: 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 26 26 20  ==TK_CURRENT && 
7990: 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49  eEnd==TK_PRECEDI
79a0: 4e 47 29 0a 20 20 20 7c 7c 20 28 65 53 74 61 72  NG).   || (eStar
79b0: 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  t==TK_FOLLOWING 
79c0: 26 26 20 28 65 45 6e 64 3d 3d 54 4b 5f 50 52 45  && (eEnd==TK_PRE
79d0: 43 45 44 49 4e 47 20 7c 7c 20 65 45 6e 64 3d 3d  CEDING || eEnd==
79e0: 54 4b 5f 43 55 52 52 45 4e 54 29 29 0a 20 20 29  TK_CURRENT)).  )
79f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
7a00: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
7a10: 6e 73 75 70 70 6f 72 74 65 64 20 66 72 61 6d 65  nsupported frame
7a20: 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 22 29   specification")
7a30: 3b 0a 20 20 20 20 67 6f 74 6f 20 77 69 6e 64 6f  ;.    goto windo
7a40: 77 41 6c 6c 6f 63 45 72 72 3b 0a 20 20 7d 0a 0a  wAllocErr;.  }..
7a50: 20 20 70 57 69 6e 20 3d 20 28 57 69 6e 64 6f 77    pWin = (Window
7a60: 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  *)sqlite3DbMallo
7a70: 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62  cZero(pParse->db
7a80: 2c 20 73 69 7a 65 6f 66 28 57 69 6e 64 6f 77 29  , sizeof(Window)
7a90: 29 3b 0a 20 20 69 66 28 20 70 57 69 6e 3d 3d 30  );.  if( pWin==0
7aa0: 20 29 20 67 6f 74 6f 20 77 69 6e 64 6f 77 41 6c   ) goto windowAl
7ab0: 6c 6f 63 45 72 72 3b 0a 20 20 70 57 69 6e 2d 3e  locErr;.  pWin->
7ac0: 65 54 79 70 65 20 3d 20 65 54 79 70 65 3b 0a 20  eType = eType;. 
7ad0: 20 70 57 69 6e 2d 3e 65 53 74 61 72 74 20 3d 20   pWin->eStart = 
7ae0: 65 53 74 61 72 74 3b 0a 20 20 70 57 69 6e 2d 3e  eStart;.  pWin->
7af0: 65 45 6e 64 20 3d 20 65 45 6e 64 3b 0a 20 20 70  eEnd = eEnd;.  p
7b00: 57 69 6e 2d 3e 62 49 6d 70 6c 69 63 69 74 46 72  Win->bImplicitFr
7b10: 61 6d 65 20 3d 20 62 49 6d 70 6c 69 63 69 74 46  ame = bImplicitF
7b20: 72 61 6d 65 3b 0a 20 20 70 57 69 6e 2d 3e 70 45  rame;.  pWin->pE
7b30: 6e 64 20 3d 20 73 71 6c 69 74 65 33 57 69 6e 64  nd = sqlite3Wind
7b40: 6f 77 4f 66 66 73 65 74 45 78 70 72 28 70 50 61  owOffsetExpr(pPa
7b50: 72 73 65 2c 20 70 45 6e 64 29 3b 0a 20 20 70 57  rse, pEnd);.  pW
7b60: 69 6e 2d 3e 70 53 74 61 72 74 20 3d 20 73 71 6c  in->pStart = sql
7b70: 69 74 65 33 57 69 6e 64 6f 77 4f 66 66 73 65 74  ite3WindowOffset
7b80: 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 53 74  Expr(pParse, pSt
7b90: 61 72 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  art);.  return p
7ba0: 57 69 6e 3b 0a 0a 77 69 6e 64 6f 77 41 6c 6c 6f  Win;..windowAllo
7bb0: 63 45 72 72 3a 0a 20 20 73 71 6c 69 74 65 33 45  cErr:.  sqlite3E
7bc0: 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65  xprDelete(pParse
7bd0: 2d 3e 64 62 2c 20 70 45 6e 64 29 3b 0a 20 20 73  ->db, pEnd);.  s
7be0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
7bf0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 74  (pParse->db, pSt
7c00: 61 72 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  art);.  return 0
7c10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63  ;.}../*.** Attac
7c20: 68 20 50 41 52 54 49 54 49 4f 4e 20 61 6e 64 20  h PARTITION and 
7c30: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73  ORDER BY clauses
7c40: 20 70 50 61 72 74 69 74 69 6f 6e 20 61 6e 64 20   pPartition and 
7c50: 70 4f 72 64 65 72 42 79 20 74 6f 20 77 69 6e 64  pOrderBy to wind
7c60: 6f 77 0a 2a 2a 20 70 57 69 6e 2e 20 41 6c 73 6f  ow.** pWin. Also
7c70: 2c 20 69 66 20 70 61 72 61 6d 65 74 65 72 20 70  , if parameter p
7c80: 42 61 73 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Base is not NULL
7c90: 2c 20 73 65 74 20 70 57 69 6e 2d 3e 7a 42 61 73  , set pWin->zBas
7ca0: 65 20 74 6f 20 74 68 65 0a 2a 2a 20 65 71 75 69  e to the.** equi
7cb0: 76 61 6c 65 6e 74 20 6e 75 6c 2d 74 65 72 6d 69  valent nul-termi
7cc0: 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2f  nated string..*/
7cd0: 0a 57 69 6e 64 6f 77 20 2a 73 71 6c 69 74 65 33  .Window *sqlite3
7ce0: 57 69 6e 64 6f 77 41 73 73 65 6d 62 6c 65 28 0a  WindowAssemble(.
7cf0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
7d00: 20 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e   .  Window *pWin
7d10: 2c 20 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  , .  ExprList *p
7d20: 50 61 72 74 69 74 69 6f 6e 2c 20 0a 20 20 45 78  Partition, .  Ex
7d30: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
7d40: 2c 20 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 61 73  , .  Token *pBas
7d50: 65 0a 29 7b 0a 20 20 69 66 28 20 70 57 69 6e 20  e.){.  if( pWin 
7d60: 29 7b 0a 20 20 20 20 70 57 69 6e 2d 3e 70 50 61  ){.    pWin->pPa
7d70: 72 74 69 74 69 6f 6e 20 3d 20 70 50 61 72 74 69  rtition = pParti
7d80: 74 69 6f 6e 3b 0a 20 20 20 20 70 57 69 6e 2d 3e  tion;.    pWin->
7d90: 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
7da0: 72 42 79 3b 0a 20 20 20 20 69 66 28 20 70 42 61  rBy;.    if( pBa
7db0: 73 65 20 29 7b 0a 20 20 20 20 20 20 70 57 69 6e  se ){.      pWin
7dc0: 2d 3e 7a 42 61 73 65 20 3d 20 73 71 6c 69 74 65  ->zBase = sqlite
7dd0: 33 44 62 53 74 72 4e 44 75 70 28 70 50 61 72 73  3DbStrNDup(pPars
7de0: 65 2d 3e 64 62 2c 20 70 42 61 73 65 2d 3e 7a 2c  e->db, pBase->z,
7df0: 20 70 42 61 73 65 2d 3e 6e 29 3b 0a 20 20 20 20   pBase->n);.    
7e00: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  }.  }else{.    s
7e10: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
7e20: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
7e30: 20 70 50 61 72 74 69 74 69 6f 6e 29 3b 0a 20 20   pPartition);.  
7e40: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
7e50: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
7e60: 64 62 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20  db, pOrderBy);. 
7e70: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 57 69 6e   }.  return pWin
7e80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e 64 6f  ;.}../*.** Windo
7e90: 77 20 2a 70 57 69 6e 20 68 61 73 20 6a 75 73 74  w *pWin has just
7ea0: 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 66 72   been created fr
7eb0: 6f 6d 20 61 20 57 49 4e 44 4f 57 20 63 6c 61 75  om a WINDOW clau
7ec0: 73 65 2e 20 54 6f 6b 6e 65 20 70 42 61 73 65 0a  se. Tokne pBase.
7ed0: 2a 2a 20 69 73 20 74 68 65 20 62 61 73 65 20 77  ** is the base w
7ee0: 69 6e 64 6f 77 2e 20 45 61 72 6c 69 65 72 20 77  indow. Earlier w
7ef0: 69 6e 64 6f 77 73 20 66 72 6f 6d 20 74 68 65 20  indows from the 
7f00: 73 61 6d 65 20 57 49 4e 44 4f 57 20 63 6c 61 75  same WINDOW clau
7f10: 73 65 20 61 72 65 0a 2a 2a 20 73 74 6f 72 65 64  se are.** stored
7f20: 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   in the linked l
7f30: 69 73 74 20 73 74 61 72 74 69 6e 67 20 61 74 20  ist starting at 
7f40: 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 2e 20  pWin->pNextWin. 
7f50: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  This function.**
7f60: 20 65 69 74 68 65 72 20 75 70 64 61 74 65 73 20   either updates 
7f70: 2a 70 57 69 6e 20 61 63 63 6f 72 64 69 6e 67 20  *pWin according 
7f80: 74 6f 20 74 68 65 20 62 61 73 65 20 73 70 65 63  to the base spec
7f90: 69 66 69 63 61 74 69 6f 6e 2c 20 6f 72 20 65 6c  ification, or el
7fa0: 73 65 0a 2a 2a 20 6c 65 61 76 65 73 20 61 6e 20  se.** leaves an 
7fb0: 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e  error in pParse.
7fc0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7fd0: 57 69 6e 64 6f 77 43 68 61 69 6e 28 50 61 72 73  WindowChain(Pars
7fe0: 65 20 2a 70 50 61 72 73 65 2c 20 57 69 6e 64 6f  e *pParse, Windo
7ff0: 77 20 2a 70 57 69 6e 2c 20 57 69 6e 64 6f 77 20  w *pWin, Window 
8000: 2a 70 4c 69 73 74 29 7b 0a 20 20 69 66 28 20 70  *pList){.  if( p
8010: 57 69 6e 2d 3e 7a 42 61 73 65 20 29 7b 0a 20 20  Win->zBase ){.  
8020: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
8030: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20  pParse->db;.    
8040: 57 69 6e 64 6f 77 20 2a 70 45 78 69 73 74 20 3d  Window *pExist =
8050: 20 77 69 6e 64 6f 77 46 69 6e 64 28 70 50 61 72   windowFind(pPar
8060: 73 65 2c 20 70 4c 69 73 74 2c 20 70 57 69 6e 2d  se, pList, pWin-
8070: 3e 7a 42 61 73 65 29 3b 0a 20 20 20 20 69 66 28  >zBase);.    if(
8080: 20 70 45 78 69 73 74 20 29 7b 0a 20 20 20 20 20   pExist ){.     
8090: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72   const char *zEr
80a0: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20  r = 0;.      /* 
80b0: 43 68 65 63 6b 20 66 6f 72 20 65 72 72 6f 72 73  Check for errors
80c0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 57   */.      if( pW
80d0: 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 29  in->pPartition )
80e0: 7b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d  {.        zErr =
80f0: 20 22 50 41 52 54 49 54 49 4f 4e 20 63 6c 61 75   "PARTITION clau
8100: 73 65 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  se";.      }else
8110: 20 69 66 28 20 70 45 78 69 73 74 2d 3e 70 4f 72   if( pExist->pOr
8120: 64 65 72 42 79 20 26 26 20 70 57 69 6e 2d 3e 70  derBy && pWin->p
8130: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
8140: 20 20 20 7a 45 72 72 20 3d 20 22 4f 52 44 45 52     zErr = "ORDER
8150: 20 42 59 20 63 6c 61 75 73 65 22 3b 0a 20 20 20   BY clause";.   
8160: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78     }else if( pEx
8170: 69 73 74 2d 3e 62 49 6d 70 6c 69 63 69 74 46 72  ist->bImplicitFr
8180: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
8190: 20 20 7a 45 72 72 20 3d 20 22 66 72 61 6d 65 20    zErr = "frame 
81a0: 73 70 65 63 69 66 69 63 61 74 69 6f 6e 22 3b 0a  specification";.
81b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
81c0: 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 20 20  ( zErr ){.      
81d0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
81e0: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
81f0: 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 6f         "cannot o
8200: 76 65 72 72 69 64 65 20 25 73 20 6f 66 20 77 69  verride %s of wi
8210: 6e 64 6f 77 3a 20 25 73 22 2c 20 7a 45 72 72 2c  ndow: %s", zErr,
8220: 20 70 57 69 6e 2d 3e 7a 42 61 73 65 0a 20 20 20   pWin->zBase.   
8230: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 65       );.      }e
8240: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 57 69  lse{.        pWi
8250: 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 3d 20  n->pPartition = 
8260: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
8270: 75 70 28 64 62 2c 20 70 45 78 69 73 74 2d 3e 70  up(db, pExist->p
8280: 50 61 72 74 69 74 69 6f 6e 2c 20 30 29 3b 0a 20  Partition, 0);. 
8290: 20 20 20 20 20 20 20 69 66 28 20 70 45 78 69 73         if( pExis
82a0: 74 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  t->pOrderBy ){. 
82b0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
82c0: 20 70 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 3d   pWin->pOrderBy=
82d0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
82e0: 70 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pWin->pOrderBy =
82f0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
8300: 44 75 70 28 64 62 2c 20 70 45 78 69 73 74 2d 3e  Dup(db, pExist->
8310: 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 20 20  pOrderBy, 0);.  
8320: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8330: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
8340: 2c 20 70 57 69 6e 2d 3e 7a 42 61 73 65 29 3b 0a  , pWin->zBase);.
8350: 20 20 20 20 20 20 20 20 70 57 69 6e 2d 3e 7a 42          pWin->zB
8360: 61 73 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ase = 0;.      }
8370: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
8380: 0a 2a 2a 20 41 74 74 61 63 68 20 77 69 6e 64 6f  .** Attach windo
8390: 77 20 6f 62 6a 65 63 74 20 70 57 69 6e 20 74 6f  w object pWin to
83a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 2e 0a 2a   expression p..*
83b0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69  /.void sqlite3Wi
83c0: 6e 64 6f 77 41 74 74 61 63 68 28 50 61 72 73 65  ndowAttach(Parse
83d0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
83e0: 70 2c 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 29  p, Window *pWin)
83f0: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
8400: 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d   assert( p->op==
8410: 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  TK_FUNCTION );. 
8420: 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69     /* This routi
8430: 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  ne is only calle
8440: 64 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 72  d for the parser
8450: 2e 20 20 49 66 20 70 57 69 6e 20 77 61 73 20 6e  .  If pWin was n
8460: 6f 74 0a 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61  ot.    ** alloca
8470: 74 65 64 20 64 75 65 20 74 6f 20 61 6e 20 4f 4f  ted due to an OO
8480: 4d 2c 20 74 68 65 6e 20 74 68 65 20 70 61 72 73  M, then the pars
8490: 65 72 20 77 6f 75 6c 64 20 66 61 69 6c 20 62 65  er would fail be
84a0: 66 6f 72 65 20 65 76 65 72 0a 20 20 20 20 2a 2a  fore ever.    **
84b0: 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72   invoking this r
84c0: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 69 66  outine */.    if
84d0: 28 20 41 4c 57 41 59 53 28 70 57 69 6e 29 20 29  ( ALWAYS(pWin) )
84e0: 7b 0a 20 20 20 20 20 20 70 2d 3e 79 2e 70 57 69  {.      p->y.pWi
84f0: 6e 20 3d 20 70 57 69 6e 3b 0a 20 20 20 20 20 20  n = pWin;.      
8500: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
8510: 70 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 3b 0a  p, EP_WinFunc);.
8520: 20 20 20 20 20 20 70 57 69 6e 2d 3e 70 4f 77 6e        pWin->pOwn
8530: 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 69 66  er = p;.      if
8540: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ( p->flags & EP_
8550: 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
8560: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8570: 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
8580: 20 20 20 20 20 20 20 22 44 49 53 54 49 4e 43 54         "DISTINCT
8590: 20 69 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 65   is not supporte
85a0: 64 20 66 6f 72 20 77 69 6e 64 6f 77 20 66 75 6e  d for window fun
85b0: 63 74 69 6f 6e 73 22 29 3b 0a 20 20 20 20 20 20  ctions");.      
85c0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
85d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64  .    sqlite3Wind
85e0: 6f 77 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  owDelete(pParse-
85f0: 3e 64 62 2c 20 70 57 69 6e 29 3b 0a 20 20 7d 0a  >db, pWin);.  }.
8600: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
8610: 30 20 69 66 20 74 68 65 20 74 77 6f 20 77 69 6e  0 if the two win
8620: 64 6f 77 20 6f 62 6a 65 63 74 73 20 61 72 65 20  dow objects are 
8630: 69 64 65 6e 74 69 63 61 6c 2c 20 6f 72 20 6e 6f  identical, or no
8640: 6e 2d 7a 65 72 6f 20 6f 74 68 65 72 77 69 73 65  n-zero otherwise
8650: 2e 0a 2a 2a 20 49 64 65 6e 74 69 63 61 6c 20 77  ..** Identical w
8660: 69 6e 64 6f 77 20 6f 62 6a 65 63 74 73 20 63 61  indow objects ca
8670: 6e 20 62 65 20 70 72 6f 63 65 73 73 65 64 20 69  n be processed i
8680: 6e 20 61 20 73 69 6e 67 6c 65 20 73 63 61 6e 2e  n a single scan.
8690: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57  .*/.int sqlite3W
86a0: 69 6e 64 6f 77 43 6f 6d 70 61 72 65 28 50 61 72  indowCompare(Par
86b0: 73 65 20 2a 70 50 61 72 73 65 2c 20 57 69 6e 64  se *pParse, Wind
86c0: 6f 77 20 2a 70 31 2c 20 57 69 6e 64 6f 77 20 2a  ow *p1, Window *
86d0: 70 32 29 7b 0a 20 20 69 66 28 20 70 31 2d 3e 65  p2){.  if( p1->e
86e0: 54 79 70 65 21 3d 70 32 2d 3e 65 54 79 70 65 20  Type!=p2->eType 
86f0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
8700: 28 20 70 31 2d 3e 65 53 74 61 72 74 21 3d 70 32  ( p1->eStart!=p2
8710: 2d 3e 65 53 74 61 72 74 20 29 20 72 65 74 75 72  ->eStart ) retur
8720: 6e 20 31 3b 0a 20 20 69 66 28 20 70 31 2d 3e 65  n 1;.  if( p1->e
8730: 45 6e 64 21 3d 70 32 2d 3e 65 45 6e 64 20 29 20  End!=p2->eEnd ) 
8740: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
8750: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
8760: 72 65 28 70 50 61 72 73 65 2c 20 70 31 2d 3e 70  re(pParse, p1->p
8770: 53 74 61 72 74 2c 20 70 32 2d 3e 70 53 74 61 72  Start, p2->pStar
8780: 74 2c 20 2d 31 29 20 29 20 72 65 74 75 72 6e 20  t, -1) ) return 
8790: 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
87a0: 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72  ExprCompare(pPar
87b0: 73 65 2c 20 70 31 2d 3e 70 45 6e 64 2c 20 70 32  se, p1->pEnd, p2
87c0: 2d 3e 70 45 6e 64 2c 20 2d 31 29 20 29 20 72 65  ->pEnd, -1) ) re
87d0: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
87e0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d  lite3ExprListCom
87f0: 70 61 72 65 28 70 31 2d 3e 70 50 61 72 74 69 74  pare(p1->pPartit
8800: 69 6f 6e 2c 20 70 32 2d 3e 70 50 61 72 74 69 74  ion, p2->pPartit
8810: 69 6f 6e 2c 20 2d 31 29 20 29 20 72 65 74 75 72  ion, -1) ) retur
8820: 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
8830: 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
8840: 65 28 70 31 2d 3e 70 4f 72 64 65 72 42 79 2c 20  e(p1->pOrderBy, 
8850: 70 32 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31  p2->pOrderBy, -1
8860: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
8870: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a  return 0;.}.../*
8880: 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c  .** This is call
8890: 65 64 20 62 79 20 63 6f 64 65 20 69 6e 20 73 65  ed by code in se
88a0: 6c 65 63 74 2e 63 20 62 65 66 6f 72 65 20 69 74  lect.c before it
88b0: 20 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 57 68   calls sqlite3Wh
88c0: 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20 74 6f  ereBegin().** to
88d0: 20 62 65 67 69 6e 20 69 74 65 72 61 74 69 6e 67   begin iterating
88e0: 20 74 68 72 6f 75 67 68 20 74 68 65 20 73 75 62   through the sub
88f0: 2d 71 75 65 72 79 20 72 65 73 75 6c 74 73 2e 20  -query results. 
8900: 49 74 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c  It is used to al
8910: 6c 6f 63 61 74 65 0a 2a 2a 20 61 6e 64 20 69 6e  locate.** and in
8920: 69 74 69 61 6c 69 7a 65 20 72 65 67 69 73 74 65  itialize registe
8930: 72 73 20 61 6e 64 20 63 75 72 73 6f 72 73 20 75  rs and cursors u
8940: 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 69  sed by sqlite3Wi
8950: 6e 64 6f 77 43 6f 64 65 53 74 65 70 28 29 2e 0a  ndowCodeStep()..
8960: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57  */.void sqlite3W
8970: 69 6e 64 6f 77 43 6f 64 65 49 6e 69 74 28 50 61  indowCodeInit(Pa
8980: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 57 69 6e  rse *pParse, Win
8990: 64 6f 77 20 2a 70 4d 57 69 6e 29 7b 0a 20 20 57  dow *pMWin){.  W
89a0: 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 56  indow *pWin;.  V
89b0: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
89c0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
89d0: 0a 20 20 69 6e 74 20 6e 50 61 72 74 20 3d 20 28  .  int nPart = (
89e0: 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f  pMWin->pPartitio
89f0: 6e 20 3f 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74  n ? pMWin->pPart
8a00: 69 74 69 6f 6e 2d 3e 6e 45 78 70 72 20 3a 20 30  ition->nExpr : 0
8a10: 29 3b 0a 20 20 6e 50 61 72 74 20 2b 3d 20 28 70  );.  nPart += (p
8a20: 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20 3f  MWin->pOrderBy ?
8a30: 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79   pMWin->pOrderBy
8a40: 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20  ->nExpr : 0);.  
8a50: 69 66 28 20 6e 50 61 72 74 20 29 7b 0a 20 20 20  if( nPart ){.   
8a60: 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 20   pMWin->regPart 
8a70: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
8a80: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
8a90: 65 6d 20 2b 3d 20 6e 50 61 72 74 3b 0a 20 20 20  em += nPart;.   
8aa0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8ab0: 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p3(v, OP_Null, 0
8ac0: 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74  , pMWin->regPart
8ad0: 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74  , pMWin->regPart
8ae0: 2b 6e 50 61 72 74 2d 31 29 3b 0a 20 20 7d 0a 0a  +nPart-1);.  }..
8af0: 20 20 70 4d 57 69 6e 2d 3e 72 65 67 46 69 72 73    pMWin->regFirs
8b00: 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
8b10: 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  em;.  sqlite3Vdb
8b20: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
8b30: 74 65 67 65 72 2c 20 31 2c 20 70 4d 57 69 6e 2d  teger, 1, pMWin-
8b40: 3e 72 65 67 46 69 72 73 74 29 3b 0a 20 20 70 4d  >regFirst);.  pM
8b50: 57 69 6e 2d 3e 72 65 67 53 69 7a 65 20 3d 20 2b  Win->regSize = +
8b60: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
8b70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8b80: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
8b90: 2c 20 30 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 53  , 0, pMWin->regS
8ba0: 69 7a 65 29 3b 0a 0a 20 20 66 6f 72 28 70 57 69  ize);..  for(pWi
8bb0: 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70  n=pMWin; pWin; p
8bc0: 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57  Win=pWin->pNextW
8bd0: 69 6e 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66  in){.    FuncDef
8be0: 20 2a 70 20 3d 20 70 57 69 6e 2d 3e 70 46 75 6e   *p = pWin->pFun
8bf0: 63 3b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 66  c;.    if( (p->f
8c00: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
8c10: 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 20 26  E_FUNC_MINMAX) &
8c20: 26 20 70 57 69 6e 2d 3e 65 53 74 61 72 74 21 3d  & pWin->eStart!=
8c30: 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a  TK_UNBOUNDED ){.
8c40: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6c        /* The inl
8c50: 69 6e 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ine versions of 
8c60: 6d 69 6e 28 29 20 61 6e 64 20 6d 61 78 28 29 20  min() and max() 
8c70: 72 65 71 75 69 72 65 20 61 20 73 69 6e 67 6c 65  require a single
8c80: 20 65 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 20   ephemeral.     
8c90: 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 33 20   ** table and 3 
8ca0: 72 65 67 69 73 74 65 72 73 2e 20 54 68 65 20 72  registers. The r
8cb0: 65 67 69 73 74 65 72 73 20 61 72 65 20 75 73 65  egisters are use
8cc0: 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  d as follows:.  
8cd0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
8ce0: 20 20 72 65 67 41 70 70 2b 30 3a 20 73 6c 6f 74    regApp+0: slot
8cf0: 20 74 6f 20 63 6f 70 79 20 6d 69 6e 28 29 2f 6d   to copy min()/m
8d00: 61 78 28 29 20 61 72 67 75 6d 65 6e 74 20 74 6f  ax() argument to
8d10: 20 66 6f 72 20 4d 61 6b 65 52 65 63 6f 72 64 0a   for MakeRecord.
8d20: 20 20 20 20 20 20 2a 2a 20 20 20 72 65 67 41 70        **   regAp
8d30: 70 2b 31 3a 20 69 6e 74 65 67 65 72 20 76 61 6c  p+1: integer val
8d40: 75 65 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72  ue used to ensur
8d50: 65 20 6b 65 79 73 20 61 72 65 20 75 6e 69 71 75  e keys are uniqu
8d60: 65 0a 20 20 20 20 20 20 2a 2a 20 20 20 72 65 67  e.      **   reg
8d70: 41 70 70 2b 32 3a 20 6f 75 74 70 75 74 20 6f 66  App+2: output of
8d80: 20 4d 61 6b 65 52 65 63 6f 72 64 0a 20 20 20 20   MakeRecord.    
8d90: 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c    */.      ExprL
8da0: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 57 69  ist *pList = pWi
8db0: 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69  n->pOwner->x.pLi
8dc0: 73 74 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66  st;.      KeyInf
8dd0: 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71  o *pKeyInfo = sq
8de0: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d  lite3KeyInfoFrom
8df0: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
8e00: 20 70 4c 69 73 74 2c 20 30 2c 20 30 29 3b 0a 20   pList, 0, 0);. 
8e10: 20 20 20 20 20 70 57 69 6e 2d 3e 63 73 72 41 70       pWin->csrAp
8e20: 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  p = pParse->nTab
8e30: 2b 2b 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e  ++;.      pWin->
8e40: 72 65 67 41 70 70 20 3d 20 70 50 61 72 73 65 2d  regApp = pParse-
8e50: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 70  >nMem+1;.      p
8e60: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 33  Parse->nMem += 3
8e70: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79  ;.      if( pKey
8e80: 49 6e 66 6f 20 26 26 20 70 57 69 6e 2d 3e 70 46  Info && pWin->pF
8e90: 75 6e 63 2d 3e 7a 4e 61 6d 65 5b 31 5d 3d 3d 27  unc->zName[1]=='
8ea0: 69 27 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  i' ){.        as
8eb0: 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  sert( pKeyInfo->
8ec0: 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 3d 3d 30  aSortOrder[0]==0
8ed0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79   );.        pKey
8ee0: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
8ef0: 5b 30 5d 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  [0] = 1;.      }
8f00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8f10: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
8f20: 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 57  penEphemeral, pW
8f30: 69 6e 2d 3e 63 73 72 41 70 70 2c 20 32 29 3b 0a  in->csrApp, 2);.
8f40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8f50: 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 4b 65  eAppendP4(v, pKe
8f60: 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
8f70: 4f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  O);.      sqlite
8f80: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8f90: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 57  P_Integer, 0, pW
8fa0: 69 6e 2d 3e 72 65 67 41 70 70 2b 31 29 3b 0a 20  in->regApp+1);. 
8fb0: 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66     }.    else if
8fc0: 28 20 70 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f  ( p->zName==nth_
8fd0: 76 61 6c 75 65 4e 61 6d 65 20 7c 7c 20 70 2d 3e  valueName || p->
8fe0: 7a 4e 61 6d 65 3d 3d 66 69 72 73 74 5f 76 61 6c  zName==first_val
8ff0: 75 65 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  ueName ){.      
9000: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 77 6f 20  /* Allocate two 
9010: 72 65 67 69 73 74 65 72 73 20 61 74 20 70 57 69  registers at pWi
9020: 6e 2d 3e 72 65 67 41 70 70 2e 20 54 68 65 73 65  n->regApp. These
9030: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
9040: 0a 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 20  .      ** store 
9050: 74 68 65 20 73 74 61 72 74 20 61 6e 64 20 65 6e  the start and en
9060: 64 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63  d index of the c
9070: 75 72 72 65 6e 74 20 66 72 61 6d 65 2e 20 20 2a  urrent frame.  *
9080: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
9090: 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 20 29  pMWin->iEphCsr )
90a0: 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 72 65  ;.      pWin->re
90b0: 67 41 70 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e  gApp = pParse->n
90c0: 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 70 57 69  Mem+1;.      pWi
90d0: 6e 2d 3e 63 73 72 41 70 70 20 3d 20 70 50 61 72  n->csrApp = pPar
90e0: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
90f0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
9100: 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 2;.      sqlit
9110: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
9120: 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70 57 69 6e  OP_OpenDup, pWin
9130: 2d 3e 63 73 72 41 70 70 2c 20 70 4d 57 69 6e 2d  ->csrApp, pMWin-
9140: 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 20 20 7d  >iEphCsr);.    }
9150: 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 2d  .    else if( p-
9160: 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65  >zName==leadName
9170: 20 7c 7c 20 70 2d 3e 7a 4e 61 6d 65 3d 3d 6c 61   || p->zName==la
9180: 67 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 61  gName ){.      a
9190: 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 69 45  ssert( pMWin->iE
91a0: 70 68 43 73 72 20 29 3b 0a 20 20 20 20 20 20 70  phCsr );.      p
91b0: 57 69 6e 2d 3e 63 73 72 41 70 70 20 3d 20 70 50  Win->csrApp = pP
91c0: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
91d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
91e0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
91f0: 44 75 70 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70  Dup, pWin->csrAp
9200: 70 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  p, pMWin->iEphCs
9210: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  r);.    }.  }.}.
9220: 0a 2f 2a 0a 2a 2a 20 41 20 22 50 52 45 43 45 44  ./*.** A "PRECED
9230: 49 4e 47 20 3c 65 78 70 72 3e 22 20 28 65 43 6f  ING <expr>" (eCo
9240: 6e 64 3d 3d 30 29 20 6f 72 20 22 46 4f 4c 4c 4f  nd==0) or "FOLLO
9250: 57 49 4e 47 20 3c 65 78 70 72 3e 22 20 28 65 43  WING <expr>" (eC
9260: 6f 6e 64 3d 3d 31 29 20 6f 72 20 74 68 65 0a 2a  ond==1) or the.*
9270: 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73  * value of the s
9280: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
9290: 6f 20 6e 74 68 5f 76 61 6c 75 65 28 29 20 28 65  o nth_value() (e
92a0: 43 6f 6e 64 3d 3d 32 29 20 68 61 73 20 6a 75 73  Cond==2) has jus
92b0: 74 20 62 65 65 6e 0a 2a 2a 20 65 76 61 6c 75 61  t been.** evalua
92c0: 74 65 64 20 61 6e 64 20 74 68 65 20 72 65 73 75  ted and the resu
92d0: 6c 74 20 6c 65 66 74 20 69 6e 20 72 65 67 69 73  lt left in regis
92e0: 74 65 72 20 72 65 67 2e 20 54 68 69 73 20 66 75  ter reg. This fu
92f0: 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61 74 65 73  nction generates
9300: 20 56 4d 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 63   VM.** code to c
9310: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76 61  heck that the va
9320: 6c 75 65 20 69 73 20 61 20 6e 6f 6e 2d 6e 65 67  lue is a non-neg
9330: 61 74 69 76 65 20 69 6e 74 65 67 65 72 20 61 6e  ative integer an
9340: 64 20 74 68 72 6f 77 73 20 61 6e 0a 2a 2a 20 65  d throws an.** e
9350: 78 63 65 70 74 69 6f 6e 20 69 66 20 69 74 20 69  xception if it i
9360: 73 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  s not..*/.static
9370: 20 76 6f 69 64 20 77 69 6e 64 6f 77 43 68 65 63   void windowChec
9380: 6b 49 6e 74 56 61 6c 75 65 28 50 61 72 73 65 20  kIntValue(Parse 
9390: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 72 65 67  *pParse, int reg
93a0: 2c 20 69 6e 74 20 65 43 6f 6e 64 29 7b 0a 20 20  , int eCond){.  
93b0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
93c0: 72 20 2a 61 7a 45 72 72 5b 5d 20 3d 20 7b 0a 20  r *azErr[] = {. 
93d0: 20 20 20 22 66 72 61 6d 65 20 73 74 61 72 74 69     "frame starti
93e0: 6e 67 20 6f 66 66 73 65 74 20 6d 75 73 74 20 62  ng offset must b
93f0: 65 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65  e a non-negative
9400: 20 69 6e 74 65 67 65 72 22 2c 0a 20 20 20 20 22   integer",.    "
9410: 66 72 61 6d 65 20 65 6e 64 69 6e 67 20 6f 66 66  frame ending off
9420: 73 65 74 20 6d 75 73 74 20 62 65 20 61 20 6e 6f  set must be a no
9430: 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67  n-negative integ
9440: 65 72 22 2c 0a 20 20 20 20 22 73 65 63 6f 6e 64  er",.    "second
9450: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6e 74 68   argument to nth
9460: 5f 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20 61  _value must be a
9470: 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65   positive intege
9480: 72 22 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63  r".  };.  static
9490: 20 69 6e 74 20 61 4f 70 5b 5d 20 3d 20 7b 20 4f   int aOp[] = { O
94a0: 50 5f 47 65 2c 20 4f 50 5f 47 65 2c 20 4f 50 5f  P_Ge, OP_Ge, OP_
94b0: 47 74 20 7d 3b 0a 20 20 56 64 62 65 20 2a 76 20  Gt };.  Vdbe *v 
94c0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
94d0: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
94e0: 72 65 67 5a 65 72 6f 20 3d 20 73 71 6c 69 74 65  regZero = sqlite
94f0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
9500: 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  se);.  assert( e
9510: 43 6f 6e 64 3d 3d 30 20 7c 7c 20 65 43 6f 6e 64  Cond==0 || eCond
9520: 3d 3d 31 20 7c 7c 20 65 43 6f 6e 64 3d 3d 32 20  ==1 || eCond==2 
9530: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
9540: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
9550: 65 67 65 72 2c 20 30 2c 20 72 65 67 5a 65 72 6f  eger, 0, regZero
9560: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
9570: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73  AddOp2(v, OP_Mus
9580: 74 42 65 49 6e 74 2c 20 72 65 67 2c 20 73 71 6c  tBeInt, reg, sql
9590: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
95a0: 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 56 64 62  ddr(v)+2);.  Vdb
95b0: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 65  eCoverageIf(v, e
95c0: 43 6f 6e 64 3d 3d 30 29 3b 0a 20 20 56 64 62 65  Cond==0);.  Vdbe
95d0: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 65 43  CoverageIf(v, eC
95e0: 6f 6e 64 3d 3d 31 29 3b 0a 20 20 56 64 62 65 43  ond==1);.  VdbeC
95f0: 6f 76 65 72 61 67 65 49 66 28 76 2c 20 65 43 6f  overageIf(v, eCo
9600: 6e 64 3d 3d 32 29 3b 0a 20 20 73 71 6c 69 74 65  nd==2);.  sqlite
9610: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 61  3VdbeAddOp3(v, a
9620: 4f 70 5b 65 43 6f 6e 64 5d 2c 20 72 65 67 5a 65  Op[eCond], regZe
9630: 72 6f 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  ro, sqlite3VdbeC
9640: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 2c  urrentAddr(v)+2,
9650: 20 72 65 67 29 3b 0a 20 20 56 64 62 65 43 6f 76   reg);.  VdbeCov
9660: 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c 49 66  erageNeverNullIf
9670: 28 76 2c 20 65 43 6f 6e 64 3d 3d 30 29 3b 0a 20  (v, eCond==0);. 
9680: 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76   VdbeCoverageNev
9690: 65 72 4e 75 6c 6c 49 66 28 76 2c 20 65 43 6f 6e  erNullIf(v, eCon
96a0: 64 3d 3d 31 29 3b 0a 20 20 56 64 62 65 43 6f 76  d==1);.  VdbeCov
96b0: 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c 49 66  erageNeverNullIf
96c0: 28 76 2c 20 65 43 6f 6e 64 3d 3d 32 29 3b 0a 20  (v, eCond==2);. 
96d0: 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74   sqlite3MayAbort
96e0: 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
96f0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
9700: 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45   OP_Halt, SQLITE
9710: 5f 45 52 52 4f 52 2c 20 4f 45 5f 41 62 6f 72 74  _ERROR, OE_Abort
9720: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
9730: 41 70 70 65 6e 64 50 34 28 76 2c 20 28 76 6f 69  AppendP4(v, (voi
9740: 64 2a 29 61 7a 45 72 72 5b 65 43 6f 6e 64 5d 2c  d*)azErr[eCond],
9750: 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 73   P4_STATIC);.  s
9760: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
9770: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
9780: 5a 65 72 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Zero);.}../*.** 
9790: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
97a0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70  r of arguments p
97b0: 61 73 73 65 64 20 74 6f 20 74 68 65 20 77 69 6e  assed to the win
97c0: 64 6f 77 2d 66 75 6e 63 74 69 6f 6e 20 61 73 73  dow-function ass
97d0: 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
97e0: 74 68 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65  the object passe
97f0: 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
9800: 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
9810: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
9820: 69 63 20 69 6e 74 20 77 69 6e 64 6f 77 41 72 67  ic int windowArg
9830: 43 6f 75 6e 74 28 57 69 6e 64 6f 77 20 2a 70 57  Count(Window *pW
9840: 69 6e 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  in){.  ExprList 
9850: 2a 70 4c 69 73 74 20 3d 20 70 57 69 6e 2d 3e 70  *pList = pWin->p
9860: 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  Owner->x.pList;.
9870: 20 20 72 65 74 75 72 6e 20 28 70 4c 69 73 74 20    return (pList 
9880: 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  ? pList->nExpr :
9890: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65   0);.}../*.** Ge
98a0: 6e 65 72 61 74 65 20 56 4d 20 63 6f 64 65 20 74  nerate VM code t
98b0: 6f 20 69 6e 76 6f 6b 65 20 65 69 74 68 65 72 20  o invoke either 
98c0: 78 53 74 65 70 28 29 20 28 69 66 20 62 49 6e 76  xStep() (if bInv
98d0: 65 72 73 65 20 69 73 20 30 29 20 6f 72 20 0a 2a  erse is 0) or .*
98e0: 2a 20 78 49 6e 76 65 72 73 65 20 28 69 66 20 62  * xInverse (if b
98f0: 49 6e 76 65 72 73 65 20 69 73 20 6e 6f 6e 2d 7a  Inverse is non-z
9900: 65 72 6f 29 20 66 6f 72 20 65 61 63 68 20 77 69  ero) for each wi
9910: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 69 6e  ndow function in
9920: 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20   the .** linked 
9930: 6c 69 73 74 20 73 74 61 72 74 69 6e 67 20 61 74  list starting at
9940: 20 70 4d 57 69 6e 2e 20 4f 72 2c 20 66 6f 72 20   pMWin. Or, for 
9950: 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20  built-in window 
9960: 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 74 68 61  functions.** tha
9970: 74 20 64 6f 20 6e 6f 74 20 75 73 65 20 74 68 65  t do not use the
9980: 20 73 74 61 6e 64 61 72 64 20 66 75 6e 63 74 69   standard functi
9990: 6f 6e 20 41 50 49 2c 20 67 65 6e 65 72 61 74 65  on API, generate
99a0: 20 74 68 65 20 72 65 71 75 69 72 65 64 0a 2a 2a   the required.**
99b0: 20 69 6e 6c 69 6e 65 20 56 4d 20 63 6f 64 65 2e   inline VM code.
99c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  .**.** If argume
99d0: 6e 74 20 63 73 72 20 69 73 20 67 72 65 61 74 65  nt csr is greate
99e0: 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
99f0: 74 6f 20 30 2c 20 74 68 65 6e 20 61 72 67 75 6d  to 0, then argum
9a00: 65 6e 74 20 72 65 67 20 69 73 0a 2a 2a 20 74 68  ent reg is.** th
9a10: 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72  e first register
9a20: 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20   in an array of 
9a30: 72 65 67 69 73 74 65 72 73 20 67 75 61 72 61 6e  registers guaran
9a40: 74 65 65 64 20 74 6f 20 62 65 20 6c 61 72 67 65  teed to be large
9a50: 0a 2a 2a 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  .** enough to ho
9a60: 6c 64 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  ld the array of 
9a70: 61 72 67 75 6d 65 6e 74 73 20 66 6f 72 20 65 61  arguments for ea
9a80: 63 68 20 66 75 6e 63 74 69 6f 6e 2e 20 49 6e 20  ch function. In 
9a90: 74 68 69 73 20 63 61 73 65 0a 2a 2a 20 74 68 65  this case.** the
9aa0: 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 65   arguments are e
9ab0: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
9ac0: 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66  e current row of
9ad0: 20 63 73 72 20 69 6e 74 6f 20 74 68 65 0a 2a 2a   csr into the.**
9ae0: 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   array of regist
9af0: 65 72 73 20 62 65 66 6f 72 65 20 69 6e 76 6f 6b  ers before invok
9b00: 69 6e 67 20 4f 50 5f 41 67 67 53 74 65 70 20 6f  ing OP_AggStep o
9b10: 72 20 4f 50 5f 41 67 67 49 6e 76 65 72 73 65 0a  r OP_AggInverse.
9b20: 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 63 73 72  **.** Or, if csr
9b30: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65   is less than ze
9b40: 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 61 72 72  ro, then the arr
9b50: 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ay of registers 
9b60: 61 74 20 72 65 67 20 69 73 0a 2a 2a 20 61 6c 72  at reg is.** alr
9b70: 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64 20 77  eady populated w
9b80: 69 74 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20  ith all columns 
9b90: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
9ba0: 20 72 6f 77 20 6f 66 20 74 68 65 20 73 75 62 2d   row of the sub-
9bb0: 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  query..**.** If 
9bc0: 61 72 67 75 6d 65 6e 74 20 72 65 67 50 61 72 74  argument regPart
9bd0: 53 69 7a 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Size is non-zero
9be0: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61 20 72  , then it is a r
9bf0: 65 67 69 73 74 65 72 20 63 6f 6e 74 61 69 6e 69  egister containi
9c00: 6e 67 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72  ng the.** number
9c10: 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
9c20: 63 75 72 72 65 6e 74 20 70 61 72 74 69 74 69 6f  current partitio
9c30: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
9c40: 64 20 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28  d windowAggStep(
9c50: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9c60: 2c 20 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57  , .  Window *pMW
9c70: 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  in,             
9c80: 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c       /* Linked l
9c90: 69 73 74 20 6f 66 20 77 69 6e 64 6f 77 20 66 75  ist of window fu
9ca0: 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  nctions */.  int
9cb0: 20 63 73 72 2c 20 20 20 20 20 20 20 20 20 20 20   csr,           
9cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9cd0: 52 65 61 64 20 61 72 67 75 6d 65 6e 74 73 20 66  Read arguments f
9ce0: 72 6f 6d 20 74 68 69 73 20 63 75 72 73 6f 72 20  rom this cursor 
9cf0: 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 76 65 72 73  */.  int bInvers
9d00: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
9d10: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
9d20: 69 6e 76 6f 6b 65 20 78 49 6e 76 65 72 73 65 20  invoke xInverse 
9d30: 69 6e 73 74 65 61 64 20 6f 66 20 78 53 74 65 70  instead of xStep
9d40: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 2c 20 20   */.  int reg,  
9d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d60: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
9d70: 66 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20  f registers */. 
9d80: 20 69 6e 74 20 72 65 67 50 61 72 74 53 69 7a 65   int regPartSize
9d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9da0: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 63 6f 6e   /* Register con
9db0: 74 61 69 6e 69 6e 67 20 73 69 7a 65 20 6f 66 20  taining size of 
9dc0: 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 29 7b 0a  partition */.){.
9dd0: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
9de0: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
9df0: 65 29 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57  e);.  Window *pW
9e00: 69 6e 3b 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70  in;.  for(pWin=p
9e10: 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e  MWin; pWin; pWin
9e20: 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29  =pWin->pNextWin)
9e30: 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20  {.    int flags 
9e40: 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66  = pWin->pFunc->f
9e50: 75 6e 63 46 6c 61 67 73 3b 0a 20 20 20 20 69 6e  uncFlags;.    in
9e60: 74 20 72 65 67 41 72 67 3b 0a 20 20 20 20 69 6e  t regArg;.    in
9e70: 74 20 6e 41 72 67 20 3d 20 77 69 6e 64 6f 77 41  t nArg = windowA
9e80: 72 67 43 6f 75 6e 74 28 70 57 69 6e 29 3b 0a 0a  rgCount(pWin);..
9e90: 20 20 20 20 69 66 28 20 63 73 72 3e 3d 30 20 29      if( csr>=0 )
9ea0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
9eb0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
9ec0: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
9ed0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9ee0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
9ef0: 6d 6e 2c 20 63 73 72 2c 20 70 57 69 6e 2d 3e 69  mn, csr, pWin->i
9f00: 41 72 67 43 6f 6c 2b 69 2c 20 72 65 67 2b 69 29  ArgCol+i, reg+i)
9f10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9f20: 72 65 67 41 72 67 20 3d 20 72 65 67 3b 0a 20 20  regArg = reg;.  
9f30: 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20      if( flags & 
9f40: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44  SQLITE_FUNC_WIND
9f50: 4f 57 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20  OW_SIZE ){.     
9f60: 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 30 20 29     if( nArg==0 )
9f70: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 67 41  {.          regA
9f80: 72 67 20 3d 20 72 65 67 50 61 72 74 53 69 7a 65  rg = regPartSize
9f90: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
9fa0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
9fb0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
9fc0: 4f 50 5f 53 43 6f 70 79 2c 20 72 65 67 50 61 72  OP_SCopy, regPar
9fd0: 74 53 69 7a 65 2c 20 72 65 67 2b 6e 41 72 67 29  tSize, reg+nArg)
9fe0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9ff0: 20 20 20 20 6e 41 72 67 2b 2b 3b 0a 20 20 20 20      nArg++;.    
a000: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
a010: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28 66       assert( !(f
a020: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
a030: 4e 43 5f 57 49 4e 44 4f 57 5f 53 49 5a 45 29 20  NC_WINDOW_SIZE) 
a040: 29 3b 0a 20 20 20 20 20 20 72 65 67 41 72 67 20  );.      regArg 
a050: 3d 20 72 65 67 20 2b 20 70 57 69 6e 2d 3e 69 41  = reg + pWin->iA
a060: 72 67 43 6f 6c 3b 0a 20 20 20 20 7d 0a 0a 20 20  rgCol;.    }..  
a070: 20 20 69 66 28 20 28 70 57 69 6e 2d 3e 70 46 75    if( (pWin->pFu
a080: 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  nc->funcFlags & 
a090: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d  SQLITE_FUNC_MINM
a0a0: 41 58 29 20 0a 20 20 20 20 20 20 26 26 20 70 57  AX) .      && pW
a0b0: 69 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b 5f 55  in->eStart!=TK_U
a0c0: 4e 42 4f 55 4e 44 45 44 20 0a 20 20 20 20 29 7b  NBOUNDED .    ){
a0d0: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 49  .      int addrI
a0e0: 73 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56  sNull = sqlite3V
a0f0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
a100: 49 73 4e 75 6c 6c 2c 20 72 65 67 41 72 67 29 3b  IsNull, regArg);
a110: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
a120: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 69 66  age(v);.      if
a130: 28 20 62 49 6e 76 65 72 73 65 3d 3d 30 20 29 7b  ( bInverse==0 ){
a140: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a150: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
a160: 5f 41 64 64 49 6d 6d 2c 20 70 57 69 6e 2d 3e 72  _AddImm, pWin->r
a170: 65 67 41 70 70 2b 31 2c 20 31 29 3b 0a 20 20 20  egApp+1, 1);.   
a180: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a190: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
a1a0: 70 79 2c 20 72 65 67 41 72 67 2c 20 70 57 69 6e  py, regArg, pWin
a1b0: 2d 3e 72 65 67 41 70 70 29 3b 0a 20 20 20 20 20  ->regApp);.     
a1c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a1d0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
a1e0: 65 63 6f 72 64 2c 20 70 57 69 6e 2d 3e 72 65 67  ecord, pWin->reg
a1f0: 41 70 70 2c 20 32 2c 20 70 57 69 6e 2d 3e 72 65  App, 2, pWin->re
a200: 67 41 70 70 2b 32 29 3b 0a 20 20 20 20 20 20 20  gApp+2);.       
a210: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a220: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
a230: 72 74 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70  rt, pWin->csrApp
a240: 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 32  , pWin->regApp+2
a250: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
a260: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
a270: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
a280: 4f 50 5f 53 65 65 6b 47 45 2c 20 70 57 69 6e 2d  OP_SeekGE, pWin-
a290: 3e 63 73 72 41 70 70 2c 20 30 2c 20 72 65 67 41  >csrApp, 0, regA
a2a0: 72 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  rg, 1);.        
a2b0: 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65  VdbeCoverageNeve
a2c0: 72 54 61 6b 65 6e 28 76 29 3b 0a 20 20 20 20 20  rTaken(v);.     
a2d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a2e0: 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74  dOp1(v, OP_Delet
a2f0: 65 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 29  e, pWin->csrApp)
a300: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
a310: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
a320: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
a330: 65 6e 74 41 64 64 72 28 76 29 2d 32 29 3b 0a 20  entAddr(v)-2);. 
a340: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
a350: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
a360: 28 76 2c 20 61 64 64 72 49 73 4e 75 6c 6c 29 3b  (v, addrIsNull);
a370: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
a380: 57 69 6e 2d 3e 72 65 67 41 70 70 20 29 7b 0a 20  Win->regApp ){. 
a390: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69       assert( pWi
a3a0: 6e 2d 3e 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d  n->pFunc->zName=
a3b0: 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 0a 20  =nth_valueName. 
a3c0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 57 69            || pWi
a3d0: 6e 2d 3e 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d  n->pFunc->zName=
a3e0: 3d 66 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65  =first_valueName
a3f0: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
a400: 61 73 73 65 72 74 28 20 62 49 6e 76 65 72 73 65  assert( bInverse
a410: 3d 3d 30 20 7c 7c 20 62 49 6e 76 65 72 73 65 3d  ==0 || bInverse=
a420: 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
a430: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
a440: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 57 69 6e   OP_AddImm, pWin
a450: 2d 3e 72 65 67 41 70 70 2b 31 2d 62 49 6e 76 65  ->regApp+1-bInve
a460: 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c  rse, 1);.    }el
a470: 73 65 20 69 66 28 20 70 57 69 6e 2d 3e 70 46 75  se if( pWin->pFu
a480: 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e  nc->zName==leadN
a490: 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ame.           |
a4a0: 7c 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 7a  | pWin->pFunc->z
a4b0: 4e 61 6d 65 3d 3d 6c 61 67 4e 61 6d 65 0a 20 20  Name==lagName.  
a4c0: 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f    ){.      /* no
a4d0: 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  -op */.    }else
a4e0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
a4f0: 49 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  If = 0;.      if
a500: 28 20 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72 20  ( pWin->pFilter 
a510: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
a520: 65 67 54 6d 70 3b 0a 20 20 20 20 20 20 20 20 61  egTmp;.        a
a530: 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 30 20 7c  ssert( nArg==0 |
a540: 7c 20 6e 41 72 67 3d 3d 70 57 69 6e 2d 3e 70 4f  | nArg==pWin->pO
a550: 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  wner->x.pList->n
a560: 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 20 20  Expr );.        
a570: 61 73 73 65 72 74 28 20 6e 41 72 67 20 7c 7c 20  assert( nArg || 
a580: 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e  pWin->pOwner->x.
a590: 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pList==0 );.    
a5a0: 20 20 20 20 69 66 28 20 63 73 72 3e 30 20 29 7b      if( csr>0 ){
a5b0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 67 54 6d  .          regTm
a5c0: 70 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  p = sqlite3GetTe
a5d0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
a5e0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
a5f0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
a600: 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20 70 57  _Column, csr, pW
a610: 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 6e 41 72 67  in->iArgCol+nArg
a620: 2c 72 65 67 54 6d 70 29 3b 0a 20 20 20 20 20 20  ,regTmp);.      
a630: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a640: 20 20 20 72 65 67 54 6d 70 20 3d 20 72 65 67 41     regTmp = regA
a650: 72 67 20 2b 20 6e 41 72 67 3b 0a 20 20 20 20 20  rg + nArg;.     
a660: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64     }.        add
a670: 72 49 66 20 3d 20 73 71 6c 69 74 65 33 56 64 62  rIf = sqlite3Vdb
a680: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
a690: 4e 6f 74 2c 20 72 65 67 54 6d 70 2c 20 30 2c 20  Not, regTmp, 0, 
a6a0: 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  1);.        Vdbe
a6b0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
a6c0: 20 20 20 20 20 69 66 28 20 63 73 72 3e 30 20 29       if( csr>0 )
a6d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
a6e0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
a6f0: 67 28 70 50 61 72 73 65 2c 20 72 65 67 54 6d 70  g(pParse, regTmp
a700: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
a710: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
a720: 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63  Win->pFunc->func
a730: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
a740: 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a  UNC_NEEDCOLL ){.
a750: 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
a760: 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  *pColl;.        
a770: 61 73 73 65 72 74 28 20 6e 41 72 67 3e 30 20 29  assert( nArg>0 )
a780: 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  ;.        pColl 
a790: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43  = sqlite3ExprNNC
a7a0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
a7b0: 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70  Win->pOwner->x.p
a7c0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
a7d0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
a7e0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
a7f0: 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 30 2c  OP_CollSeq, 0,0,
a800: 30 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  0, (const char*)
a810: 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
a820: 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Q);.      }.    
a830: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a840: 4f 70 33 28 76 2c 20 62 49 6e 76 65 72 73 65 3f  Op3(v, bInverse?
a850: 20 4f 50 5f 41 67 67 49 6e 76 65 72 73 65 20 3a   OP_AggInverse :
a860: 20 4f 50 5f 41 67 67 53 74 65 70 2c 20 0a 20 20   OP_AggStep, .  
a870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a880: 20 20 20 20 20 20 62 49 6e 76 65 72 73 65 2c 20        bInverse, 
a890: 72 65 67 41 72 67 2c 20 70 57 69 6e 2d 3e 72 65  regArg, pWin->re
a8a0: 67 41 63 63 75 6d 29 3b 0a 20 20 20 20 20 20 73  gAccum);.      s
a8b0: 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64  qlite3VdbeAppend
a8c0: 50 34 28 76 2c 20 70 57 69 6e 2d 3e 70 46 75 6e  P4(v, pWin->pFun
a8d0: 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P4_FUNCDEF);.
a8e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a8f0: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38  eChangeP5(v, (u8
a900: 29 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 69 66  )nArg);.      if
a910: 28 20 61 64 64 72 49 66 20 29 20 73 71 6c 69 74  ( addrIf ) sqlit
a920: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
a930: 2c 20 61 64 64 72 49 66 29 3b 0a 20 20 20 20 7d  , addrIf);.    }
a940: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
a950: 6e 65 72 61 74 65 20 56 4d 20 63 6f 64 65 20 74  nerate VM code t
a960: 6f 20 69 6e 76 6f 6b 65 20 65 69 74 68 65 72 20  o invoke either 
a970: 78 56 61 6c 75 65 28 29 20 28 62 46 69 6e 61 6c  xValue() (bFinal
a980: 3d 3d 30 29 20 6f 72 20 78 46 69 6e 61 6c 69 7a  ==0) or xFinaliz
a990: 65 28 29 0a 2a 2a 20 28 62 46 69 6e 61 6c 3d 3d  e().** (bFinal==
a9a0: 31 29 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64  1) for each wind
a9b0: 6f 77 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 74  ow function in t
a9c0: 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73  he linked list s
a9d0: 74 61 72 74 69 6e 67 20 61 74 0a 2a 2a 20 70 4d  tarting at.** pM
a9e0: 57 69 6e 2e 20 4f 72 2c 20 66 6f 72 20 62 75 69  Win. Or, for bui
a9f0: 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 2d 66 75 6e  lt-in window-fun
aa00: 63 74 69 6f 6e 73 20 74 68 61 74 20 64 6f 20 6e  ctions that do n
aa10: 6f 74 20 75 73 65 20 74 68 65 20 73 74 61 6e 64  ot use the stand
aa20: 61 72 64 0a 2a 2a 20 41 50 49 2c 20 67 65 6e 65  ard.** API, gene
aa30: 72 61 74 65 20 74 68 65 20 65 71 75 69 76 61 6c  rate the equival
aa40: 65 6e 74 20 56 4d 20 63 6f 64 65 2e 0a 2a 2f 0a  ent VM code..*/.
aa50: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64  static void wind
aa60: 6f 77 41 67 67 46 69 6e 61 6c 28 50 61 72 73 65  owAggFinal(Parse
aa70: 20 2a 70 50 61 72 73 65 2c 20 57 69 6e 64 6f 77   *pParse, Window
aa80: 20 2a 70 4d 57 69 6e 2c 20 69 6e 74 20 62 46 69   *pMWin, int bFi
aa90: 6e 61 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  nal){.  Vdbe *v 
aaa0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
aab0: 28 70 50 61 72 73 65 29 3b 0a 20 20 57 69 6e 64  (pParse);.  Wind
aac0: 6f 77 20 2a 70 57 69 6e 3b 0a 0a 20 20 66 6f 72  ow *pWin;..  for
aad0: 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69  (pWin=pMWin; pWi
aae0: 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e  n; pWin=pWin->pN
aaf0: 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 69 66 28  extWin){.    if(
ab00: 20 28 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66   (pWin->pFunc->f
ab10: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
ab20: 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 20 0a  E_FUNC_MINMAX) .
ab30: 20 20 20 20 20 26 26 20 70 57 69 6e 2d 3e 65 53       && pWin->eS
ab40: 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44  tart!=TK_UNBOUND
ab50: 45 44 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ED .    ){.     
ab60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ab70: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
ab80: 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c  , pWin->regResul
ab90: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
aba0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
abb0: 50 5f 4c 61 73 74 2c 20 70 57 69 6e 2d 3e 63 73  P_Last, pWin->cs
abc0: 72 41 70 70 29 3b 0a 20 20 20 20 20 20 56 64 62  rApp);.      Vdb
abd0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
abe0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
abf0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
ac00: 6d 6e 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70  mn, pWin->csrApp
ac10: 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65  , 0, pWin->regRe
ac20: 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  sult);.      sql
ac30: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
ac40: 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  (v, sqlite3VdbeC
ac50: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 32 29  urrentAddr(v)-2)
ac60: 3b 0a 20 20 20 20 20 20 69 66 28 20 62 46 69 6e  ;.      if( bFin
ac70: 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  al ){.        sq
ac80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
ac90: 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74 65  v, OP_ResetSorte
aca0: 72 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 29  r, pWin->csrApp)
acb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
acc0: 6c 73 65 20 69 66 28 20 70 57 69 6e 2d 3e 72 65  lse if( pWin->re
acd0: 67 41 70 70 20 29 7b 0a 20 20 20 20 7d 65 6c 73  gApp ){.    }els
ace0: 65 7b 0a 20 20 20 20 20 20 69 66 28 20 62 46 69  e{.      if( bFi
acf0: 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  nal ){.        s
ad00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
ad10: 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c  (v, OP_AggFinal,
ad20: 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 2c   pWin->regAccum,
ad30: 20 77 69 6e 64 6f 77 41 72 67 43 6f 75 6e 74 28   windowArgCount(
ad40: 70 57 69 6e 29 29 3b 0a 20 20 20 20 20 20 20 20  pWin));.        
ad50: 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e  sqlite3VdbeAppen
ad60: 64 50 34 28 76 2c 20 70 57 69 6e 2d 3e 70 46 75  dP4(v, pWin->pFu
ad70: 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  nc, P4_FUNCDEF);
ad80: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ad90: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
ada0: 5f 43 6f 70 79 2c 20 70 57 69 6e 2d 3e 72 65 67  _Copy, pWin->reg
adb0: 41 63 63 75 6d 2c 20 70 57 69 6e 2d 3e 72 65 67  Accum, pWin->reg
adc0: 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 20  Result);.       
add0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ade0: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
adf0: 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d  , pWin->regAccum
ae00: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
ae10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ae20: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
ae30: 41 67 67 56 61 6c 75 65 2c 20 70 57 69 6e 2d 3e  AggValue, pWin->
ae40: 72 65 67 41 63 63 75 6d 2c 20 77 69 6e 64 6f 77  regAccum, window
ae50: 41 72 67 43 6f 75 6e 74 28 70 57 69 6e 29 2c 0a  ArgCount(pWin),.
ae60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae70: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 69               pWi
ae80: 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20  n->regResult);. 
ae90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
aea0: 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 57  beAppendP4(v, pW
aeb0: 69 6e 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55  in->pFunc, P4_FU
aec0: 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 7d 0a  NCDEF);.      }.
aed0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
aee0: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 75  ** Invoke the su
aef0: 62 2d 72 6f 75 74 69 6e 65 20 61 74 20 72 65 67  b-routine at reg
af00: 47 6f 73 75 62 20 28 67 65 6e 65 72 61 74 65 64  Gosub (generated
af10: 20 62 79 20 63 6f 64 65 20 69 6e 20 73 65 6c 65   by code in sele
af20: 63 74 2e 63 29 20 74 6f 0a 2a 2a 20 72 65 74 75  ct.c) to.** retu
af30: 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  rn the current r
af40: 6f 77 20 6f 66 20 57 69 6e 64 6f 77 2e 69 45 70  ow of Window.iEp
af50: 68 43 73 72 2e 20 49 66 20 61 6c 6c 20 77 69 6e  hCsr. If all win
af60: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 61 72  dow functions ar
af70: 65 0a 2a 2a 20 61 67 67 72 65 67 61 74 65 20 77  e.** aggregate w
af80: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
af90: 74 68 61 74 20 75 73 65 20 74 68 65 20 73 74 61  that use the sta
afa0: 6e 64 61 72 64 20 41 50 49 2c 20 61 20 73 69 6e  ndard API, a sin
afb0: 67 6c 65 0a 2a 2a 20 4f 50 5f 47 6f 73 75 62 20  gle.** OP_Gosub 
afc0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 61  instruction is a
afd0: 6c 6c 20 74 68 61 74 20 74 68 69 73 20 72 6f 75  ll that this rou
afe0: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 2e 20  tine generates. 
aff0: 45 78 74 72 61 20 56 4d 20 63 6f 64 65 0a 2a 2a  Extra VM code.**
b000: 20 66 6f 72 20 70 65 72 2d 72 6f 77 20 70 72 6f   for per-row pro
b010: 63 65 73 73 69 6e 67 20 69 73 20 6f 6e 6c 79 20  cessing is only 
b020: 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68  generated for th
b030: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 75 69 6c  e following buil
b040: 74 2d 69 6e 20 77 69 6e 64 6f 77 0a 2a 2a 20 66  t-in window.** f
b050: 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  unctions:.**.** 
b060: 20 20 6e 74 68 5f 76 61 6c 75 65 28 29 0a 2a 2a    nth_value().**
b070: 20 20 20 66 69 72 73 74 5f 76 61 6c 75 65 28 29     first_value()
b080: 0a 2a 2a 20 20 20 6c 61 67 28 29 0a 2a 2a 20 20  .**   lag().**  
b090: 20 6c 65 61 64 28 29 0a 2a 2f 0a 73 74 61 74 69   lead().*/.stati
b0a0: 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 52 65 74  c void windowRet
b0b0: 75 72 6e 4f 6e 65 52 6f 77 28 0a 20 20 50 61 72  urnOneRow(.  Par
b0c0: 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 57 69  se *pParse,.  Wi
b0d0: 6e 64 6f 77 20 2a 70 4d 57 69 6e 2c 0a 20 20 69  ndow *pMWin,.  i
b0e0: 6e 74 20 72 65 67 47 6f 73 75 62 2c 0a 20 20 69  nt regGosub,.  i
b0f0: 6e 74 20 61 64 64 72 47 6f 73 75 62 0a 29 7b 0a  nt addrGosub.){.
b100: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
b110: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
b120: 65 29 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57  e);.  Window *pW
b130: 69 6e 3b 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70  in;.  for(pWin=p
b140: 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e  MWin; pWin; pWin
b150: 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29  =pWin->pNextWin)
b160: 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70  {.    FuncDef *p
b170: 46 75 6e 63 20 3d 20 70 57 69 6e 2d 3e 70 46 75  Func = pWin->pFu
b180: 6e 63 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e  nc;.    if( pFun
b190: 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61  c->zName==nth_va
b1a0: 6c 75 65 4e 61 6d 65 0a 20 20 20 20 20 7c 7c 20  lueName.     || 
b1b0: 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69  pFunc->zName==fi
b1c0: 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65 0a 20 20  rst_valueName.  
b1d0: 20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 63    ){.      int c
b1e0: 73 72 20 3d 20 70 57 69 6e 2d 3e 63 73 72 41 70  sr = pWin->csrAp
b1f0: 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 62 6c  p;.      int lbl
b200: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
b210: 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
b220: 0a 20 20 20 20 20 20 69 6e 74 20 74 6d 70 52 65  .      int tmpRe
b230: 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
b240: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
b250: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b260: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
b270: 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 52  l, 0, pWin->regR
b280: 65 73 75 6c 74 29 3b 0a 0a 20 20 20 20 20 20 69  esult);..      i
b290: 66 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d  f( pFunc->zName=
b2a0: 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 20 29  =nth_valueName )
b2b0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
b2c0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
b2d0: 50 5f 43 6f 6c 75 6d 6e 2c 20 70 4d 57 69 6e 2d  P_Column, pMWin-
b2e0: 3e 69 45 70 68 43 73 72 2c 20 70 57 69 6e 2d 3e  >iEphCsr, pWin->
b2f0: 69 41 72 67 43 6f 6c 2b 31 2c 74 6d 70 52 65 67  iArgCol+1,tmpReg
b300: 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f  );.        windo
b310: 77 43 68 65 63 6b 49 6e 74 56 61 6c 75 65 28 70  wCheckIntValue(p
b320: 50 61 72 73 65 2c 20 74 6d 70 52 65 67 2c 20 32  Parse, tmpReg, 2
b330: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
b340: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b350: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b360: 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 6d 70 52  Integer, 1, tmpR
b370: 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eg);.      }.   
b380: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b390: 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20  dOp3(v, OP_Add, 
b3a0: 74 6d 70 52 65 67 2c 20 70 57 69 6e 2d 3e 72 65  tmpReg, pWin->re
b3b0: 67 41 70 70 2c 20 74 6d 70 52 65 67 29 3b 0a 20  gApp, tmpReg);. 
b3c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b3d0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 47 74 2c  AddOp3(v, OP_Gt,
b3e0: 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31 2c   pWin->regApp+1,
b3f0: 20 6c 62 6c 2c 20 74 6d 70 52 65 67 29 3b 0a 20   lbl, tmpReg);. 
b400: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
b410: 65 4e 65 76 65 72 4e 75 6c 6c 28 76 29 3b 0a 20  eNeverNull(v);. 
b420: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b430: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65  AddOp3(v, OP_See
b440: 6b 52 6f 77 69 64 2c 20 63 73 72 2c 20 30 2c 20  kRowid, csr, 0, 
b450: 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20 20 56  tmpReg);.      V
b460: 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72  dbeCoverageNever
b470: 54 61 6b 65 6e 28 76 29 3b 0a 20 20 20 20 20 20  Taken(v);.      
b480: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b490: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
b4a0: 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43  csr, pWin->iArgC
b4b0: 6f 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73  ol, pWin->regRes
b4c0: 75 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ult);.      sqli
b4d0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
b4e0: 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20 20 20  bel(v, lbl);.   
b4f0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
b500: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
b510: 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 7d 0a   tmpReg);.    }.
b520: 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 46 75      else if( pFu
b530: 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e  nc->zName==leadN
b540: 61 6d 65 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e  ame || pFunc->zN
b550: 61 6d 65 3d 3d 6c 61 67 4e 61 6d 65 20 29 7b 0a  ame==lagName ){.
b560: 20 20 20 20 20 20 69 6e 74 20 6e 41 72 67 20 3d        int nArg =
b570: 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78   pWin->pOwner->x
b580: 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  .pList->nExpr;. 
b590: 20 20 20 20 20 69 6e 74 20 63 73 72 20 3d 20 70       int csr = p
b5a0: 57 69 6e 2d 3e 63 73 72 41 70 70 3b 0a 20 20 20  Win->csrApp;.   
b5b0: 20 20 20 69 6e 74 20 6c 62 6c 20 3d 20 73 71 6c     int lbl = sql
b5c0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
b5d0: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
b5e0: 20 69 6e 74 20 74 6d 70 52 65 67 20 3d 20 73 71   int tmpReg = sq
b5f0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
b600: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
b610: 6e 74 20 69 45 70 68 20 3d 20 70 4d 57 69 6e 2d  nt iEph = pMWin-
b620: 3e 69 45 70 68 43 73 72 3b 0a 0a 20 20 20 20 20  >iEphCsr;..     
b630: 20 69 66 28 20 6e 41 72 67 3c 33 20 29 7b 0a 20   if( nArg<3 ){. 
b640: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b650: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
b660: 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65  ull, 0, pWin->re
b670: 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20  gResult);.      
b680: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
b690: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
b6a0: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
b6b0: 45 70 68 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43  Eph, pWin->iArgC
b6c0: 6f 6c 2b 32 2c 20 70 57 69 6e 2d 3e 72 65 67 52  ol+2, pWin->regR
b6d0: 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 0a  esult);.      }.
b6e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b6f0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
b700: 77 69 64 2c 20 69 45 70 68 2c 20 74 6d 70 52 65  wid, iEph, tmpRe
b710: 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 41  g);.      if( nA
b720: 72 67 3c 32 20 29 7b 0a 20 20 20 20 20 20 20 20  rg<2 ){.        
b730: 69 6e 74 20 76 61 6c 20 3d 20 28 70 46 75 6e 63  int val = (pFunc
b740: 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d  ->zName==leadNam
b750: 65 20 3f 20 31 20 3a 20 2d 31 29 3b 0a 20 20 20  e ? 1 : -1);.   
b760: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b770: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
b780: 49 6d 6d 2c 20 74 6d 70 52 65 67 2c 20 76 61 6c  Imm, tmpReg, val
b790: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
b7a0: 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d          int op =
b7b0: 20 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d   (pFunc->zName==
b7c0: 6c 65 61 64 4e 61 6d 65 20 3f 20 4f 50 5f 41 64  leadName ? OP_Ad
b7d0: 64 20 3a 20 4f 50 5f 53 75 62 74 72 61 63 74 29  d : OP_Subtract)
b7e0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 6d  ;.        int tm
b7f0: 70 52 65 67 32 20 3d 20 73 71 6c 69 74 65 33 47  pReg2 = sqlite3G
b800: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
b810: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
b820: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
b830: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 45 70 68 2c  OP_Column, iEph,
b840: 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 31   pWin->iArgCol+1
b850: 2c 20 74 6d 70 52 65 67 32 29 3b 0a 20 20 20 20  , tmpReg2);.    
b860: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b870: 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 74 6d 70  ddOp3(v, op, tmp
b880: 52 65 67 32 2c 20 74 6d 70 52 65 67 2c 20 74 6d  Reg2, tmpReg, tm
b890: 70 52 65 67 29 3b 0a 20 20 20 20 20 20 20 20 73  pReg);.        s
b8a0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
b8b0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 74 6d 70  pReg(pParse, tmp
b8c0: 52 65 67 32 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  Reg2);.      }..
b8d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b8e0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65  eAddOp3(v, OP_Se
b8f0: 65 6b 52 6f 77 69 64 2c 20 63 73 72 2c 20 6c 62  ekRowid, csr, lb
b900: 6c 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20  l, tmpReg);.    
b910: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
b920: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b930: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
b940: 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20 70 57  _Column, csr, pW
b950: 69 6e 2d 3e 69 41 72 67 43 6f 6c 2c 20 70 57 69  in->iArgCol, pWi
b960: 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20  n->regResult);. 
b970: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b980: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
b990: 6c 62 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lbl);.      sqli
b9a0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
b9b0: 67 28 70 50 61 72 73 65 2c 20 74 6d 70 52 65 67  g(pParse, tmpReg
b9c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
b9d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
b9e0: 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
b9f0: 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75  gGosub, addrGosu
ba00: 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  b);.}../*.** Gen
ba10: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 65  erate code to se
ba20: 74 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  t the accumulato
ba30: 72 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 65  r register for e
ba40: 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  ach window funct
ba50: 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 6c 69  ion.** in the li
ba60: 6e 6b 65 64 20 6c 69 73 74 20 70 61 73 73 65 64  nked list passed
ba70: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
ba80: 72 67 75 6d 65 6e 74 20 74 6f 20 4e 55 4c 4c 2e  rgument to NULL.
ba90: 20 41 6e 64 20 70 65 72 66 6f 72 6d 0a 2a 2a 20   And perform.** 
baa0: 61 6e 79 20 65 71 75 69 76 61 6c 65 6e 74 20 69  any equivalent i
bab0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 72 65  nitialization re
bac0: 71 75 69 72 65 64 20 62 79 20 61 6e 79 20 62 75  quired by any bu
bad0: 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75  ilt-in window fu
bae0: 6e 63 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 74 68  nctions.** in th
baf0: 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
bb00: 63 20 69 6e 74 20 77 69 6e 64 6f 77 49 6e 69 74  c int windowInit
bb10: 41 63 63 75 6d 28 50 61 72 73 65 20 2a 70 50 61  Accum(Parse *pPa
bb20: 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70 4d 57  rse, Window *pMW
bb30: 69 6e 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  in){.  Vdbe *v =
bb40: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
bb50: 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72  pParse);.  int r
bb60: 65 67 41 72 67 3b 0a 20 20 69 6e 74 20 6e 41 72  egArg;.  int nAr
bb70: 67 20 3d 20 30 3b 0a 20 20 57 69 6e 64 6f 77 20  g = 0;.  Window 
bb80: 2a 70 57 69 6e 3b 0a 20 20 66 6f 72 28 70 57 69  *pWin;.  for(pWi
bb90: 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70  n=pMWin; pWin; p
bba0: 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57  Win=pWin->pNextW
bbb0: 69 6e 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66  in){.    FuncDef
bbc0: 20 2a 70 46 75 6e 63 20 3d 20 70 57 69 6e 2d 3e   *pFunc = pWin->
bbd0: 70 46 75 6e 63 3b 0a 20 20 20 20 73 71 6c 69 74  pFunc;.    sqlit
bbe0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
bbf0: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e  OP_Null, 0, pWin
bc00: 2d 3e 72 65 67 41 63 63 75 6d 29 3b 0a 20 20 20  ->regAccum);.   
bc10: 20 6e 41 72 67 20 3d 20 4d 41 58 28 6e 41 72 67   nArg = MAX(nArg
bc20: 2c 20 77 69 6e 64 6f 77 41 72 67 43 6f 75 6e 74  , windowArgCount
bc30: 28 70 57 69 6e 29 29 3b 0a 20 20 20 20 69 66 28  (pWin));.    if(
bc40: 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e   pFunc->zName==n
bc50: 74 68 5f 76 61 6c 75 65 4e 61 6d 65 0a 20 20 20  th_valueName.   
bc60: 20 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d    || pFunc->zNam
bc70: 65 3d 3d 66 69 72 73 74 5f 76 61 6c 75 65 4e 61  e==first_valueNa
bc80: 6d 65 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  me.    ){.      
bc90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
bca0: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
bcb0: 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70   0, pWin->regApp
bcc0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
bcd0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
bce0: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 57 69  _Integer, 0, pWi
bcf0: 6e 2d 3e 72 65 67 41 70 70 2b 31 29 3b 0a 20 20  n->regApp+1);.  
bd00: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 46    }..    if( (pF
bd10: 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  unc->funcFlags &
bd20: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e   SQLITE_FUNC_MIN
bd30: 4d 41 58 29 20 26 26 20 70 57 69 6e 2d 3e 63 73  MAX) && pWin->cs
bd40: 72 41 70 70 20 29 7b 0a 20 20 20 20 20 20 61 73  rApp ){.      as
bd50: 73 65 72 74 28 20 70 57 69 6e 2d 3e 65 53 74 61  sert( pWin->eSta
bd60: 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  rt!=TK_UNBOUNDED
bd70: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
bd80: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
bd90: 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20 70  P_ResetSorter, p
bda0: 57 69 6e 2d 3e 63 73 72 41 70 70 29 3b 0a 20 20  Win->csrApp);.  
bdb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
bdc0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
bdd0: 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65  ger, 0, pWin->re
bde0: 67 41 70 70 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  gApp+1);.    }. 
bdf0: 20 7d 0a 20 20 72 65 67 41 72 67 20 3d 20 70 50   }.  regArg = pP
be00: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
be10: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
be20: 6e 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20 72  nArg;.  return r
be30: 65 67 41 72 67 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  egArg;.}../* .**
be40: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
be50: 74 68 65 20 65 6e 74 69 72 65 20 70 61 72 74 69  the entire parti
be60: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 63  tion should be c
be70: 61 63 68 65 64 20 69 6e 20 74 68 65 20 65 70 68  ached in the eph
be80: 65 6d 65 72 61 6c 0a 2a 2a 20 74 61 62 6c 65 20  emeral.** table 
be90: 62 65 66 6f 72 65 20 70 72 6f 63 65 73 73 69 6e  before processin
bea0: 67 20 61 6e 79 20 72 6f 77 73 2e 0a 2a 2f 0a 73  g any rows..*/.s
beb0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 64 6f 77  tatic int window
bec0: 43 61 63 68 65 50 61 72 74 69 74 69 6f 6e 28 57  CachePartition(W
bed0: 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 29 7b 0a 20  indow *pMWin){. 
bee0: 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20   Window *pWin;. 
bef0: 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b   for(pWin=pMWin;
bf00: 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e   pWin; pWin=pWin
bf10: 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20  ->pNextWin){.   
bf20: 20 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20   FuncDef *pFunc 
bf30: 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20  = pWin->pFunc;. 
bf40: 20 20 20 69 66 28 20 28 70 46 75 6e 63 2d 3e 66     if( (pFunc->f
bf50: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
bf60: 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 5f 53 49  E_FUNC_WINDOW_SI
bf70: 5a 45 29 0a 20 20 20 20 20 7c 7c 20 28 70 46 75  ZE).     || (pFu
bf80: 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76  nc->zName==nth_v
bf90: 61 6c 75 65 4e 61 6d 65 29 0a 20 20 20 20 20 7c  alueName).     |
bfa0: 7c 20 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d  | (pFunc->zName=
bfb0: 3d 66 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65  =first_valueName
bfc0: 29 0a 20 20 20 20 20 7c 7c 20 28 70 46 75 6e 63  ).     || (pFunc
bfd0: 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d  ->zName==leadNam
bfe0: 65 29 0a 20 20 20 20 20 7c 7c 20 28 70 46 75 6e  e).     || (pFun
bff0: 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 61 67 4e 61 6d  c->zName==lagNam
c000: 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  e).    ){.      
c010: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
c020: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
c030: 7d 0a 0a 2f 2a 0a 2a 2a 20 72 65 67 4f 6c 64 20  }../*.** regOld 
c040: 61 6e 64 20 72 65 67 4e 65 77 20 61 72 65 20 65  and regNew are e
c050: 61 63 68 20 74 68 65 20 66 69 72 73 74 20 72 65  ach the first re
c060: 67 69 73 74 65 72 20 69 6e 20 61 6e 20 61 72 72  gister in an arr
c070: 61 79 20 6f 66 20 73 69 7a 65 0a 2a 2a 20 70 4f  ay of size.** pO
c080: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2e 20 54  rderBy->nExpr. T
c090: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 67 65 6e  his function gen
c0a0: 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20 63  erates code to c
c0b0: 6f 6d 70 61 72 65 20 74 68 65 20 74 77 6f 0a 2a  ompare the two.*
c0c0: 2a 20 61 72 72 61 79 73 20 6f 66 20 72 65 67 69  * arrays of regi
c0d0: 73 74 65 72 73 20 75 73 69 6e 67 20 74 68 65 20  sters using the 
c0e0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
c0f0: 63 65 73 20 61 6e 64 20 6f 74 68 65 72 20 63 6f  ces and other co
c100: 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 70 61 72 61  mparison.** para
c110: 6d 65 74 65 72 73 20 73 70 65 63 69 66 69 65 64  meters specified
c120: 20 62 79 20 70 4f 72 64 65 72 42 79 2e 20 0a 2a   by pOrderBy. .*
c130: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 77 6f 20  *.** If the two 
c140: 61 72 72 61 79 73 20 61 72 65 20 6e 6f 74 20 65  arrays are not e
c150: 71 75 61 6c 2c 20 74 68 65 20 63 6f 6e 74 65 6e  qual, the conten
c160: 74 73 20 6f 66 20 72 65 67 4e 65 77 20 69 73 20  ts of regNew is 
c170: 63 6f 70 69 65 64 20 74 6f 20 0a 2a 2a 20 72 65  copied to .** re
c180: 67 4f 6c 64 20 61 6e 64 20 63 6f 6e 74 72 6f 6c  gOld and control
c190: 20 66 61 6c 6c 73 20 74 68 72 6f 75 67 68 2e 20   falls through. 
c1a0: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
c1b0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
c1c0: 65 20 61 72 72 61 79 73 0a 2a 2a 20 61 72 65 20  e arrays.** are 
c1d0: 65 71 75 61 6c 2c 20 61 6e 20 4f 50 5f 47 6f 74  equal, an OP_Got
c1e0: 6f 20 69 73 20 65 78 65 63 75 74 65 64 2e 20 54  o is executed. T
c1f0: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
c200: 65 20 4f 50 5f 47 6f 74 6f 20 69 73 20 72 65 74  e OP_Goto is ret
c210: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
c220: 20 69 6e 74 20 77 69 6e 64 6f 77 49 66 4e 65 77   int windowIfNew
c230: 50 65 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70  Peer(.  Parse *p
c240: 50 61 72 73 65 2c 0a 20 20 45 78 70 72 4c 69 73  Parse,.  ExprLis
c250: 74 20 2a 70 4f 72 64 65 72 42 79 2c 0a 20 20 69  t *pOrderBy,.  i
c260: 6e 74 20 72 65 67 4e 65 77 2c 20 20 20 20 20 20  nt regNew,      
c270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c280: 2a 20 46 69 72 73 74 20 69 6e 20 61 72 72 61 79  * First in array
c290: 20 6f 66 20 6e 65 77 20 76 61 6c 75 65 73 20 2a   of new values *
c2a0: 2f 0a 20 20 69 6e 74 20 72 65 67 4f 6c 64 20 20  /.  int regOld  
c2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2c0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 69 6e 20      /* First in 
c2d0: 61 72 72 61 79 20 6f 66 20 6f 6c 64 20 76 61 6c  array of old val
c2e0: 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  ues */.){.  Vdbe
c2f0: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
c300: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
c310: 69 6e 74 20 61 64 64 72 3b 0a 20 20 69 66 28 20  int addr;.  if( 
c320: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
c330: 69 6e 74 20 6e 56 61 6c 20 3d 20 70 4f 72 64 65  int nVal = pOrde
c340: 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  rBy->nExpr;.    
c350: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
c360: 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
c370: 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
c380: 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
c390: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
c3a0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
c3b0: 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67   OP_Compare, reg
c3c0: 4f 6c 64 2c 20 72 65 67 4e 65 77 2c 20 6e 56 61  Old, regNew, nVa
c3d0: 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  l);.    sqlite3V
c3e0: 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28  dbeAppendP4(v, (
c3f0: 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  void*)pKeyInfo, 
c400: 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
c410: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
c420: 64 62 65 41 64 64 4f 70 33 28 0a 20 20 20 20 20  dbeAddOp3(.     
c430: 20 20 20 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 73     v, OP_Jump, s
c440: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
c450: 74 41 64 64 72 28 76 29 2b 31 2c 20 30 2c 20 73  tAddr(v)+1, 0, s
c460: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
c470: 74 41 64 64 72 28 76 29 2b 31 0a 20 20 20 20 29  tAddr(v)+1.    )
c480: 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
c490: 67 65 45 71 4e 65 28 76 29 3b 0a 20 20 20 20 73  geEqNe(v);.    s
c4a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
c4b0: 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67  (v, OP_Copy, reg
c4c0: 4e 65 77 2c 20 72 65 67 4f 6c 64 2c 20 6e 56 61  New, regOld, nVa
c4d0: 6c 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  l-1);.  }else{. 
c4e0: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
c4f0: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
c500: 50 5f 47 6f 74 6f 29 3b 0a 20 20 7d 0a 20 20 72  P_Goto);.  }.  r
c510: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 74  eturn addr;.}..t
c520: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57 69  ypedef struct Wi
c530: 6e 64 6f 77 43 6f 64 65 41 72 67 20 57 69 6e 64  ndowCodeArg Wind
c540: 6f 77 43 6f 64 65 41 72 67 3b 0a 74 79 70 65 64  owCodeArg;.typed
c550: 65 66 20 73 74 72 75 63 74 20 57 69 6e 64 6f 77  ef struct Window
c560: 43 73 72 41 6e 64 52 65 67 20 57 69 6e 64 6f 77  CsrAndReg Window
c570: 43 73 72 41 6e 64 52 65 67 3b 0a 73 74 72 75 63  CsrAndReg;.struc
c580: 74 20 57 69 6e 64 6f 77 43 73 72 41 6e 64 52 65  t WindowCsrAndRe
c590: 67 20 7b 0a 20 20 69 6e 74 20 63 73 72 3b 0a 20  g {.  int csr;. 
c5a0: 20 69 6e 74 20 72 65 67 3b 0a 7d 3b 0a 73 74 72   int reg;.};.str
c5b0: 75 63 74 20 57 69 6e 64 6f 77 43 6f 64 65 41 72  uct WindowCodeAr
c5c0: 67 20 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  g {.  Parse *pPa
c5d0: 72 73 65 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70  rse;.  Window *p
c5e0: 4d 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 70 56  MWin;.  Vdbe *pV
c5f0: 64 62 65 3b 0a 20 20 69 6e 74 20 72 65 67 47 6f  dbe;.  int regGo
c600: 73 75 62 3b 0a 20 20 69 6e 74 20 61 64 64 72 47  sub;.  int addrG
c610: 6f 73 75 62 3b 0a 20 20 69 6e 74 20 72 65 67 41  osub;.  int regA
c620: 72 67 3b 0a 0a 20 20 57 69 6e 64 6f 77 43 73 72  rg;..  WindowCsr
c630: 41 6e 64 52 65 67 20 73 74 61 72 74 3b 0a 20 20  AndReg start;.  
c640: 57 69 6e 64 6f 77 43 73 72 41 6e 64 52 65 67 20  WindowCsrAndReg 
c650: 63 75 72 72 65 6e 74 3b 0a 20 20 57 69 6e 64 6f  current;.  Windo
c660: 77 43 73 72 41 6e 64 52 65 67 20 65 6e 64 3b 0a  wCsrAndReg end;.
c670: 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 57 49 4e 44  };..#define WIND
c680: 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 20 31 0a  OW_RETURN_ROW 1.
c690: 23 64 65 66 69 6e 65 20 57 49 4e 44 4f 57 5f 41  #define WINDOW_A
c6a0: 47 47 49 4e 56 45 52 53 45 20 32 0a 23 64 65 66  GGINVERSE 2.#def
c6b0: 69 6e 65 20 57 49 4e 44 4f 57 5f 41 47 47 53 54  ine WINDOW_AGGST
c6c0: 45 50 20 20 20 20 33 0a 0a 2f 2a 0a 2a 2a 20 47  EP    3../*.** G
c6d0: 65 6e 65 72 61 74 65 20 56 4d 20 63 6f 64 65 20  enerate VM code 
c6e0: 74 6f 20 72 65 61 64 20 74 68 65 20 77 69 6e 64  to read the wind
c6f0: 6f 77 20 66 72 61 6d 65 73 20 70 65 65 72 20 76  ow frames peer v
c700: 61 6c 75 65 73 20 66 72 6f 6d 20 63 75 72 73 6f  alues from curso
c710: 72 20 63 73 72 20 69 6e 74 6f 0a 2a 2a 20 61 6e  r csr into.** an
c720: 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   array of regist
c730: 65 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  ers starting at 
c740: 72 65 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  reg..*/.static v
c750: 6f 69 64 20 77 69 6e 64 6f 77 52 65 61 64 50 65  oid windowReadPe
c760: 65 72 56 61 6c 75 65 73 28 0a 20 20 57 69 6e 64  erValues(.  Wind
c770: 6f 77 43 6f 64 65 41 72 67 20 2a 70 2c 0a 20 20  owCodeArg *p,.  
c780: 69 6e 74 20 63 73 72 2c 0a 20 20 69 6e 74 20 72  int csr,.  int r
c790: 65 67 0a 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a  eg.){.  Window *
c7a0: 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 4d 57 69 6e  pMWin = p->pMWin
c7b0: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  ;.  ExprList *pO
c7c0: 72 64 65 72 42 79 20 3d 20 70 4d 57 69 6e 2d 3e  rderBy = pMWin->
c7d0: 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20  pOrderBy;.  if( 
c7e0: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
c7f0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
c800: 33 47 65 74 56 64 62 65 28 70 2d 3e 70 50 61 72  3GetVdbe(p->pPar
c810: 73 65 29 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  se);.    ExprLis
c820: 74 20 2a 70 50 61 72 74 20 3d 20 70 4d 57 69 6e  t *pPart = pMWin
c830: 2d 3e 70 50 61 72 74 69 74 69 6f 6e 3b 0a 20 20  ->pPartition;.  
c840: 20 20 69 6e 74 20 69 43 6f 6c 4f 66 66 20 3d 20    int iColOff = 
c850: 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f  pMWin->nBufferCo
c860: 6c 20 2b 20 28 70 50 61 72 74 20 3f 20 70 50 61  l + (pPart ? pPa
c870: 72 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a  rt->nExpr : 0);.
c880: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
c890: 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72  or(i=0; i<pOrder
c8a0: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
c8b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c8c0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
c8d0: 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20 69 43 6f 6c  olumn, csr, iCol
c8e0: 4f 66 66 2b 69 2c 20 72 65 67 2b 69 29 3b 0a 20  Off+i, reg+i);. 
c8f0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
c900: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
c910: 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72  is called as par
c920: 74 20 6f 66 20 67 65 6e 65 72 61 74 69 6e 67 20  t of generating 
c930: 56 4d 20 70 72 6f 67 72 61 6d 73 20 66 6f 72 20  VM programs for 
c940: 52 41 4e 47 45 0a 2a 2a 20 6f 66 66 73 65 74 20  RANGE.** offset 
c950: 50 52 45 43 45 44 49 4e 47 2f 46 4f 4c 4c 4f 57  PRECEDING/FOLLOW
c960: 49 4e 47 20 66 72 61 6d 65 20 62 6f 75 6e 64 61  ING frame bounda
c970: 72 69 65 73 2e 20 49 74 20 67 65 6e 65 72 61 74  ries. It generat
c980: 65 73 20 63 6f 64 65 20 65 71 75 69 76 61 6c 65  es code equivale
c990: 6e 74 0a 2a 2a 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20  nt.** to:.**.** 
c9a0: 20 20 69 66 28 20 63 73 72 31 2e 70 65 65 72 56    if( csr1.peerV
c9b0: 61 6c 20 2b 20 72 65 67 56 61 6c 20 3e 3d 20 63  al + regVal >= c
c9c0: 73 72 32 2e 70 65 65 72 56 61 6c 20 29 20 67 6f  sr2.peerVal ) go
c9d0: 74 6f 20 6c 62 6c 3b 0a 2a 2a 20 20 20 69 66 28  to lbl;.**   if(
c9e0: 20 63 73 72 31 2e 72 6f 77 69 64 20 3e 3d 20 63   csr1.rowid >= c
c9f0: 73 72 32 2e 72 6f 77 69 64 20 29 20 67 6f 74 6f  sr2.rowid ) goto
ca00: 20 6c 62 6c 3b 0a 2a 2f 0a 73 74 61 74 69 63 20   lbl;.*/.static 
ca10: 76 6f 69 64 20 77 69 6e 64 6f 77 43 6f 64 65 52  void windowCodeR
ca20: 61 6e 67 65 54 65 73 74 28 0a 20 20 57 69 6e 64  angeTest(.  Wind
ca30: 6f 77 43 6f 64 65 41 72 67 20 2a 70 2c 20 0a 20  owCodeArg *p, . 
ca40: 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20   int op,        
ca50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca60: 20 20 2f 2a 20 4f 50 5f 47 65 20 6f 72 20 4f 50    /* OP_Ge or OP
ca70: 5f 47 74 20 2a 2f 0a 20 20 69 6e 74 20 63 73 72  _Gt */.  int csr
ca80: 31 2c 20 0a 20 20 69 6e 74 20 72 65 67 56 61 6c  1, .  int regVal
ca90: 2c 20 0a 20 20 69 6e 74 20 63 73 72 32 2c 0a 20  , .  int csr2,. 
caa0: 20 69 6e 74 20 6c 62 6c 0a 29 7b 0a 20 20 50 61   int lbl.){.  Pa
cab0: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d  rse *pParse = p-
cac0: 3e 70 50 61 72 73 65 3b 0a 20 20 56 64 62 65 20  >pParse;.  Vdbe 
cad0: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
cae0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
caf0: 6e 74 20 72 65 67 31 20 3d 20 73 71 6c 69 74 65  nt reg1 = sqlite
cb00: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
cb10: 73 65 29 3b 0a 20 20 69 6e 74 20 72 65 67 32 20  se);.  int reg2 
cb20: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
cb30: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69  Reg(pParse);.  i
cb40: 6e 74 20 61 72 69 74 68 20 3d 20 4f 50 5f 41 64  nt arith = OP_Ad
cb50: 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 70  d;..  assert( op
cb60: 3d 3d 4f 50 5f 47 65 20 7c 7c 20 6f 70 3d 3d 4f  ==OP_Ge || op==O
cb70: 50 5f 47 74 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c  P_Gt || op==OP_L
cb80: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
cb90: 2d 3e 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42  ->pMWin->pOrderB
cba0: 79 20 26 26 20 70 2d 3e 70 4d 57 69 6e 2d 3e 70  y && p->pMWin->p
cbb0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d  OrderBy->nExpr==
cbc0: 31 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4d  1 );.  if( p->pM
cbd0: 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61  Win->pOrderBy->a
cbe0: 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 7b  [0].sortOrder ){
cbf0: 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f 70 20  .    switch( op 
cc00: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  ){.      case OP
cc10: 5f 47 65 3a 20 6f 70 20 3d 20 4f 50 5f 4c 65 3b  _Ge: op = OP_Le;
cc20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
cc30: 73 65 20 4f 50 5f 47 74 3a 20 6f 70 20 3d 20 4f  se OP_Gt: op = O
cc40: 50 5f 4c 74 3b 20 62 72 65 61 6b 3b 0a 20 20 20  P_Lt; break;.   
cc50: 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65     default: asse
cc60: 72 74 28 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b  rt( op==OP_Le );
cc70: 20 6f 70 20 3d 20 4f 50 5f 47 65 3b 20 62 72 65   op = OP_Ge; bre
cc80: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 72  ak;.    }.    ar
cc90: 69 74 68 20 3d 20 4f 50 5f 53 75 62 74 72 61 63  ith = OP_Subtrac
cca0: 74 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 64 6f 77  t;.  }..  window
ccb0: 52 65 61 64 50 65 65 72 56 61 6c 75 65 73 28 70  ReadPeerValues(p
ccc0: 2c 20 63 73 72 31 2c 20 72 65 67 31 29 3b 0a 20  , csr1, reg1);. 
ccd0: 20 77 69 6e 64 6f 77 52 65 61 64 50 65 65 72 56   windowReadPeerV
cce0: 61 6c 75 65 73 28 70 2c 20 63 73 72 32 2c 20 72  alues(p, csr2, r
ccf0: 65 67 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  eg2);.  sqlite3V
cd00: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 61 72 69  dbeAddOp3(v, ari
cd10: 74 68 2c 20 72 65 67 56 61 6c 2c 20 72 65 67 31  th, regVal, reg1
cd20: 2c 20 72 65 67 31 29 3b 0a 20 20 73 71 6c 69 74  , reg1);.  sqlit
cd30: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
cd40: 6f 70 2c 20 72 65 67 32 2c 20 6c 62 6c 2c 20 72  op, reg2, lbl, r
cd50: 65 67 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  eg1);.  sqlite3V
cd60: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
cd70: 52 6f 77 69 64 2c 20 63 73 72 31 2c 20 72 65 67  Rowid, csr1, reg
cd80: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
cd90: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
cda0: 77 69 64 2c 20 63 73 72 32 2c 20 72 65 67 32 29  wid, csr2, reg2)
cdb0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
cdc0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 47 74 2c 20  ddOp3(v, OP_Gt, 
cdd0: 72 65 67 32 2c 20 6c 62 6c 2c 20 72 65 67 31 29  reg2, lbl, reg1)
cde0: 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
cdf0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
ce00: 2c 20 72 65 67 31 29 3b 0a 20 20 73 71 6c 69 74  , reg1);.  sqlit
ce10: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
ce20: 28 70 50 61 72 73 65 2c 20 72 65 67 32 29 3b 0a  (pParse, reg2);.
ce30: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  }..static int wi
ce40: 6e 64 6f 77 43 6f 64 65 4f 70 28 0a 20 57 69 6e  ndowCodeOp(. Win
ce50: 64 6f 77 43 6f 64 65 41 72 67 20 2a 70 2c 0a 20  dowCodeArg *p,. 
ce60: 69 6e 74 20 6f 70 2c 0a 20 69 6e 74 20 72 65 67  int op,. int reg
ce70: 43 6f 75 6e 74 64 6f 77 6e 2c 0a 20 69 6e 74 20  Countdown,. int 
ce80: 6a 75 6d 70 4f 6e 45 6f 66 0a 29 7b 0a 20 20 69  jumpOnEof.){.  i
ce90: 6e 74 20 63 73 72 2c 20 72 65 67 3b 0a 20 20 50  nt csr, reg;.  P
cea0: 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
ceb0: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 57 69 6e 64  ->pParse;.  Wind
cec0: 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70  ow *pMWin = p->p
ced0: 4d 57 69 6e 3b 0a 20 20 69 6e 74 20 72 65 74 20  MWin;.  int ret 
cee0: 3d 20 30 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  = 0;.  Vdbe *v =
cef0: 20 70 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74   p->pVdbe;.  int
cf00: 20 61 64 64 72 49 66 20 3d 20 30 3b 20 0a 20 20   addrIf = 0; .  
cf10: 69 6e 74 20 61 64 64 72 43 6f 6e 74 69 6e 75 65  int addrContinue
cf20: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72   = 0;.  int addr
cf30: 47 6f 74 6f 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Goto = 0;.  int 
cf40: 62 50 65 65 72 20 3d 20 28 70 4d 57 69 6e 2d 3e  bPeer = (pMWin->
cf50: 65 54 79 70 65 21 3d 54 4b 5f 52 4f 57 53 29 3b  eType!=TK_ROWS);
cf60: 0a 0a 20 20 69 6e 74 20 6c 62 6c 44 6f 6e 65 20  ..  int lblDone 
cf70: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
cf80: 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
cf90: 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 52 61    int addrNextRa
cfa0: 6e 67 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53  nge = 0;..  /* S
cfb0: 70 65 63 69 61 6c 20 63 61 73 65 20 2d 20 57 49  pecial case - WI
cfc0: 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 20  NDOW_AGGINVERSE 
cfd0: 69 73 20 61 6c 77 61 79 73 20 61 20 6e 6f 2d 6f  is always a no-o
cfe0: 70 20 69 66 20 74 68 65 20 66 72 61 6d 65 0a 20  p if the frame. 
cff0: 20 2a 2a 20 73 74 61 72 74 73 20 77 69 74 68 20   ** starts with 
d000: 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44  UNBOUNDED PRECED
d010: 49 4e 47 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 70  ING. */.  if( op
d020: 3d 3d 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45  ==WINDOW_AGGINVE
d030: 52 53 45 20 26 26 20 70 4d 57 69 6e 2d 3e 65 53  RSE && pMWin->eS
d040: 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44  tart==TK_UNBOUND
d050: 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ED ){.    assert
d060: 28 20 72 65 67 43 6f 75 6e 74 64 6f 77 6e 3d 3d  ( regCountdown==
d070: 30 20 26 26 20 6a 75 6d 70 4f 6e 45 6f 66 3d 3d  0 && jumpOnEof==
d080: 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 );.    return 
d090: 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 65  0;.  }..  if( re
d0a0: 67 43 6f 75 6e 74 64 6f 77 6e 3e 30 20 29 7b 0a  gCountdown>0 ){.
d0b0: 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65      if( pMWin->e
d0c0: 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 29  Type==TK_RANGE )
d0d0: 7b 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78 74  {.      addrNext
d0e0: 52 61 6e 67 65 20 3d 20 73 71 6c 69 74 65 33 56  Range = sqlite3V
d0f0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
d100: 29 3b 0a 0a 20 20 20 20 20 20 73 77 69 74 63 68  );..      switch
d110: 28 20 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  ( op ){.        
d120: 63 61 73 65 20 57 49 4e 44 4f 57 5f 52 45 54 55  case WINDOW_RETU
d130: 52 4e 5f 52 4f 57 3a 20 7b 0a 20 20 20 20 20 20  RN_ROW: {.      
d140: 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b      assert( 0 );
d150: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
d160: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
d170: 20 20 20 20 20 63 61 73 65 20 57 49 4e 44 4f 57       case WINDOW
d180: 5f 41 47 47 49 4e 56 45 52 53 45 3a 20 7b 0a 20  _AGGINVERSE: {. 
d190: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 57           if( pMW
d1a0: 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46  in->eStart==TK_F
d1b0: 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20  OLLOWING ){.    
d1c0: 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f          windowCo
d1d0: 64 65 52 61 6e 67 65 54 65 73 74 28 0a 20 20 20  deRangeTest(.   
d1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20               p, 
d1f0: 4f 50 5f 4c 65 2c 20 70 2d 3e 63 75 72 72 65 6e  OP_Le, p->curren
d200: 74 2e 63 73 72 2c 20 72 65 67 43 6f 75 6e 74 64  t.csr, regCountd
d210: 6f 77 6e 2c 20 70 2d 3e 73 74 61 72 74 2e 63 73  own, p->start.cs
d220: 72 2c 20 6c 62 6c 44 6f 6e 65 0a 20 20 20 20 20  r, lblDone.     
d230: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
d240: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d250: 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64         windowCod
d260: 65 52 61 6e 67 65 54 65 73 74 28 0a 20 20 20 20  eRangeTest(.    
d270: 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 4f              p, O
d280: 50 5f 47 65 2c 20 70 2d 3e 73 74 61 72 74 2e 63  P_Ge, p->start.c
d290: 73 72 2c 20 72 65 67 43 6f 75 6e 74 64 6f 77 6e  sr, regCountdown
d2a0: 2c 20 70 2d 3e 63 75 72 72 65 6e 74 2e 63 73 72  , p->current.csr
d2b0: 2c 20 6c 62 6c 44 6f 6e 65 0a 20 20 20 20 20 20  , lblDone.      
d2c0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
d2d0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62     }.          b
d2e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
d2f0: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 57 49  .        case WI
d300: 4e 44 4f 57 5f 41 47 47 53 54 45 50 3a 20 7b 0a  NDOW_AGGSTEP: {.
d310: 20 20 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77            window
d320: 43 6f 64 65 52 61 6e 67 65 54 65 73 74 28 0a 20  CodeRangeTest(. 
d330: 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 4f 50             p, OP
d340: 5f 47 74 2c 20 70 2d 3e 65 6e 64 2e 63 73 72 2c  _Gt, p->end.csr,
d350: 20 72 65 67 43 6f 75 6e 74 64 6f 77 6e 2c 20 70   regCountdown, p
d360: 2d 3e 63 75 72 72 65 6e 74 2e 63 73 72 2c 20 6c  ->current.csr, l
d370: 62 6c 44 6f 6e 65 0a 20 20 20 20 20 20 20 20 20  blDone.         
d380: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   );.          br
d390: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
d3a0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 7d 65 6c 73       }..    }els
d3b0: 65 7b 0a 20 20 20 20 20 20 61 64 64 72 49 66 20  e{.      addrIf 
d3c0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
d3d0: 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op3(v, OP_IfPos,
d3e0: 20 72 65 67 43 6f 75 6e 74 64 6f 77 6e 2c 20 30   regCountdown, 0
d3f0: 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 1);.    }.  }.
d400: 0a 20 20 69 66 28 20 6f 70 3d 3d 57 49 4e 44 4f  .  if( op==WINDO
d410: 57 5f 52 45 54 55 52 4e 5f 52 4f 57 20 29 7b 0a  W_RETURN_ROW ){.
d420: 20 20 20 20 77 69 6e 64 6f 77 41 67 67 46 69 6e      windowAggFin
d430: 61 6c 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  al(pParse, pMWin
d440: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 61 64 64 72  , 0);.  }.  addr
d450: 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74  Continue = sqlit
d460: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
d470: 72 28 76 29 3b 0a 20 20 73 77 69 74 63 68 28 20  r(v);.  switch( 
d480: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 57  op ){.    case W
d490: 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57  INDOW_RETURN_ROW
d4a0: 3a 0a 20 20 20 20 20 20 63 73 72 20 3d 20 70 2d  :.      csr = p-
d4b0: 3e 63 75 72 72 65 6e 74 2e 63 73 72 3b 0a 20 20  >current.csr;.  
d4c0: 20 20 20 20 72 65 67 20 3d 20 70 2d 3e 63 75 72      reg = p->cur
d4d0: 72 65 6e 74 2e 72 65 67 3b 0a 20 20 20 20 20 20  rent.reg;.      
d4e0: 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52  windowReturnOneR
d4f0: 6f 77 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  ow(pParse, pMWin
d500: 2c 20 70 2d 3e 72 65 67 47 6f 73 75 62 2c 20 70  , p->regGosub, p
d510: 2d 3e 61 64 64 72 47 6f 73 75 62 29 3b 0a 20 20  ->addrGosub);.  
d520: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
d530: 63 61 73 65 20 57 49 4e 44 4f 57 5f 41 47 47 49  case WINDOW_AGGI
d540: 4e 56 45 52 53 45 3a 0a 20 20 20 20 20 20 63 73  NVERSE:.      cs
d550: 72 20 3d 20 70 2d 3e 73 74 61 72 74 2e 63 73 72  r = p->start.csr
d560: 3b 0a 20 20 20 20 20 20 72 65 67 20 3d 20 70 2d  ;.      reg = p-
d570: 3e 73 74 61 72 74 2e 72 65 67 3b 0a 20 20 20 20  >start.reg;.    
d580: 20 20 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28    windowAggStep(
d590: 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 63  pParse, pMWin, c
d5a0: 73 72 2c 20 31 2c 20 70 2d 3e 72 65 67 41 72 67  sr, 1, p->regArg
d5b0: 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 53 69 7a 65  , pMWin->regSize
d5c0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
d5d0: 0a 20 20 20 20 63 61 73 65 20 57 49 4e 44 4f 57  .    case WINDOW
d5e0: 5f 41 47 47 53 54 45 50 3a 0a 20 20 20 20 20 20  _AGGSTEP:.      
d5f0: 63 73 72 20 3d 20 70 2d 3e 65 6e 64 2e 63 73 72  csr = p->end.csr
d600: 3b 0a 20 20 20 20 20 20 72 65 67 20 3d 20 70 2d  ;.      reg = p-
d610: 3e 65 6e 64 2e 72 65 67 3b 0a 20 20 20 20 20 20  >end.reg;.      
d620: 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28 70 50  windowAggStep(pP
d630: 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 63 73 72  arse, pMWin, csr
d640: 2c 20 30 2c 20 70 2d 3e 72 65 67 41 72 67 2c 20  , 0, p->regArg, 
d650: 70 4d 57 69 6e 2d 3e 72 65 67 53 69 7a 65 29 3b  pMWin->regSize);
d660: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
d670: 7d 0a 0a 20 20 69 66 28 20 6a 75 6d 70 4f 6e 45  }..  if( jumpOnE
d680: 6f 66 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  of ){.    sqlite
d690: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
d6a0: 50 5f 4e 65 78 74 2c 20 63 73 72 2c 20 73 71 6c  P_Next, csr, sql
d6b0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
d6c0: 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 72  ddr(v)+2);.    r
d6d0: 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  et = sqlite3Vdbe
d6e0: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74  AddOp0(v, OP_Got
d6f0: 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
d700: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d710: 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 63  p2(v, OP_Next, c
d720: 73 72 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  sr, sqlite3VdbeC
d730: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31 2b  urrentAddr(v)+1+
d740: 62 50 65 65 72 29 3b 0a 20 20 20 20 69 66 28 20  bPeer);.    if( 
d750: 62 50 65 65 72 20 29 7b 0a 20 20 20 20 20 20 61  bPeer ){.      a
d760: 64 64 72 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65  ddrGoto = sqlite
d770: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
d780: 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a 20  P_Goto);.    }. 
d790: 20 7d 0a 0a 20 20 69 66 28 20 62 50 65 65 72 20   }..  if( bPeer 
d7a0: 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b  ){.    int addr;
d7b0: 0a 20 20 20 20 69 6e 74 20 6e 52 65 67 20 3d 20  .    int nReg = 
d7c0: 28 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79  (pMWin->pOrderBy
d7d0: 20 3f 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72   ? pMWin->pOrder
d7e0: 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a  By->nExpr : 0);.
d7f0: 20 20 20 20 69 6e 74 20 72 65 67 54 6d 70 20 3d      int regTmp =
d800: 20 28 6e 52 65 67 20 3f 20 73 71 6c 69 74 65 33   (nReg ? sqlite3
d810: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
d820: 72 73 65 2c 20 6e 52 65 67 29 20 3a 20 30 29 3b  rse, nReg) : 0);
d830: 0a 20 20 20 20 77 69 6e 64 6f 77 52 65 61 64 50  .    windowReadP
d840: 65 65 72 56 61 6c 75 65 73 28 70 2c 20 63 73 72  eerValues(p, csr
d850: 2c 20 72 65 67 54 6d 70 29 3b 0a 20 20 20 20 61  , regTmp);.    a
d860: 64 64 72 20 3d 20 77 69 6e 64 6f 77 49 66 4e 65  ddr = windowIfNe
d870: 77 50 65 65 72 28 70 50 61 72 73 65 2c 20 70 4d  wPeer(pParse, pM
d880: 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 2c 20 72  Win->pOrderBy, r
d890: 65 67 54 6d 70 2c 20 72 65 67 29 3b 0a 20 20 20  egTmp, reg);.   
d8a0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
d8b0: 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 61 64  geP2(v, addr, ad
d8c0: 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20  drContinue);.   
d8d0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
d8e0: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
d8f0: 20 72 65 67 54 6d 70 2c 20 6e 52 65 67 29 3b 0a   regTmp, nReg);.
d900: 20 20 7d 0a 0a 20 20 69 66 28 20 61 64 64 72 4e    }..  if( addrN
d910: 65 78 74 52 61 6e 67 65 20 29 7b 0a 20 20 20 20  extRange ){.    
d920: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d930: 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
d940: 20 61 64 64 72 4e 65 78 74 52 61 6e 67 65 29 3b   addrNextRange);
d950: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
d960: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
d970: 2c 20 6c 62 6c 44 6f 6e 65 29 3b 0a 20 20 69 66  , lblDone);.  if
d980: 28 20 61 64 64 72 47 6f 74 6f 20 29 20 73 71 6c  ( addrGoto ) sql
d990: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
d9a0: 28 76 2c 20 61 64 64 72 47 6f 74 6f 29 3b 0a 20  (v, addrGoto);. 
d9b0: 20 69 66 28 20 61 64 64 72 49 66 20 29 20 73 71   if( addrIf ) sq
d9c0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
d9d0: 65 28 76 2c 20 61 64 64 72 49 66 29 3b 0a 20 20  e(v, addrIf);.  
d9e0: 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 0a  return ret;.}...
d9f0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
da00: 6e 64 20 72 65 74 75 72 6e 20 61 20 64 75 70 6c  nd return a dupl
da10: 69 63 61 74 65 20 6f 66 20 74 68 65 20 57 69 6e  icate of the Win
da20: 64 6f 77 20 6f 62 6a 65 63 74 20 69 6e 64 69 63  dow object indic
da30: 61 74 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 74  ated by the.** t
da40: 68 69 72 64 20 61 72 67 75 6d 65 6e 74 2e 20 53  hird argument. S
da50: 65 74 20 74 68 65 20 57 69 6e 64 6f 77 2e 70 4f  et the Window.pO
da60: 77 6e 65 72 20 66 69 65 6c 64 20 6f 66 20 74 68  wner field of th
da70: 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 74 6f 0a  e new object to.
da80: 2a 2a 20 70 4f 77 6e 65 72 2e 0a 2a 2f 0a 57 69  ** pOwner..*/.Wi
da90: 6e 64 6f 77 20 2a 73 71 6c 69 74 65 33 57 69 6e  ndow *sqlite3Win
daa0: 64 6f 77 44 75 70 28 73 71 6c 69 74 65 33 20 2a  dowDup(sqlite3 *
dab0: 64 62 2c 20 45 78 70 72 20 2a 70 4f 77 6e 65 72  db, Expr *pOwner
dac0: 2c 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20 20  , Window *p){.  
dad0: 57 69 6e 64 6f 77 20 2a 70 4e 65 77 20 3d 20 30  Window *pNew = 0
dae0: 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
daf0: 29 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20  ) ){.    pNew = 
db00: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
db10: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 57  ero(db, sizeof(W
db20: 69 6e 64 6f 77 29 29 3b 0a 20 20 20 20 69 66 28  indow));.    if(
db30: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70   pNew ){.      p
db40: 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  New->zName = sql
db50: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
db60: 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20   p->zName);.    
db70: 20 20 70 4e 65 77 2d 3e 70 46 69 6c 74 65 72 20    pNew->pFilter 
db80: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
db90: 28 64 62 2c 20 70 2d 3e 70 46 69 6c 74 65 72 2c  (db, p->pFilter,
dba0: 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d   0);.      pNew-
dbb0: 3e 70 46 75 6e 63 20 3d 20 70 2d 3e 70 46 75 6e  >pFunc = p->pFun
dbc0: 63 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  c;.      pNew->p
dbd0: 50 61 72 74 69 74 69 6f 6e 20 3d 20 73 71 6c 69  Partition = sqli
dbe0: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
dbf0: 62 2c 20 70 2d 3e 70 50 61 72 74 69 74 69 6f 6e  b, p->pPartition
dc00: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  , 0);.      pNew
dc10: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c  ->pOrderBy = sql
dc20: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
dc30: 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  db, p->pOrderBy,
dc40: 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d   0);.      pNew-
dc50: 3e 65 54 79 70 65 20 3d 20 70 2d 3e 65 54 79 70  >eType = p->eTyp
dc60: 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 65  e;.      pNew->e
dc70: 45 6e 64 20 3d 20 70 2d 3e 65 45 6e 64 3b 0a 20  End = p->eEnd;. 
dc80: 20 20 20 20 20 70 4e 65 77 2d 3e 65 53 74 61 72       pNew->eStar
dc90: 74 20 3d 20 70 2d 3e 65 53 74 61 72 74 3b 0a 20  t = p->eStart;. 
dca0: 20 20 20 20 20 70 4e 65 77 2d 3e 70 53 74 61 72       pNew->pStar
dcb0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
dcc0: 75 70 28 64 62 2c 20 70 2d 3e 70 53 74 61 72 74  up(db, p->pStart
dcd0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  , 0);.      pNew
dce0: 2d 3e 70 45 6e 64 20 3d 20 73 71 6c 69 74 65 33  ->pEnd = sqlite3
dcf0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
dd00: 45 6e 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  End, 0);.      p
dd10: 4e 65 77 2d 3e 70 4f 77 6e 65 72 20 3d 20 70 4f  New->pOwner = pO
dd20: 77 6e 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  wner;.    }.  }.
dd30: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
dd40: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
dd50: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6c 69 6e   copy of the lin
dd60: 6b 65 64 20 6c 69 73 74 20 6f 66 20 57 69 6e 64  ked list of Wind
dd70: 6f 77 20 6f 62 6a 65 63 74 73 20 70 61 73 73 65  ow objects passe
dd80: 64 20 61 73 20 74 68 65 0a 2a 2a 20 73 65 63 6f  d as the.** seco
dd90: 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  nd argument..*/.
dda0: 57 69 6e 64 6f 77 20 2a 73 71 6c 69 74 65 33 57  Window *sqlite3W
ddb0: 69 6e 64 6f 77 4c 69 73 74 44 75 70 28 73 71 6c  indowListDup(sql
ddc0: 69 74 65 33 20 2a 64 62 2c 20 57 69 6e 64 6f 77  ite3 *db, Window
ddd0: 20 2a 70 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a   *p){.  Window *
dde0: 70 57 69 6e 3b 0a 20 20 57 69 6e 64 6f 77 20 2a  pWin;.  Window *
ddf0: 70 52 65 74 20 3d 20 30 3b 0a 20 20 57 69 6e 64  pRet = 0;.  Wind
de00: 6f 77 20 2a 2a 70 70 20 3d 20 26 70 52 65 74 3b  ow **pp = &pRet;
de10: 0a 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70 3b 20  ..  for(pWin=p; 
de20: 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d  pWin; pWin=pWin-
de30: 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20  >pNextWin){.    
de40: 2a 70 70 20 3d 20 73 71 6c 69 74 65 33 57 69 6e  *pp = sqlite3Win
de50: 64 6f 77 44 75 70 28 64 62 2c 20 30 2c 20 70 57  dowDup(db, 0, pW
de60: 69 6e 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 70  in);.    if( *pp
de70: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
de80: 20 70 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e 70   pp = &((*pp)->p
de90: 4e 65 78 74 57 69 6e 29 3b 0a 20 20 7d 0a 0a 20  NextWin);.  }.. 
dea0: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
deb0: 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68  ./*.** sqlite3Wh
dec0: 65 72 65 42 65 67 69 6e 28 29 20 68 61 73 20 61  ereBegin() has a
ded0: 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c  lready been call
dee0: 65 64 20 66 6f 72 20 74 68 65 20 53 45 4c 45 43  ed for the SELEC
def0: 54 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a 20  T statement .** 
df00: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
df10: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 77 68  cond argument wh
df20: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
df30: 20 69 73 20 69 6e 76 6f 6b 65 64 2e 20 49 74 20   is invoked. It 
df40: 67 65 6e 65 72 61 74 65 73 0a 2a 2a 20 63 6f 64  generates.** cod
df50: 65 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68  e to populate th
df60: 65 20 57 69 6e 64 6f 77 2e 72 65 67 52 65 73 75  e Window.regResu
df70: 6c 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  lt register for 
df80: 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63  each window func
df90: 74 69 6f 6e 20 0a 2a 2a 20 61 6e 64 20 69 6e 76  tion .** and inv
dfa0: 6f 6b 65 20 74 68 65 20 73 75 62 2d 72 6f 75 74  oke the sub-rout
dfb0: 69 6e 65 20 61 74 20 69 6e 73 74 72 75 63 74 69  ine at instructi
dfc0: 6f 6e 20 61 64 64 72 47 6f 73 75 62 20 6f 6e 63  on addrGosub onc
dfd0: 65 20 66 6f 72 20 65 61 63 68 20 72 6f 77 2e 0a  e for each row..
dfe0: 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  ** sqlite3WhereE
dff0: 6e 64 28 29 20 69 73 20 61 6c 77 61 79 73 20 63  nd() is always c
e000: 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 72 65 74  alled before ret
e010: 75 72 6e 69 6e 67 2e 20 0a 2a 2a 0a 2a 2a 20 54  urning. .**.** T
e020: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 6e  his function han
e030: 64 6c 65 73 20 73 65 76 65 72 61 6c 20 64 69 66  dles several dif
e040: 66 65 72 65 6e 74 20 74 79 70 65 73 20 6f 66 20  ferent types of 
e050: 77 69 6e 64 6f 77 20 66 72 61 6d 65 73 2c 20 77  window frames, w
e060: 68 69 63 68 0a 2a 2a 20 72 65 71 75 69 72 65 20  hich.** require 
e070: 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72 65  slightly differe
e080: 6e 74 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 54  nt processing. T
e090: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 73 65  he following pse
e0a0: 75 64 6f 20 63 6f 64 65 20 69 73 0a 2a 2a 20 75  udo code is.** u
e0b0: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
e0c0: 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 73 20 6f   window frames o
e0d0: 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
e0e0: 2a 20 20 20 52 4f 57 53 20 42 45 54 57 45 45 4e  *   ROWS BETWEEN
e0f0: 20 3c 65 78 70 72 31 3e 20 50 52 45 43 45 44 49   <expr1> PRECEDI
e100: 4e 47 20 41 4e 44 20 3c 65 78 70 72 32 3e 20 46  NG AND <expr2> F
e110: 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 4f  OLLOWING.**.** O
e120: 74 68 65 72 20 77 69 6e 64 6f 77 20 66 72 61 6d  ther window fram
e130: 65 20 74 79 70 65 73 20 75 73 65 20 76 61 72 69  e types use vari
e140: 61 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ants of the foll
e150: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
e160: 20 2e 2e 2e 20 6c 6f 6f 70 20 73 74 61 72 74 65   ... loop starte
e170: 64 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72  d by sqlite3Wher
e180: 65 42 65 67 69 6e 28 29 20 2e 2e 2e 0a 2a 2a 20  eBegin() ....** 
e190: 20 20 20 20 20 20 69 66 28 20 6e 65 77 20 70 61        if( new pa
e1a0: 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20  rtition ){.**   
e1b0: 20 20 20 20 20 20 47 6f 73 75 62 20 66 6c 75 73        Gosub flus
e1c0: 68 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20  h.**       }.** 
e1d0: 20 20 20 20 20 20 49 6e 73 65 72 74 20 6e 65 77        Insert new
e1e0: 20 72 6f 77 20 69 6e 74 6f 20 65 70 68 20 74 61   row into eph ta
e1f0: 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 20 20 0a 2a  ble..**       .*
e200: 2a 20 20 20 20 20 20 20 69 66 28 20 66 69 72 73  *       if( firs
e210: 74 20 72 6f 77 20 6f 66 20 70 61 72 74 69 74 69  t row of partiti
e220: 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  on ){.**        
e230: 20 2f 2f 20 52 65 77 69 6e 64 20 74 68 72 65 65   // Rewind three
e240: 20 63 75 72 73 6f 72 73 2c 20 61 6c 6c 20 6f 70   cursors, all op
e250: 65 6e 20 6f 6e 20 74 68 65 20 65 70 68 20 74 61  en on the eph ta
e260: 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  ble..**         
e270: 52 65 77 69 6e 64 28 63 73 72 45 6e 64 29 3b 0a  Rewind(csrEnd);.
e280: 2a 2a 20 20 20 20 20 20 20 20 20 52 65 77 69 6e  **         Rewin
e290: 64 28 63 73 72 53 74 61 72 74 29 3b 0a 2a 2a 20  d(csrStart);.** 
e2a0: 20 20 20 20 20 20 20 20 52 65 77 69 6e 64 28 63          Rewind(c
e2b0: 73 72 43 75 72 72 65 6e 74 29 3b 0a 2a 2a 20 20  srCurrent);.**  
e2c0: 20 20 20 20 20 0a 2a 2a 20 20 20 20 20 20 20 20       .**        
e2d0: 20 72 65 67 45 6e 64 20 3d 20 3c 65 78 70 72 32   regEnd = <expr2
e2e0: 3e 20 20 20 20 20 20 20 20 20 20 2f 2f 20 46 4f  >          // FO
e2f0: 4c 4c 4f 57 49 4e 47 20 65 78 70 72 65 73 73 69  LLOWING expressi
e300: 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 72 65  on.**         re
e310: 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72 31 3e  gStart = <expr1>
e320: 20 20 20 20 20 20 20 20 2f 2f 20 50 52 45 43 45          // PRECE
e330: 44 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 0a  DING expression.
e340: 2a 2a 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  **       }else{.
e350: 2a 2a 20 20 20 20 20 20 20 20 20 2f 2f 20 46 69  **         // Fi
e360: 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 62 72  rst time this br
e370: 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 2c 20 74  anch is taken, t
e380: 68 65 20 65 70 68 20 74 61 62 6c 65 20 63 6f 6e  he eph table con
e390: 74 61 69 6e 73 20 74 77 6f 20 0a 2a 2a 20 20 20  tains two .**   
e3a0: 20 20 20 20 20 20 2f 2f 20 72 6f 77 73 2e 20 54        // rows. T
e3b0: 68 65 20 66 69 72 73 74 20 72 6f 77 20 69 6e 20  he first row in 
e3c0: 74 68 65 20 70 61 72 74 69 74 69 6f 6e 2c 20 77  the partition, w
e3d0: 68 69 63 68 20 61 6c 6c 20 74 68 72 65 65 20 63  hich all three c
e3e0: 75 72 73 6f 72 73 0a 2a 2a 20 20 20 20 20 20 20  ursors.**       
e3f0: 20 20 2f 2f 20 63 75 72 72 65 6e 74 6c 79 20 70    // currently p
e400: 6f 69 6e 74 20 74 6f 2c 20 61 6e 64 20 74 68 65  oint to, and the
e410: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 77 2e 0a   following row..
e420: 2a 2a 20 20 20 20 20 20 20 20 20 41 47 47 53 54  **         AGGST
e430: 45 50 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 66  EP.**         if
e440: 28 20 28 72 65 67 45 6e 64 2d 2d 29 3c 3d 30 20  ( (regEnd--)<=0 
e450: 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ){.**           
e460: 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20  RETURN_ROW.**   
e470: 20 20 20 20 20 20 20 20 69 66 28 20 28 72 65 67          if( (reg
e480: 53 74 61 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a  Start--)<=0 ){.*
e490: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 41 47  *             AG
e4a0: 47 49 4e 56 45 52 53 45 0a 2a 2a 20 20 20 20 20  GINVERSE.**     
e4b0: 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20        }.**      
e4c0: 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 7d 0a     }.**       }.
e4d0: 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20  **     }.**     
e4e0: 66 6c 75 73 68 3a 0a 2a 2a 20 20 20 20 20 20 20  flush:.**       
e4f0: 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 20  AGGSTEP.**      
e500: 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 2a 2a 20   while( 1 ){.** 
e510: 20 20 20 20 20 20 20 20 52 45 54 55 52 4e 20 52          RETURN R
e520: 4f 57 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 66  OW.**         if
e530: 28 20 63 73 72 43 75 72 72 65 6e 74 20 69 73 20  ( csrCurrent is 
e540: 45 4f 46 20 29 20 62 72 65 61 6b 3b 0a 2a 2a 20  EOF ) break;.** 
e550: 20 20 20 20 20 20 20 20 69 66 28 20 28 72 65 67          if( (reg
e560: 53 74 61 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a  Start--)<=0 ){.*
e570: 2a 20 20 20 20 20 20 20 20 20 20 20 41 67 67 49  *           AggI
e580: 6e 76 65 72 73 65 28 63 73 72 53 74 61 72 74 29  nverse(csrStart)
e590: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 4e 65  .**           Ne
e5a0: 78 74 28 63 73 72 53 74 61 72 74 29 0a 2a 2a 20  xt(csrStart).** 
e5b0: 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20          }.**    
e5c0: 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70     }.**.** The p
e5d0: 73 65 75 64 6f 2d 63 6f 64 65 20 61 62 6f 76 65  seudo-code above
e5e0: 20 75 73 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77   uses the follow
e5f0: 69 6e 67 20 73 68 6f 72 74 68 61 6e 64 3a 0a 2a  ing shorthand:.*
e600: 2a 0a 2a 2a 20 20 20 41 47 47 53 54 45 50 3a 20  *.**   AGGSTEP: 
e610: 20 20 20 69 6e 76 6f 6b 65 20 74 68 65 20 61 67     invoke the ag
e620: 67 72 65 67 61 74 65 20 78 53 74 65 70 28 29 20  gregate xStep() 
e630: 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65 61 63  function for eac
e640: 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  h window functio
e650: 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  n.**            
e660: 20 20 20 77 69 74 68 20 61 72 67 75 6d 65 6e 74     with argument
e670: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
e680: 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 63  current row of c
e690: 75 72 73 6f 72 20 63 73 72 45 6e 64 2c 20 74 68  ursor csrEnd, th
e6a0: 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  en.**           
e6b0: 20 20 20 20 73 74 65 70 20 63 75 72 73 6f 72 20      step cursor 
e6c0: 63 73 72 45 6e 64 20 66 6f 72 77 61 72 64 20 6f  csrEnd forward o
e6d0: 6e 65 20 72 6f 77 20 28 69 2e 65 2e 20 73 71 6c  ne row (i.e. sql
e6e0: 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 29  ite3BtreeNext())
e6f0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 52 45 54 55 52 4e  ..**.**   RETURN
e700: 5f 52 4f 57 3a 20 72 65 74 75 72 6e 20 61 20 72  _ROW: return a r
e710: 6f 77 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ow to the caller
e720: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f   based on the co
e730: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a  ntents of the .*
e740: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
e750: 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 63  current row of c
e760: 73 72 43 75 72 72 65 6e 74 20 61 6e 64 20 74 68  srCurrent and th
e770: 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20  e current state 
e780: 6f 66 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 20 20  of all .**      
e790: 20 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61           aggrega
e7a0: 74 65 73 2e 20 54 68 65 6e 20 73 74 65 70 20 63  tes. Then step c
e7b0: 75 72 73 6f 72 20 63 73 72 43 75 72 72 65 6e 74  ursor csrCurrent
e7c0: 20 66 6f 72 77 61 72 64 20 6f 6e 65 20 72 6f 77   forward one row
e7d0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 41 47 47 49 4e 56  ..**.**   AGGINV
e7e0: 45 52 53 45 3a 20 69 6e 76 6f 6b 65 20 74 68 65  ERSE: invoke the
e7f0: 20 61 67 67 72 65 67 61 74 65 20 78 49 6e 76 65   aggregate xInve
e800: 72 73 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 66  rse() function f
e810: 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77 20 0a  or each window .
e820: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
e830: 20 66 75 6e 63 74 69 6f 6e 73 20 77 69 74 68 20   functions with 
e840: 61 72 67 75 6d 65 6e 74 73 20 72 65 61 64 20 66  arguments read f
e850: 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20  rom the current 
e860: 72 6f 77 20 6f 66 20 63 75 72 73 6f 72 0a 2a 2a  row of cursor.**
e870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
e880: 73 72 53 74 61 72 74 2e 20 54 68 65 6e 20 73 74  srStart. Then st
e890: 65 70 20 63 73 72 53 74 61 72 74 20 66 6f 72 77  ep csrStart forw
e8a0: 61 72 64 20 6f 6e 65 20 72 6f 77 2e 0a 2a 2a 0a  ard one row..**.
e8b0: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 74 77 6f  ** There are two
e8c0: 20 6f 74 68 65 72 20 52 4f 57 53 20 77 69 6e 64   other ROWS wind
e8d0: 6f 77 20 66 72 61 6d 65 73 20 74 68 61 74 20 61  ow frames that a
e8e0: 72 65 20 68 61 6e 64 6c 65 64 20 73 69 67 6e 69  re handled signi
e8f0: 66 69 63 61 6e 74 6c 79 0a 2a 2a 20 64 69 66 66  ficantly.** diff
e900: 65 72 65 6e 74 6c 79 20 66 72 6f 6d 20 74 68 65  erently from the
e910: 20 61 62 6f 76 65 20 2d 20 22 42 45 54 57 45 45   above - "BETWEE
e920: 4e 20 3c 65 78 70 72 3e 20 50 52 45 43 45 44 49  N <expr> PRECEDI
e930: 4e 47 20 41 4e 44 20 3c 65 78 70 72 3e 20 50 52  NG AND <expr> PR
e940: 45 43 45 44 49 4e 47 22 0a 2a 2a 20 61 6e 64 20  ECEDING".** and 
e950: 22 42 45 54 57 45 45 4e 20 3c 65 78 70 72 3e 20  "BETWEEN <expr> 
e960: 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e 44 20 3c 65  FOLLOWING AND <e
e970: 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 22 2e  xpr> FOLLOWING".
e980: 20 54 68 65 73 65 20 61 72 65 20 73 70 65 63 69   These are speci
e990: 61 6c 20 0a 2a 2a 20 63 61 73 65 73 20 62 65 63  al .** cases bec
e9a0: 61 75 73 65 20 74 68 65 79 20 63 68 61 6e 67 65  ause they change
e9b0: 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68   the order in wh
e9c0: 69 63 68 20 74 68 65 20 74 68 72 65 65 20 63 75  ich the three cu
e9d0: 72 73 6f 72 73 20 28 63 73 72 53 74 61 72 74 2c  rsors (csrStart,
e9e0: 0a 2a 2a 20 63 73 72 43 75 72 72 65 6e 74 20 61  .** csrCurrent a
e9f0: 6e 64 20 63 73 72 45 6e 64 29 20 69 74 65 72 61  nd csrEnd) itera
ea00: 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 65  te through the e
ea10: 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20  phemeral table. 
ea20: 43 61 73 65 73 20 74 68 61 74 0a 2a 2a 20 75 73  Cases that.** us
ea30: 65 20 55 4e 42 4f 55 4e 44 45 44 20 6f 72 20 43  e UNBOUNDED or C
ea40: 55 52 52 45 4e 54 20 52 4f 57 20 61 72 65 20 6d  URRENT ROW are m
ea50: 75 63 68 20 73 69 6d 70 6c 65 72 20 76 61 72 69  uch simpler vari
ea60: 61 74 69 6f 6e 73 20 6f 6e 20 6f 6e 65 20 6f 66  ations on one of
ea70: 20 74 68 65 73 65 0a 2a 2a 20 74 68 72 65 65 2e   these.** three.
ea80: 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57 53 20 42 45  .**.**   ROWS BE
ea90: 54 57 45 45 4e 20 3c 65 78 70 72 31 3e 20 50 52  TWEEN <expr1> PR
eaa0: 45 43 45 44 49 4e 47 20 41 4e 44 20 3c 65 78 70  ECEDING AND <exp
eab0: 72 32 3e 20 50 52 45 43 45 44 49 4e 47 0a 2a 2a  r2> PRECEDING.**
eac0: 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 6c 6f 6f 70  .**     ... loop
ead0: 20 73 74 61 72 74 65 64 20 62 79 20 73 71 6c 69   started by sqli
eae0: 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
eaf0: 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 69 66 28  ....**       if(
eb00: 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 20 29   new partition )
eb10: 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 47 6f 73  {.**         Gos
eb20: 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20 20 20 20  ub flush.**     
eb30: 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 49 6e 73    }.**       Ins
eb40: 65 72 74 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f  ert new row into
eb50: 20 65 70 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20   eph table..**  
eb60: 20 20 20 20 20 69 66 28 20 66 69 72 73 74 20 72       if( first r
eb70: 6f 77 20 6f 66 20 70 61 72 74 69 74 69 6f 6e 20  ow of partition 
eb80: 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 65  ){.**         Re
eb90: 77 69 6e 64 28 63 73 72 45 6e 64 29 0a 2a 2a 20  wind(csrEnd).** 
eba0: 20 20 20 20 20 20 20 20 52 65 77 69 6e 64 28 63          Rewind(c
ebb0: 73 72 53 74 61 72 74 29 0a 2a 2a 20 20 20 20 20  srStart).**     
ebc0: 20 20 20 20 52 65 77 69 6e 64 28 63 73 72 43 75      Rewind(csrCu
ebd0: 72 72 65 6e 74 29 0a 2a 2a 20 20 20 20 20 20 20  rrent).**       
ebe0: 20 20 72 65 67 45 6e 64 20 3d 20 3c 65 78 70 72    regEnd = <expr
ebf0: 32 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20 72 65  2>.**         re
ec00: 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72 31 3e  gStart = <expr1>
ec10: 0a 2a 2a 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  .**       }else{
ec20: 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 66 28 20  .**         if( 
ec30: 28 72 65 67 45 6e 64 2d 2d 29 3c 3d 30 20 29 7b  (regEnd--)<=0 ){
ec40: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 47  .**           AG
ec50: 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 20  GSTEP.**        
ec60: 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 45   }.**         RE
ec70: 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20  TURN_ROW.**     
ec80: 20 20 20 20 69 66 28 20 28 72 65 67 53 74 61 72      if( (regStar
ec90: 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20  t--)<=0 ){.**   
eca0: 20 20 20 20 20 20 20 20 41 47 47 49 4e 56 45 52          AGGINVER
ecb0: 53 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a  SE.**         }.
ecc0: 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20  **       }.**   
ecd0: 20 20 7d 0a 2a 2a 20 20 20 20 20 66 6c 75 73 68    }.**     flush
ece0: 3a 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 28  :.**       if( (
ecf0: 72 65 67 45 6e 64 2d 2d 29 3c 3d 30 20 29 7b 0a  regEnd--)<=0 ){.
ed00: 2a 2a 20 20 20 20 20 20 20 20 20 41 47 47 53 54  **         AGGST
ed10: 45 50 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a  EP.**       }.**
ed20: 20 20 20 20 20 20 20 52 45 54 55 52 4e 5f 52 4f         RETURN_RO
ed30: 57 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57  W.**.**.**   ROW
ed40: 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31  S BETWEEN <expr1
ed50: 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e 44 20  > FOLLOWING AND 
ed60: 3c 65 78 70 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e  <expr2> FOLLOWIN
ed70: 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20  G.**.**     ... 
ed80: 6c 6f 6f 70 20 73 74 61 72 74 65 64 20 62 79 20  loop started by 
ed90: 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
eda0: 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 69  n() ....**     i
edb0: 66 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e  f( new partition
edc0: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 47 6f 73   ){.**       Gos
edd0: 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20 20 20 20  ub flush.**     
ede0: 7d 0a 2a 2a 20 20 20 20 20 49 6e 73 65 72 74 20  }.**     Insert 
edf0: 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20 65 70 68  new row into eph
ee00: 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 69   table..**     i
ee10: 66 28 20 66 69 72 73 74 20 72 6f 77 20 6f 66 20  f( first row of 
ee20: 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20  partition ){.** 
ee30: 20 20 20 20 20 20 52 65 77 69 6e 64 28 63 73 72        Rewind(csr
ee40: 45 6e 64 29 0a 2a 2a 20 20 20 20 20 20 20 52 65  End).**       Re
ee50: 77 69 6e 64 28 63 73 72 53 74 61 72 74 29 0a 2a  wind(csrStart).*
ee60: 2a 20 20 20 20 20 20 20 52 65 77 69 6e 64 28 63  *       Rewind(c
ee70: 73 72 43 75 72 72 65 6e 74 29 0a 2a 2a 20 20 20  srCurrent).**   
ee80: 20 20 20 20 72 65 67 45 6e 64 20 3d 20 3c 65 78      regEnd = <ex
ee90: 70 72 32 3e 0a 2a 2a 20 20 20 20 20 20 20 72 65  pr2>.**       re
eea0: 67 53 74 61 72 74 20 3d 20 72 65 67 45 6e 64 20  gStart = regEnd 
eeb0: 2d 20 3c 65 78 70 72 31 3e 0a 2a 2a 20 20 20 20  - <expr1>.**    
eec0: 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20 20 20 20   }else{.**      
eed0: 20 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20 20   AGGSTEP.**     
eee0: 20 20 69 66 28 20 28 72 65 67 45 6e 64 2d 2d 29    if( (regEnd--)
eef0: 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  <=0 ){.**       
ef00: 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20    RETURN_ROW.** 
ef10: 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20        }.**      
ef20: 20 69 66 28 20 28 72 65 67 53 74 61 72 74 2d 2d   if( (regStart--
ef30: 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20  )<=0 ){.**      
ef40: 20 20 20 41 47 47 49 4e 56 45 52 53 45 0a 2a 2a     AGGINVERSE.**
ef50: 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
ef60: 7d 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20 66 6c  }.**   }.**   fl
ef70: 75 73 68 3a 0a 2a 2a 20 20 20 20 20 41 47 47 53  ush:.**     AGGS
ef80: 54 45 50 0a 2a 2a 20 20 20 20 20 77 68 69 6c 65  TEP.**     while
ef90: 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  ( 1 ){.**       
efa0: 69 66 28 20 28 72 65 67 45 6e 64 2d 2d 29 3c 3d  if( (regEnd--)<=
efb0: 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  0 ){.**         
efc0: 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20  RETURN_ROW.**   
efd0: 20 20 20 20 20 20 69 66 28 20 65 6f 66 20 29 20        if( eof ) 
efe0: 62 72 65 61 6b 3b 0a 2a 2a 20 20 20 20 20 20 20  break;.**       
eff0: 7d 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 28  }.**       if( (
f000: 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20 29  regStart--)<=0 )
f010: 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 47 47  {.**         AGG
f020: 49 4e 56 45 52 53 45 0a 2a 2a 20 20 20 20 20 20  INVERSE.**      
f030: 20 20 20 69 66 28 20 65 6f 66 20 29 20 62 72 65     if( eof ) bre
f040: 61 6b 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a  ak.**       }.**
f050: 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 77 68       }.**     wh
f060: 69 6c 65 28 20 21 65 6f 66 20 63 73 72 43 75 72  ile( !eof csrCur
f070: 72 65 6e 74 20 29 7b 0a 2a 2a 20 20 20 20 20 20  rent ){.**      
f080: 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20   RETURN_ROW.**  
f090: 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74     }.**.** For t
f0a0: 68 65 20 6d 6f 73 74 20 70 61 72 74 2c 20 74 68  he most part, th
f0b0: 65 20 70 61 74 74 65 72 6e 73 20 61 62 6f 76 65  e patterns above
f0c0: 20 61 72 65 20 61 64 61 70 74 65 64 20 74 6f 20   are adapted to 
f0d0: 73 75 70 70 6f 72 74 20 55 4e 42 4f 55 4e 44 45  support UNBOUNDE
f0e0: 44 20 62 79 0a 2a 2a 20 61 73 73 75 6d 69 6e 67  D by.** assuming
f0f0: 20 74 68 61 74 20 69 74 20 69 73 20 65 71 75 69   that it is equi
f100: 76 61 6c 65 6e 74 20 74 6f 20 22 69 6e 66 69 6e  valent to "infin
f110: 69 74 79 20 50 52 45 43 45 44 49 4e 47 2f 46 4f  ity PRECEDING/FO
f120: 4c 4c 4f 57 49 4e 47 22 20 61 6e 64 0a 2a 2a 20  LLOWING" and.** 
f130: 43 55 52 52 45 4e 54 20 52 4f 57 20 62 79 20 61  CURRENT ROW by a
f140: 73 73 75 6d 69 6e 67 20 74 68 61 74 20 69 74 20  ssuming that it 
f150: 69 73 20 65 71 75 69 76 69 6c 65 6e 74 20 74 6f  is equivilent to
f160: 20 22 30 20 50 52 45 43 45 44 49 4e 47 2f 46 4f   "0 PRECEDING/FO
f170: 4c 4c 4f 57 49 4e 47 22 2e 0a 2a 2a 20 54 68 69  LLOWING"..** Thi
f180: 73 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 6f  s is optimized o
f190: 66 20 63 6f 75 72 73 65 20 2d 20 62 72 61 6e 63  f course - branc
f1a0: 68 65 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 65  hes that will ne
f1b0: 76 65 72 20 62 65 20 74 61 6b 65 6e 20 61 6e 64  ver be taken and
f1c0: 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74  .** conditions t
f1d0: 68 61 74 20 61 72 65 20 61 6c 77 61 79 73 20 74  hat are always t
f1e0: 72 75 65 20 61 72 65 20 6f 6d 69 74 74 65 64 20  rue are omitted 
f1f0: 66 72 6f 6d 20 74 68 65 20 56 4d 20 63 6f 64 65  from the VM code
f200: 2e 20 54 68 65 20 6f 6e 6c 79 0a 2a 2a 20 65 78  . The only.** ex
f210: 63 65 70 74 69 6f 6e 61 6c 20 63 61 73 65 20 69  ceptional case i
f220: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57 53 20  s:.**.**   ROWS 
f230: 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31 3e 20  BETWEEN <expr1> 
f240: 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e 44 20 55 4e  FOLLOWING AND UN
f250: 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e  BOUNDED FOLLOWIN
f260: 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20  G.**.**     ... 
f270: 6c 6f 6f 70 20 73 74 61 72 74 65 64 20 62 79 20  loop started by 
f280: 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
f290: 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 69  n() ....**     i
f2a0: 66 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e  f( new partition
f2b0: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 47 6f 73   ){.**       Gos
f2c0: 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20 20 20 20  ub flush.**     
f2d0: 7d 0a 2a 2a 20 20 20 20 20 49 6e 73 65 72 74 20  }.**     Insert 
f2e0: 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20 65 70 68  new row into eph
f2f0: 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 69   table..**     i
f300: 66 28 20 66 69 72 73 74 20 72 6f 77 20 6f 66 20  f( first row of 
f310: 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20  partition ){.** 
f320: 20 20 20 20 20 20 52 65 77 69 6e 64 28 63 73 72        Rewind(csr
f330: 45 6e 64 29 0a 2a 2a 20 20 20 20 20 20 20 52 65  End).**       Re
f340: 77 69 6e 64 28 63 73 72 53 74 61 72 74 29 0a 2a  wind(csrStart).*
f350: 2a 20 20 20 20 20 20 20 52 65 77 69 6e 64 28 63  *       Rewind(c
f360: 73 72 43 75 72 72 65 6e 74 29 0a 2a 2a 20 20 20  srCurrent).**   
f370: 20 20 20 20 72 65 67 53 74 61 72 74 20 3d 20 3c      regStart = <
f380: 65 78 70 72 31 3e 0a 2a 2a 20 20 20 20 20 7d 65  expr1>.**     }e
f390: 6c 73 65 7b 0a 2a 2a 20 20 20 20 20 20 20 41 47  lse{.**       AG
f3a0: 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 7d 0a 2a  GSTEP.**     }.*
f3b0: 2a 20 20 20 7d 0a 2a 2a 20 20 20 66 6c 75 73 68  *   }.**   flush
f3c0: 3a 0a 2a 2a 20 20 20 20 20 41 47 47 53 54 45 50  :.**     AGGSTEP
f3d0: 0a 2a 2a 20 20 20 20 20 77 68 69 6c 65 28 20 31  .**     while( 1
f3e0: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28   ){.**       if(
f3f0: 20 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30   (regStart--)<=0
f400: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41   ){.**         A
f410: 47 47 49 4e 56 45 52 53 45 0a 2a 2a 20 20 20 20  GGINVERSE.**    
f420: 20 20 20 20 20 69 66 28 20 65 6f 66 20 29 20 62       if( eof ) b
f430: 72 65 61 6b 0a 2a 2a 20 20 20 20 20 20 20 7d 0a  reak.**       }.
f440: 2a 2a 20 20 20 20 20 20 20 52 45 54 55 52 4e 5f  **       RETURN_
f450: 52 4f 57 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20  ROW.**     }.** 
f460: 20 20 20 20 77 68 69 6c 65 28 20 21 65 6f 66 20      while( !eof 
f470: 63 73 72 43 75 72 72 65 6e 74 20 29 7b 0a 2a 2a  csrCurrent ){.**
f480: 20 20 20 20 20 20 20 52 45 54 55 52 4e 5f 52 4f         RETURN_RO
f490: 57 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a  W.**     }.**.**
f4a0: 20 53 6f 6d 65 74 69 6d 65 73 2c 20 74 68 69 73   Sometimes, this
f4b0: 20 66 75 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61   function genera
f4c0: 74 65 73 20 63 6f 64 65 20 74 6f 20 72 75 6e 20  tes code to run 
f4d0: 69 6e 20 22 63 61 63 68 65 20 6d 6f 64 65 22 20  in "cache mode" 
f4e0: 2d 20 6d 65 61 6e 69 6e 67 0a 2a 2a 20 74 68 65  - meaning.** the
f4f0: 20 65 6e 74 69 72 65 20 70 61 72 74 69 74 69 6f   entire partitio
f500: 6e 20 69 73 20 63 61 63 68 65 64 20 69 6e 20 74  n is cached in t
f510: 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  he ephemeral tab
f520: 6c 65 20 62 65 66 6f 72 65 20 61 6e 79 20 6f 66  le before any of
f530: 20 69 74 73 0a 2a 2a 20 72 6f 77 73 20 61 72 65   its.** rows are
f540: 20 70 72 6f 63 65 73 73 65 64 2c 20 69 6e 73 74   processed, inst
f550: 65 61 64 20 6f 66 20 70 72 6f 63 65 73 73 69 6e  ead of processin
f560: 67 20 72 6f 77 73 20 61 73 20 74 68 65 20 73 75  g rows as the su
f570: 62 2d 73 65 6c 65 63 74 20 64 65 6c 69 76 65 72  b-select deliver
f580: 73 0a 2a 2a 20 74 68 65 6d 2e 20 54 68 69 73 20  s.** them. This 
f590: 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20 63  is required by c
f5a0: 65 72 74 61 69 6e 20 62 75 69 6c 74 2d 69 6e 20  ertain built-in 
f5b0: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73  window functions
f5c0: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 0a 2a 2a  , for example.**
f5d0: 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b 28 29 20   percent_rank() 
f5e0: 6f 72 20 6c 65 61 64 28 29 2e 20 49 6e 20 74 68  or lead(). In th
f5f0: 61 74 20 63 61 73 65 2c 20 74 68 65 20 72 65 6c  at case, the rel
f600: 65 76 61 6e 74 20 70 73 65 75 64 6f 2d 63 6f 64  evant pseudo-cod
f610: 65 20 61 62 6f 76 65 0a 2a 2a 20 69 73 20 6d 6f  e above.** is mo
f620: 64 69 66 69 65 64 20 74 6f 3a 0a 2a 2a 0a 2a 2a  dified to:.**.**
f630: 20 20 20 20 20 2e 2e 2e 20 6c 6f 6f 70 20 73 74       ... loop st
f640: 61 72 74 65 64 20 62 79 20 73 71 6c 69 74 65 33  arted by sqlite3
f650: 57 68 65 72 65 42 65 67 69 6e 28 29 20 2e 2e 2e  WhereBegin() ...
f660: 0a 2a 2a 20 20 20 20 20 69 66 28 20 6e 65 77 20  .**     if( new 
f670: 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20  partition ){.** 
f680: 20 20 20 20 20 20 47 6f 73 75 62 20 66 6c 75 73        Gosub flus
f690: 68 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20  h.**     }.**   
f6a0: 20 20 49 6e 73 65 72 74 20 6e 65 77 20 72 6f 77    Insert new row
f6b0: 20 69 6e 74 6f 20 65 70 68 20 74 61 62 6c 65 2e   into eph table.
f6c0: 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20 66 6c 75  .**   }.**   flu
f6d0: 73 68 3a 0a 2a 2a 20 20 20 20 20 66 6f 72 20 65  sh:.**     for e
f6e0: 61 63 68 20 72 6f 77 20 69 6e 20 65 70 68 20 74  ach row in eph t
f6f0: 61 62 6c 65 20 7b 0a 2a 2a 0a 2a 2a 20 66 6f 6c  able {.**.** fol
f700: 6c 6f 77 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  lowed immediatel
f710: 79 20 62 79 20 74 68 65 20 63 6f 64 65 20 74 68  y by the code th
f720: 61 74 20 75 73 75 61 6c 6c 79 20 66 6f 6c 6c 6f  at usually follo
f730: 77 73 20 74 68 65 20 22 49 6e 73 65 72 74 20 6e  ws the "Insert n
f740: 65 77 20 72 6f 77 0a 2a 2a 20 69 6e 74 6f 20 65  ew row.** into e
f750: 70 68 20 74 61 62 6c 65 2e 22 20 6c 69 6e 65 2e  ph table." line.
f760: 0a 2a 2a 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  .**.*/.void sqli
f770: 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 53 74 65  te3WindowCodeSte
f780: 70 28 0a 20 20 20 20 50 61 72 73 65 20 2a 70 50  p(.    Parse *pP
f790: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
f7a0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
f7b0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
f7c0: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
f7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f7e0: 52 65 77 72 69 74 74 65 6e 20 53 45 4c 45 43 54  Rewritten SELECT
f7f0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
f800: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
f810: 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
f820: 2f 2a 20 43 6f 6e 74 65 78 74 20 72 65 74 75 72  /* Context retur
f830: 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 68  ned by sqlite3Wh
f840: 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20  ereBegin() */.  
f850: 69 6e 74 20 72 65 67 47 6f 73 75 62 2c 20 20 20  int regGosub,   
f860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f870: 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20  /* Register for 
f880: 4f 50 5f 47 6f 73 75 62 20 2a 2f 0a 20 20 69 6e  OP_Gosub */.  in
f890: 74 20 61 64 64 72 47 6f 73 75 62 20 20 20 20 20  t addrGosub     
f8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f8b0: 20 4f 50 5f 47 6f 73 75 62 20 68 65 72 65 20 74   OP_Gosub here t
f8c0: 6f 20 72 65 74 75 72 6e 20 65 61 63 68 20 72 6f  o return each ro
f8d0: 77 20 2a 2f 0a 29 7b 0a 20 20 57 69 6e 64 6f 77  w */.){.  Window
f8e0: 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57 69   *pMWin = p->pWi
f8f0: 6e 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  n;.  ExprList *p
f900: 4f 72 64 65 72 42 79 20 3d 20 70 4d 57 69 6e 2d  OrderBy = pMWin-
f910: 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 56 64 62  >pOrderBy;.  Vdb
f920: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
f930: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
f940: 20 69 6e 74 20 62 43 61 63 68 65 3b 20 20 20 20   int bCache;    
f950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f960: 20 2f 2a 20 54 72 75 65 20 69 66 20 67 65 6e 65   /* True if gene
f970: 72 61 74 69 6e 67 20 22 63 61 63 68 65 2d 6d 6f  rating "cache-mo
f980: 64 65 22 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  de" code */.  in
f990: 74 20 72 65 67 46 6c 75 73 68 50 61 72 74 3b 20  t regFlushPart; 
f9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f9b0: 20 52 65 67 69 73 74 65 72 20 66 6f 72 20 22 47   Register for "G
f9c0: 6f 73 75 62 20 66 6c 75 73 68 5f 70 61 72 74 69  osub flush_parti
f9d0: 74 69 6f 6e 22 20 2a 2f 0a 20 20 69 6e 74 20 63  tion" */.  int c
f9e0: 73 72 57 72 69 74 65 3b 20 20 20 20 20 20 20 20  srWrite;        
f9f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
fa00: 72 73 6f 72 20 75 73 65 64 20 74 6f 20 77 72 69  rsor used to wri
fa10: 74 65 20 74 6f 20 65 70 68 2e 20 74 61 62 6c 65  te to eph. table
fa20: 20 2a 2f 0a 20 20 69 6e 74 20 63 73 72 49 6e 70   */.  int csrInp
fa30: 75 74 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  ut = p->pSrc->a[
fa40: 30 5d 2e 69 43 75 72 73 6f 72 3b 20 20 20 20 20  0].iCursor;     
fa50: 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20 73 75 62  /* Cursor of sub
fa60: 2d 73 65 6c 65 63 74 20 2a 2f 0a 20 20 69 6e 74  -select */.  int
fa70: 20 6e 49 6e 70 75 74 20 3d 20 70 2d 3e 70 53 72   nInput = p->pSr
fa80: 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 2d 3e 6e 43  c->a[0].pTab->nC
fa90: 6f 6c 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ol;    /* Number
faa0: 20 6f 66 20 63 6f 6c 73 20 72 65 74 75 72 6e 65   of cols returne
fab0: 64 20 62 79 20 73 75 62 20 2a 2f 0a 20 20 69 6e  d by sub */.  in
fac0: 74 20 69 49 6e 70 75 74 3b 20 20 20 20 20 20 20  t iInput;       
fad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fae0: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 20 69 74          /* To it
faf0: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 73 75  erate through su
fb00: 62 20 63 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20  b cols */.  int 
fb10: 61 64 64 72 47 6f 74 6f 3b 20 20 20 20 20 20 20  addrGoto;       
fb20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
fb30: 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 47 6f 74  ddress of OP_Got
fb40: 6f 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 49  o */.  int addrI
fb50: 66 4e 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20  fNot;           
fb60: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
fb70: 73 20 6f 66 20 4f 50 5f 49 66 4e 6f 74 20 2a 2f  s of OP_IfNot */
fb80: 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75 62  .  int addrGosub
fb90: 46 6c 75 73 68 3b 20 20 20 20 20 20 20 20 20 20  Flush;          
fba0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
fbb0: 20 4f 50 5f 47 6f 73 75 62 20 74 6f 20 66 6c 75   OP_Gosub to flu
fbc0: 73 68 3a 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  sh: */.  int add
fbd0: 72 49 6e 74 65 67 65 72 3b 20 20 20 20 20 20 20  rInteger;       
fbe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
fbf0: 65 73 73 20 6f 66 20 4f 50 5f 49 6e 74 65 67 65  ess of OP_Intege
fc00: 72 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43  r */.  int addrC
fc10: 61 63 68 65 52 65 77 69 6e 64 3b 20 20 20 20 20  acheRewind;     
fc20: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
fc30: 73 20 6f 66 20 4f 50 5f 52 65 77 69 6e 64 20 75  s of OP_Rewind u
fc40: 73 65 64 20 69 6e 20 63 61 63 68 65 2d 6d 6f 64  sed in cache-mod
fc50: 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43  e */.  int addrC
fc60: 61 63 68 65 4e 65 78 74 3b 20 20 20 20 20 20 20  acheNext;       
fc70: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
fc80: 65 72 65 20 66 6f 72 20 6e 65 78 74 20 72 6f 77  ere for next row
fc90: 20 69 6e 20 63 61 63 68 65 2d 6d 6f 64 65 20 2a   in cache-mode *
fca0: 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 68 6f 72  /.  int addrShor
fcb0: 74 63 75 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  tcut = 0;.  int 
fcc0: 61 64 64 72 45 6d 70 74 79 20 3d 20 30 3b 20 20  addrEmpty = 0;  
fcd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
fce0: 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 52 65 77  ddress of OP_Rew
fcf0: 69 6e 64 20 69 6e 20 66 6c 75 73 68 3a 20 2a 2f  ind in flush: */
fd00: 0a 20 20 69 6e 74 20 61 64 64 72 50 65 65 72 4a  .  int addrPeerJ
fd10: 75 6d 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ump = 0;        
fd20: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
fd30: 20 6a 75 6d 70 20 74 61 6b 65 6e 20 69 66 20 6e   jump taken if n
fd40: 6f 74 20 6e 65 77 20 70 65 65 72 20 2a 2f 0a 20  ot new peer */. 
fd50: 20 69 6e 74 20 72 65 67 53 74 61 72 74 20 3d 20   int regStart = 
fd60: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
fd70: 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 3c 65 78   /* Value of <ex
fd80: 70 72 3e 20 50 52 45 43 45 44 49 4e 47 20 2a 2f  pr> PRECEDING */
fd90: 0a 20 20 69 6e 74 20 72 65 67 45 6e 64 20 3d 20  .  int regEnd = 
fda0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
fdb0: 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 3c     /* Value of <
fdc0: 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20  expr> FOLLOWING 
fdd0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4e 65 77 3b  */.  int regNew;
fde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fdf0: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
fe00: 20 72 65 67 69 73 74 65 72 73 20 68 6f 6c 64 69   registers holdi
fe10: 6e 67 20 6e 65 77 20 69 6e 70 75 74 20 72 6f 77  ng new input row
fe20: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63   */.  int regRec
fe30: 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ord;            
fe40: 20 20 20 20 20 20 2f 2a 20 72 65 67 4e 65 77 20        /* regNew 
fe50: 61 72 72 61 79 20 69 6e 20 72 65 63 6f 72 64 20  array in record 
fe60: 66 6f 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 72 65  form */.  int re
fe70: 67 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20  gRowid;         
fe80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77            /* Row
fe90: 69 64 20 66 6f 72 20 72 65 67 52 65 63 6f 72 64  id for regRecord
fea0: 20 69 6e 20 65 70 68 20 74 61 62 6c 65 20 2a 2f   in eph table */
feb0: 0a 20 20 69 6e 74 20 72 65 67 4e 65 77 50 65 65  .  int regNewPee
fec0: 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
fed0: 20 20 20 2f 2a 20 50 65 65 72 20 76 61 6c 75 65     /* Peer value
fee0: 73 20 66 6f 72 20 6e 65 77 20 72 6f 77 20 28 70  s for new row (p
fef0: 61 72 74 20 6f 66 20 72 65 67 4e 65 77 29 20 2a  art of regNew) *
ff00: 2f 0a 20 20 69 6e 74 20 72 65 67 50 65 65 72 20  /.  int regPeer 
ff10: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
ff20: 20 20 20 20 2f 2a 20 50 65 65 72 20 76 61 6c 75      /* Peer valu
ff30: 65 73 20 66 6f 72 20 63 75 72 72 65 6e 74 20 72  es for current r
ff40: 6f 77 20 2a 2f 0a 20 20 57 69 6e 64 6f 77 43 6f  ow */.  WindowCo
ff50: 64 65 41 72 67 20 73 3b 20 20 20 20 20 20 20 20  deArg s;        
ff60: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
ff70: 78 74 20 6f 62 6a 65 63 74 20 66 6f 72 20 73 75  xt object for su
ff80: 62 2d 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 0a 20  b-routines */.. 
ff90: 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e   assert( pMWin->
ffa0: 65 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45  eStart==TK_PRECE
ffb0: 44 49 4e 47 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65  DING || pMWin->e
ffc0: 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e  Start==TK_CURREN
ffd0: 54 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d 57  T .       || pMW
ffe0: 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46  in->eStart==TK_F
fff0: 4f 4c 4c 4f 57 49 4e 47 20 7c 7c 20 70 4d 57 69  OLLOWING || pMWi
10000 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e  n->eStart==TK_UN
10010 42 4f 55 4e 44 45 44 20 0a 20 20 29 3b 0a 20 20  BOUNDED .  );.  
10020 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65  assert( pMWin->e
10030 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e  End==TK_FOLLOWIN
10040 47 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e 64  G || pMWin->eEnd
10050 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 0a 20 20  ==TK_CURRENT .  
10060 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65       || pMWin->e
10070 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  End==TK_UNBOUNDE
10080 44 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e 64  D || pMWin->eEnd
10090 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 0a  ==TK_PRECEDING .
100a0 20 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 74 65 72    );..  /* Deter
100b0 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
100c0 6e 6f 74 20 65 61 63 68 20 70 61 72 74 69 74 69  not each partiti
100d0 6f 6e 20 77 69 6c 6c 20 62 65 20 63 61 63 68 65  on will be cache
100e0 64 20 62 65 66 6f 72 65 20 62 65 67 69 6e 6e 69  d before beginni
100f0 6e 67 0a 20 20 2a 2a 20 74 6f 20 70 72 6f 63 65  ng.  ** to proce
10100 73 73 20 72 6f 77 73 20 77 69 74 68 69 6e 20 69  ss rows within i
10110 74 2e 20 20 2a 2f 0a 20 20 62 43 61 63 68 65 20  t.  */.  bCache 
10120 3d 20 77 69 6e 64 6f 77 43 61 63 68 65 50 61 72  = windowCachePar
10130 74 69 74 69 6f 6e 28 70 4d 57 69 6e 29 3b 0a 0a  tition(pMWin);..
10140 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
10150 20 63 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20   context object 
10160 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 73 2c 20  */.  memset(&s, 
10170 30 2c 20 73 69 7a 65 6f 66 28 57 69 6e 64 6f 77  0, sizeof(Window
10180 43 6f 64 65 41 72 67 29 29 3b 0a 20 20 73 2e 70  CodeArg));.  s.p
10190 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
101a0 20 20 73 2e 70 4d 57 69 6e 20 3d 20 70 4d 57 69    s.pMWin = pMWi
101b0 6e 3b 0a 20 20 73 2e 70 56 64 62 65 20 3d 20 76  n;.  s.pVdbe = v
101c0 3b 0a 20 20 73 2e 72 65 67 47 6f 73 75 62 20 3d  ;.  s.regGosub =
101d0 20 72 65 67 47 6f 73 75 62 3b 0a 20 20 73 2e 61   regGosub;.  s.a
101e0 64 64 72 47 6f 73 75 62 20 3d 20 61 64 64 72 47  ddrGosub = addrG
101f0 6f 73 75 62 3b 0a 20 20 73 2e 63 75 72 72 65 6e  osub;.  s.curren
10200 74 2e 63 73 72 20 3d 20 70 4d 57 69 6e 2d 3e 69  t.csr = pMWin->i
10210 45 70 68 43 73 72 3b 0a 20 20 63 73 72 57 72 69  EphCsr;.  csrWri
10220 74 65 20 3d 20 73 2e 63 75 72 72 65 6e 74 2e 63  te = s.current.c
10230 73 72 2b 31 3b 0a 20 20 73 2e 73 74 61 72 74 2e  sr+1;.  s.start.
10240 63 73 72 20 3d 20 73 2e 63 75 72 72 65 6e 74 2e  csr = s.current.
10250 63 73 72 2b 32 3b 0a 20 20 73 2e 65 6e 64 2e 63  csr+2;.  s.end.c
10260 73 72 20 3d 20 73 2e 63 75 72 72 65 6e 74 2e 63  sr = s.current.c
10270 73 72 2b 33 3b 0a 0a 20 20 72 65 67 4e 65 77 20  sr+3;..  regNew 
10280 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
10290 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  ;.  pParse->nMem
102a0 20 2b 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 72 65   += nInput;.  re
102b0 67 52 65 63 6f 72 64 20 3d 20 2b 2b 70 50 61 72  gRecord = ++pPar
102c0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 52  se->nMem;.  regR
102d0 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d  owid = ++pParse-
102e0 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 46 6c 75 73  >nMem;.  regFlus
102f0 68 50 61 72 74 20 3d 20 2b 2b 70 50 61 72 73 65  hPart = ++pParse
10300 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 2f 2a 20 49 66  ->nMem;..  /* If
10310 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61 6d   the window fram
10320 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 3c  e contains an "<
10330 65 78 70 72 3e 20 50 52 45 43 45 44 49 4e 47 22  expr> PRECEDING"
10340 20 6f 72 20 22 3c 65 78 70 72 3e 20 46 4f 4c 4c   or "<expr> FOLL
10350 4f 57 49 4e 47 22 0a 20 20 2a 2a 20 63 6c 61 75  OWING".  ** clau
10360 73 65 2c 20 61 6c 6c 6f 63 61 74 65 20 72 65 67  se, allocate reg
10370 69 73 74 65 72 73 20 74 6f 20 73 74 6f 72 65 20  isters to store 
10380 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 65  the results of e
10390 76 61 6c 75 61 74 69 6e 67 20 65 61 63 68 0a 20  valuating each. 
103a0 20 2a 2a 20 3c 65 78 70 72 3e 2e 20 20 2a 2f 0a   ** <expr>.  */.
103b0 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74    if( pMWin->eSt
103c0 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e  art==TK_PRECEDIN
103d0 47 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61  G || pMWin->eSta
103e0 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  rt==TK_FOLLOWING
103f0 20 29 7b 0a 20 20 20 20 72 65 67 53 74 61 72 74   ){.    regStart
10400 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
10410 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d 57  m;.  }.  if( pMW
10420 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52 45  in->eEnd==TK_PRE
10430 43 45 44 49 4e 47 20 7c 7c 20 70 4d 57 69 6e 2d  CEDING || pMWin-
10440 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57  >eEnd==TK_FOLLOW
10450 49 4e 47 20 29 7b 0a 20 20 20 20 72 65 67 45 6e  ING ){.    regEn
10460 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  d = ++pParse->nM
10470 65 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  em;.  }..  /* If
10480 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 22   this is not a "
10490 52 4f 57 53 20 42 45 54 57 45 45 4e 20 2e 2e 2e  ROWS BETWEEN ...
104a0 22 20 66 72 61 6d 65 2c 20 74 68 65 6e 20 61 6c  " frame, then al
104b0 6c 6f 63 61 74 65 20 61 72 72 61 79 73 20 6f 66  locate arrays of
104c0 0a 20 20 2a 2a 20 72 65 67 69 73 74 65 72 73 20  .  ** registers 
104d0 74 6f 20 73 74 6f 72 65 20 63 6f 70 69 65 73 20  to store copies 
104e0 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
104f0 65 78 70 72 65 73 73 69 6f 6e 73 20 28 70 65 65  expressions (pee
10500 72 20 76 61 6c 75 65 73 29 20 0a 20 20 2a 2a 20  r values) .  ** 
10510 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 6c 6f 6f  for the main loo
10520 70 2c 20 61 6e 64 20 66 6f 72 20 65 61 63 68 20  p, and for each 
10530 63 75 72 73 6f 72 20 28 73 74 61 72 74 2c 20 63  cursor (start, c
10540 75 72 72 65 6e 74 20 61 6e 64 20 65 6e 64 29 2e  urrent and end).
10550 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d   */.  if( pMWin-
10560 3e 65 54 79 70 65 21 3d 54 4b 5f 52 4f 57 53 20  >eType!=TK_ROWS 
10570 29 7b 0a 20 20 20 20 69 6e 74 20 6e 50 65 65 72  ){.    int nPeer
10580 20 3d 20 28 70 4f 72 64 65 72 42 79 20 3f 20 70   = (pOrderBy ? p
10590 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 3a  OrderBy->nExpr :
105a0 20 30 29 3b 0a 20 20 20 20 72 65 67 4e 65 77 50   0);.    regNewP
105b0 65 65 72 20 3d 20 72 65 67 4e 65 77 20 2b 20 70  eer = regNew + p
105c0 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c  MWin->nBufferCol
105d0 3b 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d  ;.    if( pMWin-
105e0 3e 70 50 61 72 74 69 74 69 6f 6e 20 29 20 72 65  >pPartition ) re
105f0 67 4e 65 77 50 65 65 72 20 2b 3d 20 70 4d 57 69  gNewPeer += pMWi
10600 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2d 3e 6e  n->pPartition->n
10610 45 78 70 72 3b 0a 20 20 20 20 72 65 67 50 65 65  Expr;.    regPee
10620 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  r = pParse->nMem
10630 2b 31 3b 20 20 20 20 20 20 20 70 50 61 72 73 65  +1;       pParse
10640 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 65 65 72 3b  ->nMem += nPeer;
10650 0a 20 20 20 20 73 2e 73 74 61 72 74 2e 72 65 67  .    s.start.reg
10660 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
10670 31 3b 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  1;   pParse->nMe
10680 6d 20 2b 3d 20 6e 50 65 65 72 3b 0a 20 20 20 20  m += nPeer;.    
10690 73 2e 63 75 72 72 65 6e 74 2e 72 65 67 20 3d 20  s.current.reg = 
106a0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 20  pParse->nMem+1; 
106b0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
106c0 6e 50 65 65 72 3b 0a 20 20 20 20 73 2e 65 6e 64  nPeer;.    s.end
106d0 2e 72 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e  .reg = pParse->n
106e0 4d 65 6d 2b 31 3b 20 20 20 20 20 70 50 61 72 73  Mem+1;     pPars
106f0 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 65 65 72  e->nMem += nPeer
10700 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 61 64  ;.  }..  /* Load
10710 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75   the column valu
10720 65 73 20 66 6f 72 20 74 68 65 20 72 6f 77 20 72  es for the row r
10730 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 73  eturned by the s
10740 75 62 2d 73 65 6c 65 63 74 0a 20 20 2a 2a 20 69  ub-select.  ** i
10750 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20  nto an array of 
10760 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
10770 6e 67 20 61 74 20 72 65 67 4e 65 77 2e 20 41 73  ng at regNew. As
10780 73 65 6d 62 6c 65 20 74 68 65 6d 20 69 6e 74 6f  semble them into
10790 0a 20 20 2a 2a 20 61 20 72 65 63 6f 72 64 20 69  .  ** a record i
107a0 6e 20 72 65 67 69 73 74 65 72 20 72 65 67 52 65  n register regRe
107b0 63 6f 72 64 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  cord. */.  for(i
107c0 49 6e 70 75 74 3d 30 3b 20 69 49 6e 70 75 74 3c  Input=0; iInput<
107d0 6e 49 6e 70 75 74 3b 20 69 49 6e 70 75 74 2b 2b  nInput; iInput++
107e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
107f0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
10800 6f 6c 75 6d 6e 2c 20 63 73 72 49 6e 70 75 74 2c  olumn, csrInput,
10810 20 69 49 6e 70 75 74 2c 20 72 65 67 4e 65 77 2b   iInput, regNew+
10820 69 49 6e 70 75 74 29 3b 0a 20 20 7d 0a 20 20 73  iInput);.  }.  s
10830 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
10840 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
10850 64 2c 20 72 65 67 4e 65 77 2c 20 6e 49 6e 70 75  d, regNew, nInpu
10860 74 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 0a  t, regRecord);..
10870 20 20 2f 2a 20 41 6e 20 69 6e 70 75 74 20 72 6f    /* An input ro
10880 77 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  w has just been 
10890 72 65 61 64 20 69 6e 74 6f 20 61 6e 20 61 72 72  read into an arr
108a0 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ay of registers 
108b0 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74  starting.  ** at
108c0 20 72 65 67 4e 65 77 2e 20 49 66 20 74 68 65 20   regNew. If the 
108d0 77 69 6e 64 6f 77 20 68 61 73 20 61 20 50 41 52  window has a PAR
108e0 54 49 54 49 4f 4e 20 63 6c 61 75 73 65 2c 20 74  TITION clause, t
108f0 68 69 73 20 62 6c 6f 63 6b 20 67 65 6e 65 72 61  his block genera
10900 74 65 73 20 0a 20 20 2a 2a 20 56 4d 20 63 6f 64  tes .  ** VM cod
10910 65 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68  e to check if th
10920 65 20 69 6e 70 75 74 20 72 6f 77 20 69 73 20 74  e input row is t
10930 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 6e 65  he start of a ne
10940 77 20 70 61 72 74 69 74 69 6f 6e 2e 0a 20 20 2a  w partition..  *
10950 2a 20 49 66 20 73 6f 2c 20 69 74 20 64 6f 65 73  * If so, it does
10960 20 61 6e 20 4f 50 5f 47 6f 73 75 62 20 74 6f 20   an OP_Gosub to 
10970 61 6e 20 61 64 64 72 65 73 73 20 74 6f 20 62 65  an address to be
10980 20 66 69 6c 6c 65 64 20 69 6e 20 6c 61 74 65 72   filled in later
10990 2e 20 54 68 65 0a 20 20 2a 2a 20 61 64 64 72 65  . The.  ** addre
109a0 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 47 6f 73  ss of the OP_Gos
109b0 75 62 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ub is stored in 
109c0 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 20 61  local variable a
109d0 64 64 72 47 6f 73 75 62 46 6c 75 73 68 2e 20 2a  ddrGosubFlush. *
109e0 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70  /.  if( pMWin->p
109f0 50 61 72 74 69 74 69 6f 6e 20 29 7b 0a 20 20 20  Partition ){.   
10a00 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 45   int addr;.    E
10a10 78 70 72 4c 69 73 74 20 2a 70 50 61 72 74 20 3d  xprList *pPart =
10a20 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69   pMWin->pPartiti
10a30 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 50 61 72  on;.    int nPar
10a40 74 20 3d 20 70 50 61 72 74 2d 3e 6e 45 78 70 72  t = pPart->nExpr
10a50 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 4e 65 77  ;.    int regNew
10a60 50 61 72 74 20 3d 20 72 65 67 4e 65 77 20 2b 20  Part = regNew + 
10a70 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f  pMWin->nBufferCo
10a80 6c 3b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  l;.    KeyInfo *
10a90 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
10aa0 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  e3KeyInfoFromExp
10ab0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 50  rList(pParse, pP
10ac0 61 72 74 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20  art, 0, 0);..   
10ad0 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
10ae0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
10af0 43 6f 6d 70 61 72 65 2c 20 72 65 67 4e 65 77 50  Compare, regNewP
10b00 61 72 74 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50  art, pMWin->regP
10b10 61 72 74 2c 20 6e 50 61 72 74 29 3b 0a 20 20 20  art, nPart);.   
10b20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65   sqlite3VdbeAppe
10b30 6e 64 50 34 28 76 2c 20 28 76 6f 69 64 2a 29 70  ndP4(v, (void*)p
10b40 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
10b50 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  NFO);.    sqlite
10b60 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
10b70 50 5f 4a 75 6d 70 2c 20 61 64 64 72 2b 32 2c 20  P_Jump, addr+2, 
10b80 61 64 64 72 2b 34 2c 20 61 64 64 72 2b 32 29 3b  addr+4, addr+2);
10b90 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
10ba0 65 45 71 4e 65 28 76 29 3b 0a 20 20 20 20 61 64  eEqNe(v);.    ad
10bb0 64 72 47 6f 73 75 62 46 6c 75 73 68 20 3d 20 73  drGosubFlush = s
10bc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
10bd0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
10be0 67 46 6c 75 73 68 50 61 72 74 29 3b 0a 20 20 20  gFlushPart);.   
10bf0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
10c00 20 22 63 61 6c 6c 20 66 6c 75 73 68 5f 70 61 72   "call flush_par
10c10 74 69 74 69 6f 6e 22 29 29 3b 0a 20 20 20 20 73  tition"));.    s
10c20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
10c30 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67  (v, OP_Copy, reg
10c40 4e 65 77 50 61 72 74 2c 20 70 4d 57 69 6e 2d 3e  NewPart, pMWin->
10c50 72 65 67 50 61 72 74 2c 20 6e 50 61 72 74 2d 31  regPart, nPart-1
10c60 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73  );.  }..  /* Ins
10c70 65 72 74 20 74 68 65 20 6e 65 77 20 72 6f 77 20  ert the new row 
10c80 69 6e 74 6f 20 74 68 65 20 65 70 68 65 6d 65 72  into the ephemer
10c90 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71  al table */.  sq
10ca0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
10cb0 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
10cc0 63 73 72 57 72 69 74 65 2c 20 72 65 67 52 6f 77  csrWrite, regRow
10cd0 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  id);.  sqlite3Vd
10ce0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
10cf0 6e 73 65 72 74 2c 20 63 73 72 57 72 69 74 65 2c  nsert, csrWrite,
10d00 20 72 65 67 52 65 63 6f 72 64 2c 20 72 65 67 52   regRecord, regR
10d10 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  owid);.  sqlite3
10d20 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10d30 5f 41 64 64 49 6d 6d 2c 20 70 4d 57 69 6e 2d 3e  _AddImm, pMWin->
10d40 72 65 67 53 69 7a 65 2c 20 31 29 3b 0a 0a 20 20  regSize, 1);..  
10d50 69 66 28 20 62 43 61 63 68 65 20 29 7b 0a 20 20  if( bCache ){.  
10d60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10d70 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
10d80 72 2c 20 30 2c 20 70 4d 57 69 6e 2d 3e 72 65 67  r, 0, pMWin->reg
10d90 46 69 72 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  First);.    sqli
10da0 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
10db0 66 6f 29 3b 0a 20 20 20 20 61 64 64 72 49 6e 74  fo);.    addrInt
10dc0 65 67 65 72 20 3d 20 73 71 6c 69 74 65 33 56 64  eger = sqlite3Vd
10dd0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
10de0 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 46 6c  nteger, 0, regFl
10df0 75 73 68 50 61 72 74 29 3b 0a 20 20 20 20 69 66  ushPart);.    if
10e00 28 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74  ( pMWin->pPartit
10e10 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ion ){.      sql
10e20 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
10e30 28 76 2c 20 61 64 64 72 47 6f 73 75 62 46 6c 75  (v, addrGosubFlu
10e40 73 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  sh);.    }.    a
10e50 64 64 72 43 61 63 68 65 52 65 77 69 6e 64 20 3d  ddrCacheRewind =
10e60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10e70 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p1(v, OP_Rewind,
10e80 20 63 73 72 57 72 69 74 65 29 3b 0a 20 20 7d 65   csrWrite);.  }e
10e90 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 49 66 4e  lse{.    addrIfN
10ea0 6f 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ot = sqlite3Vdbe
10eb0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
10ec0 6f 74 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 46 69  ot, pMWin->regFi
10ed0 72 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rst);.  }..  /* 
10ee0 54 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 72 75  This block is ru
10ef0 6e 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  n for the first 
10f00 72 6f 77 20 6f 66 20 65 61 63 68 20 70 61 72 74  row of each part
10f10 69 74 69 6f 6e 20 2a 2f 0a 20 20 73 2e 72 65 67  ition */.  s.reg
10f20 41 72 67 20 3d 20 77 69 6e 64 6f 77 49 6e 69 74  Arg = windowInit
10f30 41 63 63 75 6d 28 70 50 61 72 73 65 2c 20 70 4d  Accum(pParse, pM
10f40 57 69 6e 29 3b 0a 0a 20 20 69 66 28 20 72 65 67  Win);..  if( reg
10f50 53 74 61 72 74 20 29 7b 0a 20 20 20 20 73 71 6c  Start ){.    sql
10f60 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
10f70 72 73 65 2c 20 70 4d 57 69 6e 2d 3e 70 53 74 61  rse, pMWin->pSta
10f80 72 74 2c 20 72 65 67 53 74 61 72 74 29 3b 0a 20  rt, regStart);. 
10f90 20 20 20 77 69 6e 64 6f 77 43 68 65 63 6b 49 6e     windowCheckIn
10fa0 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 72  tValue(pParse, r
10fb0 65 67 53 74 61 72 74 2c 20 30 29 3b 0a 20 20 7d  egStart, 0);.  }
10fc0 0a 20 20 69 66 28 20 72 65 67 45 6e 64 20 29 7b  .  if( regEnd ){
10fd0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
10fe0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4d 57  Code(pParse, pMW
10ff0 69 6e 2d 3e 70 45 6e 64 2c 20 72 65 67 45 6e 64  in->pEnd, regEnd
11000 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43 68 65  );.    windowChe
11010 63 6b 49 6e 74 56 61 6c 75 65 28 70 50 61 72 73  ckIntValue(pPars
11020 65 2c 20 72 65 67 45 6e 64 2c 20 31 29 3b 0a 20  e, regEnd, 1);. 
11030 20 7d 0a 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d   }..  if( pMWin-
11040 3e 65 53 74 61 72 74 3d 3d 70 4d 57 69 6e 2d 3e  >eStart==pMWin->
11050 65 45 6e 64 20 26 26 20 72 65 67 53 74 61 72 74  eEnd && regStart
11060 20 26 26 20 72 65 67 45 6e 64 20 29 7b 0a 20 20   && regEnd ){.  
11070 20 20 69 6e 74 20 6f 70 20 3d 20 28 28 70 4d 57    int op = ((pMW
11080 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46  in->eStart==TK_F
11090 4f 4c 4c 4f 57 49 4e 47 29 20 3f 20 4f 50 5f 47  OLLOWING) ? OP_G
110a0 65 20 3a 20 4f 50 5f 4c 65 29 3b 0a 20 20 20 20  e : OP_Le);.    
110b0 69 6e 74 20 61 64 64 72 47 65 20 3d 20 73 71 6c  int addrGe = sql
110c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
110d0 2c 20 6f 70 2c 20 72 65 67 53 74 61 72 74 2c 20  , op, regStart, 
110e0 30 2c 20 72 65 67 45 6e 64 29 3b 0a 20 20 20 20  0, regEnd);.    
110f0 77 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 70  windowAggFinal(p
11100 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 30 29  Parse, pMWin, 0)
11110 3b 0a 20 20 20 20 69 66 28 20 62 43 61 63 68 65  ;.    if( bCache
11120 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
11130 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
11140 50 5f 52 6f 77 69 64 2c 20 63 73 72 57 72 69 74  P_Rowid, csrWrit
11150 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  e, regRowid);.  
11160 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11170 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45  ddOp3(v, OP_NotE
11180 78 69 73 74 73 2c 20 73 2e 63 75 72 72 65 6e 74  xists, s.current
11190 2e 63 73 72 2c 20 30 2c 20 72 65 67 52 6f 77 69  .csr, 0, regRowi
111a0 64 29 3b 0a 20 20 20 20 20 20 77 69 6e 64 6f 77  d);.      window
111b0 52 65 74 75 72 6e 4f 6e 65 52 6f 77 28 70 50 61  ReturnOneRow(pPa
111c0 72 73 65 2c 20 70 4d 57 69 6e 2c 20 72 65 67 47  rse, pMWin, regG
111d0 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29  osub, addrGosub)
111e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
111f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11200 4e 65 78 74 2c 20 63 73 72 57 72 69 74 65 2c 20  Next, csrWrite, 
11210 61 64 64 72 43 61 63 68 65 52 65 77 69 6e 64 2b  addrCacheRewind+
11220 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  1);.    }else{. 
11230 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11240 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
11250 69 6e 64 2c 20 73 2e 63 75 72 72 65 6e 74 2e 63  ind, s.current.c
11260 73 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 77 69  sr, 1);.      wi
11270 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52 6f 77  ndowReturnOneRow
11280 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20  (pParse, pMWin, 
11290 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f  regGosub, addrGo
112a0 73 75 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  sub);.      sqli
112b0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
112c0 20 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c   OP_ResetSorter,
112d0 20 73 2e 63 75 72 72 65 6e 74 2e 63 73 72 29 3b   s.current.csr);
112e0 0a 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72 53  .    }.    addrS
112f0 68 6f 72 74 63 75 74 20 3d 20 73 71 6c 69 74 65  hortcut = sqlite
11300 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
11310 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 73 71 6c  P_Goto);.    sql
11320 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
11330 28 76 2c 20 61 64 64 72 47 65 29 3b 0a 20 20 7d  (v, addrGe);.  }
11340 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53  .  if( pMWin->eS
11350 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49  tart==TK_FOLLOWI
11360 4e 47 20 26 26 20 70 4d 57 69 6e 2d 3e 65 54 79  NG && pMWin->eTy
11370 70 65 21 3d 54 4b 5f 52 41 4e 47 45 20 26 26 20  pe!=TK_RANGE && 
11380 72 65 67 45 6e 64 20 29 7b 0a 20 20 20 20 61 73  regEnd ){.    as
11390 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 45 6e  sert( pMWin->eEn
113a0 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  d==TK_FOLLOWING 
113b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
113c0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
113d0 75 62 74 72 61 63 74 2c 20 72 65 67 53 74 61 72  ubtract, regStar
113e0 74 2c 20 72 65 67 45 6e 64 2c 20 72 65 67 53 74  t, regEnd, regSt
113f0 61 72 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  art);.  }..  if(
11400 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 21 3d   pMWin->eStart!=
11410 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a  TK_UNBOUNDED ){.
11420 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11430 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
11440 6e 64 2c 20 73 2e 73 74 61 72 74 2e 63 73 72 2c  nd, s.start.csr,
11450 20 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   1);.  }.  sqlit
11460 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11470 4f 50 5f 52 65 77 69 6e 64 2c 20 73 2e 63 75 72  OP_Rewind, s.cur
11480 72 65 6e 74 2e 63 73 72 2c 20 31 29 3b 0a 20 20  rent.csr, 1);.  
11490 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
114a0 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
114b0 73 2e 65 6e 64 2e 63 73 72 2c 20 31 29 3b 0a 20  s.end.csr, 1);. 
114c0 20 69 66 28 20 72 65 67 50 65 65 72 20 26 26 20   if( regPeer && 
114d0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
114e0 69 66 28 20 62 43 61 63 68 65 20 29 7b 0a 20 20  if( bCache ){.  
114f0 20 20 20 20 77 69 6e 64 6f 77 52 65 61 64 50 65      windowReadPe
11500 65 72 56 61 6c 75 65 73 28 26 73 2c 20 63 73 72  erValues(&s, csr
11510 57 72 69 74 65 2c 20 72 65 67 50 65 65 72 29 3b  Write, regPeer);
11520 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
11530 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11540 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op3(v, OP_Copy, 
11550 72 65 67 4e 65 77 50 65 65 72 2c 20 72 65 67 50  regNewPeer, regP
11560 65 65 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  eer, pOrderBy->n
11570 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 7d 0a 20  Expr-1);.    }. 
11580 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11590 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp3(v, OP_Copy,
115a0 20 72 65 67 50 65 65 72 2c 20 73 2e 73 74 61 72   regPeer, s.star
115b0 74 2e 72 65 67 2c 20 70 4f 72 64 65 72 42 79 2d  t.reg, pOrderBy-
115c0 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 73  >nExpr-1);.    s
115d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
115e0 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67  (v, OP_Copy, reg
115f0 50 65 65 72 2c 20 73 2e 63 75 72 72 65 6e 74 2e  Peer, s.current.
11600 72 65 67 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  reg, pOrderBy->n
11610 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 73 71 6c  Expr-1);.    sql
11620 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
11630 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 50 65  , OP_Copy, regPe
11640 65 72 2c 20 73 2e 65 6e 64 2e 72 65 67 2c 20 70  er, s.end.reg, p
11650 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31  OrderBy->nExpr-1
11660 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
11670 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
11680 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 4d  P_Integer, 0, pM
11690 57 69 6e 2d 3e 72 65 67 46 69 72 73 74 29 3b 0a  Win->regFirst);.
116a0 20 20 61 64 64 72 47 6f 74 6f 20 3d 20 73 71 6c    addrGoto = sql
116b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
116c0 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 0a 20 20 2f  , OP_Goto);..  /
116d0 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69  * Begin generati
116e0 6e 67 20 53 45 43 4f 4e 44 5f 52 4f 57 5f 43 4f  ng SECOND_ROW_CO
116f0 44 45 20 2a 2f 0a 20 20 56 64 62 65 4d 6f 64 75  DE */.  VdbeModu
11700 6c 65 43 6f 6d 6d 65 6e 74 28 28 70 50 61 72 73  leComment((pPars
11710 65 2d 3e 70 56 64 62 65 2c 20 22 42 65 67 69 6e  e->pVdbe, "Begin
11720 20 57 69 6e 64 6f 77 43 6f 64 65 53 74 65 70 2e   WindowCodeStep.
11730 53 45 43 4f 4e 44 5f 52 4f 57 22 29 29 3b 0a 20  SECOND_ROW"));. 
11740 20 69 66 28 20 62 43 61 63 68 65 20 29 7b 0a 20   if( bCache ){. 
11750 20 20 20 61 64 64 72 43 61 63 68 65 4e 65 78 74     addrCacheNext
11760 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
11770 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
11780 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 54 79    if( pMWin->eTy
11790 70 65 21 3d 54 4b 5f 52 4f 57 53 20 29 7b 0a 20  pe!=TK_ROWS ){. 
117a0 20 20 20 20 20 77 69 6e 64 6f 77 52 65 61 64 50       windowReadP
117b0 65 65 72 56 61 6c 75 65 73 28 26 73 2c 20 63 73  eerValues(&s, cs
117c0 72 57 72 69 74 65 2c 20 72 65 67 4e 65 77 50 65  rWrite, regNewPe
117d0 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  er);.    }.  }el
117e0 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
117f0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
11800 64 64 72 49 66 4e 6f 74 29 3b 0a 20 20 7d 0a 20  ddrIfNot);.  }. 
11810 20 69 66 28 20 72 65 67 50 65 65 72 20 29 7b 0a   if( regPeer ){.
11820 20 20 20 20 61 64 64 72 50 65 65 72 4a 75 6d 70      addrPeerJump
11830 20 3d 20 77 69 6e 64 6f 77 49 66 4e 65 77 50 65   = windowIfNewPe
11840 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  er(pParse, pOrde
11850 72 42 79 2c 20 72 65 67 4e 65 77 50 65 65 72 2c  rBy, regNewPeer,
11860 20 72 65 67 50 65 65 72 29 3b 0a 20 20 7d 0a 20   regPeer);.  }. 
11870 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61   if( pMWin->eSta
11880 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  rt==TK_FOLLOWING
11890 20 29 7b 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f   ){.    windowCo
118a0 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f  deOp(&s, WINDOW_
118b0 41 47 47 53 54 45 50 2c 20 30 2c 20 30 29 3b 0a  AGGSTEP, 0, 0);.
118c0 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65      if( pMWin->e
118d0 45 6e 64 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  End!=TK_UNBOUNDE
118e0 44 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  D ){.      if( p
118f0 4d 57 69 6e 2d 3e 65 54 79 70 65 3d 3d 54 4b 5f  MWin->eType==TK_
11900 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 20  RANGE ){.       
11910 20 69 6e 74 20 6c 62 6c 20 3d 20 73 71 6c 69 74   int lbl = sqlit
11920 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
11930 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
11940 20 69 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20   int addrNext = 
11950 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
11960 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
11970 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 52 61 6e     windowCodeRan
11980 67 65 54 65 73 74 28 26 73 2c 20 4f 50 5f 47 65  geTest(&s, OP_Ge
11990 2c 20 73 2e 63 75 72 72 65 6e 74 2e 63 73 72 2c  , s.current.csr,
119a0 20 72 65 67 45 6e 64 2c 20 73 2e 65 6e 64 2e 63   regEnd, s.end.c
119b0 73 72 2c 20 6c 62 6c 29 3b 0a 20 20 20 20 20 20  sr, lbl);.      
119c0 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26    windowCodeOp(&
119d0 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56  s, WINDOW_AGGINV
119e0 45 52 53 45 2c 20 72 65 67 53 74 61 72 74 2c 20  ERSE, regStart, 
119f0 30 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 64  0);.        wind
11a00 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e  owCodeOp(&s, WIN
11a10 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20  DOW_RETURN_ROW, 
11a20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  0, 0);.        s
11a30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
11a40 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
11a50 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 20  addrNext);.     
11a60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
11a70 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62  solveLabel(v, lb
11a80 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  l);.      }else{
11a90 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43  .        windowC
11aa0 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57  odeOp(&s, WINDOW
11ab0 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 72 65 67  _RETURN_ROW, reg
11ac0 45 6e 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  End, 0);.       
11ad0 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73   windowCodeOp(&s
11ae0 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45  , WINDOW_AGGINVE
11af0 52 53 45 2c 20 72 65 67 53 74 61 72 74 2c 20 30  RSE, regStart, 0
11b00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
11b10 0a 20 20 7d 65 6c 73 65 0a 20 20 69 66 28 20 70  .  }else.  if( p
11b20 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50  MWin->eEnd==TK_P
11b30 52 45 43 45 44 49 4e 47 20 29 7b 0a 20 20 20 20  RECEDING ){.    
11b40 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c  windowCodeOp(&s,
11b50 20 57 49 4e 44 4f 57 5f 41 47 47 53 54 45 50 2c   WINDOW_AGGSTEP,
11b60 20 72 65 67 45 6e 64 2c 20 30 29 3b 0a 20 20 20   regEnd, 0);.   
11b70 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73   windowCodeOp(&s
11b80 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f  , WINDOW_RETURN_
11b90 52 4f 57 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ROW, 0, 0);.    
11ba0 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c  windowCodeOp(&s,
11bb0 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52   WINDOW_AGGINVER
11bc0 53 45 2c 20 72 65 67 53 74 61 72 74 2c 20 30 29  SE, regStart, 0)
11bd0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
11be0 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 77 69 6e  nt addr;.    win
11bf0 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49  dowCodeOp(&s, WI
11c00 4e 44 4f 57 5f 41 47 47 53 54 45 50 2c 20 30 2c  NDOW_AGGSTEP, 0,
11c10 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 57   0);.    if( pMW
11c20 69 6e 2d 3e 65 45 6e 64 21 3d 54 4b 5f 55 4e 42  in->eEnd!=TK_UNB
11c30 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20 20 20 20  OUNDED ){.      
11c40 69 66 28 20 70 4d 57 69 6e 2d 3e 65 54 79 70 65  if( pMWin->eType
11c50 3d 3d 54 4b 5f 52 41 4e 47 45 20 29 7b 0a 20 20  ==TK_RANGE ){.  
11c60 20 20 20 20 20 20 69 6e 74 20 6c 62 6c 3b 0a 20        int lbl;. 
11c70 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71         addr = sq
11c80 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
11c90 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20  Addr(v);.       
11ca0 20 69 66 28 20 72 65 67 45 6e 64 20 29 7b 0a 20   if( regEnd ){. 
11cb0 20 20 20 20 20 20 20 20 20 6c 62 6c 20 3d 20 73           lbl = s
11cc0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
11cd0 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20  bel(pParse);.   
11ce0 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64         windowCod
11cf0 65 52 61 6e 67 65 54 65 73 74 28 26 73 2c 20 4f  eRangeTest(&s, O
11d00 50 5f 47 65 2c 20 73 2e 63 75 72 72 65 6e 74 2e  P_Ge, s.current.
11d10 63 73 72 2c 20 72 65 67 45 6e 64 2c 20 73 2e 65  csr, regEnd, s.e
11d20 6e 64 2e 63 73 72 2c 20 6c 62 6c 29 3b 0a 20 20  nd.csr, lbl);.  
11d30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11d40 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c  windowCodeOp(&s,
11d50 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52   WINDOW_RETURN_R
11d60 4f 57 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  OW, 0, 0);.     
11d70 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28     windowCodeOp(
11d80 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e  &s, WINDOW_AGGIN
11d90 56 45 52 53 45 2c 20 72 65 67 53 74 61 72 74 2c  VERSE, regStart,
11da0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
11db0 20 72 65 67 45 6e 64 20 29 7b 0a 20 20 20 20 20   regEnd ){.     
11dc0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11dd0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
11de0 6f 2c 20 30 2c 20 61 64 64 72 29 3b 0a 20 20 20  o, 0, addr);.   
11df0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
11e00 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
11e10 2c 20 6c 62 6c 29 3b 0a 20 20 20 20 20 20 20 20  , lbl);.        
11e20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
11e30 20 20 20 20 20 20 20 69 66 28 20 72 65 67 45 6e         if( regEn
11e40 64 20 29 20 61 64 64 72 20 3d 20 73 71 6c 69 74  d ) addr = sqlit
11e50 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
11e60 4f 50 5f 49 66 50 6f 73 2c 20 72 65 67 45 6e 64  OP_IfPos, regEnd
11e70 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  , 0, 1);.       
11e80 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73   windowCodeOp(&s
11e90 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f  , WINDOW_RETURN_
11ea0 52 4f 57 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ROW, 0, 0);.    
11eb0 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70      windowCodeOp
11ec0 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49  (&s, WINDOW_AGGI
11ed0 4e 56 45 52 53 45 2c 20 72 65 67 53 74 61 72 74  NVERSE, regStart
11ee0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
11ef0 28 20 72 65 67 45 6e 64 20 29 20 73 71 6c 69 74  ( regEnd ) sqlit
11f00 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
11f10 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 7d  , addr);.      }
11f20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
11f30 20 61 64 64 72 50 65 65 72 4a 75 6d 70 20 29 7b   addrPeerJump ){
11f40 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
11f50 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
11f60 50 65 65 72 4a 75 6d 70 29 3b 0a 20 20 7d 0a 20  PeerJump);.  }. 
11f70 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65   VdbeModuleComme
11f80 6e 74 28 28 70 50 61 72 73 65 2d 3e 70 56 64 62  nt((pParse->pVdb
11f90 65 2c 20 22 45 6e 64 20 57 69 6e 64 6f 77 43 6f  e, "End WindowCo
11fa0 64 65 53 74 65 70 2e 53 45 43 4f 4e 44 5f 52 4f  deStep.SECOND_RO
11fb0 57 22 29 29 3b 0a 0a 20 20 2f 2a 20 45 6e 64 20  W"));..  /* End 
11fc0 6f 66 20 74 68 65 20 6d 61 69 6e 20 69 6e 70 75  of the main inpu
11fd0 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c 69  t loop */.  sqli
11fe0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
11ff0 76 2c 20 61 64 64 72 47 6f 74 6f 29 3b 0a 20 20  v, addrGoto);.  
12000 69 66 28 20 62 43 61 63 68 65 20 29 7b 0a 20 20  if( bCache ){.  
12010 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12020 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
12030 63 73 72 57 72 69 74 65 2c 20 61 64 64 72 43 61  csrWrite, addrCa
12040 63 68 65 4e 65 78 74 29 3b 0a 20 20 20 20 73 71  cheNext);.    sq
12050 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
12060 65 28 76 2c 20 61 64 64 72 43 61 63 68 65 52 65  e(v, addrCacheRe
12070 77 69 6e 64 29 3b 20 0a 20 20 7d 65 6c 73 65 7b  wind); .  }else{
12080 0a 20 20 20 20 69 66 28 20 61 64 64 72 53 68 6f  .    if( addrSho
12090 72 74 63 75 74 3e 30 20 29 20 73 71 6c 69 74 65  rtcut>0 ) sqlite
120a0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
120b0 20 61 64 64 72 53 68 6f 72 74 63 75 74 29 3b 0a   addrShortcut);.
120c0 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
120d0 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  End(pWInfo);.  }
120e0 0a 0a 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f  ..  /* Fall thro
120f0 75 67 68 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57  ugh */.  if( pMW
12100 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 26  in->pPartition &
12110 26 20 62 43 61 63 68 65 3d 3d 30 20 29 7b 0a 20  & bCache==0 ){. 
12120 20 20 20 61 64 64 72 49 6e 74 65 67 65 72 20 3d     addrInteger =
12130 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12140 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
12150 2c 20 30 2c 20 72 65 67 46 6c 75 73 68 50 61 72  , 0, regFlushPar
12160 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
12170 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
12180 64 64 72 47 6f 73 75 62 46 6c 75 73 68 29 3b 0a  ddrGosubFlush);.
12190 20 20 7d 0a 0a 20 20 56 64 62 65 4d 6f 64 75 6c    }..  VdbeModul
121a0 65 43 6f 6d 6d 65 6e 74 28 28 70 50 61 72 73 65  eComment((pParse
121b0 2d 3e 70 56 64 62 65 2c 20 22 42 65 67 69 6e 20  ->pVdbe, "Begin 
121c0 57 69 6e 64 6f 77 43 6f 64 65 53 74 65 70 2e 46  WindowCodeStep.F
121d0 4c 55 53 48 22 29 29 3b 0a 20 20 61 64 64 72 45  LUSH"));.  addrE
121e0 6d 70 74 79 20 3d 20 73 71 6c 69 74 65 33 56 64  mpty = sqlite3Vd
121f0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
12200 65 77 69 6e 64 2c 20 63 73 72 57 72 69 74 65 29  ewind, csrWrite)
12210 3b 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65  ;.  if( pMWin->e
12220 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e  End==TK_PRECEDIN
12230 47 20 29 7b 0a 20 20 20 20 77 69 6e 64 6f 77 43  G ){.    windowC
12240 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57  odeOp(&s, WINDOW
12250 5f 41 47 47 53 54 45 50 2c 20 72 65 67 45 6e 64  _AGGSTEP, regEnd
12260 2c 20 30 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77  , 0);.    window
12270 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f  CodeOp(&s, WINDO
12280 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 30 2c  W_RETURN_ROW, 0,
12290 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   0);.  }else if(
122a0 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d   pMWin->eStart==
122b0 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a  TK_FOLLOWING ){.
122c0 20 20 20 20 69 6e 74 20 61 64 64 72 53 74 61 72      int addrStar
122d0 74 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 42  t;.    int addrB
122e0 72 65 61 6b 31 3b 0a 20 20 20 20 69 6e 74 20 61  reak1;.    int a
122f0 64 64 72 42 72 65 61 6b 32 3b 0a 20 20 20 20 69  ddrBreak2;.    i
12300 6e 74 20 61 64 64 72 42 72 65 61 6b 33 3b 0a 20  nt addrBreak3;. 
12310 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28     windowCodeOp(
12320 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 53 54  &s, WINDOW_AGGST
12330 45 50 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  EP, 0, 0);.    i
12340 66 28 20 70 4d 57 69 6e 2d 3e 65 54 79 70 65 3d  f( pMWin->eType=
12350 3d 54 4b 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20  =TK_RANGE ){.   
12360 20 20 20 61 64 64 72 53 74 61 72 74 20 3d 20 73     addrStart = s
12370 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
12380 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
12390 61 64 64 72 42 72 65 61 6b 32 20 3d 20 77 69 6e  addrBreak2 = win
123a0 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49  dowCodeOp(&s, WI
123b0 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 2c  NDOW_AGGINVERSE,
123c0 20 72 65 67 53 74 61 72 74 2c 20 31 29 3b 0a 20   regStart, 1);. 
123d0 20 20 20 20 20 61 64 64 72 42 72 65 61 6b 31 20       addrBreak1 
123e0 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26  = windowCodeOp(&
123f0 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e  s, WINDOW_RETURN
12400 5f 52 4f 57 2c 20 30 2c 20 31 29 3b 0a 20 20 20  _ROW, 0, 1);.   
12410 20 7d 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70   }else.    if( p
12420 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55  MWin->eEnd==TK_U
12430 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20 20  NBOUNDED ){.    
12440 20 20 61 64 64 72 53 74 61 72 74 20 3d 20 73 71    addrStart = sq
12450 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
12460 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 61  Addr(v);.      a
12470 64 64 72 42 72 65 61 6b 31 20 3d 20 77 69 6e 64  ddrBreak1 = wind
12480 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e  owCodeOp(&s, WIN
12490 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20  DOW_RETURN_ROW, 
124a0 72 65 67 53 74 61 72 74 2c 20 31 29 3b 0a 20 20  regStart, 1);.  
124b0 20 20 20 20 61 64 64 72 42 72 65 61 6b 32 20 3d      addrBreak2 =
124c0 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73   windowCodeOp(&s
124d0 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45  , WINDOW_AGGINVE
124e0 52 53 45 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20  RSE, 0, 1);.    
124f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
12500 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64  ert( pMWin->eEnd
12510 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29  ==TK_FOLLOWING )
12520 3b 0a 20 20 20 20 20 20 61 64 64 72 53 74 61 72  ;.      addrStar
12530 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
12540 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
12550 20 20 20 20 20 61 64 64 72 42 72 65 61 6b 31 20       addrBreak1 
12560 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26  = windowCodeOp(&
12570 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e  s, WINDOW_RETURN
12580 5f 52 4f 57 2c 20 72 65 67 45 6e 64 2c 20 31 29  _ROW, regEnd, 1)
12590 3b 0a 20 20 20 20 20 20 61 64 64 72 42 72 65 61  ;.      addrBrea
125a0 6b 32 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f  k2 = windowCodeO
125b0 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47  p(&s, WINDOW_AGG
125c0 49 4e 56 45 52 53 45 2c 20 72 65 67 53 74 61 72  INVERSE, regStar
125d0 74 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  t, 1);.    }.   
125e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
125f0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
12600 2c 20 61 64 64 72 53 74 61 72 74 29 3b 0a 20 20  , addrStart);.  
12610 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
12620 70 48 65 72 65 28 76 2c 20 61 64 64 72 42 72 65  pHere(v, addrBre
12630 61 6b 32 29 3b 0a 20 20 20 20 61 64 64 72 53 74  ak2);.    addrSt
12640 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
12650 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
12660 0a 20 20 20 20 61 64 64 72 42 72 65 61 6b 33 20  .    addrBreak3 
12670 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26  = windowCodeOp(&
12680 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e  s, WINDOW_RETURN
12690 5f 52 4f 57 2c 20 30 2c 20 31 29 3b 0a 20 20 20  _ROW, 0, 1);.   
126a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
126b0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
126c0 2c 20 61 64 64 72 53 74 61 72 74 29 3b 0a 20 20  , addrStart);.  
126d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
126e0 70 48 65 72 65 28 76 2c 20 61 64 64 72 42 72 65  pHere(v, addrBre
126f0 61 6b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ak1);.    sqlite
12700 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
12710 20 61 64 64 72 42 72 65 61 6b 33 29 3b 0a 20 20   addrBreak3);.  
12720 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 61  }else{.    int a
12730 64 64 72 42 72 65 61 6b 3b 0a 20 20 20 20 69 6e  ddrBreak;.    in
12740 74 20 61 64 64 72 53 74 61 72 74 3b 0a 20 20 20  t addrStart;.   
12750 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73   windowCodeOp(&s
12760 2c 20 57 49 4e 44 4f 57 5f 41 47 47 53 54 45 50  , WINDOW_AGGSTEP
12770 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 61 64 64  , 0, 0);.    add
12780 72 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  rStart = sqlite3
12790 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
127a0 76 29 3b 0a 20 20 20 20 61 64 64 72 42 72 65 61  v);.    addrBrea
127b0 6b 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70  k = windowCodeOp
127c0 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55  (&s, WINDOW_RETU
127d0 52 4e 5f 52 4f 57 2c 20 30 2c 20 31 29 3b 0a 20  RN_ROW, 0, 1);. 
127e0 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28     windowCodeOp(
127f0 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e  &s, WINDOW_AGGIN
12800 56 45 52 53 45 2c 20 72 65 67 53 74 61 72 74 2c  VERSE, regStart,
12810 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
12820 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12830 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 53 74  _Goto, 0, addrSt
12840 61 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  art);.    sqlite
12850 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
12860 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 7d   addrBreak);.  }
12870 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  ..  sqlite3VdbeJ
12880 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 45  umpHere(v, addrE
12890 6d 70 74 79 29 3b 0a 0a 20 20 69 66 28 20 62 43  mpty);..  if( bC
128a0 61 63 68 65 20 26 26 20 61 64 64 72 53 68 6f 72  ache && addrShor
128b0 74 63 75 74 3e 30 20 29 20 73 71 6c 69 74 65 33  tcut>0 ) sqlite3
128c0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
128d0 61 64 64 72 53 68 6f 72 74 63 75 74 29 3b 0a 20  addrShortcut);. 
128e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
128f0 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f  p1(v, OP_ResetSo
12900 72 74 65 72 2c 20 73 2e 63 75 72 72 65 6e 74 2e  rter, s.current.
12910 63 73 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  csr);.  sqlite3V
12920 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12930 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 4d 57 69  Integer, 0, pMWi
12940 6e 2d 3e 72 65 67 53 69 7a 65 29 3b 0a 20 20 69  n->regSize);.  i
12950 66 28 20 62 43 61 63 68 65 3d 3d 30 20 29 20 73  f( bCache==0 ) s
12960 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12970 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
12980 31 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 46 69 72  1, pMWin->regFir
12990 73 74 29 3b 0a 20 20 56 64 62 65 4d 6f 64 75 6c  st);.  VdbeModul
129a0 65 43 6f 6d 6d 65 6e 74 28 28 70 50 61 72 73 65  eComment((pParse
129b0 2d 3e 70 56 64 62 65 2c 20 22 45 6e 64 20 57 69  ->pVdbe, "End Wi
129c0 6e 64 6f 77 43 6f 64 65 53 74 65 70 2e 46 4c 55  ndowCodeStep.FLU
129d0 53 48 22 29 29 3b 0a 20 20 69 66 28 20 70 4d 57  SH"));.  if( pMW
129e0 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 29  in->pPartition )
129f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
12a00 65 43 68 61 6e 67 65 50 31 28 76 2c 20 61 64 64  eChangeP1(v, add
12a10 72 49 6e 74 65 67 65 72 2c 20 73 71 6c 69 74 65  rInteger, sqlite
12a20 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
12a30 28 76 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  (v));.    sqlite
12a40 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
12a50 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 46 6c 75  P_Return, regFlu
12a60 73 68 50 61 72 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  shPart);.  }.}..
12a70 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
12a80 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43  _OMIT_WINDOWFUNC
12a90 20 2a 2f 0a                                       */.