/ Hex Artifact Content
Login

Artifact 218582db176f7a367de9cd9c34ad969d525a49924ca75eaafd85a92773a34490:


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 47 52 4f   to:.**.**   GRO
1e70: 55 50 53 20 42 45 54 57 45 45 4e 20 43 55 52 52  UPS BETWEEN CURR
1e80: 45 4e 54 20 52 4f 57 20 41 4e 44 20 55 4e 42 4f  ENT ROW AND UNBO
1e90: 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a  UNDED FOLLOWING.
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 30 20 29 3b 0a 20 20 70 20 3d 20  Arg==0 );.  p = 
1f50: 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e  (struct CallCoun
1f60: 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65  t*)sqlite3_aggre
1f70: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74  gate_context(pCt
1f80: 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  x, sizeof(*p));.
1f90: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70    if( p ){.    p
1fa0: 2d 3e 6e 54 6f 74 61 6c 2b 2b 3b 0a 20 20 7d 0a  ->nTotal++;.  }.
1fb0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 65  }.static void pe
1fc0: 72 63 65 6e 74 5f 72 61 6e 6b 49 6e 76 46 75 6e  rcent_rankInvFun
1fd0: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
1fe0: 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69  text *pCtx, .  i
1ff0: 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74  nt nArg,.  sqlit
2000: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72 67  e3_value **apArg
2010: 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61 6c  .){.  struct Cal
2020: 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 55 4e 55  lCount *p;.  UNU
2030: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 41  SED_PARAMETER(nA
2040: 72 67 29 3b 20 61 73 73 65 72 74 28 20 6e 41 72  rg); assert( nAr
2050: 67 3d 3d 30 20 29 3b 0a 20 20 70 20 3d 20 28 73  g==0 );.  p = (s
2060: 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a  truct CallCount*
2070: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
2080: 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c  te_context(pCtx,
2090: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
20a0: 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 7d 0a 73 74  p->nStep++;.}.st
20b0: 61 74 69 63 20 76 6f 69 64 20 70 65 72 63 65 6e  atic void percen
20c0: 74 5f 72 61 6e 6b 56 61 6c 75 65 46 75 6e 63 28  t_rankValueFunc(
20d0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
20e0: 2a 70 43 74 78 29 7b 0a 20 20 73 74 72 75 63 74  *pCtx){.  struct
20f0: 20 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20   CallCount *p;. 
2100: 20 70 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c   p = (struct Cal
2110: 6c 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f  lCount*)sqlite3_
2120: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
2130: 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a  t(pCtx, sizeof(*
2140: 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  p));.  if( p ){.
2150: 20 20 20 20 70 2d 3e 6e 56 61 6c 75 65 20 3d 20      p->nValue = 
2160: 70 2d 3e 6e 53 74 65 70 3b 0a 20 20 20 20 69 66  p->nStep;.    if
2170: 28 20 70 2d 3e 6e 54 6f 74 61 6c 3e 31 20 29 7b  ( p->nTotal>1 ){
2180: 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20  .      double r 
2190: 3d 20 28 64 6f 75 62 6c 65 29 70 2d 3e 6e 56 61  = (double)p->nVa
21a0: 6c 75 65 20 2f 20 28 64 6f 75 62 6c 65 29 28 70  lue / (double)(p
21b0: 2d 3e 6e 54 6f 74 61 6c 2d 31 29 3b 0a 20 20 20  ->nTotal-1);.   
21c0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
21d0: 74 5f 64 6f 75 62 6c 65 28 70 43 74 78 2c 20 72  t_double(pCtx, r
21e0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
21f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
2200: 6c 74 5f 64 6f 75 62 6c 65 28 70 43 74 78 2c 20  lt_double(pCtx, 
2210: 30 2e 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  0.0);.    }.  }.
2220: 7d 0a 23 64 65 66 69 6e 65 20 70 65 72 63 65 6e  }.#define percen
2230: 74 5f 72 61 6e 6b 46 69 6e 61 6c 69 7a 65 46 75  t_rankFinalizeFu
2240: 6e 63 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b 56  nc percent_rankV
2250: 61 6c 75 65 46 75 6e 63 0a 0a 2f 2a 0a 2a 2a 20  alueFunc../*.** 
2260: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
2270: 66 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  f built-in windo
2280: 77 20 66 75 6e 63 74 69 6f 6e 20 63 75 6d 65 5f  w function cume_
2290: 64 69 73 74 28 29 2e 20 41 73 73 75 6d 65 73 20  dist(). Assumes 
22a0: 74 68 61 74 0a 2a 2a 20 74 68 65 20 77 69 6e 64  that.** the wind
22b0: 6f 77 20 66 72 61 6d 65 20 68 61 73 20 62 65 65  ow frame has bee
22c0: 6e 20 73 65 74 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20  n set to:.**.** 
22d0: 20 20 47 52 4f 55 50 53 20 42 45 54 57 45 45 4e    GROUPS BETWEEN
22e0: 20 31 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e 44   1 FOLLOWING AND
22f0: 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f   UNBOUNDED FOLLO
2300: 57 49 4e 47 0a 2a 2f 0a 73 74 61 74 69 63 20 76  WING.*/.static v
2310: 6f 69 64 20 63 75 6d 65 5f 64 69 73 74 53 74 65  oid cume_distSte
2320: 70 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  pFunc(.  sqlite3
2330: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20  _context *pCtx, 
2340: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73  .  int nArg,.  s
2350: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
2360: 70 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74  pArg.){.  struct
2370: 20 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20   CallCount *p;. 
2380: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2390: 52 28 6e 41 72 67 29 3b 20 61 73 73 65 72 74 28  R(nArg); assert(
23a0: 20 6e 41 72 67 3d 3d 30 20 29 3b 0a 20 20 70 20   nArg==0 );.  p 
23b0: 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  = (struct CallCo
23c0: 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67  unt*)sqlite3_agg
23d0: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70  regate_context(p
23e0: 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  Ctx, sizeof(*p))
23f0: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
2400: 20 70 2d 3e 6e 54 6f 74 61 6c 2b 2b 3b 0a 20 20   p->nTotal++;.  
2410: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
2420: 63 75 6d 65 5f 64 69 73 74 49 6e 76 46 75 6e 63  cume_distInvFunc
2430: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
2440: 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e  ext *pCtx, .  in
2450: 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65  t nArg,.  sqlite
2460: 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a  3_value **apArg.
2470: 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61 6c 6c  ){.  struct Call
2480: 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 55 4e 55 53  Count *p;.  UNUS
2490: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72  ED_PARAMETER(nAr
24a0: 67 29 3b 20 61 73 73 65 72 74 28 20 6e 41 72 67  g); assert( nArg
24b0: 3d 3d 30 20 29 3b 0a 20 20 70 20 3d 20 28 73 74  ==0 );.  p = (st
24c0: 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29  ruct CallCount*)
24d0: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
24e0: 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20  e_context(pCtx, 
24f0: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 70  sizeof(*p));.  p
2500: 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 7d 0a 73 74 61  ->nStep++;.}.sta
2510: 74 69 63 20 76 6f 69 64 20 63 75 6d 65 5f 64 69  tic void cume_di
2520: 73 74 56 61 6c 75 65 46 75 6e 63 28 73 71 6c 69  stValueFunc(sqli
2530: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
2540: 78 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61 6c  x){.  struct Cal
2550: 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70 20 3d  lCount *p;.  p =
2560: 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75   (struct CallCou
2570: 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72  nt*)sqlite3_aggr
2580: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43  egate_context(pC
2590: 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b  tx, sizeof(*p));
25a0: 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 6e  .  if( p && p->n
25b0: 54 6f 74 61 6c 20 29 7b 0a 20 20 20 20 64 6f 75  Total ){.    dou
25c0: 62 6c 65 20 72 20 3d 20 28 64 6f 75 62 6c 65 29  ble r = (double)
25d0: 28 70 2d 3e 6e 53 74 65 70 29 20 2f 20 28 64 6f  (p->nStep) / (do
25e0: 75 62 6c 65 29 28 70 2d 3e 6e 54 6f 74 61 6c 29  uble)(p->nTotal)
25f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  ;.    sqlite3_re
2600: 73 75 6c 74 5f 64 6f 75 62 6c 65 28 70 43 74 78  sult_double(pCtx
2610: 2c 20 72 29 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66  , r);.  }.}.#def
2620: 69 6e 65 20 63 75 6d 65 5f 64 69 73 74 46 69 6e  ine cume_distFin
2630: 61 6c 69 7a 65 46 75 6e 63 20 63 75 6d 65 5f 64  alizeFunc cume_d
2640: 69 73 74 56 61 6c 75 65 46 75 6e 63 0a 0a 2f 2a  istValueFunc../*
2650: 0a 2a 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65  .** Context obje
2660: 63 74 20 66 6f 72 20 6e 74 69 6c 65 28 29 20 77  ct for ntile() w
2670: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 2e 0a  indow function..
2680: 2a 2f 0a 73 74 72 75 63 74 20 4e 74 69 6c 65 43  */.struct NtileC
2690: 74 78 20 7b 0a 20 20 69 36 34 20 6e 54 6f 74 61  tx {.  i64 nTota
26a0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
26b0: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
26c0: 72 6f 77 73 20 69 6e 20 70 61 72 74 69 74 69 6f  rows in partitio
26d0: 6e 20 2a 2f 0a 20 20 69 36 34 20 6e 50 61 72 61  n */.  i64 nPara
26e0: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
26f0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 61 6d 65         /* Parame
2700: 74 65 72 20 70 61 73 73 65 64 20 74 6f 20 6e 74  ter passed to nt
2710: 69 6c 65 28 4e 29 20 2a 2f 0a 20 20 69 36 34 20  ile(N) */.  i64 
2720: 69 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20  iRow;           
2730: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2740: 75 72 72 65 6e 74 20 72 6f 77 20 2a 2f 0a 7d 3b  urrent row */.};
2750: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
2760: 74 61 74 69 6f 6e 20 6f 66 20 6e 74 69 6c 65 28  tation of ntile(
2770: 29 2e 20 54 68 69 73 20 61 73 73 75 6d 65 73 20  ). This assumes 
2780: 74 68 61 74 20 74 68 65 20 77 69 6e 64 6f 77 20  that the window 
2790: 66 72 61 6d 65 20 68 61 73 0a 2a 2a 20 62 65 65  frame has.** bee
27a0: 6e 20 63 6f 65 72 63 65 64 20 74 6f 3a 0a 2a 2a  n coerced to:.**
27b0: 0a 2a 2a 20 20 20 52 4f 57 53 20 43 55 52 52 45  .**   ROWS CURRE
27c0: 4e 54 20 52 4f 57 20 41 4e 44 20 55 4e 42 4f 55  NT ROW AND UNBOU
27d0: 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a  NDED FOLLOWING.*
27e0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e 74  /.static void nt
27f0: 69 6c 65 53 74 65 70 46 75 6e 63 28 0a 20 20 73  ileStepFunc(.  s
2800: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
2810: 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72  pCtx, .  int nAr
2820: 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  g,.  sqlite3_val
2830: 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20  ue **apArg.){.  
2840: 73 74 72 75 63 74 20 4e 74 69 6c 65 43 74 78 20  struct NtileCtx 
2850: 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 41  *p;.  assert( nA
2860: 72 67 3d 3d 31 20 29 3b 20 55 4e 55 53 45 44 5f  rg==1 ); UNUSED_
2870: 50 41 52 41 4d 45 54 45 52 28 6e 41 72 67 29 3b  PARAMETER(nArg);
2880: 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74 20 4e  .  p = (struct N
2890: 74 69 6c 65 43 74 78 2a 29 73 71 6c 69 74 65 33  tileCtx*)sqlite3
28a0: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
28b0: 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28  xt(pCtx, sizeof(
28c0: 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b  *p));.  if( p ){
28d0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 54 6f 74  .    if( p->nTot
28e0: 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  al==0 ){.      p
28f0: 2d 3e 6e 50 61 72 61 6d 20 3d 20 73 71 6c 69 74  ->nParam = sqlit
2900: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61  e3_value_int64(a
2910: 70 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20  pArg[0]);.      
2920: 69 66 28 20 70 2d 3e 6e 50 61 72 61 6d 3c 3d 30  if( p->nParam<=0
2930: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2940: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
2950: 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  (.            pC
2960: 74 78 2c 20 22 61 72 67 75 6d 65 6e 74 20 6f 66  tx, "argument of
2970: 20 6e 74 69 6c 65 20 6d 75 73 74 20 62 65 20 61   ntile must be a
2980: 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65   positive intege
2990: 72 22 2c 20 2d 31 0a 20 20 20 20 20 20 20 20 29  r", -1.        )
29a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
29b0: 20 20 20 20 70 2d 3e 6e 54 6f 74 61 6c 2b 2b 3b      p->nTotal++;
29c0: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
29d0: 69 64 20 6e 74 69 6c 65 49 6e 76 46 75 6e 63 28  id ntileInvFunc(
29e0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
29f0: 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74  xt *pCtx, .  int
2a00: 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33   nArg,.  sqlite3
2a10: 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29  _value **apArg.)
2a20: 7b 0a 20 20 73 74 72 75 63 74 20 4e 74 69 6c 65  {.  struct Ntile
2a30: 43 74 78 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  Ctx *p;.  assert
2a40: 28 20 6e 41 72 67 3d 3d 31 20 29 3b 20 55 4e 55  ( nArg==1 ); UNU
2a50: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 41  SED_PARAMETER(nA
2a60: 72 67 29 3b 0a 20 20 70 20 3d 20 28 73 74 72 75  rg);.  p = (stru
2a70: 63 74 20 4e 74 69 6c 65 43 74 78 2a 29 73 71 6c  ct NtileCtx*)sql
2a80: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
2a90: 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a  ontext(pCtx, siz
2aa0: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 70 2d 3e 69  eof(*p));.  p->i
2ab0: 52 6f 77 2b 2b 3b 0a 7d 0a 73 74 61 74 69 63 20  Row++;.}.static 
2ac0: 76 6f 69 64 20 6e 74 69 6c 65 56 61 6c 75 65 46  void ntileValueF
2ad0: 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
2ae0: 65 78 74 20 2a 70 43 74 78 29 7b 0a 20 20 73 74  ext *pCtx){.  st
2af0: 72 75 63 74 20 4e 74 69 6c 65 43 74 78 20 2a 70  ruct NtileCtx *p
2b00: 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74 20  ;.  p = (struct 
2b10: 4e 74 69 6c 65 43 74 78 2a 29 73 71 6c 69 74 65  NtileCtx*)sqlite
2b20: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
2b30: 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66  ext(pCtx, sizeof
2b40: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 26  (*p));.  if( p &
2b50: 26 20 70 2d 3e 6e 50 61 72 61 6d 3e 30 20 29 7b  & p->nParam>0 ){
2b60: 0a 20 20 20 20 69 6e 74 20 6e 53 69 7a 65 20 3d  .    int nSize =
2b70: 20 28 70 2d 3e 6e 54 6f 74 61 6c 20 2f 20 70 2d   (p->nTotal / p-
2b80: 3e 6e 50 61 72 61 6d 29 3b 0a 20 20 20 20 69 66  >nParam);.    if
2b90: 28 20 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20  ( nSize==0 ){.  
2ba0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
2bb0: 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 70  lt_int64(pCtx, p
2bc0: 2d 3e 69 52 6f 77 2b 31 29 3b 0a 20 20 20 20 7d  ->iRow+1);.    }
2bd0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 36 34 20  else{.      i64 
2be0: 6e 4c 61 72 67 65 20 3d 20 70 2d 3e 6e 54 6f 74  nLarge = p->nTot
2bf0: 61 6c 20 2d 20 70 2d 3e 6e 50 61 72 61 6d 2a 6e  al - p->nParam*n
2c00: 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 36 34 20  Size;.      i64 
2c10: 69 53 6d 61 6c 6c 20 3d 20 6e 4c 61 72 67 65 2a  iSmall = nLarge*
2c20: 28 6e 53 69 7a 65 2b 31 29 3b 0a 20 20 20 20 20  (nSize+1);.     
2c30: 20 69 36 34 20 69 52 6f 77 20 3d 20 70 2d 3e 69   i64 iRow = p->i
2c40: 52 6f 77 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  Row;..      asse
2c50: 72 74 28 20 28 6e 4c 61 72 67 65 2a 28 6e 53 69  rt( (nLarge*(nSi
2c60: 7a 65 2b 31 29 20 2b 20 28 70 2d 3e 6e 50 61 72  ze+1) + (p->nPar
2c70: 61 6d 2d 6e 4c 61 72 67 65 29 2a 6e 53 69 7a 65  am-nLarge)*nSize
2c80: 29 3d 3d 70 2d 3e 6e 54 6f 74 61 6c 20 29 3b 0a  )==p->nTotal );.
2c90: 0a 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 3c  .      if( iRow<
2ca0: 69 53 6d 61 6c 6c 20 29 7b 0a 20 20 20 20 20 20  iSmall ){.      
2cb0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
2cc0: 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 31 20 2b  _int64(pCtx, 1 +
2cd0: 20 69 52 6f 77 2f 28 6e 53 69 7a 65 2b 31 29 29   iRow/(nSize+1))
2ce0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2cf0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
2d00: 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78  esult_int64(pCtx
2d10: 2c 20 31 20 2b 20 6e 4c 61 72 67 65 20 2b 20 28  , 1 + nLarge + (
2d20: 69 52 6f 77 2d 69 53 6d 61 6c 6c 29 2f 6e 53 69  iRow-iSmall)/nSi
2d30: 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ze);.      }.   
2d40: 20 7d 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65   }.  }.}.#define
2d50: 20 6e 74 69 6c 65 46 69 6e 61 6c 69 7a 65 46 75   ntileFinalizeFu
2d60: 6e 63 20 6e 74 69 6c 65 56 61 6c 75 65 46 75 6e  nc ntileValueFun
2d70: 63 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65 78 74  c../*.** Context
2d80: 20 6f 62 6a 65 63 74 20 66 6f 72 20 6c 61 73 74   object for last
2d90: 5f 76 61 6c 75 65 28 29 20 77 69 6e 64 6f 77 20  _value() window 
2da0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 72  function..*/.str
2db0: 75 63 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78  uct LastValueCtx
2dc0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c   {.  sqlite3_val
2dd0: 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 20  ue *pVal;.  int 
2de0: 6e 56 61 6c 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  nVal;.};../*.** 
2df0: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
2e00: 66 20 6c 61 73 74 5f 76 61 6c 75 65 28 29 2e 0a  f last_value()..
2e10: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  */.static void l
2e20: 61 73 74 5f 76 61 6c 75 65 53 74 65 70 46 75 6e  ast_valueStepFun
2e30: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
2e40: 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69  text *pCtx, .  i
2e50: 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74  nt nArg,.  sqlit
2e60: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72 67  e3_value **apArg
2e70: 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 4c 61 73  .){.  struct Las
2e80: 74 56 61 6c 75 65 43 74 78 20 2a 70 3b 0a 20 20  tValueCtx *p;.  
2e90: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2ea0: 28 6e 41 72 67 29 3b 0a 20 20 70 20 3d 20 28 73  (nArg);.  p = (s
2eb0: 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75 65 43  truct LastValueC
2ec0: 74 78 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72  tx*)sqlite3_aggr
2ed0: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43  egate_context(pC
2ee0: 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b  tx, sizeof(*p));
2ef0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
2f00: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 66 72  sqlite3_value_fr
2f10: 65 65 28 70 2d 3e 70 56 61 6c 29 3b 0a 20 20 20  ee(p->pVal);.   
2f20: 20 70 2d 3e 70 56 61 6c 20 3d 20 73 71 6c 69 74   p->pVal = sqlit
2f30: 65 33 5f 76 61 6c 75 65 5f 64 75 70 28 61 70 41  e3_value_dup(apA
2f40: 72 67 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20  rg[0]);.    if( 
2f50: 70 2d 3e 70 56 61 6c 3d 3d 30 20 29 7b 0a 20 20  p->pVal==0 ){.  
2f60: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
2f70: 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 70  lt_error_nomem(p
2f80: 43 74 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Ctx);.    }else{
2f90: 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61 6c 2b 2b  .      p->nVal++
2fa0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74  ;.    }.  }.}.st
2fb0: 61 74 69 63 20 76 6f 69 64 20 6c 61 73 74 5f 76  atic void last_v
2fc0: 61 6c 75 65 49 6e 76 46 75 6e 63 28 0a 20 20 73  alueInvFunc(.  s
2fd0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
2fe0: 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72  pCtx, .  int nAr
2ff0: 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  g,.  sqlite3_val
3000: 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20  ue **apArg.){.  
3010: 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75 65  struct LastValue
3020: 43 74 78 20 2a 70 3b 0a 20 20 55 4e 55 53 45 44  Ctx *p;.  UNUSED
3030: 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72 67 29  _PARAMETER(nArg)
3040: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
3050: 45 54 45 52 28 61 70 41 72 67 29 3b 0a 20 20 70  ETER(apArg);.  p
3060: 20 3d 20 28 73 74 72 75 63 74 20 4c 61 73 74 56   = (struct LastV
3070: 61 6c 75 65 43 74 78 2a 29 73 71 6c 69 74 65 33  alueCtx*)sqlite3
3080: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
3090: 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28  xt(pCtx, sizeof(
30a0: 2a 70 29 29 3b 0a 20 20 69 66 28 20 41 4c 57 41  *p));.  if( ALWA
30b0: 59 53 28 70 29 20 29 7b 0a 20 20 20 20 70 2d 3e  YS(p) ){.    p->
30c0: 6e 56 61 6c 2d 2d 3b 0a 20 20 20 20 69 66 28 20  nVal--;.    if( 
30d0: 70 2d 3e 6e 56 61 6c 3d 3d 30 20 29 7b 0a 20 20  p->nVal==0 ){.  
30e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
30f0: 65 5f 66 72 65 65 28 70 2d 3e 70 56 61 6c 29 3b  e_free(p->pVal);
3100: 0a 20 20 20 20 20 20 70 2d 3e 70 56 61 6c 20 3d  .      p->pVal =
3110: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
3120: 73 74 61 74 69 63 20 76 6f 69 64 20 6c 61 73 74  static void last
3130: 5f 76 61 6c 75 65 56 61 6c 75 65 46 75 6e 63 28  _valueValueFunc(
3140: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
3150: 2a 70 43 74 78 29 7b 0a 20 20 73 74 72 75 63 74  *pCtx){.  struct
3160: 20 4c 61 73 74 56 61 6c 75 65 43 74 78 20 2a 70   LastValueCtx *p
3170: 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74 20  ;.  p = (struct 
3180: 4c 61 73 74 56 61 6c 75 65 43 74 78 2a 29 73 71  LastValueCtx*)sq
3190: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
31a0: 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69  context(pCtx, si
31b0: 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28  zeof(*p));.  if(
31c0: 20 70 20 26 26 20 70 2d 3e 70 56 61 6c 20 29 7b   p && p->pVal ){
31d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
31e0: 75 6c 74 5f 76 61 6c 75 65 28 70 43 74 78 2c 20  ult_value(pCtx, 
31f0: 70 2d 3e 70 56 61 6c 29 3b 0a 20 20 7d 0a 7d 0a  p->pVal);.  }.}.
3200: 73 74 61 74 69 63 20 76 6f 69 64 20 6c 61 73 74  static void last
3210: 5f 76 61 6c 75 65 46 69 6e 61 6c 69 7a 65 46 75  _valueFinalizeFu
3220: 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  nc(sqlite3_conte
3230: 78 74 20 2a 70 43 74 78 29 7b 0a 20 20 73 74 72  xt *pCtx){.  str
3240: 75 63 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78  uct LastValueCtx
3250: 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75   *p;.  p = (stru
3260: 63 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 2a  ct LastValueCtx*
3270: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
3280: 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c  te_context(pCtx,
3290: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
32a0: 69 66 28 20 70 20 26 26 20 70 2d 3e 70 56 61 6c  if( p && p->pVal
32b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
32c0: 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 70 43 74  result_value(pCt
32d0: 78 2c 20 70 2d 3e 70 56 61 6c 29 3b 0a 20 20 20  x, p->pVal);.   
32e0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 66   sqlite3_value_f
32f0: 72 65 65 28 70 2d 3e 70 56 61 6c 29 3b 0a 20 20  ree(p->pVal);.  
3300: 20 20 70 2d 3e 70 56 61 6c 20 3d 20 30 3b 0a 20    p->pVal = 0;. 
3310: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 74   }.}../*.** Stat
3320: 69 63 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 65  ic names for the
3330: 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77   built-in window
3340: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 2e   function names.
3350: 20 20 54 68 65 73 65 20 73 74 61 74 69 63 0a 2a    These static.*
3360: 2a 20 6e 61 6d 65 73 20 61 72 65 20 75 73 65 64  * names are used
3370: 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20 73 74  , rather than st
3380: 72 69 6e 67 20 6c 69 74 65 72 61 6c 73 2c 20 73  ring literals, s
3390: 6f 20 74 68 61 74 20 46 75 6e 63 44 65 66 20 6f  o that FuncDef o
33a0: 62 6a 65 63 74 73 0a 2a 2a 20 63 61 6e 20 62 65  bjects.** can be
33b0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
33c0: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 77 69   a particular wi
33d0: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 62 79  ndow function by
33e0: 20 64 69 72 65 63 74 0a 2a 2a 20 63 6f 6d 70 61   direct.** compa
33f0: 72 69 73 6f 6e 20 6f 66 20 74 68 65 20 7a 4e 61  rison of the zNa
3400: 6d 65 20 70 6f 69 6e 74 65 72 2e 20 20 45 78 61  me pointer.  Exa
3410: 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mple:.**.**     
3420: 20 20 69 66 28 20 70 46 75 6e 63 44 65 66 2d 3e    if( pFuncDef->
3430: 7a 4e 61 6d 65 3d 3d 72 6f 77 5f 76 61 6c 75 65  zName==row_value
3440: 4e 61 6d 65 20 29 7b 20 2e 2e 2e 20 7d 0a 2a 2f  Name ){ ... }.*/
3450: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
3460: 61 72 20 72 6f 77 5f 6e 75 6d 62 65 72 4e 61 6d  ar row_numberNam
3470: 65 5b 5d 20 3d 20 20 20 22 72 6f 77 5f 6e 75 6d  e[] =   "row_num
3480: 62 65 72 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e  ber";.static con
3490: 73 74 20 63 68 61 72 20 64 65 6e 73 65 5f 72 61  st char dense_ra
34a0: 6e 6b 4e 61 6d 65 5b 5d 20 3d 20 20 20 22 64 65  nkName[] =   "de
34b0: 6e 73 65 5f 72 61 6e 6b 22 3b 0a 73 74 61 74 69  nse_rank";.stati
34c0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 72 61 6e  c const char ran
34d0: 6b 4e 61 6d 65 5b 5d 20 3d 20 20 20 20 20 20 20  kName[] =       
34e0: 20 20 22 72 61 6e 6b 22 3b 0a 73 74 61 74 69 63    "rank";.static
34f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 70 65 72 63   const char perc
3500: 65 6e 74 5f 72 61 6e 6b 4e 61 6d 65 5b 5d 20 3d  ent_rankName[] =
3510: 20 22 70 65 72 63 65 6e 74 5f 72 61 6e 6b 22 3b   "percent_rank";
3520: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
3530: 61 72 20 63 75 6d 65 5f 64 69 73 74 4e 61 6d 65  ar cume_distName
3540: 5b 5d 20 3d 20 20 20 20 22 63 75 6d 65 5f 64 69  [] =    "cume_di
3550: 73 74 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73  st";.static cons
3560: 74 20 63 68 61 72 20 6e 74 69 6c 65 4e 61 6d 65  t char ntileName
3570: 5b 5d 20 3d 20 20 20 20 20 20 20 20 22 6e 74 69  [] =        "nti
3580: 6c 65 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73  le";.static cons
3590: 74 20 63 68 61 72 20 6c 61 73 74 5f 76 61 6c 75  t char last_valu
35a0: 65 4e 61 6d 65 5b 5d 20 3d 20 20 20 22 6c 61 73  eName[] =   "las
35b0: 74 5f 76 61 6c 75 65 22 3b 0a 73 74 61 74 69 63  t_value";.static
35c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 6e 74 68 5f   const char nth_
35d0: 76 61 6c 75 65 4e 61 6d 65 5b 5d 20 3d 20 20 20  valueName[] =   
35e0: 20 22 6e 74 68 5f 76 61 6c 75 65 22 3b 0a 73 74   "nth_value";.st
35f0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
3600: 66 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65 5b  first_valueName[
3610: 5d 20 3d 20 20 22 66 69 72 73 74 5f 76 61 6c 75  ] =  "first_valu
3620: 65 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  e";.static const
3630: 20 63 68 61 72 20 6c 65 61 64 4e 61 6d 65 5b 5d   char leadName[]
3640: 20 3d 20 20 20 20 20 20 20 20 20 22 6c 65 61 64   =         "lead
3650: 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  ";.static const 
3660: 63 68 61 72 20 6c 61 67 4e 61 6d 65 5b 5d 20 3d  char lagName[] =
3670: 20 20 20 20 20 20 20 20 20 20 22 6c 61 67 22 3b            "lag";
3680: 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 69 6d  ../*.** No-op im
3690: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66  plementations of
36a0: 20 78 53 74 65 70 28 29 20 61 6e 64 20 78 46 69   xStep() and xFi
36b0: 6e 61 6c 69 7a 65 28 29 2e 20 20 55 73 65 64 20  nalize().  Used 
36c0: 61 73 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72 73  as place-holders
36d0: 0a 2a 2a 20 66 6f 72 20 62 75 69 6c 74 2d 69 6e  .** for built-in
36e0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
36f0: 73 20 74 68 61 74 20 6e 65 76 65 72 20 63 61 6c  s that never cal
3700: 6c 20 74 68 6f 73 65 20 69 6e 74 65 72 66 61 63  l those interfac
3710: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 6f  es..**.** The no
3720: 6f 70 56 61 6c 75 65 46 75 6e 63 28 29 20 69 73  opValueFunc() is
3730: 20 63 61 6c 6c 65 64 20 62 75 74 20 69 73 20 65   called but is e
3740: 78 70 65 63 74 65 64 20 74 6f 20 64 6f 20 6e 6f  xpected to do no
3750: 74 68 69 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 6e  thing.  The.** n
3760: 6f 6f 70 53 74 65 70 46 75 6e 63 28 29 20 69 73  oopStepFunc() is
3770: 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2c 20 61   never called, a
3780: 6e 64 20 73 6f 20 69 74 20 69 73 20 6d 61 72 6b  nd so it is mark
3790: 65 64 20 77 69 74 68 20 4e 4f 5f 54 45 53 54 20  ed with NO_TEST 
37a0: 74 6f 0a 2a 2a 20 6c 65 74 20 74 68 65 20 74 65  to.** let the te
37b0: 73 74 20 63 6f 76 65 72 61 67 65 20 72 6f 75 74  st coverage rout
37c0: 69 6e 65 20 6b 6e 6f 77 20 6e 6f 74 20 74 6f 20  ine know not to 
37d0: 65 78 70 65 63 74 20 74 68 69 73 20 66 75 6e 63  expect this func
37e0: 74 69 6f 6e 20 74 6f 20 62 65 0a 2a 2a 20 69 6e  tion to be.** in
37f0: 76 6f 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  voked..*/.static
3800: 20 76 6f 69 64 20 6e 6f 6f 70 53 74 65 70 46 75   void noopStepFu
3810: 6e 63 28 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54  nc(    /*NO_TEST
3820: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  */.  sqlite3_con
3830: 74 65 78 74 20 2a 70 2c 20 20 20 20 20 20 20 20  text *p,        
3840: 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 69 6e  /*NO_TEST*/.  in
3850: 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  t n,            
3860: 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45           /*NO_TE
3870: 53 54 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  ST*/.  sqlite3_v
3880: 61 6c 75 65 20 2a 2a 61 20 20 20 20 20 20 20 20  alue **a        
3890: 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 29 7b    /*NO_TEST*/.){
38a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f             /*NO_
38c0: 54 45 53 54 2a 2f 0a 20 20 55 4e 55 53 45 44 5f  TEST*/.  UNUSED_
38d0: 50 41 52 41 4d 45 54 45 52 28 70 29 3b 20 20 20  PARAMETER(p);   
38e0: 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a      /*NO_TEST*/.
38f0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
3900: 45 52 28 6e 29 3b 20 20 20 20 20 20 20 2f 2a 4e  ER(n);       /*N
3910: 4f 5f 54 45 53 54 2a 2f 0a 20 20 55 4e 55 53 45  O_TEST*/.  UNUSE
3920: 44 5f 50 41 52 41 4d 45 54 45 52 28 61 29 3b 20  D_PARAMETER(a); 
3930: 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a        /*NO_TEST*
3940: 2f 0a 20 20 61 73 73 65 72 74 28 30 29 3b 20 20  /.  assert(0);  
3950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3960: 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 7d 20 20 20 20  *NO_TEST*/.}    
3970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3980: 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53          /*NO_TES
3990: 54 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  T*/.static void 
39a0: 6e 6f 6f 70 56 61 6c 75 65 46 75 6e 63 28 73 71  noopValueFunc(sq
39b0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
39c0: 29 7b 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  ){ UNUSED_PARAME
39d0: 54 45 52 28 70 29 3b 20 2f 2a 6e 6f 2d 6f 70 2a  TER(p); /*no-op*
39e0: 2f 20 7d 0a 0a 2f 2a 20 57 69 6e 64 6f 77 20 66  / }../* Window f
39f0: 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 75 73  unctions that us
3a00: 65 20 61 6c 6c 20 77 69 6e 64 6f 77 20 69 6e 74  e all window int
3a10: 65 72 66 61 63 65 73 3a 20 78 53 74 65 70 2c 20  erfaces: xStep, 
3a20: 78 46 69 6e 61 6c 2c 0a 2a 2a 20 78 56 61 6c 75  xFinal,.** xValu
3a30: 65 2c 20 61 6e 64 20 78 49 6e 76 65 72 73 65 20  e, and xInverse 
3a40: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 44 4f  */.#define WINDO
3a50: 57 46 55 4e 43 41 4c 4c 28 6e 61 6d 65 2c 6e 41  WFUNCALL(name,nA
3a60: 72 67 2c 65 78 74 72 61 29 20 7b 20 20 20 20 20  rg,extra) {     
3a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
3a90: 20 20 6e 41 72 67 2c 20 28 53 51 4c 49 54 45 5f    nArg, (SQLITE_
3aa0: 55 54 46 38 7c 53 51 4c 49 54 45 5f 46 55 4e 43  UTF8|SQLITE_FUNC
3ab0: 5f 57 49 4e 44 4f 57 7c 65 78 74 72 61 29 2c 20  _WINDOW|extra), 
3ac0: 30 2c 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  0, 0,           
3ad0: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6e             \.  n
3ae0: 61 6d 65 20 23 23 20 53 74 65 70 46 75 6e 63 2c  ame ## StepFunc,
3af0: 20 6e 61 6d 65 20 23 23 20 46 69 6e 61 6c 69 7a   name ## Finaliz
3b00: 65 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20 56  eFunc, name ## V
3b10: 61 6c 75 65 46 75 6e 63 2c 20 20 20 20 20 20 20  alueFunc,       
3b20: 20 20 20 20 20 20 20 20 5c 0a 20 20 6e 61 6d 65          \.  name
3b30: 20 23 23 20 49 6e 76 46 75 6e 63 2c 20 6e 61 6d   ## InvFunc, nam
3b40: 65 20 23 23 20 4e 61 6d 65 2c 20 7b 30 7d 20 20  e ## Name, {0}  
3b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b70: 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 20 57 69 6e       \.}../* Win
3b80: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  dow functions th
3b90: 61 74 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74  at are implement
3ba0: 65 64 20 75 73 69 6e 67 20 62 79 74 65 63 6f 64  ed using bytecod
3bb0: 65 20 61 6e 64 20 74 68 75 73 20 68 61 76 65 0a  e and thus have.
3bc0: 2a 2a 20 6e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65  ** no-op routine
3bd0: 73 20 66 6f 72 20 74 68 65 69 72 20 6d 65 74 68  s for their meth
3be0: 6f 64 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ods */.#define W
3bf0: 49 4e 44 4f 57 46 55 4e 43 4e 4f 4f 50 28 6e 61  INDOWFUNCNOOP(na
3c00: 6d 65 2c 6e 41 72 67 2c 65 78 74 72 61 29 20 7b  me,nArg,extra) {
3c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c30: 20 20 5c 0a 20 20 6e 41 72 67 2c 20 28 53 51 4c    \.  nArg, (SQL
3c40: 49 54 45 5f 55 54 46 38 7c 53 51 4c 49 54 45 5f  ITE_UTF8|SQLITE_
3c50: 46 55 4e 43 5f 57 49 4e 44 4f 57 7c 65 78 74 72  FUNC_WINDOW|extr
3c60: 61 29 2c 20 30 2c 20 30 2c 20 20 20 20 20 20 20  a), 0, 0,       
3c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
3c80: 0a 20 20 6e 6f 6f 70 53 74 65 70 46 75 6e 63 2c  .  noopStepFunc,
3c90: 20 6e 6f 6f 70 56 61 6c 75 65 46 75 6e 63 2c 20   noopValueFunc, 
3ca0: 6e 6f 6f 70 56 61 6c 75 65 46 75 6e 63 2c 20 20  noopValueFunc,  
3cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cc0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
3cd0: 6e 6f 6f 70 53 74 65 70 46 75 6e 63 2c 20 6e 61  noopStepFunc, na
3ce0: 6d 65 20 23 23 20 4e 61 6d 65 2c 20 7b 30 7d 20  me ## Name, {0} 
3cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d10: 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a           \.}../*
3d20: 20 57 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   Window function
3d30: 73 20 74 68 61 74 20 75 73 65 20 61 6c 6c 20 77  s that use all w
3d40: 69 6e 64 6f 77 20 69 6e 74 65 72 66 61 63 65 73  indow interfaces
3d50: 3a 20 78 53 74 65 70 2c 20 74 68 65 0a 2a 2a 20  : xStep, the.** 
3d60: 73 61 6d 65 20 72 6f 75 74 69 6e 65 20 66 6f 72  same routine for
3d70: 20 78 46 69 6e 61 6c 69 7a 65 20 61 6e 64 20 78   xFinalize and x
3d80: 56 61 6c 75 65 20 61 6e 64 20 77 68 69 63 68 20  Value and which 
3d90: 6e 65 76 65 72 20 63 61 6c 6c 0a 2a 2a 20 78 49  never call.** xI
3da0: 6e 76 65 72 73 65 2e 20 2a 2f 0a 23 64 65 66 69  nverse. */.#defi
3db0: 6e 65 20 57 49 4e 44 4f 57 46 55 4e 43 58 28 6e  ne WINDOWFUNCX(n
3dc0: 61 6d 65 2c 6e 41 72 67 2c 65 78 74 72 61 29 20  ame,nArg,extra) 
3dd0: 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
3de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3df0: 20 20 20 20 20 20 5c 0a 20 20 6e 41 72 67 2c 20        \.  nArg, 
3e00: 28 53 51 4c 49 54 45 5f 55 54 46 38 7c 53 51 4c  (SQLITE_UTF8|SQL
3e10: 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 7c  ITE_FUNC_WINDOW|
3e20: 65 78 74 72 61 29 2c 20 30 2c 20 30 2c 20 20 20  extra), 0, 0,   
3e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e40: 20 20 20 5c 0a 20 20 6e 61 6d 65 20 23 23 20 53     \.  name ## S
3e50: 74 65 70 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23  tepFunc, name ##
3e60: 20 56 61 6c 75 65 46 75 6e 63 2c 20 6e 61 6d 65   ValueFunc, name
3e70: 20 23 23 20 56 61 6c 75 65 46 75 6e 63 2c 20 20   ## ValueFunc,  
3e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e90: 5c 0a 20 20 6e 6f 6f 70 53 74 65 70 46 75 6e 63  \.  noopStepFunc
3ea0: 2c 20 6e 61 6d 65 20 23 23 20 4e 61 6d 65 2c 20  , name ## Name, 
3eb0: 7b 30 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  {0}             
3ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d               \.}
3ee0: 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  .../*.** Registe
3ef0: 72 20 74 68 6f 73 65 20 62 75 69 6c 74 2d 69 6e  r those built-in
3f00: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
3f10: 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61  s that are not a
3f20: 6c 73 6f 20 61 67 67 72 65 67 61 74 65 73 2e 0a  lso aggregates..
3f30: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57  */.void sqlite3W
3f40: 69 6e 64 6f 77 46 75 6e 63 74 69 6f 6e 73 28 76  indowFunctions(v
3f50: 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 46  oid){.  static F
3f60: 75 6e 63 44 65 66 20 61 57 69 6e 64 6f 77 46 75  uncDef aWindowFu
3f70: 6e 63 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 57 49  ncs[] = {.    WI
3f80: 4e 44 4f 57 46 55 4e 43 58 28 72 6f 77 5f 6e 75  NDOWFUNCX(row_nu
3f90: 6d 62 65 72 2c 20 30 2c 20 30 29 2c 0a 20 20 20  mber, 0, 0),.   
3fa0: 20 57 49 4e 44 4f 57 46 55 4e 43 58 28 64 65 6e   WINDOWFUNCX(den
3fb0: 73 65 5f 72 61 6e 6b 2c 20 30 2c 20 30 29 2c 0a  se_rank, 0, 0),.
3fc0: 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 58 28      WINDOWFUNCX(
3fd0: 72 61 6e 6b 2c 20 30 2c 20 30 29 2c 0a 20 20 20  rank, 0, 0),.   
3fe0: 20 2f 2f 20 57 49 4e 44 4f 57 46 55 4e 43 58 28   // WINDOWFUNCX(
3ff0: 70 65 72 63 65 6e 74 5f 72 61 6e 6b 2c 20 30 2c  percent_rank, 0,
4000: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e   SQLITE_FUNC_WIN
4010: 44 4f 57 5f 53 49 5a 45 29 2c 0a 20 20 20 20 57  DOW_SIZE),.    W
4020: 49 4e 44 4f 57 46 55 4e 43 41 4c 4c 28 70 65 72  INDOWFUNCALL(per
4030: 63 65 6e 74 5f 72 61 6e 6b 2c 20 30 2c 20 30 29  cent_rank, 0, 0)
4040: 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43  ,.    WINDOWFUNC
4050: 41 4c 4c 28 63 75 6d 65 5f 64 69 73 74 2c 20 30  ALL(cume_dist, 0
4060: 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57  , 0),.    WINDOW
4070: 46 55 4e 43 41 4c 4c 28 6e 74 69 6c 65 2c 20 31  FUNCALL(ntile, 1
4080: 2c 20 30 29 2c 0a 20 20 20 20 2f 2f 20 57 49 4e  , 0),.    // WIN
4090: 44 4f 57 46 55 4e 43 58 28 63 75 6d 65 5f 64 69  DOWFUNCX(cume_di
40a0: 73 74 2c 20 30 2c 20 53 51 4c 49 54 45 5f 46 55  st, 0, SQLITE_FU
40b0: 4e 43 5f 57 49 4e 44 4f 57 5f 53 49 5a 45 29 2c  NC_WINDOW_SIZE),
40c0: 0a 20 20 20 20 2f 2f 20 57 49 4e 44 4f 57 46 55  .    // WINDOWFU
40d0: 4e 43 58 28 6e 74 69 6c 65 2c 20 31 2c 20 53 51  NCX(ntile, 1, SQ
40e0: 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57  LITE_FUNC_WINDOW
40f0: 5f 53 49 5a 45 29 2c 0a 20 20 20 20 57 49 4e 44  _SIZE),.    WIND
4100: 4f 57 46 55 4e 43 41 4c 4c 28 6c 61 73 74 5f 76  OWFUNCALL(last_v
4110: 61 6c 75 65 2c 20 31 2c 20 30 29 2c 0a 20 20 20  alue, 1, 0),.   
4120: 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f 4f 50 28   WINDOWFUNCNOOP(
4130: 6e 74 68 5f 76 61 6c 75 65 2c 20 32 2c 20 30 29  nth_value, 2, 0)
4140: 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43  ,.    WINDOWFUNC
4150: 4e 4f 4f 50 28 66 69 72 73 74 5f 76 61 6c 75 65  NOOP(first_value
4160: 2c 20 31 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e  , 1, 0),.    WIN
4170: 44 4f 57 46 55 4e 43 4e 4f 4f 50 28 6c 65 61 64  DOWFUNCNOOP(lead
4180: 2c 20 31 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e  , 1, 0),.    WIN
4190: 44 4f 57 46 55 4e 43 4e 4f 4f 50 28 6c 65 61 64  DOWFUNCNOOP(lead
41a0: 2c 20 32 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e  , 2, 0),.    WIN
41b0: 44 4f 57 46 55 4e 43 4e 4f 4f 50 28 6c 65 61 64  DOWFUNCNOOP(lead
41c0: 2c 20 33 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e  , 3, 0),.    WIN
41d0: 44 4f 57 46 55 4e 43 4e 4f 4f 50 28 6c 61 67 2c  DOWFUNCNOOP(lag,
41e0: 20 31 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44   1, 0),.    WIND
41f0: 4f 57 46 55 4e 43 4e 4f 4f 50 28 6c 61 67 2c 20  OWFUNCNOOP(lag, 
4200: 32 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f  2, 0),.    WINDO
4210: 57 46 55 4e 43 4e 4f 4f 50 28 6c 61 67 2c 20 33  WFUNCNOOP(lag, 3
4220: 2c 20 30 29 2c 0a 20 20 7d 3b 0a 20 20 73 71 6c  , 0),.  };.  sql
4230: 69 74 65 33 49 6e 73 65 72 74 42 75 69 6c 74 69  ite3InsertBuilti
4240: 6e 46 75 6e 63 73 28 61 57 69 6e 64 6f 77 46 75  nFuncs(aWindowFu
4250: 6e 63 73 2c 20 41 72 72 61 79 53 69 7a 65 28 61  ncs, ArraySize(a
4260: 57 69 6e 64 6f 77 46 75 6e 63 73 29 29 3b 0a 7d  WindowFuncs));.}
4270: 0a 0a 73 74 61 74 69 63 20 57 69 6e 64 6f 77 20  ..static Window 
4280: 2a 77 69 6e 64 6f 77 46 69 6e 64 28 50 61 72 73  *windowFind(Pars
4290: 65 20 2a 70 50 61 72 73 65 2c 20 57 69 6e 64 6f  e *pParse, Windo
42a0: 77 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20  w *pList, const 
42b0: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
42c0: 57 69 6e 64 6f 77 20 2a 70 3b 0a 20 20 66 6f 72  Window *p;.  for
42d0: 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70  (p=pList; p; p=p
42e0: 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20  ->pNextWin){.   
42f0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
4300: 43 6d 70 28 70 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e  Cmp(p->zName, zN
4310: 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ame)==0 ) break;
4320: 0a 20 20 7d 0a 20 20 69 66 28 20 70 3d 3d 30 20  .  }.  if( p==0 
4330: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
4340: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
4350: 6e 6f 20 73 75 63 68 20 77 69 6e 64 6f 77 3a 20  no such window: 
4360: 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d  %s", zName);.  }
4370: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
4380: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
4390: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 69 6d  ion is called im
43a0: 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
43b0: 72 65 73 6f 6c 76 69 6e 67 20 74 68 65 20 66 75  resolving the fu
43c0: 6e 63 74 69 6f 6e 20 6e 61 6d 65 0a 2a 2a 20 66  nction name.** f
43d0: 6f 72 20 61 20 77 69 6e 64 6f 77 20 66 75 6e 63  or a window func
43e0: 74 69 6f 6e 20 77 69 74 68 69 6e 20 61 20 53 45  tion within a SE
43f0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
4400: 41 72 67 75 6d 65 6e 74 20 70 4c 69 73 74 20 69  Argument pList i
4410: 73 20 61 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69  s a.** linked li
4420: 73 74 20 6f 66 20 57 49 4e 44 4f 57 20 64 65 66  st of WINDOW def
4430: 69 6e 69 74 69 6f 6e 73 20 66 6f 72 20 74 68 65  initions for the
4440: 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
4450: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 41 72  statement..** Ar
4460: 67 75 6d 65 6e 74 20 70 46 75 6e 63 20 69 73 20  gument pFunc is 
4470: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 65 66  the function def
4480: 69 6e 69 74 69 6f 6e 20 6a 75 73 74 20 72 65 73  inition just res
4490: 6f 6c 76 65 64 20 61 6e 64 20 70 57 69 6e 0a 2a  olved and pWin.*
44a0: 2a 20 69 73 20 74 68 65 20 57 69 6e 64 6f 77 20  * is the Window 
44b0: 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74  object represent
44c0: 69 6e 67 20 74 68 65 20 61 73 73 6f 63 69 61 74  ing the associat
44d0: 65 64 20 4f 56 45 52 20 63 6c 61 75 73 65 2e 20  ed OVER clause. 
44e0: 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
44f0: 20 75 70 64 61 74 65 73 20 74 68 65 20 63 6f 6e   updates the con
4500: 74 65 6e 74 73 20 6f 66 20 70 57 69 6e 20 61 73  tents of pWin as
4510: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
4520: 20 20 2a 20 49 66 20 74 68 65 20 4f 56 45 52 20    * If the OVER 
4530: 63 6c 61 75 73 65 20 72 65 66 65 72 65 64 20 74  clause refered t
4540: 6f 20 61 20 6e 61 6d 65 64 20 77 69 6e 64 6f 77  o a named window
4550: 20 28 61 73 20 69 6e 20 22 6d 61 78 28 78 29 20   (as in "max(x) 
4560: 4f 56 45 52 20 77 69 6e 22 29 2c 0a 2a 2a 20 20  OVER win"),.**  
4570: 20 20 20 73 65 61 72 63 68 20 6c 69 73 74 20 70     search list p
4580: 4c 69 73 74 20 66 6f 72 20 61 20 6d 61 74 63 68  List for a match
4590: 69 6e 67 20 57 49 4e 44 4f 57 20 64 65 66 69 6e  ing WINDOW defin
45a0: 69 74 69 6f 6e 2c 20 61 6e 64 20 75 70 64 61 74  ition, and updat
45b0: 65 20 70 57 69 6e 0a 2a 2a 20 20 20 20 20 61 63  e pWin.**     ac
45c0: 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20 6e 6f  cordingly. If no
45d0: 20 73 75 63 68 20 57 49 4e 44 4f 57 20 63 6c 61   such WINDOW cla
45e0: 75 73 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  use can be found
45f0: 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
4600: 0a 2a 2a 20 20 20 20 20 69 6e 20 70 50 61 72 73  .**     in pPars
4610: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20  e..**.**   * If 
4620: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  the function is 
4630: 61 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  a built-in windo
4640: 77 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  w function that 
4650: 72 65 71 75 69 72 65 73 20 74 68 65 0a 2a 2a 20  requires the.** 
4660: 20 20 20 20 77 69 6e 64 6f 77 20 74 6f 20 62 65      window to be
4670: 20 63 6f 65 72 63 65 64 20 28 73 65 65 20 22 42   coerced (see "B
4680: 55 49 4c 54 2d 49 4e 20 57 49 4e 44 4f 57 20 46  UILT-IN WINDOW F
4690: 55 4e 43 54 49 4f 4e 53 22 20 61 74 20 74 68 65  UNCTIONS" at the
46a0: 20 74 6f 70 0a 2a 2a 20 20 20 20 20 6f 66 20 74   top.**     of t
46b0: 68 69 73 20 66 69 6c 65 29 2c 20 70 57 69 6e 20  his file), pWin 
46c0: 69 73 20 75 70 64 61 74 65 64 20 68 65 72 65 2e  is updated here.
46d0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
46e0: 57 69 6e 64 6f 77 55 70 64 61 74 65 28 0a 20 20  WindowUpdate(.  
46f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a  Parse *pParse, .
4700: 20 20 57 69 6e 64 6f 77 20 2a 70 4c 69 73 74 2c    Window *pList,
4710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4720: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6e 61 6d    /* List of nam
4730: 65 64 20 77 69 6e 64 6f 77 73 20 66 6f 72 20 74  ed windows for t
4740: 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  his SELECT */.  
4750: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 2c 20 20 20  Window *pWin,   
4760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4770: 2f 2a 20 57 69 6e 64 6f 77 20 66 72 61 6d 65 20  /* Window frame 
4780: 74 6f 20 75 70 64 61 74 65 20 2a 2f 0a 20 20 46  to update */.  F
4790: 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20 20 20  uncDef *pFunc   
47a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
47b0: 2a 20 57 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  * Window functio
47c0: 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 2a 2f 0a  n definition */.
47d0: 29 7b 0a 20 20 69 66 28 20 70 57 69 6e 2d 3e 7a  ){.  if( pWin->z
47e0: 4e 61 6d 65 20 26 26 20 70 57 69 6e 2d 3e 65 54  Name && pWin->eT
47f0: 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 57 69  ype==0 ){.    Wi
4800: 6e 64 6f 77 20 2a 70 20 3d 20 77 69 6e 64 6f 77  ndow *p = window
4810: 46 69 6e 64 28 70 50 61 72 73 65 2c 20 70 4c 69  Find(pParse, pLi
4820: 73 74 2c 20 70 57 69 6e 2d 3e 7a 4e 61 6d 65 29  st, pWin->zName)
4830: 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29  ;.    if( p==0 )
4840: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 57 69   return;.    pWi
4850: 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 3d 20  n->pPartition = 
4860: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
4870: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
4880: 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20 30 29  ->pPartition, 0)
4890: 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70 4f 72 64  ;.    pWin->pOrd
48a0: 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
48b0: 70 72 4c 69 73 74 44 75 70 28 70 50 61 72 73 65  prListDup(pParse
48c0: 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  ->db, p->pOrderB
48d0: 79 2c 20 30 29 3b 0a 20 20 20 20 70 57 69 6e 2d  y, 0);.    pWin-
48e0: 3e 70 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65  >pStart = sqlite
48f0: 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d  3ExprDup(pParse-
4900: 3e 64 62 2c 20 70 2d 3e 70 53 74 61 72 74 2c 20  >db, p->pStart, 
4910: 30 29 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70 45  0);.    pWin->pE
4920: 6e 64 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  nd = sqlite3Expr
4930: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
4940: 70 2d 3e 70 45 6e 64 2c 20 30 29 3b 0a 20 20 20  p->pEnd, 0);.   
4950: 20 70 57 69 6e 2d 3e 65 53 74 61 72 74 20 3d 20   pWin->eStart = 
4960: 70 2d 3e 65 53 74 61 72 74 3b 0a 20 20 20 20 70  p->eStart;.    p
4970: 57 69 6e 2d 3e 65 45 6e 64 20 3d 20 70 2d 3e 65  Win->eEnd = p->e
4980: 45 6e 64 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 65  End;.    pWin->e
4990: 54 79 70 65 20 3d 20 70 2d 3e 65 54 79 70 65 3b  Type = p->eType;
49a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
49b0: 6c 69 74 65 33 57 69 6e 64 6f 77 43 68 61 69 6e  lite3WindowChain
49c0: 28 70 50 61 72 73 65 2c 20 70 57 69 6e 2c 20 70  (pParse, pWin, p
49d0: 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  List);.  }.  if(
49e0: 20 28 70 57 69 6e 2d 3e 65 54 79 70 65 3d 3d 54   (pWin->eType==T
49f0: 4b 5f 52 41 4e 47 45 29 0a 20 20 20 26 26 20 28  K_RANGE).   && (
4a00: 70 57 69 6e 2d 3e 70 53 74 61 72 74 20 7c 7c 20  pWin->pStart || 
4a10: 70 57 69 6e 2d 3e 70 45 6e 64 29 20 0a 20 20 20  pWin->pEnd) .   
4a20: 26 26 20 28 70 57 69 6e 2d 3e 70 4f 72 64 65 72  && (pWin->pOrder
4a30: 42 79 3d 3d 30 20 7c 7c 20 70 57 69 6e 2d 3e 70  By==0 || pWin->p
4a40: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 21 3d  OrderBy->nExpr!=
4a50: 31 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69  1).  ){.    sqli
4a60: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
4a70: 73 65 2c 20 0a 20 20 20 20 20 20 22 52 41 4e 47  se, .      "RANG
4a80: 45 20 77 69 74 68 20 6f 66 66 73 65 74 20 50 52  E with offset PR
4a90: 45 43 45 44 49 4e 47 2f 46 4f 4c 4c 4f 57 49 4e  ECEDING/FOLLOWIN
4aa0: 47 20 72 65 71 75 69 72 65 73 20 6f 6e 65 20 4f  G requires one O
4ab0: 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69  RDER BY expressi
4ac0: 6f 6e 22 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c  on".    );.  }el
4ad0: 73 65 0a 20 20 69 66 28 20 70 46 75 6e 63 2d 3e  se.  if( pFunc->
4ae0: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
4af0: 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 20 29  TE_FUNC_WINDOW )
4b00: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
4b10: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
4b20: 20 20 20 20 69 66 28 20 70 57 69 6e 2d 3e 70 46      if( pWin->pF
4b30: 69 6c 74 65 72 20 29 7b 0a 20 20 20 20 20 20 73  ilter ){.      s
4b40: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
4b50: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
4b60: 20 20 22 46 49 4c 54 45 52 20 63 6c 61 75 73 65    "FILTER clause
4b70: 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65   may only be use
4b80: 64 20 77 69 74 68 20 61 67 67 72 65 67 61 74 65  d with aggregate
4b90: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
4ba0: 73 22 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  s".      );.    
4bb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 72  }else{.      str
4bc0: 75 63 74 20 57 69 6e 64 6f 77 55 70 64 61 74 65  uct WindowUpdate
4bd0: 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74   {.        const
4be0: 20 63 68 61 72 20 2a 7a 46 75 6e 63 3b 0a 20 20   char *zFunc;.  
4bf0: 20 20 20 20 20 20 69 6e 74 20 65 54 79 70 65 3b        int eType;
4c00: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65 53 74  .        int eSt
4c10: 61 72 74 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  art;.        int
4c20: 20 65 45 6e 64 3b 0a 20 20 20 20 20 20 7d 20 61   eEnd;.      } a
4c30: 55 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  Up[] = {.       
4c40: 20 7b 20 72 6f 77 5f 6e 75 6d 62 65 72 4e 61 6d   { row_numberNam
4c50: 65 2c 20 20 20 54 4b 5f 52 4f 57 53 2c 20 20 20  e,   TK_ROWS,   
4c60: 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 2c 20 54 4b  TK_UNBOUNDED, TK
4c70: 5f 43 55 52 52 45 4e 54 20 7d 2c 20 0a 20 20 20  _CURRENT }, .   
4c80: 20 20 20 20 20 7b 20 64 65 6e 73 65 5f 72 61 6e       { dense_ran
4c90: 6b 4e 61 6d 65 2c 20 20 20 54 4b 5f 52 41 4e 47  kName,   TK_RANG
4ca0: 45 2c 20 20 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  E,  TK_UNBOUNDED
4cb0: 2c 20 54 4b 5f 43 55 52 52 45 4e 54 20 7d 2c 20  , TK_CURRENT }, 
4cc0: 0a 20 20 20 20 20 20 20 20 7b 20 72 61 6e 6b 4e  .        { rankN
4cd0: 61 6d 65 2c 20 20 20 20 20 20 20 20 20 54 4b 5f  ame,         TK_
4ce0: 52 41 4e 47 45 2c 20 20 54 4b 5f 55 4e 42 4f 55  RANGE,  TK_UNBOU
4cf0: 4e 44 45 44 2c 20 54 4b 5f 43 55 52 52 45 4e 54  NDED, TK_CURRENT
4d00: 20 7d 2c 20 0a 20 20 20 20 20 20 20 20 7b 20 70   }, .        { p
4d10: 65 72 63 65 6e 74 5f 72 61 6e 6b 4e 61 6d 65 2c  ercent_rankName,
4d20: 20 54 4b 5f 47 52 4f 55 50 53 2c 20 54 4b 5f 43   TK_GROUPS, TK_C
4d30: 55 52 52 45 4e 54 2c 20 20 20 54 4b 5f 55 4e 42  URRENT,   TK_UNB
4d40: 4f 55 4e 44 45 44 20 7d 2c 20 0a 20 20 20 20 20  OUNDED }, .     
4d50: 20 20 20 7b 20 63 75 6d 65 5f 64 69 73 74 4e 61     { cume_distNa
4d60: 6d 65 2c 20 20 20 20 54 4b 5f 47 52 4f 55 50 53  me,    TK_GROUPS
4d70: 2c 20 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 2c 20  , TK_FOLLOWING, 
4d80: 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 7d 2c 20  TK_UNBOUNDED }, 
4d90: 0a 20 20 20 20 20 20 20 20 7b 20 6e 74 69 6c 65  .        { ntile
4da0: 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 54 4b 5f  Name,        TK_
4db0: 52 4f 57 53 2c 20 20 20 54 4b 5f 43 55 52 52 45  ROWS,   TK_CURRE
4dc0: 4e 54 2c 20 20 20 54 4b 5f 55 4e 42 4f 55 4e 44  NT,   TK_UNBOUND
4dd0: 45 44 20 7d 2c 20 0a 20 20 20 20 20 20 20 20 7b  ED }, .        {
4de0: 20 6c 65 61 64 4e 61 6d 65 2c 20 20 20 20 20 20   leadName,      
4df0: 20 20 20 54 4b 5f 52 4f 57 53 2c 20 20 20 54 4b     TK_ROWS,   TK
4e00: 5f 55 4e 42 4f 55 4e 44 45 44 2c 20 54 4b 5f 55  _UNBOUNDED, TK_U
4e10: 4e 42 4f 55 4e 44 45 44 20 7d 2c 20 0a 20 20 20  NBOUNDED }, .   
4e20: 20 20 20 20 20 7b 20 6c 61 67 4e 61 6d 65 2c 20       { lagName, 
4e30: 20 20 20 20 20 20 20 20 20 54 4b 5f 52 4f 57 53           TK_ROWS
4e40: 2c 20 20 20 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  ,   TK_UNBOUNDED
4e50: 2c 20 54 4b 5f 43 55 52 52 45 4e 54 20 7d 2c 20  , TK_CURRENT }, 
4e60: 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
4e70: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
4e80: 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i=0; i<ArraySiz
4e90: 65 28 61 55 70 29 3b 20 69 2b 2b 29 7b 0a 20 20  e(aUp); i++){.  
4ea0: 20 20 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d        if( pFunc-
4eb0: 3e 7a 4e 61 6d 65 3d 3d 61 55 70 5b 69 5d 2e 7a  >zName==aUp[i].z
4ec0: 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Func ){.        
4ed0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
4ee0: 65 74 65 28 64 62 2c 20 70 57 69 6e 2d 3e 70 53  ete(db, pWin->pS
4ef0: 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 20  tart);.         
4f00: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
4f10: 74 65 28 64 62 2c 20 70 57 69 6e 2d 3e 70 45 6e  te(db, pWin->pEn
4f20: 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 57  d);.          pW
4f30: 69 6e 2d 3e 70 45 6e 64 20 3d 20 70 57 69 6e 2d  in->pEnd = pWin-
4f40: 3e 70 53 74 61 72 74 20 3d 20 30 3b 0a 20 20 20  >pStart = 0;.   
4f50: 20 20 20 20 20 20 20 70 57 69 6e 2d 3e 65 54 79         pWin->eTy
4f60: 70 65 20 3d 20 61 55 70 5b 69 5d 2e 65 54 79 70  pe = aUp[i].eTyp
4f70: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 57 69  e;.          pWi
4f80: 6e 2d 3e 65 53 74 61 72 74 20 3d 20 61 55 70 5b  n->eStart = aUp[
4f90: 69 5d 2e 65 53 74 61 72 74 3b 0a 20 20 20 20 20  i].eStart;.     
4fa0: 20 20 20 20 20 70 57 69 6e 2d 3e 65 45 6e 64 20       pWin->eEnd 
4fb0: 3d 20 61 55 70 5b 69 5d 2e 65 45 6e 64 3b 0a 20  = aUp[i].eEnd;. 
4fc0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 57 69           if( pWi
4fd0: 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f  n->eStart==TK_FO
4fe0: 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 20  LLOWING ){.     
4ff0: 20 20 20 20 20 20 20 70 57 69 6e 2d 3e 70 53 74         pWin->pSt
5000: 61 72 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  art = sqlite3Exp
5010: 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52  r(db, TK_INTEGER
5020: 2c 20 22 31 22 29 3b 0a 20 20 20 20 20 20 20 20  , "1");.        
5030: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72    }.          br
5040: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
5050: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
5060: 0a 20 20 70 57 69 6e 2d 3e 70 46 75 6e 63 20 3d  .  pWin->pFunc =
5070: 20 70 46 75 6e 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pFunc;.}../*.**
5080: 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20   Context object 
5090: 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 73  passed through s
50a0: 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69  qlite3WalkExprLi
50b0: 73 74 28 29 20 74 6f 0a 2a 2a 20 73 65 6c 65 63  st() to.** selec
50c0: 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65 45 78  tWindowRewriteEx
50d0: 70 72 43 62 28 29 20 62 79 20 73 65 6c 65 63 74  prCb() by select
50e0: 57 69 6e 64 6f 77 52 65 77 72 69 74 65 45 4c 69  WindowRewriteELi
50f0: 73 74 28 29 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  st()..*/.typedef
5100: 20 73 74 72 75 63 74 20 57 69 6e 64 6f 77 52 65   struct WindowRe
5110: 77 72 69 74 65 20 57 69 6e 64 6f 77 52 65 77 72  write WindowRewr
5120: 69 74 65 3b 0a 73 74 72 75 63 74 20 57 69 6e 64  ite;.struct Wind
5130: 6f 77 52 65 77 72 69 74 65 20 7b 0a 20 20 57 69  owRewrite {.  Wi
5140: 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 53 72  ndow *pWin;.  Sr
5150: 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 45  cList *pSrc;.  E
5160: 78 70 72 4c 69 73 74 20 2a 70 53 75 62 3b 0a 20  xprList *pSub;. 
5170: 20 53 65 6c 65 63 74 20 2a 70 53 75 62 53 65 6c   Select *pSubSel
5180: 65 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ect;            
5190: 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 75 62 2d   /* Current sub-
51a0: 73 65 6c 65 63 74 2c 20 69 66 20 61 6e 79 20 2a  select, if any *
51b0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  /.};../*.** Call
51c0: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 75 73  back function us
51d0: 65 64 20 62 79 20 73 65 6c 65 63 74 57 69 6e 64  ed by selectWind
51e0: 6f 77 52 65 77 72 69 74 65 45 4c 69 73 74 28 29  owRewriteEList()
51f0: 2e 20 49 66 20 6e 65 63 65 73 73 61 72 79 2c 0a  . If necessary,.
5200: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
5210: 20 61 70 70 65 6e 64 73 20 74 6f 20 74 68 65 20   appends to the 
5220: 6f 75 74 70 75 74 20 65 78 70 72 65 73 73 69 6f  output expressio
5230: 6e 2d 6c 69 73 74 20 61 6e 64 20 75 70 64 61 74  n-list and updat
5240: 65 73 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  es .** expressio
5250: 6e 20 28 2a 70 70 45 78 70 72 29 20 69 6e 20 70  n (*ppExpr) in p
5260: 6c 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lace..*/.static 
5270: 69 6e 74 20 73 65 6c 65 63 74 57 69 6e 64 6f 77  int selectWindow
5280: 52 65 77 72 69 74 65 45 78 70 72 43 62 28 57 61  RewriteExprCb(Wa
5290: 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
52a0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 73  xpr *pExpr){.  s
52b0: 74 72 75 63 74 20 57 69 6e 64 6f 77 52 65 77 72  truct WindowRewr
52c0: 69 74 65 20 2a 70 20 3d 20 70 57 61 6c 6b 65 72  ite *p = pWalker
52d0: 2d 3e 75 2e 70 52 65 77 72 69 74 65 3b 0a 20 20  ->u.pRewrite;.  
52e0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
52f0: 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
5300: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 66  ..  /* If this f
5310: 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  unction is being
5320: 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74   called from wit
5330: 68 69 6e 20 61 20 73 63 61 6c 61 72 20 73 75 62  hin a scalar sub
5340: 2d 73 65 6c 65 63 74 0a 20 20 2a 2a 20 74 68 61  -select.  ** tha
5350: 74 20 75 73 65 64 20 62 79 20 74 68 65 20 53 45  t used by the SE
5360: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62  LECT statement b
5370: 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2c 20  eing processed, 
5380: 6f 6e 6c 79 20 70 72 6f 63 65 73 73 0a 20 20 2a  only process.  *
5390: 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 20 65 78 70 72  * TK_COLUMN expr
53a0: 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72 65 66  essions that ref
53b0: 65 72 20 74 6f 20 69 74 20 28 74 68 65 20 6f 75  er to it (the ou
53c0: 74 65 72 20 53 45 4c 45 43 54 29 2e 20 44 6f 0a  ter SELECT). Do.
53d0: 20 20 2a 2a 20 6e 6f 74 20 70 72 6f 63 65 73 73    ** not process
53e0: 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 77   aggregates or w
53f0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
5400: 61 74 20 61 6c 6c 2c 20 61 73 20 74 68 65 79 20  at all, as they 
5410: 62 65 6c 6f 6e 67 0a 20 20 2a 2a 20 74 6f 20 74  belong.  ** to t
5420: 68 65 20 73 63 61 6c 61 72 20 73 75 62 2d 73 65  he scalar sub-se
5430: 6c 65 63 74 2e 20 20 2a 2f 0a 20 20 69 66 28 20  lect.  */.  if( 
5440: 70 2d 3e 70 53 75 62 53 65 6c 65 63 74 20 29 7b  p->pSubSelect ){
5450: 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
5460: 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op!=TK_COLUMN ){
5470: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
5480: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  C_Continue;.    
5490: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
54a0: 20 6e 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 2d   nSrc = p->pSrc-
54b0: 3e 6e 53 72 63 3b 0a 20 20 20 20 20 20 69 6e 74  >nSrc;.      int
54c0: 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
54d0: 30 3b 20 69 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b  0; i<nSrc; i++){
54e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78  .        if( pEx
54f0: 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 2d 3e 70  pr->iTable==p->p
5500: 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  Src->a[i].iCurso
5510: 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  r ) break;.     
5520: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d   }.      if( i==
5530: 6e 53 72 63 20 29 20 72 65 74 75 72 6e 20 57 52  nSrc ) return WR
5540: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  C_Continue;.    
5550: 7d 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28  }.  }..  switch(
5560: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 0a 20   pExpr->op ){.. 
5570: 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
5580: 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 21  ION:.      if( !
5590: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
55a0: 70 45 78 70 72 2c 20 45 50 5f 57 69 6e 46 75 6e  pExpr, EP_WinFun
55b0: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  c) ){.        br
55c0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eak;.      }else
55d0: 7b 0a 20 20 20 20 20 20 20 20 57 69 6e 64 6f 77  {.        Window
55e0: 20 2a 70 57 69 6e 3b 0a 20 20 20 20 20 20 20 20   *pWin;.        
55f0: 66 6f 72 28 70 57 69 6e 3d 70 2d 3e 70 57 69 6e  for(pWin=p->pWin
5600: 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69  ; pWin; pWin=pWi
5610: 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20  n->pNextWin){.  
5620: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
5630: 72 2d 3e 79 2e 70 57 69 6e 3d 3d 70 57 69 6e 20  r->y.pWin==pWin 
5640: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
5650: 73 73 65 72 74 28 20 70 57 69 6e 2d 3e 70 4f 77  ssert( pWin->pOw
5660: 6e 65 72 3d 3d 70 45 78 70 72 20 29 3b 0a 20 20  ner==pExpr );.  
5670: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
5680: 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
5690: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
56a0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
56b0: 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 2e  /* Fall through.
56c0: 20 20 2a 2f 0a 0a 20 20 20 20 63 61 73 65 20 54    */..    case T
56d0: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a  K_AGG_FUNCTION:.
56e0: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
56f0: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  MN: {.      Expr
5700: 20 2a 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33   *pDup = sqlite3
5710: 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e  ExprDup(pParse->
5720: 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  db, pExpr, 0);. 
5730: 20 20 20 20 20 70 2d 3e 70 53 75 62 20 3d 20 73       p->pSub = s
5740: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
5750: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 2d 3e  pend(pParse, p->
5760: 70 53 75 62 2c 20 70 44 75 70 29 3b 0a 20 20 20  pSub, pDup);.   
5770: 20 20 20 69 66 28 20 70 2d 3e 70 53 75 62 20 29     if( p->pSub )
5780: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
5790: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
57a0: 79 28 70 45 78 70 72 2c 20 45 50 5f 53 74 61 74  y(pExpr, EP_Stat
57b0: 69 63 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ic)==0 );.      
57c0: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
57d0: 79 28 70 45 78 70 72 2c 20 45 50 5f 53 74 61 74  y(pExpr, EP_Stat
57e0: 69 63 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ic);.        sql
57f0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
5800: 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72  Parse->db, pExpr
5810: 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 43  );.        ExprC
5820: 6c 65 61 72 50 72 6f 70 65 72 74 79 28 70 45 78  learProperty(pEx
5830: 70 72 2c 20 45 50 5f 53 74 61 74 69 63 29 3b 0a  pr, EP_Static);.
5840: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
5850: 45 78 70 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Expr, 0, sizeof(
5860: 45 78 70 72 29 29 3b 0a 0a 20 20 20 20 20 20 20  Expr));..       
5870: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
5880: 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20  COLUMN;.        
5890: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
58a0: 20 70 2d 3e 70 53 75 62 2d 3e 6e 45 78 70 72 2d   p->pSub->nExpr-
58b0: 31 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  1;.        pExpr
58c0: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 2d 3e 70 57  ->iTable = p->pW
58d0: 69 6e 2d 3e 69 45 70 68 43 73 72 3b 0a 20 20 20  in->iEphCsr;.   
58e0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 62 72 65 61     }..      brea
58f0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 65  k;.    }..    de
5900: 66 61 75 6c 74 3a 20 2f 2a 20 6e 6f 2d 6f 70 20  fault: /* no-op 
5910: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
5920: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 57 52    }..  return WR
5930: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74  C_Continue;.}.st
5940: 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 57  atic int selectW
5950: 69 6e 64 6f 77 52 65 77 72 69 74 65 53 65 6c 65  indowRewriteSele
5960: 63 74 43 62 28 57 61 6c 6b 65 72 20 2a 70 57 61  ctCb(Walker *pWa
5970: 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53  lker, Select *pS
5980: 65 6c 65 63 74 29 7b 0a 20 20 73 74 72 75 63 74  elect){.  struct
5990: 20 57 69 6e 64 6f 77 52 65 77 72 69 74 65 20 2a   WindowRewrite *
59a0: 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  p = pWalker->u.p
59b0: 52 65 77 72 69 74 65 3b 0a 20 20 53 65 6c 65 63  Rewrite;.  Selec
59c0: 74 20 2a 70 53 61 76 65 20 3d 20 70 2d 3e 70 53  t *pSave = p->pS
59d0: 75 62 53 65 6c 65 63 74 3b 0a 20 20 69 66 28 20  ubSelect;.  if( 
59e0: 70 53 61 76 65 3d 3d 70 53 65 6c 65 63 74 20 29  pSave==pSelect )
59f0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
5a00: 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 65 6c  _Continue;.  }el
5a10: 73 65 7b 0a 20 20 20 20 70 2d 3e 70 53 75 62 53  se{.    p->pSubS
5a20: 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 3b  elect = pSelect;
5a30: 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  .    sqlite3Walk
5a40: 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
5a50: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 70 2d  pSelect);.    p-
5a60: 3e 70 53 75 62 53 65 6c 65 63 74 20 3d 20 70 53  >pSubSelect = pS
5a70: 61 76 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ave;.  }.  retur
5a80: 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 7d 0a 0a  n WRC_Prune;.}..
5a90: 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 65 20 74  ./*.** Iterate t
5aa0: 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72  hrough each expr
5ab0: 65 73 73 69 6f 6e 20 69 6e 20 65 78 70 72 65 73  ession in expres
5ac0: 73 69 6f 6e 2d 6c 69 73 74 20 70 45 4c 69 73 74  sion-list pEList
5ad0: 2e 20 46 6f 72 20 65 61 63 68 3a 0a 2a 2a 0a 2a  . For each:.**.*
5ae0: 2a 20 20 20 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 2c  *   * TK_COLUMN,
5af0: 0a 2a 2a 20 20 20 2a 20 61 67 67 72 65 67 61 74  .**   * aggregat
5b00: 65 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 72 0a 2a  e function, or.*
5b10: 2a 20 20 20 2a 20 77 69 6e 64 6f 77 20 66 75 6e  *   * window fun
5b20: 63 74 69 6f 6e 20 77 69 74 68 20 61 20 57 69 6e  ction with a Win
5b30: 64 6f 77 20 6f 62 6a 65 63 74 20 74 68 61 74 20  dow object that 
5b40: 69 73 20 6e 6f 74 20 61 20 6d 65 6d 62 65 72 20  is not a member 
5b50: 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 57  of the .**     W
5b60: 69 6e 64 6f 77 20 6c 69 73 74 20 70 61 73 73 65  indow list passe
5b70: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
5b80: 61 72 67 75 6d 65 6e 74 20 28 70 57 69 6e 29 2e  argument (pWin).
5b90: 0a 2a 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74 68  .**.** Append th
5ba0: 65 20 6e 6f 64 65 20 74 6f 20 6f 75 74 70 75 74  e node to output
5bb0: 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74   expression-list
5bc0: 20 28 2a 70 70 53 75 62 29 2e 20 41 6e 64 20 72   (*ppSub). And r
5bd0: 65 70 6c 61 63 65 20 69 74 0a 2a 2a 20 77 69 74  eplace it.** wit
5be0: 68 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 74 68  h a TK_COLUMN th
5bf0: 61 74 20 72 65 61 64 73 20 74 68 65 20 28 4e 2d  at reads the (N-
5c00: 31 29 74 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20  1)th element of 
5c10: 74 61 62 6c 65 20 0a 2a 2a 20 70 57 69 6e 2d 3e  table .** pWin->
5c20: 69 45 70 68 43 73 72 2c 20 77 68 65 72 65 20 4e  iEphCsr, where N
5c30: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
5c40: 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 28 2a  f elements in (*
5c50: 70 70 53 75 62 29 20 61 66 74 65 72 0a 2a 2a 20  ppSub) after.** 
5c60: 61 70 70 65 6e 64 69 6e 67 20 74 68 65 20 6e 65  appending the ne
5c70: 77 20 6f 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  w one..*/.static
5c80: 20 76 6f 69 64 20 73 65 6c 65 63 74 57 69 6e 64   void selectWind
5c90: 6f 77 52 65 77 72 69 74 65 45 4c 69 73 74 28 0a  owRewriteEList(.
5ca0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
5cb0: 20 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e   .  Window *pWin
5cc0: 2c 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  ,.  SrcList *pSr
5cd0: 63 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  c,.  ExprList *p
5ce0: 45 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  EList,          
5cf0: 20 20 20 20 20 2f 2a 20 52 65 77 72 69 74 65 20       /* Rewrite 
5d00: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
5d10: 68 69 73 20 6c 69 73 74 20 2a 2f 0a 20 20 45 78  his list */.  Ex
5d20: 70 72 4c 69 73 74 20 2a 2a 70 70 53 75 62 20 20  prList **ppSub  
5d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5d40: 20 49 4e 2f 4f 55 54 3a 20 53 75 62 2d 73 65 6c   IN/OUT: Sub-sel
5d50: 65 63 74 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c  ect expression-l
5d60: 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b  ist */.){.  Walk
5d70: 65 72 20 73 57 61 6c 6b 65 72 3b 0a 20 20 57 69  er sWalker;.  Wi
5d80: 6e 64 6f 77 52 65 77 72 69 74 65 20 73 52 65 77  ndowRewrite sRew
5d90: 72 69 74 65 3b 0a 0a 20 20 6d 65 6d 73 65 74 28  rite;..  memset(
5da0: 26 73 57 61 6c 6b 65 72 2c 20 30 2c 20 73 69 7a  &sWalker, 0, siz
5db0: 65 6f 66 28 57 61 6c 6b 65 72 29 29 3b 0a 20 20  eof(Walker));.  
5dc0: 6d 65 6d 73 65 74 28 26 73 52 65 77 72 69 74 65  memset(&sRewrite
5dd0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57 69 6e 64  , 0, sizeof(Wind
5de0: 6f 77 52 65 77 72 69 74 65 29 29 3b 0a 0a 20 20  owRewrite));..  
5df0: 73 52 65 77 72 69 74 65 2e 70 53 75 62 20 3d 20  sRewrite.pSub = 
5e00: 2a 70 70 53 75 62 3b 0a 20 20 73 52 65 77 72 69  *ppSub;.  sRewri
5e10: 74 65 2e 70 57 69 6e 20 3d 20 70 57 69 6e 3b 0a  te.pWin = pWin;.
5e20: 20 20 73 52 65 77 72 69 74 65 2e 70 53 72 63 20    sRewrite.pSrc 
5e30: 3d 20 70 53 72 63 3b 0a 0a 20 20 73 57 61 6c 6b  = pSrc;..  sWalk
5e40: 65 72 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  er.pParse = pPar
5e50: 73 65 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 78 45  se;.  sWalker.xE
5e60: 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65  xprCallback = se
5e70: 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74  lectWindowRewrit
5e80: 65 45 78 70 72 43 62 3b 0a 20 20 73 57 61 6c 6b  eExprCb;.  sWalk
5e90: 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61  er.xSelectCallba
5ea0: 63 6b 20 3d 20 73 65 6c 65 63 74 57 69 6e 64 6f  ck = selectWindo
5eb0: 77 52 65 77 72 69 74 65 53 65 6c 65 63 74 43 62  wRewriteSelectCb
5ec0: 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 75 2e 70 52  ;.  sWalker.u.pR
5ed0: 65 77 72 69 74 65 20 3d 20 26 73 52 65 77 72 69  ewrite = &sRewri
5ee0: 74 65 3b 0a 0a 20 20 28 76 6f 69 64 29 73 71 6c  te;..  (void)sql
5ef0: 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74  ite3WalkExprList
5f00: 28 26 73 57 61 6c 6b 65 72 2c 20 70 45 4c 69 73  (&sWalker, pELis
5f10: 74 29 3b 0a 0a 20 20 2a 70 70 53 75 62 20 3d 20  t);..  *ppSub = 
5f20: 73 52 65 77 72 69 74 65 2e 70 53 75 62 3b 0a 7d  sRewrite.pSub;.}
5f30: 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
5f40: 20 63 6f 70 79 20 6f 66 20 65 61 63 68 20 65 78   copy of each ex
5f50: 70 72 65 73 73 69 6f 6e 20 69 6e 20 65 78 70 72  pression in expr
5f60: 65 73 73 69 6f 6e 2d 6c 69 73 74 20 70 41 70 70  ession-list pApp
5f70: 65 6e 64 20 74 6f 0a 2a 2a 20 65 78 70 72 65 73  end to.** expres
5f80: 73 69 6f 6e 20 6c 69 73 74 20 70 4c 69 73 74 2e  sion list pList.
5f90: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
5fa0: 72 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20  r to the result 
5fb0: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
5fc0: 45 78 70 72 4c 69 73 74 20 2a 65 78 70 72 4c 69  ExprList *exprLi
5fd0: 73 74 41 70 70 65 6e 64 4c 69 73 74 28 0a 20 20  stAppendList(.  
5fe0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
5ff0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
6000: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
6010: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
6020: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
6030: 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70 65  to which to appe
6040: 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  nd. Might be NUL
6050: 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
6060: 2a 70 41 70 70 65 6e 64 20 20 20 20 20 20 20 2f  *pAppend       /
6070: 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73  * List of values
6080: 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68   to append. Migh
6090: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  t be NULL */.){.
60a0: 20 20 69 66 28 20 70 41 70 70 65 6e 64 20 29 7b    if( pAppend ){
60b0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
60c0: 69 6e 74 20 6e 49 6e 69 74 20 3d 20 70 4c 69 73  int nInit = pLis
60d0: 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  t ? pList->nExpr
60e0: 20 3a 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   : 0;.    for(i=
60f0: 30 3b 20 69 3c 70 41 70 70 65 6e 64 2d 3e 6e 45  0; i<pAppend->nE
6100: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
6110: 20 45 78 70 72 20 2a 70 44 75 70 20 3d 20 73 71   Expr *pDup = sq
6120: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61  lite3ExprDup(pPa
6130: 72 73 65 2d 3e 64 62 2c 20 70 41 70 70 65 6e 64  rse->db, pAppend
6140: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 30 29  ->a[i].pExpr, 0)
6150: 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20  ;.      pList = 
6160: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
6170: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4c  ppend(pParse, pL
6180: 69 73 74 2c 20 70 44 75 70 29 3b 0a 20 20 20 20  ist, pDup);.    
6190: 20 20 69 66 28 20 70 4c 69 73 74 20 29 20 70 4c    if( pList ) pL
61a0: 69 73 74 2d 3e 61 5b 6e 49 6e 69 74 2b 69 5d 2e  ist->a[nInit+i].
61b0: 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 41 70 70  sortOrder = pApp
61c0: 65 6e 64 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  end->a[i].sortOr
61d0: 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  der;.    }.  }. 
61e0: 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d   return pList;.}
61f0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53  ../*.** If the S
6200: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
6210: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
6220: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 64 6f  cond argument do
6230: 65 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 0a 2a 2a  es not invoke.**
6240: 20 61 6e 79 20 53 51 4c 20 77 69 6e 64 6f 77 20   any SQL window 
6250: 66 75 6e 63 74 69 6f 6e 73 2c 20 74 68 69 73 20  functions, this 
6260: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
6270: 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  -op. Otherwise, 
6280: 69 74 20 0a 2a 2a 20 72 65 77 72 69 74 65 73 20  it .** rewrites 
6290: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
62a0: 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77 69 6e  ment so that win
62b0: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 78 53 74  dow function xSt
62c0: 65 70 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20  ep functions.** 
62d0: 61 72 65 20 69 6e 76 6f 6b 65 64 20 69 6e 20 74  are invoked in t
62e0: 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72  he correct order
62f0: 20 61 73 20 64 65 73 63 72 69 62 65 64 20 75 6e   as described un
6300: 64 65 72 20 22 53 45 4c 45 43 54 20 52 45 57 52  der "SELECT REWR
6310: 49 54 49 4e 47 22 0a 2a 2a 20 61 74 20 74 68 65  ITING".** at the
6320: 20 74 6f 70 20 6f 66 20 74 68 69 73 20 66 69 6c   top of this fil
6330: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
6340: 33 57 69 6e 64 6f 77 52 65 77 72 69 74 65 28 50  3WindowRewrite(P
6350: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
6360: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20  lect *p){.  int 
6370: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
6380: 20 20 69 66 28 20 70 2d 3e 70 57 69 6e 20 26 26    if( p->pWin &&
6390: 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b   p->pPrior==0 ){
63a0: 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73  .    Vdbe *v = s
63b0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
63c0: 61 72 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  arse);.    sqlit
63d0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
63e0: 3e 64 62 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  >db;.    Select 
63f0: 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20  *pSub = 0;      
6400: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75         /* The su
6410: 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 53 72  bquery */.    Sr
6420: 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d  cList *pSrc = p-
6430: 3e 70 53 72 63 3b 0a 20 20 20 20 45 78 70 72 20  >pSrc;.    Expr 
6440: 2a 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68  *pWhere = p->pWh
6450: 65 72 65 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  ere;.    ExprLis
6460: 74 20 2a 70 47 72 6f 75 70 42 79 20 3d 20 70 2d  t *pGroupBy = p-
6470: 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 45  >pGroupBy;.    E
6480: 78 70 72 20 2a 70 48 61 76 69 6e 67 20 3d 20 70  xpr *pHaving = p
6490: 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 20 20 45  ->pHaving;.    E
64a0: 78 70 72 4c 69 73 74 20 2a 70 53 6f 72 74 20 3d  xprList *pSort =
64b0: 20 30 3b 0a 0a 20 20 20 20 45 78 70 72 4c 69 73   0;..    ExprLis
64c0: 74 20 2a 70 53 75 62 6c 69 73 74 20 3d 20 30 3b  t *pSublist = 0;
64d0: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
64e0: 73 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20 73 75  sion list for su
64f0: 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 57  b-query */.    W
6500: 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70  indow *pMWin = p
6510: 2d 3e 70 57 69 6e 3b 20 20 20 20 20 20 2f 2a 20  ->pWin;      /* 
6520: 4d 61 73 74 65 72 20 77 69 6e 64 6f 77 20 6f 62  Master window ob
6530: 6a 65 63 74 20 2a 2f 0a 20 20 20 20 57 69 6e 64  ject */.    Wind
6540: 6f 77 20 2a 70 57 69 6e 3b 20 20 20 20 20 20 20  ow *pWin;       
6550: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6e            /* Win
6560: 64 6f 77 20 6f 62 6a 65 63 74 20 69 74 65 72 61  dow object itera
6570: 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 70 2d 3e 70  tor */..    p->p
6580: 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  Src = 0;.    p->
6590: 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 20 20  pWhere = 0;.    
65a0: 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 30 3b  p->pGroupBy = 0;
65b0: 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20  .    p->pHaving 
65c0: 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65  = 0;..    /* Cre
65d0: 61 74 65 20 74 68 65 20 4f 52 44 45 52 20 42 59  ate the ORDER BY
65e0: 20 63 6c 61 75 73 65 20 66 6f 72 20 74 68 65 20   clause for the 
65f0: 73 75 62 2d 73 65 6c 65 63 74 2e 20 54 68 69 73  sub-select. This
6600: 20 69 73 20 74 68 65 20 63 6f 6e 63 61 74 65 6e   is the concaten
6610: 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6f 66 20  ation.    ** of 
6620: 74 68 65 20 77 69 6e 64 6f 77 20 50 41 52 54 49  the window PARTI
6630: 54 49 4f 4e 20 61 6e 64 20 4f 52 44 45 52 20 42  TION and ORDER B
6640: 59 20 63 6c 61 75 73 65 73 2e 20 54 68 65 6e 2c  Y clauses. Then,
6650: 20 69 66 20 74 68 69 73 20 6d 61 6b 65 73 20 69   if this makes i
6660: 74 0a 20 20 20 20 2a 2a 20 72 65 64 75 6e 64 61  t.    ** redunda
6670: 6e 74 2c 20 72 65 6d 6f 76 65 20 74 68 65 20 4f  nt, remove the O
6680: 52 44 45 52 20 42 59 20 66 72 6f 6d 20 74 68 65  RDER BY from the
6690: 20 70 61 72 65 6e 74 20 53 45 4c 45 43 54 2e 20   parent SELECT. 
66a0: 20 2a 2f 0a 20 20 20 20 70 53 6f 72 74 20 3d 20   */.    pSort = 
66b0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
66c0: 75 70 28 64 62 2c 20 70 4d 57 69 6e 2d 3e 70 50  up(db, pMWin->pP
66d0: 61 72 74 69 74 69 6f 6e 2c 20 30 29 3b 0a 20 20  artition, 0);.  
66e0: 20 20 70 53 6f 72 74 20 3d 20 65 78 70 72 4c 69    pSort = exprLi
66f0: 73 74 41 70 70 65 6e 64 4c 69 73 74 28 70 50 61  stAppendList(pPa
6700: 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 4d 57 69  rse, pSort, pMWi
6710: 6e 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  n->pOrderBy);.  
6720: 20 20 69 66 28 20 70 53 6f 72 74 20 26 26 20 70    if( pSort && p
6730: 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
6740: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
6750: 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70  xprListCompare(p
6760: 53 6f 72 74 2c 20 70 2d 3e 70 4f 72 64 65 72 42  Sort, p->pOrderB
6770: 79 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20  y, -1)==0 ){.   
6780: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
6790: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
67a0: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
67b0: 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79       p->pOrderBy
67c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
67d0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 73 73 69    }..    /* Assi
67e0: 67 6e 20 61 20 63 75 72 73 6f 72 20 6e 75 6d 62  gn a cursor numb
67f0: 65 72 20 66 6f 72 20 74 68 65 20 65 70 68 65 6d  er for the ephem
6800: 65 72 61 6c 20 74 61 62 6c 65 20 75 73 65 64 20  eral table used 
6810: 74 6f 20 62 75 66 66 65 72 20 72 6f 77 73 2e 0a  to buffer rows..
6820: 20 20 20 20 2a 2a 20 54 68 65 20 4f 70 65 6e 45      ** The OpenE
6830: 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63  phemeral instruc
6840: 74 69 6f 6e 20 69 73 20 63 6f 64 65 64 20 6c 61  tion is coded la
6850: 74 65 72 2c 20 61 66 74 65 72 20 69 74 20 69 73  ter, after it is
6860: 20 6b 6e 6f 77 6e 20 68 6f 77 0a 20 20 20 20 2a   known how.    *
6870: 2a 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 74  * many columns t
6880: 68 65 20 74 61 62 6c 65 20 77 69 6c 6c 20 68 61  he table will ha
6890: 76 65 2e 20 20 2a 2f 0a 20 20 20 20 70 4d 57 69  ve.  */.    pMWi
68a0: 6e 2d 3e 69 45 70 68 43 73 72 20 3d 20 70 50 61  n->iEphCsr = pPa
68b0: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
68c0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 2b 3d   pParse->nTab +=
68d0: 20 33 3b 0a 0a 20 20 20 20 73 65 6c 65 63 74 57   3;..    selectW
68e0: 69 6e 64 6f 77 52 65 77 72 69 74 65 45 4c 69 73  indowRewriteELis
68f0: 74 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c  t(pParse, pMWin,
6900: 20 70 53 72 63 2c 20 70 2d 3e 70 45 4c 69 73 74   pSrc, p->pEList
6910: 2c 20 26 70 53 75 62 6c 69 73 74 29 3b 0a 20 20  , &pSublist);.  
6920: 20 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65    selectWindowRe
6930: 77 72 69 74 65 45 4c 69 73 74 28 70 50 61 72 73  writeEList(pPars
6940: 65 2c 20 70 4d 57 69 6e 2c 20 70 53 72 63 2c 20  e, pMWin, pSrc, 
6950: 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 26 70 53  p->pOrderBy, &pS
6960: 75 62 6c 69 73 74 29 3b 0a 20 20 20 20 70 4d 57  ublist);.    pMW
6970: 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 20 3d  in->nBufferCol =
6980: 20 28 70 53 75 62 6c 69 73 74 20 3f 20 70 53 75   (pSublist ? pSu
6990: 62 6c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  blist->nExpr : 0
69a0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e  );..    /* Appen
69b0: 64 20 74 68 65 20 50 41 52 54 49 54 49 4f 4e 20  d the PARTITION 
69c0: 42 59 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20  BY and ORDER BY 
69d0: 65 78 70 72 65 73 73 69 6f 6e 73 20 74 6f 20 74  expressions to t
69e0: 68 65 20 74 6f 20 74 68 65 20 0a 20 20 20 20 2a  he to the .    *
69f0: 2a 20 73 75 62 2d 73 65 6c 65 63 74 20 65 78 70  * sub-select exp
6a00: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 54 68  ression list. Th
6a10: 65 79 20 61 72 65 20 72 65 71 75 69 72 65 64 20  ey are required 
6a20: 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20 77 68  to figure out wh
6a30: 65 72 65 20 0a 20 20 20 20 2a 2a 20 62 6f 75 6e  ere .    ** boun
6a40: 64 61 72 69 65 73 20 66 6f 72 20 70 61 72 74 69  daries for parti
6a50: 74 69 6f 6e 73 20 61 6e 64 20 73 65 74 73 20 6f  tions and sets o
6a60: 66 20 70 65 65 72 20 72 6f 77 73 20 6c 69 65 2e  f peer rows lie.
6a70: 20 20 2a 2f 0a 20 20 20 20 70 53 75 62 6c 69 73    */.    pSublis
6a80: 74 20 3d 20 65 78 70 72 4c 69 73 74 41 70 70 65  t = exprListAppe
6a90: 6e 64 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  ndList(pParse, p
6aa0: 53 75 62 6c 69 73 74 2c 20 70 4d 57 69 6e 2d 3e  Sublist, pMWin->
6ab0: 70 50 61 72 74 69 74 69 6f 6e 29 3b 0a 20 20 20  pPartition);.   
6ac0: 20 70 53 75 62 6c 69 73 74 20 3d 20 65 78 70 72   pSublist = expr
6ad0: 4c 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28 70  ListAppendList(p
6ae0: 50 61 72 73 65 2c 20 70 53 75 62 6c 69 73 74 2c  Parse, pSublist,
6af0: 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79   pMWin->pOrderBy
6b00: 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e  );..    /* Appen
6b10: 64 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20  d the arguments 
6b20: 70 61 73 73 65 64 20 74 6f 20 65 61 63 68 20 77  passed to each w
6b30: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 74  indow function t
6b40: 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 75 62  o the.    ** sub
6b50: 2d 73 65 6c 65 63 74 20 65 78 70 72 65 73 73 69  -select expressi
6b60: 6f 6e 20 6c 69 73 74 2e 20 41 6c 73 6f 20 61 6c  on list. Also al
6b70: 6c 6f 63 61 74 65 20 74 77 6f 20 72 65 67 69 73  locate two regis
6b80: 74 65 72 73 20 66 6f 72 20 65 61 63 68 0a 20 20  ters for each.  
6b90: 20 20 2a 2a 20 77 69 6e 64 6f 77 20 66 75 6e 63    ** window func
6ba0: 74 69 6f 6e 20 2d 20 6f 6e 65 20 66 6f 72 20 74  tion - one for t
6bb0: 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2c 20  he accumulator, 
6bc0: 61 6e 6f 74 68 65 72 20 66 6f 72 20 69 6e 74 65  another for inte
6bd0: 72 69 6d 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c  rim.    ** resul
6be0: 74 73 2e 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  ts.  */.    for(
6bf0: 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e  pWin=pMWin; pWin
6c00: 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65  ; pWin=pWin->pNe
6c10: 78 74 57 69 6e 29 7b 0a 20 20 20 20 20 20 70 57  xtWin){.      pW
6c20: 69 6e 2d 3e 69 41 72 67 43 6f 6c 20 3d 20 28 70  in->iArgCol = (p
6c30: 53 75 62 6c 69 73 74 20 3f 20 70 53 75 62 6c 69  Sublist ? pSubli
6c40: 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a  st->nExpr : 0);.
6c50: 20 20 20 20 20 20 70 53 75 62 6c 69 73 74 20 3d        pSublist =
6c60: 20 65 78 70 72 4c 69 73 74 41 70 70 65 6e 64 4c   exprListAppendL
6c70: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 75 62  ist(pParse, pSub
6c80: 6c 69 73 74 2c 20 70 57 69 6e 2d 3e 70 4f 77 6e  list, pWin->pOwn
6c90: 65 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  er->x.pList);.  
6ca0: 20 20 20 20 69 66 28 20 70 57 69 6e 2d 3e 70 46      if( pWin->pF
6cb0: 69 6c 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20  ilter ){.       
6cc0: 20 45 78 70 72 20 2a 70 46 69 6c 74 65 72 20 3d   Expr *pFilter =
6cd0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
6ce0: 64 62 2c 20 70 57 69 6e 2d 3e 70 46 69 6c 74 65  db, pWin->pFilte
6cf0: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  r, 0);.        p
6d00: 53 75 62 6c 69 73 74 20 3d 20 73 71 6c 69 74 65  Sublist = sqlite
6d10: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
6d20: 70 50 61 72 73 65 2c 20 70 53 75 62 6c 69 73 74  pParse, pSublist
6d30: 2c 20 70 46 69 6c 74 65 72 29 3b 0a 20 20 20 20  , pFilter);.    
6d40: 20 20 7d 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e    }.      pWin->
6d50: 72 65 67 41 63 63 75 6d 20 3d 20 2b 2b 70 50 61  regAccum = ++pPa
6d60: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
6d70: 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74   pWin->regResult
6d80: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
6d90: 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
6da0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6db0: 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e  _Null, 0, pWin->
6dc0: 72 65 67 41 63 63 75 6d 29 3b 0a 20 20 20 20 7d  regAccum);.    }
6dd0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
6de0: 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59  e is no ORDER BY
6df0: 20 6f 72 20 50 41 52 54 49 54 49 4f 4e 20 42 59   or PARTITION BY
6e00: 20 63 6c 61 75 73 65 2c 20 61 6e 64 20 74 68 65   clause, and the
6e10: 20 77 69 6e 64 6f 77 0a 20 20 20 20 2a 2a 20 66   window.    ** f
6e20: 75 6e 63 74 69 6f 6e 20 61 63 63 65 70 74 73 20  unction accepts 
6e30: 7a 65 72 6f 20 61 72 67 75 6d 65 6e 74 73 2c 20  zero arguments, 
6e40: 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f  and there are no
6e50: 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 73 0a 20   other columns. 
6e60: 20 20 20 2a 2a 20 73 65 6c 65 63 74 65 64 20 28     ** selected (
6e70: 65 2e 67 2e 20 22 53 45 4c 45 43 54 20 72 6f 77  e.g. "SELECT row
6e80: 5f 6e 75 6d 62 65 72 28 29 20 4f 56 45 52 20 28  _number() OVER (
6e90: 29 20 46 52 4f 4d 20 74 31 22 29 2c 20 69 74 20  ) FROM t1"), it 
6ea0: 69 73 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20  is possible.    
6eb0: 2a 2a 20 74 68 61 74 20 70 53 75 62 6c 69 73 74  ** that pSublist
6ec0: 20 69 73 20 73 74 69 6c 6c 20 4e 55 4c 4c 20 68   is still NULL h
6ed0: 65 72 65 2e 20 41 64 64 20 61 20 63 6f 6e 73 74  ere. Add a const
6ee0: 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 68  ant expression h
6ef0: 65 72 65 20 74 6f 20 0a 20 20 20 20 2a 2a 20 6b  ere to .    ** k
6f00: 65 65 70 20 65 76 65 72 79 74 68 69 6e 67 20 6c  eep everything l
6f10: 65 67 61 6c 20 69 6e 20 74 68 69 73 20 63 61 73  egal in this cas
6f20: 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  e. .    */.    i
6f30: 66 28 20 70 53 75 62 6c 69 73 74 3d 3d 30 20 29  f( pSublist==0 )
6f40: 7b 0a 20 20 20 20 20 20 70 53 75 62 6c 69 73 74  {.      pSublist
6f50: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
6f60: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
6f70: 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73   0, .          s
6f80: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
6f90: 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20  db, TK_INTEGER, 
6fa0: 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e  &sqlite3IntToken
6fb0: 73 5b 30 5d 2c 20 30 29 0a 20 20 20 20 20 20 29  s[0], 0).      )
6fc0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 53 75  ;.    }..    pSu
6fd0: 62 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  b = sqlite3Selec
6fe0: 74 4e 65 77 28 0a 20 20 20 20 20 20 20 20 70 50  tNew(.        pP
6ff0: 61 72 73 65 2c 20 70 53 75 62 6c 69 73 74 2c 20  arse, pSublist, 
7000: 70 53 72 63 2c 20 70 57 68 65 72 65 2c 20 70 47  pSrc, pWhere, pG
7010: 72 6f 75 70 42 79 2c 20 70 48 61 76 69 6e 67 2c  roupBy, pHaving,
7020: 20 70 53 6f 72 74 2c 20 30 2c 20 30 0a 20 20 20   pSort, 0, 0.   
7030: 20 29 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20   );.    p->pSrc 
7040: 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
7050: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
7060: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
7070: 20 70 2d 3e 70 53 72 63 20 29 7b 0a 20 20 20 20   p->pSrc ){.    
7080: 20 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e    p->pSrc->a[0].
7090: 70 53 65 6c 65 63 74 20 3d 20 70 53 75 62 3b 0a  pSelect = pSub;.
70a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
70b0: 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
70c0: 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 53 72  s(pParse, p->pSr
70d0: 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  c);.      if( sq
70e0: 6c 69 74 65 33 45 78 70 61 6e 64 53 75 62 71 75  lite3ExpandSubqu
70f0: 65 72 79 28 70 50 61 72 73 65 2c 20 26 70 2d 3e  ery(pParse, &p->
7100: 70 53 72 63 2d 3e 61 5b 30 5d 29 20 29 7b 0a 20  pSrc->a[0]) ){. 
7110: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
7120: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
7130: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
7140: 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  Sub->selFlags |=
7150: 20 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20   SF_Expanded;.  
7160: 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67        p->selFlag
7170: 73 20 26 3d 20 7e 53 46 5f 41 67 67 72 65 67 61  s &= ~SF_Aggrega
7180: 74 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  te;.        sqli
7190: 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50  te3SelectPrep(pP
71a0: 61 72 73 65 2c 20 70 53 75 62 2c 20 30 29 3b 0a  arse, pSub, 0);.
71b0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73        }..      s
71c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
71d0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
71e0: 65 72 61 6c 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  eral, pMWin->iEp
71f0: 68 43 73 72 2c 20 70 53 75 62 6c 69 73 74 2d 3e  hCsr, pSublist->
7200: 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71  nExpr);.      sq
7210: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7220: 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70  v, OP_OpenDup, p
7230: 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2b 31 2c  MWin->iEphCsr+1,
7240: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29   pMWin->iEphCsr)
7250: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
7260: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7270: 4f 70 65 6e 44 75 70 2c 20 70 4d 57 69 6e 2d 3e  OpenDup, pMWin->
7280: 69 45 70 68 43 73 72 2b 32 2c 20 70 4d 57 69 6e  iEphCsr+2, pMWin
7290: 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 20 20  ->iEphCsr);.    
72a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
72b0: 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75  Op2(v, OP_OpenDu
72c0: 70 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  p, pMWin->iEphCs
72d0: 72 2b 33 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  r+3, pMWin->iEph
72e0: 43 73 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Csr);.    }else{
72f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
7300: 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
7310: 53 75 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sub);.    }.    
7320: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
7330: 69 6c 65 64 20 29 20 72 63 20 3d 20 53 51 4c 49  iled ) rc = SQLI
7340: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
7350: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
7360: 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 57 69  *.** Free the Wi
7370: 6e 64 6f 77 20 6f 62 6a 65 63 74 20 70 61 73 73  ndow object pass
7380: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
7390: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f   argument..*/.vo
73a0: 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  id sqlite3Window
73b0: 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
73c0: 64 62 2c 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a  db, Window *p){.
73d0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73    if( p ){.    s
73e0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
73f0: 28 64 62 2c 20 70 2d 3e 70 46 69 6c 74 65 72 29  (db, p->pFilter)
7400: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
7410: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
7420: 70 2d 3e 70 50 61 72 74 69 74 69 6f 6e 29 3b 0a  p->pPartition);.
7430: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
7440: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
7450: 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
7460: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
7470: 65 28 64 62 2c 20 70 2d 3e 70 45 6e 64 29 3b 0a  e(db, p->pEnd);.
7480: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
7490: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 53 74  elete(db, p->pSt
74a0: 61 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  art);.    sqlite
74b0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
74c0: 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
74d0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
74e0: 7a 42 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69  zBase);.    sqli
74f0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
7500: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ;.  }.}../*.** F
7510: 72 65 65 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c  ree the linked l
7520: 69 73 74 20 6f 66 20 57 69 6e 64 6f 77 20 6f 62  ist of Window ob
7530: 6a 65 63 74 73 20 73 74 61 72 74 69 6e 67 20 61  jects starting a
7540: 74 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  t the second arg
7550: 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ument..*/.void s
7560: 71 6c 69 74 65 33 57 69 6e 64 6f 77 4c 69 73 74  qlite3WindowList
7570: 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
7580: 64 62 2c 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a  db, Window *p){.
7590: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
75a0: 20 20 57 69 6e 64 6f 77 20 2a 70 4e 65 78 74 20    Window *pNext 
75b0: 3d 20 70 2d 3e 70 4e 65 78 74 57 69 6e 3b 0a 20  = p->pNextWin;. 
75c0: 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77     sqlite3Window
75d0: 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20  Delete(db, p);. 
75e0: 20 20 20 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20     p = pNext;.  
75f0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  }.}../*.** The a
7600: 72 67 75 6d 65 6e 74 20 65 78 70 72 65 73 73 69  rgument expressi
7610: 6f 6e 20 69 73 20 61 6e 20 50 52 45 43 45 44 49  on is an PRECEDI
7620: 4e 47 20 6f 72 20 46 4f 4c 4c 4f 57 49 4e 47 20  NG or FOLLOWING 
7630: 6f 66 66 73 65 74 2e 20 20 54 68 65 0a 2a 2a 20  offset.  The.** 
7640: 76 61 6c 75 65 20 73 68 6f 75 6c 64 20 62 65 20  value should be 
7650: 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69  a non-negative i
7660: 6e 74 65 67 65 72 2e 20 20 49 66 20 74 68 65 20  nteger.  If the 
7670: 76 61 6c 75 65 20 69 73 20 6e 6f 74 20 61 0a 2a  value is not a.*
7680: 2a 20 63 6f 6e 73 74 61 6e 74 2c 20 63 68 61 6e  * constant, chan
7690: 67 65 20 69 74 20 74 6f 20 4e 55 4c 4c 2e 20 20  ge it to NULL.  
76a0: 54 68 65 20 66 61 63 74 20 74 68 61 74 20 69 74  The fact that it
76b0: 20 69 73 20 74 68 65 6e 20 61 20 6e 6f 6e 2d 6e   is then a non-n
76c0: 65 67 61 74 69 76 65 0a 2a 2a 20 69 6e 74 65 67  egative.** integ
76d0: 65 72 20 77 69 6c 6c 20 62 65 20 63 61 75 67 68  er will be caugh
76e0: 74 20 6c 61 74 65 72 2e 20 20 42 75 74 20 69 74  t later.  But it
76f0: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 6e 6f   is important no
7700: 74 20 74 6f 20 6c 65 61 76 65 0a 2a 2a 20 76 61  t to leave.** va
7710: 72 69 61 62 6c 65 20 76 61 6c 75 65 73 20 69 6e  riable values in
7720: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
7730: 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
7740: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 57 69 6e  Expr *sqlite3Win
7750: 64 6f 77 4f 66 66 73 65 74 45 78 70 72 28 50 61  dowOffsetExpr(Pa
7760: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
7770: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 66 28  r *pExpr){.  if(
7780: 20 30 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49   0==sqlite3ExprI
7790: 73 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72 29  sConstant(pExpr)
77a0: 20 29 7b 0a 20 20 20 20 69 66 28 20 49 4e 5f 52   ){.    if( IN_R
77b0: 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 20 73  ENAME_OBJECT ) s
77c0: 71 6c 69 74 65 33 52 65 6e 61 6d 65 45 78 70 72  qlite3RenameExpr
77d0: 55 6e 6d 61 70 28 70 50 61 72 73 65 2c 20 70 45  Unmap(pParse, pE
77e0: 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  xpr);.    sqlite
77f0: 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
7800: 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 29 3b 0a  se->db, pExpr);.
7810: 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69      pExpr = sqli
7820: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61  te3ExprAlloc(pPa
7830: 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 4e 55 4c 4c  rse->db, TK_NULL
7840: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  , 0, 0);.  }.  r
7850: 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a  eturn pExpr;.}..
7860: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
7870: 6e 64 20 72 65 74 75 72 6e 20 61 20 6e 65 77 20  nd return a new 
7880: 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 64 65  Window object de
7890: 73 63 72 69 62 69 6e 67 20 61 20 57 69 6e 64 6f  scribing a Windo
78a0: 77 20 44 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f  w Definition..*/
78b0: 0a 57 69 6e 64 6f 77 20 2a 73 71 6c 69 74 65 33  .Window *sqlite3
78c0: 57 69 6e 64 6f 77 41 6c 6c 6f 63 28 0a 20 20 50  WindowAlloc(.  P
78d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
78e0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
78f0: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79  ext */.  int eTy
7900: 70 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 46 72  pe,        /* Fr
7910: 61 6d 65 20 74 79 70 65 2e 20 54 4b 5f 52 41 4e  ame type. TK_RAN
7920: 47 45 20 6f 72 20 54 4b 5f 52 4f 57 53 20 2a 2f  GE or TK_ROWS */
7930: 0a 20 20 69 6e 74 20 65 53 74 61 72 74 2c 20 20  .  int eStart,  
7940: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 74 79       /* Start ty
7950: 70 65 3a 20 43 55 52 52 45 4e 54 2c 20 50 52 45  pe: CURRENT, PRE
7960: 43 45 44 49 4e 47 2c 20 46 4f 4c 4c 4f 57 49 4e  CEDING, FOLLOWIN
7970: 47 2c 20 55 4e 42 4f 55 4e 44 45 44 20 2a 2f 0a  G, UNBOUNDED */.
7980: 20 20 45 78 70 72 20 2a 70 53 74 61 72 74 2c 20    Expr *pStart, 
7990: 20 20 20 20 2f 2a 20 53 74 61 72 74 20 77 69 6e      /* Start win
79a0: 64 6f 77 20 73 69 7a 65 20 69 66 20 54 4b 5f 50  dow size if TK_P
79b0: 52 45 43 45 44 49 4e 47 20 6f 72 20 46 4f 4c 4c  RECEDING or FOLL
79c0: 4f 57 49 4e 47 20 2a 2f 0a 20 20 69 6e 74 20 65  OWING */.  int e
79d0: 45 6e 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  End,         /* 
79e0: 45 6e 64 20 74 79 70 65 3a 20 43 55 52 52 45 4e  End type: CURREN
79f0: 54 2c 20 46 4f 4c 4c 4f 57 49 4e 47 2c 20 54 4b  T, FOLLOWING, TK
7a00: 5f 55 4e 42 4f 55 4e 44 45 44 2c 20 50 52 45 43  _UNBOUNDED, PREC
7a10: 45 44 49 4e 47 20 2a 2f 0a 20 20 45 78 70 72 20  EDING */.  Expr 
7a20: 2a 70 45 6e 64 20 20 20 20 20 20 20 20 2f 2a 20  *pEnd        /* 
7a30: 45 6e 64 20 77 69 6e 64 6f 77 20 73 69 7a 65 20  End window size 
7a40: 69 66 20 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  if TK_FOLLOWING 
7a50: 6f 72 20 50 52 45 43 45 44 49 4e 47 20 2a 2f 0a  or PRECEDING */.
7a60: 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69  ){.  Window *pWi
7a70: 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 62 49 6d  n = 0;.  int bIm
7a80: 70 6c 69 63 69 74 46 72 61 6d 65 20 3d 20 30 3b  plicitFrame = 0;
7a90: 0a 0a 20 20 2f 2a 20 50 61 72 73 65 72 20 61 73  ..  /* Parser as
7aa0: 73 75 72 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77  sures the follow
7ab0: 69 6e 67 3a 20 2a 2f 0a 20 20 61 73 73 65 72 74  ing: */.  assert
7ac0: 28 20 65 54 79 70 65 3d 3d 30 20 7c 7c 20 65 54  ( eType==0 || eT
7ad0: 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 7c 7c  ype==TK_RANGE ||
7ae0: 20 65 54 79 70 65 3d 3d 54 4b 5f 52 4f 57 53 20   eType==TK_ROWS 
7af0: 7c 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 47 52 4f  || eType==TK_GRO
7b00: 55 50 53 20 29 3b 0a 20 20 61 73 73 65 72 74 28  UPS );.  assert(
7b10: 20 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52   eStart==TK_CURR
7b20: 45 4e 54 20 7c 7c 20 65 53 74 61 72 74 3d 3d 54  ENT || eStart==T
7b30: 4b 5f 50 52 45 43 45 44 49 4e 47 0a 20 20 20 20  K_PRECEDING.    
7b40: 20 20 20 20 20 20 20 7c 7c 20 65 53 74 61 72 74         || eStart
7b50: 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 7c  ==TK_UNBOUNDED |
7b60: 7c 20 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c  | eStart==TK_FOL
7b70: 4c 4f 57 49 4e 47 20 29 3b 0a 20 20 61 73 73 65  LOWING );.  asse
7b80: 72 74 28 20 65 45 6e 64 3d 3d 54 4b 5f 43 55 52  rt( eEnd==TK_CUR
7b90: 52 45 4e 54 20 7c 7c 20 65 45 6e 64 3d 3d 54 4b  RENT || eEnd==TK
7ba0: 5f 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20 20 20 20  _FOLLOWING.     
7bb0: 20 20 20 20 20 20 7c 7c 20 65 45 6e 64 3d 3d 54        || eEnd==T
7bc0: 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 7c 7c 20 65  K_UNBOUNDED || e
7bd0: 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e  End==TK_PRECEDIN
7be0: 47 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  G );.  assert( (
7bf0: 65 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45  eStart==TK_PRECE
7c00: 44 49 4e 47 20 7c 7c 20 65 53 74 61 72 74 3d 3d  DING || eStart==
7c10: 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 29 3d 3d 28  TK_FOLLOWING)==(
7c20: 70 53 74 61 72 74 21 3d 30 29 20 29 3b 0a 20 20  pStart!=0) );.  
7c30: 61 73 73 65 72 74 28 20 28 65 45 6e 64 3d 3d 54  assert( (eEnd==T
7c40: 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 7c 7c 20 65  K_FOLLOWING || e
7c50: 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e  End==TK_PRECEDIN
7c60: 47 29 3d 3d 28 70 45 6e 64 21 3d 30 29 20 29 3b  G)==(pEnd!=0) );
7c70: 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30  ..  if( eType==0
7c80: 20 29 7b 0a 20 20 20 20 62 49 6d 70 6c 69 63 69   ){.    bImplici
7c90: 74 46 72 61 6d 65 20 3d 20 31 3b 0a 20 20 20 20  tFrame = 1;.    
7ca0: 65 54 79 70 65 20 3d 20 54 4b 5f 52 41 4e 47 45  eType = TK_RANGE
7cb0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 69  ;.  }..  /* Addi
7cc0: 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 0a 20 20  tionally, the.  
7cd0: 2a 2a 20 73 74 61 72 74 69 6e 67 20 62 6f 75 6e  ** starting boun
7ce0: 64 61 72 79 20 74 79 70 65 20 6d 61 79 20 6e 6f  dary type may no
7cf0: 74 20 6f 63 63 75 72 20 65 61 72 6c 69 65 72 20  t occur earlier 
7d00: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
7d10: 20 6c 69 73 74 20 74 68 61 6e 0a 20 20 2a 2a 20   list than.  ** 
7d20: 74 68 65 20 65 6e 64 69 6e 67 20 62 6f 75 6e 64  the ending bound
7d30: 61 72 79 20 74 79 70 65 3a 0a 20 20 2a 2a 0a 20  ary type:.  **. 
7d40: 20 2a 2a 20 20 20 55 4e 42 4f 55 4e 44 45 44 20   **   UNBOUNDED 
7d50: 50 52 45 43 45 44 49 4e 47 0a 20 20 2a 2a 20 20  PRECEDING.  **  
7d60: 20 3c 65 78 70 72 3e 20 50 52 45 43 45 44 49 4e   <expr> PRECEDIN
7d70: 47 0a 20 20 2a 2a 20 20 20 43 55 52 52 45 4e 54  G.  **   CURRENT
7d80: 20 52 4f 57 0a 20 20 2a 2a 20 20 20 3c 65 78 70   ROW.  **   <exp
7d90: 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20 2a  r> FOLLOWING.  *
7da0: 2a 20 20 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f  *   UNBOUNDED FO
7db0: 4c 4c 4f 57 49 4e 47 0a 20 20 2a 2a 0a 20 20 2a  LLOWING.  **.  *
7dc0: 2a 20 54 68 65 20 70 61 72 73 65 72 20 65 6e 73  * The parser ens
7dd0: 75 72 65 73 20 74 68 61 74 20 22 55 4e 42 4f 55  ures that "UNBOU
7de0: 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 22 20  NDED PRECEDING" 
7df0: 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 61  cannot be used a
7e00: 73 20 61 6e 20 65 6e 64 69 6e 67 0a 20 20 2a 2a  s an ending.  **
7e10: 20 62 6f 75 6e 64 61 72 79 2c 20 61 6e 64 20 74   boundary, and t
7e20: 68 61 6e 20 22 55 4e 42 4f 55 4e 44 45 44 20 46  han "UNBOUNDED F
7e30: 4f 4c 4c 4f 57 49 4e 47 22 20 63 61 6e 6e 6f 74  OLLOWING" cannot
7e40: 20 62 65 20 75 73 65 64 20 61 73 20 61 20 73 74   be used as a st
7e50: 61 72 74 69 6e 67 0a 20 20 2a 2a 20 66 72 61 6d  arting.  ** fram
7e60: 65 20 62 6f 75 6e 64 61 72 79 2e 0a 20 20 2a 2f  e boundary..  */
7e70: 0a 20 20 69 66 28 20 28 65 53 74 61 72 74 3d 3d  .  if( (eStart==
7e80: 54 4b 5f 43 55 52 52 45 4e 54 20 26 26 20 65 45  TK_CURRENT && eE
7e90: 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47  nd==TK_PRECEDING
7ea0: 29 0a 20 20 20 7c 7c 20 28 65 53 74 61 72 74 3d  ).   || (eStart=
7eb0: 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 26 26  =TK_FOLLOWING &&
7ec0: 20 28 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45   (eEnd==TK_PRECE
7ed0: 44 49 4e 47 20 7c 7c 20 65 45 6e 64 3d 3d 54 4b  DING || eEnd==TK
7ee0: 5f 43 55 52 52 45 4e 54 29 29 0a 20 20 29 7b 0a  _CURRENT)).  ){.
7ef0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
7f00: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 73  Msg(pParse, "uns
7f10: 75 70 70 6f 72 74 65 64 20 66 72 61 6d 65 20 73  upported frame s
7f20: 70 65 63 69 66 69 63 61 74 69 6f 6e 22 29 3b 0a  pecification");.
7f30: 20 20 20 20 67 6f 74 6f 20 77 69 6e 64 6f 77 41      goto windowA
7f40: 6c 6c 6f 63 45 72 72 3b 0a 20 20 7d 0a 0a 20 20  llocErr;.  }..  
7f50: 70 57 69 6e 20 3d 20 28 57 69 6e 64 6f 77 2a 29  pWin = (Window*)
7f60: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
7f70: 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ero(pParse->db, 
7f80: 73 69 7a 65 6f 66 28 57 69 6e 64 6f 77 29 29 3b  sizeof(Window));
7f90: 0a 20 20 69 66 28 20 70 57 69 6e 3d 3d 30 20 29  .  if( pWin==0 )
7fa0: 20 67 6f 74 6f 20 77 69 6e 64 6f 77 41 6c 6c 6f   goto windowAllo
7fb0: 63 45 72 72 3b 0a 20 20 70 57 69 6e 2d 3e 65 54  cErr;.  pWin->eT
7fc0: 79 70 65 20 3d 20 65 54 79 70 65 3b 0a 20 20 70  ype = eType;.  p
7fd0: 57 69 6e 2d 3e 65 53 74 61 72 74 20 3d 20 65 53  Win->eStart = eS
7fe0: 74 61 72 74 3b 0a 20 20 70 57 69 6e 2d 3e 65 45  tart;.  pWin->eE
7ff0: 6e 64 20 3d 20 65 45 6e 64 3b 0a 20 20 70 57 69  nd = eEnd;.  pWi
8000: 6e 2d 3e 62 49 6d 70 6c 69 63 69 74 46 72 61 6d  n->bImplicitFram
8010: 65 20 3d 20 62 49 6d 70 6c 69 63 69 74 46 72 61  e = bImplicitFra
8020: 6d 65 3b 0a 20 20 70 57 69 6e 2d 3e 70 45 6e 64  me;.  pWin->pEnd
8030: 20 3d 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77   = sqlite3Window
8040: 4f 66 66 73 65 74 45 78 70 72 28 70 50 61 72 73  OffsetExpr(pPars
8050: 65 2c 20 70 45 6e 64 29 3b 0a 20 20 70 57 69 6e  e, pEnd);.  pWin
8060: 2d 3e 70 53 74 61 72 74 20 3d 20 73 71 6c 69 74  ->pStart = sqlit
8070: 65 33 57 69 6e 64 6f 77 4f 66 66 73 65 74 45 78  e3WindowOffsetEx
8080: 70 72 28 70 50 61 72 73 65 2c 20 70 53 74 61 72  pr(pParse, pStar
8090: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 69  t);.  return pWi
80a0: 6e 3b 0a 0a 77 69 6e 64 6f 77 41 6c 6c 6f 63 45  n;..windowAllocE
80b0: 72 72 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70  rr:.  sqlite3Exp
80c0: 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
80d0: 64 62 2c 20 70 45 6e 64 29 3b 0a 20 20 73 71 6c  db, pEnd);.  sql
80e0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
80f0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 74 61 72  Parse->db, pStar
8100: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  t);.  return 0;.
8110: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20  }../*.** Attach 
8120: 50 41 52 54 49 54 49 4f 4e 20 61 6e 64 20 4f 52  PARTITION and OR
8130: 44 45 52 20 42 59 20 63 6c 61 75 73 65 73 20 70  DER BY clauses p
8140: 50 61 72 74 69 74 69 6f 6e 20 61 6e 64 20 70 4f  Partition and pO
8150: 72 64 65 72 42 79 20 74 6f 20 77 69 6e 64 6f 77  rderBy to window
8160: 0a 2a 2a 20 70 57 69 6e 2e 20 41 6c 73 6f 2c 20  .** pWin. Also, 
8170: 69 66 20 70 61 72 61 6d 65 74 65 72 20 70 42 61  if parameter pBa
8180: 73 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  se is not NULL, 
8190: 73 65 74 20 70 57 69 6e 2d 3e 7a 42 61 73 65 20  set pWin->zBase 
81a0: 74 6f 20 74 68 65 0a 2a 2a 20 65 71 75 69 76 61  to the.** equiva
81b0: 6c 65 6e 74 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  lent nul-termina
81c0: 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 57  ted string..*/.W
81d0: 69 6e 64 6f 77 20 2a 73 71 6c 69 74 65 33 57 69  indow *sqlite3Wi
81e0: 6e 64 6f 77 41 73 73 65 6d 62 6c 65 28 0a 20 20  ndowAssemble(.  
81f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a  Parse *pParse, .
8200: 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 2c 20    Window *pWin, 
8210: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 50 61  .  ExprList *pPa
8220: 72 74 69 74 69 6f 6e 2c 20 0a 20 20 45 78 70 72  rtition, .  Expr
8230: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
8240: 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 61 73 65 0a  .  Token *pBase.
8250: 29 7b 0a 20 20 69 66 28 20 70 57 69 6e 20 29 7b  ){.  if( pWin ){
8260: 0a 20 20 20 20 70 57 69 6e 2d 3e 70 50 61 72 74  .    pWin->pPart
8270: 69 74 69 6f 6e 20 3d 20 70 50 61 72 74 69 74 69  ition = pPartiti
8280: 6f 6e 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70 4f  on;.    pWin->pO
8290: 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
82a0: 79 3b 0a 20 20 20 20 69 66 28 20 70 42 61 73 65  y;.    if( pBase
82b0: 20 29 7b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e   ){.      pWin->
82c0: 7a 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 44  zBase = sqlite3D
82d0: 62 53 74 72 4e 44 75 70 28 70 50 61 72 73 65 2d  bStrNDup(pParse-
82e0: 3e 64 62 2c 20 70 42 61 73 65 2d 3e 7a 2c 20 70  >db, pBase->z, p
82f0: 42 61 73 65 2d 3e 6e 29 3b 0a 20 20 20 20 7d 0a  Base->n);.    }.
8300: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
8310: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
8320: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
8330: 50 61 72 74 69 74 69 6f 6e 29 3b 0a 20 20 20 20  Partition);.    
8340: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
8350: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
8360: 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d  , pOrderBy);.  }
8370: 0a 20 20 72 65 74 75 72 6e 20 70 57 69 6e 3b 0a  .  return pWin;.
8380: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e 64 6f 77 20  }../*.** Window 
8390: 2a 70 57 69 6e 20 68 61 73 20 6a 75 73 74 20 62  *pWin has just b
83a0: 65 65 6e 20 63 72 65 61 74 65 64 20 66 72 6f 6d  een created from
83b0: 20 61 20 57 49 4e 44 4f 57 20 63 6c 61 75 73 65   a WINDOW clause
83c0: 2e 20 54 6f 6b 6e 65 20 70 42 61 73 65 0a 2a 2a  . Tokne pBase.**
83d0: 20 69 73 20 74 68 65 20 62 61 73 65 20 77 69 6e   is the base win
83e0: 64 6f 77 2e 20 45 61 72 6c 69 65 72 20 77 69 6e  dow. Earlier win
83f0: 64 6f 77 73 20 66 72 6f 6d 20 74 68 65 20 73 61  dows from the sa
8400: 6d 65 20 57 49 4e 44 4f 57 20 63 6c 61 75 73 65  me WINDOW clause
8410: 20 61 72 65 0a 2a 2a 20 73 74 6f 72 65 64 20 69   are.** stored i
8420: 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  n the linked lis
8430: 74 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 57  t starting at pW
8440: 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 2e 20 54 68  in->pNextWin. Th
8450: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 65  is function.** e
8460: 69 74 68 65 72 20 75 70 64 61 74 65 73 20 2a 70  ither updates *p
8470: 57 69 6e 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  Win according to
8480: 20 74 68 65 20 62 61 73 65 20 73 70 65 63 69 66   the base specif
8490: 69 63 61 74 69 6f 6e 2c 20 6f 72 20 65 6c 73 65  ication, or else
84a0: 0a 2a 2a 20 6c 65 61 76 65 73 20 61 6e 20 65 72  .** leaves an er
84b0: 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  ror in pParse..*
84c0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69  /.void sqlite3Wi
84d0: 6e 64 6f 77 43 68 61 69 6e 28 50 61 72 73 65 20  ndowChain(Parse 
84e0: 2a 70 50 61 72 73 65 2c 20 57 69 6e 64 6f 77 20  *pParse, Window 
84f0: 2a 70 57 69 6e 2c 20 57 69 6e 64 6f 77 20 2a 70  *pWin, Window *p
8500: 4c 69 73 74 29 7b 0a 20 20 69 66 28 20 70 57 69  List){.  if( pWi
8510: 6e 2d 3e 7a 42 61 73 65 20 29 7b 0a 20 20 20 20  n->zBase ){.    
8520: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
8530: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 57 69  arse->db;.    Wi
8540: 6e 64 6f 77 20 2a 70 45 78 69 73 74 20 3d 20 77  ndow *pExist = w
8550: 69 6e 64 6f 77 46 69 6e 64 28 70 50 61 72 73 65  indowFind(pParse
8560: 2c 20 70 4c 69 73 74 2c 20 70 57 69 6e 2d 3e 7a  , pList, pWin->z
8570: 42 61 73 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Base);.    if( p
8580: 45 78 69 73 74 20 29 7b 0a 20 20 20 20 20 20 63  Exist ){.      c
8590: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20  onst char *zErr 
85a0: 3d 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68  = 0;.      /* Ch
85b0: 65 63 6b 20 66 6f 72 20 65 72 72 6f 72 73 20 2a  eck for errors *
85c0: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 57 69 6e  /.      if( pWin
85d0: 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 29 7b 0a  ->pPartition ){.
85e0: 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 22          zErr = "
85f0: 50 41 52 54 49 54 49 4f 4e 20 63 6c 61 75 73 65  PARTITION clause
8600: 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ";.      }else i
8610: 66 28 20 70 45 78 69 73 74 2d 3e 70 4f 72 64 65  f( pExist->pOrde
8620: 72 42 79 20 26 26 20 70 57 69 6e 2d 3e 70 4f 72  rBy && pWin->pOr
8630: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
8640: 20 7a 45 72 72 20 3d 20 22 4f 52 44 45 52 20 42   zErr = "ORDER B
8650: 59 20 63 6c 61 75 73 65 22 3b 0a 20 20 20 20 20  Y clause";.     
8660: 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 69 73   }else if( pExis
8670: 74 2d 3e 62 49 6d 70 6c 69 63 69 74 46 72 61 6d  t->bImplicitFram
8680: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
8690: 7a 45 72 72 20 3d 20 22 66 72 61 6d 65 20 73 70  zErr = "frame sp
86a0: 65 63 69 66 69 63 61 74 69 6f 6e 22 3b 0a 20 20  ecification";.  
86b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
86c0: 7a 45 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20  zErr ){.        
86d0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
86e0: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
86f0: 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 6f 76 65       "cannot ove
8700: 72 72 69 64 65 20 25 73 20 6f 66 20 77 69 6e 64  rride %s of wind
8710: 6f 77 3a 20 25 73 22 2c 20 7a 45 72 72 2c 20 70  ow: %s", zErr, p
8720: 57 69 6e 2d 3e 7a 42 61 73 65 0a 20 20 20 20 20  Win->zBase.     
8730: 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73     );.      }els
8740: 65 7b 0a 20 20 20 20 20 20 20 20 70 57 69 6e 2d  e{.        pWin-
8750: 3e 70 50 61 72 74 69 74 69 6f 6e 20 3d 20 73 71  >pPartition = sq
8760: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
8770: 28 64 62 2c 20 70 45 78 69 73 74 2d 3e 70 50 61  (db, pExist->pPa
8780: 72 74 69 74 69 6f 6e 2c 20 30 29 3b 0a 20 20 20  rtition, 0);.   
8790: 20 20 20 20 20 69 66 28 20 70 45 78 69 73 74 2d       if( pExist-
87a0: 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
87b0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
87c0: 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  Win->pOrderBy==0
87d0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 57   );.          pW
87e0: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73  in->pOrderBy = s
87f0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
8800: 70 28 64 62 2c 20 70 45 78 69 73 74 2d 3e 70 4f  p(db, pExist->pO
8810: 72 64 65 72 42 79 2c 20 30 29 3b 0a 20 20 20 20  rderBy, 0);.    
8820: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
8830: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
8840: 70 57 69 6e 2d 3e 7a 42 61 73 65 29 3b 0a 20 20  pWin->zBase);.  
8850: 20 20 20 20 20 20 70 57 69 6e 2d 3e 7a 42 61 73        pWin->zBas
8860: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
8870: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
8880: 2a 20 41 74 74 61 63 68 20 77 69 6e 64 6f 77 20  * Attach window 
8890: 6f 62 6a 65 63 74 20 70 57 69 6e 20 74 6f 20 65  object pWin to e
88a0: 78 70 72 65 73 73 69 6f 6e 20 70 2e 0a 2a 2f 0a  xpression p..*/.
88b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64  void sqlite3Wind
88c0: 6f 77 41 74 74 61 63 68 28 50 61 72 73 65 20 2a  owAttach(Parse *
88d0: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 2c  pParse, Expr *p,
88e0: 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 29 7b 0a   Window *pWin){.
88f0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61    if( p ){.    a
8900: 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b  ssert( p->op==TK
8910: 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20  _FUNCTION );.   
8920: 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
8930: 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
8940: 66 6f 72 20 74 68 65 20 70 61 72 73 65 72 2e 20  for the parser. 
8950: 20 49 66 20 70 57 69 6e 20 77 61 73 20 6e 6f 74   If pWin was not
8960: 0a 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  .    ** allocate
8970: 64 20 64 75 65 20 74 6f 20 61 6e 20 4f 4f 4d 2c  d due to an OOM,
8980: 20 74 68 65 6e 20 74 68 65 20 70 61 72 73 65 72   then the parser
8990: 20 77 6f 75 6c 64 20 66 61 69 6c 20 62 65 66 6f   would fail befo
89a0: 72 65 20 65 76 65 72 0a 20 20 20 20 2a 2a 20 69  re ever.    ** i
89b0: 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75  nvoking this rou
89c0: 74 69 6e 65 20 2a 2f 0a 20 20 20 20 69 66 28 20  tine */.    if( 
89d0: 41 4c 57 41 59 53 28 70 57 69 6e 29 20 29 7b 0a  ALWAYS(pWin) ){.
89e0: 20 20 20 20 20 20 70 2d 3e 79 2e 70 57 69 6e 20        p->y.pWin 
89f0: 3d 20 70 57 69 6e 3b 0a 20 20 20 20 20 20 45 78  = pWin;.      Ex
8a00: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c  prSetProperty(p,
8a10: 20 45 50 5f 57 69 6e 46 75 6e 63 29 3b 0a 20 20   EP_WinFunc);.  
8a20: 20 20 20 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72      pWin->pOwner
8a30: 20 3d 20 70 3b 0a 20 20 20 20 20 20 69 66 28 20   = p;.      if( 
8a40: 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69  p->flags & EP_Di
8a50: 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20  stinct ){.      
8a60: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
8a70: 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
8a80: 20 20 20 20 20 22 44 49 53 54 49 4e 43 54 20 69       "DISTINCT i
8a90: 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20  s not supported 
8aa0: 66 6f 72 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  for window funct
8ab0: 69 6f 6e 73 22 29 3b 0a 20 20 20 20 20 20 7d 0a  ions");.      }.
8ac0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
8ad0: 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77     sqlite3Window
8ae0: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
8af0: 62 2c 20 70 57 69 6e 29 3b 0a 20 20 7d 0a 7d 0a  b, pWin);.  }.}.
8b00: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  ./*.** Return 0 
8b10: 69 66 20 74 68 65 20 74 77 6f 20 77 69 6e 64 6f  if the two windo
8b20: 77 20 6f 62 6a 65 63 74 73 20 61 72 65 20 69 64  w objects are id
8b30: 65 6e 74 69 63 61 6c 2c 20 6f 72 20 6e 6f 6e 2d  entical, or non-
8b40: 7a 65 72 6f 20 6f 74 68 65 72 77 69 73 65 2e 0a  zero otherwise..
8b50: 2a 2a 20 49 64 65 6e 74 69 63 61 6c 20 77 69 6e  ** Identical win
8b60: 64 6f 77 20 6f 62 6a 65 63 74 73 20 63 61 6e 20  dow objects can 
8b70: 62 65 20 70 72 6f 63 65 73 73 65 64 20 69 6e 20  be processed in 
8b80: 61 20 73 69 6e 67 6c 65 20 73 63 61 6e 2e 0a 2a  a single scan..*
8b90: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 69 6e  /.int sqlite3Win
8ba0: 64 6f 77 43 6f 6d 70 61 72 65 28 50 61 72 73 65  dowCompare(Parse
8bb0: 20 2a 70 50 61 72 73 65 2c 20 57 69 6e 64 6f 77   *pParse, Window
8bc0: 20 2a 70 31 2c 20 57 69 6e 64 6f 77 20 2a 70 32   *p1, Window *p2
8bd0: 29 7b 0a 20 20 69 66 28 20 70 31 2d 3e 65 54 79  ){.  if( p1->eTy
8be0: 70 65 21 3d 70 32 2d 3e 65 54 79 70 65 20 29 20  pe!=p2->eType ) 
8bf0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
8c00: 70 31 2d 3e 65 53 74 61 72 74 21 3d 70 32 2d 3e  p1->eStart!=p2->
8c10: 65 53 74 61 72 74 20 29 20 72 65 74 75 72 6e 20  eStart ) return 
8c20: 31 3b 0a 20 20 69 66 28 20 70 31 2d 3e 65 45 6e  1;.  if( p1->eEn
8c30: 64 21 3d 70 32 2d 3e 65 45 6e 64 20 29 20 72 65  d!=p2->eEnd ) re
8c40: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
8c50: 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
8c60: 28 70 50 61 72 73 65 2c 20 70 31 2d 3e 70 53 74  (pParse, p1->pSt
8c70: 61 72 74 2c 20 70 32 2d 3e 70 53 74 61 72 74 2c  art, p2->pStart,
8c80: 20 2d 31 29 20 29 20 72 65 74 75 72 6e 20 31 3b   -1) ) return 1;
8c90: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
8ca0: 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  prCompare(pParse
8cb0: 2c 20 70 31 2d 3e 70 45 6e 64 2c 20 70 32 2d 3e  , p1->pEnd, p2->
8cc0: 70 45 6e 64 2c 20 2d 31 29 20 29 20 72 65 74 75  pEnd, -1) ) retu
8cd0: 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 1;.  if( sqli
8ce0: 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61  te3ExprListCompa
8cf0: 72 65 28 70 31 2d 3e 70 50 61 72 74 69 74 69 6f  re(p1->pPartitio
8d00: 6e 2c 20 70 32 2d 3e 70 50 61 72 74 69 74 69 6f  n, p2->pPartitio
8d10: 6e 2c 20 2d 31 29 20 29 20 72 65 74 75 72 6e 20  n, -1) ) return 
8d20: 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
8d30: 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
8d40: 70 31 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 32  p1->pOrderBy, p2
8d50: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31 29 20  ->pOrderBy, -1) 
8d60: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
8d70: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn 0;.}.../*.*
8d80: 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64  * This is called
8d90: 20 62 79 20 63 6f 64 65 20 69 6e 20 73 65 6c 65   by code in sele
8da0: 63 74 2e 63 20 62 65 66 6f 72 65 20 69 74 20 63  ct.c before it c
8db0: 61 6c 6c 73 20 73 71 6c 69 74 65 33 57 68 65 72  alls sqlite3Wher
8dc0: 65 42 65 67 69 6e 28 29 0a 2a 2a 20 74 6f 20 62  eBegin().** to b
8dd0: 65 67 69 6e 20 69 74 65 72 61 74 69 6e 67 20 74  egin iterating t
8de0: 68 72 6f 75 67 68 20 74 68 65 20 73 75 62 2d 71  hrough the sub-q
8df0: 75 65 72 79 20 72 65 73 75 6c 74 73 2e 20 49 74  uery results. It
8e00: 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f   is used to allo
8e10: 63 61 74 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74  cate.** and init
8e20: 69 61 6c 69 7a 65 20 72 65 67 69 73 74 65 72 73  ialize registers
8e30: 20 61 6e 64 20 63 75 72 73 6f 72 73 20 75 73 65   and cursors use
8e40: 64 20 62 79 20 73 71 6c 69 74 65 33 57 69 6e 64  d by sqlite3Wind
8e50: 6f 77 43 6f 64 65 53 74 65 70 28 29 2e 0a 2a 2f  owCodeStep()..*/
8e60: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 6e  .void sqlite3Win
8e70: 64 6f 77 43 6f 64 65 49 6e 69 74 28 50 61 72 73  dowCodeInit(Pars
8e80: 65 20 2a 70 50 61 72 73 65 2c 20 57 69 6e 64 6f  e *pParse, Windo
8e90: 77 20 2a 70 4d 57 69 6e 29 7b 0a 20 20 57 69 6e  w *pMWin){.  Win
8ea0: 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 56 64 62  dow *pWin;.  Vdb
8eb0: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
8ec0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 0a  tVdbe(pParse);..
8ed0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 72 65    /* Allocate re
8ee0: 67 69 73 74 65 72 73 20 74 6f 20 75 73 65 20 66  gisters to use f
8ef0: 6f 72 20 50 41 52 54 49 54 49 4f 4e 20 42 59 20  or PARTITION BY 
8f00: 76 61 6c 75 65 73 2c 20 69 66 20 61 6e 79 2e 20  values, if any. 
8f10: 49 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20  Initialize.  ** 
8f20: 73 61 69 64 20 72 65 67 69 73 74 65 72 73 20 74  said registers t
8f30: 6f 20 4e 55 4c 4c 2e 20 20 2a 2f 0a 20 20 69 66  o NULL.  */.  if
8f40: 28 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74  ( pMWin->pPartit
8f50: 69 6f 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ion ){.    int n
8f60: 45 78 70 72 20 3d 20 70 4d 57 69 6e 2d 3e 70 50  Expr = pMWin->pP
8f70: 61 72 74 69 74 69 6f 6e 2d 3e 6e 45 78 70 72 3b  artition->nExpr;
8f80: 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 72 65 67 50  .    pMWin->regP
8f90: 61 72 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  art = pParse->nM
8fa0: 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65  em+1;.    pParse
8fb0: 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70 72 3b  ->nMem += nExpr;
8fc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8fd0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp3(v, OP_Nul
8fe0: 6c 2c 20 30 2c 20 70 4d 57 69 6e 2d 3e 72 65 67  l, 0, pMWin->reg
8ff0: 50 61 72 74 2c 20 70 4d 57 69 6e 2d 3e 72 65 67  Part, pMWin->reg
9000: 50 61 72 74 2b 6e 45 78 70 72 2d 31 29 3b 0a 20  Part+nExpr-1);. 
9010: 20 7d 0a 0a 20 20 70 4d 57 69 6e 2d 3e 72 65 67   }..  pMWin->reg
9020: 46 69 72 73 74 20 3d 20 2b 2b 70 50 61 72 73 65  First = ++pParse
9030: 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65  ->nMem;.  sqlite
9040: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
9050: 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4d  P_Integer, 1, pM
9060: 57 69 6e 2d 3e 72 65 67 46 69 72 73 74 29 3b 0a  Win->regFirst);.
9070: 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69  .  for(pWin=pMWi
9080: 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57  n; pWin; pWin=pW
9090: 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20  in->pNextWin){. 
90a0: 20 20 20 46 75 6e 63 44 65 66 20 2a 70 20 3d 20     FuncDef *p = 
90b0: 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20 20  pWin->pFunc;.   
90c0: 20 69 66 28 20 28 70 2d 3e 66 75 6e 63 46 6c 61   if( (p->funcFla
90d0: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
90e0: 5f 4d 49 4e 4d 41 58 29 20 26 26 20 70 57 69 6e  _MINMAX) && pWin
90f0: 2d 3e 65 53 74 61 72 74 21 3d 54 4b 5f 55 4e 42  ->eStart!=TK_UNB
9100: 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20 20 20 20  OUNDED ){.      
9110: 2f 2a 20 54 68 65 20 69 6e 6c 69 6e 65 20 76 65  /* The inline ve
9120: 72 73 69 6f 6e 73 20 6f 66 20 6d 69 6e 28 29 20  rsions of min() 
9130: 61 6e 64 20 6d 61 78 28 29 20 72 65 71 75 69 72  and max() requir
9140: 65 20 61 20 73 69 6e 67 6c 65 20 65 70 68 65 6d  e a single ephem
9150: 65 72 61 6c 0a 20 20 20 20 20 20 2a 2a 20 74 61  eral.      ** ta
9160: 62 6c 65 20 61 6e 64 20 33 20 72 65 67 69 73 74  ble and 3 regist
9170: 65 72 73 2e 20 54 68 65 20 72 65 67 69 73 74 65  ers. The registe
9180: 72 73 20 61 72 65 20 75 73 65 64 20 61 73 20 66  rs are used as f
9190: 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a  ollows:.      **
91a0: 0a 20 20 20 20 20 20 2a 2a 20 20 20 72 65 67 41  .      **   regA
91b0: 70 70 2b 30 3a 20 73 6c 6f 74 20 74 6f 20 63 6f  pp+0: slot to co
91c0: 70 79 20 6d 69 6e 28 29 2f 6d 61 78 28 29 20 61  py min()/max() a
91d0: 72 67 75 6d 65 6e 74 20 74 6f 20 66 6f 72 20 4d  rgument to for M
91e0: 61 6b 65 52 65 63 6f 72 64 0a 20 20 20 20 20 20  akeRecord.      
91f0: 2a 2a 20 20 20 72 65 67 41 70 70 2b 31 3a 20 69  **   regApp+1: i
9200: 6e 74 65 67 65 72 20 76 61 6c 75 65 20 75 73 65  nteger value use
9210: 64 20 74 6f 20 65 6e 73 75 72 65 20 6b 65 79 73  d to ensure keys
9220: 20 61 72 65 20 75 6e 69 71 75 65 0a 20 20 20 20   are unique.    
9230: 20 20 2a 2a 20 20 20 72 65 67 41 70 70 2b 32 3a    **   regApp+2:
9240: 20 6f 75 74 70 75 74 20 6f 66 20 4d 61 6b 65 52   output of MakeR
9250: 65 63 6f 72 64 0a 20 20 20 20 20 20 2a 2f 0a 20  ecord.      */. 
9260: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
9270: 4c 69 73 74 20 3d 20 70 57 69 6e 2d 3e 70 4f 77  List = pWin->pOw
9280: 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  ner->x.pList;.  
9290: 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
92a0: 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
92b0: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
92c0: 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  st(pParse, pList
92d0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  , 0, 0);.      p
92e0: 57 69 6e 2d 3e 63 73 72 41 70 70 20 3d 20 70 50  Win->csrApp = pP
92f0: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
9300: 20 20 20 20 70 57 69 6e 2d 3e 72 65 67 41 70 70      pWin->regApp
9310: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
9320: 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  1;.      pParse-
9330: 3e 6e 4d 65 6d 20 2b 3d 20 33 3b 0a 20 20 20 20  >nMem += 3;.    
9340: 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 26    if( pKeyInfo &
9350: 26 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 7a  & pWin->pFunc->z
9360: 4e 61 6d 65 5b 31 5d 3d 3d 27 69 27 20 29 7b 0a  Name[1]=='i' ){.
9370: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9380: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
9390: 72 64 65 72 5b 30 5d 3d 3d 30 20 29 3b 0a 20 20  rder[0]==0 );.  
93a0: 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e        pKeyInfo->
93b0: 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 20 3d 20  aSortOrder[0] = 
93c0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
93d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
93e0: 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
93f0: 65 6d 65 72 61 6c 2c 20 70 57 69 6e 2d 3e 63 73  emeral, pWin->cs
9400: 72 41 70 70 2c 20 32 29 3b 0a 20 20 20 20 20 20  rApp, 2);.      
9410: 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e  sqlite3VdbeAppen
9420: 64 50 34 28 76 2c 20 70 4b 65 79 49 6e 66 6f 2c  dP4(v, pKeyInfo,
9430: 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
9440: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9450: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
9460: 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65  ger, 0, pWin->re
9470: 67 41 70 70 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  gApp+1);.    }. 
9480: 20 20 20 65 6c 73 65 20 69 66 28 20 70 2d 3e 7a     else if( p->z
9490: 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e  Name==nth_valueN
94a0: 61 6d 65 20 7c 7c 20 70 2d 3e 7a 4e 61 6d 65 3d  ame || p->zName=
94b0: 3d 66 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65  =first_valueName
94c0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c 6c   ){.      /* All
94d0: 6f 63 61 74 65 20 74 77 6f 20 72 65 67 69 73 74  ocate two regist
94e0: 65 72 73 20 61 74 20 70 57 69 6e 2d 3e 72 65 67  ers at pWin->reg
94f0: 41 70 70 2e 20 54 68 65 73 65 20 77 69 6c 6c 20  App. These will 
9500: 62 65 20 75 73 65 64 20 74 6f 0a 20 20 20 20 20  be used to.     
9510: 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 73 74   ** store the st
9520: 61 72 74 20 61 6e 64 20 65 6e 64 20 69 6e 64 65  art and end inde
9530: 78 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  x of the current
9540: 20 66 72 61 6d 65 2e 20 20 2a 2f 0a 20 20 20 20   frame.  */.    
9550: 20 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d    assert( pMWin-
9560: 3e 69 45 70 68 43 73 72 20 29 3b 0a 20 20 20 20  >iEphCsr );.    
9570: 20 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 20 3d    pWin->regApp =
9580: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
9590: 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 63 73 72  .      pWin->csr
95a0: 41 70 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  App = pParse->nT
95b0: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61 72  ab++;.      pPar
95c0: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 32 3b 0a 20  se->nMem += 2;. 
95d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
95e0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
95f0: 6e 44 75 70 2c 20 70 57 69 6e 2d 3e 63 73 72 41  nDup, pWin->csrA
9600: 70 70 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43  pp, pMWin->iEphC
9610: 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65  sr);.    }.    e
9620: 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4e 61 6d 65  lse if( p->zName
9630: 3d 3d 6c 65 61 64 4e 61 6d 65 20 7c 7c 20 70 2d  ==leadName || p-
9640: 3e 7a 4e 61 6d 65 3d 3d 6c 61 67 4e 61 6d 65 20  >zName==lagName 
9650: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
9660: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 20   pMWin->iEphCsr 
9670: 29 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 63  );.      pWin->c
9680: 73 72 41 70 70 20 3d 20 70 50 61 72 73 65 2d 3e  srApp = pParse->
9690: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 73 71  nTab++;.      sq
96a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
96b0: 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70  v, OP_OpenDup, p
96c0: 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20 70 4d 57  Win->csrApp, pMW
96d0: 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20  in->iEphCsr);.  
96e0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 64 65 66 69    }.  }.}..#defi
96f0: 6e 65 20 57 49 4e 44 4f 57 5f 53 54 41 52 54 49  ne WINDOW_STARTI
9700: 4e 47 5f 49 4e 54 20 20 30 0a 23 64 65 66 69 6e  NG_INT  0.#defin
9710: 65 20 57 49 4e 44 4f 57 5f 45 4e 44 49 4e 47 5f  e WINDOW_ENDING_
9720: 49 4e 54 20 20 20 20 31 0a 23 64 65 66 69 6e 65  INT    1.#define
9730: 20 57 49 4e 44 4f 57 5f 4e 54 48 5f 56 41 4c 55   WINDOW_NTH_VALU
9740: 45 5f 49 4e 54 20 32 0a 23 64 65 66 69 6e 65 20  E_INT 2.#define 
9750: 57 49 4e 44 4f 57 5f 53 54 41 52 54 49 4e 47 5f  WINDOW_STARTING_
9760: 4e 55 4d 20 20 33 0a 23 64 65 66 69 6e 65 20 57  NUM  3.#define W
9770: 49 4e 44 4f 57 5f 45 4e 44 49 4e 47 5f 4e 55 4d  INDOW_ENDING_NUM
9780: 20 20 20 20 34 0a 0a 2f 2a 0a 2a 2a 20 41 20 22      4../*.** A "
9790: 50 52 45 43 45 44 49 4e 47 20 3c 65 78 70 72 3e  PRECEDING <expr>
97a0: 22 20 28 65 43 6f 6e 64 3d 3d 30 29 20 6f 72 20  " (eCond==0) or 
97b0: 22 46 4f 4c 4c 4f 57 49 4e 47 20 3c 65 78 70 72  "FOLLOWING <expr
97c0: 3e 22 20 28 65 43 6f 6e 64 3d 3d 31 29 20 6f 72  >" (eCond==1) or
97d0: 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66   the.** value of
97e0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
97f0: 6d 65 6e 74 20 74 6f 20 6e 74 68 5f 76 61 6c 75  ment to nth_valu
9800: 65 28 29 20 28 65 43 6f 6e 64 3d 3d 32 29 20 68  e() (eCond==2) h
9810: 61 73 20 6a 75 73 74 20 62 65 65 6e 0a 2a 2a 20  as just been.** 
9820: 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 74 68  evaluated and th
9830: 65 20 72 65 73 75 6c 74 20 6c 65 66 74 20 69 6e  e result left in
9840: 20 72 65 67 69 73 74 65 72 20 72 65 67 2e 20 54   register reg. T
9850: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 67 65 6e  his function gen
9860: 65 72 61 74 65 73 20 56 4d 0a 2a 2a 20 63 6f 64  erates VM.** cod
9870: 65 20 74 6f 20 63 68 65 63 6b 20 74 68 61 74 20  e to check that 
9880: 74 68 65 20 76 61 6c 75 65 20 69 73 20 61 20 6e  the value is a n
9890: 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65  on-negative inte
98a0: 67 65 72 20 61 6e 64 20 74 68 72 6f 77 73 20 61  ger and throws a
98b0: 6e 0a 2a 2a 20 65 78 63 65 70 74 69 6f 6e 20 69  n.** exception i
98c0: 66 20 69 74 20 69 73 20 6e 6f 74 2e 0a 2a 2f 0a  f it is not..*/.
98d0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64  static void wind
98e0: 6f 77 43 68 65 63 6b 56 61 6c 75 65 28 50 61 72  owCheckValue(Par
98f0: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
9900: 72 65 67 2c 20 69 6e 74 20 65 43 6f 6e 64 29 7b  reg, int eCond){
9910: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
9920: 63 68 61 72 20 2a 61 7a 45 72 72 5b 5d 20 3d 20  char *azErr[] = 
9930: 7b 0a 20 20 20 20 22 66 72 61 6d 65 20 73 74 61  {.    "frame sta
9940: 72 74 69 6e 67 20 6f 66 66 73 65 74 20 6d 75 73  rting offset mus
9950: 74 20 62 65 20 61 20 6e 6f 6e 2d 6e 65 67 61 74  t be a non-negat
9960: 69 76 65 20 69 6e 74 65 67 65 72 22 2c 0a 20 20  ive integer",.  
9970: 20 20 22 66 72 61 6d 65 20 65 6e 64 69 6e 67 20    "frame ending 
9980: 6f 66 66 73 65 74 20 6d 75 73 74 20 62 65 20 61  offset must be a
9990: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e   non-negative in
99a0: 74 65 67 65 72 22 2c 0a 20 20 20 20 22 73 65 63  teger",.    "sec
99b0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
99c0: 6e 74 68 5f 76 61 6c 75 65 20 6d 75 73 74 20 62  nth_value must b
99d0: 65 20 61 20 70 6f 73 69 74 69 76 65 20 69 6e 74  e a positive int
99e0: 65 67 65 72 22 2c 0a 20 20 20 20 22 66 72 61 6d  eger",.    "fram
99f0: 65 20 73 74 61 72 74 69 6e 67 20 6f 66 66 73 65  e starting offse
9a00: 74 20 6d 75 73 74 20 62 65 20 61 20 6e 6f 6e 2d  t must be a non-
9a10: 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 22  negative number"
9a20: 2c 0a 20 20 20 20 22 66 72 61 6d 65 20 65 6e 64  ,.    "frame end
9a30: 69 6e 67 20 6f 66 66 73 65 74 20 6d 75 73 74 20  ing offset must 
9a40: 62 65 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  be a non-negativ
9a50: 65 20 6e 75 6d 62 65 72 22 2c 0a 20 20 7d 3b 0a  e number",.  };.
9a60: 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 4f 70    static int aOp
9a70: 5b 5d 20 3d 20 7b 20 4f 50 5f 47 65 2c 20 4f 50  [] = { OP_Ge, OP
9a80: 5f 47 65 2c 20 4f 50 5f 47 74 2c 20 4f 50 5f 47  _Ge, OP_Gt, OP_G
9a90: 65 2c 20 4f 50 5f 47 65 20 7d 3b 0a 20 20 56 64  e, OP_Ge };.  Vd
9aa0: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
9ab0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
9ac0: 20 20 69 6e 74 20 72 65 67 5a 65 72 6f 20 3d 20    int regZero = 
9ad0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
9ae0: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73  g(pParse);.  ass
9af0: 65 72 74 28 20 65 43 6f 6e 64 3e 3d 30 20 26 26  ert( eCond>=0 &&
9b00: 20 65 43 6f 6e 64 3c 41 72 72 61 79 53 69 7a 65   eCond<ArraySize
9b10: 28 61 7a 45 72 72 29 20 29 3b 0a 20 20 73 71 6c  (azErr) );.  sql
9b20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
9b30: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
9b40: 20 72 65 67 5a 65 72 6f 29 3b 0a 20 20 73 71 6c   regZero);.  sql
9b50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
9b60: 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
9b70: 72 65 67 2c 20 73 71 6c 69 74 65 33 56 64 62 65  reg, sqlite3Vdbe
9b80: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32  CurrentAddr(v)+2
9b90: 29 3b 0a 20 20 69 66 28 20 65 43 6f 6e 64 3e 3d  );.  if( eCond>=
9ba0: 57 49 4e 44 4f 57 5f 53 54 41 52 54 49 4e 47 5f  WINDOW_STARTING_
9bb0: 4e 55 4d 20 29 20 73 71 6c 69 74 65 33 56 64 62  NUM ) sqlite3Vdb
9bc0: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b  eChangeP5(v, 1);
9bd0: 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  .  VdbeCoverageI
9be0: 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 30 29 3b 0a  f(v, eCond==0);.
9bf0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
9c00: 28 76 2c 20 65 43 6f 6e 64 3d 3d 31 29 3b 0a 20  (v, eCond==1);. 
9c10: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
9c20: 76 2c 20 65 43 6f 6e 64 3d 3d 32 29 3b 0a 20 20  v, eCond==2);.  
9c30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9c40: 33 28 76 2c 20 61 4f 70 5b 65 43 6f 6e 64 5d 2c  3(v, aOp[eCond],
9c50: 20 72 65 67 5a 65 72 6f 2c 20 73 71 6c 69 74 65   regZero, sqlite
9c60: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
9c70: 28 76 29 2b 32 2c 20 72 65 67 29 3b 0a 20 20 56  (v)+2, reg);.  V
9c80: 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72  dbeCoverageNever
9c90: 4e 75 6c 6c 49 66 28 76 2c 20 65 43 6f 6e 64 3d  NullIf(v, eCond=
9ca0: 3d 30 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72  =0);.  VdbeCover
9cb0: 61 67 65 4e 65 76 65 72 4e 75 6c 6c 49 66 28 76  ageNeverNullIf(v
9cc0: 2c 20 65 43 6f 6e 64 3d 3d 31 29 3b 0a 20 20 56  , eCond==1);.  V
9cd0: 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72  dbeCoverageNever
9ce0: 4e 75 6c 6c 49 66 28 76 2c 20 65 43 6f 6e 64 3d  NullIf(v, eCond=
9cf0: 3d 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 61  =2);.  sqlite3Ma
9d00: 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a  yAbort(pParse);.
9d10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9d20: 4f 70 32 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20  Op2(v, OP_Halt, 
9d30: 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 4f 45  SQLITE_ERROR, OE
9d40: 5f 41 62 6f 72 74 29 3b 0a 20 20 73 71 6c 69 74  _Abort);.  sqlit
9d50: 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76  e3VdbeAppendP4(v
9d60: 2c 20 28 76 6f 69 64 2a 29 61 7a 45 72 72 5b 65  , (void*)azErr[e
9d70: 43 6f 6e 64 5d 2c 20 50 34 5f 53 54 41 54 49 43  Cond], P4_STATIC
9d80: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
9d90: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
9da0: 65 2c 20 72 65 67 5a 65 72 6f 29 3b 0a 7d 0a 0a  e, regZero);.}..
9db0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
9dc0: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
9dd0: 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 74  ents passed to t
9de0: 68 65 20 77 69 6e 64 6f 77 2d 66 75 6e 63 74 69  he window-functi
9df0: 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  on associated.**
9e00: 20 77 69 74 68 20 74 68 65 20 6f 62 6a 65 63 74   with the object
9e10: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f   passed as the o
9e20: 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  nly argument to 
9e30: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
9e40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
9e50: 64 6f 77 41 72 67 43 6f 75 6e 74 28 57 69 6e 64  dowArgCount(Wind
9e60: 6f 77 20 2a 70 57 69 6e 29 7b 0a 20 20 45 78 70  ow *pWin){.  Exp
9e70: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
9e80: 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70  Win->pOwner->x.p
9e90: 4c 69 73 74 3b 0a 20 20 72 65 74 75 72 6e 20 28  List;.  return (
9ea0: 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e  pList ? pList->n
9eb0: 45 78 70 72 20 3a 20 30 29 3b 0a 7d 0a 0a 2f 2a  Expr : 0);.}../*
9ec0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 4d 20  .** Generate VM 
9ed0: 63 6f 64 65 20 74 6f 20 69 6e 76 6f 6b 65 20 65  code to invoke e
9ee0: 69 74 68 65 72 20 78 53 74 65 70 28 29 20 28 69  ither xStep() (i
9ef0: 66 20 62 49 6e 76 65 72 73 65 20 69 73 20 30 29  f bInverse is 0)
9f00: 20 6f 72 20 0a 2a 2a 20 78 49 6e 76 65 72 73 65   or .** xInverse
9f10: 20 28 69 66 20 62 49 6e 76 65 72 73 65 20 69 73   (if bInverse is
9f20: 20 6e 6f 6e 2d 7a 65 72 6f 29 20 66 6f 72 20 65   non-zero) for e
9f30: 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  ach window funct
9f40: 69 6f 6e 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c  ion in the .** l
9f50: 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74  inked list start
9f60: 69 6e 67 20 61 74 20 70 4d 57 69 6e 2e 20 4f 72  ing at pMWin. Or
9f70: 2c 20 66 6f 72 20 62 75 69 6c 74 2d 69 6e 20 77  , for built-in w
9f80: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 0a  indow functions.
9f90: 2a 2a 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 75  ** that do not u
9fa0: 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  se the standard 
9fb0: 66 75 6e 63 74 69 6f 6e 20 41 50 49 2c 20 67 65  function API, ge
9fc0: 6e 65 72 61 74 65 20 74 68 65 20 72 65 71 75 69  nerate the requi
9fd0: 72 65 64 0a 2a 2a 20 69 6e 6c 69 6e 65 20 56 4d  red.** inline VM
9fe0: 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   code..**.** If 
9ff0: 61 72 67 75 6d 65 6e 74 20 63 73 72 20 69 73 20  argument csr is 
a000: 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
a010: 65 71 75 61 6c 20 74 6f 20 30 2c 20 74 68 65 6e  equal to 0, then
a020: 20 61 72 67 75 6d 65 6e 74 20 72 65 67 20 69 73   argument reg is
a030: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72 65  .** the first re
a040: 67 69 73 74 65 72 20 69 6e 20 61 6e 20 61 72 72  gister in an arr
a050: 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ay of registers 
a060: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
a070: 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68   large.** enough
a080: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 61 72 72   to hold the arr
a090: 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  ay of arguments 
a0a0: 66 6f 72 20 65 61 63 68 20 66 75 6e 63 74 69 6f  for each functio
a0b0: 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a  n. In this case.
a0c0: 2a 2a 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73  ** the arguments
a0d0: 20 61 72 65 20 65 78 74 72 61 63 74 65 64 20 66   are extracted f
a0e0: 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20  rom the current 
a0f0: 72 6f 77 20 6f 66 20 63 73 72 20 69 6e 74 6f 20  row of csr into 
a100: 74 68 65 0a 2a 2a 20 61 72 72 61 79 20 6f 66 20  the.** array of 
a110: 72 65 67 69 73 74 65 72 73 20 62 65 66 6f 72 65  registers before
a120: 20 69 6e 76 6f 6b 69 6e 67 20 4f 50 5f 41 67 67   invoking OP_Agg
a130: 53 74 65 70 20 6f 72 20 4f 50 5f 41 67 67 49 6e  Step or OP_AggIn
a140: 76 65 72 73 65 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  verse.**.** Or, 
a150: 69 66 20 63 73 72 20 69 73 20 6c 65 73 73 20 74  if csr is less t
a160: 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
a170: 68 65 20 61 72 72 61 79 20 6f 66 20 72 65 67 69  he array of regi
a180: 73 74 65 72 73 20 61 74 20 72 65 67 20 69 73 0a  sters at reg is.
a190: 2a 2a 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c  ** already popul
a1a0: 61 74 65 64 20 77 69 74 68 20 61 6c 6c 20 63 6f  ated with all co
a1b0: 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 63  lumns from the c
a1c0: 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68  urrent row of th
a1d0: 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a  e sub-query..**.
a1e0: 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 72  ** If argument r
a1f0: 65 67 50 61 72 74 53 69 7a 65 20 69 73 20 6e 6f  egPartSize is no
a200: 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20  n-zero, then it 
a210: 69 73 20 61 20 72 65 67 69 73 74 65 72 20 63 6f  is a register co
a220: 6e 74 61 69 6e 69 6e 67 20 74 68 65 0a 2a 2a 20  ntaining the.** 
a230: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
a240: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  n the current pa
a250: 72 74 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  rtition..*/.stat
a260: 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 41 67  ic void windowAg
a270: 67 53 74 65 70 28 0a 20 20 50 61 72 73 65 20 2a  gStep(.  Parse *
a280: 70 50 61 72 73 65 2c 20 0a 20 20 57 69 6e 64 6f  pParse, .  Windo
a290: 77 20 2a 70 4d 57 69 6e 2c 20 20 20 20 20 20 20  w *pMWin,       
a2a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
a2b0: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 77 69 6e  nked list of win
a2c0: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  dow functions */
a2d0: 0a 20 20 69 6e 74 20 63 73 72 2c 20 20 20 20 20  .  int csr,     
a2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2f0: 20 20 20 2f 2a 20 52 65 61 64 20 61 72 67 75 6d     /* Read argum
a300: 65 6e 74 73 20 66 72 6f 6d 20 74 68 69 73 20 63  ents from this c
a310: 75 72 73 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 62  ursor */.  int b
a320: 49 6e 76 65 72 73 65 2c 20 20 20 20 20 20 20 20  Inverse,        
a330: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
a340: 75 65 20 74 6f 20 69 6e 76 6f 6b 65 20 78 49 6e  ue to invoke xIn
a350: 76 65 72 73 65 20 69 6e 73 74 65 61 64 20 6f 66  verse instead of
a360: 20 78 53 74 65 70 20 2a 2f 0a 20 20 69 6e 74 20   xStep */.  int 
a370: 72 65 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  reg,            
a380: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
a390: 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
a3a0: 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 61  s */.  int regPa
a3b0: 72 74 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  rtSize          
a3c0: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
a3d0: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73 69  er containing si
a3e0: 7a 65 20 6f 66 20 70 61 72 74 69 74 69 6f 6e 20  ze of partition 
a3f0: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
a400: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
a410: 28 70 50 61 72 73 65 29 3b 0a 20 20 57 69 6e 64  (pParse);.  Wind
a420: 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 66 6f 72 28  ow *pWin;.  for(
a430: 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e  pWin=pMWin; pWin
a440: 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65  ; pWin=pWin->pNe
a450: 78 74 57 69 6e 29 7b 0a 20 20 20 20 69 6e 74 20  xtWin){.    int 
a460: 72 65 67 41 72 67 3b 0a 20 20 20 20 69 6e 74 20  regArg;.    int 
a470: 6e 41 72 67 20 3d 20 77 69 6e 64 6f 77 41 72 67  nArg = windowArg
a480: 43 6f 75 6e 74 28 70 57 69 6e 29 3b 0a 0a 20 20  Count(pWin);..  
a490: 20 20 69 66 28 20 63 73 72 3e 3d 30 20 29 7b 0a    if( csr>=0 ){.
a4a0: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
a4b0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
a4c0: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
a4d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a4e0: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
a4f0: 2c 20 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72  , csr, pWin->iAr
a500: 67 43 6f 6c 2b 69 2c 20 72 65 67 2b 69 29 3b 0a  gCol+i, reg+i);.
a510: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
a520: 67 41 72 67 20 3d 20 72 65 67 3b 0a 20 20 20 20  gArg = reg;.    
a530: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 67  }else{.      reg
a540: 41 72 67 20 3d 20 72 65 67 20 2b 20 70 57 69 6e  Arg = reg + pWin
a550: 2d 3e 69 41 72 67 43 6f 6c 3b 0a 20 20 20 20 7d  ->iArgCol;.    }
a560: 0a 0a 20 20 20 20 69 66 28 20 28 70 57 69 6e 2d  ..    if( (pWin-
a570: 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67  >pFunc->funcFlag
a580: 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
a590: 4d 49 4e 4d 41 58 29 20 0a 20 20 20 20 20 20 26  MINMAX) .      &
a5a0: 26 20 70 57 69 6e 2d 3e 65 53 74 61 72 74 21 3d  & pWin->eStart!=
a5b0: 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 0a 20 20  TK_UNBOUNDED .  
a5c0: 20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61    ){.      int a
a5d0: 64 64 72 49 73 4e 75 6c 6c 20 3d 20 73 71 6c 69  ddrIsNull = sqli
a5e0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
a5f0: 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 41   OP_IsNull, regA
a600: 72 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  rg);.      VdbeC
a610: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
a620: 20 20 69 66 28 20 62 49 6e 76 65 72 73 65 3d 3d    if( bInverse==
a630: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
a640: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
a650: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 57 69  , OP_AddImm, pWi
a660: 6e 2d 3e 72 65 67 41 70 70 2b 31 2c 20 31 29 3b  n->regApp+1, 1);
a670: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a680: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
a690: 5f 53 43 6f 70 79 2c 20 72 65 67 41 72 67 2c 20  _SCopy, regArg, 
a6a0: 70 57 69 6e 2d 3e 72 65 67 41 70 70 29 3b 0a 20  pWin->regApp);. 
a6b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a6c0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
a6d0: 61 6b 65 52 65 63 6f 72 64 2c 20 70 57 69 6e 2d  akeRecord, pWin-
a6e0: 3e 72 65 67 41 70 70 2c 20 32 2c 20 70 57 69 6e  >regApp, 2, pWin
a6f0: 2d 3e 72 65 67 41 70 70 2b 32 29 3b 0a 20 20 20  ->regApp+2);.   
a700: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a710: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
a720: 49 6e 73 65 72 74 2c 20 70 57 69 6e 2d 3e 63 73  Insert, pWin->cs
a730: 72 41 70 70 2c 20 70 57 69 6e 2d 3e 72 65 67 41  rApp, pWin->regA
a740: 70 70 2b 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c  pp+2);.      }el
a750: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
a760: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
a770: 28 76 2c 20 4f 50 5f 53 65 65 6b 47 45 2c 20 70  (v, OP_SeekGE, p
a780: 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20 30 2c 20  Win->csrApp, 0, 
a790: 72 65 67 41 72 67 2c 20 31 29 3b 0a 20 20 20 20  regArg, 1);.    
a7a0: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
a7b0: 4e 65 76 65 72 54 61 6b 65 6e 28 76 29 3b 0a 20  NeverTaken(v);. 
a7c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a7d0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44  beAddOp1(v, OP_D
a7e0: 65 6c 65 74 65 2c 20 70 57 69 6e 2d 3e 63 73 72  elete, pWin->csr
a7f0: 41 70 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71  App);.        sq
a800: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
a810: 65 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65  e(v, sqlite3Vdbe
a820: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 32  CurrentAddr(v)-2
a830: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
a840: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
a850: 48 65 72 65 28 76 2c 20 61 64 64 72 49 73 4e 75  Here(v, addrIsNu
a860: 6c 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ll);.    }else i
a870: 66 28 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 20  f( pWin->regApp 
a880: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
a890: 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 7a 4e   pWin->pFunc->zN
a8a0: 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e 61  ame==nth_valueNa
a8b0: 6d 65 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  me.           ||
a8c0: 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 7a 4e   pWin->pFunc->zN
a8d0: 61 6d 65 3d 3d 66 69 72 73 74 5f 76 61 6c 75 65  ame==first_value
a8e0: 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20  Name.      );.  
a8f0: 20 20 20 20 61 73 73 65 72 74 28 20 62 49 6e 76      assert( bInv
a900: 65 72 73 65 3d 3d 30 20 7c 7c 20 62 49 6e 76 65  erse==0 || bInve
a910: 72 73 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  rse==1 );.      
a920: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a930: 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
a940: 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31 2d 62  pWin->regApp+1-b
a950: 49 6e 76 65 72 73 65 2c 20 31 29 3b 0a 20 20 20  Inverse, 1);.   
a960: 20 7d 65 6c 73 65 20 69 66 28 20 70 57 69 6e 2d   }else if( pWin-
a970: 3e 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c  >pFunc->zName==l
a980: 65 61 64 4e 61 6d 65 0a 20 20 20 20 20 20 20 20  eadName.        
a990: 20 20 20 7c 7c 20 70 57 69 6e 2d 3e 70 46 75 6e     || pWin->pFun
a9a0: 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 61 67 4e 61 6d  c->zName==lagNam
a9b0: 65 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  e.    ){.      /
a9c0: 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d  * no-op */.    }
a9d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
a9e0: 61 64 64 72 49 66 20 3d 20 30 3b 0a 20 20 20 20  addrIf = 0;.    
a9f0: 20 20 69 66 28 20 70 57 69 6e 2d 3e 70 46 69 6c    if( pWin->pFil
aa00: 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ter ){.        i
aa10: 6e 74 20 72 65 67 54 6d 70 3b 0a 20 20 20 20 20  nt regTmp;.     
aa20: 20 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d     assert( nArg=
aa30: 3d 30 20 7c 7c 20 6e 41 72 67 3d 3d 70 57 69 6e  =0 || nArg==pWin
aa40: 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73  ->pOwner->x.pLis
aa50: 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
aa60: 20 20 20 20 61 73 73 65 72 74 28 20 6e 41 72 67      assert( nArg
aa70: 20 7c 7c 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72   || pWin->pOwner
aa80: 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a  ->x.pList==0 );.
aa90: 20 20 20 20 20 20 20 20 69 66 28 20 63 73 72 3e          if( csr>
aaa0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
aab0: 65 67 54 6d 70 20 3d 20 73 71 6c 69 74 65 33 47  egTmp = sqlite3G
aac0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
aad0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
aae0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
aaf0: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72  , OP_Column, csr
ab00: 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b  , pWin->iArgCol+
ab10: 6e 41 72 67 2c 72 65 67 54 6d 70 29 3b 0a 20 20  nArg,regTmp);.  
ab20: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ab30: 20 20 20 20 20 20 20 72 65 67 54 6d 70 20 3d 20         regTmp = 
ab40: 72 65 67 41 72 67 20 2b 20 6e 41 72 67 3b 0a 20  regArg + nArg;. 
ab50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ab60: 20 61 64 64 72 49 66 20 3d 20 73 71 6c 69 74 65   addrIf = sqlite
ab70: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
ab80: 50 5f 49 66 4e 6f 74 2c 20 72 65 67 54 6d 70 2c  P_IfNot, regTmp,
ab90: 20 30 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20   0, 1);.        
aba0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
abb0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 73 72  .        if( csr
abc0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
abd0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
abe0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
abf0: 67 54 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  gTmp);.        }
ac00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
ac10: 66 28 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e  f( pWin->pFunc->
ac20: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
ac30: 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c  TE_FUNC_NEEDCOLL
ac40: 20 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c   ){.        Coll
ac50: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
ac60: 20 20 20 20 61 73 73 65 72 74 28 20 6e 41 72 67      assert( nArg
ac70: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 43  >0 );.        pC
ac80: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
ac90: 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  rNNCollSeq(pPars
aca0: 65 2c 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d  e, pWin->pOwner-
acb0: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  >x.pList->a[0].p
acc0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73  Expr);.        s
acd0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
ace0: 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20  (v, OP_CollSeq, 
acf0: 30 2c 30 2c 30 2c 20 28 63 6f 6e 73 74 20 63 68  0,0,0, (const ch
ad00: 61 72 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  ar*)pColl, P4_CO
ad10: 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a  LLSEQ);.      }.
ad20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ad30: 65 41 64 64 4f 70 33 28 76 2c 20 62 49 6e 76 65  eAddOp3(v, bInve
ad40: 72 73 65 3f 20 4f 50 5f 41 67 67 49 6e 76 65 72  rse? OP_AggInver
ad50: 73 65 20 3a 20 4f 50 5f 41 67 67 53 74 65 70 2c  se : OP_AggStep,
ad60: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
ad70: 20 20 20 20 20 20 20 20 20 20 62 49 6e 76 65 72            bInver
ad80: 73 65 2c 20 72 65 67 41 72 67 2c 20 70 57 69 6e  se, regArg, pWin
ad90: 2d 3e 72 65 67 41 63 63 75 6d 29 3b 0a 20 20 20  ->regAccum);.   
ada0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70     sqlite3VdbeAp
adb0: 70 65 6e 64 50 34 28 76 2c 20 70 57 69 6e 2d 3e  pendP4(v, pWin->
adc0: 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45  pFunc, P4_FUNCDE
add0: 46 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  F);.      sqlite
ade0: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
adf0: 20 28 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20   (u8)nArg);.    
ae00: 20 20 69 66 28 20 61 64 64 72 49 66 20 29 20 73    if( addrIf ) s
ae10: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
ae20: 72 65 28 76 2c 20 61 64 64 72 49 66 29 3b 0a 20  re(v, addrIf);. 
ae30: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
ae40: 2a 20 47 65 6e 65 72 61 74 65 20 56 4d 20 63 6f  * Generate VM co
ae50: 64 65 20 74 6f 20 69 6e 76 6f 6b 65 20 65 69 74  de to invoke eit
ae60: 68 65 72 20 78 56 61 6c 75 65 28 29 20 28 62 46  her xValue() (bF
ae70: 69 6e 61 6c 3d 3d 30 29 20 6f 72 20 78 46 69 6e  inal==0) or xFin
ae80: 61 6c 69 7a 65 28 29 0a 2a 2a 20 28 62 46 69 6e  alize().** (bFin
ae90: 61 6c 3d 3d 31 29 20 66 6f 72 20 65 61 63 68 20  al==1) for each 
aea0: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
aeb0: 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  in the linked li
aec0: 73 74 20 73 74 61 72 74 69 6e 67 20 61 74 0a 2a  st starting at.*
aed0: 2a 20 70 4d 57 69 6e 2e 20 4f 72 2c 20 66 6f 72  * pMWin. Or, for
aee0: 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77   built-in window
aef0: 2d 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20  -functions that 
af00: 64 6f 20 6e 6f 74 20 75 73 65 20 74 68 65 20 73  do not use the s
af10: 74 61 6e 64 61 72 64 0a 2a 2a 20 41 50 49 2c 20  tandard.** API, 
af20: 67 65 6e 65 72 61 74 65 20 74 68 65 20 65 71 75  generate the equ
af30: 69 76 61 6c 65 6e 74 20 56 4d 20 63 6f 64 65 2e  ivalent VM code.
af40: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
af50: 77 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 50  windowAggFinal(P
af60: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 57 69  arse *pParse, Wi
af70: 6e 64 6f 77 20 2a 70 4d 57 69 6e 2c 20 69 6e 74  ndow *pMWin, int
af80: 20 62 46 69 6e 61 6c 29 7b 0a 20 20 56 64 62 65   bFinal){.  Vdbe
af90: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
afa0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
afb0: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 0a 20  Window *pWin;.. 
afc0: 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b   for(pWin=pMWin;
afd0: 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e   pWin; pWin=pWin
afe0: 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20  ->pNextWin){.   
aff0: 20 69 66 28 20 28 70 57 69 6e 2d 3e 70 46 75 6e   if( (pWin->pFun
b000: 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  c->funcFlags & S
b010: 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41  QLITE_FUNC_MINMA
b020: 58 29 20 0a 20 20 20 20 20 26 26 20 70 57 69 6e  X) .     && pWin
b030: 2d 3e 65 53 74 61 72 74 21 3d 54 4b 5f 55 4e 42  ->eStart!=TK_UNB
b040: 4f 55 4e 44 45 44 20 0a 20 20 20 20 29 7b 0a 20  OUNDED .    ){. 
b050: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b060: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
b070: 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 52  l, 0, pWin->regR
b080: 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 73 71  esult);.      sq
b090: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
b0a0: 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 57 69 6e  v, OP_Last, pWin
b0b0: 2d 3e 63 73 72 41 70 70 29 3b 0a 20 20 20 20 20  ->csrApp);.     
b0c0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
b0d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b0e0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
b0f0: 43 6f 6c 75 6d 6e 2c 20 70 57 69 6e 2d 3e 63 73  Column, pWin->cs
b100: 72 41 70 70 2c 20 30 2c 20 70 57 69 6e 2d 3e 72  rApp, 0, pWin->r
b110: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
b120: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
b130: 48 65 72 65 28 76 2c 20 73 71 6c 69 74 65 33 56  Here(v, sqlite3V
b140: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
b150: 29 2d 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20  )-2);.      if( 
b160: 62 46 69 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  bFinal ){.      
b170: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b180: 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53  Op1(v, OP_ResetS
b190: 6f 72 74 65 72 2c 20 70 57 69 6e 2d 3e 63 73 72  orter, pWin->csr
b1a0: 41 70 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  App);.      }.  
b1b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57 69 6e    }else if( pWin
b1c0: 2d 3e 72 65 67 41 70 70 20 29 7b 0a 20 20 20 20  ->regApp ){.    
b1d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
b1e0: 20 62 46 69 6e 61 6c 20 29 7b 0a 20 20 20 20 20   bFinal ){.     
b1f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b200: 64 4f 70 32 28 76 2c 20 4f 50 5f 41 67 67 46 69  dOp2(v, OP_AggFi
b210: 6e 61 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63  nal, pWin->regAc
b220: 63 75 6d 2c 20 77 69 6e 64 6f 77 41 72 67 43 6f  cum, windowArgCo
b230: 75 6e 74 28 70 57 69 6e 29 29 3b 0a 20 20 20 20  unt(pWin));.    
b240: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b250: 70 70 65 6e 64 50 34 28 76 2c 20 70 57 69 6e 2d  ppendP4(v, pWin-
b260: 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44  >pFunc, P4_FUNCD
b270: 45 46 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  EF);.        sql
b280: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b290: 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 57 69 6e 2d  , OP_Copy, pWin-
b2a0: 3e 72 65 67 41 63 63 75 6d 2c 20 70 57 69 6e 2d  >regAccum, pWin-
b2b0: 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20  >regResult);.   
b2c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b2d0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
b2e0: 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41  l, 0, pWin->regA
b2f0: 63 63 75 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ccum);.      }el
b300: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
b310: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
b320: 20 4f 50 5f 41 67 67 56 61 6c 75 65 2c 20 70 57   OP_AggValue, pW
b330: 69 6e 2d 3e 72 65 67 41 63 63 75 6d 2c 20 77 69  in->regAccum, wi
b340: 6e 64 6f 77 41 72 67 43 6f 75 6e 74 28 70 57 69  ndowArgCount(pWi
b350: 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n),.            
b360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b370: 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74   pWin->regResult
b380: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
b390: 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76  e3VdbeAppendP4(v
b3a0: 2c 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2c 20 50  , pWin->pFunc, P
b3b0: 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20  4_FUNCDEF);.    
b3c0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
b3d0: 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
b3e0: 65 20 73 75 62 2d 72 6f 75 74 69 6e 65 20 61 74  e sub-routine at
b3f0: 20 72 65 67 47 6f 73 75 62 20 28 67 65 6e 65 72   regGosub (gener
b400: 61 74 65 64 20 62 79 20 63 6f 64 65 20 69 6e 20  ated by code in 
b410: 73 65 6c 65 63 74 2e 63 29 20 74 6f 0a 2a 2a 20  select.c) to.** 
b420: 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  return the curre
b430: 6e 74 20 72 6f 77 20 6f 66 20 57 69 6e 64 6f 77  nt row of Window
b440: 2e 69 45 70 68 43 73 72 2e 20 49 66 20 61 6c 6c  .iEphCsr. If all
b450: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
b460: 73 20 61 72 65 0a 2a 2a 20 61 67 67 72 65 67 61  s are.** aggrega
b470: 74 65 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  te window functi
b480: 6f 6e 73 20 74 68 61 74 20 75 73 65 20 74 68 65  ons that use the
b490: 20 73 74 61 6e 64 61 72 64 20 41 50 49 2c 20 61   standard API, a
b4a0: 20 73 69 6e 67 6c 65 0a 2a 2a 20 4f 50 5f 47 6f   single.** OP_Go
b4b0: 73 75 62 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  sub instruction 
b4c0: 69 73 20 61 6c 6c 20 74 68 61 74 20 74 68 69 73  is all that this
b4d0: 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
b4e0: 65 73 2e 20 45 78 74 72 61 20 56 4d 20 63 6f 64  es. Extra VM cod
b4f0: 65 0a 2a 2a 20 66 6f 72 20 70 65 72 2d 72 6f 77  e.** for per-row
b500: 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6f   processing is o
b510: 6e 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f  nly generated fo
b520: 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  r the following 
b530: 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 0a  built-in window.
b540: 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a  ** functions:.**
b550: 0a 2a 2a 20 20 20 6e 74 68 5f 76 61 6c 75 65 28  .**   nth_value(
b560: 29 0a 2a 2a 20 20 20 66 69 72 73 74 5f 76 61 6c  ).**   first_val
b570: 75 65 28 29 0a 2a 2a 20 20 20 6c 61 67 28 29 0a  ue().**   lag().
b580: 2a 2a 20 20 20 6c 65 61 64 28 29 0a 2a 2f 0a 73  **   lead().*/.s
b590: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f  tatic void windo
b5a0: 77 52 65 74 75 72 6e 4f 6e 65 52 6f 77 28 0a 20  wReturnOneRow(. 
b5b0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a   Parse *pParse,.
b5c0: 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 2c    Window *pMWin,
b5d0: 0a 20 20 69 6e 74 20 72 65 67 47 6f 73 75 62 2c  .  int regGosub,
b5e0: 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75 62  .  int addrGosub
b5f0: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
b600: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
b610: 50 61 72 73 65 29 3b 0a 20 20 57 69 6e 64 6f 77  Parse);.  Window
b620: 20 2a 70 57 69 6e 3b 0a 20 20 66 6f 72 28 70 57   *pWin;.  for(pW
b630: 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20  in=pMWin; pWin; 
b640: 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74  pWin=pWin->pNext
b650: 57 69 6e 29 7b 0a 20 20 20 20 46 75 6e 63 44 65  Win){.    FuncDe
b660: 66 20 2a 70 46 75 6e 63 20 3d 20 70 57 69 6e 2d  f *pFunc = pWin-
b670: 3e 70 46 75 6e 63 3b 0a 20 20 20 20 69 66 28 20  >pFunc;.    if( 
b680: 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74  pFunc->zName==nt
b690: 68 5f 76 61 6c 75 65 4e 61 6d 65 0a 20 20 20 20  h_valueName.    
b6a0: 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65   || pFunc->zName
b6b0: 3d 3d 66 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d  ==first_valueNam
b6c0: 65 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69  e.    ){.      i
b6d0: 6e 74 20 63 73 72 20 3d 20 70 57 69 6e 2d 3e 63  nt csr = pWin->c
b6e0: 73 72 41 70 70 3b 0a 20 20 20 20 20 20 69 6e 74  srApp;.      int
b6f0: 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33 56 64   lbl = sqlite3Vd
b700: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
b710: 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 74  se);.      int t
b720: 6d 70 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47  mpReg = sqlite3G
b730: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
b740: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b750: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
b760: 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e  _Null, 0, pWin->
b770: 72 65 67 52 65 73 75 6c 74 29 3b 0a 0a 20 20 20  regResult);..   
b780: 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 7a 4e     if( pFunc->zN
b790: 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e 61  ame==nth_valueNa
b7a0: 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  me ){.        sq
b7b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
b7c0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 4d  v, OP_Column, pM
b7d0: 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 70 57  Win->iEphCsr, pW
b7e0: 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 31 2c 74 6d  in->iArgCol+1,tm
b7f0: 70 52 65 67 29 3b 0a 20 20 20 20 20 20 20 20 77  pReg);.        w
b800: 69 6e 64 6f 77 43 68 65 63 6b 56 61 6c 75 65 28  indowCheckValue(
b810: 70 50 61 72 73 65 2c 20 74 6d 70 52 65 67 2c 20  pParse, tmpReg, 
b820: 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  2);.      }else{
b830: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b840: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
b850: 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 6d 70  _Integer, 1, tmp
b860: 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Reg);.      }.  
b870: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b880: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c  ddOp3(v, OP_Add,
b890: 20 74 6d 70 52 65 67 2c 20 70 57 69 6e 2d 3e 72   tmpReg, pWin->r
b8a0: 65 67 41 70 70 2c 20 74 6d 70 52 65 67 29 3b 0a  egApp, tmpReg);.
b8b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b8c0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 47 74  eAddOp3(v, OP_Gt
b8d0: 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31  , pWin->regApp+1
b8e0: 2c 20 6c 62 6c 2c 20 74 6d 70 52 65 67 29 3b 0a  , lbl, tmpReg);.
b8f0: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
b900: 67 65 4e 65 76 65 72 4e 75 6c 6c 28 76 29 3b 0a  geNeverNull(v);.
b910: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b920: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65  eAddOp3(v, OP_Se
b930: 65 6b 52 6f 77 69 64 2c 20 63 73 72 2c 20 30 2c  ekRowid, csr, 0,
b940: 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20 20   tmpReg);.      
b950: 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65  VdbeCoverageNeve
b960: 72 54 61 6b 65 6e 28 76 29 3b 0a 20 20 20 20 20  rTaken(v);.     
b970: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b980: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
b990: 20 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67   csr, pWin->iArg
b9a0: 43 6f 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65  Col, pWin->regRe
b9b0: 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  sult);.      sql
b9c0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
b9d0: 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20 20  abel(v, lbl);.  
b9e0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
b9f0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
ba00: 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 7d  , tmpReg);.    }
ba10: 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 46  .    else if( pF
ba20: 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64  unc->zName==lead
ba30: 4e 61 6d 65 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a  Name || pFunc->z
ba40: 4e 61 6d 65 3d 3d 6c 61 67 4e 61 6d 65 20 29 7b  Name==lagName ){
ba50: 0a 20 20 20 20 20 20 69 6e 74 20 6e 41 72 67 20  .      int nArg 
ba60: 3d 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e  = pWin->pOwner->
ba70: 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  x.pList->nExpr;.
ba80: 20 20 20 20 20 20 69 6e 74 20 63 73 72 20 3d 20        int csr = 
ba90: 70 57 69 6e 2d 3e 63 73 72 41 70 70 3b 0a 20 20  pWin->csrApp;.  
baa0: 20 20 20 20 69 6e 74 20 6c 62 6c 20 3d 20 73 71      int lbl = sq
bab0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
bac0: 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  el(pParse);.    
bad0: 20 20 69 6e 74 20 74 6d 70 52 65 67 20 3d 20 73    int tmpReg = s
bae0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
baf0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
bb00: 69 6e 74 20 69 45 70 68 20 3d 20 70 4d 57 69 6e  int iEph = pMWin
bb10: 2d 3e 69 45 70 68 43 73 72 3b 0a 0a 20 20 20 20  ->iEphCsr;..    
bb20: 20 20 69 66 28 20 6e 41 72 67 3c 33 20 29 7b 0a    if( nArg<3 ){.
bb30: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
bb40: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
bb50: 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72  Null, 0, pWin->r
bb60: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
bb70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
bb80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
bb90: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
bba0: 69 45 70 68 2c 20 70 57 69 6e 2d 3e 69 41 72 67  iEph, pWin->iArg
bbb0: 43 6f 6c 2b 32 2c 20 70 57 69 6e 2d 3e 72 65 67  Col+2, pWin->reg
bbc0: 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d  Result);.      }
bbd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
bbe0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
bbf0: 6f 77 69 64 2c 20 69 45 70 68 2c 20 74 6d 70 52  owid, iEph, tmpR
bc00: 65 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  eg);.      if( n
bc10: 41 72 67 3c 32 20 29 7b 0a 20 20 20 20 20 20 20  Arg<2 ){.       
bc20: 20 69 6e 74 20 76 61 6c 20 3d 20 28 70 46 75 6e   int val = (pFun
bc30: 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61  c->zName==leadNa
bc40: 6d 65 20 3f 20 31 20 3a 20 2d 31 29 3b 0a 20 20  me ? 1 : -1);.  
bc50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
bc60: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
bc70: 64 49 6d 6d 2c 20 74 6d 70 52 65 67 2c 20 76 61  dImm, tmpReg, va
bc80: 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  l);.      }else{
bc90: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70 20  .        int op 
bca0: 3d 20 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d  = (pFunc->zName=
bcb0: 3d 6c 65 61 64 4e 61 6d 65 20 3f 20 4f 50 5f 41  =leadName ? OP_A
bcc0: 64 64 20 3a 20 4f 50 5f 53 75 62 74 72 61 63 74  dd : OP_Subtract
bcd0: 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74  );.        int t
bce0: 6d 70 52 65 67 32 20 3d 20 73 71 6c 69 74 65 33  mpReg2 = sqlite3
bcf0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
bd00: 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
bd10: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
bd20: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 45 70 68   OP_Column, iEph
bd30: 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b  , pWin->iArgCol+
bd40: 31 2c 20 74 6d 70 52 65 67 32 29 3b 0a 20 20 20  1, tmpReg2);.   
bd50: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bd60: 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 74 6d  AddOp3(v, op, tm
bd70: 70 52 65 67 32 2c 20 74 6d 70 52 65 67 2c 20 74  pReg2, tmpReg, t
bd80: 6d 70 52 65 67 29 3b 0a 20 20 20 20 20 20 20 20  mpReg);.        
bd90: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
bda0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 74 6d  mpReg(pParse, tm
bdb0: 70 52 65 67 32 29 3b 0a 20 20 20 20 20 20 7d 0a  pReg2);.      }.
bdc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
bdd0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
bde0: 65 65 6b 52 6f 77 69 64 2c 20 63 73 72 2c 20 6c  eekRowid, csr, l
bdf0: 62 6c 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20  bl, tmpReg);.   
be00: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
be10: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
be20: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
be30: 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20 70  P_Column, csr, p
be40: 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2c 20 70 57  Win->iArgCol, pW
be50: 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a  in->regResult);.
be60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
be70: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
be80: 20 6c 62 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c   lbl);.      sql
be90: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
bea0: 65 67 28 70 50 61 72 73 65 2c 20 74 6d 70 52 65  eg(pParse, tmpRe
beb0: 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  g);.    }.  }.  
bec0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
bed0: 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
bee0: 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73  egGosub, addrGos
bef0: 75 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ub);.}../*.** Ge
bf00: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73  nerate code to s
bf10: 65 74 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  et the accumulat
bf20: 6f 72 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  or register for 
bf30: 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63  each window func
bf40: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 6c  tion.** in the l
bf50: 69 6e 6b 65 64 20 6c 69 73 74 20 70 61 73 73 65  inked list passe
bf60: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
bf70: 61 72 67 75 6d 65 6e 74 20 74 6f 20 4e 55 4c 4c  argument to NULL
bf80: 2e 20 41 6e 64 20 70 65 72 66 6f 72 6d 0a 2a 2a  . And perform.**
bf90: 20 61 6e 79 20 65 71 75 69 76 61 6c 65 6e 74 20   any equivalent 
bfa0: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 72  initialization r
bfb0: 65 71 75 69 72 65 64 20 62 79 20 61 6e 79 20 62  equired by any b
bfc0: 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66  uilt-in window f
bfd0: 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 74  unctions.** in t
bfe0: 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  he list..*/.stat
bff0: 69 63 20 69 6e 74 20 77 69 6e 64 6f 77 49 6e 69  ic int windowIni
c000: 74 41 63 63 75 6d 28 50 61 72 73 65 20 2a 70 50  tAccum(Parse *pP
c010: 61 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70 4d  arse, Window *pM
c020: 57 69 6e 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  Win){.  Vdbe *v 
c030: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
c040: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
c050: 72 65 67 41 72 67 3b 0a 20 20 69 6e 74 20 6e 41  regArg;.  int nA
c060: 72 67 20 3d 20 30 3b 0a 20 20 57 69 6e 64 6f 77  rg = 0;.  Window
c070: 20 2a 70 57 69 6e 3b 0a 20 20 66 6f 72 28 70 57   *pWin;.  for(pW
c080: 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20  in=pMWin; pWin; 
c090: 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74  pWin=pWin->pNext
c0a0: 57 69 6e 29 7b 0a 20 20 20 20 46 75 6e 63 44 65  Win){.    FuncDe
c0b0: 66 20 2a 70 46 75 6e 63 20 3d 20 70 57 69 6e 2d  f *pFunc = pWin-
c0c0: 3e 70 46 75 6e 63 3b 0a 20 20 20 20 73 71 6c 69  >pFunc;.    sqli
c0d0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
c0e0: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69   OP_Null, 0, pWi
c0f0: 6e 2d 3e 72 65 67 41 63 63 75 6d 29 3b 0a 20 20  n->regAccum);.  
c100: 20 20 6e 41 72 67 20 3d 20 4d 41 58 28 6e 41 72    nArg = MAX(nAr
c110: 67 2c 20 77 69 6e 64 6f 77 41 72 67 43 6f 75 6e  g, windowArgCoun
c120: 74 28 70 57 69 6e 29 29 3b 0a 20 20 20 20 69 66  t(pWin));.    if
c130: 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d  ( pFunc->zName==
c140: 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 0a 20 20  nth_valueName.  
c150: 20 20 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61     || pFunc->zNa
c160: 6d 65 3d 3d 66 69 72 73 74 5f 76 61 6c 75 65 4e  me==first_valueN
c170: 61 6d 65 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ame.    ){.     
c180: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c190: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
c1a0: 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70  , 0, pWin->regAp
c1b0: 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
c1c0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
c1d0: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 57  P_Integer, 0, pW
c1e0: 69 6e 2d 3e 72 65 67 41 70 70 2b 31 29 3b 0a 20  in->regApp+1);. 
c1f0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70     }..    if( (p
c200: 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20  Func->funcFlags 
c210: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49  & SQLITE_FUNC_MI
c220: 4e 4d 41 58 29 20 26 26 20 70 57 69 6e 2d 3e 63  NMAX) && pWin->c
c230: 73 72 41 70 70 20 29 7b 0a 20 20 20 20 20 20 61  srApp ){.      a
c240: 73 73 65 72 74 28 20 70 57 69 6e 2d 3e 65 53 74  ssert( pWin->eSt
c250: 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  art!=TK_UNBOUNDE
c260: 44 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  D );.      sqlit
c270: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
c280: 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20  OP_ResetSorter, 
c290: 70 57 69 6e 2d 3e 63 73 72 41 70 70 29 3b 0a 20  pWin->csrApp);. 
c2a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c2b0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
c2c0: 65 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d 3e 72  eger, 0, pWin->r
c2d0: 65 67 41 70 70 2b 31 29 3b 0a 20 20 20 20 7d 0a  egApp+1);.    }.
c2e0: 20 20 7d 0a 20 20 72 65 67 41 72 67 20 3d 20 70    }.  regArg = p
c2f0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
c300: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
c310: 20 6e 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20   nArg;.  return 
c320: 72 65 67 41 72 67 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  regArg;.}../* .*
c330: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
c340: 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 61   the current fra
c350: 6d 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61 63  me should be cac
c360: 68 65 64 20 69 6e 20 74 68 65 20 65 70 68 65 6d  hed in the ephem
c370: 65 72 61 6c 20 74 61 62 6c 65 2c 0a 2a 2a 20 65  eral table,.** e
c380: 76 65 6e 20 69 66 20 74 68 65 72 65 20 61 72 65  ven if there are
c390: 20 6e 6f 20 78 49 6e 76 65 72 73 65 28 29 20 63   no xInverse() c
c3a0: 61 6c 6c 73 20 72 65 71 75 69 72 65 64 2e 0a 2a  alls required..*
c3b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
c3c0: 64 6f 77 43 61 63 68 65 46 72 61 6d 65 28 57 69  dowCacheFrame(Wi
c3d0: 6e 64 6f 77 20 2a 70 4d 57 69 6e 29 7b 0a 20 20  ndow *pMWin){.  
c3e0: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20  Window *pWin;.  
c3f0: 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20  for(pWin=pMWin; 
c400: 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d  pWin; pWin=pWin-
c410: 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20  >pNextWin){.    
c420: 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20 3d  FuncDef *pFunc =
c430: 20 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20   pWin->pFunc;.  
c440: 20 20 69 66 28 20 28 70 46 75 6e 63 2d 3e 7a 4e    if( (pFunc->zN
c450: 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e 61  ame==nth_valueNa
c460: 6d 65 29 0a 20 20 20 20 20 7c 7c 20 28 70 46 75  me).     || (pFu
c470: 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72 73 74  nc->zName==first
c480: 5f 76 61 6c 75 65 4e 61 6d 65 29 0a 20 20 20 20  _valueName).    
c490: 20 7c 7c 20 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d   || (pFunc->zNam
c4a0: 65 3d 3d 6c 65 61 64 4e 61 6d 65 29 0a 20 20 20  e==leadName).   
c4b0: 20 20 7c 7c 20 28 70 46 75 6e 63 2d 3e 7a 4e 61    || (pFunc->zNa
c4c0: 6d 65 3d 3d 6c 61 67 4e 61 6d 65 29 0a 20 20 20  me==lagName).   
c4d0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
c4e0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
c4f0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
c500: 2a 2a 20 72 65 67 4f 6c 64 20 61 6e 64 20 72 65  ** regOld and re
c510: 67 4e 65 77 20 61 72 65 20 65 61 63 68 20 74 68  gNew are each th
c520: 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72  e first register
c530: 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20   in an array of 
c540: 73 69 7a 65 0a 2a 2a 20 70 4f 72 64 65 72 42 79  size.** pOrderBy
c550: 2d 3e 6e 45 78 70 72 2e 20 54 68 69 73 20 66 75  ->nExpr. This fu
c560: 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61 74 65 73  nction generates
c570: 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70 61 72 65   code to compare
c580: 20 74 68 65 20 74 77 6f 0a 2a 2a 20 61 72 72 61   the two.** arra
c590: 79 73 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ys of registers 
c5a0: 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74  using the collat
c5b0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20 61 6e  ion sequences an
c5c0: 64 20 6f 74 68 65 72 20 63 6f 6d 70 61 72 69 73  d other comparis
c5d0: 6f 6e 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73  on.** parameters
c5e0: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 4f   specified by pO
c5f0: 72 64 65 72 42 79 2e 20 0a 2a 2a 0a 2a 2a 20 49  rderBy. .**.** I
c600: 66 20 74 68 65 20 74 77 6f 20 61 72 72 61 79 73  f the two arrays
c610: 20 61 72 65 20 6e 6f 74 20 65 71 75 61 6c 2c 20   are not equal, 
c620: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
c630: 72 65 67 4e 65 77 20 69 73 20 63 6f 70 69 65 64  regNew is copied
c640: 20 74 6f 20 0a 2a 2a 20 72 65 67 4f 6c 64 20 61   to .** regOld a
c650: 6e 64 20 63 6f 6e 74 72 6f 6c 20 66 61 6c 6c 73  nd control falls
c660: 20 74 68 72 6f 75 67 68 2e 20 4f 74 68 65 72 77   through. Otherw
c670: 69 73 65 2c 20 69 66 20 74 68 65 20 63 6f 6e 74  ise, if the cont
c680: 65 6e 74 73 20 6f 66 20 74 68 65 20 61 72 72 61  ents of the arra
c690: 79 73 0a 2a 2a 20 61 72 65 20 65 71 75 61 6c 2c  ys.** are equal,
c6a0: 20 61 6e 20 4f 50 5f 47 6f 74 6f 20 69 73 20 65   an OP_Goto is e
c6b0: 78 65 63 75 74 65 64 2e 20 54 68 65 20 61 64 64  xecuted. The add
c6c0: 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 47  ress of the OP_G
c6d0: 6f 74 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e  oto is returned.
c6e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c6f0: 77 69 6e 64 6f 77 49 66 4e 65 77 50 65 65 72 28  windowIfNewPeer(
c700: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
c710: 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  ,.  ExprList *pO
c720: 72 64 65 72 42 79 2c 0a 20 20 69 6e 74 20 72 65  rderBy,.  int re
c730: 67 4e 65 77 2c 20 20 20 20 20 20 20 20 20 20 20  gNew,           
c740: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
c750: 73 74 20 69 6e 20 61 72 72 61 79 20 6f 66 20 6e  st in array of n
c760: 65 77 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69  ew values */.  i
c770: 6e 74 20 72 65 67 4f 6c 64 2c 20 20 20 20 20 20  nt regOld,      
c780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c790: 2a 20 46 69 72 73 74 20 69 6e 20 61 72 72 61 79  * First in array
c7a0: 20 6f 66 20 6f 6c 64 20 76 61 6c 75 65 73 20 2a   of old values *
c7b0: 2f 0a 20 20 69 6e 74 20 61 64 64 72 20 20 20 20  /.  int addr    
c7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7d0: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
c7e0: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
c7f0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
c800: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
c810: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
c820: 20 69 6e 74 20 6e 56 61 6c 20 3d 20 70 4f 72 64   int nVal = pOrd
c830: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  erBy->nExpr;.   
c840: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
c850: 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  fo = sqlite3KeyI
c860: 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
c870: 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
c880: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
c890: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
c8a0: 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65  , OP_Compare, re
c8b0: 67 4f 6c 64 2c 20 72 65 67 4e 65 77 2c 20 6e 56  gOld, regNew, nV
c8c0: 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  al);.    sqlite3
c8d0: 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20  VdbeAppendP4(v, 
c8e0: 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2c  (void*)pKeyInfo,
c8f0: 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
c900: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c910: 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
c920: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c930: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
c940: 2b 31 2c 20 61 64 64 72 2c 20 73 71 6c 69 74 65  +1, addr, sqlite
c950: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
c960: 28 76 29 2b 31 0a 20 20 20 20 29 3b 0a 20 20 20  (v)+1.    );.   
c970: 20 56 64 62 65 43 6f 76 65 72 61 67 65 45 71 4e   VdbeCoverageEqN
c980: 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
c990: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
c9a0: 50 5f 43 6f 70 79 2c 20 72 65 67 4e 65 77 2c 20  P_Copy, regNew, 
c9b0: 72 65 67 4f 6c 64 2c 20 6e 56 61 6c 2d 31 29 3b  regOld, nVal-1);
c9c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
c9d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
c9e0: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
c9f0: 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 74 79 70  ddr);.  }.}..typ
ca00: 65 64 65 66 20 73 74 72 75 63 74 20 57 69 6e 64  edef struct Wind
ca10: 6f 77 43 6f 64 65 41 72 67 20 57 69 6e 64 6f 77  owCodeArg Window
ca20: 43 6f 64 65 41 72 67 3b 0a 74 79 70 65 64 65 66  CodeArg;.typedef
ca30: 20 73 74 72 75 63 74 20 57 69 6e 64 6f 77 43 73   struct WindowCs
ca40: 72 41 6e 64 52 65 67 20 57 69 6e 64 6f 77 43 73  rAndReg WindowCs
ca50: 72 41 6e 64 52 65 67 3b 0a 73 74 72 75 63 74 20  rAndReg;.struct 
ca60: 57 69 6e 64 6f 77 43 73 72 41 6e 64 52 65 67 20  WindowCsrAndReg 
ca70: 7b 0a 20 20 69 6e 74 20 63 73 72 3b 0a 20 20 69  {.  int csr;.  i
ca80: 6e 74 20 72 65 67 3b 0a 7d 3b 0a 0a 73 74 72 75  nt reg;.};..stru
ca90: 63 74 20 57 69 6e 64 6f 77 43 6f 64 65 41 72 67  ct WindowCodeArg
caa0: 20 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72   {.  Parse *pPar
cab0: 73 65 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d  se;.  Window *pM
cac0: 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 70 56 64  Win;.  Vdbe *pVd
cad0: 62 65 3b 0a 20 20 69 6e 74 20 72 65 67 47 6f 73  be;.  int regGos
cae0: 75 62 3b 0a 20 20 69 6e 74 20 61 64 64 72 47 6f  ub;.  int addrGo
caf0: 73 75 62 3b 0a 20 20 69 6e 74 20 72 65 67 41 72  sub;.  int regAr
cb00: 67 3b 0a 20 20 69 6e 74 20 65 44 65 6c 65 74 65  g;.  int eDelete
cb10: 3b 0a 0a 20 20 57 69 6e 64 6f 77 43 73 72 41 6e  ;..  WindowCsrAn
cb20: 64 52 65 67 20 73 74 61 72 74 3b 0a 20 20 57 69  dReg start;.  Wi
cb30: 6e 64 6f 77 43 73 72 41 6e 64 52 65 67 20 63 75  ndowCsrAndReg cu
cb40: 72 72 65 6e 74 3b 0a 20 20 57 69 6e 64 6f 77 43  rrent;.  WindowC
cb50: 73 72 41 6e 64 52 65 67 20 65 6e 64 3b 0a 7d 3b  srAndReg end;.};
cb60: 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 75 65 73 20 74  ../*.** Values t
cb70: 68 61 74 20 6d 61 79 20 62 65 20 70 61 73 73 65  hat may be passe
cb80: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
cb90: 61 72 67 75 6d 65 6e 74 20 74 6f 20 77 69 6e 64  argument to wind
cba0: 6f 77 43 6f 64 65 4f 70 28 29 2e 0a 2a 2f 0a 23  owCodeOp()..*/.#
cbb0: 64 65 66 69 6e 65 20 57 49 4e 44 4f 57 5f 52 45  define WINDOW_RE
cbc0: 54 55 52 4e 5f 52 4f 57 20 31 0a 23 64 65 66 69  TURN_ROW 1.#defi
cbd0: 6e 65 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56  ne WINDOW_AGGINV
cbe0: 45 52 53 45 20 32 0a 23 64 65 66 69 6e 65 20 57  ERSE 2.#define W
cbf0: 49 4e 44 4f 57 5f 41 47 47 53 54 45 50 20 20 20  INDOW_AGGSTEP   
cc00: 20 33 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61   3../*.** Genera
cc10: 74 65 20 56 4d 20 63 6f 64 65 20 74 6f 20 72 65  te VM code to re
cc20: 61 64 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72  ad the window fr
cc30: 61 6d 65 73 20 70 65 65 72 20 76 61 6c 75 65 73  ames peer values
cc40: 20 66 72 6f 6d 20 63 75 72 73 6f 72 20 63 73 72   from cursor csr
cc50: 20 69 6e 74 6f 0a 2a 2a 20 61 6e 20 61 72 72 61   into.** an arra
cc60: 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 73  y of registers s
cc70: 74 61 72 74 69 6e 67 20 61 74 20 72 65 67 2e 0a  tarting at reg..
cc80: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
cc90: 69 6e 64 6f 77 52 65 61 64 50 65 65 72 56 61 6c  indowReadPeerVal
cca0: 75 65 73 28 0a 20 20 57 69 6e 64 6f 77 43 6f 64  ues(.  WindowCod
ccb0: 65 41 72 67 20 2a 70 2c 0a 20 20 69 6e 74 20 63  eArg *p,.  int c
ccc0: 73 72 2c 0a 20 20 69 6e 74 20 72 65 67 0a 29 7b  sr,.  int reg.){
ccd0: 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e  .  Window *pMWin
cce0: 20 3d 20 70 2d 3e 70 4d 57 69 6e 3b 0a 20 20 45   = p->pMWin;.  E
ccf0: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
cd00: 79 20 3d 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65  y = pMWin->pOrde
cd10: 72 42 79 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  rBy;.  if( pOrde
cd20: 72 42 79 20 29 7b 0a 20 20 20 20 56 64 62 65 20  rBy ){.    Vdbe 
cd30: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
cd40: 64 62 65 28 70 2d 3e 70 50 61 72 73 65 29 3b 0a  dbe(p->pParse);.
cd50: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 50      ExprList *pP
cd60: 61 72 74 20 3d 20 70 4d 57 69 6e 2d 3e 70 50 61  art = pMWin->pPa
cd70: 72 74 69 74 69 6f 6e 3b 0a 20 20 20 20 69 6e 74  rtition;.    int
cd80: 20 69 43 6f 6c 4f 66 66 20 3d 20 70 4d 57 69 6e   iColOff = pMWin
cd90: 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 20 2b 20 28  ->nBufferCol + (
cda0: 70 50 61 72 74 20 3f 20 70 50 61 72 74 2d 3e 6e  pPart ? pPart->n
cdb0: 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 69  Expr : 0);.    i
cdc0: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
cdd0: 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  0; i<pOrderBy->n
cde0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
cdf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ce00: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
ce10: 2c 20 63 73 72 2c 20 69 43 6f 6c 4f 66 66 2b 69  , csr, iColOff+i
ce20: 2c 20 72 65 67 2b 69 29 3b 0a 20 20 20 20 7d 0a  , reg+i);.    }.
ce30: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
ce40: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
ce50: 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  lled as part of 
ce60: 67 65 6e 65 72 61 74 69 6e 67 20 56 4d 20 70 72  generating VM pr
ce70: 6f 67 72 61 6d 73 20 66 6f 72 20 52 41 4e 47 45  ograms for RANGE
ce80: 0a 2a 2a 20 6f 66 66 73 65 74 20 50 52 45 43 45  .** offset PRECE
ce90: 44 49 4e 47 2f 46 4f 4c 4c 4f 57 49 4e 47 20 66  DING/FOLLOWING f
cea0: 72 61 6d 65 20 62 6f 75 6e 64 61 72 69 65 73 2e  rame boundaries.
ceb0: 20 49 74 20 67 65 6e 65 72 61 74 65 73 20 63 6f   It generates co
cec0: 64 65 20 65 71 75 69 76 61 6c 65 6e 74 0a 2a 2a  de equivalent.**
ced0: 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28   to:.**.**   if(
cee0: 20 63 73 72 31 2e 70 65 65 72 56 61 6c 20 2b 20   csr1.peerVal + 
cef0: 72 65 67 56 61 6c 20 3e 3d 20 63 73 72 32 2e 70  regVal >= csr2.p
cf00: 65 65 72 56 61 6c 20 29 20 67 6f 74 6f 20 6c 62  eerVal ) goto lb
cf10: 6c 3b 0a 2a 2a 20 20 20 69 66 28 20 63 73 72 31  l;.**   if( csr1
cf20: 2e 72 6f 77 69 64 20 3e 3d 20 63 73 72 32 2e 72  .rowid >= csr2.r
cf30: 6f 77 69 64 20 29 20 67 6f 74 6f 20 6c 62 6c 3b  owid ) goto lbl;
cf40: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
cf50: 77 69 6e 64 6f 77 43 6f 64 65 52 61 6e 67 65 54  windowCodeRangeT
cf60: 65 73 74 28 0a 20 20 57 69 6e 64 6f 77 43 6f 64  est(.  WindowCod
cf70: 65 41 72 67 20 2a 70 2c 20 0a 20 20 69 6e 74 20  eArg *p, .  int 
cf80: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
cf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cfa0: 4f 50 5f 47 65 20 6f 72 20 4f 50 5f 47 74 20 2a  OP_Ge or OP_Gt *
cfb0: 2f 0a 20 20 69 6e 74 20 63 73 72 31 2c 20 0a 20  /.  int csr1, . 
cfc0: 20 69 6e 74 20 72 65 67 56 61 6c 2c 20 0a 20 20   int regVal, .  
cfd0: 69 6e 74 20 63 73 72 32 2c 0a 20 20 69 6e 74 20  int csr2,.  int 
cfe0: 6c 62 6c 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a  lbl.){.  Parse *
cff0: 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72  pParse = p->pPar
d000: 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  se;.  Vdbe *v = 
d010: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
d020: 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 65  Parse);.  int re
d030: 67 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  g1 = sqlite3GetT
d040: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
d050: 20 20 69 6e 74 20 72 65 67 32 20 3d 20 73 71 6c    int reg2 = sql
d060: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
d070: 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 61 72  Parse);.  int ar
d080: 69 74 68 20 3d 20 4f 50 5f 41 64 64 3b 0a 0a 20  ith = OP_Add;.. 
d090: 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 4f 50 5f   assert( op==OP_
d0a0: 47 65 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20  Ge || op==OP_Gt 
d0b0: 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a  || op==OP_Le );.
d0c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4d 57    assert( p->pMW
d0d0: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20  in->pOrderBy && 
d0e0: 70 2d 3e 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72  p->pMWin->pOrder
d0f0: 42 79 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a  By->nExpr==1 );.
d100: 20 20 69 66 28 20 70 2d 3e 70 4d 57 69 6e 2d 3e    if( p->pMWin->
d110: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 73  pOrderBy->a[0].s
d120: 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20 20 20 20  ortOrder ){.    
d130: 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
d140: 20 20 20 20 63 61 73 65 20 4f 50 5f 47 65 3a 20      case OP_Ge: 
d150: 6f 70 20 3d 20 4f 50 5f 4c 65 3b 20 62 72 65 61  op = OP_Le; brea
d160: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
d170: 5f 47 74 3a 20 6f 70 20 3d 20 4f 50 5f 4c 74 3b  _Gt: op = OP_Lt;
d180: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 64 65   break;.      de
d190: 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20 6f  fault: assert( o
d1a0: 70 3d 3d 4f 50 5f 4c 65 20 29 3b 20 6f 70 20 3d  p==OP_Le ); op =
d1b0: 20 4f 50 5f 47 65 3b 20 62 72 65 61 6b 3b 0a 20   OP_Ge; break;. 
d1c0: 20 20 20 7d 0a 20 20 20 20 61 72 69 74 68 20 3d     }.    arith =
d1d0: 20 4f 50 5f 53 75 62 74 72 61 63 74 3b 0a 20 20   OP_Subtract;.  
d1e0: 7d 0a 0a 20 20 77 69 6e 64 6f 77 52 65 61 64 50  }..  windowReadP
d1f0: 65 65 72 56 61 6c 75 65 73 28 70 2c 20 63 73 72  eerValues(p, csr
d200: 31 2c 20 72 65 67 31 29 3b 0a 20 20 77 69 6e 64  1, reg1);.  wind
d210: 6f 77 52 65 61 64 50 65 65 72 56 61 6c 75 65 73  owReadPeerValues
d220: 28 70 2c 20 63 73 72 32 2c 20 72 65 67 32 29 3b  (p, csr2, reg2);
d230: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
d240: 64 4f 70 33 28 76 2c 20 61 72 69 74 68 2c 20 72  dOp3(v, arith, r
d250: 65 67 56 61 6c 2c 20 72 65 67 31 2c 20 72 65 67  egVal, reg1, reg
d260: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
d270: 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72  eAddOp3(v, op, r
d280: 65 67 32 2c 20 6c 62 6c 2c 20 72 65 67 31 29 3b  eg2, lbl, reg1);
d290: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
d2a0: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64  dOp2(v, OP_Rowid
d2b0: 2c 20 63 73 72 31 2c 20 72 65 67 31 29 3b 0a 20  , csr1, reg1);. 
d2c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d2d0: 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20  p2(v, OP_Rowid, 
d2e0: 63 73 72 32 2c 20 72 65 67 32 29 3b 0a 20 20 73  csr2, reg2);.  s
d2f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
d300: 28 76 2c 20 4f 50 5f 47 74 2c 20 72 65 67 32 2c  (v, OP_Gt, reg2,
d310: 20 6c 62 6c 2c 20 72 65 67 31 29 3b 0a 20 20 73   lbl, reg1);.  s
d320: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
d330: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
d340: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  1);.  sqlite3Rel
d350: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
d360: 73 65 2c 20 72 65 67 32 29 3b 0a 7d 0a 0a 73 74  se, reg2);.}..st
d370: 61 74 69 63 20 69 6e 74 20 77 69 6e 64 6f 77 43  atic int windowC
d380: 6f 64 65 4f 70 28 0a 20 57 69 6e 64 6f 77 43 6f  odeOp(. WindowCo
d390: 64 65 41 72 67 20 2a 70 2c 0a 20 69 6e 74 20 6f  deArg *p,. int o
d3a0: 70 2c 0a 20 69 6e 74 20 72 65 67 43 6f 75 6e 74  p,. int regCount
d3b0: 64 6f 77 6e 2c 0a 20 69 6e 74 20 6a 75 6d 70 4f  down,. int jumpO
d3c0: 6e 45 6f 66 0a 29 7b 0a 20 20 69 6e 74 20 63 73  nEof.){.  int cs
d3d0: 72 2c 20 72 65 67 3b 0a 20 20 50 61 72 73 65 20  r, reg;.  Parse 
d3e0: 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61  *pParse = p->pPa
d3f0: 72 73 65 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70  rse;.  Window *p
d400: 4d 57 69 6e 20 3d 20 70 2d 3e 70 4d 57 69 6e 3b  MWin = p->pMWin;
d410: 0a 20 20 69 6e 74 20 72 65 74 20 3d 20 30 3b 0a  .  int ret = 0;.
d420: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 2d 3e 70    Vdbe *v = p->p
d430: 56 64 62 65 3b 0a 20 20 69 6e 74 20 61 64 64 72  Vdbe;.  int addr
d440: 49 66 20 3d 20 30 3b 20 0a 20 20 69 6e 74 20 61  If = 0; .  int a
d450: 64 64 72 43 6f 6e 74 69 6e 75 65 20 3d 20 30 3b  ddrContinue = 0;
d460: 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 74 6f 20  .  int addrGoto 
d470: 3d 20 30 3b 0a 20 20 69 6e 74 20 62 50 65 65 72  = 0;.  int bPeer
d480: 20 3d 20 28 70 4d 57 69 6e 2d 3e 65 54 79 70 65   = (pMWin->eType
d490: 21 3d 54 4b 5f 52 4f 57 53 29 3b 0a 0a 20 20 69  !=TK_ROWS);..  i
d4a0: 6e 74 20 6c 62 6c 44 6f 6e 65 20 3d 20 73 71 6c  nt lblDone = sql
d4b0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
d4c0: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  l(pParse);.  int
d4d0: 20 61 64 64 72 4e 65 78 74 52 61 6e 67 65 20 3d   addrNextRange =
d4e0: 20 30 3b 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61   0;..  /* Specia
d4f0: 6c 20 63 61 73 65 20 2d 20 57 49 4e 44 4f 57 5f  l case - WINDOW_
d500: 41 47 47 49 4e 56 45 52 53 45 20 69 73 20 61 6c  AGGINVERSE is al
d510: 77 61 79 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  ways a no-op if 
d520: 74 68 65 20 66 72 61 6d 65 0a 20 20 2a 2a 20 73  the frame.  ** s
d530: 74 61 72 74 73 20 77 69 74 68 20 55 4e 42 4f 55  tarts with UNBOU
d540: 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 2e 20  NDED PRECEDING. 
d550: 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 57 49 4e  */.  if( op==WIN
d560: 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 20 26  DOW_AGGINVERSE &
d570: 26 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d  & pMWin->eStart=
d580: 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b  =TK_UNBOUNDED ){
d590: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 65 67  .    assert( reg
d5a0: 43 6f 75 6e 74 64 6f 77 6e 3d 3d 30 20 26 26 20  Countdown==0 && 
d5b0: 6a 75 6d 70 4f 6e 45 6f 66 3d 3d 30 20 29 3b 0a  jumpOnEof==0 );.
d5c0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
d5d0: 7d 0a 0a 20 20 69 66 28 20 72 65 67 43 6f 75 6e  }..  if( regCoun
d5e0: 74 64 6f 77 6e 3e 30 20 29 7b 0a 20 20 20 20 69  tdown>0 ){.    i
d5f0: 66 28 20 70 4d 57 69 6e 2d 3e 65 54 79 70 65 3d  f( pMWin->eType=
d600: 3d 54 4b 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20  =TK_RANGE ){.   
d610: 20 20 20 61 64 64 72 4e 65 78 74 52 61 6e 67 65     addrNextRange
d620: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
d630: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20  rrentAddr(v);.. 
d640: 20 20 20 20 20 73 77 69 74 63 68 28 20 6f 70 20       switch( op 
d650: 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ){.        case 
d660: 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f  WINDOW_RETURN_RO
d670: 57 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 61  W: {.          a
d680: 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20  ssert( 0 );.    
d690: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d6a0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
d6b0: 63 61 73 65 20 57 49 4e 44 4f 57 5f 41 47 47 49  case WINDOW_AGGI
d6c0: 4e 56 45 52 53 45 3a 20 7b 0a 20 20 20 20 20 20  NVERSE: {.      
d6d0: 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65      if( pMWin->e
d6e0: 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57  Start==TK_FOLLOW
d6f0: 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ING ){.         
d700: 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 52 61 6e     windowCodeRan
d710: 67 65 54 65 73 74 28 0a 20 20 20 20 20 20 20 20  geTest(.        
d720: 20 20 20 20 20 20 20 20 70 2c 20 4f 50 5f 4c 65          p, OP_Le
d730: 2c 20 70 2d 3e 63 75 72 72 65 6e 74 2e 63 73 72  , p->current.csr
d740: 2c 20 72 65 67 43 6f 75 6e 74 64 6f 77 6e 2c 20  , regCountdown, 
d750: 70 2d 3e 73 74 61 72 74 2e 63 73 72 2c 20 6c 62  p->start.csr, lb
d760: 6c 44 6f 6e 65 0a 20 20 20 20 20 20 20 20 20 20  lDone.          
d770: 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d    );.          }
d780: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
d790: 20 20 77 69 6e 64 6f 77 43 6f 64 65 52 61 6e 67    windowCodeRang
d7a0: 65 54 65 73 74 28 0a 20 20 20 20 20 20 20 20 20  eTest(.         
d7b0: 20 20 20 20 20 20 20 70 2c 20 4f 50 5f 47 65 2c         p, OP_Ge,
d7c0: 20 70 2d 3e 73 74 61 72 74 2e 63 73 72 2c 20 72   p->start.csr, r
d7d0: 65 67 43 6f 75 6e 74 64 6f 77 6e 2c 20 70 2d 3e  egCountdown, p->
d7e0: 63 75 72 72 65 6e 74 2e 63 73 72 2c 20 6c 62 6c  current.csr, lbl
d7f0: 44 6f 6e 65 0a 20 20 20 20 20 20 20 20 20 20 20  Done.           
d800: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   );.          }.
d810: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
d820: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
d830: 20 20 20 20 63 61 73 65 20 57 49 4e 44 4f 57 5f      case WINDOW_
d840: 41 47 47 53 54 45 50 3a 20 7b 0a 20 20 20 20 20  AGGSTEP: {.     
d850: 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 52       windowCodeR
d860: 61 6e 67 65 54 65 73 74 28 0a 20 20 20 20 20 20  angeTest(.      
d870: 20 20 20 20 20 20 70 2c 20 4f 50 5f 47 74 2c 20        p, OP_Gt, 
d880: 70 2d 3e 65 6e 64 2e 63 73 72 2c 20 72 65 67 43  p->end.csr, regC
d890: 6f 75 6e 74 64 6f 77 6e 2c 20 70 2d 3e 63 75 72  ountdown, p->cur
d8a0: 72 65 6e 74 2e 63 73 72 2c 20 6c 62 6c 44 6f 6e  rent.csr, lblDon
d8b0: 65 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  e.          );. 
d8c0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
d8d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d8e0: 7d 0a 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  }..    }else{.  
d8f0: 20 20 20 20 61 64 64 72 49 66 20 3d 20 73 71 6c      addrIf = sql
d900: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
d910: 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 72 65 67 43  , OP_IfPos, regC
d920: 6f 75 6e 74 64 6f 77 6e 2c 20 30 2c 20 31 29 3b  ountdown, 0, 1);
d930: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
d940: 28 20 6f 70 3d 3d 57 49 4e 44 4f 57 5f 52 45 54  ( op==WINDOW_RET
d950: 55 52 4e 5f 52 4f 57 20 29 7b 0a 20 20 20 20 77  URN_ROW ){.    w
d960: 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 70 50  indowAggFinal(pP
d970: 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 30 29 3b  arse, pMWin, 0);
d980: 0a 20 20 7d 0a 20 20 61 64 64 72 43 6f 6e 74 69  .  }.  addrConti
d990: 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nue = sqlite3Vdb
d9a0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
d9b0: 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
d9c0: 0a 20 20 20 20 63 61 73 65 20 57 49 4e 44 4f 57  .    case WINDOW
d9d0: 5f 52 45 54 55 52 4e 5f 52 4f 57 3a 0a 20 20 20  _RETURN_ROW:.   
d9e0: 20 20 20 63 73 72 20 3d 20 70 2d 3e 63 75 72 72     csr = p->curr
d9f0: 65 6e 74 2e 63 73 72 3b 0a 20 20 20 20 20 20 72  ent.csr;.      r
da00: 65 67 20 3d 20 70 2d 3e 63 75 72 72 65 6e 74 2e  eg = p->current.
da10: 72 65 67 3b 0a 20 20 20 20 20 20 77 69 6e 64 6f  reg;.      windo
da20: 77 52 65 74 75 72 6e 4f 6e 65 52 6f 77 28 70 50  wReturnOneRow(pP
da30: 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 70 2d 3e  arse, pMWin, p->
da40: 72 65 67 47 6f 73 75 62 2c 20 70 2d 3e 61 64 64  regGosub, p->add
da50: 72 47 6f 73 75 62 29 3b 0a 20 20 20 20 20 20 62  rGosub);.      b
da60: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
da70: 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53  WINDOW_AGGINVERS
da80: 45 3a 0a 20 20 20 20 20 20 63 73 72 20 3d 20 70  E:.      csr = p
da90: 2d 3e 73 74 61 72 74 2e 63 73 72 3b 0a 20 20 20  ->start.csr;.   
daa0: 20 20 20 72 65 67 20 3d 20 70 2d 3e 73 74 61 72     reg = p->star
dab0: 74 2e 72 65 67 3b 0a 20 20 20 20 20 20 77 69 6e  t.reg;.      win
dac0: 64 6f 77 41 67 67 53 74 65 70 28 70 50 61 72 73  dowAggStep(pPars
dad0: 65 2c 20 70 4d 57 69 6e 2c 20 63 73 72 2c 20 31  e, pMWin, csr, 1
dae0: 2c 20 70 2d 3e 72 65 67 41 72 67 2c 20 30 29 3b  , p->regArg, 0);
daf0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
db00: 20 20 20 63 61 73 65 20 57 49 4e 44 4f 57 5f 41     case WINDOW_A
db10: 47 47 53 54 45 50 3a 0a 20 20 20 20 20 20 63 73  GGSTEP:.      cs
db20: 72 20 3d 20 70 2d 3e 65 6e 64 2e 63 73 72 3b 0a  r = p->end.csr;.
db30: 20 20 20 20 20 20 72 65 67 20 3d 20 70 2d 3e 65        reg = p->e
db40: 6e 64 2e 72 65 67 3b 0a 20 20 20 20 20 20 77 69  nd.reg;.      wi
db50: 6e 64 6f 77 41 67 67 53 74 65 70 28 70 50 61 72  ndowAggStep(pPar
db60: 73 65 2c 20 70 4d 57 69 6e 2c 20 63 73 72 2c 20  se, pMWin, csr, 
db70: 30 2c 20 70 2d 3e 72 65 67 41 72 67 2c 20 30 29  0, p->regArg, 0)
db80: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
db90: 20 7d 0a 0a 20 20 69 66 28 20 6f 70 3d 3d 70 2d   }..  if( op==p-
dba0: 3e 65 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20  >eDelete ){.    
dbb0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dbc0: 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20  1(v, OP_Delete, 
dbd0: 63 73 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  csr);.    sqlite
dbe0: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
dbf0: 20 4f 50 46 4c 41 47 5f 53 41 56 45 50 4f 53 49   OPFLAG_SAVEPOSI
dc00: 54 49 4f 4e 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  TION);.  }..  if
dc10: 28 20 6a 75 6d 70 4f 6e 45 6f 66 20 29 7b 0a 20  ( jumpOnEof ){. 
dc20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
dc30: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
dc40: 20 63 73 72 2c 20 73 71 6c 69 74 65 33 56 64 62   csr, sqlite3Vdb
dc50: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
dc60: 32 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 73 71  2);.    ret = sq
dc70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
dc80: 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 7d  v, OP_Goto);.  }
dc90: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
dca0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
dcb0: 50 5f 4e 65 78 74 2c 20 63 73 72 2c 20 73 71 6c  P_Next, csr, sql
dcc0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
dcd0: 64 64 72 28 76 29 2b 31 2b 62 50 65 65 72 29 3b  ddr(v)+1+bPeer);
dce0: 0a 20 20 20 20 69 66 28 20 62 50 65 65 72 20 29  .    if( bPeer )
dcf0: 7b 0a 20 20 20 20 20 20 61 64 64 72 47 6f 74 6f  {.      addrGoto
dd00: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
dd10: 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29  dOp0(v, OP_Goto)
dd20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
dd30: 66 28 20 62 50 65 65 72 20 29 7b 0a 20 20 20 20  f( bPeer ){.    
dd40: 69 6e 74 20 6e 52 65 67 20 3d 20 28 70 4d 57 69  int nReg = (pMWi
dd50: 6e 2d 3e 70 4f 72 64 65 72 42 79 20 3f 20 70 4d  n->pOrderBy ? pM
dd60: 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  Win->pOrderBy->n
dd70: 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 69  Expr : 0);.    i
dd80: 6e 74 20 72 65 67 54 6d 70 20 3d 20 28 6e 52 65  nt regTmp = (nRe
dd90: 67 20 3f 20 73 71 6c 69 74 65 33 47 65 74 54 65  g ? sqlite3GetTe
dda0: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
ddb0: 6e 52 65 67 29 20 3a 20 30 29 3b 0a 20 20 20 20  nReg) : 0);.    
ddc0: 77 69 6e 64 6f 77 52 65 61 64 50 65 65 72 56 61  windowReadPeerVa
ddd0: 6c 75 65 73 28 70 2c 20 63 73 72 2c 20 72 65 67  lues(p, csr, reg
dde0: 54 6d 70 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77  Tmp);.    window
ddf0: 49 66 4e 65 77 50 65 65 72 28 70 50 61 72 73 65  IfNewPeer(pParse
de00: 2c 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42  , pMWin->pOrderB
de10: 79 2c 20 72 65 67 54 6d 70 2c 20 72 65 67 2c 20  y, regTmp, reg, 
de20: 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  addrContinue);. 
de30: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
de40: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
de50: 65 2c 20 72 65 67 54 6d 70 2c 20 6e 52 65 67 29  e, regTmp, nReg)
de60: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 61 64 64  ;.  }..  if( add
de70: 72 4e 65 78 74 52 61 6e 67 65 20 29 7b 0a 20 20  rNextRange ){.  
de80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
de90: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
dea0: 30 2c 20 61 64 64 72 4e 65 78 74 52 61 6e 67 65  0, addrNextRange
deb0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
dec0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
ded0: 28 76 2c 20 6c 62 6c 44 6f 6e 65 29 3b 0a 20 20  (v, lblDone);.  
dee0: 69 66 28 20 61 64 64 72 47 6f 74 6f 20 29 20 73  if( addrGoto ) s
def0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
df00: 72 65 28 76 2c 20 61 64 64 72 47 6f 74 6f 29 3b  re(v, addrGoto);
df10: 0a 20 20 69 66 28 20 61 64 64 72 49 66 20 29 20  .  if( addrIf ) 
df20: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
df30: 65 72 65 28 76 2c 20 61 64 64 72 49 66 29 3b 0a  ere(v, addrIf);.
df40: 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a    return ret;.}.
df50: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
df60: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64 75   and return a du
df70: 70 6c 69 63 61 74 65 20 6f 66 20 74 68 65 20 57  plicate of the W
df80: 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 69 6e 64  indow object ind
df90: 69 63 61 74 65 64 20 62 79 20 74 68 65 0a 2a 2a  icated by the.**
dfa0: 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 2e   third argument.
dfb0: 20 53 65 74 20 74 68 65 20 57 69 6e 64 6f 77 2e   Set the Window.
dfc0: 70 4f 77 6e 65 72 20 66 69 65 6c 64 20 6f 66 20  pOwner field of 
dfd0: 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 74  the new object t
dfe0: 6f 0a 2a 2a 20 70 4f 77 6e 65 72 2e 0a 2a 2f 0a  o.** pOwner..*/.
dff0: 57 69 6e 64 6f 77 20 2a 73 71 6c 69 74 65 33 57  Window *sqlite3W
e000: 69 6e 64 6f 77 44 75 70 28 73 71 6c 69 74 65 33  indowDup(sqlite3
e010: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4f 77 6e   *db, Expr *pOwn
e020: 65 72 2c 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a  er, Window *p){.
e030: 20 20 57 69 6e 64 6f 77 20 2a 70 4e 65 77 20 3d    Window *pNew =
e040: 20 30 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53   0;.  if( ALWAYS
e050: 28 70 29 20 29 7b 0a 20 20 20 20 70 4e 65 77 20  (p) ){.    pNew 
e060: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
e070: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
e080: 28 57 69 6e 64 6f 77 29 29 3b 0a 20 20 20 20 69  (Window));.    i
e090: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
e0a0: 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 73   pNew->zName = s
e0b0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
e0c0: 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  b, p->zName);.  
e0d0: 20 20 20 20 70 4e 65 77 2d 3e 70 46 69 6c 74 65      pNew->pFilte
e0e0: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
e0f0: 75 70 28 64 62 2c 20 70 2d 3e 70 46 69 6c 74 65  up(db, p->pFilte
e100: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65  r, 0);.      pNe
e110: 77 2d 3e 70 46 75 6e 63 20 3d 20 70 2d 3e 70 46  w->pFunc = p->pF
e120: 75 6e 63 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  unc;.      pNew-
e130: 3e 70 50 61 72 74 69 74 69 6f 6e 20 3d 20 73 71  >pPartition = sq
e140: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
e150: 28 64 62 2c 20 70 2d 3e 70 50 61 72 74 69 74 69  (db, p->pPartiti
e160: 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e  on, 0);.      pN
e170: 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73  ew->pOrderBy = s
e180: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
e190: 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  p(db, p->pOrderB
e1a0: 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65  y, 0);.      pNe
e1b0: 77 2d 3e 65 54 79 70 65 20 3d 20 70 2d 3e 65 54  w->eType = p->eT
e1c0: 79 70 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  ype;.      pNew-
e1d0: 3e 65 45 6e 64 20 3d 20 70 2d 3e 65 45 6e 64 3b  >eEnd = p->eEnd;
e1e0: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 65 53 74  .      pNew->eSt
e1f0: 61 72 74 20 3d 20 70 2d 3e 65 53 74 61 72 74 3b  art = p->eStart;
e200: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 53 74  .      pNew->pSt
e210: 61 72 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  art = sqlite3Exp
e220: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 53 74 61  rDup(db, p->pSta
e230: 72 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e  rt, 0);.      pN
e240: 65 77 2d 3e 70 45 6e 64 20 3d 20 73 71 6c 69 74  ew->pEnd = sqlit
e250: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
e260: 3e 70 45 6e 64 2c 20 30 29 3b 0a 20 20 20 20 20  >pEnd, 0);.     
e270: 20 70 4e 65 77 2d 3e 70 4f 77 6e 65 72 20 3d 20   pNew->pOwner = 
e280: 70 4f 77 6e 65 72 3b 0a 20 20 20 20 7d 0a 20 20  pOwner;.    }.  
e290: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
e2a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
e2b0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6c   a copy of the l
e2c0: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 57 69  inked list of Wi
e2d0: 6e 64 6f 77 20 6f 62 6a 65 63 74 73 20 70 61 73  ndow objects pas
e2e0: 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 73 65  sed as the.** se
e2f0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
e300: 2f 0a 57 69 6e 64 6f 77 20 2a 73 71 6c 69 74 65  /.Window *sqlite
e310: 33 57 69 6e 64 6f 77 4c 69 73 74 44 75 70 28 73  3WindowListDup(s
e320: 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 6e 64  qlite3 *db, Wind
e330: 6f 77 20 2a 70 29 7b 0a 20 20 57 69 6e 64 6f 77  ow *p){.  Window
e340: 20 2a 70 57 69 6e 3b 0a 20 20 57 69 6e 64 6f 77   *pWin;.  Window
e350: 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 57 69   *pRet = 0;.  Wi
e360: 6e 64 6f 77 20 2a 2a 70 70 20 3d 20 26 70 52 65  ndow **pp = &pRe
e370: 74 3b 0a 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70  t;..  for(pWin=p
e380: 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69  ; pWin; pWin=pWi
e390: 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20  n->pNextWin){.  
e3a0: 20 20 2a 70 70 20 3d 20 73 71 6c 69 74 65 33 57    *pp = sqlite3W
e3b0: 69 6e 64 6f 77 44 75 70 28 64 62 2c 20 30 2c 20  indowDup(db, 0, 
e3c0: 70 57 69 6e 29 3b 0a 20 20 20 20 69 66 28 20 2a  pWin);.    if( *
e3d0: 70 70 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  pp==0 ) break;. 
e3e0: 20 20 20 70 70 20 3d 20 26 28 28 2a 70 70 29 2d     pp = &((*pp)-
e3f0: 3e 70 4e 65 78 74 57 69 6e 29 3b 0a 20 20 7d 0a  >pNextWin);.  }.
e400: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
e410: 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33  }../*.** sqlite3
e420: 57 68 65 72 65 42 65 67 69 6e 28 29 20 68 61 73  WhereBegin() has
e430: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
e440: 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 53 45 4c  lled for the SEL
e450: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a  ECT statement .*
e460: 2a 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  * passed as the 
e470: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
e480: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
e490: 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 2e 20 49  on is invoked. I
e4a0: 74 20 67 65 6e 65 72 61 74 65 73 0a 2a 2a 20 63  t generates.** c
e4b0: 6f 64 65 20 74 6f 20 70 6f 70 75 6c 61 74 65 20  ode to populate 
e4c0: 74 68 65 20 57 69 6e 64 6f 77 2e 72 65 67 52 65  the Window.regRe
e4d0: 73 75 6c 74 20 72 65 67 69 73 74 65 72 20 66 6f  sult register fo
e4e0: 72 20 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75  r each window fu
e4f0: 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 6e 64 20 69  nction .** and i
e500: 6e 76 6f 6b 65 20 74 68 65 20 73 75 62 2d 72 6f  nvoke the sub-ro
e510: 75 74 69 6e 65 20 61 74 20 69 6e 73 74 72 75 63  utine at instruc
e520: 74 69 6f 6e 20 61 64 64 72 47 6f 73 75 62 20 6f  tion addrGosub o
e530: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 72 6f 77  nce for each row
e540: 2e 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72  ..** sqlite3Wher
e550: 65 45 6e 64 28 29 20 69 73 20 61 6c 77 61 79 73  eEnd() is always
e560: 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 72   called before r
e570: 65 74 75 72 6e 69 6e 67 2e 20 0a 2a 2a 0a 2a 2a  eturning. .**.**
e580: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68   This function h
e590: 61 6e 64 6c 65 73 20 73 65 76 65 72 61 6c 20 64  andles several d
e5a0: 69 66 66 65 72 65 6e 74 20 74 79 70 65 73 20 6f  ifferent types o
e5b0: 66 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 73 2c  f window frames,
e5c0: 20 77 68 69 63 68 0a 2a 2a 20 72 65 71 75 69 72   which.** requir
e5d0: 65 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65  e slightly diffe
e5e0: 72 65 6e 74 20 70 72 6f 63 65 73 73 69 6e 67 2e  rent processing.
e5f0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   The following p
e600: 73 65 75 64 6f 20 63 6f 64 65 20 69 73 0a 2a 2a  seudo code is.**
e610: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
e620: 6e 74 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 73  nt window frames
e630: 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
e640: 0a 2a 2a 20 20 20 52 4f 57 53 20 42 45 54 57 45  .**   ROWS BETWE
e650: 45 4e 20 3c 65 78 70 72 31 3e 20 50 52 45 43 45  EN <expr1> PRECE
e660: 44 49 4e 47 20 41 4e 44 20 3c 65 78 70 72 32 3e  DING AND <expr2>
e670: 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a   FOLLOWING.**.**
e680: 20 4f 74 68 65 72 20 77 69 6e 64 6f 77 20 66 72   Other window fr
e690: 61 6d 65 20 74 79 70 65 73 20 75 73 65 20 76 61  ame types use va
e6a0: 72 69 61 6e 74 73 20 6f 66 20 74 68 65 20 66 6f  riants of the fo
e6b0: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
e6c0: 20 20 20 2e 2e 2e 20 6c 6f 6f 70 20 73 74 61 72     ... loop star
e6d0: 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 68  ted by sqlite3Wh
e6e0: 65 72 65 42 65 67 69 6e 28 29 20 2e 2e 2e 0a 2a  ereBegin() ....*
e6f0: 2a 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 20  *       if( new 
e700: 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20  partition ){.** 
e710: 20 20 20 20 20 20 20 20 47 6f 73 75 62 20 66 6c          Gosub fl
e720: 75 73 68 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a  ush.**       }.*
e730: 2a 20 20 20 20 20 20 20 49 6e 73 65 72 74 20 6e  *       Insert n
e740: 65 77 20 72 6f 77 20 69 6e 74 6f 20 65 70 68 20  ew row into eph 
e750: 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 20 20  table..**       
e760: 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 66 69  .**       if( fi
e770: 72 73 74 20 72 6f 77 20 6f 66 20 70 61 72 74 69  rst row of parti
e780: 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20  tion ){.**      
e790: 20 20 20 2f 2f 20 52 65 77 69 6e 64 20 74 68 72     // Rewind thr
e7a0: 65 65 20 63 75 72 73 6f 72 73 2c 20 61 6c 6c 20  ee cursors, all 
e7b0: 6f 70 65 6e 20 6f 6e 20 74 68 65 20 65 70 68 20  open on the eph 
e7c0: 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 20 20  table..**       
e7d0: 20 20 52 65 77 69 6e 64 28 63 73 72 45 6e 64 29    Rewind(csrEnd)
e7e0: 3b 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 65 77  ;.**         Rew
e7f0: 69 6e 64 28 63 73 72 53 74 61 72 74 29 3b 0a 2a  ind(csrStart);.*
e800: 2a 20 20 20 20 20 20 20 20 20 52 65 77 69 6e 64  *         Rewind
e810: 28 63 73 72 43 75 72 72 65 6e 74 29 3b 0a 2a 2a  (csrCurrent);.**
e820: 20 20 20 20 20 20 20 0a 2a 2a 20 20 20 20 20 20         .**      
e830: 20 20 20 72 65 67 45 6e 64 20 3d 20 3c 65 78 70     regEnd = <exp
e840: 72 32 3e 20 20 20 20 20 20 20 20 20 20 2f 2f 20  r2>          // 
e850: 46 4f 4c 4c 4f 57 49 4e 47 20 65 78 70 72 65 73  FOLLOWING expres
e860: 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  sion.**         
e870: 72 65 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72  regStart = <expr
e880: 31 3e 20 20 20 20 20 20 20 20 2f 2f 20 50 52 45  1>        // PRE
e890: 43 45 44 49 4e 47 20 65 78 70 72 65 73 73 69 6f  CEDING expressio
e8a0: 6e 0a 2a 2a 20 20 20 20 20 20 20 7d 65 6c 73 65  n.**       }else
e8b0: 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 2f 2f 20  {.**         // 
e8c0: 46 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20  First time this 
e8d0: 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 2c  branch is taken,
e8e0: 20 74 68 65 20 65 70 68 20 74 61 62 6c 65 20 63   the eph table c
e8f0: 6f 6e 74 61 69 6e 73 20 74 77 6f 20 0a 2a 2a 20  ontains two .** 
e900: 20 20 20 20 20 20 20 20 2f 2f 20 72 6f 77 73 2e          // rows.
e910: 20 54 68 65 20 66 69 72 73 74 20 72 6f 77 20 69   The first row i
e920: 6e 20 74 68 65 20 70 61 72 74 69 74 69 6f 6e 2c  n the partition,
e930: 20 77 68 69 63 68 20 61 6c 6c 20 74 68 72 65 65   which all three
e940: 20 63 75 72 73 6f 72 73 0a 2a 2a 20 20 20 20 20   cursors.**     
e950: 20 20 20 20 2f 2f 20 63 75 72 72 65 6e 74 6c 79      // currently
e960: 20 70 6f 69 6e 74 20 74 6f 2c 20 61 6e 64 20 74   point to, and t
e970: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 77  he following row
e980: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 47 47  ..**         AGG
e990: 53 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 20 20  STEP.**         
e9a0: 69 66 28 20 28 72 65 67 45 6e 64 2d 2d 29 3c 3d  if( (regEnd--)<=
e9b0: 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  0 ){.**         
e9c0: 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20    RETURN_ROW.** 
e9d0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 72            if( (r
e9e0: 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20 29 7b  egStart--)<=0 ){
e9f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
ea00: 41 47 47 49 4e 56 45 52 53 45 0a 2a 2a 20 20 20  AGGINVERSE.**   
ea10: 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20          }.**    
ea20: 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20       }.**       
ea30: 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20  }.**     }.**   
ea40: 20 20 66 6c 75 73 68 3a 0a 2a 2a 20 20 20 20 20    flush:.**     
ea50: 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20    AGGSTEP.**    
ea60: 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 2a     while( 1 ){.*
ea70: 2a 20 20 20 20 20 20 20 20 20 52 45 54 55 52 4e  *         RETURN
ea80: 20 52 4f 57 0a 2a 2a 20 20 20 20 20 20 20 20 20   ROW.**         
ea90: 69 66 28 20 63 73 72 43 75 72 72 65 6e 74 20 69  if( csrCurrent i
eaa0: 73 20 45 4f 46 20 29 20 62 72 65 61 6b 3b 0a 2a  s EOF ) break;.*
eab0: 2a 20 20 20 20 20 20 20 20 20 69 66 28 20 28 72  *         if( (r
eac0: 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20 29 7b  egStart--)<=0 ){
ead0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 67  .**           Ag
eae0: 67 49 6e 76 65 72 73 65 28 63 73 72 53 74 61 72  gInverse(csrStar
eaf0: 74 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  t).**           
eb00: 4e 65 78 74 28 63 73 72 53 74 61 72 74 29 0a 2a  Next(csrStart).*
eb10: 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  *         }.**  
eb20: 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 54 68 65       }.**.** The
eb30: 20 70 73 65 75 64 6f 2d 63 6f 64 65 20 61 62 6f   pseudo-code abo
eb40: 76 65 20 75 73 65 73 20 74 68 65 20 66 6f 6c 6c  ve uses the foll
eb50: 6f 77 69 6e 67 20 73 68 6f 72 74 68 61 6e 64 3a  owing shorthand:
eb60: 0a 2a 2a 0a 2a 2a 20 20 20 41 47 47 53 54 45 50  .**.**   AGGSTEP
eb70: 3a 20 20 20 20 69 6e 76 6f 6b 65 20 74 68 65 20  :    invoke the 
eb80: 61 67 67 72 65 67 61 74 65 20 78 53 74 65 70 28  aggregate xStep(
eb90: 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65  ) function for e
eba0: 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  ach window funct
ebb0: 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ion.**          
ebc0: 20 20 20 20 20 77 69 74 68 20 61 72 67 75 6d 65       with argume
ebd0: 6e 74 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68  nts read from th
ebe0: 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66  e current row of
ebf0: 20 63 75 72 73 6f 72 20 63 73 72 45 6e 64 2c 20   cursor csrEnd, 
ec00: 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  then.**         
ec10: 20 20 20 20 20 20 73 74 65 70 20 63 75 72 73 6f        step curso
ec20: 72 20 63 73 72 45 6e 64 20 66 6f 72 77 61 72 64  r csrEnd forward
ec30: 20 6f 6e 65 20 72 6f 77 20 28 69 2e 65 2e 20 73   one row (i.e. s
ec40: 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
ec50: 29 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 52 45 54 55  ))..**.**   RETU
ec60: 52 4e 5f 52 4f 57 3a 20 72 65 74 75 72 6e 20 61  RN_ROW: return a
ec70: 20 72 6f 77 20 74 6f 20 74 68 65 20 63 61 6c 6c   row to the call
ec80: 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  er based on the 
ec90: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
eca0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
ecb0: 20 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66    current row of
ecc0: 20 63 73 72 43 75 72 72 65 6e 74 20 61 6e 64 20   csrCurrent and 
ecd0: 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
ece0: 65 20 6f 66 20 61 6c 6c 20 0a 2a 2a 20 20 20 20  e of all .**    
ecf0: 20 20 20 20 20 20 20 20 20 20 20 61 67 67 72 65             aggre
ed00: 67 61 74 65 73 2e 20 54 68 65 6e 20 73 74 65 70  gates. Then step
ed10: 20 63 75 72 73 6f 72 20 63 73 72 43 75 72 72 65   cursor csrCurre
ed20: 6e 74 20 66 6f 72 77 61 72 64 20 6f 6e 65 20 72  nt forward one r
ed30: 6f 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 41 47 47 49  ow..**.**   AGGI
ed40: 4e 56 45 52 53 45 3a 20 69 6e 76 6f 6b 65 20 74  NVERSE: invoke t
ed50: 68 65 20 61 67 67 72 65 67 61 74 65 20 78 49 6e  he aggregate xIn
ed60: 76 65 72 73 65 28 29 20 66 75 6e 63 74 69 6f 6e  verse() function
ed70: 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77   for each window
ed80: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
ed90: 20 20 20 66 75 6e 63 74 69 6f 6e 73 20 77 69 74     functions wit
eda0: 68 20 61 72 67 75 6d 65 6e 74 73 20 72 65 61 64  h arguments read
edb0: 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
edc0: 74 20 72 6f 77 20 6f 66 20 63 75 72 73 6f 72 0a  t row of cursor.
edd0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
ede0: 20 63 73 72 53 74 61 72 74 2e 20 54 68 65 6e 20   csrStart. Then 
edf0: 73 74 65 70 20 63 73 72 53 74 61 72 74 20 66 6f  step csrStart fo
ee00: 72 77 61 72 64 20 6f 6e 65 20 72 6f 77 2e 0a 2a  rward one row..*
ee10: 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 74  *.** There are t
ee20: 77 6f 20 6f 74 68 65 72 20 52 4f 57 53 20 77 69  wo other ROWS wi
ee30: 6e 64 6f 77 20 66 72 61 6d 65 73 20 74 68 61 74  ndow frames that
ee40: 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 69 67   are handled sig
ee50: 6e 69 66 69 63 61 6e 74 6c 79 0a 2a 2a 20 64 69  nificantly.** di
ee60: 66 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d 20 74  fferently from t
ee70: 68 65 20 61 62 6f 76 65 20 2d 20 22 42 45 54 57  he above - "BETW
ee80: 45 45 4e 20 3c 65 78 70 72 3e 20 50 52 45 43 45  EEN <expr> PRECE
ee90: 44 49 4e 47 20 41 4e 44 20 3c 65 78 70 72 3e 20  DING AND <expr> 
eea0: 50 52 45 43 45 44 49 4e 47 22 0a 2a 2a 20 61 6e  PRECEDING".** an
eeb0: 64 20 22 42 45 54 57 45 45 4e 20 3c 65 78 70 72  d "BETWEEN <expr
eec0: 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e 44 20  > FOLLOWING AND 
eed0: 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47  <expr> FOLLOWING
eee0: 22 2e 20 54 68 65 73 65 20 61 72 65 20 73 70 65  ". These are spe
eef0: 63 69 61 6c 20 0a 2a 2a 20 63 61 73 65 73 20 62  cial .** cases b
ef00: 65 63 61 75 73 65 20 74 68 65 79 20 63 68 61 6e  ecause they chan
ef10: 67 65 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20  ge the order in 
ef20: 77 68 69 63 68 20 74 68 65 20 74 68 72 65 65 20  which the three 
ef30: 63 75 72 73 6f 72 73 20 28 63 73 72 53 74 61 72  cursors (csrStar
ef40: 74 2c 0a 2a 2a 20 63 73 72 43 75 72 72 65 6e 74  t,.** csrCurrent
ef50: 20 61 6e 64 20 63 73 72 45 6e 64 29 20 69 74 65   and csrEnd) ite
ef60: 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65  rate through the
ef70: 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
ef80: 2e 20 43 61 73 65 73 20 74 68 61 74 0a 2a 2a 20  . Cases that.** 
ef90: 75 73 65 20 55 4e 42 4f 55 4e 44 45 44 20 6f 72  use UNBOUNDED or
efa0: 20 43 55 52 52 45 4e 54 20 52 4f 57 20 61 72 65   CURRENT ROW are
efb0: 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 76 61   much simpler va
efc0: 72 69 61 74 69 6f 6e 73 20 6f 6e 20 6f 6e 65 20  riations on one 
efd0: 6f 66 20 74 68 65 73 65 0a 2a 2a 20 74 68 72 65  of these.** thre
efe0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57 53 20  e..**.**   ROWS 
eff0: 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31 3e 20  BETWEEN <expr1> 
f000: 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 3c 65  PRECEDING AND <e
f010: 78 70 72 32 3e 20 50 52 45 43 45 44 49 4e 47 0a  xpr2> PRECEDING.
f020: 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 6c 6f  **.**     ... lo
f030: 6f 70 20 73 74 61 72 74 65 64 20 62 79 20 73 71  op started by sq
f040: 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
f050: 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 69  ) ....**       i
f060: 66 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e  f( new partition
f070: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 47   ){.**         G
f080: 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20 20  osub flush.**   
f090: 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 49      }.**       I
f0a0: 6e 73 65 72 74 20 6e 65 77 20 72 6f 77 20 69 6e  nsert new row in
f0b0: 74 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a 2a 2a  to eph table..**
f0c0: 20 20 20 20 20 20 20 69 66 28 20 66 69 72 73 74         if( first
f0d0: 20 72 6f 77 20 6f 66 20 70 61 72 74 69 74 69 6f   row of partitio
f0e0: 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  n ){.**         
f0f0: 52 65 77 69 6e 64 28 63 73 72 45 6e 64 29 20 3b  Rewind(csrEnd) ;
f100: 20 52 65 77 69 6e 64 28 63 73 72 53 74 61 72 74   Rewind(csrStart
f110: 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72 43 75  ) ; Rewind(csrCu
f120: 72 72 65 6e 74 29 0a 2a 2a 20 20 20 20 20 20 20  rrent).**       
f130: 20 20 72 65 67 45 6e 64 20 3d 20 3c 65 78 70 72    regEnd = <expr
f140: 32 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20 72 65  2>.**         re
f150: 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72 31 3e  gStart = <expr1>
f160: 0a 2a 2a 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  .**       }else{
f170: 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 66 28 20  .**         if( 
f180: 28 72 65 67 45 6e 64 2d 2d 29 3c 3d 30 20 29 7b  (regEnd--)<=0 ){
f190: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 47  .**           AG
f1a0: 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 20  GSTEP.**        
f1b0: 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 45   }.**         RE
f1c0: 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20  TURN_ROW.**     
f1d0: 20 20 20 20 69 66 28 20 28 72 65 67 53 74 61 72      if( (regStar
f1e0: 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20  t--)<=0 ){.**   
f1f0: 20 20 20 20 20 20 20 20 41 47 47 49 4e 56 45 52          AGGINVER
f200: 53 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a  SE.**         }.
f210: 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20  **       }.**   
f220: 20 20 7d 0a 2a 2a 20 20 20 20 20 66 6c 75 73 68    }.**     flush
f230: 3a 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 28  :.**       if( (
f240: 72 65 67 45 6e 64 2d 2d 29 3c 3d 30 20 29 7b 0a  regEnd--)<=0 ){.
f250: 2a 2a 20 20 20 20 20 20 20 20 20 41 47 47 53 54  **         AGGST
f260: 45 50 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a  EP.**       }.**
f270: 20 20 20 20 20 20 20 52 45 54 55 52 4e 5f 52 4f         RETURN_RO
f280: 57 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57  W.**.**.**   ROW
f290: 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31  S BETWEEN <expr1
f2a0: 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e 44 20  > FOLLOWING AND 
f2b0: 3c 65 78 70 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e  <expr2> FOLLOWIN
f2c0: 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20  G.**.**     ... 
f2d0: 6c 6f 6f 70 20 73 74 61 72 74 65 64 20 62 79 20  loop started by 
f2e0: 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
f2f0: 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 69  n() ....**     i
f300: 66 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e  f( new partition
f310: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 47 6f 73   ){.**       Gos
f320: 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20 20 20 20  ub flush.**     
f330: 7d 0a 2a 2a 20 20 20 20 20 49 6e 73 65 72 74 20  }.**     Insert 
f340: 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20 65 70 68  new row into eph
f350: 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 69   table..**     i
f360: 66 28 20 66 69 72 73 74 20 72 6f 77 20 6f 66 20  f( first row of 
f370: 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20  partition ){.** 
f380: 20 20 20 20 20 20 52 65 77 69 6e 64 28 63 73 72        Rewind(csr
f390: 45 6e 64 29 20 3b 20 52 65 77 69 6e 64 28 63 73  End) ; Rewind(cs
f3a0: 72 53 74 61 72 74 29 20 3b 20 52 65 77 69 6e 64  rStart) ; Rewind
f3b0: 28 63 73 72 43 75 72 72 65 6e 74 29 0a 2a 2a 20  (csrCurrent).** 
f3c0: 20 20 20 20 20 20 72 65 67 45 6e 64 20 3d 20 3c        regEnd = <
f3d0: 65 78 70 72 32 3e 0a 2a 2a 20 20 20 20 20 20 20  expr2>.**       
f3e0: 72 65 67 53 74 61 72 74 20 3d 20 72 65 67 45 6e  regStart = regEn
f3f0: 64 20 2d 20 3c 65 78 70 72 31 3e 0a 2a 2a 20 20  d - <expr1>.**  
f400: 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20 20     }else{.**    
f410: 20 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20 20     AGGSTEP.**   
f420: 20 20 20 20 69 66 28 20 28 72 65 67 45 6e 64 2d      if( (regEnd-
f430: 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20  -)<=0 ){.**     
f440: 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a      RETURN_ROW.*
f450: 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  *       }.**    
f460: 20 20 20 69 66 28 20 28 72 65 67 53 74 61 72 74     if( (regStart
f470: 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20  --)<=0 ){.**    
f480: 20 20 20 20 20 41 47 47 49 4e 56 45 52 53 45 0a       AGGINVERSE.
f490: 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20  **       }.**   
f4a0: 20 20 7d 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20    }.**   }.**   
f4b0: 66 6c 75 73 68 3a 0a 2a 2a 20 20 20 20 20 41 47  flush:.**     AG
f4c0: 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 77 68 69  GSTEP.**     whi
f4d0: 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20  le( 1 ){.**     
f4e0: 20 20 69 66 28 20 28 72 65 67 45 6e 64 2d 2d 29    if( (regEnd--)
f4f0: 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  <=0 ){.**       
f500: 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20    RETURN_ROW.** 
f510: 20 20 20 20 20 20 20 20 69 66 28 20 65 6f 66 20          if( eof 
f520: 29 20 62 72 65 61 6b 3b 0a 2a 2a 20 20 20 20 20  ) break;.**     
f530: 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 69 66 28    }.**       if(
f540: 20 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30   (regStart--)<=0
f550: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41   ){.**         A
f560: 47 47 49 4e 56 45 52 53 45 0a 2a 2a 20 20 20 20  GGINVERSE.**    
f570: 20 20 20 20 20 69 66 28 20 65 6f 66 20 29 20 62       if( eof ) b
f580: 72 65 61 6b 0a 2a 2a 20 20 20 20 20 20 20 7d 0a  reak.**       }.
f590: 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20  **     }.**     
f5a0: 77 68 69 6c 65 28 20 21 65 6f 66 20 63 73 72 43  while( !eof csrC
f5b0: 75 72 72 65 6e 74 20 29 7b 0a 2a 2a 20 20 20 20  urrent ){.**    
f5c0: 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a     RETURN_ROW.**
f5d0: 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 46 6f 72       }.**.** For
f5e0: 20 74 68 65 20 6d 6f 73 74 20 70 61 72 74 2c 20   the most part, 
f5f0: 74 68 65 20 70 61 74 74 65 72 6e 73 20 61 62 6f  the patterns abo
f600: 76 65 20 61 72 65 20 61 64 61 70 74 65 64 20 74  ve are adapted t
f610: 6f 20 73 75 70 70 6f 72 74 20 55 4e 42 4f 55 4e  o support UNBOUN
f620: 44 45 44 20 62 79 0a 2a 2a 20 61 73 73 75 6d 69  DED by.** assumi
f630: 6e 67 20 74 68 61 74 20 69 74 20 69 73 20 65 71  ng that it is eq
f640: 75 69 76 61 6c 65 6e 74 20 74 6f 20 22 69 6e 66  uivalent to "inf
f650: 69 6e 69 74 79 20 50 52 45 43 45 44 49 4e 47 2f  inity PRECEDING/
f660: 46 4f 4c 4c 4f 57 49 4e 47 22 20 61 6e 64 0a 2a  FOLLOWING" and.*
f670: 2a 20 43 55 52 52 45 4e 54 20 52 4f 57 20 62 79  * CURRENT ROW by
f680: 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 69   assuming that i
f690: 74 20 69 73 20 65 71 75 69 76 69 6c 65 6e 74 20  t is equivilent 
f6a0: 74 6f 20 22 30 20 50 52 45 43 45 44 49 4e 47 2f  to "0 PRECEDING/
f6b0: 46 4f 4c 4c 4f 57 49 4e 47 22 2e 0a 2a 2a 20 54  FOLLOWING"..** T
f6c0: 68 69 73 20 69 73 20 6f 70 74 69 6d 69 7a 65 64  his is optimized
f6d0: 20 6f 66 20 63 6f 75 72 73 65 20 2d 20 62 72 61   of course - bra
f6e0: 6e 63 68 65 73 20 74 68 61 74 20 77 69 6c 6c 20  nches that will 
f6f0: 6e 65 76 65 72 20 62 65 20 74 61 6b 65 6e 20 61  never be taken a
f700: 6e 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73  nd.** conditions
f710: 20 74 68 61 74 20 61 72 65 20 61 6c 77 61 79 73   that are always
f720: 20 74 72 75 65 20 61 72 65 20 6f 6d 69 74 74 65   true are omitte
f730: 64 20 66 72 6f 6d 20 74 68 65 20 56 4d 20 63 6f  d from the VM co
f740: 64 65 2e 20 54 68 65 20 6f 6e 6c 79 0a 2a 2a 20  de. The only.** 
f750: 65 78 63 65 70 74 69 6f 6e 61 6c 20 63 61 73 65  exceptional case
f760: 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57   is:.**.**   ROW
f770: 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31  S BETWEEN <expr1
f780: 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e 44 20  > FOLLOWING AND 
f790: 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57  UNBOUNDED FOLLOW
f7a0: 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e  ING.**.**     ..
f7b0: 2e 20 6c 6f 6f 70 20 73 74 61 72 74 65 64 20 62  . loop started b
f7c0: 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
f7d0: 67 69 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20  gin() ....**    
f7e0: 20 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69   if( new partiti
f7f0: 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 47  on ){.**       G
f800: 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20 20  osub flush.**   
f810: 20 20 7d 0a 2a 2a 20 20 20 20 20 49 6e 73 65 72    }.**     Inser
f820: 74 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20 65  t new row into e
f830: 70 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20  ph table..**    
f840: 20 69 66 28 20 66 69 72 73 74 20 72 6f 77 20 6f   if( first row o
f850: 66 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a  f partition ){.*
f860: 2a 20 20 20 20 20 20 20 52 65 77 69 6e 64 28 63  *       Rewind(c
f870: 73 72 45 6e 64 29 20 3b 20 52 65 77 69 6e 64 28  srEnd) ; Rewind(
f880: 63 73 72 53 74 61 72 74 29 20 3b 20 52 65 77 69  csrStart) ; Rewi
f890: 6e 64 28 63 73 72 43 75 72 72 65 6e 74 29 0a 2a  nd(csrCurrent).*
f8a0: 2a 20 20 20 20 20 20 20 72 65 67 53 74 61 72 74  *       regStart
f8b0: 20 3d 20 3c 65 78 70 72 31 3e 0a 2a 2a 20 20 20   = <expr1>.**   
f8c0: 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20 20 20    }else{.**     
f8d0: 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20    AGGSTEP.**    
f8e0: 20 7d 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20 66   }.**   }.**   f
f8f0: 6c 75 73 68 3a 0a 2a 2a 20 20 20 20 20 41 47 47  lush:.**     AGG
f900: 53 54 45 50 0a 2a 2a 20 20 20 20 20 77 68 69 6c  STEP.**     whil
f910: 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20 20  e( 1 ){.**      
f920: 20 69 66 28 20 28 72 65 67 53 74 61 72 74 2d 2d   if( (regStart--
f930: 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20  )<=0 ){.**      
f940: 20 20 20 41 47 47 49 4e 56 45 52 53 45 0a 2a 2a     AGGINVERSE.**
f950: 20 20 20 20 20 20 20 20 20 69 66 28 20 65 6f 66           if( eof
f960: 20 29 20 62 72 65 61 6b 0a 2a 2a 20 20 20 20 20   ) break.**     
f970: 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 52 45 54    }.**       RET
f980: 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 7d  URN_ROW.**     }
f990: 0a 2a 2a 20 20 20 20 20 77 68 69 6c 65 28 20 21  .**     while( !
f9a0: 65 6f 66 20 63 73 72 43 75 72 72 65 6e 74 20 29  eof csrCurrent )
f9b0: 7b 0a 2a 2a 20 20 20 20 20 20 20 52 45 54 55 52  {.**       RETUR
f9c0: 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 7d 0a 2a  N_ROW.**     }.*
f9d0: 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 71 75 69 72  *.** Also requir
f9e0: 69 6e 67 20 73 70 65 63 69 61 6c 20 68 61 6e 64  ing special hand
f9f0: 6c 69 6e 67 20 61 72 65 20 74 68 65 20 63 61 73  ling are the cas
fa00: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57 53  es:.**.**   ROWS
fa10: 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31 3e   BETWEEN <expr1>
fa20: 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 3c   PRECEDING AND <
fa30: 65 78 70 72 32 3e 20 50 52 45 43 45 44 49 4e 47  expr2> PRECEDING
fa40: 0a 2a 2a 20 20 20 52 4f 57 53 20 42 45 54 57 45  .**   ROWS BETWE
fa50: 45 4e 20 3c 65 78 70 72 31 3e 20 46 4f 4c 4c 4f  EN <expr1> FOLLO
fa60: 57 49 4e 47 20 41 4e 44 20 3c 65 78 70 72 32 3e  WING AND <expr2>
fa70: 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a   FOLLOWING.**.**
fa80: 20 77 68 65 6e 20 28 65 78 70 72 31 20 3c 20 65   when (expr1 < e
fa90: 78 70 72 32 29 2e 20 54 68 69 73 20 69 73 20 64  xpr2). This is d
faa0: 65 74 65 63 74 65 64 20 61 74 20 72 75 6e 74 69  etected at runti
fab0: 6d 65 2c 20 6e 6f 74 20 62 79 20 74 68 69 73 20  me, not by this 
fac0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 54 6f 20  function..** To 
fad0: 68 61 6e 64 6c 65 20 74 68 69 73 20 63 61 73 65  handle this case
fae0: 2c 20 74 68 65 20 70 73 65 75 64 6f 2d 63 6f 64  , the pseudo-cod
faf0: 65 20 70 72 6f 67 72 61 6d 73 20 64 65 70 69 63  e programs depic
fb00: 74 65 64 20 61 62 6f 76 65 20 61 72 65 20 6d 6f  ted above are mo
fb10: 64 69 66 69 65 64 0a 2a 2a 20 73 6c 69 67 68 74  dified.** slight
fb20: 6c 79 20 74 6f 20 62 65 3a 0a 2a 2a 0a 2a 2a 20  ly to be:.**.** 
fb30: 20 20 20 20 2e 2e 2e 20 6c 6f 6f 70 20 73 74 61      ... loop sta
fb40: 72 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 57  rted by sqlite3W
fb50: 68 65 72 65 42 65 67 69 6e 28 29 20 2e 2e 2e 0a  hereBegin() ....
fb60: 2a 2a 20 20 20 20 20 69 66 28 20 6e 65 77 20 70  **     if( new p
fb70: 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20  artition ){.**  
fb80: 20 20 20 20 20 47 6f 73 75 62 20 66 6c 75 73 68       Gosub flush
fb90: 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  .**     }.**    
fba0: 20 49 6e 73 65 72 74 20 6e 65 77 20 72 6f 77 20   Insert new row 
fbb0: 69 6e 74 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a  into eph table..
fbc0: 2a 2a 20 20 20 20 20 69 66 28 20 66 69 72 73 74  **     if( first
fbd0: 20 72 6f 77 20 6f 66 20 70 61 72 74 69 74 69 6f   row of partitio
fbe0: 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 52 65  n ){.**       Re
fbf0: 77 69 6e 64 28 63 73 72 45 6e 64 29 20 3b 20 52  wind(csrEnd) ; R
fc00: 65 77 69 6e 64 28 63 73 72 53 74 61 72 74 29 20  ewind(csrStart) 
fc10: 3b 20 52 65 77 69 6e 64 28 63 73 72 43 75 72 72  ; Rewind(csrCurr
fc20: 65 6e 74 29 0a 2a 2a 20 20 20 20 20 20 20 72 65  ent).**       re
fc30: 67 45 6e 64 20 3d 20 3c 65 78 70 72 32 3e 0a 2a  gEnd = <expr2>.*
fc40: 2a 20 20 20 20 20 20 20 72 65 67 53 74 61 72 74  *       regStart
fc50: 20 3d 20 3c 65 78 70 72 31 3e 0a 2a 2a 20 20 20   = <expr1>.**   
fc60: 20 20 20 20 69 66 28 20 72 65 67 45 6e 64 20 3c      if( regEnd <
fc70: 20 72 65 67 53 74 61 72 74 20 29 7b 0a 2a 2a 20   regStart ){.** 
fc80: 20 20 20 20 20 20 20 20 52 45 54 55 52 4e 5f 52          RETURN_R
fc90: 4f 57 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65  OW.**         de
fca0: 6c 65 74 65 20 65 70 68 20 74 61 62 6c 65 20 63  lete eph table c
fcb0: 6f 6e 74 65 6e 74 73 0a 2a 2a 20 20 20 20 20 20  ontents.**      
fcc0: 20 20 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 20     continue.**  
fcd0: 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 2e 2e       }.**     ..
fce0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20  ..**.** The new 
fcf0: 22 63 6f 6e 74 69 6e 75 65 22 20 73 74 61 74 65  "continue" state
fd00: 6d 65 6e 74 20 69 6e 20 74 68 65 20 61 62 6f 76  ment in the abov
fd10: 65 20 6a 75 6d 70 73 20 74 6f 20 74 68 65 20 6e  e jumps to the n
fd20: 65 78 74 20 69 74 65 72 61 74 69 6f 6e 0a 2a 2a  ext iteration.**
fd30: 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f   of the outer lo
fd40: 6f 70 20 2d 20 74 68 65 20 6f 6e 65 20 73 74 61  op - the one sta
fd50: 72 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 57  rted by sqlite3W
fd60: 68 65 72 65 42 65 67 69 6e 28 29 2e 0a 2a 2a 0a  hereBegin()..**.
fd70: 2a 2a 20 54 68 65 20 76 61 72 69 6f 75 73 20 47  ** The various G
fd80: 52 4f 55 50 53 20 63 61 73 65 73 20 61 72 65 20  ROUPS cases are 
fd90: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e  implemented usin
fda0: 67 20 74 68 65 20 73 61 6d 65 20 70 61 74 74 65  g the same patte
fdb0: 72 6e 73 20 61 73 0a 2a 2a 20 52 4f 57 53 2e 20  rns as.** ROWS. 
fdc0: 54 68 65 20 56 4d 20 63 6f 64 65 20 69 73 20 6d  The VM code is m
fdd0: 6f 64 69 66 69 65 64 20 73 6c 69 67 68 74 6c 79  odified slightly
fde0: 20 73 6f 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20   so that:.**.** 
fdf0: 20 20 31 2e 20 54 68 65 20 65 6c 73 65 20 62 72    1. The else br
fe00: 61 6e 63 68 20 69 6e 20 74 68 65 20 6d 61 69 6e  anch in the main
fe10: 20 6c 6f 6f 70 20 69 73 20 6f 6e 6c 79 20 74 61   loop is only ta
fe20: 6b 65 6e 20 69 66 20 74 68 65 20 72 6f 77 20 6a  ken if the row j
fe30: 75 73 74 0a 2a 2a 20 20 20 20 20 20 61 64 64 65  ust.**      adde
fe40: 64 20 74 6f 20 74 68 65 20 65 70 68 65 6d 65 72  d to the ephemer
fe50: 61 6c 20 74 61 62 6c 65 20 69 73 20 74 68 65 20  al table is the 
fe60: 73 74 61 72 74 20 6f 66 20 61 20 6e 65 77 20 67  start of a new g
fe70: 72 6f 75 70 2e 20 49 6e 0a 2a 2a 20 20 20 20 20  roup. In.**     
fe80: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 74   other words, it
fe90: 20 62 65 63 6f 6d 65 73 3a 0a 2a 2a 0a 2a 2a 20   becomes:.**.** 
fea0: 20 20 20 20 20 20 20 20 2e 2e 2e 20 6c 6f 6f 70          ... loop
feb0: 20 73 74 61 72 74 65 64 20 62 79 20 73 71 6c 69   started by sqli
fec0: 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
fed0: 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 69  ....**         i
fee0: 66 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e  f( new partition
fef0: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   ){.**          
ff00: 20 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20   Gosub flush.** 
ff10: 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20          }.**    
ff20: 20 20 20 20 20 49 6e 73 65 72 74 20 6e 65 77 20       Insert new 
ff30: 72 6f 77 20 69 6e 74 6f 20 65 70 68 20 74 61 62  row into eph tab
ff40: 6c 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 69  le..**         i
ff50: 66 28 20 66 69 72 73 74 20 72 6f 77 20 6f 66 20  f( first row of 
ff60: 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20  partition ){.** 
ff70: 20 20 20 20 20 20 20 20 20 20 52 65 77 69 6e 64            Rewind
ff80: 28 63 73 72 45 6e 64 29 20 3b 20 52 65 77 69 6e  (csrEnd) ; Rewin
ff90: 64 28 63 73 72 53 74 61 72 74 29 20 3b 20 52 65  d(csrStart) ; Re
ffa0: 77 69 6e 64 28 63 73 72 43 75 72 72 65 6e 74 29  wind(csrCurrent)
ffb0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 72 65  .**           re
ffc0: 67 45 6e 64 20 3d 20 3c 65 78 70 72 32 3e 0a 2a  gEnd = <expr2>.*
ffd0: 2a 20 20 20 20 20 20 20 20 20 20 20 72 65 67 53  *           regS
ffe0: 74 61 72 74 20 3d 20 3c 65 78 70 72 31 3e 0a 2a  tart = <expr1>.*
fff0: 2a 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  *         }else 
10000 69 66 28 20 6e 65 77 20 67 72 6f 75 70 20 29 7b  if( new group ){
10010 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 2e 2e  .**           ..
10020 2e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a  . .**         }.
10030 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a  **       }.**.**
10040 20 20 20 32 2e 20 49 6e 73 74 65 61 64 20 6f 66     2. Instead of
10050 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20 73 69   processing a si
10060 6e 67 6c 65 20 72 6f 77 2c 20 65 61 63 68 20 52  ngle row, each R
10070 45 54 55 52 4e 5f 52 4f 57 2c 20 41 47 47 53 54  ETURN_ROW, AGGST
10080 45 50 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 41  EP or .**      A
10090 47 47 49 4e 56 45 52 53 45 20 73 74 65 70 20 70  GGINVERSE step p
100a0 72 6f 63 65 73 73 65 73 20 74 68 65 20 63 75 72  rocesses the cur
100b0 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20  rent row of the 
100c0 72 65 6c 65 76 61 6e 74 20 63 75 72 73 6f 72 20  relevant cursor 
100d0 61 6e 64 0a 2a 2a 20 20 20 20 20 20 61 6c 6c 20  and.**      all 
100e0 73 75 62 73 65 71 75 65 6e 74 20 72 6f 77 73 20  subsequent rows 
100f0 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65  belonging to the
10100 20 73 61 6d 65 20 67 72 6f 75 70 2e 0a 2a 2a 0a   same group..**.
10110 2a 2a 20 52 41 4e 47 45 20 77 69 6e 64 6f 77 20  ** RANGE window 
10120 66 72 61 6d 65 73 20 61 72 65 20 61 20 6c 69 74  frames are a lit
10130 74 6c 65 20 64 69 66 66 65 72 65 6e 74 20 61 67  tle different ag
10140 61 69 6e 2e 20 41 73 20 66 6f 72 20 47 52 4f 55  ain. As for GROU
10150 50 53 2c 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e  PS, the .** main
10160 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20   loop runs once 
10170 70 65 72 20 67 72 6f 75 70 20 6f 6e 6c 79 2e 20  per group only. 
10180 41 6e 64 20 52 45 54 55 52 4e 5f 52 4f 57 2c 20  And RETURN_ROW, 
10190 41 47 47 53 54 45 50 20 61 6e 64 20 41 47 47 49  AGGSTEP and AGGI
101a0 4e 56 45 52 53 45 0a 2a 2a 20 64 65 61 6c 20 69  NVERSE.** deal i
101b0 6e 20 67 72 6f 75 70 73 20 69 6e 73 74 65 61 64  n groups instead
101c0 20 6f 66 20 72 6f 77 73 2e 20 41 73 20 66 6f 72   of rows. As for
101d0 20 52 4f 57 53 20 61 6e 64 20 47 52 4f 55 50 53   ROWS and GROUPS
101e0 2c 20 74 68 65 72 65 20 61 72 65 20 74 68 72 65  , there are thre
101f0 65 0a 2a 2a 20 62 61 73 69 63 20 63 61 73 65 73  e.** basic cases
10200 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e 47 45 20  :.**.**   RANGE 
10210 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31 3e 20  BETWEEN <expr1> 
10220 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 3c 65  PRECEDING AND <e
10230 78 70 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a  xpr2> FOLLOWING.
10240 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 6c 6f  **.**     ... lo
10250 6f 70 20 73 74 61 72 74 65 64 20 62 79 20 73 71  op started by sq
10260 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
10270 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 69  ) ....**       i
10280 66 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e  f( new partition
10290 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 47   ){.**         G
102a0 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20 20  osub flush.**   
102b0 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 49      }.**       I
102c0 6e 73 65 72 74 20 6e 65 77 20 72 6f 77 20 69 6e  nsert new row in
102d0 74 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a 2a 2a  to eph table..**
102e0 20 20 20 20 20 20 20 69 66 28 20 66 69 72 73 74         if( first
102f0 20 72 6f 77 20 6f 66 20 70 61 72 74 69 74 69 6f   row of partitio
10300 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  n ){.**         
10310 52 65 77 69 6e 64 28 63 73 72 45 6e 64 29 20 3b  Rewind(csrEnd) ;
10320 20 52 65 77 69 6e 64 28 63 73 72 53 74 61 72 74   Rewind(csrStart
10330 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72 43 75  ) ; Rewind(csrCu
10340 72 72 65 6e 74 29 0a 2a 2a 20 20 20 20 20 20 20  rrent).**       
10350 20 20 72 65 67 45 6e 64 20 3d 20 3c 65 78 70 72    regEnd = <expr
10360 32 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20 72 65  2>.**         re
10370 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72 31 3e  gStart = <expr1>
10380 0a 2a 2a 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  .**       }else{
10390 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 47 47 53  .**         AGGS
103a0 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 20 20 77  TEP.**         w
103b0 68 69 6c 65 28 20 28 63 73 72 43 75 72 72 65 6e  hile( (csrCurren
103c0 74 2e 6b 65 79 20 2b 20 72 65 67 45 6e 64 29 20  t.key + regEnd) 
103d0 3c 20 63 73 72 45 6e 64 2e 6b 65 79 20 29 7b 0a  < csrEnd.key ){.
103e0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 52 45 54  **           RET
103f0 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 20  URN_ROW.**      
10400 20 20 20 20 20 77 68 69 6c 65 28 20 63 73 72 53       while( csrS
10410 74 61 72 74 2e 6b 65 79 20 2b 20 72 65 67 53 74  tart.key + regSt
10420 61 72 74 29 20 3c 20 63 73 72 43 75 72 72 65 6e  art) < csrCurren
10430 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20 20  t.key ){.**     
10440 20 20 20 20 20 20 20 20 41 47 47 49 4e 56 45 52          AGGINVER
10450 53 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  SE.**           
10460 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a  }.**         }.*
10470 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  *       }.**    
10480 20 7d 0a 2a 2a 20 20 20 20 20 66 6c 75 73 68 3a   }.**     flush:
10490 0a 2a 2a 20 20 20 20 20 20 20 41 47 47 53 54 45  .**       AGGSTE
104a0 50 0a 2a 2a 20 20 20 20 20 20 20 77 68 69 6c 65  P.**       while
104b0 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  ( 1 ){.**       
104c0 20 20 52 45 54 55 52 4e 20 52 4f 57 0a 2a 2a 20    RETURN ROW.** 
104d0 20 20 20 20 20 20 20 20 69 66 28 20 63 73 72 43          if( csrC
104e0 75 72 72 65 6e 74 20 69 73 20 45 4f 46 20 29 20  urrent is EOF ) 
104f0 62 72 65 61 6b 3b 0a 2a 2a 20 20 20 20 20 20 20  break;.**       
10500 20 20 20 20 77 68 69 6c 65 28 20 63 73 72 53 74      while( csrSt
10510 61 72 74 2e 6b 65 79 20 2b 20 72 65 67 53 74 61  art.key + regSta
10520 72 74 29 20 3c 20 63 73 72 43 75 72 72 65 6e 74  rt) < csrCurrent
10530 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20 20 20  .key ){.**      
10540 20 20 20 20 20 20 20 41 47 47 49 4e 56 45 52 53         AGGINVERS
10550 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 7d  E.**           }
10560 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a  .**         }.**
10570 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49         }.**.** I
10580 6e 20 74 68 65 20 61 62 6f 76 65 20 6e 6f 74 61  n the above nota
10590 74 69 6f 6e 2c 20 22 63 73 72 2e 6b 65 79 22 20  tion, "csr.key" 
105a0 6d 65 61 6e 73 20 74 68 65 20 63 75 72 72 65 6e  means the curren
105b0 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 4f  t value of the O
105c0 52 44 45 52 20 42 59 20 0a 2a 2a 20 65 78 70 72  RDER BY .** expr
105d0 65 73 73 69 6f 6e 20 28 74 68 65 72 65 20 69 73  ession (there is
105e0 20 6f 6e 6c 79 20 65 76 65 72 20 31 20 66 6f 72   only ever 1 for
105f0 20 61 20 52 41 4e 47 45 20 74 68 61 74 20 75 73   a RANGE that us
10600 65 73 20 61 6e 20 3c 65 78 70 72 3e 20 46 4f 4c  es an <expr> FOL
10610 4c 4f 57 49 4e 47 0a 2a 2a 20 6f 72 20 3c 65 78  LOWING.** or <ex
10620 70 72 20 50 52 45 43 45 44 49 4e 47 29 20 72 65  pr PRECEDING) re
10630 61 64 20 66 72 6f 6d 20 63 75 72 73 6f 72 20 63  ad from cursor c
10640 73 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e 47  sr..**.**   RANG
10650 45 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31  E BETWEEN <expr1
10660 3e 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20  > PRECEDING AND 
10670 3c 65 78 70 72 32 3e 20 50 52 45 43 45 44 49 4e  <expr2> PRECEDIN
10680 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20  G.**.**     ... 
10690 6c 6f 6f 70 20 73 74 61 72 74 65 64 20 62 79 20  loop started by 
106a0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
106b0 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20  n() ....**      
106c0 20 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69   if( new partiti
106d0 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  on ){.**        
106e0 20 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20   Gosub flush.** 
106f0 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20        }.**      
10700 20 49 6e 73 65 72 74 20 6e 65 77 20 72 6f 77 20   Insert new row 
10710 69 6e 74 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a  into eph table..
10720 2a 2a 20 20 20 20 20 20 20 69 66 28 20 66 69 72  **       if( fir
10730 73 74 20 72 6f 77 20 6f 66 20 70 61 72 74 69 74  st row of partit
10740 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  ion ){.**       
10750 20 20 52 65 77 69 6e 64 28 63 73 72 45 6e 64 29    Rewind(csrEnd)
10760 20 3b 20 52 65 77 69 6e 64 28 63 73 72 53 74 61   ; Rewind(csrSta
10770 72 74 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72  rt) ; Rewind(csr
10780 43 75 72 72 65 6e 74 29 0a 2a 2a 20 20 20 20 20  Current).**     
10790 20 20 20 20 72 65 67 45 6e 64 20 3d 20 3c 65 78      regEnd = <ex
107a0 70 72 32 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20  pr2>.**         
107b0 72 65 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72  regStart = <expr
107c0 31 3e 0a 2a 2a 20 20 20 20 20 20 20 7d 65 6c 73  1>.**       }els
107d0 65 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 68  e{.**         wh
107e0 69 6c 65 28 20 28 63 73 72 45 6e 64 2e 6b 65 79  ile( (csrEnd.key
107f0 20 2b 20 72 65 67 45 6e 64 29 20 3c 3d 20 63 73   + regEnd) <= cs
10800 72 43 75 72 72 65 6e 74 2e 6b 65 79 20 29 7b 0a  rCurrent.key ){.
10810 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 47 47  **           AGG
10820 53 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 20 20  STEP.**         
10830 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 45 54  }.**         RET
10840 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 20  URN_ROW.**      
10850 20 20 20 77 68 69 6c 65 28 20 28 63 73 72 53 74     while( (csrSt
10860 61 72 74 2e 6b 65 79 20 2b 20 72 65 67 53 74 61  art.key + regSta
10870 72 74 29 20 3c 20 63 73 72 43 75 72 72 65 6e 74  rt) < csrCurrent
10880 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20 20 20  .key ){.**      
10890 20 20 20 20 20 41 47 47 49 4e 56 45 52 53 45 0a       AGGINVERSE.
108a0 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20  **         }.** 
108b0 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 7d        }.**     }
108c0 0a 2a 2a 20 20 20 20 20 66 6c 75 73 68 3a 0a 2a  .**     flush:.*
108d0 2a 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28  *       while( (
108e0 63 73 72 45 6e 64 2e 6b 65 79 20 2b 20 72 65 67  csrEnd.key + reg
108f0 45 6e 64 29 20 3c 3d 20 63 73 72 43 75 72 72 65  End) <= csrCurre
10900 6e 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20  nt.key ){.**    
10910 20 20 20 20 20 41 47 47 53 54 45 50 0a 2a 2a 20       AGGSTEP.** 
10920 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20        }.**      
10930 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 0a 2a   RETURN_ROW.**.*
10940 2a 20 20 20 52 41 4e 47 45 20 42 45 54 57 45 45  *   RANGE BETWEE
10950 4e 20 3c 65 78 70 72 31 3e 20 46 4f 4c 4c 4f 57  N <expr1> FOLLOW
10960 49 4e 47 20 41 4e 44 20 3c 65 78 70 72 32 3e 20  ING AND <expr2> 
10970 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20  FOLLOWING.**.** 
10980 20 20 20 20 2e 2e 2e 20 6c 6f 6f 70 20 73 74 61      ... loop sta
10990 72 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 57  rted by sqlite3W
109a0 68 65 72 65 42 65 67 69 6e 28 29 20 2e 2e 2e 0a  hereBegin() ....
109b0 2a 2a 20 20 20 20 20 20 20 69 66 28 20 6e 65 77  **       if( new
109c0 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a   partition ){.**
109d0 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20 66           Gosub f
109e0 6c 75 73 68 0a 2a 2a 20 20 20 20 20 20 20 7d 0a  lush.**       }.
109f0 2a 2a 20 20 20 20 20 20 20 49 6e 73 65 72 74 20  **       Insert 
10a00 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20 65 70 68  new row into eph
10a10 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 20   table..**      
10a20 20 69 66 28 20 66 69 72 73 74 20 72 6f 77 20 6f   if( first row o
10a30 66 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a  f partition ){.*
10a40 2a 20 20 20 20 20 20 20 20 20 52 65 77 69 6e 64  *         Rewind
10a50 28 63 73 72 45 6e 64 29 20 3b 20 52 65 77 69 6e  (csrEnd) ; Rewin
10a60 64 28 63 73 72 53 74 61 72 74 29 20 3b 20 52 65  d(csrStart) ; Re
10a70 77 69 6e 64 28 63 73 72 43 75 72 72 65 6e 74 29  wind(csrCurrent)
10a80 0a 2a 2a 20 20 20 20 20 20 20 20 20 72 65 67 45  .**         regE
10a90 6e 64 20 3d 20 3c 65 78 70 72 32 3e 0a 2a 2a 20  nd = <expr2>.** 
10aa0 20 20 20 20 20 20 20 20 72 65 67 53 74 61 72 74          regStart
10ab0 20 3d 20 3c 65 78 70 72 31 3e 0a 2a 2a 20 20 20   = <expr1>.**   
10ac0 20 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20      }else{.**   
10ad0 20 20 20 20 20 20 41 47 47 53 54 45 50 0a 2a 2a        AGGSTEP.**
10ae0 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
10af0 28 63 73 72 43 75 72 72 65 6e 74 2e 6b 65 79 20  (csrCurrent.key 
10b00 2b 20 72 65 67 45 6e 64 29 20 3c 20 63 73 72 45  + regEnd) < csrE
10b10 6e 64 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20  nd.key ){.**    
10b20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63         while( (c
10b30 73 72 43 75 72 72 65 6e 74 2e 6b 65 79 20 2b 20  srCurrent.key + 
10b40 72 65 67 53 74 61 72 74 29 20 3e 20 63 73 72 53  regStart) > csrS
10b50 74 61 72 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20  tart.key ){.**  
10b60 20 20 20 20 20 20 20 20 20 20 20 41 47 47 49 4e             AGGIN
10b70 56 45 52 53 45 0a 2a 2a 20 20 20 20 20 20 20 20  VERSE.**        
10b80 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20     }.**         
10b90 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20    RETURN_ROW.** 
10ba0 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20          }.**    
10bb0 20 20 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a     }.**     }.**
10bc0 20 20 20 20 20 66 6c 75 73 68 3a 0a 2a 2a 20 20       flush:.**  
10bd0 20 20 20 20 20 41 47 47 53 54 45 50 0a 2a 2a 20       AGGSTEP.** 
10be0 20 20 20 20 20 20 77 68 69 6c 65 28 20 31 20 29        while( 1 )
10bf0 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 68 69  {.**         whi
10c00 6c 65 28 20 28 63 73 72 43 75 72 72 65 6e 74 2e  le( (csrCurrent.
10c10 6b 65 79 20 2b 20 72 65 67 53 74 61 72 74 29 20  key + regStart) 
10c20 3e 20 63 73 72 53 74 61 72 74 2e 6b 65 79 20 29  > csrStart.key )
10c30 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41  {.**           A
10c40 47 47 49 4e 56 45 52 53 45 0a 2a 2a 20 20 20 20  GGINVERSE.**    
10c50 20 20 20 20 20 20 20 69 66 28 20 65 6f 66 20 29         if( eof )
10c60 20 62 72 65 61 6b 20 22 77 68 69 6c 65 28 20 31   break "while( 1
10c70 20 29 22 20 6c 6f 6f 70 2e 0a 2a 2a 20 20 20 20   )" loop..**    
10c80 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20       }.**       
10c90 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20    RETURN_ROW.** 
10ca0 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20        }.**      
10cb0 20 77 68 69 6c 65 28 20 21 65 6f 66 20 63 73 72   while( !eof csr
10cc0 43 75 72 72 65 6e 74 20 29 7b 0a 2a 2a 20 20 20  Current ){.**   
10cd0 20 20 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57        RETURN_ROW
10ce0 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a  .**       }.**.*
10cf0 2a 20 54 68 65 20 74 65 78 74 20 61 62 6f 76 65  * The text above
10d00 20 6c 65 61 76 65 73 20 6f 75 74 20 6d 61 6e 79   leaves out many
10d10 20 64 65 74 61 69 6c 73 2e 20 52 65 66 65 72 20   details. Refer 
10d20 74 6f 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20  to the code and 
10d30 63 6f 6d 6d 65 6e 74 73 0a 2a 2a 20 62 65 6c 6f  comments.** belo
10d40 77 20 66 6f 72 20 61 20 6d 6f 72 65 20 63 6f 6d  w for a more com
10d50 70 6c 65 74 65 20 70 69 63 74 75 72 65 2e 0a 2a  plete picture..*
10d60 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69  /.void sqlite3Wi
10d70 6e 64 6f 77 43 6f 64 65 53 74 65 70 28 0a 20 20  ndowCodeStep(.  
10d80 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
10d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10da0 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
10db0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
10dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10dd0 20 20 20 20 20 20 2f 2a 20 52 65 77 72 69 74 74        /* Rewritt
10de0 65 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  en SELECT statem
10df0 65 6e 74 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ent */.  WhereIn
10e00 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 20  fo *pWInfo,     
10e10 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74           /* Cont
10e20 65 78 74 20 72 65 74 75 72 6e 65 64 20 62 79 20  ext returned by 
10e30 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
10e40 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  n() */.  int reg
10e50 47 6f 73 75 62 2c 20 20 20 20 20 20 20 20 20 20  Gosub,          
10e60 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
10e70 73 74 65 72 20 66 6f 72 20 4f 50 5f 47 6f 73 75  ster for OP_Gosu
10e80 62 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 47  b */.  int addrG
10e90 6f 73 75 62 20 20 20 20 20 20 20 20 20 20 20 20  osub            
10ea0 20 20 20 20 20 20 20 2f 2a 20 4f 50 5f 47 6f 73         /* OP_Gos
10eb0 75 62 20 68 65 72 65 20 74 6f 20 72 65 74 75 72  ub here to retur
10ec0 6e 20 65 61 63 68 20 72 6f 77 20 2a 2f 0a 29 7b  n each row */.){
10ed0 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e  .  Window *pMWin
10ee0 20 3d 20 70 2d 3e 70 57 69 6e 3b 0a 20 20 45 78   = p->pWin;.  Ex
10ef0 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
10f00 20 3d 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72   = pMWin->pOrder
10f10 42 79 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  By;.  Vdbe *v = 
10f20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
10f30 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 63 73  Parse);.  int cs
10f40 72 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20  rWrite;         
10f50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
10f60 73 6f 72 20 75 73 65 64 20 74 6f 20 77 72 69 74  sor used to writ
10f70 65 20 74 6f 20 65 70 68 2e 20 74 61 62 6c 65 20  e to eph. table 
10f80 2a 2f 0a 20 20 69 6e 74 20 63 73 72 49 6e 70 75  */.  int csrInpu
10f90 74 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  t = p->pSrc->a[0
10fa0 5d 2e 69 43 75 72 73 6f 72 3b 20 20 20 20 20 2f  ].iCursor;     /
10fb0 2a 20 43 75 72 73 6f 72 20 6f 66 20 73 75 62 2d  * Cursor of sub-
10fc0 73 65 6c 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  select */.  int 
10fd0 6e 49 6e 70 75 74 20 3d 20 70 2d 3e 70 53 72 63  nInput = p->pSrc
10fe0 2d 3e 61 5b 30 5d 2e 70 54 61 62 2d 3e 6e 43 6f  ->a[0].pTab->nCo
10ff0 6c 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  l;    /* Number 
11000 6f 66 20 63 6f 6c 73 20 72 65 74 75 72 6e 65 64  of cols returned
11010 20 62 79 20 73 75 62 20 2a 2f 0a 20 20 69 6e 74   by sub */.  int
11020 20 69 49 6e 70 75 74 3b 20 20 20 20 20 20 20 20   iInput;        
11030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11040 20 20 20 20 20 20 20 2f 2a 20 54 6f 20 69 74 65         /* To ite
11050 72 61 74 65 20 74 68 72 6f 75 67 68 20 73 75 62  rate through sub
11060 20 63 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 61   cols */.  int a
11070 64 64 72 49 66 4e 6f 74 3b 20 20 20 20 20 20 20  ddrIfNot;       
11080 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
11090 64 72 65 73 73 20 6f 66 20 4f 50 5f 49 66 4e 6f  dress of OP_IfNo
110a0 74 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 47  t */.  int addrG
110b0 6f 73 75 62 46 6c 75 73 68 3b 20 20 20 20 20 20  osubFlush;      
110c0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
110d0 73 20 6f 66 20 4f 50 5f 47 6f 73 75 62 20 74 6f  s of OP_Gosub to
110e0 20 66 6c 75 73 68 3a 20 2a 2f 0a 20 20 69 6e 74   flush: */.  int
110f0 20 61 64 64 72 49 6e 74 65 67 65 72 3b 20 20 20   addrInteger;   
11100 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11110 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 49 6e  Address of OP_In
11120 74 65 67 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61  teger */.  int a
11130 64 64 72 45 6d 70 74 79 3b 20 20 20 20 20 20 20  ddrEmpty;       
11140 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
11150 64 72 65 73 73 20 6f 66 20 4f 50 5f 52 65 77 69  dress of OP_Rewi
11160 6e 64 20 69 6e 20 66 6c 75 73 68 3a 20 2a 2f 0a  nd in flush: */.
11170 20 20 69 6e 74 20 72 65 67 53 74 61 72 74 20 3d    int regStart =
11180 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
11190 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 3c 65    /* Value of <e
111a0 78 70 72 3e 20 50 52 45 43 45 44 49 4e 47 20 2a  xpr> PRECEDING *
111b0 2f 0a 20 20 69 6e 74 20 72 65 67 45 6e 64 20 3d  /.  int regEnd =
111c0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
111d0 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20      /* Value of 
111e0 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47  <expr> FOLLOWING
111f0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4e 65 77   */.  int regNew
11200 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11210 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
11220 66 20 72 65 67 69 73 74 65 72 73 20 68 6f 6c 64  f registers hold
11230 69 6e 67 20 6e 65 77 20 69 6e 70 75 74 20 72 6f  ing new input ro
11240 77 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  w */.  int regRe
11250 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20 20  cord;           
11260 20 20 20 20 20 20 20 2f 2a 20 72 65 67 4e 65 77         /* regNew
11270 20 61 72 72 61 79 20 69 6e 20 72 65 63 6f 72 64   array in record
11280 20 66 6f 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 72   form */.  int r
11290 65 67 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20  egRowid;        
112a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
112b0 77 69 64 20 66 6f 72 20 72 65 67 52 65 63 6f 72  wid for regRecor
112c0 64 20 69 6e 20 65 70 68 20 74 61 62 6c 65 20 2a  d in eph table *
112d0 2f 0a 20 20 69 6e 74 20 72 65 67 4e 65 77 50 65  /.  int regNewPe
112e0 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  er = 0;         
112f0 20 20 20 20 2f 2a 20 50 65 65 72 20 76 61 6c 75      /* Peer valu
11300 65 73 20 66 6f 72 20 6e 65 77 20 72 6f 77 20 28  es for new row (
11310 70 61 72 74 20 6f 66 20 72 65 67 4e 65 77 29 20  part of regNew) 
11320 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 65 65 72  */.  int regPeer
11330 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
11340 20 20 20 20 20 2f 2a 20 50 65 65 72 20 76 61 6c       /* Peer val
11350 75 65 73 20 66 6f 72 20 63 75 72 72 65 6e 74 20  ues for current 
11360 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  row */.  int reg
11370 46 6c 75 73 68 50 61 72 74 20 3d 20 30 3b 20 20  FlushPart = 0;  
11380 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
11390 73 74 65 72 20 66 6f 72 20 22 47 6f 73 75 62 20  ster for "Gosub 
113a0 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 22  flush_partition"
113b0 20 2a 2f 0a 20 20 57 69 6e 64 6f 77 43 6f 64 65   */.  WindowCode
113c0 41 72 67 20 73 3b 20 20 20 20 20 20 20 20 20 20  Arg s;          
113d0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74        /* Context
113e0 20 6f 62 6a 65 63 74 20 66 6f 72 20 73 75 62 2d   object for sub-
113f0 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20 69 6e  routines */.  in
11400 74 20 6c 62 6c 57 68 65 72 65 45 6e 64 3b 20 20  t lblWhereEnd;  
11410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11420 20 4c 61 62 65 6c 20 6a 75 73 74 20 62 65 66 6f   Label just befo
11430 72 65 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  re sqlite3WhereE
11440 6e 64 28 29 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  nd() code */..  
11450 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65  assert( pMWin->e
11460 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44  Start==TK_PRECED
11470 49 4e 47 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53  ING || pMWin->eS
11480 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54  tart==TK_CURRENT
11490 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69   .       || pMWi
114a0 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f  n->eStart==TK_FO
114b0 4c 4c 4f 57 49 4e 47 20 7c 7c 20 70 4d 57 69 6e  LLOWING || pMWin
114c0 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42  ->eStart==TK_UNB
114d0 4f 55 4e 44 45 44 20 0a 20 20 29 3b 0a 20 20 61  OUNDED .  );.  a
114e0 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 45  ssert( pMWin->eE
114f0 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  nd==TK_FOLLOWING
11500 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d   || pMWin->eEnd=
11510 3d 54 4b 5f 43 55 52 52 45 4e 54 20 0a 20 20 20  =TK_CURRENT .   
11520 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45      || pMWin->eE
11530 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  nd==TK_UNBOUNDED
11540 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d   || pMWin->eEnd=
11550 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 0a 20  =TK_PRECEDING . 
11560 20 29 3b 0a 0a 20 20 6c 62 6c 57 68 65 72 65 45   );..  lblWhereE
11570 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nd = sqlite3Vdbe
11580 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65  MakeLabel(pParse
11590 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  );..  /* Fill in
115a0 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 62 6a   the context obj
115b0 65 63 74 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ect */.  memset(
115c0 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57 69  &s, 0, sizeof(Wi
115d0 6e 64 6f 77 43 6f 64 65 41 72 67 29 29 3b 0a 20  ndowCodeArg));. 
115e0 20 73 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   s.pParse = pPar
115f0 73 65 3b 0a 20 20 73 2e 70 4d 57 69 6e 20 3d 20  se;.  s.pMWin = 
11600 70 4d 57 69 6e 3b 0a 20 20 73 2e 70 56 64 62 65  pMWin;.  s.pVdbe
11610 20 3d 20 76 3b 0a 20 20 73 2e 72 65 67 47 6f 73   = v;.  s.regGos
11620 75 62 20 3d 20 72 65 67 47 6f 73 75 62 3b 0a 20  ub = regGosub;. 
11630 20 73 2e 61 64 64 72 47 6f 73 75 62 20 3d 20 61   s.addrGosub = a
11640 64 64 72 47 6f 73 75 62 3b 0a 20 20 73 2e 63 75  ddrGosub;.  s.cu
11650 72 72 65 6e 74 2e 63 73 72 20 3d 20 70 4d 57 69  rrent.csr = pMWi
11660 6e 2d 3e 69 45 70 68 43 73 72 3b 0a 20 20 63 73  n->iEphCsr;.  cs
11670 72 57 72 69 74 65 20 3d 20 73 2e 63 75 72 72 65  rWrite = s.curre
11680 6e 74 2e 63 73 72 2b 31 3b 0a 20 20 73 2e 73 74  nt.csr+1;.  s.st
11690 61 72 74 2e 63 73 72 20 3d 20 73 2e 63 75 72 72  art.csr = s.curr
116a0 65 6e 74 2e 63 73 72 2b 32 3b 0a 20 20 73 2e 65  ent.csr+2;.  s.e
116b0 6e 64 2e 63 73 72 20 3d 20 73 2e 63 75 72 72 65  nd.csr = s.curre
116c0 6e 74 2e 63 73 72 2b 33 3b 0a 0a 20 20 2f 2a 20  nt.csr+3;..  /* 
116d0 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 6e 20  Figure out when 
116e0 72 6f 77 73 20 6d 61 79 20 62 65 20 64 65 6c 65  rows may be dele
116f0 74 65 64 20 66 72 6f 6d 20 74 68 65 20 65 70 68  ted from the eph
11700 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20 54 68  emeral table. Th
11710 65 72 65 0a 20 20 2a 2a 20 61 72 65 20 66 6f 75  ere.  ** are fou
11720 72 20 6f 70 74 69 6f 6e 73 20 2d 20 74 68 65 79  r options - they
11730 20 6d 61 79 20 6e 65 76 65 72 20 62 65 20 64 65   may never be de
11740 6c 65 74 65 64 20 28 65 44 65 6c 65 74 65 3d 3d  leted (eDelete==
11750 30 29 2c 20 74 68 65 79 20 6d 61 79 20 0a 20 20  0), they may .  
11760 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 61 73  ** be deleted as
11770 20 73 6f 6f 6e 20 61 73 20 74 68 65 79 20 61 72   soon as they ar
11780 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 70 61 72 74  e no longer part
11790 20 6f 66 20 74 68 65 20 77 69 6e 64 6f 77 20 66   of the window f
117a0 72 61 6d 65 0a 20 20 2a 2a 20 28 65 44 65 6c 65  rame.  ** (eDele
117b0 74 65 3d 3d 57 49 4e 44 4f 57 5f 41 47 47 49 4e  te==WINDOW_AGGIN
117c0 56 45 52 53 45 29 2c 20 74 68 65 79 20 6d 61 79  VERSE), they may
117d0 20 62 65 20 64 65 6c 65 74 65 64 20 61 73 20 61   be deleted as a
117e0 66 74 65 72 20 74 68 65 20 72 6f 77 20 0a 20 20  fter the row .  
117f0 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 65 74 75  ** has been retu
11800 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
11810 65 72 20 28 57 49 4e 44 4f 57 5f 52 45 54 55 52  er (WINDOW_RETUR
11820 4e 5f 52 4f 57 29 2c 20 6f 72 20 74 68 65 79 20  N_ROW), or they 
11830 6d 61 79 0a 20 20 2a 2a 20 62 65 20 64 65 6c 65  may.  ** be dele
11840 74 65 64 20 61 66 74 65 72 20 74 68 65 79 20 65  ted after they e
11850 6e 74 65 72 20 74 68 65 20 66 72 61 6d 65 20 28  nter the frame (
11860 57 49 4e 44 4f 57 5f 41 47 47 53 54 45 50 29 2e  WINDOW_AGGSTEP).
11870 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70 4d   */.  switch( pM
11880 57 69 6e 2d 3e 65 53 74 61 72 74 20 29 7b 0a 20  Win->eStart ){. 
11890 20 20 20 63 61 73 65 20 54 4b 5f 46 4f 4c 4c 4f     case TK_FOLLO
118a0 57 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 73 71  WING: {.      sq
118b0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
118c0 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 73 71  se->db;.      sq
118d0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
118e0 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  l = 0;.      sql
118f0 69 74 65 33 56 61 6c 75 65 46 72 6f 6d 45 78 70  ite3ValueFromExp
11900 72 28 64 62 2c 20 70 4d 57 69 6e 2d 3e 70 53 74  r(db, pMWin->pSt
11910 61 72 74 2c 20 64 62 2d 3e 65 6e 63 2c 53 51 4c  art, db->enc,SQL
11920 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 2c  ITE_AFF_NUMERIC,
11930 26 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 66  &pVal);.      if
11940 28 20 70 56 61 6c 20 26 26 20 73 71 6c 69 74 65  ( pVal && sqlite
11950 33 5f 76 61 6c 75 65 5f 69 6e 74 28 70 56 61 6c  3_value_int(pVal
11960 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  )>0 ){.        s
11970 2e 65 44 65 6c 65 74 65 20 3d 20 57 49 4e 44 4f  .eDelete = WINDO
11980 57 5f 52 45 54 55 52 4e 5f 52 4f 57 3b 0a 20 20  W_RETURN_ROW;.  
11990 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
119a0 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
119b0 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
119c0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
119d0 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 3a 0a 20 20  TK_UNBOUNDED:.  
119e0 20 20 20 20 69 66 28 20 77 69 6e 64 6f 77 43 61      if( windowCa
119f0 63 68 65 46 72 61 6d 65 28 70 4d 57 69 6e 29 3d  cheFrame(pMWin)=
11a00 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
11a10 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54  ( pMWin->eEnd==T
11a20 4b 5f 50 52 45 43 45 44 49 4e 47 20 29 7b 0a 20  K_PRECEDING ){. 
11a30 20 20 20 20 20 20 20 20 20 73 2e 65 44 65 6c 65           s.eDele
11a40 74 65 20 3d 20 57 49 4e 44 4f 57 5f 41 47 47 53  te = WINDOW_AGGS
11a50 54 45 50 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  TEP;.        }el
11a60 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 2e  se{.          s.
11a70 65 44 65 6c 65 74 65 20 3d 20 57 49 4e 44 4f 57  eDelete = WINDOW
11a80 5f 52 45 54 55 52 4e 5f 52 4f 57 3b 0a 20 20 20  _RETURN_ROW;.   
11a90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
11aa0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11ab0 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 73  default:.      s
11ac0 2e 65 44 65 6c 65 74 65 20 3d 20 57 49 4e 44 4f  .eDelete = WINDO
11ad0 57 5f 41 47 47 49 4e 56 45 52 53 45 3b 0a 20 20  W_AGGINVERSE;.  
11ae0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
11af0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 72 65    /* Allocate re
11b00 67 69 73 74 65 72 73 20 66 6f 72 20 74 68 65 20  gisters for the 
11b10 61 72 72 61 79 20 6f 66 20 76 61 6c 75 65 73 20  array of values 
11b20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 71 75 65  from the sub-que
11b30 72 79 2c 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d  ry, the.  ** sam
11b40 76 65 20 76 61 6c 75 65 73 20 69 6e 20 72 65 63  ve values in rec
11b50 6f 72 64 20 66 6f 72 6d 2c 20 61 6e 64 20 74 68  ord form, and th
11b60 65 20 72 6f 77 69 64 20 75 73 65 64 20 74 6f 20  e rowid used to 
11b70 69 6e 73 65 72 74 20 73 61 69 64 20 72 65 63 6f  insert said reco
11b80 72 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65  rd.  ** into the
11b90 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
11ba0 2e 20 20 2a 2f 0a 20 20 72 65 67 4e 65 77 20 3d  .  */.  regNew =
11bb0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
11bc0 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  .  pParse->nMem 
11bd0 2b 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 72 65 67  += nInput;.  reg
11be0 52 65 63 6f 72 64 20 3d 20 2b 2b 70 50 61 72 73  Record = ++pPars
11bf0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 52 6f  e->nMem;.  regRo
11c00 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  wid = ++pParse->
11c10 6e 4d 65 6d 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  nMem;..  /* If t
11c20 68 65 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 20  he window frame 
11c30 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 3c 65 78  contains an "<ex
11c40 70 72 3e 20 50 52 45 43 45 44 49 4e 47 22 20 6f  pr> PRECEDING" o
11c50 72 20 22 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57  r "<expr> FOLLOW
11c60 49 4e 47 22 0a 20 20 2a 2a 20 63 6c 61 75 73 65  ING".  ** clause
11c70 2c 20 61 6c 6c 6f 63 61 74 65 20 72 65 67 69 73  , allocate regis
11c80 74 65 72 73 20 74 6f 20 73 74 6f 72 65 20 74 68  ters to store th
11c90 65 20 72 65 73 75 6c 74 73 20 6f 66 20 65 76 61  e results of eva
11ca0 6c 75 61 74 69 6e 67 20 65 61 63 68 0a 20 20 2a  luating each.  *
11cb0 2a 20 3c 65 78 70 72 3e 2e 20 20 2a 2f 0a 20 20  * <expr>.  */.  
11cc0 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72  if( pMWin->eStar
11cd0 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20  t==TK_PRECEDING 
11ce0 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  || pMWin->eStart
11cf0 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29  ==TK_FOLLOWING )
11d00 7b 0a 20 20 20 20 72 65 67 53 74 61 72 74 20 3d  {.    regStart =
11d10 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
11d20 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d 57 69 6e  .  }.  if( pMWin
11d30 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45  ->eEnd==TK_PRECE
11d40 44 49 4e 47 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65  DING || pMWin->e
11d50 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e  End==TK_FOLLOWIN
11d60 47 20 29 7b 0a 20 20 20 20 72 65 67 45 6e 64 20  G ){.    regEnd 
11d70 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
11d80 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
11d90 68 69 73 20 69 73 20 6e 6f 74 20 61 20 22 52 4f  his is not a "RO
11da0 57 53 20 42 45 54 57 45 45 4e 20 2e 2e 2e 22 20  WS BETWEEN ..." 
11db0 66 72 61 6d 65 2c 20 74 68 65 6e 20 61 6c 6c 6f  frame, then allo
11dc0 63 61 74 65 20 61 72 72 61 79 73 20 6f 66 0a 20  cate arrays of. 
11dd0 20 2a 2a 20 72 65 67 69 73 74 65 72 73 20 74 6f   ** registers to
11de0 20 73 74 6f 72 65 20 63 6f 70 69 65 73 20 6f 66   store copies of
11df0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 65 78   the ORDER BY ex
11e00 70 72 65 73 73 69 6f 6e 73 20 28 70 65 65 72 20  pressions (peer 
11e10 76 61 6c 75 65 73 29 20 0a 20 20 2a 2a 20 66 6f  values) .  ** fo
11e20 72 20 74 68 65 20 6d 61 69 6e 20 6c 6f 6f 70 2c  r the main loop,
11e30 20 61 6e 64 20 66 6f 72 20 65 61 63 68 20 63 75   and for each cu
11e40 72 73 6f 72 20 28 73 74 61 72 74 2c 20 63 75 72  rsor (start, cur
11e50 72 65 6e 74 20 61 6e 64 20 65 6e 64 29 2e 20 2a  rent and end). *
11e60 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65  /.  if( pMWin->e
11e70 54 79 70 65 21 3d 54 4b 5f 52 4f 57 53 20 29 7b  Type!=TK_ROWS ){
11e80 0a 20 20 20 20 69 6e 74 20 6e 50 65 65 72 20 3d  .    int nPeer =
11e90 20 28 70 4f 72 64 65 72 42 79 20 3f 20 70 4f 72   (pOrderBy ? pOr
11ea0 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30  derBy->nExpr : 0
11eb0 29 3b 0a 20 20 20 20 72 65 67 4e 65 77 50 65 65  );.    regNewPee
11ec0 72 20 3d 20 72 65 67 4e 65 77 20 2b 20 70 4d 57  r = regNew + pMW
11ed0 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 3b 0a  in->nBufferCol;.
11ee0 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70      if( pMWin->p
11ef0 50 61 72 74 69 74 69 6f 6e 20 29 20 72 65 67 4e  Partition ) regN
11f00 65 77 50 65 65 72 20 2b 3d 20 70 4d 57 69 6e 2d  ewPeer += pMWin-
11f10 3e 70 50 61 72 74 69 74 69 6f 6e 2d 3e 6e 45 78  >pPartition->nEx
11f20 70 72 3b 0a 20 20 20 20 72 65 67 50 65 65 72 20  pr;.    regPeer 
11f30 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
11f40 3b 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;       pParse->
11f50 6e 4d 65 6d 20 2b 3d 20 6e 50 65 65 72 3b 0a 20  nMem += nPeer;. 
11f60 20 20 20 73 2e 73 74 61 72 74 2e 72 65 67 20 3d     s.start.reg =
11f70 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
11f80 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
11f90 2b 3d 20 6e 50 65 65 72 3b 0a 20 20 20 20 73 2e  += nPeer;.    s.
11fa0 63 75 72 72 65 6e 74 2e 72 65 67 20 3d 20 70 50  current.reg = pP
11fb0 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 20 70 50  arse->nMem+1; pP
11fc0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50  arse->nMem += nP
11fd0 65 65 72 3b 0a 20 20 20 20 73 2e 65 6e 64 2e 72  eer;.    s.end.r
11fe0 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  eg = pParse->nMe
11ff0 6d 2b 31 3b 20 20 20 20 20 70 50 61 72 73 65 2d  m+1;     pParse-
12000 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 65 65 72 3b 0a  >nMem += nPeer;.
12010 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74    }..  /* Load t
12020 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73  he column values
12030 20 66 6f 72 20 74 68 65 20 72 6f 77 20 72 65 74   for the row ret
12040 75 72 6e 65 64 20 62 79 20 74 68 65 20 73 75 62  urned by the sub
12050 2d 73 65 6c 65 63 74 0a 20 20 2a 2a 20 69 6e 74  -select.  ** int
12060 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65  o an array of re
12070 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
12080 20 61 74 20 72 65 67 4e 65 77 2e 20 41 73 73 65   at regNew. Asse
12090 6d 62 6c 65 20 74 68 65 6d 20 69 6e 74 6f 0a 20  mble them into. 
120a0 20 2a 2a 20 61 20 72 65 63 6f 72 64 20 69 6e 20   ** a record in 
120b0 72 65 67 69 73 74 65 72 20 72 65 67 52 65 63 6f  register regReco
120c0 72 64 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 49 6e  rd. */.  for(iIn
120d0 70 75 74 3d 30 3b 20 69 49 6e 70 75 74 3c 6e 49  put=0; iInput<nI
120e0 6e 70 75 74 3b 20 69 49 6e 70 75 74 2b 2b 29 7b  nput; iInput++){
120f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12100 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
12110 75 6d 6e 2c 20 63 73 72 49 6e 70 75 74 2c 20 69  umn, csrInput, i
12120 49 6e 70 75 74 2c 20 72 65 67 4e 65 77 2b 69 49  Input, regNew+iI
12130 6e 70 75 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  nput);.  }.  sql
12140 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
12150 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
12160 20 72 65 67 4e 65 77 2c 20 6e 49 6e 70 75 74 2c   regNew, nInput,
12170 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 0a 20 20   regRecord);..  
12180 2f 2a 20 41 6e 20 69 6e 70 75 74 20 72 6f 77 20  /* An input row 
12190 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 65  has just been re
121a0 61 64 20 69 6e 74 6f 20 61 6e 20 61 72 72 61 79  ad into an array
121b0 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 73 74   of registers st
121c0 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 72  arting.  ** at r
121d0 65 67 4e 65 77 2e 20 49 66 20 74 68 65 20 77 69  egNew. If the wi
121e0 6e 64 6f 77 20 68 61 73 20 61 20 50 41 52 54 49  ndow has a PARTI
121f0 54 49 4f 4e 20 63 6c 61 75 73 65 2c 20 74 68 69  TION clause, thi
12200 73 20 62 6c 6f 63 6b 20 67 65 6e 65 72 61 74 65  s block generate
12210 73 20 0a 20 20 2a 2a 20 56 4d 20 63 6f 64 65 20  s .  ** VM code 
12220 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  to check if the 
12230 69 6e 70 75 74 20 72 6f 77 20 69 73 20 74 68 65  input row is the
12240 20 73 74 61 72 74 20 6f 66 20 61 20 6e 65 77 20   start of a new 
12250 70 61 72 74 69 74 69 6f 6e 2e 0a 20 20 2a 2a 20  partition..  ** 
12260 49 66 20 73 6f 2c 20 69 74 20 64 6f 65 73 20 61  If so, it does a
12270 6e 20 4f 50 5f 47 6f 73 75 62 20 74 6f 20 61 6e  n OP_Gosub to an
12280 20 61 64 64 72 65 73 73 20 74 6f 20 62 65 20 66   address to be f
12290 69 6c 6c 65 64 20 69 6e 20 6c 61 74 65 72 2e 20  illed in later. 
122a0 54 68 65 0a 20 20 2a 2a 20 61 64 64 72 65 73 73  The.  ** address
122b0 20 6f 66 20 74 68 65 20 4f 50 5f 47 6f 73 75 62   of the OP_Gosub
122c0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6c 6f   is stored in lo
122d0 63 61 6c 20 76 61 72 69 61 62 6c 65 20 61 64 64  cal variable add
122e0 72 47 6f 73 75 62 46 6c 75 73 68 2e 20 2a 2f 0a  rGosubFlush. */.
122f0 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70 50 61    if( pMWin->pPa
12300 72 74 69 74 69 6f 6e 20 29 7b 0a 20 20 20 20 69  rtition ){.    i
12310 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 45 78 70  nt addr;.    Exp
12320 72 4c 69 73 74 20 2a 70 50 61 72 74 20 3d 20 70  rList *pPart = p
12330 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e  MWin->pPartition
12340 3b 0a 20 20 20 20 69 6e 74 20 6e 50 61 72 74 20  ;.    int nPart 
12350 3d 20 70 50 61 72 74 2d 3e 6e 45 78 70 72 3b 0a  = pPart->nExpr;.
12360 20 20 20 20 69 6e 74 20 72 65 67 4e 65 77 50 61      int regNewPa
12370 72 74 20 3d 20 72 65 67 4e 65 77 20 2b 20 70 4d  rt = regNew + pM
12380 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 3b  Win->nBufferCol;
12390 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
123a0 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
123b0 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  KeyInfoFromExprL
123c0 69 73 74 28 70 50 61 72 73 65 2c 20 70 50 61 72  ist(pParse, pPar
123d0 74 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 72  t, 0, 0);..    r
123e0 65 67 46 6c 75 73 68 50 61 72 74 20 3d 20 2b 2b  egFlushPart = ++
123f0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
12400 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
12410 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
12420 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67 4e 65 77  _Compare, regNew
12430 50 61 72 74 2c 20 70 4d 57 69 6e 2d 3e 72 65 67  Part, pMWin->reg
12440 50 61 72 74 2c 20 6e 50 61 72 74 29 3b 0a 20 20  Part, nPart);.  
12450 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70    sqlite3VdbeApp
12460 65 6e 64 50 34 28 76 2c 20 28 76 6f 69 64 2a 29  endP4(v, (void*)
12470 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
12480 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74  INFO);.    sqlit
12490 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
124a0 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 2b 32 2c  OP_Jump, addr+2,
124b0 20 61 64 64 72 2b 34 2c 20 61 64 64 72 2b 32 29   addr+4, addr+2)
124c0 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
124d0 67 65 45 71 4e 65 28 76 29 3b 0a 20 20 20 20 61  geEqNe(v);.    a
124e0 64 64 72 47 6f 73 75 62 46 6c 75 73 68 20 3d 20  ddrGosubFlush = 
124f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12500 31 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  1(v, OP_Gosub, r
12510 65 67 46 6c 75 73 68 50 61 72 74 29 3b 0a 20 20  egFlushPart);.  
12520 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
12530 2c 20 22 63 61 6c 6c 20 66 6c 75 73 68 5f 70 61  , "call flush_pa
12540 72 74 69 74 69 6f 6e 22 29 29 3b 0a 20 20 20 20  rtition"));.    
12550 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12560 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65  3(v, OP_Copy, re
12570 67 4e 65 77 50 61 72 74 2c 20 70 4d 57 69 6e 2d  gNewPart, pMWin-
12580 3e 72 65 67 50 61 72 74 2c 20 6e 50 61 72 74 2d  >regPart, nPart-
12590 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e  1);.  }..  /* In
125a0 73 65 72 74 20 74 68 65 20 6e 65 77 20 72 6f 77  sert the new row
125b0 20 69 6e 74 6f 20 74 68 65 20 65 70 68 65 6d 65   into the epheme
125c0 72 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  ral table */.  s
125d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
125e0 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
125f0 20 63 73 72 57 72 69 74 65 2c 20 72 65 67 52 6f   csrWrite, regRo
12600 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  wid);.  sqlite3V
12610 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
12620 49 6e 73 65 72 74 2c 20 63 73 72 57 72 69 74 65  Insert, csrWrite
12630 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 72 65 67  , regRecord, reg
12640 52 6f 77 69 64 29 3b 0a 0a 20 20 61 64 64 72 49  Rowid);..  addrI
12650 66 4e 6f 74 20 3d 20 73 71 6c 69 74 65 33 56 64  fNot = sqlite3Vd
12660 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
12670 66 4e 6f 74 2c 20 70 4d 57 69 6e 2d 3e 72 65 67  fNot, pMWin->reg
12680 46 69 72 73 74 29 3b 0a 0a 20 20 2f 2a 20 54 68  First);..  /* Th
12690 69 73 20 62 6c 6f 63 6b 20 69 73 20 72 75 6e 20  is block is run 
126a0 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 6f  for the first ro
126b0 77 20 6f 66 20 65 61 63 68 20 70 61 72 74 69 74  w of each partit
126c0 69 6f 6e 20 2a 2f 0a 20 20 73 2e 72 65 67 41 72  ion */.  s.regAr
126d0 67 20 3d 20 77 69 6e 64 6f 77 49 6e 69 74 41 63  g = windowInitAc
126e0 63 75 6d 28 70 50 61 72 73 65 2c 20 70 4d 57 69  cum(pParse, pMWi
126f0 6e 29 3b 0a 0a 20 20 69 66 28 20 72 65 67 53 74  n);..  if( regSt
12700 61 72 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  art ){.    sqlit
12710 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
12720 65 2c 20 70 4d 57 69 6e 2d 3e 70 53 74 61 72 74  e, pMWin->pStart
12730 2c 20 72 65 67 53 74 61 72 74 29 3b 0a 20 20 20  , regStart);.   
12740 20 77 69 6e 64 6f 77 43 68 65 63 6b 56 61 6c 75   windowCheckValu
12750 65 28 70 50 61 72 73 65 2c 20 72 65 67 53 74 61  e(pParse, regSta
12760 72 74 2c 20 30 20 2b 20 28 70 4d 57 69 6e 2d 3e  rt, 0 + (pMWin->
12770 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 20  eType==TK_RANGE 
12780 3f 20 33 20 3a 20 30 29 29 3b 0a 20 20 7d 0a 20  ? 3 : 0));.  }. 
12790 20 69 66 28 20 72 65 67 45 6e 64 20 29 7b 0a 20   if( regEnd ){. 
127a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
127b0 64 65 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  de(pParse, pMWin
127c0 2d 3e 70 45 6e 64 2c 20 72 65 67 45 6e 64 29 3b  ->pEnd, regEnd);
127d0 0a 20 20 20 20 77 69 6e 64 6f 77 43 68 65 63 6b  .    windowCheck
127e0 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 72 65  Value(pParse, re
127f0 67 45 6e 64 2c 20 31 20 2b 20 28 70 4d 57 69 6e  gEnd, 1 + (pMWin
12800 2d 3e 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47  ->eType==TK_RANG
12810 45 20 3f 20 33 20 3a 20 30 29 29 3b 0a 20 20 7d  E ? 3 : 0));.  }
12820 0a 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65  ..  if( pMWin->e
12830 53 74 61 72 74 3d 3d 70 4d 57 69 6e 2d 3e 65 45  Start==pMWin->eE
12840 6e 64 20 26 26 20 72 65 67 53 74 61 72 74 20 26  nd && regStart &
12850 26 20 72 65 67 45 6e 64 20 29 7b 0a 20 20 20 20  & regEnd ){.    
12860 69 6e 74 20 6f 70 20 3d 20 28 28 70 4d 57 69 6e  int op = ((pMWin
12870 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c  ->eStart==TK_FOL
12880 4c 4f 57 49 4e 47 29 20 3f 20 4f 50 5f 47 65 20  LOWING) ? OP_Ge 
12890 3a 20 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 69 6e  : OP_Le);.    in
128a0 74 20 61 64 64 72 47 65 20 3d 20 73 71 6c 69 74  t addrGe = sqlit
128b0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
128c0 6f 70 2c 20 72 65 67 53 74 61 72 74 2c 20 30 2c  op, regStart, 0,
128d0 20 72 65 67 45 6e 64 29 3b 0a 20 20 20 20 77 69   regEnd);.    wi
128e0 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 70 50 61  ndowAggFinal(pPa
128f0 72 73 65 2c 20 70 4d 57 69 6e 2c 20 30 29 3b 0a  rse, pMWin, 0);.
12900 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12910 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
12920 6e 64 2c 20 73 2e 63 75 72 72 65 6e 74 2e 63 73  nd, s.current.cs
12930 72 2c 20 31 29 3b 0a 20 20 20 20 77 69 6e 64 6f  r, 1);.    windo
12940 77 52 65 74 75 72 6e 4f 6e 65 52 6f 77 28 70 50  wReturnOneRow(pP
12950 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 72 65 67  arse, pMWin, reg
12960 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62  Gosub, addrGosub
12970 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
12980 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
12990 65 73 65 74 53 6f 72 74 65 72 2c 20 73 2e 63 75  esetSorter, s.cu
129a0 72 72 65 6e 74 2e 63 73 72 29 3b 0a 20 20 20 20  rrent.csr);.    
129b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
129c0 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
129d0 20 6c 62 6c 57 68 65 72 65 45 6e 64 29 3b 0a 20   lblWhereEnd);. 
129e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
129f0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 47 65  mpHere(v, addrGe
12a00 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d 57  );.  }.  if( pMW
12a10 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46  in->eStart==TK_F
12a20 4f 4c 4c 4f 57 49 4e 47 20 26 26 20 70 4d 57 69  OLLOWING && pMWi
12a30 6e 2d 3e 65 54 79 70 65 21 3d 54 4b 5f 52 41 4e  n->eType!=TK_RAN
12a40 47 45 20 26 26 20 72 65 67 45 6e 64 20 29 7b 0a  GE && regEnd ){.
12a50 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 57 69      assert( pMWi
12a60 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c  n->eEnd==TK_FOLL
12a70 4f 57 49 4e 47 20 29 3b 0a 20 20 20 20 73 71 6c  OWING );.    sql
12a80 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
12a90 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72  , OP_Subtract, r
12aa0 65 67 53 74 61 72 74 2c 20 72 65 67 45 6e 64 2c  egStart, regEnd,
12ab0 20 72 65 67 53 74 61 72 74 29 3b 0a 20 20 7d 0a   regStart);.  }.
12ac0 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53  .  if( pMWin->eS
12ad0 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44  tart!=TK_UNBOUND
12ae0 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ED ){.    sqlite
12af0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12b00 50 5f 52 65 77 69 6e 64 2c 20 73 2e 73 74 61 72  P_Rewind, s.star
12b10 74 2e 63 73 72 2c 20 31 29 3b 0a 20 20 7d 0a 20  t.csr, 1);.  }. 
12b20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12b30 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
12b40 20 73 2e 63 75 72 72 65 6e 74 2e 63 73 72 2c 20   s.current.csr, 
12b50 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
12b60 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
12b70 77 69 6e 64 2c 20 73 2e 65 6e 64 2e 63 73 72 2c  wind, s.end.csr,
12b80 20 31 29 3b 0a 20 20 69 66 28 20 72 65 67 50 65   1);.  if( regPe
12b90 65 72 20 26 26 20 70 4f 72 64 65 72 42 79 20 29  er && pOrderBy )
12ba0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
12bb0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
12bc0 70 79 2c 20 72 65 67 4e 65 77 50 65 65 72 2c 20  py, regNewPeer, 
12bd0 72 65 67 50 65 65 72 2c 20 70 4f 72 64 65 72 42  regPeer, pOrderB
12be0 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20  y->nExpr-1);.   
12bf0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12c00 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p3(v, OP_Copy, r
12c10 65 67 50 65 65 72 2c 20 73 2e 73 74 61 72 74 2e  egPeer, s.start.
12c20 72 65 67 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  reg, pOrderBy->n
12c30 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 73 71 6c  Expr-1);.    sql
12c40 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
12c50 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 50 65  , OP_Copy, regPe
12c60 65 72 2c 20 73 2e 63 75 72 72 65 6e 74 2e 72 65  er, s.current.re
12c70 67 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  g, pOrderBy->nEx
12c80 70 72 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  pr-1);.    sqlit
12c90 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
12ca0 4f 50 5f 43 6f 70 79 2c 20 72 65 67 50 65 65 72  OP_Copy, regPeer
12cb0 2c 20 73 2e 65 6e 64 2e 72 65 67 2c 20 70 4f 72  , s.end.reg, pOr
12cc0 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b  derBy->nExpr-1);
12cd0 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56  .  }..  sqlite3V
12ce0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12cf0 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 4d 57 69  Integer, 0, pMWi
12d00 6e 2d 3e 72 65 67 46 69 72 73 74 29 3b 0a 20 20  n->regFirst);.  
12d10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12d20 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
12d30 20 6c 62 6c 57 68 65 72 65 45 6e 64 29 3b 0a 0a   lblWhereEnd);..
12d40 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
12d50 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 66 4e  pHere(v, addrIfN
12d60 6f 74 29 3b 0a 20 20 69 66 28 20 72 65 67 50 65  ot);.  if( regPe
12d70 65 72 20 29 7b 0a 20 20 20 20 77 69 6e 64 6f 77  er ){.    window
12d80 49 66 4e 65 77 50 65 65 72 28 70 50 61 72 73 65  IfNewPeer(pParse
12d90 2c 20 70 4f 72 64 65 72 42 79 2c 20 72 65 67 4e  , pOrderBy, regN
12da0 65 77 50 65 65 72 2c 20 72 65 67 50 65 65 72 2c  ewPeer, regPeer,
12db0 20 6c 62 6c 57 68 65 72 65 45 6e 64 29 3b 0a 20   lblWhereEnd);. 
12dc0 20 7d 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e   }.  if( pMWin->
12dd0 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f  eStart==TK_FOLLO
12de0 57 49 4e 47 20 29 7b 0a 20 20 20 20 77 69 6e 64  WING ){.    wind
12df0 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e  owCodeOp(&s, WIN
12e00 44 4f 57 5f 41 47 47 53 54 45 50 2c 20 30 2c 20  DOW_AGGSTEP, 0, 
12e10 30 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 57 69  0);.    if( pMWi
12e20 6e 2d 3e 65 45 6e 64 21 3d 54 4b 5f 55 4e 42 4f  n->eEnd!=TK_UNBO
12e30 55 4e 44 45 44 20 29 7b 0a 20 20 20 20 20 20 69  UNDED ){.      i
12e40 66 28 20 70 4d 57 69 6e 2d 3e 65 54 79 70 65 3d  f( pMWin->eType=
12e50 3d 54 4b 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20  =TK_RANGE ){.   
12e60 20 20 20 20 20 69 6e 74 20 6c 62 6c 20 3d 20 73       int lbl = s
12e70 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
12e80 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20  bel(pParse);.   
12e90 20 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78       int addrNex
12ea0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
12eb0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
12ec0 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64         windowCod
12ed0 65 52 61 6e 67 65 54 65 73 74 28 26 73 2c 20 4f  eRangeTest(&s, O
12ee0 50 5f 47 65 2c 20 73 2e 63 75 72 72 65 6e 74 2e  P_Ge, s.current.
12ef0 63 73 72 2c 20 72 65 67 45 6e 64 2c 20 73 2e 65  csr, regEnd, s.e
12f00 6e 64 2e 63 73 72 2c 20 6c 62 6c 29 3b 0a 20 20  nd.csr, lbl);.  
12f10 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65        windowCode
12f20 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47  Op(&s, WINDOW_AG
12f30 47 49 4e 56 45 52 53 45 2c 20 72 65 67 53 74 61  GINVERSE, regSta
12f40 72 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  rt, 0);.        
12f50 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c  windowCodeOp(&s,
12f60 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52   WINDOW_RETURN_R
12f70 4f 57 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  OW, 0, 0);.     
12f80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12f90 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
12fa0 20 30 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20   0, addrNext);. 
12fb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
12fc0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
12fd0 2c 20 6c 62 6c 29 3b 0a 20 20 20 20 20 20 7d 65  , lbl);.      }e
12fe0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 77 69 6e  lse{.        win
12ff0 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49  dowCodeOp(&s, WI
13000 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c  NDOW_RETURN_ROW,
13010 20 72 65 67 45 6e 64 2c 20 30 29 3b 0a 20 20 20   regEnd, 0);.   
13020 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f       windowCodeO
13030 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47  p(&s, WINDOW_AGG
13040 49 4e 56 45 52 53 45 2c 20 72 65 67 53 74 61 72  INVERSE, regStar
13050 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
13060 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 20 20 69     }.  }else.  i
13070 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  f( pMWin->eEnd==
13080 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 29 7b 0a  TK_PRECEDING ){.
13090 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70      windowCodeOp
130a0 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 53  (&s, WINDOW_AGGS
130b0 54 45 50 2c 20 72 65 67 45 6e 64 2c 20 30 29 3b  TEP, regEnd, 0);
130c0 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f  .    windowCodeO
130d0 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54  p(&s, WINDOW_RET
130e0 55 52 4e 5f 52 4f 57 2c 20 30 2c 20 30 29 3b 0a  URN_ROW, 0, 0);.
130f0 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70      windowCodeOp
13100 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49  (&s, WINDOW_AGGI
13110 4e 56 45 52 53 45 2c 20 72 65 67 53 74 61 72 74  NVERSE, regStart
13120 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
13130 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
13140 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73   windowCodeOp(&s
13150 2c 20 57 49 4e 44 4f 57 5f 41 47 47 53 54 45 50  , WINDOW_AGGSTEP
13160 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
13170 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 21 3d 54 4b   pMWin->eEnd!=TK
13180 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20  _UNBOUNDED ){.  
13190 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65      if( pMWin->e
131a0 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 29  Type==TK_RANGE )
131b0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 62  {.        int lb
131c0 6c 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72 20  l;.        addr 
131d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
131e0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
131f0 20 20 20 20 20 69 66 28 20 72 65 67 45 6e 64 20       if( regEnd 
13200 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 62 6c  ){.          lbl
13210 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
13220 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
13230 0a 20 20 20 20 20 20 20 20 20 20 77 69 6e 64 6f  .          windo
13240 77 43 6f 64 65 52 61 6e 67 65 54 65 73 74 28 26  wCodeRangeTest(&
13250 73 2c 20 4f 50 5f 47 65 2c 20 73 2e 63 75 72 72  s, OP_Ge, s.curr
13260 65 6e 74 2e 63 73 72 2c 20 72 65 67 45 6e 64 2c  ent.csr, regEnd,
13270 20 73 2e 65 6e 64 2e 63 73 72 2c 20 6c 62 6c 29   s.end.csr, lbl)
13280 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13290 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70      windowCodeOp
132a0 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55  (&s, WINDOW_RETU
132b0 52 4e 5f 52 4f 57 2c 20 30 2c 20 30 29 3b 0a 20  RN_ROW, 0, 0);. 
132c0 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64         windowCod
132d0 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41  eOp(&s, WINDOW_A
132e0 47 47 49 4e 56 45 52 53 45 2c 20 72 65 67 53 74  GGINVERSE, regSt
132f0 61 72 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  art, 0);.       
13300 20 69 66 28 20 72 65 67 45 6e 64 20 29 7b 0a 20   if( regEnd ){. 
13310 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13320 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13330 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 29 3b  _Goto, 0, addr);
13340 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
13350 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
13360 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20 20 20 20  el(v, lbl);.    
13370 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
13380 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  e{.        if( r
13390 65 67 45 6e 64 20 29 20 61 64 64 72 20 3d 20 73  egEnd ) addr = s
133a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
133b0 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 72 65  (v, OP_IfPos, re
133c0 67 45 6e 64 2c 20 30 2c 20 31 29 3b 0a 20 20 20  gEnd, 0, 1);.   
133d0 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f       windowCodeO
133e0 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54  p(&s, WINDOW_RET
133f0 55 52 4e 5f 52 4f 57 2c 20 30 2c 20 30 29 3b 0a  URN_ROW, 0, 0);.
13400 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f          windowCo
13410 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f  deOp(&s, WINDOW_
13420 41 47 47 49 4e 56 45 52 53 45 2c 20 72 65 67 53  AGGINVERSE, regS
13430 74 61 72 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  tart, 0);.      
13440 20 20 69 66 28 20 72 65 67 45 6e 64 20 29 20 73    if( regEnd ) s
13450 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
13460 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
13470 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
13480 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20    /* End of the 
13490 6d 61 69 6e 20 69 6e 70 75 74 20 6c 6f 6f 70 20  main input loop 
134a0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
134b0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
134c0 6c 62 6c 57 68 65 72 65 45 6e 64 29 3b 0a 20 20  lblWhereEnd);.  
134d0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
134e0 70 57 49 6e 66 6f 29 3b 0a 0a 20 20 2f 2a 20 46  pWInfo);..  /* F
134f0 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20  all through */. 
13500 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70 50 61 72   if( pMWin->pPar
13510 74 69 74 69 6f 6e 20 29 7b 0a 20 20 20 20 61 64  tition ){.    ad
13520 64 72 49 6e 74 65 67 65 72 20 3d 20 73 71 6c 69  drInteger = sqli
13530 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13540 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
13550 72 65 67 46 6c 75 73 68 50 61 72 74 29 3b 0a 20  regFlushPart);. 
13560 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
13570 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 47 6f  mpHere(v, addrGo
13580 73 75 62 46 6c 75 73 68 29 3b 0a 20 20 7d 0a 0a  subFlush);.  }..
13590 20 20 61 64 64 72 45 6d 70 74 79 20 3d 20 73 71    addrEmpty = sq
135a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
135b0 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 63 73  v, OP_Rewind, cs
135c0 72 57 72 69 74 65 29 3b 0a 20 20 69 66 28 20 70  rWrite);.  if( p
135d0 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50  MWin->eEnd==TK_P
135e0 52 45 43 45 44 49 4e 47 20 29 7b 0a 20 20 20 20  RECEDING ){.    
135f0 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c  windowCodeOp(&s,
13600 20 57 49 4e 44 4f 57 5f 41 47 47 53 54 45 50 2c   WINDOW_AGGSTEP,
13610 20 72 65 67 45 6e 64 2c 20 30 29 3b 0a 20 20 20   regEnd, 0);.   
13620 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73   windowCodeOp(&s
13630 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f  , WINDOW_RETURN_
13640 52 4f 57 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 65  ROW, 0, 0);.  }e
13650 6c 73 65 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65  lse if( pMWin->e
13660 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57  Start==TK_FOLLOW
13670 49 4e 47 20 29 7b 0a 20 20 20 20 69 6e 74 20 61  ING ){.    int a
13680 64 64 72 53 74 61 72 74 3b 0a 20 20 20 20 69 6e  ddrStart;.    in
13690 74 20 61 64 64 72 42 72 65 61 6b 31 3b 0a 20 20  t addrBreak1;.  
136a0 20 20 69 6e 74 20 61 64 64 72 42 72 65 61 6b 32    int addrBreak2
136b0 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 42 72  ;.    int addrBr
136c0 65 61 6b 33 3b 0a 20 20 20 20 77 69 6e 64 6f 77  eak3;.    window
136d0 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f  CodeOp(&s, WINDO
136e0 57 5f 41 47 47 53 54 45 50 2c 20 30 2c 20 30 29  W_AGGSTEP, 0, 0)
136f0 3b 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d  ;.    if( pMWin-
13700 3e 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45  >eType==TK_RANGE
13710 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 53 74   ){.      addrSt
13720 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
13730 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
13740 0a 20 20 20 20 20 20 61 64 64 72 42 72 65 61 6b  .      addrBreak
13750 32 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70  2 = windowCodeOp
13760 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49  (&s, WINDOW_AGGI
13770 4e 56 45 52 53 45 2c 20 72 65 67 53 74 61 72 74  NVERSE, regStart
13780 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 64 64 72  , 1);.      addr
13790 42 72 65 61 6b 31 20 3d 20 77 69 6e 64 6f 77 43  Break1 = windowC
137a0 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57  odeOp(&s, WINDOW
137b0 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 30 2c 20  _RETURN_ROW, 0, 
137c0 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 20 20  1);.    }else.  
137d0 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e    if( pMWin->eEn
137e0 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20  d==TK_UNBOUNDED 
137f0 29 7b 0a 20 20 20 20 20 20 61 64 64 72 53 74 61  ){.      addrSta
13800 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
13810 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
13820 20 20 20 20 20 20 61 64 64 72 42 72 65 61 6b 31        addrBreak1
13830 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28   = windowCodeOp(
13840 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55 52  &s, WINDOW_RETUR
13850 4e 5f 52 4f 57 2c 20 72 65 67 53 74 61 72 74 2c  N_ROW, regStart,
13860 20 31 29 3b 0a 20 20 20 20 20 20 61 64 64 72 42   1);.      addrB
13870 72 65 61 6b 32 20 3d 20 77 69 6e 64 6f 77 43 6f  reak2 = windowCo
13880 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f  deOp(&s, WINDOW_
13890 41 47 47 49 4e 56 45 52 53 45 2c 20 30 2c 20 31  AGGINVERSE, 0, 1
138a0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
138b0 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 57 69      assert( pMWi
138c0 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c  n->eEnd==TK_FOLL
138d0 4f 57 49 4e 47 20 29 3b 0a 20 20 20 20 20 20 61  OWING );.      a
138e0 64 64 72 53 74 61 72 74 20 3d 20 73 71 6c 69 74  ddrStart = sqlit
138f0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
13900 72 28 76 29 3b 0a 20 20 20 20 20 20 61 64 64 72  r(v);.      addr
13910 42 72 65 61 6b 31 20 3d 20 77 69 6e 64 6f 77 43  Break1 = windowC
13920 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57  odeOp(&s, WINDOW
13930 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 72 65 67  _RETURN_ROW, reg
13940 45 6e 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 61  End, 1);.      a
13950 64 64 72 42 72 65 61 6b 32 20 3d 20 77 69 6e 64  ddrBreak2 = wind
13960 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e  owCodeOp(&s, WIN
13970 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 2c 20  DOW_AGGINVERSE, 
13980 72 65 67 53 74 61 72 74 2c 20 31 29 3b 0a 20 20  regStart, 1);.  
13990 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
139a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
139b0 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 53 74 61  Goto, 0, addrSta
139c0 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rt);.    sqlite3
139d0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
139e0 61 64 64 72 42 72 65 61 6b 32 29 3b 0a 20 20 20  addrBreak2);.   
139f0 20 61 64 64 72 53 74 61 72 74 20 3d 20 73 71 6c   addrStart = sql
13a00 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
13a10 64 64 72 28 76 29 3b 0a 20 20 20 20 61 64 64 72  ddr(v);.    addr
13a20 42 72 65 61 6b 33 20 3d 20 77 69 6e 64 6f 77 43  Break3 = windowC
13a30 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57  odeOp(&s, WINDOW
13a40 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 30 2c 20  _RETURN_ROW, 0, 
13a50 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
13a60 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
13a70 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 53 74 61  Goto, 0, addrSta
13a80 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rt);.    sqlite3
13a90 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
13aa0 61 64 64 72 42 72 65 61 6b 31 29 3b 0a 20 20 20  addrBreak1);.   
13ab0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
13ac0 48 65 72 65 28 76 2c 20 61 64 64 72 42 72 65 61  Here(v, addrBrea
13ad0 6b 33 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  k3);.  }else{.  
13ae0 20 20 69 6e 74 20 61 64 64 72 42 72 65 61 6b 3b    int addrBreak;
13af0 0a 20 20 20 20 69 6e 74 20 61 64 64 72 53 74 61  .    int addrSta
13b00 72 74 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f  rt;.    windowCo
13b10 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f  deOp(&s, WINDOW_
13b20 41 47 47 53 54 45 50 2c 20 30 2c 20 30 29 3b 0a  AGGSTEP, 0, 0);.
13b30 20 20 20 20 61 64 64 72 53 74 61 72 74 20 3d 20      addrStart = 
13b40 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
13b50 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 61  ntAddr(v);.    a
13b60 64 64 72 42 72 65 61 6b 20 3d 20 77 69 6e 64 6f  ddrBreak = windo
13b70 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44  wCodeOp(&s, WIND
13b80 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 30  OW_RETURN_ROW, 0
13b90 2c 20 31 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77  , 1);.    window
13ba0 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f  CodeOp(&s, WINDO
13bb0 57 5f 41 47 47 49 4e 56 45 52 53 45 2c 20 72 65  W_AGGINVERSE, re
13bc0 67 53 74 61 72 74 2c 20 30 29 3b 0a 20 20 20 20  gStart, 0);.    
13bd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13be0 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
13bf0 20 61 64 64 72 53 74 61 72 74 29 3b 0a 20 20 20   addrStart);.   
13c00 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
13c10 48 65 72 65 28 76 2c 20 61 64 64 72 42 72 65 61  Here(v, addrBrea
13c20 6b 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  k);.  }.  sqlite
13c30 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
13c40 20 61 64 64 72 45 6d 70 74 79 29 3b 0a 0a 20 20   addrEmpty);..  
13c50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13c60 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72  1(v, OP_ResetSor
13c70 74 65 72 2c 20 73 2e 63 75 72 72 65 6e 74 2e 63  ter, s.current.c
13c80 73 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  sr);.  sqlite3Vd
13c90 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
13ca0 6e 74 65 67 65 72 2c 20 31 2c 20 70 4d 57 69 6e  nteger, 1, pMWin
13cb0 2d 3e 72 65 67 46 69 72 73 74 29 3b 0a 20 20 69  ->regFirst);.  i
13cc0 66 28 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69  f( pMWin->pParti
13cd0 74 69 6f 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  tion ){.    sqli
13ce0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28  te3VdbeChangeP1(
13cf0 76 2c 20 61 64 64 72 49 6e 74 65 67 65 72 2c 20  v, addrInteger, 
13d00 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
13d10 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20  ntAddr(v));.    
13d20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13d30 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
13d40 72 65 67 46 6c 75 73 68 50 61 72 74 29 3b 0a 20  regFlushPart);. 
13d50 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20   }.}..#endif /* 
13d60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44  SQLITE_OMIT_WIND
13d70 4f 57 46 55 4e 43 20 2a 2f 0a                    OWFUNC */.