/ Hex Artifact Content
Login

Artifact e0b821aa2867661d36f4673208e0afa0a57b47575c28fd6281996b6513d8e0d0:


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 6e 74 68 5f 76 61 6c 75 65 28 29 2e 20  on nth_value(). 
1b60: 54 68 69 73 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  This.** implemen
1b70: 74 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 69  tation is used i
1b80: 6e 20 22 73 6c 6f 77 20 6d 6f 64 65 22 20 6f 6e  n "slow mode" on
1b90: 6c 79 20 2d 20 77 68 65 6e 20 74 68 65 20 45 58  ly - when the EX
1ba0: 43 4c 55 44 45 20 63 6c 61 75 73 65 0a 2a 2a 20  CLUDE clause.** 
1bb0: 69 73 20 6e 6f 74 20 73 65 74 20 74 6f 20 74 68  is not set to th
1bc0: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
1bd0: 22 4e 4f 20 4f 54 48 45 52 53 22 2e 0a 2a 2f 0a  "NO OTHERS"..*/.
1be0: 73 74 72 75 63 74 20 4e 74 68 56 61 6c 75 65 43  struct NthValueC
1bf0: 74 78 20 7b 0a 20 20 69 36 34 20 6e 53 74 65 70  tx {.  i64 nStep
1c00: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ;.  sqlite3_valu
1c10: 65 20 2a 70 56 61 6c 75 65 3b 0a 7d 3b 0a 73 74  e *pValue;.};.st
1c20: 61 74 69 63 20 76 6f 69 64 20 6e 74 68 5f 76 61  atic void nth_va
1c30: 6c 75 65 53 74 65 70 46 75 6e 63 28 0a 20 20 73  lueStepFunc(.  s
1c40: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1c50: 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72  pCtx, .  int nAr
1c60: 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  g,.  sqlite3_val
1c70: 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20  ue **apArg.){.  
1c80: 73 74 72 75 63 74 20 4e 74 68 56 61 6c 75 65 43  struct NthValueC
1c90: 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74  tx *p;.  p = (st
1ca0: 72 75 63 74 20 4e 74 68 56 61 6c 75 65 43 74 78  ruct NthValueCtx
1cb0: 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  *)sqlite3_aggreg
1cc0: 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78  ate_context(pCtx
1cd0: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
1ce0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 36   if( p ){.    i6
1cf0: 34 20 69 56 61 6c 3b 0a 20 20 20 20 73 77 69 74  4 iVal;.    swit
1d00: 63 68 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ch( sqlite3_valu
1d10: 65 5f 6e 75 6d 65 72 69 63 5f 74 79 70 65 28 61  e_numeric_type(a
1d20: 70 41 72 67 5b 31 5d 29 20 29 7b 0a 20 20 20 20  pArg[1]) ){.    
1d30: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
1d40: 54 45 47 45 52 3a 0a 20 20 20 20 20 20 20 20 69  TEGER:.        i
1d50: 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  Val = sqlite3_va
1d60: 6c 75 65 5f 69 6e 74 36 34 28 61 70 41 72 67 5b  lue_int64(apArg[
1d70: 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  1]);.        bre
1d80: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
1d90: 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20  QLITE_FLOAT: {. 
1da0: 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 66 56         double fV
1db0: 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  al = sqlite3_val
1dc0: 75 65 5f 64 6f 75 62 6c 65 28 61 70 41 72 67 5b  ue_double(apArg[
1dd0: 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  1]);.        if(
1de0: 20 28 28 69 36 34 29 66 56 61 6c 29 21 3d 66 56   ((i64)fVal)!=fV
1df0: 61 6c 20 29 20 67 6f 74 6f 20 65 72 72 6f 72 5f  al ) goto error_
1e00: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 69 56 61  out;.        iVa
1e10: 6c 20 3d 20 28 69 36 34 29 66 56 61 6c 3b 0a 20  l = (i64)fVal;. 
1e20: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1e30: 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66 61      }.      defa
1e40: 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 67 6f 74  ult:.        got
1e50: 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20  o error_out;.   
1e60: 20 7d 0a 20 20 20 20 69 66 28 20 69 56 61 6c 3c   }.    if( iVal<
1e70: 3d 30 20 29 20 67 6f 74 6f 20 65 72 72 6f 72 5f  =0 ) goto error_
1e80: 6f 75 74 3b 0a 0a 20 20 20 20 70 2d 3e 6e 53 74  out;..    p->nSt
1e90: 65 70 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69 56  ep++;.    if( iV
1ea0: 61 6c 3d 3d 70 2d 3e 6e 53 74 65 70 20 29 7b 0a  al==p->nStep ){.
1eb0: 20 20 20 20 20 20 70 2d 3e 70 56 61 6c 75 65 20        p->pValue 
1ec0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
1ed0: 64 75 70 28 61 70 41 72 67 5b 30 5d 29 3b 0a 20  dup(apArg[0]);. 
1ee0: 20 20 20 20 20 69 66 28 20 21 70 2d 3e 70 56 61       if( !p->pVa
1ef0: 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  lue ){.        s
1f00: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
1f10: 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29 3b  ror_nomem(pCtx);
1f20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1f30: 20 7d 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41   }.  UNUSED_PARA
1f40: 4d 45 54 45 52 28 6e 41 72 67 29 3b 0a 20 20 55  METER(nArg);.  U
1f50: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1f60: 61 70 41 72 67 29 3b 0a 20 20 72 65 74 75 72 6e  apArg);.  return
1f70: 3b 0a 0a 20 65 72 72 6f 72 5f 6f 75 74 3a 0a 20  ;.. error_out:. 
1f80: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1f90: 65 72 72 6f 72 28 0a 20 20 20 20 20 20 70 43 74  error(.      pCt
1fa0: 78 2c 20 22 73 65 63 6f 6e 64 20 61 72 67 75 6d  x, "second argum
1fb0: 65 6e 74 20 74 6f 20 6e 74 68 5f 76 61 6c 75 65  ent to nth_value
1fc0: 20 6d 75 73 74 20 62 65 20 61 20 70 6f 73 69 74   must be a posit
1fd0: 69 76 65 20 69 6e 74 65 67 65 72 22 2c 20 2d 31  ive integer", -1
1fe0: 0a 20 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  .  );.}.static v
1ff0: 6f 69 64 20 6e 74 68 5f 76 61 6c 75 65 46 69 6e  oid nth_valueFin
2000: 61 6c 69 7a 65 46 75 6e 63 28 73 71 6c 69 74 65  alizeFunc(sqlite
2010: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29  3_context *pCtx)
2020: 7b 0a 20 20 73 74 72 75 63 74 20 4e 74 68 56 61  {.  struct NthVa
2030: 6c 75 65 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d  lueCtx *p;.  p =
2040: 20 28 73 74 72 75 63 74 20 4e 74 68 56 61 6c 75   (struct NthValu
2050: 65 43 74 78 2a 29 73 71 6c 69 74 65 33 5f 61 67  eCtx*)sqlite3_ag
2060: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
2070: 70 43 74 78 2c 20 30 29 3b 0a 20 20 69 66 28 20  pCtx, 0);.  if( 
2080: 70 20 26 26 20 70 2d 3e 70 56 61 6c 75 65 20 29  p && p->pValue )
2090: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
20a0: 73 75 6c 74 5f 76 61 6c 75 65 28 70 43 74 78 2c  sult_value(pCtx,
20b0: 20 70 2d 3e 70 56 61 6c 75 65 29 3b 0a 20 20 20   p->pValue);.   
20c0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 66   sqlite3_value_f
20d0: 72 65 65 28 70 2d 3e 70 56 61 6c 75 65 29 3b 0a  ree(p->pValue);.
20e0: 20 20 20 20 70 2d 3e 70 56 61 6c 75 65 20 3d 20      p->pValue = 
20f0: 30 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65  0;.  }.}.#define
2100: 20 6e 74 68 5f 76 61 6c 75 65 49 6e 76 46 75 6e   nth_valueInvFun
2110: 63 20 6e 6f 6f 70 53 74 65 70 46 75 6e 63 0a 23  c noopStepFunc.#
2120: 64 65 66 69 6e 65 20 6e 74 68 5f 76 61 6c 75 65  define nth_value
2130: 56 61 6c 75 65 46 75 6e 63 20 6e 6f 6f 70 56 61  ValueFunc noopVa
2140: 6c 75 65 46 75 6e 63 0a 0a 73 74 61 74 69 63 20  lueFunc..static 
2150: 76 6f 69 64 20 66 69 72 73 74 5f 76 61 6c 75 65  void first_value
2160: 53 74 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69  StepFunc(.  sqli
2170: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
2180: 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  x, .  int nArg,.
2190: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
21a0: 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72  **apArg.){.  str
21b0: 75 63 74 20 4e 74 68 56 61 6c 75 65 43 74 78 20  uct NthValueCtx 
21c0: 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63  *p;.  p = (struc
21d0: 74 20 4e 74 68 56 61 6c 75 65 43 74 78 2a 29 73  t NthValueCtx*)s
21e0: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
21f0: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
2200: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
2210: 28 20 70 20 26 26 20 70 2d 3e 70 56 61 6c 75 65  ( p && p->pValue
2220: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 56  ==0 ){.    p->pV
2230: 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76  alue = sqlite3_v
2240: 61 6c 75 65 5f 64 75 70 28 61 70 41 72 67 5b 30  alue_dup(apArg[0
2250: 5d 29 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e  ]);.    if( !p->
2260: 70 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20  pValue ){.      
2270: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
2280: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29  rror_nomem(pCtx)
2290: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 55 4e  ;.    }.  }.  UN
22a0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
22b0: 41 72 67 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  Arg);.  UNUSED_P
22c0: 41 52 41 4d 45 54 45 52 28 61 70 41 72 67 29 3b  ARAMETER(apArg);
22d0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  .}.static void f
22e0: 69 72 73 74 5f 76 61 6c 75 65 46 69 6e 61 6c 69  irst_valueFinali
22f0: 7a 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  zeFunc(sqlite3_c
2300: 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20  ontext *pCtx){. 
2310: 20 73 74 72 75 63 74 20 4e 74 68 56 61 6c 75 65   struct NthValue
2320: 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73  Ctx *p;.  p = (s
2330: 74 72 75 63 74 20 4e 74 68 56 61 6c 75 65 43 74  truct NthValueCt
2340: 78 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65  x*)sqlite3_aggre
2350: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74  gate_context(pCt
2360: 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  x, sizeof(*p));.
2370: 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 70 56    if( p && p->pV
2380: 61 6c 75 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  alue ){.    sqli
2390: 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65  te3_result_value
23a0: 28 70 43 74 78 2c 20 70 2d 3e 70 56 61 6c 75 65  (pCtx, p->pValue
23b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  );.    sqlite3_v
23c0: 61 6c 75 65 5f 66 72 65 65 28 70 2d 3e 70 56 61  alue_free(p->pVa
23d0: 6c 75 65 29 3b 0a 20 20 20 20 70 2d 3e 70 56 61  lue);.    p->pVa
23e0: 6c 75 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23  lue = 0;.  }.}.#
23f0: 64 65 66 69 6e 65 20 66 69 72 73 74 5f 76 61 6c  define first_val
2400: 75 65 49 6e 76 46 75 6e 63 20 6e 6f 6f 70 53 74  ueInvFunc noopSt
2410: 65 70 46 75 6e 63 0a 23 64 65 66 69 6e 65 20 66  epFunc.#define f
2420: 69 72 73 74 5f 76 61 6c 75 65 56 61 6c 75 65 46  irst_valueValueF
2430: 75 6e 63 20 6e 6f 6f 70 56 61 6c 75 65 46 75 6e  unc noopValueFun
2440: 63 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  c../*.** Impleme
2450: 6e 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74  ntation of built
2460: 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  -in window funct
2470: 69 6f 6e 20 72 61 6e 6b 28 29 2e 20 41 73 73 75  ion rank(). Assu
2480: 6d 65 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  mes that.** the 
2490: 77 69 6e 64 6f 77 20 66 72 61 6d 65 20 68 61 73  window frame has
24a0: 20 62 65 65 6e 20 73 65 74 20 74 6f 3a 0a 2a 2a   been set to:.**
24b0: 0a 2a 2a 20 20 20 52 41 4e 47 45 20 42 45 54 57  .**   RANGE BETW
24c0: 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52  EEN UNBOUNDED PR
24d0: 45 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52  ECEDING AND CURR
24e0: 45 4e 54 20 52 4f 57 20 0a 2a 2f 0a 73 74 61 74  ENT ROW .*/.stat
24f0: 69 63 20 76 6f 69 64 20 72 61 6e 6b 53 74 65 70  ic void rankStep
2500: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
2510: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
2520: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
2530: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
2540: 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20  Arg.){.  struct 
2550: 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20  CallCount *p;.  
2560: 70 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c  p = (struct Call
2570: 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61  Count*)sqlite3_a
2580: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
2590: 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70  (pCtx, sizeof(*p
25a0: 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ));.  if( p ){. 
25b0: 20 20 20 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 20     p->nStep++;. 
25c0: 20 20 20 69 66 28 20 70 2d 3e 6e 56 61 6c 75 65     if( p->nValue
25d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
25e0: 6e 56 61 6c 75 65 20 3d 20 70 2d 3e 6e 53 74 65  nValue = p->nSte
25f0: 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 55  p;.    }.  }.  U
2600: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2610: 6e 41 72 67 29 3b 0a 20 20 55 4e 55 53 45 44 5f  nArg);.  UNUSED_
2620: 50 41 52 41 4d 45 54 45 52 28 61 70 41 72 67 29  PARAMETER(apArg)
2630: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
2640: 72 61 6e 6b 56 61 6c 75 65 46 75 6e 63 28 73 71  rankValueFunc(sq
2650: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
2660: 43 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20 43  Ctx){.  struct C
2670: 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70  allCount *p;.  p
2680: 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43   = (struct CallC
2690: 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67  ount*)sqlite3_ag
26a0: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
26b0: 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29  pCtx, sizeof(*p)
26c0: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
26d0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
26e0: 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 70 2d 3e  _int64(pCtx, p->
26f0: 6e 56 61 6c 75 65 29 3b 0a 20 20 20 20 70 2d 3e  nValue);.    p->
2700: 6e 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 7d 0a  nValue = 0;.  }.
2710: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
2720: 6e 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74  ntation of built
2730: 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  -in window funct
2740: 69 6f 6e 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b  ion percent_rank
2750: 28 29 2e 20 41 73 73 75 6d 65 73 20 74 68 61 74  (). Assumes that
2760: 0a 2a 2a 20 74 68 65 20 77 69 6e 64 6f 77 20 66  .** the window f
2770: 72 61 6d 65 20 68 61 73 20 62 65 65 6e 20 73 65  rame has been se
2780: 74 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 47 52  t to:.**.**   GR
2790: 4f 55 50 53 20 42 45 54 57 45 45 4e 20 43 55 52  OUPS BETWEEN CUR
27a0: 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 55 4e 42  RENT ROW AND UNB
27b0: 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47  OUNDED FOLLOWING
27c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
27d0: 70 65 72 63 65 6e 74 5f 72 61 6e 6b 53 74 65 70  percent_rankStep
27e0: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
27f0: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
2800: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
2810: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
2820: 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20  Arg.){.  struct 
2830: 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20  CallCount *p;.  
2840: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2850: 28 6e 41 72 67 29 3b 20 61 73 73 65 72 74 28 20  (nArg); assert( 
2860: 6e 41 72 67 3d 3d 30 20 29 3b 0a 20 20 55 4e 55  nArg==0 );.  UNU
2870: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 70  SED_PARAMETER(ap
2880: 41 72 67 29 3b 0a 20 20 70 20 3d 20 28 73 74 72  Arg);.  p = (str
2890: 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29 73  uct CallCount*)s
28a0: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
28b0: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
28c0: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
28d0: 28 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 54  ( p ){.    p->nT
28e0: 6f 74 61 6c 2b 2b 3b 0a 20 20 7d 0a 7d 0a 73 74  otal++;.  }.}.st
28f0: 61 74 69 63 20 76 6f 69 64 20 70 65 72 63 65 6e  atic void percen
2900: 74 5f 72 61 6e 6b 49 6e 76 46 75 6e 63 28 0a 20  t_rankInvFunc(. 
2910: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
2920: 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
2930: 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
2940: 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a  alue **apArg.){.
2950: 20 20 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75    struct CallCou
2960: 6e 74 20 2a 70 3b 0a 20 20 55 4e 55 53 45 44 5f  nt *p;.  UNUSED_
2970: 50 41 52 41 4d 45 54 45 52 28 6e 41 72 67 29 3b  PARAMETER(nArg);
2980: 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 30   assert( nArg==0
2990: 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
29a0: 41 4d 45 54 45 52 28 61 70 41 72 67 29 3b 0a 20  AMETER(apArg);. 
29b0: 20 70 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c   p = (struct Cal
29c0: 6c 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f  lCount*)sqlite3_
29d0: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
29e0: 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a  t(pCtx, sizeof(*
29f0: 70 29 29 3b 0a 20 20 70 2d 3e 6e 53 74 65 70 2b  p));.  p->nStep+
2a00: 2b 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  +;.}.static void
2a10: 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b 56 61 6c   percent_rankVal
2a20: 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  ueFunc(sqlite3_c
2a30: 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20  ontext *pCtx){. 
2a40: 20 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e   struct CallCoun
2a50: 74 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72  t *p;.  p = (str
2a60: 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29 73  uct CallCount*)s
2a70: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
2a80: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
2a90: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
2aa0: 28 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56  ( p ){.    p->nV
2ab0: 61 6c 75 65 20 3d 20 70 2d 3e 6e 53 74 65 70 3b  alue = p->nStep;
2ac0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 54 6f 74  .    if( p->nTot
2ad0: 61 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20 64 6f  al>1 ){.      do
2ae0: 75 62 6c 65 20 72 20 3d 20 28 64 6f 75 62 6c 65  uble r = (double
2af0: 29 70 2d 3e 6e 56 61 6c 75 65 20 2f 20 28 64 6f  )p->nValue / (do
2b00: 75 62 6c 65 29 28 70 2d 3e 6e 54 6f 74 61 6c 2d  uble)(p->nTotal-
2b10: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
2b20: 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28  3_result_double(
2b30: 70 43 74 78 2c 20 72 29 3b 0a 20 20 20 20 7d 65  pCtx, r);.    }e
2b40: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
2b50: 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65  e3_result_double
2b60: 28 70 43 74 78 2c 20 30 2e 30 29 3b 0a 20 20 20  (pCtx, 0.0);.   
2b70: 20 7d 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65   }.  }.}.#define
2b80: 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b 46 69 6e   percent_rankFin
2b90: 61 6c 69 7a 65 46 75 6e 63 20 70 65 72 63 65 6e  alizeFunc percen
2ba0: 74 5f 72 61 6e 6b 56 61 6c 75 65 46 75 6e 63 0a  t_rankValueFunc.
2bb0: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
2bc0: 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74 2d 69  ation of built-i
2bd0: 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  n window functio
2be0: 6e 20 63 75 6d 65 5f 64 69 73 74 28 29 2e 20 41  n cume_dist(). A
2bf0: 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 74  ssumes that.** t
2c00: 68 65 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 20  he window frame 
2c10: 68 61 73 20 62 65 65 6e 20 73 65 74 20 74 6f 3a  has been set to:
2c20: 0a 2a 2a 0a 2a 2a 20 20 20 47 52 4f 55 50 53 20  .**.**   GROUPS 
2c30: 42 45 54 57 45 45 4e 20 31 20 46 4f 4c 4c 4f 57  BETWEEN 1 FOLLOW
2c40: 49 4e 47 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45  ING AND UNBOUNDE
2c50: 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2f 0a 73  D FOLLOWING.*/.s
2c60: 74 61 74 69 63 20 76 6f 69 64 20 63 75 6d 65 5f  tatic void cume_
2c70: 64 69 73 74 53 74 65 70 46 75 6e 63 28 0a 20 20  distStepFunc(.  
2c80: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
2c90: 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41  *pCtx, .  int nA
2ca0: 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  rg,.  sqlite3_va
2cb0: 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 20  lue **apArg.){. 
2cc0: 20 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e   struct CallCoun
2cd0: 74 20 2a 70 3b 0a 20 20 55 4e 55 53 45 44 5f 50  t *p;.  UNUSED_P
2ce0: 41 52 41 4d 45 54 45 52 28 6e 41 72 67 29 3b 20  ARAMETER(nArg); 
2cf0: 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 30 20  assert( nArg==0 
2d00: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
2d10: 4d 45 54 45 52 28 61 70 41 72 67 29 3b 0a 20 20  METER(apArg);.  
2d20: 70 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c  p = (struct Call
2d30: 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61  Count*)sqlite3_a
2d40: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
2d50: 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70  (pCtx, sizeof(*p
2d60: 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ));.  if( p ){. 
2d70: 20 20 20 70 2d 3e 6e 54 6f 74 61 6c 2b 2b 3b 0a     p->nTotal++;.
2d80: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
2d90: 64 20 63 75 6d 65 5f 64 69 73 74 49 6e 76 46 75  d cume_distInvFu
2da0: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
2db0: 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20  ntext *pCtx, .  
2dc0: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69  int nArg,.  sqli
2dd0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72  te3_value **apAr
2de0: 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61  g.){.  struct Ca
2df0: 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 55 4e  llCount *p;.  UN
2e00: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
2e10: 41 72 67 29 3b 20 61 73 73 65 72 74 28 20 6e 41  Arg); assert( nA
2e20: 72 67 3d 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45  rg==0 );.  UNUSE
2e30: 44 5f 50 41 52 41 4d 45 54 45 52 28 61 70 41 72  D_PARAMETER(apAr
2e40: 67 29 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63  g);.  p = (struc
2e50: 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29 73 71 6c  t CallCount*)sql
2e60: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
2e70: 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a  ontext(pCtx, siz
2e80: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 70 2d 3e 6e  eof(*p));.  p->n
2e90: 53 74 65 70 2b 2b 3b 0a 7d 0a 73 74 61 74 69 63  Step++;.}.static
2ea0: 20 76 6f 69 64 20 63 75 6d 65 5f 64 69 73 74 56   void cume_distV
2eb0: 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33  alueFunc(sqlite3
2ec0: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b  _context *pCtx){
2ed0: 0a 20 20 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  .  struct CallCo
2ee0: 75 6e 74 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73  unt *p;.  p = (s
2ef0: 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a  truct CallCount*
2f00: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
2f10: 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c  te_context(pCtx,
2f20: 20 30 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a   0);.  if( p ){.
2f30: 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 28      double r = (
2f40: 64 6f 75 62 6c 65 29 28 70 2d 3e 6e 53 74 65 70  double)(p->nStep
2f50: 29 20 2f 20 28 64 6f 75 62 6c 65 29 28 70 2d 3e  ) / (double)(p->
2f60: 6e 54 6f 74 61 6c 29 3b 0a 20 20 20 20 73 71 6c  nTotal);.    sql
2f70: 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62  ite3_result_doub
2f80: 6c 65 28 70 43 74 78 2c 20 72 29 3b 0a 20 20 7d  le(pCtx, r);.  }
2f90: 0a 7d 0a 23 64 65 66 69 6e 65 20 63 75 6d 65 5f  .}.#define cume_
2fa0: 64 69 73 74 46 69 6e 61 6c 69 7a 65 46 75 6e 63  distFinalizeFunc
2fb0: 20 63 75 6d 65 5f 64 69 73 74 56 61 6c 75 65 46   cume_distValueF
2fc0: 75 6e 63 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65  unc../*.** Conte
2fd0: 78 74 20 6f 62 6a 65 63 74 20 66 6f 72 20 6e 74  xt object for nt
2fe0: 69 6c 65 28 29 20 77 69 6e 64 6f 77 20 66 75 6e  ile() window fun
2ff0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74  ction..*/.struct
3000: 20 4e 74 69 6c 65 43 74 78 20 7b 0a 20 20 69 36   NtileCtx {.  i6
3010: 34 20 6e 54 6f 74 61 6c 3b 20 20 20 20 20 20 20  4 nTotal;       
3020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3030: 20 54 6f 74 61 6c 20 72 6f 77 73 20 69 6e 20 70   Total rows in p
3040: 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 20 20 69 36  artition */.  i6
3050: 34 20 6e 50 61 72 61 6d 3b 20 20 20 20 20 20 20  4 nParam;       
3060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3070: 20 50 61 72 61 6d 65 74 65 72 20 70 61 73 73 65   Parameter passe
3080: 64 20 74 6f 20 6e 74 69 6c 65 28 4e 29 20 2a 2f  d to ntile(N) */
3090: 0a 20 20 69 36 34 20 69 52 6f 77 3b 20 20 20 20  .  i64 iRow;    
30a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f     /* Current ro
30c0: 77 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49  w */.};../*.** I
30d0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
30e0: 20 6e 74 69 6c 65 28 29 2e 20 54 68 69 73 20 61   ntile(). This a
30f0: 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20  ssumes that the 
3100: 77 69 6e 64 6f 77 20 66 72 61 6d 65 20 68 61 73  window frame has
3110: 0a 2a 2a 20 62 65 65 6e 20 63 6f 65 72 63 65 64  .** been coerced
3120: 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57   to:.**.**   ROW
3130: 53 20 43 55 52 52 45 4e 54 20 52 4f 57 20 41 4e  S CURRENT ROW AN
3140: 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c  D UNBOUNDED FOLL
3150: 4f 57 49 4e 47 0a 2a 2f 0a 73 74 61 74 69 63 20  OWING.*/.static 
3160: 76 6f 69 64 20 6e 74 69 6c 65 53 74 65 70 46 75  void ntileStepFu
3170: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
3180: 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20  ntext *pCtx, .  
3190: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69  int nArg,.  sqli
31a0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72  te3_value **apAr
31b0: 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 4e 74  g.){.  struct Nt
31c0: 69 6c 65 43 74 78 20 2a 70 3b 0a 20 20 61 73 73  ileCtx *p;.  ass
31d0: 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 20  ert( nArg==1 ); 
31e0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
31f0: 28 6e 41 72 67 29 3b 0a 20 20 70 20 3d 20 28 73  (nArg);.  p = (s
3200: 74 72 75 63 74 20 4e 74 69 6c 65 43 74 78 2a 29  truct NtileCtx*)
3210: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
3220: 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20  e_context(pCtx, 
3230: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69  sizeof(*p));.  i
3240: 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  f( p ){.    if( 
3250: 70 2d 3e 6e 54 6f 74 61 6c 3d 3d 30 20 29 7b 0a  p->nTotal==0 ){.
3260: 20 20 20 20 20 20 70 2d 3e 6e 50 61 72 61 6d 20        p->nParam 
3270: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
3280: 69 6e 74 36 34 28 61 70 41 72 67 5b 30 5d 29 3b  int64(apArg[0]);
3290: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 50  .      if( p->nP
32a0: 61 72 61 6d 3c 3d 30 20 29 7b 0a 20 20 20 20 20  aram<=0 ){.     
32b0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
32c0: 74 5f 65 72 72 6f 72 28 0a 20 20 20 20 20 20 20  t_error(.       
32d0: 20 20 20 20 20 70 43 74 78 2c 20 22 61 72 67 75       pCtx, "argu
32e0: 6d 65 6e 74 20 6f 66 20 6e 74 69 6c 65 20 6d 75  ment of ntile mu
32f0: 73 74 20 62 65 20 61 20 70 6f 73 69 74 69 76 65  st be a positive
3300: 20 69 6e 74 65 67 65 72 22 2c 20 2d 31 0a 20 20   integer", -1.  
3310: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
3320: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 54  .    }.    p->nT
3330: 6f 74 61 6c 2b 2b 3b 0a 20 20 7d 0a 7d 0a 73 74  otal++;.  }.}.st
3340: 61 74 69 63 20 76 6f 69 64 20 6e 74 69 6c 65 49  atic void ntileI
3350: 6e 76 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  nvFunc(.  sqlite
3360: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
3370: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
3380: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
3390: 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63  apArg.){.  struc
33a0: 74 20 4e 74 69 6c 65 43 74 78 20 2a 70 3b 0a 20  t NtileCtx *p;. 
33b0: 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31   assert( nArg==1
33c0: 20 29 3b 20 55 4e 55 53 45 44 5f 50 41 52 41 4d   ); UNUSED_PARAM
33d0: 45 54 45 52 28 6e 41 72 67 29 3b 0a 20 20 55 4e  ETER(nArg);.  UN
33e0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
33f0: 70 41 72 67 29 3b 0a 20 20 70 20 3d 20 28 73 74  pArg);.  p = (st
3400: 72 75 63 74 20 4e 74 69 6c 65 43 74 78 2a 29 73  ruct NtileCtx*)s
3410: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
3420: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
3430: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 70 2d  izeof(*p));.  p-
3440: 3e 69 52 6f 77 2b 2b 3b 0a 7d 0a 73 74 61 74 69  >iRow++;.}.stati
3450: 63 20 76 6f 69 64 20 6e 74 69 6c 65 56 61 6c 75  c void ntileValu
3460: 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  eFunc(sqlite3_co
3470: 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20 20  ntext *pCtx){.  
3480: 73 74 72 75 63 74 20 4e 74 69 6c 65 43 74 78 20  struct NtileCtx 
3490: 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63  *p;.  p = (struc
34a0: 74 20 4e 74 69 6c 65 43 74 78 2a 29 73 71 6c 69  t NtileCtx*)sqli
34b0: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
34c0: 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65  ntext(pCtx, size
34d0: 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70  of(*p));.  if( p
34e0: 20 26 26 20 70 2d 3e 6e 50 61 72 61 6d 3e 30 20   && p->nParam>0 
34f0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 69 7a 65  ){.    int nSize
3500: 20 3d 20 28 70 2d 3e 6e 54 6f 74 61 6c 20 2f 20   = (p->nTotal / 
3510: 70 2d 3e 6e 50 61 72 61 6d 29 3b 0a 20 20 20 20  p->nParam);.    
3520: 69 66 28 20 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a  if( nSize==0 ){.
3530: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
3540: 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c  sult_int64(pCtx,
3550: 20 70 2d 3e 69 52 6f 77 2b 31 29 3b 0a 20 20 20   p->iRow+1);.   
3560: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 36   }else{.      i6
3570: 34 20 6e 4c 61 72 67 65 20 3d 20 70 2d 3e 6e 54  4 nLarge = p->nT
3580: 6f 74 61 6c 20 2d 20 70 2d 3e 6e 50 61 72 61 6d  otal - p->nParam
3590: 2a 6e 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 36  *nSize;.      i6
35a0: 34 20 69 53 6d 61 6c 6c 20 3d 20 6e 4c 61 72 67  4 iSmall = nLarg
35b0: 65 2a 28 6e 53 69 7a 65 2b 31 29 3b 0a 20 20 20  e*(nSize+1);.   
35c0: 20 20 20 69 36 34 20 69 52 6f 77 20 3d 20 70 2d     i64 iRow = p-
35d0: 3e 69 52 6f 77 3b 0a 0a 20 20 20 20 20 20 61 73  >iRow;..      as
35e0: 73 65 72 74 28 20 28 6e 4c 61 72 67 65 2a 28 6e  sert( (nLarge*(n
35f0: 53 69 7a 65 2b 31 29 20 2b 20 28 70 2d 3e 6e 50  Size+1) + (p->nP
3600: 61 72 61 6d 2d 6e 4c 61 72 67 65 29 2a 6e 53 69  aram-nLarge)*nSi
3610: 7a 65 29 3d 3d 70 2d 3e 6e 54 6f 74 61 6c 20 29  ze)==p->nTotal )
3620: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 69 52 6f  ;..      if( iRo
3630: 77 3c 69 53 6d 61 6c 6c 20 29 7b 0a 20 20 20 20  w<iSmall ){.    
3640: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
3650: 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 31  lt_int64(pCtx, 1
3660: 20 2b 20 69 52 6f 77 2f 28 6e 53 69 7a 65 2b 31   + iRow/(nSize+1
3670: 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
3680: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3690: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43  _result_int64(pC
36a0: 74 78 2c 20 31 20 2b 20 6e 4c 61 72 67 65 20 2b  tx, 1 + nLarge +
36b0: 20 28 69 52 6f 77 2d 69 53 6d 61 6c 6c 29 2f 6e   (iRow-iSmall)/n
36c0: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Size);.      }. 
36d0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 64 65 66 69     }.  }.}.#defi
36e0: 6e 65 20 6e 74 69 6c 65 46 69 6e 61 6c 69 7a 65  ne ntileFinalize
36f0: 46 75 6e 63 20 6e 74 69 6c 65 56 61 6c 75 65 46  Func ntileValueF
3700: 75 6e 63 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65  unc../*.** Conte
3710: 78 74 20 6f 62 6a 65 63 74 20 66 6f 72 20 6c 61  xt object for la
3720: 73 74 5f 76 61 6c 75 65 28 29 20 77 69 6e 64 6f  st_value() windo
3730: 77 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  w function..*/.s
3740: 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75 65 43  truct LastValueC
3750: 74 78 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  tx {.  sqlite3_v
3760: 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e  alue *pVal;.  in
3770: 74 20 6e 56 61 6c 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a  t nVal;.};../*.*
3780: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
3790: 20 6f 66 20 6c 61 73 74 5f 76 61 6c 75 65 28 29   of last_value()
37a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
37b0: 20 6c 61 73 74 5f 76 61 6c 75 65 53 74 65 70 46   last_valueStepF
37c0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
37d0: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
37e0: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
37f0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41  ite3_value **apA
3800: 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 4c  rg.){.  struct L
3810: 61 73 74 56 61 6c 75 65 43 74 78 20 2a 70 3b 0a  astValueCtx *p;.
3820: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
3830: 45 52 28 6e 41 72 67 29 3b 0a 20 20 70 20 3d 20  ER(nArg);.  p = 
3840: 28 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75  (struct LastValu
3850: 65 43 74 78 2a 29 73 71 6c 69 74 65 33 5f 61 67  eCtx*)sqlite3_ag
3860: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
3870: 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29  pCtx, sizeof(*p)
3880: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
3890: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f    sqlite3_value_
38a0: 66 72 65 65 28 70 2d 3e 70 56 61 6c 29 3b 0a 20  free(p->pVal);. 
38b0: 20 20 20 70 2d 3e 70 56 61 6c 20 3d 20 73 71 6c     p->pVal = sql
38c0: 69 74 65 33 5f 76 61 6c 75 65 5f 64 75 70 28 61  ite3_value_dup(a
38d0: 70 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 69 66  pArg[0]);.    if
38e0: 28 20 70 2d 3e 70 56 61 6c 3d 3d 30 20 29 7b 0a  ( p->pVal==0 ){.
38f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
3900: 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d  sult_error_nomem
3910: 28 70 43 74 78 29 3b 0a 20 20 20 20 7d 65 6c 73  (pCtx);.    }els
3920: 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61 6c  e{.      p->nVal
3930: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ++;.    }.  }.}.
3940: 73 74 61 74 69 63 20 76 6f 69 64 20 6c 61 73 74  static void last
3950: 5f 76 61 6c 75 65 49 6e 76 46 75 6e 63 28 0a 20  _valueInvFunc(. 
3960: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
3970: 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
3980: 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
3990: 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a  alue **apArg.){.
39a0: 20 20 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c    struct LastVal
39b0: 75 65 43 74 78 20 2a 70 3b 0a 20 20 55 4e 55 53  ueCtx *p;.  UNUS
39c0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72  ED_PARAMETER(nAr
39d0: 67 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  g);.  UNUSED_PAR
39e0: 41 4d 45 54 45 52 28 61 70 41 72 67 29 3b 0a 20  AMETER(apArg);. 
39f0: 20 70 20 3d 20 28 73 74 72 75 63 74 20 4c 61 73   p = (struct Las
3a00: 74 56 61 6c 75 65 43 74 78 2a 29 73 71 6c 69 74  tValueCtx*)sqlit
3a10: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
3a20: 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f  text(pCtx, sizeo
3a30: 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 41 4c  f(*p));.  if( AL
3a40: 57 41 59 53 28 70 29 20 29 7b 0a 20 20 20 20 70  WAYS(p) ){.    p
3a50: 2d 3e 6e 56 61 6c 2d 2d 3b 0a 20 20 20 20 69 66  ->nVal--;.    if
3a60: 28 20 70 2d 3e 6e 56 61 6c 3d 3d 30 20 29 7b 0a  ( p->nVal==0 ){.
3a70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
3a80: 6c 75 65 5f 66 72 65 65 28 70 2d 3e 70 56 61 6c  lue_free(p->pVal
3a90: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 56 61 6c  );.      p->pVal
3aa0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
3ab0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 61  }.static void la
3ac0: 73 74 5f 76 61 6c 75 65 56 61 6c 75 65 46 75 6e  st_valueValueFun
3ad0: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
3ae0: 74 20 2a 70 43 74 78 29 7b 0a 20 20 73 74 72 75  t *pCtx){.  stru
3af0: 63 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 20  ct LastValueCtx 
3b00: 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63  *p;.  p = (struc
3b10: 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 2a 29  t LastValueCtx*)
3b20: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
3b30: 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20  e_context(pCtx, 
3b40: 30 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70  0);.  if( p && p
3b50: 2d 3e 70 56 61 6c 20 29 7b 0a 20 20 20 20 73 71  ->pVal ){.    sq
3b60: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c  lite3_result_val
3b70: 75 65 28 70 43 74 78 2c 20 70 2d 3e 70 56 61 6c  ue(pCtx, p->pVal
3b80: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
3b90: 76 6f 69 64 20 6c 61 73 74 5f 76 61 6c 75 65 46  void last_valueF
3ba0: 69 6e 61 6c 69 7a 65 46 75 6e 63 28 73 71 6c 69  inalizeFunc(sqli
3bb0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
3bc0: 78 29 7b 0a 20 20 73 74 72 75 63 74 20 4c 61 73  x){.  struct Las
3bd0: 74 56 61 6c 75 65 43 74 78 20 2a 70 3b 0a 20 20  tValueCtx *p;.  
3be0: 70 20 3d 20 28 73 74 72 75 63 74 20 4c 61 73 74  p = (struct Last
3bf0: 56 61 6c 75 65 43 74 78 2a 29 73 71 6c 69 74 65  ValueCtx*)sqlite
3c00: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
3c10: 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66  ext(pCtx, sizeof
3c20: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 26  (*p));.  if( p &
3c30: 26 20 70 2d 3e 70 56 61 6c 20 29 7b 0a 20 20 20  & p->pVal ){.   
3c40: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
3c50: 76 61 6c 75 65 28 70 43 74 78 2c 20 70 2d 3e 70  value(pCtx, p->p
3c60: 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Val);.    sqlite
3c70: 33 5f 76 61 6c 75 65 5f 66 72 65 65 28 70 2d 3e  3_value_free(p->
3c80: 70 56 61 6c 29 3b 0a 20 20 20 20 70 2d 3e 70 56  pVal);.    p->pV
3c90: 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  al = 0;.  }.}../
3ca0: 2a 0a 2a 2a 20 53 74 61 74 69 63 20 6e 61 6d 65  *.** Static name
3cb0: 73 20 66 6f 72 20 74 68 65 20 62 75 69 6c 74 2d  s for the built-
3cc0: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
3cd0: 6f 6e 20 6e 61 6d 65 73 2e 20 20 54 68 65 73 65  on names.  These
3ce0: 20 73 74 61 74 69 63 0a 2a 2a 20 6e 61 6d 65 73   static.** names
3cf0: 20 61 72 65 20 75 73 65 64 2c 20 72 61 74 68 65   are used, rathe
3d00: 72 20 74 68 61 6e 20 73 74 72 69 6e 67 20 6c 69  r than string li
3d10: 74 65 72 61 6c 73 2c 20 73 6f 20 74 68 61 74 20  terals, so that 
3d20: 46 75 6e 63 44 65 66 20 6f 62 6a 65 63 74 73 0a  FuncDef objects.
3d30: 2a 2a 20 63 61 6e 20 62 65 20 61 73 73 6f 63 69  ** can be associ
3d40: 61 74 65 64 20 77 69 74 68 20 61 20 70 61 72 74  ated with a part
3d50: 69 63 75 6c 61 72 20 77 69 6e 64 6f 77 20 66 75  icular window fu
3d60: 6e 63 74 69 6f 6e 20 62 79 20 64 69 72 65 63 74  nction by direct
3d70: 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  .** comparison o
3d80: 66 20 74 68 65 20 7a 4e 61 6d 65 20 70 6f 69 6e  f the zName poin
3d90: 74 65 72 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a  ter.  Example:.*
3da0: 2a 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 70  *.**       if( p
3db0: 46 75 6e 63 44 65 66 2d 3e 7a 4e 61 6d 65 3d 3d  FuncDef->zName==
3dc0: 72 6f 77 5f 76 61 6c 75 65 4e 61 6d 65 20 29 7b  row_valueName ){
3dd0: 20 2e 2e 2e 20 7d 0a 2a 2f 0a 73 74 61 74 69 63   ... }.*/.static
3de0: 20 63 6f 6e 73 74 20 63 68 61 72 20 72 6f 77 5f   const char row_
3df0: 6e 75 6d 62 65 72 4e 61 6d 65 5b 5d 20 3d 20 20  numberName[] =  
3e00: 20 22 72 6f 77 5f 6e 75 6d 62 65 72 22 3b 0a 73   "row_number";.s
3e10: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
3e20: 20 64 65 6e 73 65 5f 72 61 6e 6b 4e 61 6d 65 5b   dense_rankName[
3e30: 5d 20 3d 20 20 20 22 64 65 6e 73 65 5f 72 61 6e  ] =   "dense_ran
3e40: 6b 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  k";.static const
3e50: 20 63 68 61 72 20 72 61 6e 6b 4e 61 6d 65 5b 5d   char rankName[]
3e60: 20 3d 20 20 20 20 20 20 20 20 20 22 72 61 6e 6b   =         "rank
3e70: 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  ";.static const 
3e80: 63 68 61 72 20 70 65 72 63 65 6e 74 5f 72 61 6e  char percent_ran
3e90: 6b 4e 61 6d 65 5b 5d 20 3d 20 22 70 65 72 63 65  kName[] = "perce
3ea0: 6e 74 5f 72 61 6e 6b 22 3b 0a 73 74 61 74 69 63  nt_rank";.static
3eb0: 20 63 6f 6e 73 74 20 63 68 61 72 20 63 75 6d 65   const char cume
3ec0: 5f 64 69 73 74 4e 61 6d 65 5b 5d 20 3d 20 20 20  _distName[] =   
3ed0: 20 22 63 75 6d 65 5f 64 69 73 74 22 3b 0a 73 74   "cume_dist";.st
3ee0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
3ef0: 6e 74 69 6c 65 4e 61 6d 65 5b 5d 20 3d 20 20 20  ntileName[] =   
3f00: 20 20 20 20 20 22 6e 74 69 6c 65 22 3b 0a 73 74       "ntile";.st
3f10: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
3f20: 6c 61 73 74 5f 76 61 6c 75 65 4e 61 6d 65 5b 5d  last_valueName[]
3f30: 20 3d 20 20 20 22 6c 61 73 74 5f 76 61 6c 75 65   =   "last_value
3f40: 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  ";.static const 
3f50: 63 68 61 72 20 6e 74 68 5f 76 61 6c 75 65 4e 61  char nth_valueNa
3f60: 6d 65 5b 5d 20 3d 20 20 20 20 22 6e 74 68 5f 76  me[] =    "nth_v
3f70: 61 6c 75 65 22 3b 0a 73 74 61 74 69 63 20 63 6f  alue";.static co
3f80: 6e 73 74 20 63 68 61 72 20 66 69 72 73 74 5f 76  nst char first_v
3f90: 61 6c 75 65 4e 61 6d 65 5b 5d 20 3d 20 20 22 66  alueName[] =  "f
3fa0: 69 72 73 74 5f 76 61 6c 75 65 22 3b 0a 73 74 61  irst_value";.sta
3fb0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6c  tic const char l
3fc0: 65 61 64 4e 61 6d 65 5b 5d 20 3d 20 20 20 20 20  eadName[] =     
3fd0: 20 20 20 20 22 6c 65 61 64 22 3b 0a 73 74 61 74      "lead";.stat
3fe0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6c 61  ic const char la
3ff0: 67 4e 61 6d 65 5b 5d 20 3d 20 20 20 20 20 20 20  gName[] =       
4000: 20 20 20 22 6c 61 67 22 3b 0a 0a 2f 2a 0a 2a 2a     "lag";../*.**
4010: 20 4e 6f 2d 6f 70 20 69 6d 70 6c 65 6d 65 6e 74   No-op implement
4020: 61 74 69 6f 6e 73 20 6f 66 20 78 53 74 65 70 28  ations of xStep(
4030: 29 20 61 6e 64 20 78 46 69 6e 61 6c 69 7a 65 28  ) and xFinalize(
4040: 29 2e 20 20 55 73 65 64 20 61 73 20 70 6c 61 63  ).  Used as plac
4050: 65 2d 68 6f 6c 64 65 72 73 0a 2a 2a 20 66 6f 72  e-holders.** for
4060: 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77   built-in window
4070: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
4080: 6e 65 76 65 72 20 63 61 6c 6c 20 74 68 6f 73 65  never call those
4090: 20 69 6e 74 65 72 66 61 63 65 73 2e 0a 2a 2a 0a   interfaces..**.
40a0: 2a 2a 20 54 68 65 20 6e 6f 6f 70 56 61 6c 75 65  ** The noopValue
40b0: 46 75 6e 63 28 29 20 69 73 20 63 61 6c 6c 65 64  Func() is called
40c0: 20 62 75 74 20 69 73 20 65 78 70 65 63 74 65 64   but is expected
40d0: 20 74 6f 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20   to do nothing. 
40e0: 20 54 68 65 0a 2a 2a 20 6e 6f 6f 70 53 74 65 70   The.** noopStep
40f0: 46 75 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20  Func() is never 
4100: 63 61 6c 6c 65 64 2c 20 61 6e 64 20 73 6f 20 69  called, and so i
4110: 74 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  t is marked with
4120: 20 4e 4f 5f 54 45 53 54 20 74 6f 0a 2a 2a 20 6c   NO_TEST to.** l
4130: 65 74 20 74 68 65 20 74 65 73 74 20 63 6f 76 65  et the test cove
4140: 72 61 67 65 20 72 6f 75 74 69 6e 65 20 6b 6e 6f  rage routine kno
4150: 77 20 6e 6f 74 20 74 6f 20 65 78 70 65 63 74 20  w not to expect 
4160: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f  this function to
4170: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2e 0a   be.** invoked..
4180: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e  */.static void n
4190: 6f 6f 70 53 74 65 70 46 75 6e 63 28 20 20 20 20  oopStepFunc(    
41a0: 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 73 71  /*NO_TEST*/.  sq
41b0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
41c0: 2c 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45  ,        /*NO_TE
41d0: 53 54 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20  ST*/.  int n,   
41e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41f0: 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20    /*NO_TEST*/.  
4200: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
4210: 61 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f  a          /*NO_
4220: 54 45 53 54 2a 2f 0a 29 7b 20 20 20 20 20 20 20  TEST*/.){       
4230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4240: 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a      /*NO_TEST*/.
4250: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
4260: 45 52 28 70 29 3b 20 20 20 20 20 20 20 2f 2a 4e  ER(p);       /*N
4270: 4f 5f 54 45 53 54 2a 2f 0a 20 20 55 4e 55 53 45  O_TEST*/.  UNUSE
4280: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 29 3b 20  D_PARAMETER(n); 
4290: 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a        /*NO_TEST*
42a0: 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  /.  UNUSED_PARAM
42b0: 45 54 45 52 28 61 29 3b 20 20 20 20 20 20 20 2f  ETER(a);       /
42c0: 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 61 73 73  *NO_TEST*/.  ass
42d0: 65 72 74 28 30 29 3b 20 20 20 20 20 20 20 20 20  ert(0);         
42e0: 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53          /*NO_TES
42f0: 54 2a 2f 0a 7d 20 20 20 20 20 20 20 20 20 20 20  T*/.}           
4300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4310: 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 73 74 61   /*NO_TEST*/.sta
4320: 74 69 63 20 76 6f 69 64 20 6e 6f 6f 70 56 61 6c  tic void noopVal
4330: 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  ueFunc(sqlite3_c
4340: 6f 6e 74 65 78 74 20 2a 70 29 7b 20 55 4e 55 53  ontext *p){ UNUS
4350: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b  ED_PARAMETER(p);
4360: 20 2f 2a 6e 6f 2d 6f 70 2a 2f 20 7d 0a 0a 2f 2a   /*no-op*/ }../*
4370: 20 57 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   Window function
4380: 73 20 74 68 61 74 20 75 73 65 20 61 6c 6c 20 77  s that use all w
4390: 69 6e 64 6f 77 20 69 6e 74 65 72 66 61 63 65 73  indow interfaces
43a0: 3a 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c  : xStep, xFinal,
43b0: 0a 2a 2a 20 78 56 61 6c 75 65 2c 20 61 6e 64 20  .** xValue, and 
43c0: 78 49 6e 76 65 72 73 65 20 2a 2f 0a 23 64 65 66  xInverse */.#def
43d0: 69 6e 65 20 57 49 4e 44 4f 57 46 55 4e 43 41 4c  ine WINDOWFUNCAL
43e0: 4c 28 6e 61 6d 65 2c 6e 41 72 67 2c 65 78 74 72  L(name,nArg,extr
43f0: 61 29 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  a) {            
4400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4410: 20 20 20 20 20 20 20 5c 0a 20 20 6e 41 72 67 2c         \.  nArg,
4420: 20 28 53 51 4c 49 54 45 5f 55 54 46 38 7c 53 51   (SQLITE_UTF8|SQ
4430: 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57  LITE_FUNC_WINDOW
4440: 7c 65 78 74 72 61 29 2c 20 30 2c 20 30 2c 20 20  |extra), 0, 0,  
4450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4460: 20 20 20 20 5c 0a 20 20 6e 61 6d 65 20 23 23 20      \.  name ## 
4470: 53 74 65 70 46 75 6e 63 2c 20 6e 61 6d 65 20 23  StepFunc, name #
4480: 23 20 46 69 6e 61 6c 69 7a 65 46 75 6e 63 2c 20  # FinalizeFunc, 
4490: 6e 61 6d 65 20 23 23 20 56 61 6c 75 65 46 75 6e  name ## ValueFun
44a0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
44b0: 20 5c 0a 20 20 6e 61 6d 65 20 23 23 20 49 6e 76   \.  name ## Inv
44c0: 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20 4e 61  Func, name ## Na
44d0: 6d 65 2c 20 7b 30 7d 20 20 20 20 20 20 20 20 20  me, {0}         
44e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
4500: 7d 0a 0a 2f 2a 20 57 69 6e 64 6f 77 20 66 75 6e  }../* Window fun
4510: 63 74 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  ctions that are 
4520: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e  implemented usin
4530: 67 20 62 79 74 65 63 6f 64 65 20 61 6e 64 20 74  g bytecode and t
4540: 68 75 73 20 68 61 76 65 0a 2a 2a 20 6e 6f 2d 6f  hus have.** no-o
4550: 70 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 74  p routines for t
4560: 68 65 69 72 20 6d 65 74 68 6f 64 73 20 2a 2f 0a  heir methods */.
4570: 23 64 65 66 69 6e 65 20 57 49 4e 44 4f 57 46 55  #define WINDOWFU
4580: 4e 43 4e 4f 4f 50 28 6e 61 6d 65 2c 6e 41 72 67  NCNOOP(name,nArg
4590: 2c 65 78 74 72 61 29 20 7b 20 20 20 20 20 20 20  ,extra) {       
45a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45b0: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6e             \.  n
45c0: 41 72 67 2c 20 28 53 51 4c 49 54 45 5f 55 54 46  Arg, (SQLITE_UTF
45d0: 38 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49  8|SQLITE_FUNC_WI
45e0: 4e 44 4f 57 7c 65 78 74 72 61 29 2c 20 30 2c 20  NDOW|extra), 0, 
45f0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4600: 20 20 20 20 20 20 20 20 5c 0a 20 20 6e 6f 6f 70          \.  noop
4610: 53 74 65 70 46 75 6e 63 2c 20 6e 6f 6f 70 56 61  StepFunc, noopVa
4620: 6c 75 65 46 75 6e 63 2c 20 6e 6f 6f 70 56 61 6c  lueFunc, noopVal
4630: 75 65 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20  ueFunc,         
4640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4650: 20 20 20 20 20 5c 0a 20 20 6e 6f 6f 70 53 74 65       \.  noopSte
4660: 70 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20 4e  pFunc, name ## N
4670: 61 6d 65 2c 20 7b 30 7d 20 20 20 20 20 20 20 20  ame, {0}        
4680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46a0: 20 20 5c 0a 7d 0a 0a 2f 2a 20 57 69 6e 64 6f 77    \.}../* Window
46b0: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
46c0: 75 73 65 20 61 6c 6c 20 77 69 6e 64 6f 77 20 69  use all window i
46d0: 6e 74 65 72 66 61 63 65 73 3a 20 78 53 74 65 70  nterfaces: xStep
46e0: 2c 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 72 6f  , the.** same ro
46f0: 75 74 69 6e 65 20 66 6f 72 20 78 46 69 6e 61 6c  utine for xFinal
4700: 69 7a 65 20 61 6e 64 20 78 56 61 6c 75 65 20 61  ize and xValue a
4710: 6e 64 20 77 68 69 63 68 20 6e 65 76 65 72 20 63  nd which never c
4720: 61 6c 6c 0a 2a 2a 20 78 49 6e 76 65 72 73 65 2e  all.** xInverse.
4730: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 44   */.#define WIND
4740: 4f 57 46 55 4e 43 58 28 6e 61 6d 65 2c 6e 41 72  OWFUNCX(name,nAr
4750: 67 2c 65 78 74 72 61 29 20 7b 20 20 20 20 20 20  g,extra) {      
4760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
4780: 0a 20 20 6e 41 72 67 2c 20 28 53 51 4c 49 54 45  .  nArg, (SQLITE
4790: 5f 55 54 46 38 7c 53 51 4c 49 54 45 5f 46 55 4e  _UTF8|SQLITE_FUN
47a0: 43 5f 57 49 4e 44 4f 57 7c 65 78 74 72 61 29 2c  C_WINDOW|extra),
47b0: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 20 20   0, 0,          
47c0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
47d0: 6e 61 6d 65 20 23 23 20 53 74 65 70 46 75 6e 63  name ## StepFunc
47e0: 2c 20 6e 61 6d 65 20 23 23 20 56 61 6c 75 65 46  , name ## ValueF
47f0: 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20 56 61 6c  unc, name ## Val
4800: 75 65 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20  ueFunc,         
4810: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6e 6f 6f           \.  noo
4820: 70 53 74 65 70 46 75 6e 63 2c 20 6e 61 6d 65 20  pStepFunc, name 
4830: 23 23 20 4e 61 6d 65 2c 20 7b 30 7d 20 20 20 20  ## Name, {0}    
4840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4860: 20 20 20 20 20 20 5c 0a 7d 0a 0a 0a 2f 2a 0a 2a        \.}.../*.*
4870: 2a 20 52 65 67 69 73 74 65 72 20 74 68 6f 73 65  * Register those
4880: 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77   built-in window
4890: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
48a0: 61 72 65 20 6e 6f 74 20 61 6c 73 6f 20 61 67 67  are not also agg
48b0: 72 65 67 61 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64  regates..*/.void
48c0: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 46 75   sqlite3WindowFu
48d0: 6e 63 74 69 6f 6e 73 28 76 6f 69 64 29 7b 0a 20  nctions(void){. 
48e0: 20 73 74 61 74 69 63 20 46 75 6e 63 44 65 66 20   static FuncDef 
48f0: 61 57 69 6e 64 6f 77 46 75 6e 63 73 5b 5d 20 3d  aWindowFuncs[] =
4900: 20 7b 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e   {.    WINDOWFUN
4910: 43 58 28 72 6f 77 5f 6e 75 6d 62 65 72 2c 20 30  CX(row_number, 0
4920: 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57  , 0),.    WINDOW
4930: 46 55 4e 43 58 28 64 65 6e 73 65 5f 72 61 6e 6b  FUNCX(dense_rank
4940: 2c 20 30 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e  , 0, 0),.    WIN
4950: 44 4f 57 46 55 4e 43 58 28 72 61 6e 6b 2c 20 30  DOWFUNCX(rank, 0
4960: 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57  , 0),.    WINDOW
4970: 46 55 4e 43 41 4c 4c 28 70 65 72 63 65 6e 74 5f  FUNCALL(percent_
4980: 72 61 6e 6b 2c 20 30 2c 20 30 29 2c 0a 20 20 20  rank, 0, 0),.   
4990: 20 57 49 4e 44 4f 57 46 55 4e 43 41 4c 4c 28 63   WINDOWFUNCALL(c
49a0: 75 6d 65 5f 64 69 73 74 2c 20 30 2c 20 30 29 2c  ume_dist, 0, 0),
49b0: 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 41  .    WINDOWFUNCA
49c0: 4c 4c 28 6e 74 69 6c 65 2c 20 31 2c 20 30 29 2c  LL(ntile, 1, 0),
49d0: 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 41  .    WINDOWFUNCA
49e0: 4c 4c 28 6c 61 73 74 5f 76 61 6c 75 65 2c 20 31  LL(last_value, 1
49f0: 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57  , 0),.    WINDOW
4a00: 46 55 4e 43 41 4c 4c 28 6e 74 68 5f 76 61 6c 75  FUNCALL(nth_valu
4a10: 65 2c 20 32 2c 20 30 29 2c 0a 20 20 20 20 57 49  e, 2, 0),.    WI
4a20: 4e 44 4f 57 46 55 4e 43 41 4c 4c 28 66 69 72 73  NDOWFUNCALL(firs
4a30: 74 5f 76 61 6c 75 65 2c 20 31 2c 20 30 29 2c 0a  t_value, 1, 0),.
4a40: 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f      WINDOWFUNCNO
4a50: 4f 50 28 6c 65 61 64 2c 20 31 2c 20 30 29 2c 0a  OP(lead, 1, 0),.
4a60: 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f      WINDOWFUNCNO
4a70: 4f 50 28 6c 65 61 64 2c 20 32 2c 20 30 29 2c 0a  OP(lead, 2, 0),.
4a80: 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f      WINDOWFUNCNO
4a90: 4f 50 28 6c 65 61 64 2c 20 33 2c 20 30 29 2c 0a  OP(lead, 3, 0),.
4aa0: 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f      WINDOWFUNCNO
4ab0: 4f 50 28 6c 61 67 2c 20 31 2c 20 30 29 2c 0a 20  OP(lag, 1, 0),. 
4ac0: 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f 4f     WINDOWFUNCNOO
4ad0: 50 28 6c 61 67 2c 20 32 2c 20 30 29 2c 0a 20 20  P(lag, 2, 0),.  
4ae0: 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f 4f 50    WINDOWFUNCNOOP
4af0: 28 6c 61 67 2c 20 33 2c 20 30 29 2c 0a 20 20 7d  (lag, 3, 0),.  }
4b00: 3b 0a 20 20 73 71 6c 69 74 65 33 49 6e 73 65 72  ;.  sqlite3Inser
4b10: 74 42 75 69 6c 74 69 6e 46 75 6e 63 73 28 61 57  tBuiltinFuncs(aW
4b20: 69 6e 64 6f 77 46 75 6e 63 73 2c 20 41 72 72 61  indowFuncs, Arra
4b30: 79 53 69 7a 65 28 61 57 69 6e 64 6f 77 46 75 6e  ySize(aWindowFun
4b40: 63 73 29 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  cs));.}..static 
4b50: 57 69 6e 64 6f 77 20 2a 77 69 6e 64 6f 77 46 69  Window *windowFi
4b60: 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  nd(Parse *pParse
4b70: 2c 20 57 69 6e 64 6f 77 20 2a 70 4c 69 73 74 2c  , Window *pList,
4b80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
4b90: 6d 65 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70  me){.  Window *p
4ba0: 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b  ;.  for(p=pList;
4bb0: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 57 69   p; p=p->pNextWi
4bc0: 6e 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  n){.    if( sqli
4bd0: 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 7a 4e  te3StrICmp(p->zN
4be0: 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29  ame, zName)==0 )
4bf0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
4c00: 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ( p==0 ){.    sq
4c10: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
4c20: 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 77  arse, "no such w
4c30: 69 6e 64 6f 77 3a 20 25 73 22 2c 20 7a 4e 61 6d  indow: %s", zNam
4c40: 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
4c50: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   p;.}../*.** Thi
4c60: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
4c70: 6c 6c 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  lled immediately
4c80: 20 61 66 74 65 72 20 72 65 73 6f 6c 76 69 6e 67   after resolving
4c90: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61   the function na
4ca0: 6d 65 0a 2a 2a 20 66 6f 72 20 61 20 77 69 6e 64  me.** for a wind
4cb0: 6f 77 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  ow function with
4cc0: 69 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  in a SELECT stat
4cd0: 65 6d 65 6e 74 2e 20 41 72 67 75 6d 65 6e 74 20  ement. Argument 
4ce0: 70 4c 69 73 74 20 69 73 20 61 0a 2a 2a 20 6c 69  pList is a.** li
4cf0: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 57 49 4e  nked list of WIN
4d00: 44 4f 57 20 64 65 66 69 6e 69 74 69 6f 6e 73 20  DOW definitions 
4d10: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
4d20: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
4d30: 2e 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 46  ..** Argument pF
4d40: 75 6e 63 20 69 73 20 74 68 65 20 66 75 6e 63 74  unc is the funct
4d50: 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 6a  ion definition j
4d60: 75 73 74 20 72 65 73 6f 6c 76 65 64 20 61 6e 64  ust resolved and
4d70: 20 70 57 69 6e 0a 2a 2a 20 69 73 20 74 68 65 20   pWin.** is the 
4d80: 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 72 65  Window object re
4d90: 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 61  presenting the a
4da0: 73 73 6f 63 69 61 74 65 64 20 4f 56 45 52 20 63  ssociated OVER c
4db0: 6c 61 75 73 65 2e 20 54 68 69 73 0a 2a 2a 20 66  lause. This.** f
4dc0: 75 6e 63 74 69 6f 6e 20 75 70 64 61 74 65 73 20  unction updates 
4dd0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
4de0: 70 57 69 6e 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  pWin as follows:
4df0: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68  .**.**   * If th
4e00: 65 20 4f 56 45 52 20 63 6c 61 75 73 65 20 72 65  e OVER clause re
4e10: 66 65 72 65 64 20 74 6f 20 61 20 6e 61 6d 65 64  fered to a named
4e20: 20 77 69 6e 64 6f 77 20 28 61 73 20 69 6e 20 22   window (as in "
4e30: 6d 61 78 28 78 29 20 4f 56 45 52 20 77 69 6e 22  max(x) OVER win"
4e40: 29 2c 0a 2a 2a 20 20 20 20 20 73 65 61 72 63 68  ),.**     search
4e50: 20 6c 69 73 74 20 70 4c 69 73 74 20 66 6f 72 20   list pList for 
4e60: 61 20 6d 61 74 63 68 69 6e 67 20 57 49 4e 44 4f  a matching WINDO
4e70: 57 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 61 6e  W definition, an
4e80: 64 20 75 70 64 61 74 65 20 70 57 69 6e 0a 2a 2a  d update pWin.**
4e90: 20 20 20 20 20 61 63 63 6f 72 64 69 6e 67 6c 79       accordingly
4ea0: 2e 20 49 66 20 6e 6f 20 73 75 63 68 20 57 49 4e  . If no such WIN
4eb0: 44 4f 57 20 63 6c 61 75 73 65 20 63 61 6e 20 62  DOW clause can b
4ec0: 65 20 66 6f 75 6e 64 2c 20 6c 65 61 76 65 20 61  e found, leave a
4ed0: 6e 20 65 72 72 6f 72 0a 2a 2a 20 20 20 20 20 69  n error.**     i
4ee0: 6e 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20  n pParse..**.** 
4ef0: 20 20 2a 20 49 66 20 74 68 65 20 66 75 6e 63 74    * If the funct
4f00: 69 6f 6e 20 69 73 20 61 20 62 75 69 6c 74 2d 69  ion is a built-i
4f10: 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  n window functio
4f20: 6e 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20  n that requires 
4f30: 74 68 65 0a 2a 2a 20 20 20 20 20 77 69 6e 64 6f  the.**     windo
4f40: 77 20 74 6f 20 62 65 20 63 6f 65 72 63 65 64 20  w to be coerced 
4f50: 28 73 65 65 20 22 42 55 49 4c 54 2d 49 4e 20 57  (see "BUILT-IN W
4f60: 49 4e 44 4f 57 20 46 55 4e 43 54 49 4f 4e 53 22  INDOW FUNCTIONS"
4f70: 20 61 74 20 74 68 65 20 74 6f 70 0a 2a 2a 20 20   at the top.**  
4f80: 20 20 20 6f 66 20 74 68 69 73 20 66 69 6c 65 29     of this file)
4f90: 2c 20 70 57 69 6e 20 69 73 20 75 70 64 61 74 65  , pWin is update
4fa0: 64 20 68 65 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20  d here..*/.void 
4fb0: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 55 70 64  sqlite3WindowUpd
4fc0: 61 74 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ate(.  Parse *pP
4fd0: 61 72 73 65 2c 20 0a 20 20 57 69 6e 64 6f 77 20  arse, .  Window 
4fe0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  *pList,         
4ff0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
5000: 20 6f 66 20 6e 61 6d 65 64 20 77 69 6e 64 6f 77   of named window
5010: 73 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43  s for this SELEC
5020: 54 20 2a 2f 0a 20 20 57 69 6e 64 6f 77 20 2a 70  T */.  Window *p
5030: 57 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  Win,            
5040: 20 20 20 20 20 20 20 2f 2a 20 57 69 6e 64 6f 77         /* Window
5050: 20 66 72 61 6d 65 20 74 6f 20 75 70 64 61 74 65   frame to update
5060: 20 2a 2f 0a 20 20 46 75 6e 63 44 65 66 20 2a 70   */.  FuncDef *p
5070: 46 75 6e 63 20 20 20 20 20 20 20 20 20 20 20 20  Func            
5080: 20 20 20 20 20 20 2f 2a 20 57 69 6e 64 6f 77 20        /* Window 
5090: 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74  function definit
50a0: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ion */.){.  if( 
50b0: 70 57 69 6e 2d 3e 7a 4e 61 6d 65 20 26 26 20 70  pWin->zName && p
50c0: 57 69 6e 2d 3e 65 46 72 6d 54 79 70 65 3d 3d 30  Win->eFrmType==0
50d0: 20 29 7b 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a   ){.    Window *
50e0: 70 20 3d 20 77 69 6e 64 6f 77 46 69 6e 64 28 70  p = windowFind(p
50f0: 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 57  Parse, pList, pW
5100: 69 6e 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  in->zName);.    
5110: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
5120: 6e 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70 50 61  n;.    pWin->pPa
5130: 72 74 69 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65  rtition = sqlite
5140: 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 50 61  3ExprListDup(pPa
5150: 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 50 61 72  rse->db, p->pPar
5160: 74 69 74 69 6f 6e 2c 20 30 29 3b 0a 20 20 20 20  tition, 0);.    
5170: 70 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pWin->pOrderBy =
5180: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
5190: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
51a0: 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 30 29 3b  p->pOrderBy, 0);
51b0: 0a 20 20 20 20 70 57 69 6e 2d 3e 70 53 74 61 72  .    pWin->pStar
51c0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
51d0: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
51e0: 2d 3e 70 53 74 61 72 74 2c 20 30 29 3b 0a 20 20  ->pStart, 0);.  
51f0: 20 20 70 57 69 6e 2d 3e 70 45 6e 64 20 3d 20 73    pWin->pEnd = s
5200: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50  qlite3ExprDup(pP
5210: 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 45 6e  arse->db, p->pEn
5220: 64 2c 20 30 29 3b 0a 20 20 20 20 70 57 69 6e 2d  d, 0);.    pWin-
5230: 3e 65 53 74 61 72 74 20 3d 20 70 2d 3e 65 53 74  >eStart = p->eSt
5240: 61 72 74 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 65  art;.    pWin->e
5250: 45 6e 64 20 3d 20 70 2d 3e 65 45 6e 64 3b 0a 20  End = p->eEnd;. 
5260: 20 20 20 70 57 69 6e 2d 3e 65 46 72 6d 54 79 70     pWin->eFrmTyp
5270: 65 20 3d 20 70 2d 3e 65 46 72 6d 54 79 70 65 3b  e = p->eFrmType;
5280: 0a 20 20 20 20 70 57 69 6e 2d 3e 65 45 78 63 6c  .    pWin->eExcl
5290: 75 64 65 20 3d 20 70 2d 3e 65 45 78 63 6c 75 64  ude = p->eExclud
52a0: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
52b0: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 68 61  sqlite3WindowCha
52c0: 69 6e 28 70 50 61 72 73 65 2c 20 70 57 69 6e 2c  in(pParse, pWin,
52d0: 20 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69   pList);.  }.  i
52e0: 66 28 20 28 70 57 69 6e 2d 3e 65 46 72 6d 54 79  f( (pWin->eFrmTy
52f0: 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 29 0a 20 20  pe==TK_RANGE).  
5300: 20 26 26 20 28 70 57 69 6e 2d 3e 70 53 74 61 72   && (pWin->pStar
5310: 74 20 7c 7c 20 70 57 69 6e 2d 3e 70 45 6e 64 29  t || pWin->pEnd)
5320: 20 0a 20 20 20 26 26 20 28 70 57 69 6e 2d 3e 70   .   && (pWin->p
5330: 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 57  OrderBy==0 || pW
5340: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  in->pOrderBy->nE
5350: 78 70 72 21 3d 31 29 0a 20 20 29 7b 0a 20 20 20  xpr!=1).  ){.   
5360: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
5370: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
5380: 22 52 41 4e 47 45 20 77 69 74 68 20 6f 66 66 73  "RANGE with offs
5390: 65 74 20 50 52 45 43 45 44 49 4e 47 2f 46 4f 4c  et PRECEDING/FOL
53a0: 4c 4f 57 49 4e 47 20 72 65 71 75 69 72 65 73 20  LOWING requires 
53b0: 6f 6e 65 20 4f 52 44 45 52 20 42 59 20 65 78 70  one ORDER BY exp
53c0: 72 65 73 73 69 6f 6e 22 0a 20 20 20 20 29 3b 0a  ression".    );.
53d0: 20 20 7d 65 6c 73 65 0a 20 20 69 66 28 20 70 46    }else.  if( pF
53e0: 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  unc->funcFlags &
53f0: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e   SQLITE_FUNC_WIN
5400: 44 4f 57 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  DOW ){.    sqlit
5410: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
5420: 3e 64 62 3b 0a 20 20 20 20 69 66 28 20 70 57 69  >db;.    if( pWi
5430: 6e 2d 3e 70 46 69 6c 74 65 72 20 29 7b 0a 20 20  n->pFilter ){.  
5440: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
5450: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
5460: 20 20 20 20 20 20 20 22 46 49 4c 54 45 52 20 63         "FILTER c
5470: 6c 61 75 73 65 20 6d 61 79 20 6f 6e 6c 79 20 62  lause may only b
5480: 65 20 75 73 65 64 20 77 69 74 68 20 61 67 67 72  e used with aggr
5490: 65 67 61 74 65 20 77 69 6e 64 6f 77 20 66 75 6e  egate window fun
54a0: 63 74 69 6f 6e 73 22 0a 20 20 20 20 20 20 29 3b  ctions".      );
54b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
54c0: 20 20 73 74 72 75 63 74 20 57 69 6e 64 6f 77 55    struct WindowU
54d0: 70 64 61 74 65 20 7b 0a 20 20 20 20 20 20 20 20  pdate {.        
54e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
54f0: 63 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65  c;.        int e
5500: 46 72 6d 54 79 70 65 3b 0a 20 20 20 20 20 20 20  FrmType;.       
5510: 20 69 6e 74 20 65 53 74 61 72 74 3b 0a 20 20 20   int eStart;.   
5520: 20 20 20 20 20 69 6e 74 20 65 45 6e 64 3b 0a 20       int eEnd;. 
5530: 20 20 20 20 20 7d 20 61 55 70 5b 5d 20 3d 20 7b       } aUp[] = {
5540: 0a 20 20 20 20 20 20 20 20 7b 20 72 6f 77 5f 6e  .        { row_n
5550: 75 6d 62 65 72 4e 61 6d 65 2c 20 20 20 54 4b 5f  umberName,   TK_
5560: 52 4f 57 53 2c 20 20 20 54 4b 5f 55 4e 42 4f 55  ROWS,   TK_UNBOU
5570: 4e 44 45 44 2c 20 54 4b 5f 43 55 52 52 45 4e 54  NDED, TK_CURRENT
5580: 20 7d 2c 20 0a 20 20 20 20 20 20 20 20 7b 20 64   }, .        { d
5590: 65 6e 73 65 5f 72 61 6e 6b 4e 61 6d 65 2c 20 20  ense_rankName,  
55a0: 20 54 4b 5f 52 41 4e 47 45 2c 20 20 54 4b 5f 55   TK_RANGE,  TK_U
55b0: 4e 42 4f 55 4e 44 45 44 2c 20 54 4b 5f 43 55 52  NBOUNDED, TK_CUR
55c0: 52 45 4e 54 20 7d 2c 20 0a 20 20 20 20 20 20 20  RENT }, .       
55d0: 20 7b 20 72 61 6e 6b 4e 61 6d 65 2c 20 20 20 20   { rankName,    
55e0: 20 20 20 20 20 54 4b 5f 52 41 4e 47 45 2c 20 20       TK_RANGE,  
55f0: 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 2c 20 54 4b  TK_UNBOUNDED, TK
5600: 5f 43 55 52 52 45 4e 54 20 7d 2c 20 0a 20 20 20  _CURRENT }, .   
5610: 20 20 20 20 20 7b 20 70 65 72 63 65 6e 74 5f 72       { percent_r
5620: 61 6e 6b 4e 61 6d 65 2c 20 54 4b 5f 47 52 4f 55  ankName, TK_GROU
5630: 50 53 2c 20 54 4b 5f 43 55 52 52 45 4e 54 2c 20  PS, TK_CURRENT, 
5640: 20 20 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 7d    TK_UNBOUNDED }
5650: 2c 20 0a 20 20 20 20 20 20 20 20 7b 20 63 75 6d  , .        { cum
5660: 65 5f 64 69 73 74 4e 61 6d 65 2c 20 20 20 20 54  e_distName,    T
5670: 4b 5f 47 52 4f 55 50 53 2c 20 54 4b 5f 46 4f 4c  K_GROUPS, TK_FOL
5680: 4c 4f 57 49 4e 47 2c 20 54 4b 5f 55 4e 42 4f 55  LOWING, TK_UNBOU
5690: 4e 44 45 44 20 7d 2c 20 0a 20 20 20 20 20 20 20  NDED }, .       
56a0: 20 7b 20 6e 74 69 6c 65 4e 61 6d 65 2c 20 20 20   { ntileName,   
56b0: 20 20 20 20 20 54 4b 5f 52 4f 57 53 2c 20 20 20       TK_ROWS,   
56c0: 54 4b 5f 43 55 52 52 45 4e 54 2c 20 20 20 54 4b  TK_CURRENT,   TK
56d0: 5f 55 4e 42 4f 55 4e 44 45 44 20 7d 2c 20 0a 20  _UNBOUNDED }, . 
56e0: 20 20 20 20 20 20 20 7b 20 6c 65 61 64 4e 61 6d         { leadNam
56f0: 65 2c 20 20 20 20 20 20 20 20 20 54 4b 5f 52 4f  e,         TK_RO
5700: 57 53 2c 20 20 20 54 4b 5f 55 4e 42 4f 55 4e 44  WS,   TK_UNBOUND
5710: 45 44 2c 20 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  ED, TK_UNBOUNDED
5720: 20 7d 2c 20 0a 20 20 20 20 20 20 20 20 7b 20 6c   }, .        { l
5730: 61 67 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  agName,         
5740: 20 54 4b 5f 52 4f 57 53 2c 20 20 20 54 4b 5f 55   TK_ROWS,   TK_U
5750: 4e 42 4f 55 4e 44 45 44 2c 20 54 4b 5f 43 55 52  NBOUNDED, TK_CUR
5760: 52 45 4e 54 20 7d 2c 20 0a 20 20 20 20 20 20 7d  RENT }, .      }
5770: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
5780: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
5790: 41 72 72 61 79 53 69 7a 65 28 61 55 70 29 3b 20  ArraySize(aUp); 
57a0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
57b0: 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d  ( pFunc->zName==
57c0: 61 55 70 5b 69 5d 2e 7a 46 75 6e 63 20 29 7b 0a  aUp[i].zFunc ){.
57d0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
57e0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
57f0: 70 57 69 6e 2d 3e 70 53 74 61 72 74 29 3b 0a 20  pWin->pStart);. 
5800: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
5810: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
5820: 57 69 6e 2d 3e 70 45 6e 64 29 3b 0a 20 20 20 20  Win->pEnd);.    
5830: 20 20 20 20 20 20 70 57 69 6e 2d 3e 70 45 6e 64        pWin->pEnd
5840: 20 3d 20 70 57 69 6e 2d 3e 70 53 74 61 72 74 20   = pWin->pStart 
5850: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 0;.          p
5860: 57 69 6e 2d 3e 65 46 72 6d 54 79 70 65 20 3d 20  Win->eFrmType = 
5870: 61 55 70 5b 69 5d 2e 65 46 72 6d 54 79 70 65 3b  aUp[i].eFrmType;
5880: 0a 20 20 20 20 20 20 20 20 20 20 70 57 69 6e 2d  .          pWin-
5890: 3e 65 53 74 61 72 74 20 3d 20 61 55 70 5b 69 5d  >eStart = aUp[i]
58a0: 2e 65 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20  .eStart;.       
58b0: 20 20 20 70 57 69 6e 2d 3e 65 45 6e 64 20 3d 20     pWin->eEnd = 
58c0: 61 55 70 5b 69 5d 2e 65 45 6e 64 3b 0a 20 20 20  aUp[i].eEnd;.   
58d0: 20 20 20 20 20 20 20 70 57 69 6e 2d 3e 65 45 78         pWin->eEx
58e0: 63 6c 75 64 65 20 3d 20 30 3b 0a 20 20 20 20 20  clude = 0;.     
58f0: 20 20 20 20 20 69 66 28 20 70 57 69 6e 2d 3e 65       if( pWin->e
5900: 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57  Start==TK_FOLLOW
5910: 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ING ){.         
5920: 20 20 20 70 57 69 6e 2d 3e 70 53 74 61 72 74 20     pWin->pStart 
5930: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
5940: 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 22 31  , TK_INTEGER, "1
5950: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ");.          }.
5960: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
5970: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5980: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70   }.    }.  }.  p
5990: 57 69 6e 2d 3e 70 46 75 6e 63 20 3d 20 70 46 75  Win->pFunc = pFu
59a0: 6e 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  nc;.}../*.** Con
59b0: 74 65 78 74 20 6f 62 6a 65 63 74 20 70 61 73 73  text object pass
59c0: 65 64 20 74 68 72 6f 75 67 68 20 73 71 6c 69 74  ed through sqlit
59d0: 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 29  e3WalkExprList()
59e0: 20 74 6f 0a 2a 2a 20 73 65 6c 65 63 74 57 69 6e   to.** selectWin
59f0: 64 6f 77 52 65 77 72 69 74 65 45 78 70 72 43 62  dowRewriteExprCb
5a00: 28 29 20 62 79 20 73 65 6c 65 63 74 57 69 6e 64  () by selectWind
5a10: 6f 77 52 65 77 72 69 74 65 45 4c 69 73 74 28 29  owRewriteEList()
5a20: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
5a30: 75 63 74 20 57 69 6e 64 6f 77 52 65 77 72 69 74  uct WindowRewrit
5a40: 65 20 57 69 6e 64 6f 77 52 65 77 72 69 74 65 3b  e WindowRewrite;
5a50: 0a 73 74 72 75 63 74 20 57 69 6e 64 6f 77 52 65  .struct WindowRe
5a60: 77 72 69 74 65 20 7b 0a 20 20 57 69 6e 64 6f 77  write {.  Window
5a70: 20 2a 70 57 69 6e 3b 0a 20 20 53 72 63 4c 69 73   *pWin;.  SrcLis
5a80: 74 20 2a 70 53 72 63 3b 0a 20 20 45 78 70 72 4c  t *pSrc;.  ExprL
5a90: 69 73 74 20 2a 70 53 75 62 3b 0a 20 20 54 61 62  ist *pSub;.  Tab
5aa0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 53 65 6c 65  le *pTab;.  Sele
5ab0: 63 74 20 2a 70 53 75 62 53 65 6c 65 63 74 3b 20  ct *pSubSelect; 
5ac0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
5ad0: 75 72 72 65 6e 74 20 73 75 62 2d 73 65 6c 65 63  urrent sub-selec
5ae0: 74 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 7d 3b 0a  t, if any */.};.
5af0: 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 62 61 63 6b 20  ./*.** Callback 
5b00: 66 75 6e 63 74 69 6f 6e 20 75 73 65 64 20 62 79  function used by
5b10: 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77   selectWindowRew
5b20: 72 69 74 65 45 4c 69 73 74 28 29 2e 20 49 66 20  riteEList(). If 
5b30: 6e 65 63 65 73 73 61 72 79 2c 0a 2a 2a 20 74 68  necessary,.** th
5b40: 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65  is function appe
5b50: 6e 64 73 20 74 6f 20 74 68 65 20 6f 75 74 70 75  nds to the outpu
5b60: 74 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73  t expression-lis
5b70: 74 20 61 6e 64 20 75 70 64 61 74 65 73 20 0a 2a  t and updates .*
5b80: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 28 2a 70  * expression (*p
5b90: 70 45 78 70 72 29 20 69 6e 20 70 6c 61 63 65 2e  pExpr) in place.
5ba0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
5bb0: 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69  electWindowRewri
5bc0: 74 65 45 78 70 72 43 62 28 57 61 6c 6b 65 72 20  teExprCb(Walker 
5bd0: 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
5be0: 70 45 78 70 72 29 7b 0a 20 20 73 74 72 75 63 74  pExpr){.  struct
5bf0: 20 57 69 6e 64 6f 77 52 65 77 72 69 74 65 20 2a   WindowRewrite *
5c00: 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  p = pWalker->u.p
5c10: 52 65 77 72 69 74 65 3b 0a 20 20 50 61 72 73 65  Rewrite;.  Parse
5c20: 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b   *pParse = pWalk
5c30: 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 61 73  er->pParse;.  as
5c40: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
5c50: 61 73 73 65 72 74 28 20 70 2d 3e 70 57 69 6e 21  assert( p->pWin!
5c60: 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  =0 );..  /* If t
5c70: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
5c80: 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f  being called fro
5c90: 6d 20 77 69 74 68 69 6e 20 61 20 73 63 61 6c 61  m within a scala
5ca0: 72 20 73 75 62 2d 73 65 6c 65 63 74 0a 20 20 2a  r sub-select.  *
5cb0: 2a 20 74 68 61 74 20 75 73 65 64 20 62 79 20 74  * that used by t
5cc0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
5cd0: 65 6e 74 20 62 65 69 6e 67 20 70 72 6f 63 65 73  ent being proces
5ce0: 73 65 64 2c 20 6f 6e 6c 79 20 70 72 6f 63 65 73  sed, only proces
5cf0: 73 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e  s.  ** TK_COLUMN
5d00: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
5d10: 74 20 72 65 66 65 72 20 74 6f 20 69 74 20 28 74  t refer to it (t
5d20: 68 65 20 6f 75 74 65 72 20 53 45 4c 45 43 54 29  he outer SELECT)
5d30: 2e 20 44 6f 0a 20 20 2a 2a 20 6e 6f 74 20 70 72  . Do.  ** not pr
5d40: 6f 63 65 73 73 20 61 67 67 72 65 67 61 74 65 73  ocess aggregates
5d50: 20 6f 72 20 77 69 6e 64 6f 77 20 66 75 6e 63 74   or window funct
5d60: 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 61 73 20  ions at all, as 
5d70: 74 68 65 79 20 62 65 6c 6f 6e 67 0a 20 20 2a 2a  they belong.  **
5d80: 20 74 6f 20 74 68 65 20 73 63 61 6c 61 72 20 73   to the scalar s
5d90: 75 62 2d 73 65 6c 65 63 74 2e 20 20 2a 2f 0a 20  ub-select.  */. 
5da0: 20 69 66 28 20 70 2d 3e 70 53 75 62 53 65 6c 65   if( p->pSubSele
5db0: 63 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45  ct ){.    if( pE
5dc0: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
5dd0: 4d 4e 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  MN ){.      retu
5de0: 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
5df0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5e00: 20 20 69 6e 74 20 6e 53 72 63 20 3d 20 70 2d 3e    int nSrc = p->
5e10: 70 53 72 63 2d 3e 6e 53 72 63 3b 0a 20 20 20 20  pSrc->nSrc;.    
5e20: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
5e30: 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 72 63 3b 20  or(i=0; i<nSrc; 
5e40: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
5e50: 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ( pExpr->iTable=
5e60: 3d 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d 2e 69  =p->pSrc->a[i].i
5e70: 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a  Cursor ) break;.
5e80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
5e90: 28 20 69 3d 3d 6e 53 72 63 20 29 20 72 65 74 75  ( i==nSrc ) retu
5ea0: 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
5eb0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77  .    }.  }..  sw
5ec0: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
5ed0: 29 7b 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ){..    case TK_
5ee0: 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20  FUNCTION:.      
5ef0: 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
5f00: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 57  erty(pExpr, EP_W
5f10: 69 6e 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20  inFunc) ){.     
5f20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5f30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 57  }else{.        W
5f40: 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 20  indow *pWin;.   
5f50: 20 20 20 20 20 66 6f 72 28 70 57 69 6e 3d 70 2d       for(pWin=p-
5f60: 3e 70 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69  >pWin; pWin; pWi
5f70: 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e  n=pWin->pNextWin
5f80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
5f90: 20 70 45 78 70 72 2d 3e 79 2e 70 57 69 6e 3d 3d   pExpr->y.pWin==
5fa0: 70 57 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  pWin ){.        
5fb0: 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69 6e      assert( pWin
5fc0: 2d 3e 70 4f 77 6e 65 72 3d 3d 70 45 78 70 72 20  ->pOwner==pExpr 
5fd0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
5fe0: 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
5ff0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
6000: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
6010: 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
6020: 6f 75 67 68 2e 20 20 2a 2f 0a 0a 20 20 20 20 63  ough.  */..    c
6030: 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
6040: 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ION:.    case TK
6050: 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
6060: 20 45 78 70 72 20 2a 70 44 75 70 20 3d 20 73 71   Expr *pDup = sq
6070: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61  lite3ExprDup(pPa
6080: 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20  rse->db, pExpr, 
6090: 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 53 75  0);.      p->pSu
60a0: 62 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  b = sqlite3ExprL
60b0: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
60c0: 2c 20 70 2d 3e 70 53 75 62 2c 20 70 44 75 70 29  , p->pSub, pDup)
60d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  ;.      if( p->p
60e0: 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 61  Sub ){.        a
60f0: 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50 72  ssert( ExprHasPr
6100: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
6110: 5f 53 74 61 74 69 63 29 3d 3d 30 20 29 3b 0a 20  _Static)==0 );. 
6120: 20 20 20 20 20 20 20 45 78 70 72 53 65 74 50 72         ExprSetPr
6130: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
6140: 5f 53 74 61 74 69 63 29 3b 0a 20 20 20 20 20 20  _Static);.      
6150: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
6160: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
6170: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
6180: 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74  ExprClearPropert
6190: 79 28 70 45 78 70 72 2c 20 45 50 5f 53 74 61 74  y(pExpr, EP_Stat
61a0: 69 63 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ic);.        mem
61b0: 73 65 74 28 70 45 78 70 72 2c 20 30 2c 20 73 69  set(pExpr, 0, si
61c0: 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 0a 20 20  zeof(Expr));..  
61d0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
61e0: 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20  = TK_COLUMN;.   
61f0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
6200: 75 6d 6e 20 3d 20 70 2d 3e 70 53 75 62 2d 3e 6e  umn = p->pSub->n
6210: 45 78 70 72 2d 31 3b 0a 20 20 20 20 20 20 20 20  Expr-1;.        
6220: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
6230: 70 2d 3e 70 57 69 6e 2d 3e 69 45 70 68 43 73 72  p->pWin->iEphCsr
6240: 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
6250: 3e 79 2e 70 54 61 62 20 3d 20 70 2d 3e 70 54 61  >y.pTab = p->pTa
6260: 62 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  b;.      }..    
6270: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
6280: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 2f 2a 20      default: /* 
6290: 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 62  no-op */.      b
62a0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  reak;.  }..  ret
62b0: 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
62c0: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73  ;.}.static int s
62d0: 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69  electWindowRewri
62e0: 74 65 53 65 6c 65 63 74 43 62 28 57 61 6c 6b 65  teSelectCb(Walke
62f0: 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
6300: 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
6310: 73 74 72 75 63 74 20 57 69 6e 64 6f 77 52 65 77  struct WindowRew
6320: 72 69 74 65 20 2a 70 20 3d 20 70 57 61 6c 6b 65  rite *p = pWalke
6330: 72 2d 3e 75 2e 70 52 65 77 72 69 74 65 3b 0a 20  r->u.pRewrite;. 
6340: 20 53 65 6c 65 63 74 20 2a 70 53 61 76 65 20 3d   Select *pSave =
6350: 20 70 2d 3e 70 53 75 62 53 65 6c 65 63 74 3b 0a   p->pSubSelect;.
6360: 20 20 69 66 28 20 70 53 61 76 65 3d 3d 70 53 65    if( pSave==pSe
6370: 6c 65 63 74 20 29 7b 0a 20 20 20 20 72 65 74 75  lect ){.    retu
6380: 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
6390: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d  .  }else{.    p-
63a0: 3e 70 53 75 62 53 65 6c 65 63 74 20 3d 20 70 53  >pSubSelect = pS
63b0: 65 6c 65 63 74 3b 0a 20 20 20 20 73 71 6c 69 74  elect;.    sqlit
63c0: 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61  e3WalkSelect(pWa
63d0: 6c 6b 65 72 2c 20 70 53 65 6c 65 63 74 29 3b 0a  lker, pSelect);.
63e0: 20 20 20 20 70 2d 3e 70 53 75 62 53 65 6c 65 63      p->pSubSelec
63f0: 74 20 3d 20 70 53 61 76 65 3b 0a 20 20 7d 0a 20  t = pSave;.  }. 
6400: 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
6410: 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 74 65  e;.}.../*.** Ite
6420: 72 61 74 65 20 74 68 72 6f 75 67 68 20 65 61 63  rate through eac
6430: 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  h expression in 
6440: 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20  expression-list 
6450: 70 45 4c 69 73 74 2e 20 46 6f 72 20 65 61 63 68  pEList. For each
6460: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 4b 5f 43  :.**.**   * TK_C
6470: 4f 4c 55 4d 4e 2c 0a 2a 2a 20 20 20 2a 20 61 67  OLUMN,.**   * ag
6480: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
6490: 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 77 69 6e 64  , or.**   * wind
64a0: 6f 77 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  ow function with
64b0: 20 61 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74   a Window object
64c0: 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 6d   that is not a m
64d0: 65 6d 62 65 72 20 6f 66 20 74 68 65 20 0a 2a 2a  ember of the .**
64e0: 20 20 20 20 20 57 69 6e 64 6f 77 20 6c 69 73 74       Window list
64f0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
6500: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 28  econd argument (
6510: 70 57 69 6e 29 2e 0a 2a 2a 0a 2a 2a 20 41 70 70  pWin)..**.** App
6520: 65 6e 64 20 74 68 65 20 6e 6f 64 65 20 74 6f 20  end the node to 
6530: 6f 75 74 70 75 74 20 65 78 70 72 65 73 73 69 6f  output expressio
6540: 6e 2d 6c 69 73 74 20 28 2a 70 70 53 75 62 29 2e  n-list (*ppSub).
6550: 20 41 6e 64 20 72 65 70 6c 61 63 65 20 69 74 0a   And replace it.
6560: 2a 2a 20 77 69 74 68 20 61 20 54 4b 5f 43 4f 4c  ** with a TK_COL
6570: 55 4d 4e 20 74 68 61 74 20 72 65 61 64 73 20 74  UMN that reads t
6580: 68 65 20 28 4e 2d 31 29 74 68 20 65 6c 65 6d 65  he (N-1)th eleme
6590: 6e 74 20 6f 66 20 74 61 62 6c 65 20 0a 2a 2a 20  nt of table .** 
65a0: 70 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 77  pWin->iEphCsr, w
65b0: 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75  here N is the nu
65c0: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
65d0: 20 69 6e 20 28 2a 70 70 53 75 62 29 20 61 66 74   in (*ppSub) aft
65e0: 65 72 0a 2a 2a 20 61 70 70 65 6e 64 69 6e 67 20  er.** appending 
65f0: 74 68 65 20 6e 65 77 20 6f 6e 65 2e 0a 2a 2f 0a  the new one..*/.
6600: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65  static void sele
6610: 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65 45  ctWindowRewriteE
6620: 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
6630: 50 61 72 73 65 2c 20 0a 20 20 57 69 6e 64 6f 77  Parse, .  Window
6640: 20 2a 70 57 69 6e 2c 0a 20 20 53 72 63 4c 69 73   *pWin,.  SrcLis
6650: 74 20 2a 70 53 72 63 2c 0a 20 20 45 78 70 72 4c  t *pSrc,.  ExprL
6660: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
6670: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
6680: 77 72 69 74 65 20 65 78 70 72 65 73 73 69 6f 6e  write expression
6690: 73 20 69 6e 20 74 68 69 73 20 6c 69 73 74 20 2a  s in this list *
66a0: 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
66b0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70  .  ExprList **pp
66c0: 53 75 62 20 20 20 20 20 20 20 20 20 20 20 20 20  Sub             
66d0: 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 75     /* IN/OUT: Su
66e0: 62 2d 73 65 6c 65 63 74 20 65 78 70 72 65 73 73  b-select express
66f0: 69 6f 6e 2d 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20  ion-list */.){. 
6700: 20 57 61 6c 6b 65 72 20 73 57 61 6c 6b 65 72 3b   Walker sWalker;
6710: 0a 20 20 57 69 6e 64 6f 77 52 65 77 72 69 74 65  .  WindowRewrite
6720: 20 73 52 65 77 72 69 74 65 3b 0a 0a 20 20 61 73   sRewrite;..  as
6730: 73 65 72 74 28 20 70 57 69 6e 21 3d 30 20 29 3b  sert( pWin!=0 );
6740: 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 61 6c 6b  .  memset(&sWalk
6750: 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57 61  er, 0, sizeof(Wa
6760: 6c 6b 65 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74  lker));.  memset
6770: 28 26 73 52 65 77 72 69 74 65 2c 20 30 2c 20 73  (&sRewrite, 0, s
6780: 69 7a 65 6f 66 28 57 69 6e 64 6f 77 52 65 77 72  izeof(WindowRewr
6790: 69 74 65 29 29 3b 0a 0a 20 20 73 52 65 77 72 69  ite));..  sRewri
67a0: 74 65 2e 70 53 75 62 20 3d 20 2a 70 70 53 75 62  te.pSub = *ppSub
67b0: 3b 0a 20 20 73 52 65 77 72 69 74 65 2e 70 57 69  ;.  sRewrite.pWi
67c0: 6e 20 3d 20 70 57 69 6e 3b 0a 20 20 73 52 65 77  n = pWin;.  sRew
67d0: 72 69 74 65 2e 70 53 72 63 20 3d 20 70 53 72 63  rite.pSrc = pSrc
67e0: 3b 0a 20 20 73 52 65 77 72 69 74 65 2e 70 54 61  ;.  sRewrite.pTa
67f0: 62 20 3d 20 70 54 61 62 3b 0a 0a 20 20 73 57 61  b = pTab;..  sWa
6800: 6c 6b 65 72 2e 70 50 61 72 73 65 20 3d 20 70 50  lker.pParse = pP
6810: 61 72 73 65 3b 0a 20 20 73 57 61 6c 6b 65 72 2e  arse;.  sWalker.
6820: 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
6830: 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72  selectWindowRewr
6840: 69 74 65 45 78 70 72 43 62 3b 0a 20 20 73 57 61  iteExprCb;.  sWa
6850: 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c  lker.xSelectCall
6860: 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 57 69 6e  back = selectWin
6870: 64 6f 77 52 65 77 72 69 74 65 53 65 6c 65 63 74  dowRewriteSelect
6880: 43 62 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 75 2e  Cb;.  sWalker.u.
6890: 70 52 65 77 72 69 74 65 20 3d 20 26 73 52 65 77  pRewrite = &sRew
68a0: 72 69 74 65 3b 0a 0a 20 20 28 76 6f 69 64 29 73  rite;..  (void)s
68b0: 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69  qlite3WalkExprLi
68c0: 73 74 28 26 73 57 61 6c 6b 65 72 2c 20 70 45 4c  st(&sWalker, pEL
68d0: 69 73 74 29 3b 0a 0a 20 20 2a 70 70 53 75 62 20  ist);..  *ppSub 
68e0: 3d 20 73 52 65 77 72 69 74 65 2e 70 53 75 62 3b  = sRewrite.pSub;
68f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
6900: 20 61 20 63 6f 70 79 20 6f 66 20 65 61 63 68 20   a copy of each 
6910: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 65 78  expression in ex
6920: 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 70 41  pression-list pA
6930: 70 70 65 6e 64 20 74 6f 0a 2a 2a 20 65 78 70 72  ppend to.** expr
6940: 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 4c 69 73  ession list pLis
6950: 74 2e 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  t. Return a poin
6960: 74 65 72 20 74 6f 20 74 68 65 20 72 65 73 75 6c  ter to the resul
6970: 74 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  t list..*/.stati
6980: 63 20 45 78 70 72 4c 69 73 74 20 2a 65 78 70 72  c ExprList *expr
6990: 4c 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28 0a  ListAppendList(.
69a0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
69b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
69c0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
69d0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
69e0: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  t,        /* Lis
69f0: 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70  t to which to ap
6a00: 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e  pend. Might be N
6a10: 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
6a20: 74 20 2a 70 41 70 70 65 6e 64 2c 20 20 20 20 20  t *pAppend,     
6a30: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75   /* List of valu
6a40: 65 73 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69  es to append. Mi
6a50: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
6a60: 20 69 6e 74 20 62 49 6e 74 54 6f 4e 75 6c 6c 0a   int bIntToNull.
6a70: 29 7b 0a 20 20 69 66 28 20 70 41 70 70 65 6e 64  ){.  if( pAppend
6a80: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
6a90: 20 20 20 69 6e 74 20 6e 49 6e 69 74 20 3d 20 70     int nInit = p
6aa0: 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45  List ? pList->nE
6ab0: 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 66 6f 72  xpr : 0;.    for
6ac0: 28 69 3d 30 3b 20 69 3c 70 41 70 70 65 6e 64 2d  (i=0; i<pAppend-
6ad0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
6ae0: 20 20 20 20 45 78 70 72 20 2a 70 44 75 70 20 3d      Expr *pDup =
6af0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
6b00: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 70 70  pParse->db, pApp
6b10: 65 6e 64 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  end->a[i].pExpr,
6b20: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62   0);.      if( b
6b30: 49 6e 74 54 6f 4e 75 6c 6c 20 26 26 20 70 44 75  IntToNull && pDu
6b40: 70 20 26 26 20 70 44 75 70 2d 3e 6f 70 3d 3d 54  p && pDup->op==T
6b50: 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20  K_INTEGER ){.   
6b60: 20 20 20 20 20 70 44 75 70 2d 3e 6f 70 20 3d 20       pDup->op = 
6b70: 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 20  TK_NULL;.       
6b80: 20 70 44 75 70 2d 3e 66 6c 61 67 73 20 26 3d 20   pDup->flags &= 
6b90: 7e 28 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50  ~(EP_IntValue|EP
6ba0: 5f 49 73 54 72 75 65 7c 45 50 5f 49 73 46 61 6c  _IsTrue|EP_IsFal
6bb0: 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  se);.      }.   
6bc0: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
6bd0: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
6be0: 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20  (pParse, pList, 
6bf0: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 69 66 28  pDup);.      if(
6c00: 20 70 4c 69 73 74 20 29 20 70 4c 69 73 74 2d 3e   pList ) pList->
6c10: 61 5b 6e 49 6e 69 74 2b 69 5d 2e 73 6f 72 74 4f  a[nInit+i].sortO
6c20: 72 64 65 72 20 3d 20 70 41 70 70 65 6e 64 2d 3e  rder = pAppend->
6c30: 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[i].sortOrder;.
6c40: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
6c50: 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
6c60: 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43 54  ** If the SELECT
6c70: 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65   statement passe
6c80: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
6c90: 61 72 67 75 6d 65 6e 74 20 64 6f 65 73 20 6e 6f  argument does no
6ca0: 74 20 69 6e 76 6f 6b 65 0a 2a 2a 20 61 6e 79 20  t invoke.** any 
6cb0: 53 51 4c 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  SQL window funct
6cc0: 69 6f 6e 73 2c 20 74 68 69 73 20 66 75 6e 63 74  ions, this funct
6cd0: 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
6ce0: 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 0a 2a  Otherwise, it .*
6cf0: 2a 20 72 65 77 72 69 74 65 73 20 74 68 65 20 53  * rewrites the S
6d00: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
6d10: 73 6f 20 74 68 61 74 20 77 69 6e 64 6f 77 20 66  so that window f
6d20: 75 6e 63 74 69 6f 6e 20 78 53 74 65 70 20 66 75  unction xStep fu
6d30: 6e 63 74 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 69  nctions.** are i
6d40: 6e 76 6f 6b 65 64 20 69 6e 20 74 68 65 20 63 6f  nvoked in the co
6d50: 72 72 65 63 74 20 6f 72 64 65 72 20 61 73 20 64  rrect order as d
6d60: 65 73 63 72 69 62 65 64 20 75 6e 64 65 72 20 22  escribed under "
6d70: 53 45 4c 45 43 54 20 52 45 57 52 49 54 49 4e 47  SELECT REWRITING
6d80: 22 0a 2a 2a 20 61 74 20 74 68 65 20 74 6f 70 20  ".** at the top 
6d90: 6f 66 20 74 68 69 73 20 66 69 6c 65 2e 0a 2a 2f  of this file..*/
6da0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 69 6e 64  .int sqlite3Wind
6db0: 6f 77 52 65 77 72 69 74 65 28 50 61 72 73 65 20  owRewrite(Parse 
6dc0: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
6dd0: 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *p){.  int rc = 
6de0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
6df0: 20 70 2d 3e 70 57 69 6e 20 26 26 20 70 2d 3e 70   p->pWin && p->p
6e00: 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20  Prior==0 ){.    
6e10: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
6e20: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
6e30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  ;.    sqlite3 *d
6e40: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
6e50: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62      Select *pSub
6e60: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
6e70: 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72    /* The subquer
6e80: 79 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74  y */.    SrcList
6e90: 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63   *pSrc = p->pSrc
6ea0: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 57 68 65  ;.    Expr *pWhe
6eb0: 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a  re = p->pWhere;.
6ec0: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47      ExprList *pG
6ed0: 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f  roupBy = p->pGro
6ee0: 75 70 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a  upBy;.    Expr *
6ef0: 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61  pHaving = p->pHa
6f00: 76 69 6e 67 3b 0a 20 20 20 20 45 78 70 72 4c 69  ving;.    ExprLi
6f10: 73 74 20 2a 70 53 6f 72 74 20 3d 20 30 3b 0a 0a  st *pSort = 0;..
6f20: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 53      ExprList *pS
6f30: 75 62 6c 69 73 74 20 3d 20 30 3b 20 20 20 20 20  ublist = 0;     
6f40: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
6f50: 6c 69 73 74 20 66 6f 72 20 73 75 62 2d 71 75 65  list for sub-que
6f60: 72 79 20 2a 2f 0a 20 20 20 20 57 69 6e 64 6f 77  ry */.    Window
6f70: 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57 69   *pMWin = p->pWi
6f80: 6e 3b 20 20 20 20 20 20 2f 2a 20 4d 61 73 74 65  n;      /* Maste
6f90: 72 20 77 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20  r window object 
6fa0: 2a 2f 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a 70  */.    Window *p
6fb0: 57 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  Win;            
6fc0: 20 20 20 20 20 2f 2a 20 57 69 6e 64 6f 77 20 6f       /* Window o
6fd0: 62 6a 65 63 74 20 69 74 65 72 61 74 6f 72 20 2a  bject iterator *
6fe0: 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  /.    Table *pTa
6ff0: 62 3b 0a 0a 20 20 20 20 70 54 61 62 20 3d 20 73  b;..    pTab = s
7000: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
7010: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61  ro(db, sizeof(Ta
7020: 62 6c 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70  ble));.    if( p
7030: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
7040: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
7050: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  MEM;.    }..    
7060: 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20  p->pSrc = 0;.   
7070: 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a   p->pWhere = 0;.
7080: 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79 20      p->pGroupBy 
7090: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76  = 0;.    p->pHav
70a0: 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  ing = 0;.    p->
70b0: 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f  selFlags &= ~SF_
70c0: 41 67 67 72 65 67 61 74 65 3b 0a 0a 20 20 20 20  Aggregate;..    
70d0: 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 4f 52  /* Create the OR
70e0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 6f  DER BY clause fo
70f0: 72 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74  r the sub-select
7100: 2e 20 54 68 69 73 20 69 73 20 74 68 65 20 63 6f  . This is the co
7110: 6e 63 61 74 65 6e 61 74 69 6f 6e 0a 20 20 20 20  ncatenation.    
7120: 2a 2a 20 6f 66 20 74 68 65 20 77 69 6e 64 6f 77  ** of the window
7130: 20 50 41 52 54 49 54 49 4f 4e 20 61 6e 64 20 4f   PARTITION and O
7140: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e  RDER BY clauses.
7150: 20 54 68 65 6e 2c 20 69 66 20 74 68 69 73 20 6d   Then, if this m
7160: 61 6b 65 73 20 69 74 0a 20 20 20 20 2a 2a 20 72  akes it.    ** r
7170: 65 64 75 6e 64 61 6e 74 2c 20 72 65 6d 6f 76 65  edundant, remove
7180: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 66 72   the ORDER BY fr
7190: 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 53 45  om the parent SE
71a0: 4c 45 43 54 2e 20 20 2a 2f 0a 20 20 20 20 70 53  LECT.  */.    pS
71b0: 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ort = sqlite3Exp
71c0: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4d 57  rListDup(db, pMW
71d0: 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20  in->pPartition, 
71e0: 30 29 3b 0a 20 20 20 20 70 53 6f 72 74 20 3d 20  0);.    pSort = 
71f0: 65 78 70 72 4c 69 73 74 41 70 70 65 6e 64 4c 69  exprListAppendLi
7200: 73 74 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74  st(pParse, pSort
7210: 2c 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42  , pMWin->pOrderB
7220: 79 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70  y, 1);.    if( p
7230: 53 6f 72 74 20 26 26 20 70 2d 3e 70 4f 72 64 65  Sort && p->pOrde
7240: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28  rBy ){.      if(
7250: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
7260: 43 6f 6d 70 61 72 65 28 70 53 6f 72 74 2c 20 70  Compare(pSort, p
7270: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31 29 3d  ->pOrderBy, -1)=
7280: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
7290: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
72a0: 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  ete(db, p->pOrde
72b0: 72 42 79 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  rBy);.        p-
72c0: 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
72d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
72e0: 20 20 2f 2a 20 41 73 73 69 67 6e 20 61 20 63 75    /* Assign a cu
72f0: 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
7300: 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61  the ephemeral ta
7310: 62 6c 65 20 75 73 65 64 20 74 6f 20 62 75 66 66  ble used to buff
7320: 65 72 20 72 6f 77 73 2e 0a 20 20 20 20 2a 2a 20  er rows..    ** 
7330: 54 68 65 20 4f 70 65 6e 45 70 68 65 6d 65 72 61  The OpenEphemera
7340: 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73  l instruction is
7350: 20 63 6f 64 65 64 20 6c 61 74 65 72 2c 20 61 66   coded later, af
7360: 74 65 72 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20  ter it is known 
7370: 68 6f 77 0a 20 20 20 20 2a 2a 20 6d 61 6e 79 20  how.    ** many 
7380: 63 6f 6c 75 6d 6e 73 20 74 68 65 20 74 61 62 6c  columns the tabl
7390: 65 20 77 69 6c 6c 20 68 61 76 65 2e 20 20 2a 2f  e will have.  */
73a0: 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 69 45 70 68  .    pMWin->iEph
73b0: 43 73 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Csr = pParse->nT
73c0: 61 62 2b 2b 3b 0a 20 20 20 20 70 50 61 72 73 65  ab++;.    pParse
73d0: 2d 3e 6e 54 61 62 20 2b 3d 20 33 3b 0a 0a 20 20  ->nTab += 3;..  
73e0: 20 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65    selectWindowRe
73f0: 77 72 69 74 65 45 4c 69 73 74 28 70 50 61 72 73  writeEList(pPars
7400: 65 2c 20 70 4d 57 69 6e 2c 20 70 53 72 63 2c 20  e, pMWin, pSrc, 
7410: 70 2d 3e 70 45 4c 69 73 74 2c 20 70 54 61 62 2c  p->pEList, pTab,
7420: 20 26 70 53 75 62 6c 69 73 74 29 3b 0a 20 20 20   &pSublist);.   
7430: 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77   selectWindowRew
7440: 72 69 74 65 45 4c 69 73 74 28 70 50 61 72 73 65  riteEList(pParse
7450: 2c 20 70 4d 57 69 6e 2c 20 70 53 72 63 2c 20 70  , pMWin, pSrc, p
7460: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 54 61 62  ->pOrderBy, pTab
7470: 2c 20 26 70 53 75 62 6c 69 73 74 29 3b 0a 20 20  , &pSublist);.  
7480: 20 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72    pMWin->nBuffer
7490: 43 6f 6c 20 3d 20 28 70 53 75 62 6c 69 73 74 20  Col = (pSublist 
74a0: 3f 20 70 53 75 62 6c 69 73 74 2d 3e 6e 45 78 70  ? pSublist->nExp
74b0: 72 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20  r : 0);..    /* 
74c0: 41 70 70 65 6e 64 20 74 68 65 20 50 41 52 54 49  Append the PARTI
74d0: 54 49 4f 4e 20 42 59 20 61 6e 64 20 4f 52 44 45  TION BY and ORDE
74e0: 52 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 73  R BY expressions
74f0: 20 74 6f 20 74 68 65 20 74 6f 20 74 68 65 20 0a   to the to the .
7500: 20 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63      ** sub-selec
7510: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  t expression lis
7520: 74 2e 20 54 68 65 79 20 61 72 65 20 72 65 71 75  t. They are requ
7530: 69 72 65 64 20 74 6f 20 66 69 67 75 72 65 20 6f  ired to figure o
7540: 75 74 20 77 68 65 72 65 20 0a 20 20 20 20 2a 2a  ut where .    **
7550: 20 62 6f 75 6e 64 61 72 69 65 73 20 66 6f 72 20   boundaries for 
7560: 70 61 72 74 69 74 69 6f 6e 73 20 61 6e 64 20 73  partitions and s
7570: 65 74 73 20 6f 66 20 70 65 65 72 20 72 6f 77 73  ets of peer rows
7580: 20 6c 69 65 2e 20 20 2a 2f 0a 20 20 20 20 70 53   lie.  */.    pS
7590: 75 62 6c 69 73 74 20 3d 20 65 78 70 72 4c 69 73  ublist = exprLis
75a0: 74 41 70 70 65 6e 64 4c 69 73 74 28 70 50 61 72  tAppendList(pPar
75b0: 73 65 2c 20 70 53 75 62 6c 69 73 74 2c 20 70 4d  se, pSublist, pM
75c0: 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c  Win->pPartition,
75d0: 20 30 29 3b 0a 20 20 20 20 70 53 75 62 6c 69 73   0);.    pSublis
75e0: 74 20 3d 20 65 78 70 72 4c 69 73 74 41 70 70 65  t = exprListAppe
75f0: 6e 64 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  ndList(pParse, p
7600: 53 75 62 6c 69 73 74 2c 20 70 4d 57 69 6e 2d 3e  Sublist, pMWin->
7610: 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 0a 20  pOrderBy, 0);.. 
7620: 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65     /* Append the
7630: 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65   arguments passe
7640: 64 20 74 6f 20 65 61 63 68 20 77 69 6e 64 6f 77  d to each window
7650: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 74 68 65   function to the
7660: 0a 20 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65  .    ** sub-sele
7670: 63 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ct expression li
7680: 73 74 2e 20 41 6c 73 6f 20 61 6c 6c 6f 63 61 74  st. Also allocat
7690: 65 20 74 77 6f 20 72 65 67 69 73 74 65 72 73 20  e two registers 
76a0: 66 6f 72 20 65 61 63 68 0a 20 20 20 20 2a 2a 20  for each.    ** 
76b0: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
76c0: 2d 20 6f 6e 65 20 66 6f 72 20 74 68 65 20 61 63  - one for the ac
76d0: 63 75 6d 75 6c 61 74 6f 72 2c 20 61 6e 6f 74 68  cumulator, anoth
76e0: 65 72 20 66 6f 72 20 69 6e 74 65 72 69 6d 0a 20  er for interim. 
76f0: 20 20 20 2a 2a 20 72 65 73 75 6c 74 73 2e 20 20     ** results.  
7700: 2a 2f 0a 20 20 20 20 66 6f 72 28 70 57 69 6e 3d  */.    for(pWin=
7710: 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69  pMWin; pWin; pWi
7720: 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e  n=pWin->pNextWin
7730: 29 7b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 69  ){.      pWin->i
7740: 41 72 67 43 6f 6c 20 3d 20 28 70 53 75 62 6c 69  ArgCol = (pSubli
7750: 73 74 20 3f 20 70 53 75 62 6c 69 73 74 2d 3e 6e  st ? pSublist->n
7760: 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 20  Expr : 0);.     
7770: 20 70 53 75 62 6c 69 73 74 20 3d 20 65 78 70 72   pSublist = expr
7780: 4c 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28 70  ListAppendList(p
7790: 50 61 72 73 65 2c 20 70 53 75 62 6c 69 73 74 2c  Parse, pSublist,
77a0: 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78   pWin->pOwner->x
77b0: 2e 70 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20  .pList, 0);.    
77c0: 20 20 69 66 28 20 70 57 69 6e 2d 3e 70 46 69 6c    if( pWin->pFil
77d0: 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 45  ter ){.        E
77e0: 78 70 72 20 2a 70 46 69 6c 74 65 72 20 3d 20 73  xpr *pFilter = s
77f0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
7800: 2c 20 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72 2c  , pWin->pFilter,
7810: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 53 75   0);.        pSu
7820: 62 6c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  blist = sqlite3E
7830: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
7840: 61 72 73 65 2c 20 70 53 75 62 6c 69 73 74 2c 20  arse, pSublist, 
7850: 70 46 69 6c 74 65 72 29 3b 0a 20 20 20 20 20 20  pFilter);.      
7860: 7d 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 72 65  }.      pWin->re
7870: 67 41 63 63 75 6d 20 3d 20 2b 2b 70 50 61 72 73  gAccum = ++pPars
7880: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70  e->nMem;.      p
7890: 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 20 3d  Win->regResult =
78a0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
78b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
78c0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
78d0: 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65  ull, 0, pWin->re
78e0: 67 41 63 63 75 6d 29 3b 0a 20 20 20 20 7d 0a 0a  gAccum);.    }..
78f0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
7900: 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f  is no ORDER BY o
7910: 72 20 50 41 52 54 49 54 49 4f 4e 20 42 59 20 63  r PARTITION BY c
7920: 6c 61 75 73 65 2c 20 61 6e 64 20 74 68 65 20 77  lause, and the w
7930: 69 6e 64 6f 77 0a 20 20 20 20 2a 2a 20 66 75 6e  indow.    ** fun
7940: 63 74 69 6f 6e 20 61 63 63 65 70 74 73 20 7a 65  ction accepts ze
7950: 72 6f 20 61 72 67 75 6d 65 6e 74 73 2c 20 61 6e  ro arguments, an
7960: 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f  d there are no o
7970: 74 68 65 72 20 63 6f 6c 75 6d 6e 73 0a 20 20 20  ther columns.   
7980: 20 2a 2a 20 73 65 6c 65 63 74 65 64 20 28 65 2e   ** selected (e.
7990: 67 2e 20 22 53 45 4c 45 43 54 20 72 6f 77 5f 6e  g. "SELECT row_n
79a0: 75 6d 62 65 72 28 29 20 4f 56 45 52 20 28 29 20  umber() OVER () 
79b0: 46 52 4f 4d 20 74 31 22 29 2c 20 69 74 20 69 73  FROM t1"), it is
79c0: 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 2a 2a   possible.    **
79d0: 20 74 68 61 74 20 70 53 75 62 6c 69 73 74 20 69   that pSublist i
79e0: 73 20 73 74 69 6c 6c 20 4e 55 4c 4c 20 68 65 72  s still NULL her
79f0: 65 2e 20 41 64 64 20 61 20 63 6f 6e 73 74 61 6e  e. Add a constan
7a00: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 68 65 72  t expression her
7a10: 65 20 74 6f 20 0a 20 20 20 20 2a 2a 20 6b 65 65  e to .    ** kee
7a20: 70 20 65 76 65 72 79 74 68 69 6e 67 20 6c 65 67  p everything leg
7a30: 61 6c 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  al in this case.
7a40: 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28   .    */.    if(
7a50: 20 70 53 75 62 6c 69 73 74 3d 3d 30 20 29 7b 0a   pSublist==0 ){.
7a60: 20 20 20 20 20 20 70 53 75 62 6c 69 73 74 20 3d        pSublist =
7a70: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
7a80: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
7a90: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  , .          sql
7aa0: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62  ite3ExprAlloc(db
7ab0: 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73  , TK_INTEGER, &s
7ac0: 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b  qlite3IntTokens[
7ad0: 30 5d 2c 20 30 29 0a 20 20 20 20 20 20 29 3b 0a  0], 0).      );.
7ae0: 20 20 20 20 7d 0a 0a 20 20 20 20 70 53 75 62 20      }..    pSub 
7af0: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e  = sqlite3SelectN
7b00: 65 77 28 0a 20 20 20 20 20 20 20 20 70 50 61 72  ew(.        pPar
7b10: 73 65 2c 20 70 53 75 62 6c 69 73 74 2c 20 70 53  se, pSublist, pS
7b20: 72 63 2c 20 70 57 68 65 72 65 2c 20 70 47 72 6f  rc, pWhere, pGro
7b30: 75 70 42 79 2c 20 70 48 61 76 69 6e 67 2c 20 70  upBy, pHaving, p
7b40: 53 6f 72 74 2c 20 30 2c 20 30 0a 20 20 20 20 29  Sort, 0, 0.    )
7b50: 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20  ;.    p->pSrc = 
7b60: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
7b70: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20  pend(pParse, 0, 
7b80: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
7b90: 2d 3e 70 53 72 63 20 29 7b 0a 20 20 20 20 20 20  ->pSrc ){.      
7ba0: 54 61 62 6c 65 20 2a 70 54 61 62 32 3b 0a 20 20  Table *pTab2;.  
7bb0: 20 20 20 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30      p->pSrc->a[0
7bc0: 5d 2e 70 53 65 6c 65 63 74 20 3d 20 70 53 75 62  ].pSelect = pSub
7bd0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
7be0: 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
7bf0: 6f 72 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ors(pParse, p->p
7c00: 53 72 63 29 3b 0a 20 20 20 20 20 20 70 53 75 62  Src);.      pSub
7c10: 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
7c20: 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20 20 20 20  _Expanded;.     
7c30: 20 70 54 61 62 32 20 3d 20 73 71 6c 69 74 65 33   pTab2 = sqlite3
7c40: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
7c50: 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 29 3b  t(pParse, pSub);
7c60: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 32  .      if( pTab2
7c70: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
7c80: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
7c90: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7ca0: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54         memcpy(pT
7cb0: 61 62 2c 20 70 54 61 62 32 2c 20 73 69 7a 65 6f  ab, pTab2, sizeo
7cc0: 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20  f(Table));.     
7cd0: 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67     pTab->tabFlag
7ce0: 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61  s |= TF_Ephemera
7cf0: 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 53  l;.        p->pS
7d00: 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 20 3d 20  rc->a[0].pTab = 
7d10: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 70 54  pTab;.        pT
7d20: 61 62 20 3d 20 70 54 61 62 32 3b 0a 20 20 20 20  ab = pTab2;.    
7d30: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
7d40: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7d50: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
7d60: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c   pMWin->iEphCsr,
7d70: 20 70 53 75 62 6c 69 73 74 2d 3e 6e 45 78 70 72   pSublist->nExpr
7d80: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
7d90: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7da0: 5f 4f 70 65 6e 44 75 70 2c 20 70 4d 57 69 6e 2d  _OpenDup, pMWin-
7db0: 3e 69 45 70 68 43 73 72 2b 31 2c 20 70 4d 57 69  >iEphCsr+1, pMWi
7dc0: 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 20  n->iEphCsr);.   
7dd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7de0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44  dOp2(v, OP_OpenD
7df0: 75 70 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43  up, pMWin->iEphC
7e00: 73 72 2b 32 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  sr+2, pMWin->iEp
7e10: 68 43 73 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  hCsr);.      sql
7e20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
7e30: 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70 4d  , OP_OpenDup, pM
7e40: 57 69 6e 2d 3e 69 45 70 68 43 73 72 2b 33 2c 20  Win->iEphCsr+3, 
7e50: 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b  pMWin->iEphCsr);
7e60: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7e70: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
7e80: 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 29 3b  elete(db, pSub);
7e90: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
7ea0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7eb0: 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ) rc = SQLITE_NO
7ec0: 4d 45 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  MEM;.    sqlite3
7ed0: 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 29  DbFree(db, pTab)
7ee0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
7ef0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  rc;.}../*.** Fre
7f00: 65 20 74 68 65 20 57 69 6e 64 6f 77 20 6f 62 6a  e the Window obj
7f10: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
7f20: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
7f30: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
7f40: 65 33 57 69 6e 64 6f 77 44 65 6c 65 74 65 28 73  e3WindowDelete(s
7f50: 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 6e 64  qlite3 *db, Wind
7f60: 6f 77 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  ow *p){.  if( p 
7f70: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
7f80: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
7f90: 70 46 69 6c 74 65 72 29 3b 0a 20 20 20 20 73 71  pFilter);.    sq
7fa0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
7fb0: 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 61 72 74  ete(db, p->pPart
7fc0: 69 74 69 6f 6e 29 3b 0a 20 20 20 20 73 71 6c 69  ition);.    sqli
7fd0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
7fe0: 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
7ff0: 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  y);.    sqlite3E
8000: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
8010: 3e 70 45 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69  >pEnd);.    sqli
8020: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
8030: 2c 20 70 2d 3e 70 53 74 61 72 74 29 3b 0a 20 20  , p->pStart);.  
8040: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
8050: 64 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  db, p->zName);. 
8060: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
8070: 28 64 62 2c 20 70 2d 3e 7a 42 61 73 65 29 3b 0a  (db, p->zBase);.
8080: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
8090: 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a  e(db, p);.  }.}.
80a0: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
80b0: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 57  linked list of W
80c0: 69 6e 64 6f 77 20 6f 62 6a 65 63 74 73 20 73 74  indow objects st
80d0: 61 72 74 69 6e 67 20 61 74 20 74 68 65 20 73 65  arting at the se
80e0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
80f0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69  /.void sqlite3Wi
8100: 6e 64 6f 77 4c 69 73 74 44 65 6c 65 74 65 28 73  ndowListDelete(s
8110: 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 6e 64  qlite3 *db, Wind
8120: 6f 77 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28  ow *p){.  while(
8130: 20 70 20 29 7b 0a 20 20 20 20 57 69 6e 64 6f 77   p ){.    Window
8140: 20 2a 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65   *pNext = p->pNe
8150: 78 74 57 69 6e 3b 0a 20 20 20 20 73 71 6c 69 74  xtWin;.    sqlit
8160: 65 33 57 69 6e 64 6f 77 44 65 6c 65 74 65 28 64  e3WindowDelete(d
8170: 62 2c 20 70 29 3b 0a 20 20 20 20 70 20 3d 20 70  b, p);.    p = p
8180: 4e 65 78 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Next;.  }.}../*.
8190: 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  ** The argument 
81a0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e  expression is an
81b0: 20 50 52 45 43 45 44 49 4e 47 20 6f 72 20 46 4f   PRECEDING or FO
81c0: 4c 4c 4f 57 49 4e 47 20 6f 66 66 73 65 74 2e 20  LLOWING offset. 
81d0: 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 73 68   The.** value sh
81e0: 6f 75 6c 64 20 62 65 20 61 20 6e 6f 6e 2d 6e 65  ould be a non-ne
81f0: 67 61 74 69 76 65 20 69 6e 74 65 67 65 72 2e 20  gative integer. 
8200: 20 49 66 20 74 68 65 20 76 61 6c 75 65 20 69 73   If the value is
8210: 20 6e 6f 74 20 61 0a 2a 2a 20 63 6f 6e 73 74 61   not a.** consta
8220: 6e 74 2c 20 63 68 61 6e 67 65 20 69 74 20 74 6f  nt, change it to
8230: 20 4e 55 4c 4c 2e 20 20 54 68 65 20 66 61 63 74   NULL.  The fact
8240: 20 74 68 61 74 20 69 74 20 69 73 20 74 68 65 6e   that it is then
8250: 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 0a   a non-negative.
8260: 2a 2a 20 69 6e 74 65 67 65 72 20 77 69 6c 6c 20  ** integer will 
8270: 62 65 20 63 61 75 67 68 74 20 6c 61 74 65 72 2e  be caught later.
8280: 20 20 42 75 74 20 69 74 20 69 73 20 69 6d 70 6f    But it is impo
8290: 72 74 61 6e 74 20 6e 6f 74 20 74 6f 20 6c 65 61  rtant not to lea
82a0: 76 65 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 76  ve.** variable v
82b0: 61 6c 75 65 73 20 69 6e 20 74 68 65 20 65 78 70  alues in the exp
82c0: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f  ression tree..*/
82d0: 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a 73 71  .static Expr *sq
82e0: 6c 69 74 65 33 57 69 6e 64 6f 77 4f 66 66 73 65  lite3WindowOffse
82f0: 74 45 78 70 72 28 50 61 72 73 65 20 2a 70 50 61  tExpr(Parse *pPa
8300: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
8310: 29 7b 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69  ){.  if( 0==sqli
8320: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
8330: 74 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  t(pExpr) ){.    
8340: 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42  if( IN_RENAME_OB
8350: 4a 45 43 54 20 29 20 73 71 6c 69 74 65 33 52 65  JECT ) sqlite3Re
8360: 6e 61 6d 65 45 78 70 72 55 6e 6d 61 70 28 70 50  nameExprUnmap(pP
8370: 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
8380: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
8390: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
83a0: 70 45 78 70 72 29 3b 0a 20 20 20 20 70 45 78 70  pExpr);.    pExp
83b0: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  r = sqlite3ExprA
83c0: 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  lloc(pParse->db,
83d0: 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 29 3b   TK_NULL, 0, 0);
83e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45  .  }.  return pE
83f0: 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  xpr;.}../*.** Al
8400: 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72  locate and retur
8410: 6e 20 61 20 6e 65 77 20 57 69 6e 64 6f 77 20 6f  n a new Window o
8420: 62 6a 65 63 74 20 64 65 73 63 72 69 62 69 6e 67  bject describing
8430: 20 61 20 57 69 6e 64 6f 77 20 44 65 66 69 6e 69   a Window Defini
8440: 74 69 6f 6e 2e 0a 2a 2f 0a 57 69 6e 64 6f 77 20  tion..*/.Window 
8450: 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 41 6c  *sqlite3WindowAl
8460: 6c 6f 63 28 0a 20 20 50 61 72 73 65 20 2a 70 50  loc(.  Parse *pP
8470: 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
8480: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
8490: 20 69 6e 74 20 65 54 79 70 65 2c 20 20 20 20 20   int eType,     
84a0: 20 20 20 2f 2a 20 46 72 61 6d 65 20 74 79 70 65     /* Frame type
84b0: 2e 20 54 4b 5f 52 41 4e 47 45 2c 20 54 4b 5f 52  . TK_RANGE, TK_R
84c0: 4f 57 53 2c 20 54 4b 5f 47 52 4f 55 50 53 2c 20  OWS, TK_GROUPS, 
84d0: 6f 72 20 30 20 2a 2f 0a 20 20 69 6e 74 20 65 53  or 0 */.  int eS
84e0: 74 61 72 74 2c 20 20 20 20 20 20 20 2f 2a 20 53  tart,       /* S
84f0: 74 61 72 74 20 74 79 70 65 3a 20 43 55 52 52 45  tart type: CURRE
8500: 4e 54 2c 20 50 52 45 43 45 44 49 4e 47 2c 20 46  NT, PRECEDING, F
8510: 4f 4c 4c 4f 57 49 4e 47 2c 20 55 4e 42 4f 55 4e  OLLOWING, UNBOUN
8520: 44 45 44 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  DED */.  Expr *p
8530: 53 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 53 74  Start,     /* St
8540: 61 72 74 20 77 69 6e 64 6f 77 20 73 69 7a 65 20  art window size 
8550: 69 66 20 54 4b 5f 50 52 45 43 45 44 49 4e 47 20  if TK_PRECEDING 
8560: 6f 72 20 46 4f 4c 4c 4f 57 49 4e 47 20 2a 2f 0a  or FOLLOWING */.
8570: 20 20 69 6e 74 20 65 45 6e 64 2c 20 20 20 20 20    int eEnd,     
8580: 20 20 20 20 2f 2a 20 45 6e 64 20 74 79 70 65 3a      /* End type:
8590: 20 43 55 52 52 45 4e 54 2c 20 46 4f 4c 4c 4f 57   CURRENT, FOLLOW
85a0: 49 4e 47 2c 20 54 4b 5f 55 4e 42 4f 55 4e 44 45  ING, TK_UNBOUNDE
85b0: 44 2c 20 50 52 45 43 45 44 49 4e 47 20 2a 2f 0a  D, PRECEDING */.
85c0: 20 20 45 78 70 72 20 2a 70 45 6e 64 2c 20 20 20    Expr *pEnd,   
85d0: 20 20 20 20 2f 2a 20 45 6e 64 20 77 69 6e 64 6f      /* End windo
85e0: 77 20 73 69 7a 65 20 69 66 20 54 4b 5f 46 4f 4c  w size if TK_FOL
85f0: 4c 4f 57 49 4e 47 20 6f 72 20 50 52 45 43 45 44  LOWING or PRECED
8600: 49 4e 47 20 2a 2f 0a 20 20 75 38 20 65 45 78 63  ING */.  u8 eExc
8610: 6c 75 64 65 20 20 20 20 20 20 20 2f 2a 20 45 58  lude       /* EX
8620: 43 4c 55 44 45 20 63 6c 61 75 73 65 20 2a 2f 0a  CLUDE clause */.
8630: 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69  ){.  Window *pWi
8640: 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 62 49 6d  n = 0;.  int bIm
8650: 70 6c 69 63 69 74 46 72 61 6d 65 20 3d 20 30 3b  plicitFrame = 0;
8660: 0a 0a 20 20 2f 2a 20 50 61 72 73 65 72 20 61 73  ..  /* Parser as
8670: 73 75 72 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77  sures the follow
8680: 69 6e 67 3a 20 2a 2f 0a 20 20 61 73 73 65 72 74  ing: */.  assert
8690: 28 20 65 54 79 70 65 3d 3d 30 20 7c 7c 20 65 54  ( eType==0 || eT
86a0: 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 7c 7c  ype==TK_RANGE ||
86b0: 20 65 54 79 70 65 3d 3d 54 4b 5f 52 4f 57 53 20   eType==TK_ROWS 
86c0: 7c 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 47 52 4f  || eType==TK_GRO
86d0: 55 50 53 20 29 3b 0a 20 20 61 73 73 65 72 74 28  UPS );.  assert(
86e0: 20 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52   eStart==TK_CURR
86f0: 45 4e 54 20 7c 7c 20 65 53 74 61 72 74 3d 3d 54  ENT || eStart==T
8700: 4b 5f 50 52 45 43 45 44 49 4e 47 0a 20 20 20 20  K_PRECEDING.    
8710: 20 20 20 20 20 20 20 7c 7c 20 65 53 74 61 72 74         || eStart
8720: 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 7c  ==TK_UNBOUNDED |
8730: 7c 20 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c  | eStart==TK_FOL
8740: 4c 4f 57 49 4e 47 20 29 3b 0a 20 20 61 73 73 65  LOWING );.  asse
8750: 72 74 28 20 65 45 6e 64 3d 3d 54 4b 5f 43 55 52  rt( eEnd==TK_CUR
8760: 52 45 4e 54 20 7c 7c 20 65 45 6e 64 3d 3d 54 4b  RENT || eEnd==TK
8770: 5f 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20 20 20 20  _FOLLOWING.     
8780: 20 20 20 20 20 20 7c 7c 20 65 45 6e 64 3d 3d 54        || eEnd==T
8790: 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 7c 7c 20 65  K_UNBOUNDED || e
87a0: 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e  End==TK_PRECEDIN
87b0: 47 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  G );.  assert( (
87c0: 65 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45  eStart==TK_PRECE
87d0: 44 49 4e 47 20 7c 7c 20 65 53 74 61 72 74 3d 3d  DING || eStart==
87e0: 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 29 3d 3d 28  TK_FOLLOWING)==(
87f0: 70 53 74 61 72 74 21 3d 30 29 20 29 3b 0a 20 20  pStart!=0) );.  
8800: 61 73 73 65 72 74 28 20 28 65 45 6e 64 3d 3d 54  assert( (eEnd==T
8810: 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 7c 7c 20 65  K_FOLLOWING || e
8820: 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e  End==TK_PRECEDIN
8830: 47 29 3d 3d 28 70 45 6e 64 21 3d 30 29 20 29 3b  G)==(pEnd!=0) );
8840: 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30  ..  if( eType==0
8850: 20 29 7b 0a 20 20 20 20 62 49 6d 70 6c 69 63 69   ){.    bImplici
8860: 74 46 72 61 6d 65 20 3d 20 31 3b 0a 20 20 20 20  tFrame = 1;.    
8870: 65 54 79 70 65 20 3d 20 54 4b 5f 52 41 4e 47 45  eType = TK_RANGE
8880: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 69  ;.  }..  /* Addi
8890: 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 0a 20 20  tionally, the.  
88a0: 2a 2a 20 73 74 61 72 74 69 6e 67 20 62 6f 75 6e  ** starting boun
88b0: 64 61 72 79 20 74 79 70 65 20 6d 61 79 20 6e 6f  dary type may no
88c0: 74 20 6f 63 63 75 72 20 65 61 72 6c 69 65 72 20  t occur earlier 
88d0: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
88e0: 20 6c 69 73 74 20 74 68 61 6e 0a 20 20 2a 2a 20   list than.  ** 
88f0: 74 68 65 20 65 6e 64 69 6e 67 20 62 6f 75 6e 64  the ending bound
8900: 61 72 79 20 74 79 70 65 3a 0a 20 20 2a 2a 0a 20  ary type:.  **. 
8910: 20 2a 2a 20 20 20 55 4e 42 4f 55 4e 44 45 44 20   **   UNBOUNDED 
8920: 50 52 45 43 45 44 49 4e 47 0a 20 20 2a 2a 20 20  PRECEDING.  **  
8930: 20 3c 65 78 70 72 3e 20 50 52 45 43 45 44 49 4e   <expr> PRECEDIN
8940: 47 0a 20 20 2a 2a 20 20 20 43 55 52 52 45 4e 54  G.  **   CURRENT
8950: 20 52 4f 57 0a 20 20 2a 2a 20 20 20 3c 65 78 70   ROW.  **   <exp
8960: 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20 2a  r> FOLLOWING.  *
8970: 2a 20 20 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f  *   UNBOUNDED FO
8980: 4c 4c 4f 57 49 4e 47 0a 20 20 2a 2a 0a 20 20 2a  LLOWING.  **.  *
8990: 2a 20 54 68 65 20 70 61 72 73 65 72 20 65 6e 73  * The parser ens
89a0: 75 72 65 73 20 74 68 61 74 20 22 55 4e 42 4f 55  ures that "UNBOU
89b0: 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 22 20  NDED PRECEDING" 
89c0: 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 61  cannot be used a
89d0: 73 20 61 6e 20 65 6e 64 69 6e 67 0a 20 20 2a 2a  s an ending.  **
89e0: 20 62 6f 75 6e 64 61 72 79 2c 20 61 6e 64 20 74   boundary, and t
89f0: 68 61 6e 20 22 55 4e 42 4f 55 4e 44 45 44 20 46  han "UNBOUNDED F
8a00: 4f 4c 4c 4f 57 49 4e 47 22 20 63 61 6e 6e 6f 74  OLLOWING" cannot
8a10: 20 62 65 20 75 73 65 64 20 61 73 20 61 20 73 74   be used as a st
8a20: 61 72 74 69 6e 67 0a 20 20 2a 2a 20 66 72 61 6d  arting.  ** fram
8a30: 65 20 62 6f 75 6e 64 61 72 79 2e 0a 20 20 2a 2f  e boundary..  */
8a40: 0a 20 20 69 66 28 20 28 65 53 74 61 72 74 3d 3d  .  if( (eStart==
8a50: 54 4b 5f 43 55 52 52 45 4e 54 20 26 26 20 65 45  TK_CURRENT && eE
8a60: 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47  nd==TK_PRECEDING
8a70: 29 0a 20 20 20 7c 7c 20 28 65 53 74 61 72 74 3d  ).   || (eStart=
8a80: 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 26 26  =TK_FOLLOWING &&
8a90: 20 28 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45   (eEnd==TK_PRECE
8aa0: 44 49 4e 47 20 7c 7c 20 65 45 6e 64 3d 3d 54 4b  DING || eEnd==TK
8ab0: 5f 43 55 52 52 45 4e 54 29 29 0a 20 20 29 7b 0a  _CURRENT)).  ){.
8ac0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8ad0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 73  Msg(pParse, "uns
8ae0: 75 70 70 6f 72 74 65 64 20 66 72 61 6d 65 20 73  upported frame s
8af0: 70 65 63 69 66 69 63 61 74 69 6f 6e 22 29 3b 0a  pecification");.
8b00: 20 20 20 20 67 6f 74 6f 20 77 69 6e 64 6f 77 41      goto windowA
8b10: 6c 6c 6f 63 45 72 72 3b 0a 20 20 7d 0a 0a 20 20  llocErr;.  }..  
8b20: 70 57 69 6e 20 3d 20 28 57 69 6e 64 6f 77 2a 29  pWin = (Window*)
8b30: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
8b40: 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ero(pParse->db, 
8b50: 73 69 7a 65 6f 66 28 57 69 6e 64 6f 77 29 29 3b  sizeof(Window));
8b60: 0a 20 20 69 66 28 20 70 57 69 6e 3d 3d 30 20 29  .  if( pWin==0 )
8b70: 20 67 6f 74 6f 20 77 69 6e 64 6f 77 41 6c 6c 6f   goto windowAllo
8b80: 63 45 72 72 3b 0a 20 20 70 57 69 6e 2d 3e 65 46  cErr;.  pWin->eF
8b90: 72 6d 54 79 70 65 20 3d 20 65 54 79 70 65 3b 0a  rmType = eType;.
8ba0: 20 20 70 57 69 6e 2d 3e 65 53 74 61 72 74 20 3d    pWin->eStart =
8bb0: 20 65 53 74 61 72 74 3b 0a 20 20 70 57 69 6e 2d   eStart;.  pWin-
8bc0: 3e 65 45 6e 64 20 3d 20 65 45 6e 64 3b 0a 20 20  >eEnd = eEnd;.  
8bd0: 69 66 28 20 65 45 78 63 6c 75 64 65 3d 3d 30 20  if( eExclude==0 
8be0: 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44  && OptimizationD
8bf0: 69 73 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e  isabled(pParse->
8c00: 64 62 2c 20 53 51 4c 49 54 45 5f 57 69 6e 64 6f  db, SQLITE_Windo
8c10: 77 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 65 45  wFunc) ){.    eE
8c20: 78 63 6c 75 64 65 20 3d 20 54 4b 5f 4e 4f 3b 0a  xclude = TK_NO;.
8c30: 20 20 7d 0a 20 20 70 57 69 6e 2d 3e 65 45 78 63    }.  pWin->eExc
8c40: 6c 75 64 65 20 3d 20 65 45 78 63 6c 75 64 65 3b  lude = eExclude;
8c50: 0a 20 20 70 57 69 6e 2d 3e 62 49 6d 70 6c 69 63  .  pWin->bImplic
8c60: 69 74 46 72 61 6d 65 20 3d 20 62 49 6d 70 6c 69  itFrame = bImpli
8c70: 63 69 74 46 72 61 6d 65 3b 0a 20 20 70 57 69 6e  citFrame;.  pWin
8c80: 2d 3e 70 45 6e 64 20 3d 20 73 71 6c 69 74 65 33  ->pEnd = sqlite3
8c90: 57 69 6e 64 6f 77 4f 66 66 73 65 74 45 78 70 72  WindowOffsetExpr
8ca0: 28 70 50 61 72 73 65 2c 20 70 45 6e 64 29 3b 0a  (pParse, pEnd);.
8cb0: 20 20 70 57 69 6e 2d 3e 70 53 74 61 72 74 20 3d    pWin->pStart =
8cc0: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4f 66   sqlite3WindowOf
8cd0: 66 73 65 74 45 78 70 72 28 70 50 61 72 73 65 2c  fsetExpr(pParse,
8ce0: 20 70 53 74 61 72 74 29 3b 0a 20 20 72 65 74 75   pStart);.  retu
8cf0: 72 6e 20 70 57 69 6e 3b 0a 0a 77 69 6e 64 6f 77  rn pWin;..window
8d00: 41 6c 6c 6f 63 45 72 72 3a 0a 20 20 73 71 6c 69  AllocErr:.  sqli
8d10: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50  te3ExprDelete(pP
8d20: 61 72 73 65 2d 3e 64 62 2c 20 70 45 6e 64 29 3b  arse->db, pEnd);
8d30: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
8d40: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
8d50: 20 70 53 74 61 72 74 29 3b 0a 20 20 72 65 74 75   pStart);.  retu
8d60: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn 0;.}../*.** A
8d70: 74 74 61 63 68 20 50 41 52 54 49 54 49 4f 4e 20  ttach PARTITION 
8d80: 61 6e 64 20 4f 52 44 45 52 20 42 59 20 63 6c 61  and ORDER BY cla
8d90: 75 73 65 73 20 70 50 61 72 74 69 74 69 6f 6e 20  uses pPartition 
8da0: 61 6e 64 20 70 4f 72 64 65 72 42 79 20 74 6f 20  and pOrderBy to 
8db0: 77 69 6e 64 6f 77 0a 2a 2a 20 70 57 69 6e 2e 20  window.** pWin. 
8dc0: 41 6c 73 6f 2c 20 69 66 20 70 61 72 61 6d 65 74  Also, if paramet
8dd0: 65 72 20 70 42 61 73 65 20 69 73 20 6e 6f 74 20  er pBase is not 
8de0: 4e 55 4c 4c 2c 20 73 65 74 20 70 57 69 6e 2d 3e  NULL, set pWin->
8df0: 7a 42 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20  zBase to the.** 
8e00: 65 71 75 69 76 61 6c 65 6e 74 20 6e 75 6c 2d 74  equivalent nul-t
8e10: 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
8e20: 2e 0a 2a 2f 0a 57 69 6e 64 6f 77 20 2a 73 71 6c  ..*/.Window *sql
8e30: 69 74 65 33 57 69 6e 64 6f 77 41 73 73 65 6d 62  ite3WindowAssemb
8e40: 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  le(.  Parse *pPa
8e50: 72 73 65 2c 20 0a 20 20 57 69 6e 64 6f 77 20 2a  rse, .  Window *
8e60: 70 57 69 6e 2c 20 0a 20 20 45 78 70 72 4c 69 73  pWin, .  ExprLis
8e70: 74 20 2a 70 50 61 72 74 69 74 69 6f 6e 2c 20 0a  t *pPartition, .
8e80: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
8e90: 65 72 42 79 2c 20 0a 20 20 54 6f 6b 65 6e 20 2a  erBy, .  Token *
8ea0: 70 42 61 73 65 0a 29 7b 0a 20 20 69 66 28 20 70  pBase.){.  if( p
8eb0: 57 69 6e 20 29 7b 0a 20 20 20 20 70 57 69 6e 2d  Win ){.    pWin-
8ec0: 3e 70 50 61 72 74 69 74 69 6f 6e 20 3d 20 70 50  >pPartition = pP
8ed0: 61 72 74 69 74 69 6f 6e 3b 0a 20 20 20 20 70 57  artition;.    pW
8ee0: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70  in->pOrderBy = p
8ef0: 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 69 66 28  OrderBy;.    if(
8f00: 20 70 42 61 73 65 20 29 7b 0a 20 20 20 20 20 20   pBase ){.      
8f10: 70 57 69 6e 2d 3e 7a 42 61 73 65 20 3d 20 73 71  pWin->zBase = sq
8f20: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70  lite3DbStrNDup(p
8f30: 50 61 72 73 65 2d 3e 64 62 2c 20 70 42 61 73 65  Parse->db, pBase
8f40: 2d 3e 7a 2c 20 70 42 61 73 65 2d 3e 6e 29 3b 0a  ->z, pBase->n);.
8f50: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
8f60: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
8f70: 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  stDelete(pParse-
8f80: 3e 64 62 2c 20 70 50 61 72 74 69 74 69 6f 6e 29  >db, pPartition)
8f90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
8fa0: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72  rListDelete(pPar
8fb0: 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42 79  se->db, pOrderBy
8fc0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
8fd0: 70 57 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  pWin;.}../*.** W
8fe0: 69 6e 64 6f 77 20 2a 70 57 69 6e 20 68 61 73 20  indow *pWin has 
8ff0: 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61 74 65  just been create
9000: 64 20 66 72 6f 6d 20 61 20 57 49 4e 44 4f 57 20  d from a WINDOW 
9010: 63 6c 61 75 73 65 2e 20 54 6f 6b 6e 65 20 70 42  clause. Tokne pB
9020: 61 73 65 0a 2a 2a 20 69 73 20 74 68 65 20 62 61  ase.** is the ba
9030: 73 65 20 77 69 6e 64 6f 77 2e 20 45 61 72 6c 69  se window. Earli
9040: 65 72 20 77 69 6e 64 6f 77 73 20 66 72 6f 6d 20  er windows from 
9050: 74 68 65 20 73 61 6d 65 20 57 49 4e 44 4f 57 20  the same WINDOW 
9060: 63 6c 61 75 73 65 20 61 72 65 0a 2a 2a 20 73 74  clause are.** st
9070: 6f 72 65 64 20 69 6e 20 74 68 65 20 6c 69 6e 6b  ored in the link
9080: 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67  ed list starting
9090: 20 61 74 20 70 57 69 6e 2d 3e 70 4e 65 78 74 57   at pWin->pNextW
90a0: 69 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  in. This functio
90b0: 6e 0a 2a 2a 20 65 69 74 68 65 72 20 75 70 64 61  n.** either upda
90c0: 74 65 73 20 2a 70 57 69 6e 20 61 63 63 6f 72 64  tes *pWin accord
90d0: 69 6e 67 20 74 6f 20 74 68 65 20 62 61 73 65 20  ing to the base 
90e0: 73 70 65 63 69 66 69 63 61 74 69 6f 6e 2c 20 6f  specification, o
90f0: 72 20 65 6c 73 65 0a 2a 2a 20 6c 65 61 76 65 73  r else.** leaves
9100: 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61   an error in pPa
9110: 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  rse..*/.void sql
9120: 69 74 65 33 57 69 6e 64 6f 77 43 68 61 69 6e 28  ite3WindowChain(
9130: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 57  Parse *pParse, W
9140: 69 6e 64 6f 77 20 2a 70 57 69 6e 2c 20 57 69 6e  indow *pWin, Win
9150: 64 6f 77 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  dow *pList){.  i
9160: 66 28 20 70 57 69 6e 2d 3e 7a 42 61 73 65 20 29  f( pWin->zBase )
9170: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
9180: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
9190: 20 20 20 20 57 69 6e 64 6f 77 20 2a 70 45 78 69      Window *pExi
91a0: 73 74 20 3d 20 77 69 6e 64 6f 77 46 69 6e 64 28  st = windowFind(
91b0: 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70  pParse, pList, p
91c0: 57 69 6e 2d 3e 7a 42 61 73 65 29 3b 0a 20 20 20  Win->zBase);.   
91d0: 20 69 66 28 20 70 45 78 69 73 74 20 29 7b 0a 20   if( pExist ){. 
91e0: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
91f0: 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 20  *zErr = 0;.     
9200: 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65 72   /* Check for er
9210: 72 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 69 66  rors */.      if
9220: 28 20 70 57 69 6e 2d 3e 70 50 61 72 74 69 74 69  ( pWin->pPartiti
9230: 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 45  on ){.        zE
9240: 72 72 20 3d 20 22 50 41 52 54 49 54 49 4f 4e 20  rr = "PARTITION 
9250: 63 6c 61 75 73 65 22 3b 0a 20 20 20 20 20 20 7d  clause";.      }
9260: 65 6c 73 65 20 69 66 28 20 70 45 78 69 73 74 2d  else if( pExist-
9270: 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70 57 69  >pOrderBy && pWi
9280: 6e 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  n->pOrderBy ){. 
9290: 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 22 4f         zErr = "O
92a0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 22 3b  RDER BY clause";
92b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
92c0: 20 70 45 78 69 73 74 2d 3e 62 49 6d 70 6c 69 63   pExist->bImplic
92d0: 69 74 46 72 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  itFrame==0 ){.  
92e0: 20 20 20 20 20 20 7a 45 72 72 20 3d 20 22 66 72        zErr = "fr
92f0: 61 6d 65 20 73 70 65 63 69 66 69 63 61 74 69 6f  ame specificatio
9300: 6e 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n";.      }.    
9310: 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20    if( zErr ){.  
9320: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
9330: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
9340: 20 20 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e             "cann
9350: 6f 74 20 6f 76 65 72 72 69 64 65 20 25 73 20 6f  ot override %s o
9360: 66 20 77 69 6e 64 6f 77 3a 20 25 73 22 2c 20 7a  f window: %s", z
9370: 45 72 72 2c 20 70 57 69 6e 2d 3e 7a 42 61 73 65  Err, pWin->zBase
9380: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
9390: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
93a0: 20 70 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f   pWin->pPartitio
93b0: 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  n = sqlite3ExprL
93c0: 69 73 74 44 75 70 28 64 62 2c 20 70 45 78 69 73  istDup(db, pExis
93d0: 74 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20 30  t->pPartition, 0
93e0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
93f0: 45 78 69 73 74 2d 3e 70 4f 72 64 65 72 42 79 20  Exist->pOrderBy 
9400: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
9410: 65 72 74 28 20 70 57 69 6e 2d 3e 70 4f 72 64 65  ert( pWin->pOrde
9420: 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  rBy==0 );.      
9430: 20 20 20 20 70 57 69 6e 2d 3e 70 4f 72 64 65 72      pWin->pOrder
9440: 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
9450: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 45 78 69  ListDup(db, pExi
9460: 73 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 30 29  st->pOrderBy, 0)
9470: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9480: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
9490: 65 28 64 62 2c 20 70 57 69 6e 2d 3e 7a 42 61 73  e(db, pWin->zBas
94a0: 65 29 3b 0a 20 20 20 20 20 20 20 20 70 57 69 6e  e);.        pWin
94b0: 2d 3e 7a 42 61 73 65 20 3d 20 30 3b 0a 20 20 20  ->zBase = 0;.   
94c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
94d0: 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20 77  ../*.** Attach w
94e0: 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 70 57 69  indow object pWi
94f0: 6e 20 74 6f 20 65 78 70 72 65 73 73 69 6f 6e 20  n to expression 
9500: 70 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  p..*/.void sqlit
9510: 65 33 57 69 6e 64 6f 77 41 74 74 61 63 68 28 50  e3WindowAttach(P
9520: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
9530: 70 72 20 2a 70 2c 20 57 69 6e 64 6f 77 20 2a 70  pr *p, Window *p
9540: 57 69 6e 29 7b 0a 20 20 69 66 28 20 70 20 29 7b  Win){.  if( p ){
9550: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9560: 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20  op==TK_FUNCTION 
9570: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
9580: 57 69 6e 20 29 3b 0a 20 20 20 20 70 2d 3e 79 2e  Win );.    p->y.
9590: 70 57 69 6e 20 3d 20 70 57 69 6e 3b 0a 20 20 20  pWin = pWin;.   
95a0: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
95b0: 28 70 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 3b  (p, EP_WinFunc);
95c0: 0a 20 20 20 20 70 57 69 6e 2d 3e 70 4f 77 6e 65  .    pWin->pOwne
95d0: 72 20 3d 20 70 3b 0a 20 20 20 20 69 66 28 20 28  r = p;.    if( (
95e0: 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69  p->flags & EP_Di
95f0: 73 74 69 6e 63 74 29 20 26 26 20 70 57 69 6e 2d  stinct) && pWin-
9600: 3e 65 46 72 6d 54 79 70 65 21 3d 54 4b 5f 46 49  >eFrmType!=TK_FI
9610: 4c 54 45 52 20 29 7b 0a 20 20 20 20 20 20 73 71  LTER ){.      sq
9620: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
9630: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
9640: 22 44 49 53 54 49 4e 43 54 20 69 73 20 6e 6f 74  "DISTINCT is not
9650: 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20 77   supported for w
9660: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 22  indow functions"
9670: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
9680: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
9690: 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65 74 65  ite3WindowDelete
96a0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 57 69  (pParse->db, pWi
96b0: 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  n);.  }.}../*.**
96c0: 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   Return 0 if the
96d0: 20 74 77 6f 20 77 69 6e 64 6f 77 20 6f 62 6a 65   two window obje
96e0: 63 74 73 20 61 72 65 20 69 64 65 6e 74 69 63 61  cts are identica
96f0: 6c 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 6f  l, or non-zero o
9700: 74 68 65 72 77 69 73 65 2e 0a 2a 2a 20 49 64 65  therwise..** Ide
9710: 6e 74 69 63 61 6c 20 77 69 6e 64 6f 77 20 6f 62  ntical window ob
9720: 6a 65 63 74 73 20 63 61 6e 20 62 65 20 70 72 6f  jects can be pro
9730: 63 65 73 73 65 64 20 69 6e 20 61 20 73 69 6e 67  cessed in a sing
9740: 6c 65 20 73 63 61 6e 2e 0a 2a 2f 0a 69 6e 74 20  le scan..*/.int 
9750: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 6d  sqlite3WindowCom
9760: 70 61 72 65 28 50 61 72 73 65 20 2a 70 50 61 72  pare(Parse *pPar
9770: 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70 31 2c 20  se, Window *p1, 
9780: 57 69 6e 64 6f 77 20 2a 70 32 2c 20 69 6e 74 20  Window *p2, int 
9790: 62 46 69 6c 74 65 72 29 7b 0a 20 20 69 66 28 20  bFilter){.  if( 
97a0: 70 31 2d 3e 65 46 72 6d 54 79 70 65 21 3d 70 32  p1->eFrmType!=p2
97b0: 2d 3e 65 46 72 6d 54 79 70 65 20 29 20 72 65 74  ->eFrmType ) ret
97c0: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 31 2d  urn 1;.  if( p1-
97d0: 3e 65 53 74 61 72 74 21 3d 70 32 2d 3e 65 53 74  >eStart!=p2->eSt
97e0: 61 72 74 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  art ) return 1;.
97f0: 20 20 69 66 28 20 70 31 2d 3e 65 45 6e 64 21 3d    if( p1->eEnd!=
9800: 70 32 2d 3e 65 45 6e 64 20 29 20 72 65 74 75 72  p2->eEnd ) retur
9810: 6e 20 31 3b 0a 20 20 69 66 28 20 70 31 2d 3e 65  n 1;.  if( p1->e
9820: 45 78 63 6c 75 64 65 21 3d 70 32 2d 3e 65 45 78  Exclude!=p2->eEx
9830: 63 6c 75 64 65 20 29 20 72 65 74 75 72 6e 20 31  clude ) return 1
9840: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  ;.  if( sqlite3E
9850: 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73  xprCompare(pPars
9860: 65 2c 20 70 31 2d 3e 70 53 74 61 72 74 2c 20 70  e, p1->pStart, p
9870: 32 2d 3e 70 53 74 61 72 74 2c 20 2d 31 29 20 29  2->pStart, -1) )
9880: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
9890: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
98a0: 61 72 65 28 70 50 61 72 73 65 2c 20 70 31 2d 3e  are(pParse, p1->
98b0: 70 45 6e 64 2c 20 70 32 2d 3e 70 45 6e 64 2c 20  pEnd, p2->pEnd, 
98c0: 2d 31 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  -1) ) return 1;.
98d0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
98e0: 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 31 2d  rListCompare(p1-
98f0: 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20 70 32 2d  >pPartition, p2-
9900: 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20 2d 31 29  >pPartition, -1)
9910: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
9920: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  f( sqlite3ExprLi
9930: 73 74 43 6f 6d 70 61 72 65 28 70 31 2d 3e 70 4f  stCompare(p1->pO
9940: 72 64 65 72 42 79 2c 20 70 32 2d 3e 70 4f 72 64  rderBy, p2->pOrd
9950: 65 72 42 79 2c 20 2d 31 29 20 29 20 72 65 74 75  erBy, -1) ) retu
9960: 72 6e 20 31 3b 0a 20 20 69 66 28 20 62 46 69 6c  rn 1;.  if( bFil
9970: 74 65 72 20 29 7b 0a 20 20 20 20 69 66 28 20 73  ter ){.    if( s
9980: 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
9990: 65 28 70 50 61 72 73 65 2c 20 70 31 2d 3e 70 46  e(pParse, p1->pF
99a0: 69 6c 74 65 72 2c 20 70 32 2d 3e 70 46 69 6c 74  ilter, p2->pFilt
99b0: 65 72 2c 20 2d 31 29 20 29 20 72 65 74 75 72 6e  er, -1) ) return
99c0: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
99d0: 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68   0;.}.../*.** Th
99e0: 69 73 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  is is called by 
99f0: 63 6f 64 65 20 69 6e 20 73 65 6c 65 63 74 2e 63  code in select.c
9a00: 20 62 65 66 6f 72 65 20 69 74 20 63 61 6c 6c 73   before it calls
9a10: 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
9a20: 69 6e 28 29 0a 2a 2a 20 74 6f 20 62 65 67 69 6e  in().** to begin
9a30: 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75   iterating throu
9a40: 67 68 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  gh the sub-query
9a50: 20 72 65 73 75 6c 74 73 2e 20 49 74 20 69 73 20   results. It is 
9a60: 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  used to allocate
9a70: 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  .** and initiali
9a80: 7a 65 20 72 65 67 69 73 74 65 72 73 20 61 6e 64  ze registers and
9a90: 20 63 75 72 73 6f 72 73 20 75 73 65 64 20 62 79   cursors used by
9aa0: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f   sqlite3WindowCo
9ab0: 64 65 53 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69  deStep()..*/.voi
9ac0: 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43  d sqlite3WindowC
9ad0: 6f 64 65 49 6e 69 74 28 50 61 72 73 65 20 2a 70  odeInit(Parse *p
9ae0: 50 61 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70  Parse, Window *p
9af0: 4d 57 69 6e 29 7b 0a 20 20 57 69 6e 64 6f 77 20  MWin){.  Window 
9b00: 2a 70 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76  *pWin;.  Vdbe *v
9b10: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
9b20: 65 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a  e(pParse);..  /*
9b30: 20 41 6c 6c 6f 63 61 74 65 20 72 65 67 69 73 74   Allocate regist
9b40: 65 72 73 20 74 6f 20 75 73 65 20 66 6f 72 20 50  ers to use for P
9b50: 41 52 54 49 54 49 4f 4e 20 42 59 20 76 61 6c 75  ARTITION BY valu
9b60: 65 73 2c 20 69 66 20 61 6e 79 2e 20 49 6e 69 74  es, if any. Init
9b70: 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 73 61 69 64  ialize.  ** said
9b80: 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 4e 55   registers to NU
9b90: 4c 4c 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 4d  LL.  */.  if( pM
9ba0: 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20  Win->pPartition 
9bb0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72  ){.    int nExpr
9bc0: 20 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69   = pMWin->pParti
9bd0: 74 69 6f 6e 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  tion->nExpr;.   
9be0: 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 20   pMWin->regPart 
9bf0: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
9c00: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
9c10: 65 6d 20 2b 3d 20 6e 45 78 70 72 3b 0a 20 20 20  em += nExpr;.   
9c20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9c30: 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p3(v, OP_Null, 0
9c40: 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74  , pMWin->regPart
9c50: 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74  , pMWin->regPart
9c60: 2b 6e 45 78 70 72 2d 31 29 3b 0a 20 20 7d 0a 0a  +nExpr-1);.  }..
9c70: 20 20 70 4d 57 69 6e 2d 3e 72 65 67 4f 6e 65 20    pMWin->regOne 
9c80: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
9c90: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
9ca0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
9cb0: 67 65 72 2c 20 31 2c 20 70 4d 57 69 6e 2d 3e 72  ger, 1, pMWin->r
9cc0: 65 67 4f 6e 65 29 3b 0a 0a 20 20 69 66 28 20 70  egOne);..  if( p
9cd0: 4d 57 69 6e 2d 3e 65 45 78 63 6c 75 64 65 20 29  MWin->eExclude )
9ce0: 7b 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 72 65 67  {.    pMWin->reg
9cf0: 53 74 61 72 74 52 6f 77 69 64 20 3d 20 2b 2b 70  StartRowid = ++p
9d00: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
9d10: 20 70 4d 57 69 6e 2d 3e 72 65 67 45 6e 64 52 6f   pMWin->regEndRo
9d20: 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  wid = ++pParse->
9d30: 6e 4d 65 6d 3b 0a 20 20 20 20 70 4d 57 69 6e 2d  nMem;.    pMWin-
9d40: 3e 63 73 72 41 70 70 20 3d 20 70 50 61 72 73 65  >csrApp = pParse
9d50: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71  ->nTab++;.    sq
9d60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
9d70: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
9d80: 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72  , pMWin->regStar
9d90: 74 52 6f 77 69 64 29 3b 0a 20 20 20 20 73 71 6c  tRowid);.    sql
9da0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
9db0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
9dc0: 20 70 4d 57 69 6e 2d 3e 72 65 67 45 6e 64 52 6f   pMWin->regEndRo
9dd0: 77 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  wid);.    sqlite
9de0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
9df0: 50 5f 4f 70 65 6e 44 75 70 2c 20 70 4d 57 69 6e  P_OpenDup, pMWin
9e00: 2d 3e 63 73 72 41 70 70 2c 20 70 4d 57 69 6e 2d  ->csrApp, pMWin-
9e10: 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 20 20 72  >iEphCsr);.    r
9e20: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66 6f  eturn;.  }..  fo
9e30: 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57  r(pWin=pMWin; pW
9e40: 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70  in; pWin=pWin->p
9e50: 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 46 75  NextWin){.    Fu
9e60: 6e 63 44 65 66 20 2a 70 20 3d 20 70 57 69 6e 2d  ncDef *p = pWin-
9e70: 3e 70 46 75 6e 63 3b 0a 20 20 20 20 69 66 28 20  >pFunc;.    if( 
9e80: 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  (p->funcFlags & 
9e90: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d  SQLITE_FUNC_MINM
9ea0: 41 58 29 20 26 26 20 70 57 69 6e 2d 3e 65 53 74  AX) && pWin->eSt
9eb0: 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  art!=TK_UNBOUNDE
9ec0: 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  D ){.      /* Th
9ed0: 65 20 69 6e 6c 69 6e 65 20 76 65 72 73 69 6f 6e  e inline version
9ee0: 73 20 6f 66 20 6d 69 6e 28 29 20 61 6e 64 20 6d  s of min() and m
9ef0: 61 78 28 29 20 72 65 71 75 69 72 65 20 61 20 73  ax() require a s
9f00: 69 6e 67 6c 65 20 65 70 68 65 6d 65 72 61 6c 0a  ingle ephemeral.
9f10: 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61        ** table a
9f20: 6e 64 20 33 20 72 65 67 69 73 74 65 72 73 2e 20  nd 3 registers. 
9f30: 54 68 65 20 72 65 67 69 73 74 65 72 73 20 61 72  The registers ar
9f40: 65 20 75 73 65 64 20 61 73 20 66 6f 6c 6c 6f 77  e used as follow
9f50: 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s:.      **.    
9f60: 20 20 2a 2a 20 20 20 72 65 67 41 70 70 2b 30 3a    **   regApp+0:
9f70: 20 73 6c 6f 74 20 74 6f 20 63 6f 70 79 20 6d 69   slot to copy mi
9f80: 6e 28 29 2f 6d 61 78 28 29 20 61 72 67 75 6d 65  n()/max() argume
9f90: 6e 74 20 74 6f 20 66 6f 72 20 4d 61 6b 65 52 65  nt to for MakeRe
9fa0: 63 6f 72 64 0a 20 20 20 20 20 20 2a 2a 20 20 20  cord.      **   
9fb0: 72 65 67 41 70 70 2b 31 3a 20 69 6e 74 65 67 65  regApp+1: intege
9fc0: 72 20 76 61 6c 75 65 20 75 73 65 64 20 74 6f 20  r value used to 
9fd0: 65 6e 73 75 72 65 20 6b 65 79 73 20 61 72 65 20  ensure keys are 
9fe0: 75 6e 69 71 75 65 0a 20 20 20 20 20 20 2a 2a 20  unique.      ** 
9ff0: 20 20 72 65 67 41 70 70 2b 32 3a 20 6f 75 74 70    regApp+2: outp
a000: 75 74 20 6f 66 20 4d 61 6b 65 52 65 63 6f 72 64  ut of MakeRecord
a010: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
a020: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
a030: 3d 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e  = pWin->pOwner->
a040: 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 4b  x.pList;.      K
a050: 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
a060: 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
a070: 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
a080: 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 30 2c 20  arse, pList, 0, 
a090: 30 29 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e  0);.      pWin->
a0a0: 63 73 72 41 70 70 20 3d 20 70 50 61 72 73 65 2d  csrApp = pParse-
a0b0: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70  >nTab++;.      p
a0c0: 57 69 6e 2d 3e 72 65 67 41 70 70 20 3d 20 70 50  Win->regApp = pP
a0d0: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
a0e0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
a0f0: 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20 69 66 28   += 3;.      if(
a100: 20 70 4b 65 79 49 6e 66 6f 20 26 26 20 70 57 69   pKeyInfo && pWi
a110: 6e 2d 3e 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 5b  n->pFunc->zName[
a120: 31 5d 3d 3d 27 69 27 20 29 7b 0a 20 20 20 20 20  1]=='i' ){.     
a130: 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49     assert( pKeyI
a140: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
a150: 30 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  0]==0 );.       
a160: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
a170: 4f 72 64 65 72 5b 30 5d 20 3d 20 31 3b 0a 20 20  Order[0] = 1;.  
a180: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
a190: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
a1a0: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
a1b0: 6c 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c  l, pWin->csrApp,
a1c0: 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   2);.      sqlit
a1d0: 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76  e3VdbeAppendP4(v
a1e0: 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  , pKeyInfo, P4_K
a1f0: 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 73  EYINFO);.      s
a200: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
a210: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
a220: 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b  0, pWin->regApp+
a230: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c  1);.    }.    el
a240: 73 65 20 69 66 28 20 70 2d 3e 7a 4e 61 6d 65 3d  se if( p->zName=
a250: 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 20 7c  =nth_valueName |
a260: 7c 20 70 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72 73  | p->zName==firs
a270: 74 5f 76 61 6c 75 65 4e 61 6d 65 20 29 7b 0a 20  t_valueName ){. 
a280: 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
a290: 20 74 77 6f 20 72 65 67 69 73 74 65 72 73 20 61   two registers a
a2a0: 74 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2e 20  t pWin->regApp. 
a2b0: 54 68 65 73 65 20 77 69 6c 6c 20 62 65 20 75 73  These will be us
a2c0: 65 64 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73  ed to.      ** s
a2d0: 74 6f 72 65 20 74 68 65 20 73 74 61 72 74 20 61  tore the start a
a2e0: 6e 64 20 65 6e 64 20 69 6e 64 65 78 20 6f 66 20  nd end index of 
a2f0: 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 61 6d  the current fram
a300: 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 70 57 69  e.  */.      pWi
a310: 6e 2d 3e 72 65 67 41 70 70 20 3d 20 70 50 61 72  n->regApp = pPar
a320: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
a330: 20 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 20 3d    pWin->csrApp =
a340: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
a350: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
a360: 4d 65 6d 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20  Mem += 2;.      
a370: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a380: 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c  2(v, OP_OpenDup,
a390: 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20 70   pWin->csrApp, p
a3a0: 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a  MWin->iEphCsr);.
a3b0: 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69      }.    else i
a3c0: 66 28 20 70 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61  f( p->zName==lea
a3d0: 64 4e 61 6d 65 20 7c 7c 20 70 2d 3e 7a 4e 61 6d  dName || p->zNam
a3e0: 65 3d 3d 6c 61 67 4e 61 6d 65 20 29 7b 0a 20 20  e==lagName ){.  
a3f0: 20 20 20 20 70 57 69 6e 2d 3e 63 73 72 41 70 70      pWin->csrApp
a400: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
a410: 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  +;.      sqlite3
a420: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
a430: 5f 4f 70 65 6e 44 75 70 2c 20 70 57 69 6e 2d 3e  _OpenDup, pWin->
a440: 63 73 72 41 70 70 2c 20 70 4d 57 69 6e 2d 3e 69  csrApp, pMWin->i
a450: 45 70 68 43 73 72 29 3b 0a 20 20 20 20 7d 0a 20  EphCsr);.    }. 
a460: 20 7d 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 57 49   }.}..#define WI
a470: 4e 44 4f 57 5f 53 54 41 52 54 49 4e 47 5f 49 4e  NDOW_STARTING_IN
a480: 54 20 20 30 0a 23 64 65 66 69 6e 65 20 57 49 4e  T  0.#define WIN
a490: 44 4f 57 5f 45 4e 44 49 4e 47 5f 49 4e 54 20 20  DOW_ENDING_INT  
a4a0: 20 20 31 0a 23 64 65 66 69 6e 65 20 57 49 4e 44    1.#define WIND
a4b0: 4f 57 5f 4e 54 48 5f 56 41 4c 55 45 5f 49 4e 54  OW_NTH_VALUE_INT
a4c0: 20 32 0a 23 64 65 66 69 6e 65 20 57 49 4e 44 4f   2.#define WINDO
a4d0: 57 5f 53 54 41 52 54 49 4e 47 5f 4e 55 4d 20 20  W_STARTING_NUM  
a4e0: 33 0a 23 64 65 66 69 6e 65 20 57 49 4e 44 4f 57  3.#define WINDOW
a4f0: 5f 45 4e 44 49 4e 47 5f 4e 55 4d 20 20 20 20 34  _ENDING_NUM    4
a500: 0a 0a 2f 2a 0a 2a 2a 20 41 20 22 50 52 45 43 45  ../*.** A "PRECE
a510: 44 49 4e 47 20 3c 65 78 70 72 3e 22 20 28 65 43  DING <expr>" (eC
a520: 6f 6e 64 3d 3d 30 29 20 6f 72 20 22 46 4f 4c 4c  ond==0) or "FOLL
a530: 4f 57 49 4e 47 20 3c 65 78 70 72 3e 22 20 28 65  OWING <expr>" (e
a540: 43 6f 6e 64 3d 3d 31 29 20 6f 72 20 74 68 65 0a  Cond==1) or the.
a550: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ** value of the 
a560: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
a570: 74 6f 20 6e 74 68 5f 76 61 6c 75 65 28 29 20 28  to nth_value() (
a580: 65 43 6f 6e 64 3d 3d 32 29 20 68 61 73 20 6a 75  eCond==2) has ju
a590: 73 74 20 62 65 65 6e 0a 2a 2a 20 65 76 61 6c 75  st been.** evalu
a5a0: 61 74 65 64 20 61 6e 64 20 74 68 65 20 72 65 73  ated and the res
a5b0: 75 6c 74 20 6c 65 66 74 20 69 6e 20 72 65 67 69  ult left in regi
a5c0: 73 74 65 72 20 72 65 67 2e 20 54 68 69 73 20 66  ster reg. This f
a5d0: 75 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61 74 65  unction generate
a5e0: 73 20 56 4d 0a 2a 2a 20 63 6f 64 65 20 74 6f 20  s VM.** code to 
a5f0: 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76  check that the v
a600: 61 6c 75 65 20 69 73 20 61 20 6e 6f 6e 2d 6e 65  alue is a non-ne
a610: 67 61 74 69 76 65 20 69 6e 74 65 67 65 72 20 61  gative integer a
a620: 6e 64 20 74 68 72 6f 77 73 20 61 6e 0a 2a 2a 20  nd throws an.** 
a630: 65 78 63 65 70 74 69 6f 6e 20 69 66 20 69 74 20  exception if it 
a640: 69 73 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69  is not..*/.stati
a650: 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 43 68 65  c void windowChe
a660: 63 6b 56 61 6c 75 65 28 50 61 72 73 65 20 2a 70  ckValue(Parse *p
a670: 50 61 72 73 65 2c 20 69 6e 74 20 72 65 67 2c 20  Parse, int reg, 
a680: 69 6e 74 20 65 43 6f 6e 64 29 7b 0a 20 20 73 74  int eCond){.  st
a690: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
a6a0: 2a 61 7a 45 72 72 5b 5d 20 3d 20 7b 0a 20 20 20  *azErr[] = {.   
a6b0: 20 22 66 72 61 6d 65 20 73 74 61 72 74 69 6e 67   "frame starting
a6c0: 20 6f 66 66 73 65 74 20 6d 75 73 74 20 62 65 20   offset must be 
a6d0: 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69  a non-negative i
a6e0: 6e 74 65 67 65 72 22 2c 0a 20 20 20 20 22 66 72  nteger",.    "fr
a6f0: 61 6d 65 20 65 6e 64 69 6e 67 20 6f 66 66 73 65  ame ending offse
a700: 74 20 6d 75 73 74 20 62 65 20 61 20 6e 6f 6e 2d  t must be a non-
a710: 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72  negative integer
a720: 22 2c 0a 20 20 20 20 22 73 65 63 6f 6e 64 20 61  ",.    "second a
a730: 72 67 75 6d 65 6e 74 20 74 6f 20 6e 74 68 5f 76  rgument to nth_v
a740: 61 6c 75 65 20 6d 75 73 74 20 62 65 20 61 20 70  alue must be a p
a750: 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 22  ositive integer"
a760: 2c 0a 20 20 20 20 22 66 72 61 6d 65 20 73 74 61  ,.    "frame sta
a770: 72 74 69 6e 67 20 6f 66 66 73 65 74 20 6d 75 73  rting offset mus
a780: 74 20 62 65 20 61 20 6e 6f 6e 2d 6e 65 67 61 74  t be a non-negat
a790: 69 76 65 20 6e 75 6d 62 65 72 22 2c 0a 20 20 20  ive number",.   
a7a0: 20 22 66 72 61 6d 65 20 65 6e 64 69 6e 67 20 6f   "frame ending o
a7b0: 66 66 73 65 74 20 6d 75 73 74 20 62 65 20 61 20  ffset must be a 
a7c0: 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 6e 75 6d  non-negative num
a7d0: 62 65 72 22 2c 0a 20 20 7d 3b 0a 20 20 73 74 61  ber",.  };.  sta
a7e0: 74 69 63 20 69 6e 74 20 61 4f 70 5b 5d 20 3d 20  tic int aOp[] = 
a7f0: 7b 20 4f 50 5f 47 65 2c 20 4f 50 5f 47 65 2c 20  { OP_Ge, OP_Ge, 
a800: 4f 50 5f 47 74 2c 20 4f 50 5f 47 65 2c 20 4f 50  OP_Gt, OP_Ge, OP
a810: 5f 47 65 20 7d 3b 0a 20 20 56 64 62 65 20 2a 76  _Ge };.  Vdbe *v
a820: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
a830: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  e(pParse);.  int
a840: 20 72 65 67 5a 65 72 6f 20 3d 20 73 71 6c 69 74   regZero = sqlit
a850: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
a860: 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
a870: 65 43 6f 6e 64 3e 3d 30 20 26 26 20 65 43 6f 6e  eCond>=0 && eCon
a880: 64 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 45 72  d<ArraySize(azEr
a890: 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  r) );.  sqlite3V
a8a0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
a8b0: 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 5a  Integer, 0, regZ
a8c0: 65 72 6f 29 3b 0a 20 20 69 66 28 20 65 43 6f 6e  ero);.  if( eCon
a8d0: 64 3e 3d 57 49 4e 44 4f 57 5f 53 54 41 52 54 49  d>=WINDOW_STARTI
a8e0: 4e 47 5f 4e 55 4d 20 29 7b 0a 20 20 20 20 69 6e  NG_NUM ){.    in
a8f0: 74 20 72 65 67 53 74 72 69 6e 67 20 3d 20 73 71  t regString = sq
a900: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
a910: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 73 71 6c  pParse);.    sql
a920: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
a930: 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
a940: 20 72 65 67 53 74 72 69 6e 67 2c 20 30 2c 20 22   regString, 0, "
a950: 22 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20  ", P4_STATIC);. 
a960: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a970: 64 4f 70 33 28 76 2c 20 4f 50 5f 47 65 2c 20 72  dOp3(v, OP_Ge, r
a980: 65 67 53 74 72 69 6e 67 2c 20 73 71 6c 69 74 65  egString, sqlite
a990: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
a9a0: 28 76 29 2b 32 2c 20 72 65 67 29 3b 0a 20 20 20  (v)+2, reg);.   
a9b0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
a9c0: 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 41  geP5(v, SQLITE_A
a9d0: 46 46 5f 4e 55 4d 45 52 49 43 7c 53 51 4c 49 54  FF_NUMERIC|SQLIT
a9e0: 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
a9f0: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
aa00: 76 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  v);.    assert( 
aa10: 65 43 6f 6e 64 3d 3d 33 20 7c 7c 20 65 43 6f 6e  eCond==3 || eCon
aa20: 64 3d 3d 34 20 29 3b 0a 20 20 20 20 56 64 62 65  d==4 );.    Vdbe
aa30: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 65 43  CoverageIf(v, eC
aa40: 6f 6e 64 3d 3d 33 29 3b 0a 20 20 20 20 56 64 62  ond==3);.    Vdb
aa50: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 65  eCoverageIf(v, e
aa60: 43 6f 6e 64 3d 3d 34 29 3b 0a 20 20 7d 65 6c 73  Cond==4);.  }els
aa70: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e{.    sqlite3Vd
aa80: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d  beAddOp2(v, OP_M
aa90: 75 73 74 42 65 49 6e 74 2c 20 72 65 67 2c 20 73  ustBeInt, reg, s
aaa0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
aab0: 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 20  tAddr(v)+2);.   
aac0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
aad0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 43  ;.    assert( eC
aae0: 6f 6e 64 3d 3d 30 20 7c 7c 20 65 43 6f 6e 64 3d  ond==0 || eCond=
aaf0: 3d 31 20 7c 7c 20 65 43 6f 6e 64 3d 3d 32 20 29  =1 || eCond==2 )
ab00: 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
ab10: 67 65 49 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 30  geIf(v, eCond==0
ab20: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
ab30: 61 67 65 49 66 28 76 2c 20 65 43 6f 6e 64 3d 3d  ageIf(v, eCond==
ab40: 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  1);.    VdbeCove
ab50: 72 61 67 65 49 66 28 76 2c 20 65 43 6f 6e 64 3d  rageIf(v, eCond=
ab60: 3d 32 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  =2);.  }.  sqlit
ab70: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
ab80: 61 4f 70 5b 65 43 6f 6e 64 5d 2c 20 72 65 67 5a  aOp[eCond], regZ
ab90: 65 72 6f 2c 20 73 71 6c 69 74 65 33 56 64 62 65  ero, sqlite3Vdbe
aba0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32  CurrentAddr(v)+2
abb0: 2c 20 72 65 67 29 3b 0a 20 20 56 64 62 65 43 6f  , reg);.  VdbeCo
abc0: 76 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c 49  verageNeverNullI
abd0: 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 30 29 3b 20  f(v, eCond==0); 
abe0: 2f 2a 20 4e 55 4c 4c 20 63 61 73 65 20 63 61 70  /* NULL case cap
abf0: 74 75 72 65 64 20 62 79 20 2a 2f 0a 20 20 56 64  tured by */.  Vd
ac00: 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72 4e  beCoverageNeverN
ac10: 75 6c 6c 49 66 28 76 2c 20 65 43 6f 6e 64 3d 3d  ullIf(v, eCond==
ac20: 31 29 3b 20 2f 2a 20 20 20 74 68 65 20 4f 50 5f  1); /*   the OP_
ac30: 4d 75 73 74 42 65 49 6e 74 20 2a 2f 0a 20 20 56  MustBeInt */.  V
ac40: 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72  dbeCoverageNever
ac50: 4e 75 6c 6c 49 66 28 76 2c 20 65 43 6f 6e 64 3d  NullIf(v, eCond=
ac60: 3d 32 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72  =2);.  VdbeCover
ac70: 61 67 65 4e 65 76 65 72 4e 75 6c 6c 49 66 28 76  ageNeverNullIf(v
ac80: 2c 20 65 43 6f 6e 64 3d 3d 33 29 3b 20 2f 2a 20  , eCond==3); /* 
ac90: 4e 55 4c 4c 20 63 61 73 65 20 63 61 75 67 68 74  NULL case caught
aca0: 20 62 79 20 2a 2f 0a 20 20 56 64 62 65 43 6f 76   by */.  VdbeCov
acb0: 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c 49 66  erageNeverNullIf
acc0: 28 76 2c 20 65 43 6f 6e 64 3d 3d 34 29 3b 20 2f  (v, eCond==4); /
acd0: 2a 20 20 20 74 68 65 20 4f 50 5f 47 65 20 2a 2f  *   the OP_Ge */
ace0: 0a 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f  .  sqlite3MayAbo
acf0: 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  rt(pParse);.  sq
ad00: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
ad10: 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49  v, OP_Halt, SQLI
ad20: 54 45 5f 45 52 52 4f 52 2c 20 4f 45 5f 41 62 6f  TE_ERROR, OE_Abo
ad30: 72 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rt);.  sqlite3Vd
ad40: 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28 76  beAppendP4(v, (v
ad50: 6f 69 64 2a 29 61 7a 45 72 72 5b 65 43 6f 6e 64  oid*)azErr[eCond
ad60: 5d 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20  ], P4_STATIC);. 
ad70: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
ad80: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
ad90: 65 67 5a 65 72 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  egZero);.}../*.*
ada0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
adb0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
adc0: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 77   passed to the w
add0: 69 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e 20 61  indow-function a
ade0: 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
adf0: 68 20 74 68 65 20 6f 62 6a 65 63 74 20 70 61 73  h the object pas
ae00: 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
ae10: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
ae20: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
ae30: 61 74 69 63 20 69 6e 74 20 77 69 6e 64 6f 77 41  atic int windowA
ae40: 72 67 43 6f 75 6e 74 28 57 69 6e 64 6f 77 20 2a  rgCount(Window *
ae50: 70 57 69 6e 29 7b 0a 20 20 45 78 70 72 4c 69 73  pWin){.  ExprLis
ae60: 74 20 2a 70 4c 69 73 74 20 3d 20 70 57 69 6e 2d  t *pList = pWin-
ae70: 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74  >pOwner->x.pList
ae80: 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 4c 69 73  ;.  return (pLis
ae90: 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  t ? pList->nExpr
aea0: 20 3a 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   : 0);.}../*.** 
aeb0: 47 65 6e 65 72 61 74 65 20 56 4d 20 63 6f 64 65  Generate VM code
aec0: 20 74 6f 20 69 6e 76 6f 6b 65 20 65 69 74 68 65   to invoke eithe
aed0: 72 20 78 53 74 65 70 28 29 20 28 69 66 20 62 49  r xStep() (if bI
aee0: 6e 76 65 72 73 65 20 69 73 20 30 29 20 6f 72 20  nverse is 0) or 
aef0: 0a 2a 2a 20 78 49 6e 76 65 72 73 65 20 28 69 66  .** xInverse (if
af00: 20 62 49 6e 76 65 72 73 65 20 69 73 20 6e 6f 6e   bInverse is non
af10: 2d 7a 65 72 6f 29 20 66 6f 72 20 65 61 63 68 20  -zero) for each 
af20: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
af30: 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65  in the .** linke
af40: 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67 20  d list starting 
af50: 61 74 20 70 4d 57 69 6e 2e 20 4f 72 2c 20 66 6f  at pMWin. Or, fo
af60: 72 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  r built-in windo
af70: 77 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 74  w functions.** t
af80: 68 61 74 20 64 6f 20 6e 6f 74 20 75 73 65 20 74  hat do not use t
af90: 68 65 20 73 74 61 6e 64 61 72 64 20 66 75 6e 63  he standard func
afa0: 74 69 6f 6e 20 41 50 49 2c 20 67 65 6e 65 72 61  tion API, genera
afb0: 74 65 20 74 68 65 20 72 65 71 75 69 72 65 64 0a  te the required.
afc0: 2a 2a 20 69 6e 6c 69 6e 65 20 56 4d 20 63 6f 64  ** inline VM cod
afd0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75  e..**.** If argu
afe0: 6d 65 6e 74 20 63 73 72 20 69 73 20 67 72 65 61  ment csr is grea
aff0: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
b000: 6c 20 74 6f 20 30 2c 20 74 68 65 6e 20 61 72 67  l to 0, then arg
b010: 75 6d 65 6e 74 20 72 65 67 20 69 73 0a 2a 2a 20  ument reg is.** 
b020: 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74  the first regist
b030: 65 72 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f  er in an array o
b040: 66 20 72 65 67 69 73 74 65 72 73 20 67 75 61 72  f registers guar
b050: 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 61 72  anteed to be lar
b060: 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 20 74 6f 20  ge.** enough to 
b070: 68 6f 6c 64 20 74 68 65 20 61 72 72 61 79 20 6f  hold the array o
b080: 66 20 61 72 67 75 6d 65 6e 74 73 20 66 6f 72 20  f arguments for 
b090: 65 61 63 68 20 66 75 6e 63 74 69 6f 6e 2e 20 49  each function. I
b0a0: 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20 74  n this case.** t
b0b0: 68 65 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  he arguments are
b0c0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
b0d0: 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
b0e0: 6f 66 20 63 73 72 20 69 6e 74 6f 20 74 68 65 0a  of csr into the.
b0f0: 2a 2a 20 61 72 72 61 79 20 6f 66 20 72 65 67 69  ** array of regi
b100: 73 74 65 72 73 20 62 65 66 6f 72 65 20 69 6e 76  sters before inv
b110: 6f 6b 69 6e 67 20 4f 50 5f 41 67 67 53 74 65 70  oking OP_AggStep
b120: 20 6f 72 20 4f 50 5f 41 67 67 49 6e 76 65 72 73   or OP_AggInvers
b130: 65 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 63  e.**.** Or, if c
b140: 73 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  sr is less than 
b150: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 61  zero, then the a
b160: 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
b170: 73 20 61 74 20 72 65 67 20 69 73 0a 2a 2a 20 61  s at reg is.** a
b180: 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64  lready populated
b190: 20 77 69 74 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e   with all column
b1a0: 73 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65  s from the curre
b1b0: 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 73 75  nt row of the su
b1c0: 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49  b-query..**.** I
b1d0: 66 20 61 72 67 75 6d 65 6e 74 20 72 65 67 50 61  f argument regPa
b1e0: 72 74 53 69 7a 65 20 69 73 20 6e 6f 6e 2d 7a 65  rtSize is non-ze
b1f0: 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61  ro, then it is a
b200: 20 72 65 67 69 73 74 65 72 20 63 6f 6e 74 61 69   register contai
b210: 6e 69 6e 67 20 74 68 65 0a 2a 2a 20 6e 75 6d 62  ning the.** numb
b220: 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
b230: 65 20 63 75 72 72 65 6e 74 20 70 61 72 74 69 74  e current partit
b240: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
b250: 6f 69 64 20 77 69 6e 64 6f 77 41 67 67 53 74 65  oid windowAggSte
b260: 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  p(.  Parse *pPar
b270: 73 65 2c 20 0a 20 20 57 69 6e 64 6f 77 20 2a 70  se, .  Window *p
b280: 4d 57 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20  MWin,           
b290: 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 65 64         /* Linked
b2a0: 20 6c 69 73 74 20 6f 66 20 77 69 6e 64 6f 77 20   list of window 
b2b0: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  functions */.  i
b2c0: 6e 74 20 63 73 72 2c 20 20 20 20 20 20 20 20 20  nt csr,         
b2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b2e0: 2a 20 52 65 61 64 20 61 72 67 75 6d 65 6e 74 73  * Read arguments
b2f0: 20 66 72 6f 6d 20 74 68 69 73 20 63 75 72 73 6f   from this curso
b300: 72 20 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 76 65  r */.  int bInve
b310: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
b320: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
b330: 6f 20 69 6e 76 6f 6b 65 20 78 49 6e 76 65 72 73  o invoke xInvers
b340: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 78 53 74  e instead of xSt
b350: 65 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 20  ep */.  int reg 
b360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b370: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
b380: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 2a 2f   of registers */
b390: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
b3a0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
b3b0: 50 61 72 73 65 29 3b 0a 20 20 57 69 6e 64 6f 77  Parse);.  Window
b3c0: 20 2a 70 57 69 6e 3b 0a 20 20 66 6f 72 28 70 57   *pWin;.  for(pW
b3d0: 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20  in=pMWin; pWin; 
b3e0: 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74  pWin=pWin->pNext
b3f0: 57 69 6e 29 7b 0a 20 20 20 20 46 75 6e 63 44 65  Win){.    FuncDe
b400: 66 20 2a 70 46 75 6e 63 20 3d 20 70 57 69 6e 2d  f *pFunc = pWin-
b410: 3e 70 46 75 6e 63 3b 0a 20 20 20 20 69 6e 74 20  >pFunc;.    int 
b420: 72 65 67 41 72 67 3b 0a 20 20 20 20 69 6e 74 20  regArg;.    int 
b430: 6e 41 72 67 20 3d 20 77 69 6e 64 6f 77 41 72 67  nArg = windowArg
b440: 43 6f 75 6e 74 28 70 57 69 6e 29 3b 0a 20 20 20  Count(pWin);.   
b450: 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 66 6f 72   int i;..    for
b460: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
b470: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 21  +){.      if( i!
b480: 3d 31 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61  =1 || pFunc->zNa
b490: 6d 65 21 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d  me!=nth_valueNam
b4a0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
b4b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
b4c0: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72  , OP_Column, csr
b4d0: 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b  , pWin->iArgCol+
b4e0: 69 2c 20 72 65 67 2b 69 29 3b 0a 20 20 20 20 20  i, reg+i);.     
b4f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b500: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b510: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
b520: 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20  pMWin->iEphCsr, 
b530: 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 69 2c  pWin->iArgCol+i,
b540: 20 72 65 67 2b 69 29 3b 0a 20 20 20 20 20 20 7d   reg+i);.      }
b550: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 67 41 72  .    }.    regAr
b560: 67 20 3d 20 72 65 67 3b 0a 0a 20 20 20 20 69 66  g = reg;..    if
b570: 28 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72  ( pMWin->regStar
b580: 74 52 6f 77 69 64 3d 3d 30 0a 20 20 20 20 20 26  tRowid==0.     &
b590: 26 20 28 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c  & (pFunc->funcFl
b5a0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
b5b0: 43 5f 4d 49 4e 4d 41 58 29 20 0a 20 20 20 20 20  C_MINMAX) .     
b5c0: 26 26 20 28 70 57 69 6e 2d 3e 65 53 74 61 72 74  && (pWin->eStart
b5d0: 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 29 0a  !=TK_UNBOUNDED).
b5e0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74      ){.      int
b5f0: 20 61 64 64 72 49 73 4e 75 6c 6c 20 3d 20 73 71   addrIsNull = sq
b600: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
b610: 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65  v, OP_IsNull, re
b620: 67 41 72 67 29 3b 0a 20 20 20 20 20 20 56 64 62  gArg);.      Vdb
b630: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
b640: 20 20 20 20 69 66 28 20 62 49 6e 76 65 72 73 65      if( bInverse
b650: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
b660: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
b670: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70  (v, OP_AddImm, p
b680: 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31 2c 20 31  Win->regApp+1, 1
b690: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
b6a0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b6b0: 4f 50 5f 53 43 6f 70 79 2c 20 72 65 67 41 72 67  OP_SCopy, regArg
b6c0: 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 29 3b  , pWin->regApp);
b6d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b6e0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
b6f0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 57 69  _MakeRecord, pWi
b700: 6e 2d 3e 72 65 67 41 70 70 2c 20 32 2c 20 70 57  n->regApp, 2, pW
b710: 69 6e 2d 3e 72 65 67 41 70 70 2b 32 29 3b 0a 20  in->regApp+2);. 
b720: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b730: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
b740: 64 78 49 6e 73 65 72 74 2c 20 70 57 69 6e 2d 3e  dxInsert, pWin->
b750: 63 73 72 41 70 70 2c 20 70 57 69 6e 2d 3e 72 65  csrApp, pWin->re
b760: 67 41 70 70 2b 32 29 3b 0a 20 20 20 20 20 20 7d  gApp+2);.      }
b770: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
b780: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
b790: 6e 74 28 76 2c 20 4f 50 5f 53 65 65 6b 47 45 2c  nt(v, OP_SeekGE,
b7a0: 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20 30   pWin->csrApp, 0
b7b0: 2c 20 72 65 67 41 72 67 2c 20 31 29 3b 0a 20 20  , regArg, 1);.  
b7c0: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
b7d0: 67 65 4e 65 76 65 72 54 61 6b 65 6e 28 76 29 3b  geNeverTaken(v);
b7e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b7f0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
b800: 5f 44 65 6c 65 74 65 2c 20 70 57 69 6e 2d 3e 63  _Delete, pWin->c
b810: 73 72 41 70 70 29 3b 0a 20 20 20 20 20 20 20 20  srApp);.        
b820: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
b830: 65 72 65 28 76 2c 20 73 71 6c 69 74 65 33 56 64  ere(v, sqlite3Vd
b840: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
b850: 2d 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  -2);.      }.   
b860: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
b870: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 73  mpHere(v, addrIs
b880: 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Null);.    }else
b890: 20 69 66 28 20 70 57 69 6e 2d 3e 72 65 67 41 70   if( pWin->regAp
b8a0: 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  p ){.      asser
b8b0: 74 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d  t( pFunc->zName=
b8c0: 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 0a 20  =nth_valueName. 
b8d0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 75            || pFu
b8e0: 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72 73 74  nc->zName==first
b8f0: 5f 76 61 6c 75 65 4e 61 6d 65 0a 20 20 20 20 20  _valueName.     
b900: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
b910: 28 20 62 49 6e 76 65 72 73 65 3d 3d 30 20 7c 7c  ( bInverse==0 ||
b920: 20 62 49 6e 76 65 72 73 65 3d 3d 31 20 29 3b 0a   bInverse==1 );.
b930: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b940: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
b950: 64 49 6d 6d 2c 20 70 57 69 6e 2d 3e 72 65 67 41  dImm, pWin->regA
b960: 70 70 2b 31 2d 62 49 6e 76 65 72 73 65 2c 20 31  pp+1-bInverse, 1
b970: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
b980: 20 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63 21 3d   pFunc->xSFunc!=
b990: 6e 6f 6f 70 53 74 65 70 46 75 6e 63 20 29 7b 0a  noopStepFunc ){.
b9a0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 49 66        int addrIf
b9b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
b9c0: 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72 20 29 7b  pWin->pFilter ){
b9d0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67  .        int reg
b9e0: 54 6d 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Tmp;.        ass
b9f0: 65 72 74 28 20 6e 41 72 67 3d 3d 30 20 7c 7c 20  ert( nArg==0 || 
ba00: 6e 41 72 67 3d 3d 70 57 69 6e 2d 3e 70 4f 77 6e  nArg==pWin->pOwn
ba10: 65 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  er->x.pList->nEx
ba20: 70 72 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  pr );.        as
ba30: 73 65 72 74 28 20 6e 41 72 67 20 7c 7c 20 70 57  sert( nArg || pW
ba40: 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c  in->pOwner->x.pL
ba50: 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ist==0 );.      
ba60: 20 20 72 65 67 54 6d 70 20 3d 20 73 71 6c 69 74    regTmp = sqlit
ba70: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
ba80: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
ba90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
baa0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73  v, OP_Column, cs
bab0: 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c  r, pWin->iArgCol
bac0: 2b 6e 41 72 67 2c 72 65 67 54 6d 70 29 3b 0a 20  +nArg,regTmp);. 
bad0: 20 20 20 20 20 20 20 61 64 64 72 49 66 20 3d 20         addrIf = 
bae0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
baf0: 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72  3(v, OP_IfNot, r
bb00: 65 67 54 6d 70 2c 20 30 2c 20 31 29 3b 0a 20 20  egTmp, 0, 1);.  
bb10: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
bb20: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  ge(v);.        s
bb30: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
bb40: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
bb50: 54 6d 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Tmp);.      }.  
bb60: 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 66      if( pFunc->f
bb70: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
bb80: 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20  E_FUNC_NEEDCOLL 
bb90: 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  ){.        CollS
bba0: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  eq *pColl;.     
bbb0: 20 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3e     assert( nArg>
bbc0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  0 );.        pCo
bbd0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
bbe0: 4e 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  NNCollSeq(pParse
bbf0: 2c 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e  , pWin->pOwner->
bc00: 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  x.pList->a[0].pE
bc10: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  xpr);.        sq
bc20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
bc30: 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30  v, OP_CollSeq, 0
bc40: 2c 30 2c 30 2c 20 28 63 6f 6e 73 74 20 63 68 61  ,0,0, (const cha
bc50: 72 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c  r*)pColl, P4_COL
bc60: 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LSEQ);.      }. 
bc70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bc80: 41 64 64 4f 70 33 28 76 2c 20 62 49 6e 76 65 72  AddOp3(v, bInver
bc90: 73 65 3f 20 4f 50 5f 41 67 67 49 6e 76 65 72 73  se? OP_AggInvers
bca0: 65 20 3a 20 4f 50 5f 41 67 67 53 74 65 70 2c 20  e : OP_AggStep, 
bcb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bcc0: 20 20 20 20 20 20 20 20 20 62 49 6e 76 65 72 73           bInvers
bcd0: 65 2c 20 72 65 67 41 72 67 2c 20 70 57 69 6e 2d  e, regArg, pWin-
bce0: 3e 72 65 67 41 63 63 75 6d 29 3b 0a 20 20 20 20  >regAccum);.    
bcf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70    sqlite3VdbeApp
bd00: 65 6e 64 50 34 28 76 2c 20 70 46 75 6e 63 2c 20  endP4(v, pFunc, 
bd10: 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P4_FUNCDEF);.   
bd20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
bd30: 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 41  angeP5(v, (u8)nA
bd40: 72 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  rg);.      if( a
bd50: 64 64 72 49 66 20 29 20 73 71 6c 69 74 65 33 56  ddrIf ) sqlite3V
bd60: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
bd70: 64 64 72 49 66 29 3b 0a 20 20 20 20 7d 0a 20 20  ddrIf);.    }.  
bd80: 7d 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74 72  }.}..typedef str
bd90: 75 63 74 20 57 69 6e 64 6f 77 43 6f 64 65 41 72  uct WindowCodeAr
bda0: 67 20 57 69 6e 64 6f 77 43 6f 64 65 41 72 67 3b  g WindowCodeArg;
bdb0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
bdc0: 57 69 6e 64 6f 77 43 73 72 41 6e 64 52 65 67 20  WindowCsrAndReg 
bdd0: 57 69 6e 64 6f 77 43 73 72 41 6e 64 52 65 67 3b  WindowCsrAndReg;
bde0: 0a 73 74 72 75 63 74 20 57 69 6e 64 6f 77 43 73  .struct WindowCs
bdf0: 72 41 6e 64 52 65 67 20 7b 0a 20 20 69 6e 74 20  rAndReg {.  int 
be00: 63 73 72 3b 0a 20 20 69 6e 74 20 72 65 67 3b 0a  csr;.  int reg;.
be10: 7d 3b 0a 0a 73 74 72 75 63 74 20 57 69 6e 64 6f  };..struct Windo
be20: 77 43 6f 64 65 41 72 67 20 7b 0a 20 20 50 61 72  wCodeArg {.  Par
be30: 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 57 69  se *pParse;.  Wi
be40: 6e 64 6f 77 20 2a 70 4d 57 69 6e 3b 0a 20 20 56  ndow *pMWin;.  V
be50: 64 62 65 20 2a 70 56 64 62 65 3b 0a 20 20 69 6e  dbe *pVdbe;.  in
be60: 74 20 72 65 67 47 6f 73 75 62 3b 0a 20 20 69 6e  t regGosub;.  in
be70: 74 20 61 64 64 72 47 6f 73 75 62 3b 0a 20 20 69  t addrGosub;.  i
be80: 6e 74 20 72 65 67 41 72 67 3b 0a 20 20 69 6e 74  nt regArg;.  int
be90: 20 65 44 65 6c 65 74 65 3b 0a 0a 20 20 57 69 6e   eDelete;..  Win
bea0: 64 6f 77 43 73 72 41 6e 64 52 65 67 20 73 74 61  dowCsrAndReg sta
beb0: 72 74 3b 0a 20 20 57 69 6e 64 6f 77 43 73 72 41  rt;.  WindowCsrA
bec0: 6e 64 52 65 67 20 63 75 72 72 65 6e 74 3b 0a 20  ndReg current;. 
bed0: 20 57 69 6e 64 6f 77 43 73 72 41 6e 64 52 65 67   WindowCsrAndReg
bee0: 20 65 6e 64 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20   end;.};../*.** 
bef0: 56 61 6c 75 65 73 20 74 68 61 74 20 6d 61 79 20  Values that may 
bf00: 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  be passed as the
bf10: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
bf20: 20 74 6f 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70   to windowCodeOp
bf30: 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ()..*/.#define W
bf40: 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57  INDOW_RETURN_ROW
bf50: 20 31 0a 23 64 65 66 69 6e 65 20 57 49 4e 44 4f   1.#define WINDO
bf60: 57 5f 41 47 47 49 4e 56 45 52 53 45 20 32 0a 23  W_AGGINVERSE 2.#
bf70: 64 65 66 69 6e 65 20 57 49 4e 44 4f 57 5f 41 47  define WINDOW_AG
bf80: 47 53 54 45 50 20 20 20 20 33 0a 0a 2f 2a 0a 2a  GSTEP    3../*.*
bf90: 2a 20 47 65 6e 65 72 61 74 65 20 56 4d 20 63 6f  * Generate VM co
bfa0: 64 65 20 74 6f 20 72 65 61 64 20 74 68 65 20 77  de to read the w
bfb0: 69 6e 64 6f 77 20 66 72 61 6d 65 73 20 70 65 65  indow frames pee
bfc0: 72 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 63 75  r values from cu
bfd0: 72 73 6f 72 20 63 73 72 20 69 6e 74 6f 0a 2a 2a  rsor csr into.**
bfe0: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67   an array of reg
bff0: 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20  isters starting 
c000: 61 74 20 72 65 67 2e 0a 2a 2f 0a 73 74 61 74 69  at reg..*/.stati
c010: 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 52 65 61  c void windowRea
c020: 64 50 65 65 72 56 61 6c 75 65 73 28 0a 20 20 57  dPeerValues(.  W
c030: 69 6e 64 6f 77 43 6f 64 65 41 72 67 20 2a 70 2c  indowCodeArg *p,
c040: 0a 20 20 69 6e 74 20 63 73 72 2c 0a 20 20 69 6e  .  int csr,.  in
c050: 74 20 72 65 67 0a 29 7b 0a 20 20 57 69 6e 64 6f  t reg.){.  Windo
c060: 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 4d  w *pMWin = p->pM
c070: 57 69 6e 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  Win;.  ExprList 
c080: 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 4d 57 69  *pOrderBy = pMWi
c090: 6e 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69  n->pOrderBy;.  i
c0a0: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
c0b0: 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c     Vdbe *v = sql
c0c0: 69 74 65 33 47 65 74 56 64 62 65 28 70 2d 3e 70  ite3GetVdbe(p->p
c0d0: 50 61 72 73 65 29 3b 0a 20 20 20 20 45 78 70 72  Parse);.    Expr
c0e0: 4c 69 73 74 20 2a 70 50 61 72 74 20 3d 20 70 4d  List *pPart = pM
c0f0: 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 3b  Win->pPartition;
c100: 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 4f 66 66  .    int iColOff
c110: 20 3d 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65   = pMWin->nBuffe
c120: 72 43 6f 6c 20 2b 20 28 70 50 61 72 74 20 3f 20  rCol + (pPart ? 
c130: 70 50 61 72 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pPart->nExpr : 0
c140: 29 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  );.    int i;.  
c150: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
c160: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
c170: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
c180: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
c190: 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20 69  P_Column, csr, i
c1a0: 43 6f 6c 4f 66 66 2b 69 2c 20 72 65 67 2b 69 29  ColOff+i, reg+i)
c1b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
c1c0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 4d  *.** Generate VM
c1d0: 20 63 6f 64 65 20 74 6f 20 69 6e 76 6f 6b 65 20   code to invoke 
c1e0: 65 69 74 68 65 72 20 78 56 61 6c 75 65 28 29 20  either xValue() 
c1f0: 28 62 46 69 6e 3d 3d 30 29 20 6f 72 20 78 46 69  (bFin==0) or xFi
c200: 6e 61 6c 69 7a 65 28 29 0a 2a 2a 20 28 62 46 69  nalize().** (bFi
c210: 6e 3d 3d 31 29 20 66 6f 72 20 65 61 63 68 20 77  n==1) for each w
c220: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 69  indow function i
c230: 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  n the linked lis
c240: 74 20 73 74 61 72 74 69 6e 67 20 61 74 0a 2a 2a  t starting at.**
c250: 20 70 4d 57 69 6e 2e 20 4f 72 2c 20 66 6f 72 20   pMWin. Or, for 
c260: 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 2d  built-in window-
c270: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 64  functions that d
c280: 6f 20 6e 6f 74 20 75 73 65 20 74 68 65 20 73 74  o not use the st
c290: 61 6e 64 61 72 64 0a 2a 2a 20 41 50 49 2c 20 67  andard.** API, g
c2a0: 65 6e 65 72 61 74 65 20 74 68 65 20 65 71 75 69  enerate the equi
c2b0: 76 61 6c 65 6e 74 20 56 4d 20 63 6f 64 65 2e 0a  valent VM code..
c2c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
c2d0: 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 57 69  indowAggFinal(Wi
c2e0: 6e 64 6f 77 43 6f 64 65 41 72 67 20 2a 70 2c 20  ndowCodeArg *p, 
c2f0: 69 6e 74 20 62 46 69 6e 29 7b 0a 20 20 50 61 72  int bFin){.  Par
c300: 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e  se *pParse = p->
c310: 70 50 61 72 73 65 3b 0a 20 20 57 69 6e 64 6f 77  pParse;.  Window
c320: 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 4d 57   *pMWin = p->pMW
c330: 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  in;.  Vdbe *v = 
c340: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
c350: 50 61 72 73 65 29 3b 0a 20 20 57 69 6e 64 6f 77  Parse);.  Window
c360: 20 2a 70 57 69 6e 3b 0a 0a 20 20 66 6f 72 28 70   *pWin;..  for(p
c370: 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b  Win=pMWin; pWin;
c380: 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78   pWin=pWin->pNex
c390: 74 57 69 6e 29 7b 0a 20 20 20 20 69 66 28 20 70  tWin){.    if( p
c3a0: 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f  MWin->regStartRo
c3b0: 77 69 64 3d 3d 30 0a 20 20 20 20 20 26 26 20 28  wid==0.     && (
c3c0: 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e  pWin->pFunc->fun
c3d0: 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
c3e0: 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 20 0a 20 20  FUNC_MINMAX) .  
c3f0: 20 20 20 26 26 20 28 70 57 69 6e 2d 3e 65 53 74     && (pWin->eSt
c400: 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  art!=TK_UNBOUNDE
c410: 44 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  D).    ){.      
c420: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c430: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
c440: 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74   pWin->regResult
c450: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c460: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
c470: 5f 4c 61 73 74 2c 20 70 57 69 6e 2d 3e 63 73 72  _Last, pWin->csr
c480: 41 70 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65  App);.      Vdbe
c490: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
c4a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c4b0: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
c4c0: 6e 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c  n, pWin->csrApp,
c4d0: 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73   0, pWin->regRes
c4e0: 75 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ult);.      sqli
c4f0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
c500: 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  v, sqlite3VdbeCu
c510: 72 72 65 6e 74 41 64 64 72 28 76 29 2d 32 29 3b  rrentAddr(v)-2);
c520: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
c530: 57 69 6e 2d 3e 72 65 67 41 70 70 20 29 7b 0a 20  Win->regApp ){. 
c540: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 57       assert( pMW
c550: 69 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f 77 69  in->regStartRowi
c560: 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73  d==0 );.    }els
c570: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 41 72  e{.      int nAr
c580: 67 20 3d 20 77 69 6e 64 6f 77 41 72 67 43 6f 75  g = windowArgCou
c590: 6e 74 28 70 57 69 6e 29 3b 0a 20 20 20 20 20 20  nt(pWin);.      
c5a0: 69 66 28 20 62 46 69 6e 20 29 7b 0a 20 20 20 20  if( bFin ){.    
c5b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c5c0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 67 67 46  ddOp2(v, OP_AggF
c5d0: 69 6e 61 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 41  inal, pWin->regA
c5e0: 63 63 75 6d 2c 20 6e 41 72 67 29 3b 0a 20 20 20  ccum, nArg);.   
c5f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c600: 41 70 70 65 6e 64 50 34 28 76 2c 20 70 57 69 6e  AppendP4(v, pWin
c610: 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43  ->pFunc, P4_FUNC
c620: 44 45 46 29 3b 0a 20 20 20 20 20 20 20 20 73 71  DEF);.        sq
c630: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
c640: 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 57 69 6e  v, OP_Copy, pWin
c650: 2d 3e 72 65 67 41 63 63 75 6d 2c 20 70 57 69 6e  ->regAccum, pWin
c660: 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20  ->regResult);.  
c670: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c680: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
c690: 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67  ll, 0, pWin->reg
c6a0: 41 63 63 75 6d 29 3b 0a 20 20 20 20 20 20 7d 65  Accum);.      }e
c6b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
c6c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
c6d0: 2c 20 4f 50 5f 41 67 67 56 61 6c 75 65 2c 70 57  , OP_AggValue,pW
c6e0: 69 6e 2d 3e 72 65 67 41 63 63 75 6d 2c 6e 41 72  in->regAccum,nAr
c6f0: 67 2c 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c  g,pWin->regResul
c700: 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
c710: 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
c720: 76 2c 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2c 20  v, pWin->pFunc, 
c730: 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P4_FUNCDEF);.   
c740: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
c750: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
c760: 20 63 6f 64 65 20 74 6f 20 63 61 6c 63 75 6c 61   code to calcula
c770: 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  te the current v
c780: 61 6c 75 65 73 20 6f 66 20 61 6c 6c 20 77 69 6e  alues of all win
c790: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e  dow functions in
c7a0: 20 74 68 65 0a 2a 2a 20 70 2d 3e 70 4d 57 69 6e   the.** p->pMWin
c7b0: 20 6c 69 73 74 20 62 79 20 64 6f 69 6e 67 20 61   list by doing a
c7c0: 20 66 75 6c 6c 20 73 63 61 6e 20 6f 66 20 74 68   full scan of th
c7d0: 65 20 63 75 72 72 65 6e 74 20 77 69 6e 64 6f 77  e current window
c7e0: 20 66 72 61 6d 65 2e 20 53 74 6f 72 65 20 74 68   frame. Store th
c7f0: 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20  e.** results in 
c800: 74 68 65 20 57 69 6e 64 6f 77 2e 72 65 67 52 65  the Window.regRe
c810: 73 75 6c 74 20 72 65 67 69 73 74 65 72 73 2c 20  sult registers, 
c820: 72 65 61 64 79 20 74 6f 20 72 65 74 75 72 6e 20  ready to return 
c830: 74 68 65 20 75 70 70 65 72 0a 2a 2a 20 6c 61 79  the upper.** lay
c840: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
c850: 69 64 20 77 69 6e 64 6f 77 46 75 6c 6c 53 63 61  id windowFullSca
c860: 6e 28 57 69 6e 64 6f 77 43 6f 64 65 41 72 67 20  n(WindowCodeArg 
c870: 2a 70 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70  *p){.  Window *p
c880: 57 69 6e 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  Win;.  Parse *pP
c890: 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65  arse = p->pParse
c8a0: 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69  ;.  Window *pMWi
c8b0: 6e 20 3d 20 70 2d 3e 70 4d 57 69 6e 3b 0a 20 20  n = p->pMWin;.  
c8c0: 56 64 62 65 20 2a 76 20 3d 20 70 2d 3e 70 56 64  Vdbe *v = p->pVd
c8d0: 62 65 3b 0a 0a 20 20 69 6e 74 20 72 65 67 43 52  be;..  int regCR
c8e0: 6f 77 69 64 20 3d 20 30 3b 20 20 20 20 20 20 20  owid = 0;       
c8f0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
c900: 74 20 72 6f 77 69 64 20 76 61 6c 75 65 20 2a 2f  t rowid value */
c910: 0a 20 20 69 6e 74 20 72 65 67 43 50 65 65 72 20  .  int regCPeer 
c920: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
c930: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 70 65     /* Current pe
c940: 65 72 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69  er values */.  i
c950: 6e 74 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b  nt regRowid = 0;
c960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c970: 2a 20 41 67 67 53 74 65 70 20 72 6f 77 69 64 20  * AggStep rowid 
c980: 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 72  value */.  int r
c990: 65 67 50 65 65 72 20 3d 20 30 3b 20 20 20 20 20  egPeer = 0;     
c9a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 67             /* Ag
c9b0: 67 53 74 65 70 20 70 65 65 72 20 76 61 6c 75 65  gStep peer value
c9c0: 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 50 65 65  s */..  int nPee
c9d0: 72 3b 0a 20 20 69 6e 74 20 6c 62 6c 4e 65 78 74  r;.  int lblNext
c9e0: 3b 0a 20 20 69 6e 74 20 6c 62 6c 42 72 6b 3b 0a  ;.  int lblBrk;.
c9f0: 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 3b 0a    int addrNext;.
ca00: 20 20 69 6e 74 20 63 73 72 3b 0a 0a 20 20 61 73    int csr;..  as
ca10: 73 65 72 74 28 20 70 4d 57 69 6e 21 3d 30 20 29  sert( pMWin!=0 )
ca20: 3b 0a 20 20 63 73 72 20 3d 20 70 4d 57 69 6e 2d  ;.  csr = pMWin-
ca30: 3e 63 73 72 41 70 70 3b 0a 20 20 6e 50 65 65 72  >csrApp;.  nPeer
ca40: 20 3d 20 28 70 4d 57 69 6e 2d 3e 70 4f 72 64 65   = (pMWin->pOrde
ca50: 72 42 79 20 3f 20 70 4d 57 69 6e 2d 3e 70 4f 72  rBy ? pMWin->pOr
ca60: 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30  derBy->nExpr : 0
ca70: 29 3b 0a 0a 20 20 6c 62 6c 4e 65 78 74 20 3d 20  );..  lblNext = 
ca80: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
ca90: 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  abel(pParse);.  
caa0: 6c 62 6c 42 72 6b 20 3d 20 73 71 6c 69 74 65 33  lblBrk = sqlite3
cab0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
cac0: 61 72 73 65 29 3b 0a 0a 20 20 72 65 67 43 52 6f  arse);..  regCRo
cad0: 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74  wid = sqlite3Get
cae0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
caf0: 0a 20 20 72 65 67 52 6f 77 69 64 20 3d 20 73 71  .  regRowid = sq
cb00: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
cb10: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 6e  pParse);.  if( n
cb20: 50 65 65 72 20 29 7b 0a 20 20 20 20 72 65 67 43  Peer ){.    regC
cb30: 50 65 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65  Peer = sqlite3Ge
cb40: 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
cb50: 65 2c 20 6e 50 65 65 72 29 3b 0a 20 20 20 20 72  e, nPeer);.    r
cb60: 65 67 50 65 65 72 20 3d 20 73 71 6c 69 74 65 33  egPeer = sqlite3
cb70: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
cb80: 72 73 65 2c 20 6e 50 65 65 72 29 3b 0a 20 20 7d  rse, nPeer);.  }
cb90: 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ..  sqlite3VdbeA
cba0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69  ddOp2(v, OP_Rowi
cbb0: 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  d, pMWin->iEphCs
cbc0: 72 2c 20 72 65 67 43 52 6f 77 69 64 29 3b 0a 20  r, regCRowid);. 
cbd0: 20 77 69 6e 64 6f 77 52 65 61 64 50 65 65 72 56   windowReadPeerV
cbe0: 61 6c 75 65 73 28 70 2c 20 70 4d 57 69 6e 2d 3e  alues(p, pMWin->
cbf0: 69 45 70 68 43 73 72 2c 20 72 65 67 43 50 65 65  iEphCsr, regCPee
cc00: 72 29 3b 0a 0a 20 20 66 6f 72 28 70 57 69 6e 3d  r);..  for(pWin=
cc10: 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69  pMWin; pWin; pWi
cc20: 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e  n=pWin->pNextWin
cc30: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
cc40: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
cc50: 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65  ull, 0, pWin->re
cc60: 67 41 63 63 75 6d 29 3b 0a 20 20 7d 0a 0a 20 20  gAccum);.  }..  
cc70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cc80: 33 28 76 2c 20 4f 50 5f 53 65 65 6b 47 45 2c 20  3(v, OP_SeekGE, 
cc90: 63 73 72 2c 20 6c 62 6c 42 72 6b 2c 20 70 4d 57  csr, lblBrk, pMW
cca0: 69 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f 77 69  in->regStartRowi
ccb0: 64 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61  d);.  VdbeCovera
ccc0: 67 65 28 76 29 3b 0a 20 20 61 64 64 72 4e 65 78  ge(v);.  addrNex
ccd0: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
cce0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
ccf0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
cd00: 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20  p2(v, OP_Rowid, 
cd10: 63 73 72 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  csr, regRowid);.
cd20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
cd30: 4f 70 33 28 76 2c 20 4f 50 5f 47 74 2c 20 70 4d  Op3(v, OP_Gt, pM
cd40: 57 69 6e 2d 3e 72 65 67 45 6e 64 52 6f 77 69 64  Win->regEndRowid
cd50: 2c 20 6c 62 6c 42 72 6b 2c 20 72 65 67 52 6f 77  , lblBrk, regRow
cd60: 69 64 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72  id);.  VdbeCover
cd70: 61 67 65 4e 65 76 65 72 4e 75 6c 6c 28 76 29 3b  ageNeverNull(v);
cd80: 0a 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65  ..  if( pMWin->e
cd90: 45 78 63 6c 75 64 65 3d 3d 54 4b 5f 43 55 52 52  Exclude==TK_CURR
cda0: 45 4e 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ENT ){.    sqlit
cdb0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
cdc0: 4f 50 5f 45 71 2c 20 72 65 67 43 52 6f 77 69 64  OP_Eq, regCRowid
cdd0: 2c 20 6c 62 6c 4e 65 78 74 2c 20 72 65 67 52 6f  , lblNext, regRo
cde0: 77 69 64 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  wid);.    VdbeCo
cdf0: 76 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c 28  verageNeverNull(
ce00: 76 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  v);.  }else if( 
ce10: 70 4d 57 69 6e 2d 3e 65 45 78 63 6c 75 64 65 21  pMWin->eExclude!
ce20: 3d 54 4b 5f 4e 4f 20 29 7b 0a 20 20 20 20 69 6e  =TK_NO ){.    in
ce30: 74 20 61 64 64 72 3b 0a 20 20 20 20 69 6e 74 20  t addr;.    int 
ce40: 61 64 64 72 45 71 20 3d 20 30 3b 0a 20 20 20 20  addrEq = 0;.    
ce50: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
ce60: 6f 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  o = 0;..    if( 
ce70: 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20  pMWin->pOrderBy 
ce80: 29 7b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66  ){.      pKeyInf
ce90: 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
cea0: 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
ceb0: 50 61 72 73 65 2c 20 70 4d 57 69 6e 2d 3e 70 4f  Parse, pMWin->pO
cec0: 72 64 65 72 42 79 2c 20 30 2c 20 30 29 3b 0a 20  rderBy, 0, 0);. 
ced0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4d 57     }.    if( pMW
cee0: 69 6e 2d 3e 65 45 78 63 6c 75 64 65 3d 3d 54 4b  in->eExclude==TK
cef0: 5f 54 49 45 53 20 29 7b 0a 20 20 20 20 20 20 61  _TIES ){.      a
cf00: 64 64 72 45 71 20 3d 20 73 71 6c 69 74 65 33 56  ddrEq = sqlite3V
cf10: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
cf20: 45 71 2c 20 72 65 67 43 52 6f 77 69 64 2c 20 30  Eq, regCRowid, 0
cf30: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
cf40: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e     VdbeCoverageN
cf50: 65 76 65 72 4e 75 6c 6c 28 76 29 3b 0a 20 20 20  everNull(v);.   
cf60: 20 7d 0a 20 20 20 20 69 66 28 20 70 4b 65 79 49   }.    if( pKeyI
cf70: 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 77 69 6e  nfo ){.      win
cf80: 64 6f 77 52 65 61 64 50 65 65 72 56 61 6c 75 65  dowReadPeerValue
cf90: 73 28 70 2c 20 63 73 72 2c 20 72 65 67 50 65 65  s(p, csr, regPee
cfa0: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
cfb0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
cfc0: 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67 50 65  P_Compare, regPe
cfd0: 65 72 2c 20 72 65 67 43 50 65 65 72 2c 20 6e 50  er, regCPeer, nP
cfe0: 65 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eer);.      sqli
cff0: 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
d000: 76 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e  v, (void*)pKeyIn
d010: 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
d020: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
d030: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
d040: 41 64 64 72 28 76 29 2b 31 3b 0a 20 20 20 20 20  Addr(v)+1;.     
d050: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d060: 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61  p3(v, OP_Jump, a
d070: 64 64 72 2c 20 6c 62 6c 4e 65 78 74 2c 20 61 64  ddr, lblNext, ad
d080: 64 72 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  dr);.      VdbeC
d090: 6f 76 65 72 61 67 65 45 71 4e 65 28 76 29 3b 0a  overageEqNe(v);.
d0a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d0b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d0c0: 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
d0d0: 2c 20 6c 62 6c 4e 65 78 74 29 3b 0a 20 20 20 20  , lblNext);.    
d0e0: 7d 0a 20 20 20 20 69 66 28 20 61 64 64 72 45 71  }.    if( addrEq
d0f0: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75   ) sqlite3VdbeJu
d100: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 45 71  mpHere(v, addrEq
d110: 29 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 64 6f 77  );.  }..  window
d120: 41 67 67 53 74 65 70 28 70 50 61 72 73 65 2c 20  AggStep(pParse, 
d130: 70 4d 57 69 6e 2c 20 63 73 72 2c 20 30 2c 20 70  pMWin, csr, 0, p
d140: 2d 3e 72 65 67 41 72 67 29 3b 0a 0a 20 20 73 71  ->regArg);..  sq
d150: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
d160: 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 4e 65 78 74  Label(v, lblNext
d170: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
d180: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
d190: 74 2c 20 63 73 72 2c 20 61 64 64 72 4e 65 78 74  t, csr, addrNext
d1a0: 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67  );.  VdbeCoverag
d1b0: 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
d1c0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
d1d0: 64 64 72 4e 65 78 74 2d 31 29 3b 0a 20 20 73 71  ddrNext-1);.  sq
d1e0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
d1f0: 65 28 76 2c 20 61 64 64 72 4e 65 78 74 2b 31 29  e(v, addrNext+1)
d200: 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
d210: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
d220: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 73  , regRowid);.  s
d230: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
d240: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
d250: 43 52 6f 77 69 64 29 3b 0a 20 20 69 66 28 20 6e  CRowid);.  if( n
d260: 50 65 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  Peer ){.    sqli
d270: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
d280: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 50  nge(pParse, regP
d290: 65 65 72 2c 20 6e 50 65 65 72 29 3b 0a 20 20 20  eer, nPeer);.   
d2a0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
d2b0: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
d2c0: 20 72 65 67 43 50 65 65 72 2c 20 6e 50 65 65 72   regCPeer, nPeer
d2d0: 29 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 64 6f 77  );.  }..  window
d2e0: 41 67 67 46 69 6e 61 6c 28 70 2c 20 31 29 3b 0a  AggFinal(p, 1);.
d2f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
d300: 74 68 65 20 73 75 62 2d 72 6f 75 74 69 6e 65 20  the sub-routine 
d310: 61 74 20 72 65 67 47 6f 73 75 62 20 28 67 65 6e  at regGosub (gen
d320: 65 72 61 74 65 64 20 62 79 20 63 6f 64 65 20 69  erated by code i
d330: 6e 20 73 65 6c 65 63 74 2e 63 29 20 74 6f 0a 2a  n select.c) to.*
d340: 2a 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72  * return the cur
d350: 72 65 6e 74 20 72 6f 77 20 6f 66 20 57 69 6e 64  rent row of Wind
d360: 6f 77 2e 69 45 70 68 43 73 72 2e 20 49 66 20 61  ow.iEphCsr. If a
d370: 6c 6c 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  ll window functi
d380: 6f 6e 73 20 61 72 65 0a 2a 2a 20 61 67 67 72 65  ons are.** aggre
d390: 67 61 74 65 20 77 69 6e 64 6f 77 20 66 75 6e 63  gate window func
d3a0: 74 69 6f 6e 73 20 74 68 61 74 20 75 73 65 20 74  tions that use t
d3b0: 68 65 20 73 74 61 6e 64 61 72 64 20 41 50 49 2c  he standard API,
d3c0: 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 4f 50 5f   a single.** OP_
d3d0: 47 6f 73 75 62 20 69 6e 73 74 72 75 63 74 69 6f  Gosub instructio
d3e0: 6e 20 69 73 20 61 6c 6c 20 74 68 61 74 20 74 68  n is all that th
d3f0: 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
d400: 61 74 65 73 2e 20 45 78 74 72 61 20 56 4d 20 63  ates. Extra VM c
d410: 6f 64 65 0a 2a 2a 20 66 6f 72 20 70 65 72 2d 72  ode.** for per-r
d420: 6f 77 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73  ow processing is
d430: 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65 64 20   only generated 
d440: 66 6f 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  for the followin
d450: 67 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  g built-in windo
d460: 77 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 3a 0a  w.** functions:.
d470: 2a 2a 0a 2a 2a 20 20 20 6e 74 68 5f 76 61 6c 75  **.**   nth_valu
d480: 65 28 29 0a 2a 2a 20 20 20 66 69 72 73 74 5f 76  e().**   first_v
d490: 61 6c 75 65 28 29 0a 2a 2a 20 20 20 6c 61 67 28  alue().**   lag(
d4a0: 29 0a 2a 2a 20 20 20 6c 65 61 64 28 29 0a 2a 2f  ).**   lead().*/
d4b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
d4c0: 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52 6f 77 28  dowReturnOneRow(
d4d0: 57 69 6e 64 6f 77 43 6f 64 65 41 72 67 20 2a 70  WindowCodeArg *p
d4e0: 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57  ){.  Window *pMW
d4f0: 69 6e 20 3d 20 70 2d 3e 70 4d 57 69 6e 3b 0a 20  in = p->pMWin;. 
d500: 20 56 64 62 65 20 2a 76 20 3d 20 70 2d 3e 70 56   Vdbe *v = p->pV
d510: 64 62 65 3b 0a 0a 20 20 69 66 28 20 70 4d 57 69  dbe;..  if( pMWi
d520: 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f 77 69 64  n->regStartRowid
d530: 20 29 7b 0a 20 20 20 20 77 69 6e 64 6f 77 46 75   ){.    windowFu
d540: 6c 6c 53 63 61 6e 28 70 29 3b 0a 20 20 7d 65 6c  llScan(p);.  }el
d550: 73 65 7b 0a 20 20 20 20 50 61 72 73 65 20 2a 70  se{.    Parse *p
d560: 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73  Parse = p->pPars
d570: 65 3b 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a 70  e;.    Window *p
d580: 57 69 6e 3b 0a 0a 20 20 20 20 66 6f 72 28 70 57  Win;..    for(pW
d590: 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20  in=pMWin; pWin; 
d5a0: 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74  pWin=pWin->pNext
d5b0: 57 69 6e 29 7b 0a 20 20 20 20 20 20 46 75 6e 63  Win){.      Func
d5c0: 44 65 66 20 2a 70 46 75 6e 63 20 3d 20 70 57 69  Def *pFunc = pWi
d5d0: 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20  n->pFunc;.      
d5e0: 69 66 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65  if( pFunc->zName
d5f0: 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 0a  ==nth_valueName.
d600: 20 20 20 20 20 20 20 7c 7c 20 70 46 75 6e 63 2d         || pFunc-
d610: 3e 7a 4e 61 6d 65 3d 3d 66 69 72 73 74 5f 76 61  >zName==first_va
d620: 6c 75 65 4e 61 6d 65 0a 20 20 20 20 20 20 29 7b  lueName.      ){
d630: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 73 72  .        int csr
d640: 20 3d 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 3b   = pWin->csrApp;
d650: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 62 6c  .        int lbl
d660: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
d670: 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
d680: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 6d 70  .        int tmp
d690: 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Reg = sqlite3Get
d6a0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
d6b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d6c0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
d6d0: 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e  _Null, 0, pWin->
d6e0: 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 0a 20  regResult);.  . 
d6f0: 20 20 20 20 20 20 20 69 66 28 20 70 46 75 6e 63         if( pFunc
d700: 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c  ->zName==nth_val
d710: 75 65 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  ueName ){.      
d720: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d730: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
d740: 6d 6e 2c 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  mn,pMWin->iEphCs
d750: 72 2c 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b  r,pWin->iArgCol+
d760: 31 2c 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20  1,tmpReg);.     
d770: 20 20 20 20 20 77 69 6e 64 6f 77 43 68 65 63 6b       windowCheck
d780: 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 74 6d  Value(pParse, tm
d790: 70 52 65 67 2c 20 32 29 3b 0a 20 20 20 20 20 20  pReg, 2);.      
d7a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d7b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d7c0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
d7d0: 65 72 2c 20 31 2c 20 74 6d 70 52 65 67 29 3b 0a  er, 1, tmpReg);.
d7e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d7f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d800: 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20 74  Op3(v, OP_Add, t
d810: 6d 70 52 65 67 2c 20 70 57 69 6e 2d 3e 72 65 67  mpReg, pWin->reg
d820: 41 70 70 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20  App, tmpReg);.  
d830: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d840: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 47 74  eAddOp3(v, OP_Gt
d850: 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31  , pWin->regApp+1
d860: 2c 20 6c 62 6c 2c 20 74 6d 70 52 65 67 29 3b 0a  , lbl, tmpReg);.
d870: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
d880: 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c 28 76 29  rageNeverNull(v)
d890: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
d8a0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
d8b0: 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 63 73 72  P_SeekRowid, csr
d8c0: 2c 20 30 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20  , 0, tmpReg);.  
d8d0: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
d8e0: 67 65 4e 65 76 65 72 54 61 6b 65 6e 28 76 29 3b  geNeverTaken(v);
d8f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d900: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
d910: 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20 70 57  _Column, csr, pW
d920: 69 6e 2d 3e 69 41 72 67 43 6f 6c 2c 20 70 57 69  in->iArgCol, pWi
d930: 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20  n->regResult);. 
d940: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d950: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
d960: 2c 20 6c 62 6c 29 3b 0a 20 20 20 20 20 20 20 20  , lbl);.        
d970: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
d980: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 74 6d  mpReg(pParse, tm
d990: 70 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pReg);.      }. 
d9a0: 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 46       else if( pF
d9b0: 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64  unc->zName==lead
d9c0: 4e 61 6d 65 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a  Name || pFunc->z
d9d0: 4e 61 6d 65 3d 3d 6c 61 67 4e 61 6d 65 20 29 7b  Name==lagName ){
d9e0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 41 72  .        int nAr
d9f0: 67 20 3d 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72  g = pWin->pOwner
da00: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
da10: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 73  ;.        int cs
da20: 72 20 3d 20 70 57 69 6e 2d 3e 63 73 72 41 70 70  r = pWin->csrApp
da30: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 62  ;.        int lb
da40: 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  l = sqlite3VdbeM
da50: 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
da60: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 6d  ;.        int tm
da70: 70 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65  pReg = sqlite3Ge
da80: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
da90: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 45  ;.        int iE
daa0: 70 68 20 3d 20 70 4d 57 69 6e 2d 3e 69 45 70 68  ph = pMWin->iEph
dab0: 43 73 72 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  Csr;.  .        
dac0: 69 66 28 20 6e 41 72 67 3c 33 20 29 7b 0a 20 20  if( nArg<3 ){.  
dad0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
dae0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
daf0: 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72  Null, 0, pWin->r
db00: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
db10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
db20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
db30: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
db40: 6d 6e 2c 20 69 45 70 68 2c 70 57 69 6e 2d 3e 69  mn, iEph,pWin->i
db50: 41 72 67 43 6f 6c 2b 32 2c 70 57 69 6e 2d 3e 72  ArgCol+2,pWin->r
db60: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
db70: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
db80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
db90: 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 45 70 68  , OP_Rowid, iEph
dba0: 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20  , tmpReg);.     
dbb0: 20 20 20 69 66 28 20 6e 41 72 67 3c 32 20 29 7b     if( nArg<2 ){
dbc0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 76  .          int v
dbd0: 61 6c 20 3d 20 28 70 46 75 6e 63 2d 3e 7a 4e 61  al = (pFunc->zNa
dbe0: 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65 20 3f 20 31  me==leadName ? 1
dbf0: 20 3a 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20   : -1);.        
dc00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
dc10: 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
dc20: 2c 20 74 6d 70 52 65 67 2c 20 76 61 6c 29 3b 0a  , tmpReg, val);.
dc30: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
dc40: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70 20           int op 
dc50: 3d 20 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d  = (pFunc->zName=
dc60: 3d 6c 65 61 64 4e 61 6d 65 20 3f 20 4f 50 5f 41  =leadName ? OP_A
dc70: 64 64 20 3a 20 4f 50 5f 53 75 62 74 72 61 63 74  dd : OP_Subtract
dc80: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  );.          int
dc90: 20 74 6d 70 52 65 67 32 20 3d 20 73 71 6c 69 74   tmpReg2 = sqlit
dca0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
dcb0: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rse);.          
dcc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dcd0: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
dce0: 69 45 70 68 2c 20 70 57 69 6e 2d 3e 69 41 72 67  iEph, pWin->iArg
dcf0: 43 6f 6c 2b 31 2c 20 74 6d 70 52 65 67 32 29 3b  Col+1, tmpReg2);
dd00: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
dd10: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
dd20: 6f 70 2c 20 74 6d 70 52 65 67 32 2c 20 74 6d 70  op, tmpReg2, tmp
dd30: 52 65 67 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20  Reg, tmpReg);.  
dd40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
dd50: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
dd60: 61 72 73 65 2c 20 74 6d 70 52 65 67 32 29 3b 0a  arse, tmpReg2);.
dd70: 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20          }.  .   
dd80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dd90: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65  AddOp3(v, OP_See
dda0: 6b 52 6f 77 69 64 2c 20 63 73 72 2c 20 6c 62 6c  kRowid, csr, lbl
ddb0: 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20  , tmpReg);.     
ddc0: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
ddd0: 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
dde0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
ddf0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c   OP_Column, csr,
de00: 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2c 20   pWin->iArgCol, 
de10: 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29  pWin->regResult)
de20: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
de30: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
de40: 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20 20 20 20 20  l(v, lbl);.     
de50: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
de60: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
de70: 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20 20   tmpReg);.      
de80: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  }.    }.  }.  sq
de90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
dea0: 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 2d 3e  v, OP_Gosub, p->
deb0: 72 65 67 47 6f 73 75 62 2c 20 70 2d 3e 61 64 64  regGosub, p->add
dec0: 72 47 6f 73 75 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rGosub);.}../*.*
ded0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
dee0: 74 6f 20 73 65 74 20 74 68 65 20 61 63 63 75 6d  to set the accum
def0: 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 20  ulator register 
df00: 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77 20  for each window 
df10: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74  function.** in t
df20: 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 70  he linked list p
df30: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
df40: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
df50: 4e 55 4c 4c 2e 20 41 6e 64 20 70 65 72 66 6f 72  NULL. And perfor
df60: 6d 0a 2a 2a 20 61 6e 79 20 65 71 75 69 76 61 6c  m.** any equival
df70: 65 6e 74 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  ent initializati
df80: 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 61  on required by a
df90: 6e 79 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64  ny built-in wind
dfa0: 6f 77 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20  ow functions.** 
dfb0: 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a  in the list..*/.
dfc0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 64 6f  static int windo
dfd0: 77 49 6e 69 74 41 63 63 75 6d 28 50 61 72 73 65  wInitAccum(Parse
dfe0: 20 2a 70 50 61 72 73 65 2c 20 57 69 6e 64 6f 77   *pParse, Window
dff0: 20 2a 70 4d 57 69 6e 29 7b 0a 20 20 56 64 62 65   *pMWin){.  Vdbe
e000: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
e010: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
e020: 69 6e 74 20 72 65 67 41 72 67 3b 0a 20 20 69 6e  int regArg;.  in
e030: 74 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 57 69  t nArg = 0;.  Wi
e040: 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 66 6f  ndow *pWin;.  fo
e050: 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57  r(pWin=pMWin; pW
e060: 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70  in; pWin=pWin->p
e070: 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 46 75  NextWin){.    Fu
e080: 6e 63 44 65 66 20 2a 70 46 75 6e 63 20 3d 20 70  ncDef *pFunc = p
e090: 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20  Win->pFunc;.    
e0a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e0b0: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
e0c0: 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 29   pWin->regAccum)
e0d0: 3b 0a 20 20 20 20 6e 41 72 67 20 3d 20 4d 41 58  ;.    nArg = MAX
e0e0: 28 6e 41 72 67 2c 20 77 69 6e 64 6f 77 41 72 67  (nArg, windowArg
e0f0: 43 6f 75 6e 74 28 70 57 69 6e 29 29 3b 0a 20 20  Count(pWin));.  
e100: 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 72 65 67    if( pMWin->reg
e110: 53 74 61 72 74 52 6f 77 69 64 3d 3d 30 20 29 7b  StartRowid==0 ){
e120: 0a 20 20 20 20 20 20 69 66 28 20 70 46 75 6e 63  .      if( pFunc
e130: 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c  ->zName==nth_val
e140: 75 65 4e 61 6d 65 20 7c 7c 20 70 46 75 6e 63 2d  ueName || pFunc-
e150: 3e 7a 4e 61 6d 65 3d 3d 66 69 72 73 74 5f 76 61  >zName==first_va
e160: 6c 75 65 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  lueName ){.     
e170: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e180: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
e190: 65 72 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67  er, 0, pWin->reg
e1a0: 41 70 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71  App);.        sq
e1b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
e1c0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
e1d0: 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31  , pWin->regApp+1
e1e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
e1f0: 20 20 69 66 28 20 28 70 46 75 6e 63 2d 3e 66 75    if( (pFunc->fu
e200: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
e210: 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 20 26 26  _FUNC_MINMAX) &&
e220: 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 20 29 7b   pWin->csrApp ){
e230: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
e240: 20 70 57 69 6e 2d 3e 65 53 74 61 72 74 21 3d 54   pWin->eStart!=T
e250: 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 3b 0a 20  K_UNBOUNDED );. 
e260: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
e270: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
e280: 65 73 65 74 53 6f 72 74 65 72 2c 20 70 57 69 6e  esetSorter, pWin
e290: 2d 3e 63 73 72 41 70 70 29 3b 0a 20 20 20 20 20  ->csrApp);.     
e2a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e2b0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
e2c0: 65 72 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67  er, 0, pWin->reg
e2d0: 41 70 70 2b 31 29 3b 0a 20 20 20 20 20 20 7d 0a  App+1);.      }.
e2e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 67 41      }.  }.  regA
e2f0: 72 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  rg = pParse->nMe
e300: 6d 2b 31 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  m+1;.  pParse->n
e310: 4d 65 6d 20 2b 3d 20 6e 41 72 67 3b 0a 20 20 72  Mem += nArg;.  r
e320: 65 74 75 72 6e 20 72 65 67 41 72 67 3b 0a 7d 0a  eturn regArg;.}.
e330: 0a 2f 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ./* .** Return t
e340: 72 75 65 20 69 66 20 74 68 65 20 63 75 72 72 65  rue if the curre
e350: 6e 74 20 66 72 61 6d 65 20 73 68 6f 75 6c 64 20  nt frame should 
e360: 62 65 20 63 61 63 68 65 64 20 69 6e 20 74 68 65  be cached in the
e370: 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
e380: 2c 0a 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 65  ,.** even if the
e390: 72 65 20 61 72 65 20 6e 6f 20 78 49 6e 76 65 72  re are no xInver
e3a0: 73 65 28 29 20 63 61 6c 6c 73 20 72 65 71 75 69  se() calls requi
e3b0: 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
e3c0: 6e 74 20 77 69 6e 64 6f 77 43 61 63 68 65 46 72  nt windowCacheFr
e3d0: 61 6d 65 28 57 69 6e 64 6f 77 20 2a 70 4d 57 69  ame(Window *pMWi
e3e0: 6e 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57  n){.  Window *pW
e3f0: 69 6e 3b 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d  in;.  if( pMWin-
e400: 3e 72 65 67 53 74 61 72 74 52 6f 77 69 64 20 29  >regStartRowid )
e410: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72   return 1;.  for
e420: 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69  (pWin=pMWin; pWi
e430: 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e  n; pWin=pWin->pN
e440: 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 46 75 6e  extWin){.    Fun
e450: 63 44 65 66 20 2a 70 46 75 6e 63 20 3d 20 70 57  cDef *pFunc = pW
e460: 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 69  in->pFunc;.    i
e470: 66 28 20 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65  f( (pFunc->zName
e480: 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 29  ==nth_valueName)
e490: 0a 20 20 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d  .     || (pFunc-
e4a0: 3e 7a 4e 61 6d 65 3d 3d 66 69 72 73 74 5f 76 61  >zName==first_va
e4b0: 6c 75 65 4e 61 6d 65 29 0a 20 20 20 20 20 7c 7c  lueName).     ||
e4c0: 20 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d   (pFunc->zName==
e4d0: 6c 65 61 64 4e 61 6d 65 29 0a 20 20 20 20 20 7c  leadName).     |
e4e0: 7c 20 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d  | (pFunc->zName=
e4f0: 3d 6c 61 67 4e 61 6d 65 29 0a 20 20 20 20 29 7b  =lagName).    ){
e500: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
e510: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
e520: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
e530: 72 65 67 4f 6c 64 20 61 6e 64 20 72 65 67 4e 65  regOld and regNe
e540: 77 20 61 72 65 20 65 61 63 68 20 74 68 65 20 66  w are each the f
e550: 69 72 73 74 20 72 65 67 69 73 74 65 72 20 69 6e  irst register in
e560: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 73 69 7a   an array of siz
e570: 65 0a 2a 2a 20 70 4f 72 64 65 72 42 79 2d 3e 6e  e.** pOrderBy->n
e580: 45 78 70 72 2e 20 54 68 69 73 20 66 75 6e 63 74  Expr. This funct
e590: 69 6f 6e 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ion generates co
e5a0: 64 65 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 68  de to compare th
e5b0: 65 20 74 77 6f 0a 2a 2a 20 61 72 72 61 79 73 20  e two.** arrays 
e5c0: 6f 66 20 72 65 67 69 73 74 65 72 73 20 75 73 69  of registers usi
e5d0: 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  ng the collation
e5e0: 20 73 65 71 75 65 6e 63 65 73 20 61 6e 64 20 6f   sequences and o
e5f0: 74 68 65 72 20 63 6f 6d 70 61 72 69 73 6f 6e 0a  ther comparison.
e600: 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 20 73 70  ** parameters sp
e610: 65 63 69 66 69 65 64 20 62 79 20 70 4f 72 64 65  ecified by pOrde
e620: 72 42 79 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rBy. .**.** If t
e630: 68 65 20 74 77 6f 20 61 72 72 61 79 73 20 61 72  he two arrays ar
e640: 65 20 6e 6f 74 20 65 71 75 61 6c 2c 20 74 68 65  e not equal, the
e650: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 72 65 67   contents of reg
e660: 4e 65 77 20 69 73 20 63 6f 70 69 65 64 20 74 6f  New is copied to
e670: 20 0a 2a 2a 20 72 65 67 4f 6c 64 20 61 6e 64 20   .** regOld and 
e680: 63 6f 6e 74 72 6f 6c 20 66 61 6c 6c 73 20 74 68  control falls th
e690: 72 6f 75 67 68 2e 20 4f 74 68 65 72 77 69 73 65  rough. Otherwise
e6a0: 2c 20 69 66 20 74 68 65 20 63 6f 6e 74 65 6e 74  , if the content
e6b0: 73 20 6f 66 20 74 68 65 20 61 72 72 61 79 73 0a  s of the arrays.
e6c0: 2a 2a 20 61 72 65 20 65 71 75 61 6c 2c 20 61 6e  ** are equal, an
e6d0: 20 4f 50 5f 47 6f 74 6f 20 69 73 20 65 78 65 63   OP_Goto is exec
e6e0: 75 74 65 64 2e 20 54 68 65 20 61 64 64 72 65 73  uted. The addres
e6f0: 73 20 6f 66 20 74 68 65 20 4f 50 5f 47 6f 74 6f  s of the OP_Goto
e700: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
e710: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
e720: 64 6f 77 49 66 4e 65 77 50 65 65 72 28 0a 20 20  dowIfNewPeer(.  
e730: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20  Parse *pParse,. 
e740: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
e750: 72 42 79 2c 0a 20 20 69 6e 74 20 72 65 67 4e 65  rBy,.  int regNe
e760: 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w,              
e770: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
e780: 69 6e 20 61 72 72 61 79 20 6f 66 20 6e 65 77 20  in array of new 
e790: 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20  values */.  int 
e7a0: 72 65 67 4f 6c 64 2c 20 20 20 20 20 20 20 20 20  regOld,         
e7b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
e7c0: 69 72 73 74 20 69 6e 20 61 72 72 61 79 20 6f 66  irst in array of
e7d0: 20 6f 6c 64 20 76 61 6c 75 65 73 20 2a 2f 0a 20   old values */. 
e7e0: 20 69 6e 74 20 61 64 64 72 20 20 20 20 20 20 20   int addr       
e7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e800: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 2a 2f   /* Jump here */
e810: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
e820: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
e830: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 70 4f  Parse);.  if( pO
e840: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69 6e  rderBy ){.    in
e850: 74 20 6e 56 61 6c 20 3d 20 70 4f 72 64 65 72 42  t nVal = pOrderB
e860: 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 4b 65  y->nExpr;.    Ke
e870: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
e880: 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
e890: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
e8a0: 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 30  rse, pOrderBy, 0
e8b0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
e8c0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
e8d0: 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67 4f 6c  P_Compare, regOl
e8e0: 64 2c 20 72 65 67 4e 65 77 2c 20 6e 56 61 6c 29  d, regNew, nVal)
e8f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
e900: 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28 76 6f  eAppendP4(v, (vo
e910: 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  id*)pKeyInfo, P4
e920: 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73  _KEYINFO);.    s
e930: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
e940: 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 0a 20 20  (v, OP_Jump, .  
e950: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
e960: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31 2c  urrentAddr(v)+1,
e970: 20 61 64 64 72 2c 20 73 71 6c 69 74 65 33 56 64   addr, sqlite3Vd
e980: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
e990: 2b 31 0a 20 20 20 20 29 3b 0a 20 20 20 20 56 64  +1.    );.    Vd
e9a0: 62 65 43 6f 76 65 72 61 67 65 45 71 4e 65 28 76  beCoverageEqNe(v
e9b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
e9c0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
e9d0: 6f 70 79 2c 20 72 65 67 4e 65 77 2c 20 72 65 67  opy, regNew, reg
e9e0: 4f 6c 64 2c 20 6e 56 61 6c 2d 31 29 3b 0a 20 20  Old, nVal-1);.  
e9f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
ea00: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
ea10: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
ea20: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
ea30: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
ea40: 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20   called as part 
ea50: 6f 66 20 67 65 6e 65 72 61 74 69 6e 67 20 56 4d  of generating VM
ea60: 20 70 72 6f 67 72 61 6d 73 20 66 6f 72 20 52 41   programs for RA
ea70: 4e 47 45 0a 2a 2a 20 6f 66 66 73 65 74 20 50 52  NGE.** offset PR
ea80: 45 43 45 44 49 4e 47 2f 46 4f 4c 4c 4f 57 49 4e  ECEDING/FOLLOWIN
ea90: 47 20 66 72 61 6d 65 20 62 6f 75 6e 64 61 72 69  G frame boundari
eaa0: 65 73 2e 20 41 73 73 75 6d 69 6e 67 20 22 41 53  es. Assuming "AS
eab0: 43 22 20 6f 72 64 65 72 20 66 6f 72 0a 2a 2a 20  C" order for.** 
eac0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 74 65 72  the ORDER BY ter
ead0: 6d 20 69 6e 20 74 68 65 20 77 69 6e 64 6f 77 2c  m in the window,
eae0: 20 69 74 20 67 65 6e 65 72 61 74 65 73 20 63 6f   it generates co
eaf0: 64 65 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  de equivalent to
eb00: 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 63 73  :.**.**   if( cs
eb10: 72 31 2e 70 65 65 72 56 61 6c 20 2b 20 72 65 67  r1.peerVal + reg
eb20: 56 61 6c 20 3e 3d 20 63 73 72 32 2e 70 65 65 72  Val >= csr2.peer
eb30: 56 61 6c 20 29 20 67 6f 74 6f 20 6c 62 6c 3b 0a  Val ) goto lbl;.
eb40: 2a 2a 0a 2a 2a 20 41 20 73 70 65 63 69 61 6c 20  **.** A special 
eb50: 74 79 70 65 20 6f 66 20 61 72 69 74 68 6d 65 74  type of arithmet
eb60: 69 63 20 69 73 20 75 73 65 64 20 73 75 63 68 20  ic is used such 
eb70: 74 68 61 74 20 69 66 20 63 73 72 2e 70 65 65 72  that if csr.peer
eb80: 56 61 6c 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20  Val is not.** a 
eb90: 6e 75 6d 65 72 69 63 20 74 79 70 65 20 28 72 65  numeric type (re
eba0: 61 6c 20 6f 72 20 69 6e 74 65 67 65 72 29 2c 20  al or integer), 
ebb0: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
ebc0: 6f 66 20 74 68 65 20 61 64 64 69 74 69 6f 6e 20  of the addition 
ebd0: 69 73 0a 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20  is.** a copy of 
ebe0: 63 73 72 31 2e 70 65 65 72 56 61 6c 2e 0a 2a 2f  csr1.peerVal..*/
ebf0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
ec00: 64 6f 77 43 6f 64 65 52 61 6e 67 65 54 65 73 74  dowCodeRangeTest
ec10: 28 0a 20 20 57 69 6e 64 6f 77 43 6f 64 65 41 72  (.  WindowCodeAr
ec20: 67 20 2a 70 2c 20 0a 20 20 69 6e 74 20 6f 70 2c  g *p, .  int op,
ec30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 50 5f            /* OP_
ec50: 47 65 20 6f 72 20 4f 50 5f 47 74 20 2a 2f 0a 20  Ge or OP_Gt */. 
ec60: 20 69 6e 74 20 63 73 72 31 2c 20 0a 20 20 69 6e   int csr1, .  in
ec70: 74 20 72 65 67 56 61 6c 2c 20 0a 20 20 69 6e 74  t regVal, .  int
ec80: 20 63 73 72 32 2c 0a 20 20 69 6e 74 20 6c 62 6c   csr2,.  int lbl
ec90: 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  .){.  Parse *pPa
eca0: 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b  rse = p->pParse;
ecb0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
ecc0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
ecd0: 73 65 29 3b 0a 20 20 69 6e 74 20 72 65 67 31 20  se);.  int reg1 
ece0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
ecf0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69  Reg(pParse);.  i
ed00: 6e 74 20 72 65 67 32 20 3d 20 73 71 6c 69 74 65  nt reg2 = sqlite
ed10: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
ed20: 73 65 29 3b 0a 20 20 69 6e 74 20 61 72 69 74 68  se);.  int arith
ed30: 20 3d 20 4f 50 5f 41 64 64 3b 0a 20 20 69 6e 74   = OP_Add;.  int
ed40: 20 61 64 64 72 47 65 3b 0a 0a 20 20 69 6e 74 20   addrGe;..  int 
ed50: 72 65 67 53 74 72 69 6e 67 20 3d 20 2b 2b 70 50  regString = ++pP
ed60: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 61  arse->nMem;..  a
ed70: 73 73 65 72 74 28 20 6f 70 3d 3d 4f 50 5f 47 65  ssert( op==OP_Ge
ed80: 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 7c 7c   || op==OP_Gt ||
ed90: 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20   op==OP_Le );.  
eda0: 61 73 73 65 72 74 28 20 70 2d 3e 70 4d 57 69 6e  assert( p->pMWin
edb0: 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70 2d  ->pOrderBy && p-
edc0: 3e 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79  >pMWin->pOrderBy
edd0: 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20  ->nExpr==1 );.  
ede0: 69 66 28 20 70 2d 3e 70 4d 57 69 6e 2d 3e 70 4f  if( p->pMWin->pO
edf0: 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 73 6f 72  rderBy->a[0].sor
ee00: 74 4f 72 64 65 72 20 29 7b 0a 20 20 20 20 73 77  tOrder ){.    sw
ee10: 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
ee20: 20 20 63 61 73 65 20 4f 50 5f 47 65 3a 20 6f 70    case OP_Ge: op
ee30: 20 3d 20 4f 50 5f 4c 65 3b 20 62 72 65 61 6b 3b   = OP_Le; break;
ee40: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 47  .      case OP_G
ee50: 74 3a 20 6f 70 20 3d 20 4f 50 5f 4c 74 3b 20 62  t: op = OP_Lt; b
ee60: 72 65 61 6b 3b 0a 20 20 20 20 20 20 64 65 66 61  reak;.      defa
ee70: 75 6c 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d  ult: assert( op=
ee80: 3d 4f 50 5f 4c 65 20 29 3b 20 6f 70 20 3d 20 4f  =OP_Le ); op = O
ee90: 50 5f 47 65 3b 20 62 72 65 61 6b 3b 0a 20 20 20  P_Ge; break;.   
eea0: 20 7d 0a 20 20 20 20 61 72 69 74 68 20 3d 20 4f   }.    arith = O
eeb0: 50 5f 53 75 62 74 72 61 63 74 3b 0a 20 20 7d 0a  P_Subtract;.  }.
eec0: 0a 20 20 77 69 6e 64 6f 77 52 65 61 64 50 65 65  .  windowReadPee
eed0: 72 56 61 6c 75 65 73 28 70 2c 20 63 73 72 31 2c  rValues(p, csr1,
eee0: 20 72 65 67 31 29 3b 0a 20 20 77 69 6e 64 6f 77   reg1);.  window
eef0: 52 65 61 64 50 65 65 72 56 61 6c 75 65 73 28 70  ReadPeerValues(p
ef00: 2c 20 63 73 72 32 2c 20 72 65 67 32 29 3b 0a 0a  , csr2, reg2);..
ef10: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
ef20: 65 20 70 65 65 72 20 76 61 6c 75 65 20 66 6f 72  e peer value for
ef30: 20 63 73 72 31 20 76 61 6c 75 65 20 69 73 20 61   csr1 value is a
ef40: 20 74 65 78 74 20 6f 72 20 62 6c 6f 62 20 62 79   text or blob by
ef50: 20 63 6f 6d 70 61 72 69 6e 67 0a 20 20 2a 2a 20   comparing.  ** 
ef60: 69 74 20 74 6f 20 74 68 65 20 73 6d 61 6c 6c 65  it to the smalle
ef70: 73 74 20 70 6f 73 73 69 62 6c 65 20 73 74 72 69  st possible stri
ef80: 6e 67 20 2d 20 27 27 2e 20 49 66 20 69 74 20 69  ng - ''. If it i
ef90: 73 2c 20 6a 75 6d 70 20 6f 76 65 72 20 74 68 65  s, jump over the
efa0: 0a 20 20 2a 2a 20 4f 50 5f 41 64 64 20 6f 72 20  .  ** OP_Add or 
efb0: 4f 50 5f 53 75 62 74 72 61 63 74 20 6f 70 65 72  OP_Subtract oper
efc0: 61 74 69 6f 6e 20 61 6e 64 20 70 72 6f 63 65 65  ation and procee
efd0: 64 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68  d directly to th
efe0: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 2a 2f  e comparison. */
eff0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
f000: 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e  dOp4(v, OP_Strin
f010: 67 38 2c 20 30 2c 20 72 65 67 53 74 72 69 6e 67  g8, 0, regString
f020: 2c 20 30 2c 20 22 22 2c 20 50 34 5f 53 54 41 54  , 0, "", P4_STAT
f030: 49 43 29 3b 0a 20 20 61 64 64 72 47 65 20 3d 20  IC);.  addrGe = 
f040: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f050: 33 28 76 2c 20 4f 50 5f 47 65 2c 20 72 65 67 53  3(v, OP_Ge, regS
f060: 74 72 69 6e 67 2c 20 30 2c 20 72 65 67 31 29 3b  tring, 0, reg1);
f070: 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  .  VdbeCoverage(
f080: 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
f090: 65 41 64 64 4f 70 33 28 76 2c 20 61 72 69 74 68  eAddOp3(v, arith
f0a0: 2c 20 72 65 67 56 61 6c 2c 20 72 65 67 31 2c 20  , regVal, reg1, 
f0b0: 72 65 67 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  reg1);.  sqlite3
f0c0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
f0d0: 61 64 64 72 47 65 29 3b 0a 20 20 73 71 6c 69 74  addrGe);.  sqlit
f0e0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
f0f0: 6f 70 2c 20 72 65 67 32 2c 20 6c 62 6c 2c 20 72  op, reg2, lbl, r
f100: 65 67 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eg1); VdbeCovera
f110: 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
f120: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
f130: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
f140: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 4f 50    assert( op==OP
f150: 5f 47 65 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74  _Ge || op==OP_Gt
f160: 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 7c 7c   || op==OP_Lt ||
f170: 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20   op==OP_Le );.  
f180: 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
f190: 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ge); VdbeCoverag
f1a0: 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 47 65  eIf(v, op==OP_Ge
f1b0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 6f 70  );.  testcase(op
f1c0: 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f  ==OP_Lt); VdbeCo
f1d0: 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
f1e0: 4f 50 5f 4c 74 29 3b 0a 20 20 74 65 73 74 63 61  OP_Lt);.  testca
f1f0: 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56  se(op==OP_Le); V
f200: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
f210: 20 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 74   op==OP_Le);.  t
f220: 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
f230: 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
f240: 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 47 74 29  If(v, op==OP_Gt)
f250: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  ;..  sqlite3Rele
f260: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
f270: 65 2c 20 72 65 67 31 29 3b 0a 20 20 73 71 6c 69  e, reg1);.  sqli
f280: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
f290: 67 28 70 50 61 72 73 65 2c 20 72 65 67 32 29 3b  g(pParse, reg2);
f2a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72  .}../*.** Helper
f2b0: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 73 71   function for sq
f2c0: 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 53  lite3WindowCodeS
f2d0: 74 65 70 28 29 2e 20 45 61 63 68 20 63 61 6c 6c  tep(). Each call
f2e0: 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
f2f0: 6e 0a 2a 2a 20 67 65 6e 65 72 61 74 65 73 20 56  n.** generates V
f300: 4d 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e  M code for a sin
f310: 67 6c 65 20 52 45 54 55 52 4e 5f 52 4f 57 2c 20  gle RETURN_ROW, 
f320: 41 47 47 53 54 45 50 20 6f 72 20 41 47 47 49 4e  AGGSTEP or AGGIN
f330: 56 45 52 53 45 20 0a 2a 2a 20 6f 70 65 72 61 74  VERSE .** operat
f340: 69 6f 6e 2e 20 52 65 66 65 72 20 74 6f 20 74 68  ion. Refer to th
f350: 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74  e header comment
f360: 20 66 6f 72 20 73 71 6c 69 74 65 33 57 69 6e 64   for sqlite3Wind
f370: 6f 77 43 6f 64 65 53 74 65 70 28 29 20 66 6f 72  owCodeStep() for
f380: 0a 2a 2a 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a  .** details..*/.
f390: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 64 6f  static int windo
f3a0: 77 43 6f 64 65 4f 70 28 0a 20 57 69 6e 64 6f 77  wCodeOp(. Window
f3b0: 43 6f 64 65 41 72 67 20 2a 70 2c 20 20 20 20 20  CodeArg *p,     
f3c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
f3d0: 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 2a 2f 0a  ntext object */.
f3e0: 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20   int op,        
f3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f400: 20 20 2f 2a 20 57 49 4e 44 4f 57 5f 52 45 54 55    /* WINDOW_RETU
f410: 52 4e 5f 52 4f 57 2c 20 41 47 47 53 54 45 50 20  RN_ROW, AGGSTEP 
f420: 6f 72 20 41 47 47 49 4e 56 45 52 53 45 20 2a 2f  or AGGINVERSE */
f430: 0a 20 69 6e 74 20 72 65 67 43 6f 75 6e 74 64 6f  . int regCountdo
f440: 77 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  wn,             
f450: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66     /* Register f
f460: 6f 72 20 4f 50 5f 49 66 50 6f 73 20 63 6f 75 6e  or OP_IfPos coun
f470: 74 64 6f 77 6e 20 2a 2f 0a 20 69 6e 74 20 6a 75  tdown */. int ju
f480: 6d 70 4f 6e 45 6f 66 20 20 20 20 20 20 20 20 20  mpOnEof         
f490: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
f4a0: 6d 70 20 68 65 72 65 20 69 66 20 73 74 65 70 70  mp here if stepp
f4b0: 65 64 20 63 75 72 73 6f 72 20 72 65 61 63 68 65  ed cursor reache
f4c0: 73 20 45 4f 46 20 2a 2f 0a 29 7b 0a 20 20 69 6e  s EOF */.){.  in
f4d0: 74 20 63 73 72 2c 20 72 65 67 3b 0a 20 20 50 61  t csr, reg;.  Pa
f4e0: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d  rse *pParse = p-
f4f0: 3e 70 50 61 72 73 65 3b 0a 20 20 57 69 6e 64 6f  >pParse;.  Windo
f500: 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 4d  w *pMWin = p->pM
f510: 57 69 6e 3b 0a 20 20 69 6e 74 20 72 65 74 20 3d  Win;.  int ret =
f520: 20 30 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   0;.  Vdbe *v = 
f530: 70 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  p->pVdbe;.  int 
f540: 61 64 64 72 49 66 20 3d 20 30 3b 20 0a 20 20 69  addrIf = 0; .  i
f550: 6e 74 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 20  nt addrContinue 
f560: 3d 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72 47  = 0;.  int addrG
f570: 6f 74 6f 20 3d 20 30 3b 0a 20 20 69 6e 74 20 62  oto = 0;.  int b
f580: 50 65 65 72 20 3d 20 28 70 4d 57 69 6e 2d 3e 65  Peer = (pMWin->e
f590: 46 72 6d 54 79 70 65 21 3d 54 4b 5f 52 4f 57 53  FrmType!=TK_ROWS
f5a0: 29 3b 0a 0a 20 20 69 6e 74 20 6c 62 6c 44 6f 6e  );..  int lblDon
f5b0: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
f5c0: 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
f5d0: 3b 0a 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74  ;.  int addrNext
f5e0: 52 61 6e 67 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a  Range = 0;..  /*
f5f0: 20 53 70 65 63 69 61 6c 20 63 61 73 65 20 2d 20   Special case - 
f600: 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53  WINDOW_AGGINVERS
f610: 45 20 69 73 20 61 6c 77 61 79 73 20 61 20 6e 6f  E is always a no
f620: 2d 6f 70 20 69 66 20 74 68 65 20 66 72 61 6d 65  -op if the frame
f630: 0a 20 20 2a 2a 20 73 74 61 72 74 73 20 77 69 74  .  ** starts wit
f640: 68 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43  h UNBOUNDED PREC
f650: 45 44 49 4e 47 2e 20 2a 2f 0a 20 20 69 66 28 20  EDING. */.  if( 
f660: 6f 70 3d 3d 57 49 4e 44 4f 57 5f 41 47 47 49 4e  op==WINDOW_AGGIN
f670: 56 45 52 53 45 20 26 26 20 70 4d 57 69 6e 2d 3e  VERSE && pMWin->
f680: 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55  eStart==TK_UNBOU
f690: 4e 44 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65  NDED ){.    asse
f6a0: 72 74 28 20 72 65 67 43 6f 75 6e 74 64 6f 77 6e  rt( regCountdown
f6b0: 3d 3d 30 20 26 26 20 6a 75 6d 70 4f 6e 45 6f 66  ==0 && jumpOnEof
f6c0: 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ==0 );.    retur
f6d0: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  n 0;.  }..  if( 
f6e0: 72 65 67 43 6f 75 6e 74 64 6f 77 6e 3e 30 20 29  regCountdown>0 )
f6f0: 7b 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d  {.    if( pMWin-
f700: 3e 65 46 72 6d 54 79 70 65 3d 3d 54 4b 5f 52 41  >eFrmType==TK_RA
f710: 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 61 64 64  NGE ){.      add
f720: 72 4e 65 78 74 52 61 6e 67 65 20 3d 20 73 71 6c  rNextRange = sql
f730: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
f740: 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 61 73  ddr(v);.      as
f750: 73 65 72 74 28 20 6f 70 3d 3d 57 49 4e 44 4f 57  sert( op==WINDOW
f760: 5f 41 47 47 49 4e 56 45 52 53 45 20 7c 7c 20 6f  _AGGINVERSE || o
f770: 70 3d 3d 57 49 4e 44 4f 57 5f 41 47 47 53 54 45  p==WINDOW_AGGSTE
f780: 50 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  P );.      if( o
f790: 70 3d 3d 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56  p==WINDOW_AGGINV
f7a0: 45 52 53 45 20 29 7b 0a 20 20 20 20 20 20 20 20  ERSE ){.        
f7b0: 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72  if( pMWin->eStar
f7c0: 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  t==TK_FOLLOWING 
f7d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 69 6e  ){.          win
f7e0: 64 6f 77 43 6f 64 65 52 61 6e 67 65 54 65 73 74  dowCodeRangeTest
f7f0: 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
f800: 70 2c 20 4f 50 5f 4c 65 2c 20 70 2d 3e 63 75 72  p, OP_Le, p->cur
f810: 72 65 6e 74 2e 63 73 72 2c 20 72 65 67 43 6f 75  rent.csr, regCou
f820: 6e 74 64 6f 77 6e 2c 20 70 2d 3e 73 74 61 72 74  ntdown, p->start
f830: 2e 63 73 72 2c 20 6c 62 6c 44 6f 6e 65 0a 20 20  .csr, lblDone.  
f840: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
f850: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f860: 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 52 61      windowCodeRa
f870: 6e 67 65 54 65 73 74 28 0a 20 20 20 20 20 20 20  ngeTest(.       
f880: 20 20 20 20 20 20 20 70 2c 20 4f 50 5f 47 65 2c         p, OP_Ge,
f890: 20 70 2d 3e 73 74 61 72 74 2e 63 73 72 2c 20 72   p->start.csr, r
f8a0: 65 67 43 6f 75 6e 74 64 6f 77 6e 2c 20 70 2d 3e  egCountdown, p->
f8b0: 63 75 72 72 65 6e 74 2e 63 73 72 2c 20 6c 62 6c  current.csr, lbl
f8c0: 44 6f 6e 65 0a 20 20 20 20 20 20 20 20 20 20 29  Done.          )
f8d0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f8e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f8f0: 20 77 69 6e 64 6f 77 43 6f 64 65 52 61 6e 67 65   windowCodeRange
f900: 54 65 73 74 28 0a 20 20 20 20 20 20 20 20 20 20  Test(.          
f910: 20 20 70 2c 20 4f 50 5f 47 74 2c 20 70 2d 3e 65    p, OP_Gt, p->e
f920: 6e 64 2e 63 73 72 2c 20 72 65 67 43 6f 75 6e 74  nd.csr, regCount
f930: 64 6f 77 6e 2c 20 70 2d 3e 63 75 72 72 65 6e 74  down, p->current
f940: 2e 63 73 72 2c 20 6c 62 6c 44 6f 6e 65 0a 20 20  .csr, lblDone.  
f950: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
f960: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f970: 20 20 61 64 64 72 49 66 20 3d 20 73 71 6c 69 74    addrIf = sqlit
f980: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
f990: 4f 50 5f 49 66 50 6f 73 2c 20 72 65 67 43 6f 75  OP_IfPos, regCou
f9a0: 6e 74 64 6f 77 6e 2c 20 30 2c 20 31 29 3b 0a 20  ntdown, 0, 1);. 
f9b0: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
f9c0: 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  e(v);.    }.  }.
f9d0: 0a 20 20 69 66 28 20 6f 70 3d 3d 57 49 4e 44 4f  .  if( op==WINDO
f9e0: 57 5f 52 45 54 55 52 4e 5f 52 4f 57 20 26 26 20  W_RETURN_ROW && 
f9f0: 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72 74 52  pMWin->regStartR
fa00: 6f 77 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 77  owid==0 ){.    w
fa10: 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 70 2c  indowAggFinal(p,
fa20: 20 30 29 3b 0a 20 20 7d 0a 20 20 61 64 64 72 43   0);.  }.  addrC
fa30: 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
fa40: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
fa50: 28 76 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  (v);.  switch( o
fa60: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 57 49  p ){.    case WI
fa70: 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 3a  NDOW_RETURN_ROW:
fa80: 0a 20 20 20 20 20 20 63 73 72 20 3d 20 70 2d 3e  .      csr = p->
fa90: 63 75 72 72 65 6e 74 2e 63 73 72 3b 0a 20 20 20  current.csr;.   
faa0: 20 20 20 72 65 67 20 3d 20 70 2d 3e 63 75 72 72     reg = p->curr
fab0: 65 6e 74 2e 72 65 67 3b 0a 20 20 20 20 20 20 77  ent.reg;.      w
fac0: 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52 6f  indowReturnOneRo
fad0: 77 28 70 29 3b 0a 20 20 20 20 20 20 62 72 65 61  w(p);.      brea
fae0: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 57 49 4e  k;..    case WIN
faf0: 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 3a 0a  DOW_AGGINVERSE:.
fb00: 20 20 20 20 20 20 63 73 72 20 3d 20 70 2d 3e 73        csr = p->s
fb10: 74 61 72 74 2e 63 73 72 3b 0a 20 20 20 20 20 20  tart.csr;.      
fb20: 72 65 67 20 3d 20 70 2d 3e 73 74 61 72 74 2e 72  reg = p->start.r
fb30: 65 67 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d  eg;.      if( pM
fb40: 57 69 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f 77  Win->regStartRow
fb50: 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  id ){.        as
fb60: 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 72 65 67  sert( pMWin->reg
fb70: 45 6e 64 52 6f 77 69 64 20 29 3b 0a 20 20 20 20  EndRowid );.    
fb80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fb90: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
fba0: 6d 6d 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74  mm, pMWin->regSt
fbb0: 61 72 74 52 6f 77 69 64 2c 20 31 29 3b 0a 20 20  artRowid, 1);.  
fbc0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
fbd0: 20 20 20 77 69 6e 64 6f 77 41 67 67 53 74 65 70     windowAggStep
fbe0: 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20  (pParse, pMWin, 
fbf0: 63 73 72 2c 20 31 2c 20 70 2d 3e 72 65 67 41 72  csr, 1, p->regAr
fc00: 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
fc10: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65    break;..    de
fc20: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73  fault:.      ass
fc30: 65 72 74 28 20 6f 70 3d 3d 57 49 4e 44 4f 57 5f  ert( op==WINDOW_
fc40: 41 47 47 53 54 45 50 20 29 3b 0a 20 20 20 20 20  AGGSTEP );.     
fc50: 20 63 73 72 20 3d 20 70 2d 3e 65 6e 64 2e 63 73   csr = p->end.cs
fc60: 72 3b 0a 20 20 20 20 20 20 72 65 67 20 3d 20 70  r;.      reg = p
fc70: 2d 3e 65 6e 64 2e 72 65 67 3b 0a 20 20 20 20 20  ->end.reg;.     
fc80: 20 69 66 28 20 70 4d 57 69 6e 2d 3e 72 65 67 53   if( pMWin->regS
fc90: 74 61 72 74 52 6f 77 69 64 20 29 7b 0a 20 20 20  tartRowid ){.   
fca0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 57       assert( pMW
fcb0: 69 6e 2d 3e 72 65 67 45 6e 64 52 6f 77 69 64 20  in->regEndRowid 
fcc0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
fcd0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
fce0: 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 4d 57 69 6e  OP_AddImm, pMWin
fcf0: 2d 3e 72 65 67 45 6e 64 52 6f 77 69 64 2c 20 31  ->regEndRowid, 1
fd00: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
fd10: 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 41 67          windowAg
fd20: 67 53 74 65 70 28 70 50 61 72 73 65 2c 20 70 4d  gStep(pParse, pM
fd30: 57 69 6e 2c 20 63 73 72 2c 20 30 2c 20 70 2d 3e  Win, csr, 0, p->
fd40: 72 65 67 41 72 67 29 3b 0a 20 20 20 20 20 20 7d  regArg);.      }
fd50: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
fd60: 7d 0a 0a 20 20 69 66 28 20 6f 70 3d 3d 70 2d 3e  }..  if( op==p->
fd70: 65 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 73  eDelete ){.    s
fd80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
fd90: 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 63  (v, OP_Delete, c
fda0: 73 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  sr);.    sqlite3
fdb0: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
fdc0: 4f 50 46 4c 41 47 5f 53 41 56 45 50 4f 53 49 54  OPFLAG_SAVEPOSIT
fdd0: 49 4f 4e 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ION);.  }..  if(
fde0: 20 6a 75 6d 70 4f 6e 45 6f 66 20 29 7b 0a 20 20   jumpOnEof ){.  
fdf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fe00: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
fe10: 63 73 72 2c 20 73 71 6c 69 74 65 33 56 64 62 65  csr, sqlite3Vdbe
fe20: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32  CurrentAddr(v)+2
fe30: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
fe40: 61 67 65 28 76 29 3b 0a 20 20 20 20 72 65 74 20  age(v);.    ret 
fe50: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
fe60: 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b  Op0(v, OP_Goto);
fe70: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
fe80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
fe90: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 63 73 72 2c  v, OP_Next, csr,
fea0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
feb0: 65 6e 74 41 64 64 72 28 76 29 2b 31 2b 62 50 65  entAddr(v)+1+bPe
fec0: 65 72 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  er);.    VdbeCov
fed0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 69 66  erage(v);.    if
fee0: 28 20 62 50 65 65 72 20 29 7b 0a 20 20 20 20 20  ( bPeer ){.     
fef0: 20 61 64 64 72 47 6f 74 6f 20 3d 20 73 71 6c 69   addrGoto = sqli
ff00: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
ff10: 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 7d   OP_Goto);.    }
ff20: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 50 65 65  .  }..  if( bPee
ff30: 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 52 65  r ){.    int nRe
ff40: 67 20 3d 20 28 70 4d 57 69 6e 2d 3e 70 4f 72 64  g = (pMWin->pOrd
ff50: 65 72 42 79 20 3f 20 70 4d 57 69 6e 2d 3e 70 4f  erBy ? pMWin->pO
ff60: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 3a 20  rderBy->nExpr : 
ff70: 30 29 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 54  0);.    int regT
ff80: 6d 70 20 3d 20 28 6e 52 65 67 20 3f 20 73 71 6c  mp = (nReg ? sql
ff90: 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
ffa0: 28 70 50 61 72 73 65 2c 20 6e 52 65 67 29 20 3a  (pParse, nReg) :
ffb0: 20 30 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 52   0);.    windowR
ffc0: 65 61 64 50 65 65 72 56 61 6c 75 65 73 28 70 2c  eadPeerValues(p,
ffd0: 20 63 73 72 2c 20 72 65 67 54 6d 70 29 3b 0a 20   csr, regTmp);. 
ffe0: 20 20 20 77 69 6e 64 6f 77 49 66 4e 65 77 50 65     windowIfNewPe
fff0: 65 72 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  er(pParse, pMWin
10000 2d 3e 70 4f 72 64 65 72 42 79 2c 20 72 65 67 54  ->pOrderBy, regT
10010 6d 70 2c 20 72 65 67 2c 20 61 64 64 72 43 6f 6e  mp, reg, addrCon
10020 74 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69  tinue);.    sqli
10030 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
10040 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 54  nge(pParse, regT
10050 6d 70 2c 20 6e 52 65 67 29 3b 0a 20 20 7d 0a 0a  mp, nReg);.  }..
10060 20 20 69 66 28 20 61 64 64 72 4e 65 78 74 52 61    if( addrNextRa
10070 6e 67 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nge ){.    sqlit
10080 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
10090 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
100a0 4e 65 78 74 52 61 6e 67 65 29 3b 0a 20 20 7d 0a  NextRange);.  }.
100b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
100c0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c  olveLabel(v, lbl
100d0 44 6f 6e 65 29 3b 0a 20 20 69 66 28 20 61 64 64  Done);.  if( add
100e0 72 47 6f 74 6f 20 29 20 73 71 6c 69 74 65 33 56  rGoto ) sqlite3V
100f0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
10100 64 64 72 47 6f 74 6f 29 3b 0a 20 20 69 66 28 20  ddrGoto);.  if( 
10110 61 64 64 72 49 66 20 29 20 73 71 6c 69 74 65 33  addrIf ) sqlite3
10120 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
10130 61 64 64 72 49 66 29 3b 0a 20 20 72 65 74 75 72  addrIf);.  retur
10140 6e 20 72 65 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  n ret;.}.../*.**
10150 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65   Allocate and re
10160 74 75 72 6e 20 61 20 64 75 70 6c 69 63 61 74 65  turn a duplicate
10170 20 6f 66 20 74 68 65 20 57 69 6e 64 6f 77 20 6f   of the Window o
10180 62 6a 65 63 74 20 69 6e 64 69 63 61 74 65 64 20  bject indicated 
10190 62 79 20 74 68 65 0a 2a 2a 20 74 68 69 72 64 20  by the.** third 
101a0 61 72 67 75 6d 65 6e 74 2e 20 53 65 74 20 74 68  argument. Set th
101b0 65 20 57 69 6e 64 6f 77 2e 70 4f 77 6e 65 72 20  e Window.pOwner 
101c0 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6e 65 77  field of the new
101d0 20 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 70 4f   object to.** pO
101e0 77 6e 65 72 2e 0a 2a 2f 0a 57 69 6e 64 6f 77 20  wner..*/.Window 
101f0 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 75  *sqlite3WindowDu
10200 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  p(sqlite3 *db, E
10210 78 70 72 20 2a 70 4f 77 6e 65 72 2c 20 57 69 6e  xpr *pOwner, Win
10220 64 6f 77 20 2a 70 29 7b 0a 20 20 57 69 6e 64 6f  dow *p){.  Windo
10230 77 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 69  w *pNew = 0;.  i
10240 66 28 20 41 4c 57 41 59 53 28 70 29 20 29 7b 0a  f( ALWAYS(p) ){.
10250 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
10260 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
10270 62 2c 20 73 69 7a 65 6f 66 28 57 69 6e 64 6f 77  b, sizeof(Window
10280 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  ));.    if( pNew
10290 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   ){.      pNew->
102a0 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
102b0 62 53 74 72 44 75 70 28 64 62 2c 20 70 2d 3e 7a  bStrDup(db, p->z
102c0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 4e 65  Name);.      pNe
102d0 77 2d 3e 70 46 69 6c 74 65 72 20 3d 20 73 71 6c  w->pFilter = sql
102e0 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
102f0 70 2d 3e 70 46 69 6c 74 65 72 2c 20 30 29 3b 0a  p->pFilter, 0);.
10300 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 46 75 6e        pNew->pFun
10310 63 20 3d 20 70 2d 3e 70 46 75 6e 63 3b 0a 20 20  c = p->pFunc;.  
10320 20 20 20 20 70 4e 65 77 2d 3e 70 50 61 72 74 69      pNew->pParti
10330 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78  tion = sqlite3Ex
10340 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
10350 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20 30 29 3b  >pPartition, 0);
10360 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4f 72  .      pNew->pOr
10370 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45  derBy = sqlite3E
10380 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
10390 2d 3e 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a  ->pOrderBy, 0);.
103a0 20 20 20 20 20 20 70 4e 65 77 2d 3e 65 46 72 6d        pNew->eFrm
103b0 54 79 70 65 20 3d 20 70 2d 3e 65 46 72 6d 54 79  Type = p->eFrmTy
103c0 70 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  pe;.      pNew->
103d0 65 45 6e 64 20 3d 20 70 2d 3e 65 45 6e 64 3b 0a  eEnd = p->eEnd;.
103e0 20 20 20 20 20 20 70 4e 65 77 2d 3e 65 53 74 61        pNew->eSta
103f0 72 74 20 3d 20 70 2d 3e 65 53 74 61 72 74 3b 0a  rt = p->eStart;.
10400 20 20 20 20 20 20 70 4e 65 77 2d 3e 65 45 78 63        pNew->eExc
10410 6c 75 64 65 20 3d 20 70 2d 3e 65 45 78 63 6c 75  lude = p->eExclu
10420 64 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  de;.      pNew->
10430 70 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  pStart = sqlite3
10440 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
10450 53 74 61 72 74 2c 20 30 29 3b 0a 20 20 20 20 20  Start, 0);.     
10460 20 70 4e 65 77 2d 3e 70 45 6e 64 20 3d 20 73 71   pNew->pEnd = sq
10470 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
10480 20 70 2d 3e 70 45 6e 64 2c 20 30 29 3b 0a 20 20   p->pEnd, 0);.  
10490 20 20 20 20 70 4e 65 77 2d 3e 70 4f 77 6e 65 72      pNew->pOwner
104a0 20 3d 20 70 4f 77 6e 65 72 3b 0a 20 20 20 20 7d   = pOwner;.    }
104b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
104c0 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ew;.}../*.** Ret
104d0 75 72 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68  urn a copy of th
104e0 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  e linked list of
104f0 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 73 20   Window objects 
10500 70 61 73 73 65 64 20 61 73 20 74 68 65 0a 2a 2a  passed as the.**
10510 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
10520 2e 0a 2a 2f 0a 57 69 6e 64 6f 77 20 2a 73 71 6c  ..*/.Window *sql
10530 69 74 65 33 57 69 6e 64 6f 77 4c 69 73 74 44 75  ite3WindowListDu
10540 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  p(sqlite3 *db, W
10550 69 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 57 69 6e  indow *p){.  Win
10560 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 57 69 6e  dow *pWin;.  Win
10570 64 6f 77 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20  dow *pRet = 0;. 
10580 20 57 69 6e 64 6f 77 20 2a 2a 70 70 20 3d 20 26   Window **pp = &
10590 70 52 65 74 3b 0a 0a 20 20 66 6f 72 28 70 57 69  pRet;..  for(pWi
105a0 6e 3d 70 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d  n=p; pWin; pWin=
105b0 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b  pWin->pNextWin){
105c0 0a 20 20 20 20 2a 70 70 20 3d 20 73 71 6c 69 74  .    *pp = sqlit
105d0 65 33 57 69 6e 64 6f 77 44 75 70 28 64 62 2c 20  e3WindowDup(db, 
105e0 30 2c 20 70 57 69 6e 29 3b 0a 20 20 20 20 69 66  0, pWin);.    if
105f0 28 20 2a 70 70 3d 3d 30 20 29 20 62 72 65 61 6b  ( *pp==0 ) break
10600 3b 0a 20 20 20 20 70 70 20 3d 20 26 28 28 2a 70  ;.    pp = &((*p
10610 70 29 2d 3e 70 4e 65 78 74 57 69 6e 29 3b 0a 20  p)->pNextWin);. 
10620 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65   }..  return pRe
10630 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t;.}../*.** Retu
10640 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 63 61  rn true if it ca
10650 6e 20 62 65 20 64 65 74 65 72 6d 69 6e 65 64 20  n be determined 
10660 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20  at compile time 
10670 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20  that expression 
10680 0a 2a 2a 20 70 45 78 70 72 20 65 76 61 6c 75 61  .** pExpr evalua
10690 74 65 73 20 74 6f 20 61 20 76 61 6c 75 65 20 74  tes to a value t
106a0 68 61 74 2c 20 77 68 65 6e 20 63 61 73 74 20 74  hat, when cast t
106b0 6f 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 69 73  o an integer, is
106c0 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 74 68 61   greater .** tha
106d0 6e 20 7a 65 72 6f 2e 20 46 61 6c 73 65 20 6f 74  n zero. False ot
106e0 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  herwise..**.** I
106f0 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f  f an OOM error o
10700 63 63 75 72 73 2c 20 74 68 69 73 20 66 75 6e 63  ccurs, this func
10710 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20 50 61  tion sets the Pa
10720 72 73 65 2e 64 62 2e 6d 61 6c 6c 6f 63 46 61 69  rse.db.mallocFai
10730 6c 65 64 20 0a 2a 2a 20 66 6c 61 67 20 61 6e 64  led .** flag and
10740 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2e 0a 2a   returns zero..*
10750 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
10760 64 6f 77 45 78 70 72 47 74 5a 65 72 6f 28 50 61  dowExprGtZero(Pa
10770 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
10780 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
10790 20 72 65 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69   ret = 0;.  sqli
107a0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
107b0 2d 3e 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ->db;.  sqlite3_
107c0 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b  value *pVal = 0;
107d0 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
107e0 72 6f 6d 45 78 70 72 28 64 62 2c 20 70 45 78 70  romExpr(db, pExp
107f0 72 2c 20 64 62 2d 3e 65 6e 63 2c 20 53 51 4c 49  r, db->enc, SQLI
10800 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 2c 20  TE_AFF_NUMERIC, 
10810 26 70 56 61 6c 29 3b 0a 20 20 69 66 28 20 70 56  &pVal);.  if( pV
10820 61 6c 20 26 26 20 73 71 6c 69 74 65 33 5f 76 61  al && sqlite3_va
10830 6c 75 65 5f 69 6e 74 28 70 56 61 6c 29 3e 30 20  lue_int(pVal)>0 
10840 29 7b 0a 20 20 20 20 72 65 74 20 3d 20 31 3b 0a  ){.    ret = 1;.
10850 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 61 6c    }.  sqlite3Val
10860 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20 20  ueFree(pVal);.  
10870 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f  return ret;.}../
10880 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72  *.** sqlite3Wher
10890 65 42 65 67 69 6e 28 29 20 68 61 73 20 61 6c 72  eBegin() has alr
108a0 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
108b0 20 66 6f 72 20 74 68 65 20 53 45 4c 45 43 54 20   for the SELECT 
108c0 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a 20 70 61  statement .** pa
108d0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
108e0 6e 64 20 61 72 67 75 6d 65 6e 74 20 77 68 65 6e  nd argument when
108f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
10900 73 20 69 6e 76 6f 6b 65 64 2e 20 49 74 20 67 65  s invoked. It ge
10910 6e 65 72 61 74 65 73 0a 2a 2a 20 63 6f 64 65 20  nerates.** code 
10920 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  to populate the 
10930 57 69 6e 64 6f 77 2e 72 65 67 52 65 73 75 6c 74  Window.regResult
10940 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 65 61   register for ea
10950 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  ch window functi
10960 6f 6e 20 0a 2a 2a 20 61 6e 64 20 69 6e 76 6f 6b  on .** and invok
10970 65 20 74 68 65 20 73 75 62 2d 72 6f 75 74 69 6e  e the sub-routin
10980 65 20 61 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  e at instruction
10990 20 61 64 64 72 47 6f 73 75 62 20 6f 6e 63 65 20   addrGosub once 
109a0 66 6f 72 20 65 61 63 68 20 72 6f 77 2e 0a 2a 2a  for each row..**
109b0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
109c0 28 29 20 69 73 20 61 6c 77 61 79 73 20 63 61 6c  () is always cal
109d0 6c 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72  led before retur
109e0 6e 69 6e 67 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69  ning. .**.** Thi
109f0 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 6e 64 6c  s function handl
10a00 65 73 20 73 65 76 65 72 61 6c 20 64 69 66 66 65  es several diffe
10a10 72 65 6e 74 20 74 79 70 65 73 20 6f 66 20 77 69  rent types of wi
10a20 6e 64 6f 77 20 66 72 61 6d 65 73 2c 20 77 68 69  ndow frames, whi
10a30 63 68 0a 2a 2a 20 72 65 71 75 69 72 65 20 73 6c  ch.** require sl
10a40 69 67 68 74 6c 79 20 64 69 66 66 65 72 65 6e 74  ightly different
10a50 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 54 68 65   processing. The
10a60 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 73 65 75 64   following pseud
10a70 6f 20 63 6f 64 65 20 69 73 0a 2a 2a 20 75 73 65  o code is.** use
10a80 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 77  d to implement w
10a90 69 6e 64 6f 77 20 66 72 61 6d 65 73 20 6f 66 20  indow frames of 
10aa0 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
10ab0 20 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20 3c    ROWS BETWEEN <
10ac0 65 78 70 72 31 3e 20 50 52 45 43 45 44 49 4e 47  expr1> PRECEDING
10ad0 20 41 4e 44 20 3c 65 78 70 72 32 3e 20 46 4f 4c   AND <expr2> FOL
10ae0 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 4f 74 68  LOWING.**.** Oth
10af0 65 72 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 20  er window frame 
10b00 74 79 70 65 73 20 75 73 65 20 76 61 72 69 61 6e  types use varian
10b10 74 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ts of the follow
10b20 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e  ing:.**.**     .
10b30 2e 2e 20 6c 6f 6f 70 20 73 74 61 72 74 65 64 20  .. loop started 
10b40 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  by sqlite3WhereB
10b50 65 67 69 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20  egin() ....**   
10b60 20 20 20 20 69 66 28 20 6e 65 77 20 70 61 72 74      if( new part
10b70 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20  ition ){.**     
10b80 20 20 20 20 47 6f 73 75 62 20 66 6c 75 73 68 0a      Gosub flush.
10b90 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20  **       }.**   
10ba0 20 20 20 20 49 6e 73 65 72 74 20 6e 65 77 20 72      Insert new r
10bb0 6f 77 20 69 6e 74 6f 20 65 70 68 20 74 61 62 6c  ow into eph tabl
10bc0 65 2e 0a 2a 2a 20 20 20 20 20 20 20 0a 2a 2a 20  e..**       .** 
10bd0 20 20 20 20 20 20 69 66 28 20 66 69 72 73 74 20        if( first 
10be0 72 6f 77 20 6f 66 20 70 61 72 74 69 74 69 6f 6e  row of partition
10bf0 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 2f   ){.**         /
10c00 2f 20 52 65 77 69 6e 64 20 74 68 72 65 65 20 63  / Rewind three c
10c10 75 72 73 6f 72 73 2c 20 61 6c 6c 20 6f 70 65 6e  ursors, all open
10c20 20 6f 6e 20 74 68 65 20 65 70 68 20 74 61 62 6c   on the eph tabl
10c30 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 65  e..**         Re
10c40 77 69 6e 64 28 63 73 72 45 6e 64 29 3b 0a 2a 2a  wind(csrEnd);.**
10c50 20 20 20 20 20 20 20 20 20 52 65 77 69 6e 64 28           Rewind(
10c60 63 73 72 53 74 61 72 74 29 3b 0a 2a 2a 20 20 20  csrStart);.**   
10c70 20 20 20 20 20 20 52 65 77 69 6e 64 28 63 73 72        Rewind(csr
10c80 43 75 72 72 65 6e 74 29 3b 0a 2a 2a 20 20 20 20  Current);.**    
10c90 20 20 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 72     .**         r
10ca0 65 67 45 6e 64 20 3d 20 3c 65 78 70 72 32 3e 20  egEnd = <expr2> 
10cb0 20 20 20 20 20 20 20 20 20 2f 2f 20 46 4f 4c 4c           // FOLL
10cc0 4f 57 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e  OWING expression
10cd0 0a 2a 2a 20 20 20 20 20 20 20 20 20 72 65 67 53  .**         regS
10ce0 74 61 72 74 20 3d 20 3c 65 78 70 72 31 3e 20 20  tart = <expr1>  
10cf0 20 20 20 20 20 20 2f 2f 20 50 52 45 43 45 44 49        // PRECEDI
10d00 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  NG expression.**
10d10 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a         }else{.**
10d20 20 20 20 20 20 20 20 20 20 2f 2f 20 46 69 72 73           // Firs
10d30 74 20 74 69 6d 65 20 74 68 69 73 20 62 72 61 6e  t time this bran
10d40 63 68 20 69 73 20 74 61 6b 65 6e 2c 20 74 68 65  ch is taken, the
10d50 20 65 70 68 20 74 61 62 6c 65 20 63 6f 6e 74 61   eph table conta
10d60 69 6e 73 20 74 77 6f 20 0a 2a 2a 20 20 20 20 20  ins two .**     
10d70 20 20 20 20 2f 2f 20 72 6f 77 73 2e 20 54 68 65      // rows. The
10d80 20 66 69 72 73 74 20 72 6f 77 20 69 6e 20 74 68   first row in th
10d90 65 20 70 61 72 74 69 74 69 6f 6e 2c 20 77 68 69  e partition, whi
10da0 63 68 20 61 6c 6c 20 74 68 72 65 65 20 63 75 72  ch all three cur
10db0 73 6f 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  sors.**         
10dc0 2f 2f 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  // currently poi
10dd0 6e 74 20 74 6f 2c 20 61 6e 64 20 74 68 65 20 66  nt to, and the f
10de0 6f 6c 6c 6f 77 69 6e 67 20 72 6f 77 2e 0a 2a 2a  ollowing row..**
10df0 20 20 20 20 20 20 20 20 20 41 47 47 53 54 45 50           AGGSTEP
10e00 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 66 28 20  .**         if( 
10e10 28 72 65 67 45 6e 64 2d 2d 29 3c 3d 30 20 29 7b  (regEnd--)<=0 ){
10e20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 52 45  .**           RE
10e30 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20  TURN_ROW.**     
10e40 20 20 20 20 20 20 69 66 28 20 28 72 65 67 53 74        if( (regSt
10e50 61 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20  art--)<=0 ){.** 
10e60 20 20 20 20 20 20 20 20 20 20 20 20 41 47 47 49              AGGI
10e70 4e 56 45 52 53 45 0a 2a 2a 20 20 20 20 20 20 20  NVERSE.**       
10e80 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20      }.**        
10e90 20 7d 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a   }.**       }.**
10ea0 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 66 6c       }.**     fl
10eb0 75 73 68 3a 0a 2a 2a 20 20 20 20 20 20 20 41 47  ush:.**       AG
10ec0 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 77  GSTEP.**       w
10ed0 68 69 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20  hile( 1 ){.**   
10ee0 20 20 20 20 20 20 52 45 54 55 52 4e 20 52 4f 57        RETURN ROW
10ef0 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 66 28 20  .**         if( 
10f00 63 73 72 43 75 72 72 65 6e 74 20 69 73 20 45 4f  csrCurrent is EO
10f10 46 20 29 20 62 72 65 61 6b 3b 0a 2a 2a 20 20 20  F ) break;.**   
10f20 20 20 20 20 20 20 69 66 28 20 28 72 65 67 53 74        if( (regSt
10f30 61 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20  art--)<=0 ){.** 
10f40 20 20 20 20 20 20 20 20 20 20 41 67 67 49 6e 76            AggInv
10f50 65 72 73 65 28 63 73 72 53 74 61 72 74 29 0a 2a  erse(csrStart).*
10f60 2a 20 20 20 20 20 20 20 20 20 20 20 4e 65 78 74  *           Next
10f70 28 63 73 72 53 74 61 72 74 29 0a 2a 2a 20 20 20  (csrStart).**   
10f80 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20        }.**      
10f90 20 7d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 73 65   }.**.** The pse
10fa0 75 64 6f 2d 63 6f 64 65 20 61 62 6f 76 65 20 75  udo-code above u
10fb0 73 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ses the followin
10fc0 67 20 73 68 6f 72 74 68 61 6e 64 3a 0a 2a 2a 0a  g shorthand:.**.
10fd0 2a 2a 20 20 20 41 47 47 53 54 45 50 3a 20 20 20  **   AGGSTEP:   
10fe0 20 69 6e 76 6f 6b 65 20 74 68 65 20 61 67 67 72   invoke the aggr
10ff0 65 67 61 74 65 20 78 53 74 65 70 28 29 20 66 75  egate xStep() fu
11000 6e 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 20  nction for each 
11010 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 0a  window function.
11020 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
11030 20 77 69 74 68 20 61 72 67 75 6d 65 6e 74 73 20   with arguments 
11040 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75  read from the cu
11050 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 63 75 72  rrent row of cur
11060 73 6f 72 20 63 73 72 45 6e 64 2c 20 74 68 65 6e  sor csrEnd, then
11070 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
11080 20 20 73 74 65 70 20 63 75 72 73 6f 72 20 63 73    step cursor cs
11090 72 45 6e 64 20 66 6f 72 77 61 72 64 20 6f 6e 65  rEnd forward one
110a0 20 72 6f 77 20 28 69 2e 65 2e 20 73 71 6c 69 74   row (i.e. sqlit
110b0 65 33 42 74 72 65 65 4e 65 78 74 28 29 29 2e 0a  e3BtreeNext())..
110c0 2a 2a 0a 2a 2a 20 20 20 52 45 54 55 52 4e 5f 52  **.**   RETURN_R
110d0 4f 57 3a 20 72 65 74 75 72 6e 20 61 20 72 6f 77  OW: return a row
110e0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 62   to the caller b
110f0 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ased on the cont
11100 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20  ents of the .** 
11110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 75                cu
11120 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 63 73 72  rrent row of csr
11130 43 75 72 72 65 6e 74 20 61 6e 64 20 74 68 65 20  Current and the 
11140 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66  current state of
11150 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 20 20 20 20   all .**        
11160 20 20 20 20 20 20 20 61 67 67 72 65 67 61 74 65         aggregate
11170 73 2e 20 54 68 65 6e 20 73 74 65 70 20 63 75 72  s. Then step cur
11180 73 6f 72 20 63 73 72 43 75 72 72 65 6e 74 20 66  sor csrCurrent f
11190 6f 72 77 61 72 64 20 6f 6e 65 20 72 6f 77 2e 0a  orward one row..
111a0 2a 2a 0a 2a 2a 20 20 20 41 47 47 49 4e 56 45 52  **.**   AGGINVER
111b0 53 45 3a 20 69 6e 76 6f 6b 65 20 74 68 65 20 61  SE: invoke the a
111c0 67 67 72 65 67 61 74 65 20 78 49 6e 76 65 72 73  ggregate xInvers
111d0 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  e() function for
111e0 20 65 61 63 68 20 77 69 6e 64 6f 77 20 0a 2a 2a   each window .**
111f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
11200 75 6e 63 74 69 6f 6e 73 20 77 69 74 68 20 61 72  unctions with ar
11210 67 75 6d 65 6e 74 73 20 72 65 61 64 20 66 72 6f  guments read fro
11220 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  m the current ro
11230 77 20 6f 66 20 63 75 72 73 6f 72 0a 2a 2a 20 20  w of cursor.**  
11240 20 20 20 20 20 20 20 20 20 20 20 20 20 63 73 72               csr
11250 53 74 61 72 74 2e 20 54 68 65 6e 20 73 74 65 70  Start. Then step
11260 20 63 73 72 53 74 61 72 74 20 66 6f 72 77 61 72   csrStart forwar
11270 64 20 6f 6e 65 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a  d one row..**.**
11280 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f   There are two o
11290 74 68 65 72 20 52 4f 57 53 20 77 69 6e 64 6f 77  ther ROWS window
112a0 20 66 72 61 6d 65 73 20 74 68 61 74 20 61 72 65   frames that are
112b0 20 68 61 6e 64 6c 65 64 20 73 69 67 6e 69 66 69   handled signifi
112c0 63 61 6e 74 6c 79 0a 2a 2a 20 64 69 66 66 65 72  cantly.** differ
112d0 65 6e 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 61  ently from the a
112e0 62 6f 76 65 20 2d 20 22 42 45 54 57 45 45 4e 20  bove - "BETWEEN 
112f0 3c 65 78 70 72 3e 20 50 52 45 43 45 44 49 4e 47  <expr> PRECEDING
11300 20 41 4e 44 20 3c 65 78 70 72 3e 20 50 52 45 43   AND <expr> PREC
11310 45 44 49 4e 47 22 0a 2a 2a 20 61 6e 64 20 22 42  EDING".** and "B
11320 45 54 57 45 45 4e 20 3c 65 78 70 72 3e 20 46 4f  ETWEEN <expr> FO
11330 4c 4c 4f 57 49 4e 47 20 41 4e 44 20 3c 65 78 70  LLOWING AND <exp
11340 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 22 2e 20 54  r> FOLLOWING". T
11350 68 65 73 65 20 61 72 65 20 73 70 65 63 69 61 6c  hese are special
11360 20 0a 2a 2a 20 63 61 73 65 73 20 62 65 63 61 75   .** cases becau
11370 73 65 20 74 68 65 79 20 63 68 61 6e 67 65 20 74  se they change t
11380 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63  he order in whic
11390 68 20 74 68 65 20 74 68 72 65 65 20 63 75 72 73  h the three curs
113a0 6f 72 73 20 28 63 73 72 53 74 61 72 74 2c 0a 2a  ors (csrStart,.*
113b0 2a 20 63 73 72 43 75 72 72 65 6e 74 20 61 6e 64  * csrCurrent and
113c0 20 63 73 72 45 6e 64 29 20 69 74 65 72 61 74 65   csrEnd) iterate
113d0 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 70 68   through the eph
113e0 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20 43 61  emeral table. Ca
113f0 73 65 73 20 74 68 61 74 0a 2a 2a 20 75 73 65 20  ses that.** use 
11400 55 4e 42 4f 55 4e 44 45 44 20 6f 72 20 43 55 52  UNBOUNDED or CUR
11410 52 45 4e 54 20 52 4f 57 20 61 72 65 20 6d 75 63  RENT ROW are muc
11420 68 20 73 69 6d 70 6c 65 72 20 76 61 72 69 61 74  h simpler variat
11430 69 6f 6e 73 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  ions on one of t
11440 68 65 73 65 0a 2a 2a 20 74 68 72 65 65 2e 0a 2a  hese.** three..*
11450 2a 0a 2a 2a 20 20 20 52 4f 57 53 20 42 45 54 57  *.**   ROWS BETW
11460 45 45 4e 20 3c 65 78 70 72 31 3e 20 50 52 45 43  EEN <expr1> PREC
11470 45 44 49 4e 47 20 41 4e 44 20 3c 65 78 70 72 32  EDING AND <expr2
11480 3e 20 50 52 45 43 45 44 49 4e 47 0a 2a 2a 0a 2a  > PRECEDING.**.*
11490 2a 20 20 20 20 20 2e 2e 2e 20 6c 6f 6f 70 20 73  *     ... loop s
114a0 74 61 72 74 65 64 20 62 79 20 73 71 6c 69 74 65  tarted by sqlite
114b0 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2e 2e  3WhereBegin() ..
114c0 2e 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 6e  ..**       if( n
114d0 65 77 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a  ew partition ){.
114e0 2a 2a 20 20 20 20 20 20 20 20 20 47 6f 73 75 62  **         Gosub
114f0 20 66 6c 75 73 68 0a 2a 2a 20 20 20 20 20 20 20   flush.**       
11500 7d 0a 2a 2a 20 20 20 20 20 20 20 49 6e 73 65 72  }.**       Inser
11510 74 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20 65  t new row into e
11520 70 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20  ph table..**    
11530 20 20 20 69 66 28 20 66 69 72 73 74 20 72 6f 77     if( first row
11540 20 6f 66 20 70 61 72 74 69 74 69 6f 6e 20 29 7b   of partition ){
11550 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 65 77 69  .**         Rewi
11560 6e 64 28 63 73 72 45 6e 64 29 20 3b 20 52 65 77  nd(csrEnd) ; Rew
11570 69 6e 64 28 63 73 72 53 74 61 72 74 29 20 3b 20  ind(csrStart) ; 
11580 52 65 77 69 6e 64 28 63 73 72 43 75 72 72 65 6e  Rewind(csrCurren
11590 74 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 72 65  t).**         re
115a0 67 45 6e 64 20 3d 20 3c 65 78 70 72 32 3e 0a 2a  gEnd = <expr2>.*
115b0 2a 20 20 20 20 20 20 20 20 20 72 65 67 53 74 61  *         regSta
115c0 72 74 20 3d 20 3c 65 78 70 72 31 3e 0a 2a 2a 20  rt = <expr1>.** 
115d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20        }else{.** 
115e0 20 20 20 20 20 20 20 20 69 66 28 20 28 72 65 67          if( (reg
115f0 45 6e 64 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20  End--)<=0 ){.** 
11600 20 20 20 20 20 20 20 20 20 20 41 47 47 53 54 45            AGGSTE
11610 50 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a  P.**         }.*
11620 2a 20 20 20 20 20 20 20 20 20 52 45 54 55 52 4e  *         RETURN
11630 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 20 20 20 20  _ROW.**         
11640 69 66 28 20 28 72 65 67 53 74 61 72 74 2d 2d 29  if( (regStart--)
11650 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  <=0 ){.**       
11660 20 20 20 20 41 47 47 49 4e 56 45 52 53 45 0a 2a      AGGINVERSE.*
11670 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  *         }.**  
11680 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a       }.**     }.
11690 2a 2a 20 20 20 20 20 66 6c 75 73 68 3a 0a 2a 2a  **     flush:.**
116a0 20 20 20 20 20 20 20 69 66 28 20 28 72 65 67 45         if( (regE
116b0 6e 64 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20  nd--)<=0 ){.**  
116c0 20 20 20 20 20 20 20 41 47 47 53 54 45 50 0a 2a         AGGSTEP.*
116d0 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  *       }.**    
116e0 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a     RETURN_ROW.**
116f0 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57 53 20 42 45  .**.**   ROWS BE
11700 54 57 45 45 4e 20 3c 65 78 70 72 31 3e 20 46 4f  TWEEN <expr1> FO
11710 4c 4c 4f 57 49 4e 47 20 41 4e 44 20 3c 65 78 70  LLOWING AND <exp
11720 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a  r2> FOLLOWING.**
11730 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 6c 6f 6f 70  .**     ... loop
11740 20 73 74 61 72 74 65 64 20 62 79 20 73 71 6c 69   started by sqli
11750 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
11760 2e 2e 2e 0a 2a 2a 20 20 20 20 20 69 66 28 20 6e  ....**     if( n
11770 65 77 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a  ew partition ){.
11780 2a 2a 20 20 20 20 20 20 20 47 6f 73 75 62 20 66  **       Gosub f
11790 6c 75 73 68 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a  lush.**     }.**
117a0 20 20 20 20 20 49 6e 73 65 72 74 20 6e 65 77 20       Insert new 
117b0 72 6f 77 20 69 6e 74 6f 20 65 70 68 20 74 61 62  row into eph tab
117c0 6c 65 2e 0a 2a 2a 20 20 20 20 20 69 66 28 20 66  le..**     if( f
117d0 69 72 73 74 20 72 6f 77 20 6f 66 20 70 61 72 74  irst row of part
117e0 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20  ition ){.**     
117f0 20 20 52 65 77 69 6e 64 28 63 73 72 45 6e 64 29    Rewind(csrEnd)
11800 20 3b 20 52 65 77 69 6e 64 28 63 73 72 53 74 61   ; Rewind(csrSta
11810 72 74 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72  rt) ; Rewind(csr
11820 43 75 72 72 65 6e 74 29 0a 2a 2a 20 20 20 20 20  Current).**     
11830 20 20 72 65 67 45 6e 64 20 3d 20 3c 65 78 70 72    regEnd = <expr
11840 32 3e 0a 2a 2a 20 20 20 20 20 20 20 72 65 67 53  2>.**       regS
11850 74 61 72 74 20 3d 20 72 65 67 45 6e 64 20 2d 20  tart = regEnd - 
11860 3c 65 78 70 72 31 3e 0a 2a 2a 20 20 20 20 20 7d  <expr1>.**     }
11870 65 6c 73 65 7b 0a 2a 2a 20 20 20 20 20 20 20 41  else{.**       A
11880 47 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 20 20  GGSTEP.**       
11890 69 66 28 20 28 72 65 67 45 6e 64 2d 2d 29 3c 3d  if( (regEnd--)<=
118a0 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  0 ){.**         
118b0 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20  RETURN_ROW.**   
118c0 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 69      }.**       i
118d0 66 28 20 28 72 65 67 53 74 61 72 74 2d 2d 29 3c  f( (regStart--)<
118e0 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  =0 ){.**        
118f0 20 41 47 47 49 4e 56 45 52 53 45 0a 2a 2a 20 20   AGGINVERSE.**  
11900 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a       }.**     }.
11910 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20 66 6c 75 73  **   }.**   flus
11920 68 3a 0a 2a 2a 20 20 20 20 20 41 47 47 53 54 45  h:.**     AGGSTE
11930 50 0a 2a 2a 20 20 20 20 20 77 68 69 6c 65 28 20  P.**     while( 
11940 31 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66  1 ){.**       if
11950 28 20 28 72 65 67 45 6e 64 2d 2d 29 3c 3d 30 20  ( (regEnd--)<=0 
11960 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 45  ){.**         RE
11970 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20  TURN_ROW.**     
11980 20 20 20 20 69 66 28 20 65 6f 66 20 29 20 62 72      if( eof ) br
11990 65 61 6b 3b 0a 2a 2a 20 20 20 20 20 20 20 7d 0a  eak;.**       }.
119a0 2a 2a 20 20 20 20 20 20 20 69 66 28 20 28 72 65  **       if( (re
119b0 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a  gStart--)<=0 ){.
119c0 2a 2a 20 20 20 20 20 20 20 20 20 41 47 47 49 4e  **         AGGIN
119d0 56 45 52 53 45 0a 2a 2a 20 20 20 20 20 20 20 20  VERSE.**        
119e0 20 69 66 28 20 65 6f 66 20 29 20 62 72 65 61 6b   if( eof ) break
119f0 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  .**       }.**  
11a00 20 20 20 7d 0a 2a 2a 20 20 20 20 20 77 68 69 6c     }.**     whil
11a10 65 28 20 21 65 6f 66 20 63 73 72 43 75 72 72 65  e( !eof csrCurre
11a20 6e 74 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 52  nt ){.**       R
11a30 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20  ETURN_ROW.**    
11a40 20 7d 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65   }.**.** For the
11a50 20 6d 6f 73 74 20 70 61 72 74 2c 20 74 68 65 20   most part, the 
11a60 70 61 74 74 65 72 6e 73 20 61 62 6f 76 65 20 61  patterns above a
11a70 72 65 20 61 64 61 70 74 65 64 20 74 6f 20 73 75  re adapted to su
11a80 70 70 6f 72 74 20 55 4e 42 4f 55 4e 44 45 44 20  pport UNBOUNDED 
11a90 62 79 0a 2a 2a 20 61 73 73 75 6d 69 6e 67 20 74  by.** assuming t
11aa0 68 61 74 20 69 74 20 69 73 20 65 71 75 69 76 61  hat it is equiva
11ab0 6c 65 6e 74 20 74 6f 20 22 69 6e 66 69 6e 69 74  lent to "infinit
11ac0 79 20 50 52 45 43 45 44 49 4e 47 2f 46 4f 4c 4c  y PRECEDING/FOLL
11ad0 4f 57 49 4e 47 22 20 61 6e 64 0a 2a 2a 20 43 55  OWING" and.** CU
11ae0 52 52 45 4e 54 20 52 4f 57 20 62 79 20 61 73 73  RRENT ROW by ass
11af0 75 6d 69 6e 67 20 74 68 61 74 20 69 74 20 69 73  uming that it is
11b00 20 65 71 75 69 76 69 6c 65 6e 74 20 74 6f 20 22   equivilent to "
11b10 30 20 50 52 45 43 45 44 49 4e 47 2f 46 4f 4c 4c  0 PRECEDING/FOLL
11b20 4f 57 49 4e 47 22 2e 0a 2a 2a 20 54 68 69 73 20  OWING"..** This 
11b30 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 6f 66 20  is optimized of 
11b40 63 6f 75 72 73 65 20 2d 20 62 72 61 6e 63 68 65  course - branche
11b50 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76 65  s that will neve
11b60 72 20 62 65 20 74 61 6b 65 6e 20 61 6e 64 0a 2a  r be taken and.*
11b70 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61  * conditions tha
11b80 74 20 61 72 65 20 61 6c 77 61 79 73 20 74 72 75  t are always tru
11b90 65 20 61 72 65 20 6f 6d 69 74 74 65 64 20 66 72  e are omitted fr
11ba0 6f 6d 20 74 68 65 20 56 4d 20 63 6f 64 65 2e 20  om the VM code. 
11bb0 54 68 65 20 6f 6e 6c 79 0a 2a 2a 20 65 78 63 65  The only.** exce
11bc0 70 74 69 6f 6e 61 6c 20 63 61 73 65 20 69 73 3a  ptional case is:
11bd0 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57 53 20 42 45  .**.**   ROWS BE
11be0 54 57 45 45 4e 20 3c 65 78 70 72 31 3e 20 46 4f  TWEEN <expr1> FO
11bf0 4c 4c 4f 57 49 4e 47 20 41 4e 44 20 55 4e 42 4f  LLOWING AND UNBO
11c00 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a  UNDED FOLLOWING.
11c10 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 6c 6f  **.**     ... lo
11c20 6f 70 20 73 74 61 72 74 65 64 20 62 79 20 73 71  op started by sq
11c30 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
11c40 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 69 66 28  ) ....**     if(
11c50 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 20 29   new partition )
11c60 7b 0a 2a 2a 20 20 20 20 20 20 20 47 6f 73 75 62  {.**       Gosub
11c70 20 66 6c 75 73 68 0a 2a 2a 20 20 20 20 20 7d 0a   flush.**     }.
11c80 2a 2a 20 20 20 20 20 49 6e 73 65 72 74 20 6e 65  **     Insert ne
11c90 77 20 72 6f 77 20 69 6e 74 6f 20 65 70 68 20 74  w row into eph t
11ca0 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 69 66 28  able..**     if(
11cb0 20 66 69 72 73 74 20 72 6f 77 20 6f 66 20 70 61   first row of pa
11cc0 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20  rtition ){.**   
11cd0 20 20 20 20 52 65 77 69 6e 64 28 63 73 72 45 6e      Rewind(csrEn
11ce0 64 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72 53  d) ; Rewind(csrS
11cf0 74 61 72 74 29 20 3b 20 52 65 77 69 6e 64 28 63  tart) ; Rewind(c
11d00 73 72 43 75 72 72 65 6e 74 29 0a 2a 2a 20 20 20  srCurrent).**   
11d10 20 20 20 20 72 65 67 53 74 61 72 74 20 3d 20 3c      regStart = <
11d20 65 78 70 72 31 3e 0a 2a 2a 20 20 20 20 20 7d 65  expr1>.**     }e
11d30 6c 73 65 7b 0a 2a 2a 20 20 20 20 20 20 20 41 47  lse{.**       AG
11d40 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 7d 0a 2a  GSTEP.**     }.*
11d50 2a 20 20 20 7d 0a 2a 2a 20 20 20 66 6c 75 73 68  *   }.**   flush
11d60 3a 0a 2a 2a 20 20 20 20 20 41 47 47 53 54 45 50  :.**     AGGSTEP
11d70 0a 2a 2a 20 20 20 20 20 77 68 69 6c 65 28 20 31  .**     while( 1
11d80 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28   ){.**       if(
11d90 20 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30   (regStart--)<=0
11da0 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41   ){.**         A
11db0 47 47 49 4e 56 45 52 53 45 0a 2a 2a 20 20 20 20  GGINVERSE.**    
11dc0 20 20 20 20 20 69 66 28 20 65 6f 66 20 29 20 62       if( eof ) b
11dd0 72 65 61 6b 0a 2a 2a 20 20 20 20 20 20 20 7d 0a  reak.**       }.
11de0 2a 2a 20 20 20 20 20 20 20 52 45 54 55 52 4e 5f  **       RETURN_
11df0 52 4f 57 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20  ROW.**     }.** 
11e00 20 20 20 20 77 68 69 6c 65 28 20 21 65 6f 66 20      while( !eof 
11e10 63 73 72 43 75 72 72 65 6e 74 20 29 7b 0a 2a 2a  csrCurrent ){.**
11e20 20 20 20 20 20 20 20 52 45 54 55 52 4e 5f 52 4f         RETURN_RO
11e30 57 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a  W.**     }.**.**
11e40 20 41 6c 73 6f 20 72 65 71 75 69 72 69 6e 67 20   Also requiring 
11e50 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67  special handling
11e60 20 61 72 65 20 74 68 65 20 63 61 73 65 73 3a 0a   are the cases:.
11e70 2a 2a 0a 2a 2a 20 20 20 52 4f 57 53 20 42 45 54  **.**   ROWS BET
11e80 57 45 45 4e 20 3c 65 78 70 72 31 3e 20 50 52 45  WEEN <expr1> PRE
11e90 43 45 44 49 4e 47 20 41 4e 44 20 3c 65 78 70 72  CEDING AND <expr
11ea0 32 3e 20 50 52 45 43 45 44 49 4e 47 0a 2a 2a 20  2> PRECEDING.** 
11eb0 20 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20 3c    ROWS BETWEEN <
11ec0 65 78 70 72 31 3e 20 46 4f 4c 4c 4f 57 49 4e 47  expr1> FOLLOWING
11ed0 20 41 4e 44 20 3c 65 78 70 72 32 3e 20 46 4f 4c   AND <expr2> FOL
11ee0 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 77 68 65  LOWING.**.** whe
11ef0 6e 20 28 65 78 70 72 31 20 3c 20 65 78 70 72 32  n (expr1 < expr2
11f00 29 2e 20 54 68 69 73 20 69 73 20 64 65 74 65 63  ). This is detec
11f10 74 65 64 20 61 74 20 72 75 6e 74 69 6d 65 2c 20  ted at runtime, 
11f20 6e 6f 74 20 62 79 20 74 68 69 73 20 66 75 6e 63  not by this func
11f30 74 69 6f 6e 2e 0a 2a 2a 20 54 6f 20 68 61 6e 64  tion..** To hand
11f40 6c 65 20 74 68 69 73 20 63 61 73 65 2c 20 74 68  le this case, th
11f50 65 20 70 73 65 75 64 6f 2d 63 6f 64 65 20 70 72  e pseudo-code pr
11f60 6f 67 72 61 6d 73 20 64 65 70 69 63 74 65 64 20  ograms depicted 
11f70 61 62 6f 76 65 20 61 72 65 20 6d 6f 64 69 66 69  above are modifi
11f80 65 64 0a 2a 2a 20 73 6c 69 67 68 74 6c 79 20 74  ed.** slightly t
11f90 6f 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  o be:.**.**     
11fa0 2e 2e 2e 20 6c 6f 6f 70 20 73 74 61 72 74 65 64  ... loop started
11fb0 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
11fc0 42 65 67 69 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20  Begin() ....**  
11fd0 20 20 20 69 66 28 20 6e 65 77 20 70 61 72 74 69     if( new parti
11fe0 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20  tion ){.**      
11ff0 20 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20   Gosub flush.** 
12000 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 49 6e 73      }.**     Ins
12010 65 72 74 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f  ert new row into
12020 20 65 70 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20   eph table..**  
12030 20 20 20 69 66 28 20 66 69 72 73 74 20 72 6f 77     if( first row
12040 20 6f 66 20 70 61 72 74 69 74 69 6f 6e 20 29 7b   of partition ){
12050 0a 2a 2a 20 20 20 20 20 20 20 52 65 77 69 6e 64  .**       Rewind
12060 28 63 73 72 45 6e 64 29 20 3b 20 52 65 77 69 6e  (csrEnd) ; Rewin
12070 64 28 63 73 72 53 74 61 72 74 29 20 3b 20 52 65  d(csrStart) ; Re
12080 77 69 6e 64 28 63 73 72 43 75 72 72 65 6e 74 29  wind(csrCurrent)
12090 0a 2a 2a 20 20 20 20 20 20 20 72 65 67 45 6e 64  .**       regEnd
120a0 20 3d 20 3c 65 78 70 72 32 3e 0a 2a 2a 20 20 20   = <expr2>.**   
120b0 20 20 20 20 72 65 67 53 74 61 72 74 20 3d 20 3c      regStart = <
120c0 65 78 70 72 31 3e 0a 2a 2a 20 20 20 20 20 20 20  expr1>.**       
120d0 69 66 28 20 72 65 67 45 6e 64 20 3c 20 72 65 67  if( regEnd < reg
120e0 53 74 61 72 74 20 29 7b 0a 2a 2a 20 20 20 20 20  Start ){.**     
120f0 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a      RETURN_ROW.*
12100 2a 20 20 20 20 20 20 20 20 20 64 65 6c 65 74 65  *         delete
12110 20 65 70 68 20 74 61 62 6c 65 20 63 6f 6e 74 65   eph table conte
12120 6e 74 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 63  nts.**         c
12130 6f 6e 74 69 6e 75 65 0a 2a 2a 20 20 20 20 20 20  ontinue.**      
12140 20 7d 0a 2a 2a 20 20 20 20 20 2e 2e 2e 0a 2a 2a   }.**     ....**
12150 0a 2a 2a 20 54 68 65 20 6e 65 77 20 22 63 6f 6e  .** The new "con
12160 74 69 6e 75 65 22 20 73 74 61 74 65 6d 65 6e 74  tinue" statement
12170 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 6a 75   in the above ju
12180 6d 70 73 20 74 6f 20 74 68 65 20 6e 65 78 74 20  mps to the next 
12190 69 74 65 72 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20  iteration.** of 
121a0 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20 2d  the outer loop -
121b0 20 74 68 65 20 6f 6e 65 20 73 74 61 72 74 65 64   the one started
121c0 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
121d0 42 65 67 69 6e 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  Begin()..**.** T
121e0 68 65 20 76 61 72 69 6f 75 73 20 47 52 4f 55 50  he various GROUP
121f0 53 20 63 61 73 65 73 20 61 72 65 20 69 6d 70 6c  S cases are impl
12200 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 74 68  emented using th
12210 65 20 73 61 6d 65 20 70 61 74 74 65 72 6e 73 20  e same patterns 
12220 61 73 0a 2a 2a 20 52 4f 57 53 2e 20 54 68 65 20  as.** ROWS. The 
12230 56 4d 20 63 6f 64 65 20 69 73 20 6d 6f 64 69 66  VM code is modif
12240 69 65 64 20 73 6c 69 67 68 74 6c 79 20 73 6f 20  ied slightly so 
12250 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e  that:.**.**   1.
12260 20 54 68 65 20 65 6c 73 65 20 62 72 61 6e 63 68   The else branch
12270 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6c 6f 6f   in the main loo
12280 70 20 69 73 20 6f 6e 6c 79 20 74 61 6b 65 6e 20  p is only taken 
12290 69 66 20 74 68 65 20 72 6f 77 20 6a 75 73 74 0a  if the row just.
122a0 2a 2a 20 20 20 20 20 20 61 64 64 65 64 20 74 6f  **      added to
122b0 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74   the ephemeral t
122c0 61 62 6c 65 20 69 73 20 74 68 65 20 73 74 61 72  able is the star
122d0 74 20 6f 66 20 61 20 6e 65 77 20 67 72 6f 75 70  t of a new group
122e0 2e 20 49 6e 0a 2a 2a 20 20 20 20 20 20 6f 74 68  . In.**      oth
122f0 65 72 20 77 6f 72 64 73 2c 20 69 74 20 62 65 63  er words, it bec
12300 6f 6d 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  omes:.**.**     
12310 20 20 20 20 2e 2e 2e 20 6c 6f 6f 70 20 73 74 61      ... loop sta
12320 72 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 57  rted by sqlite3W
12330 68 65 72 65 42 65 67 69 6e 28 29 20 2e 2e 2e 0a  hereBegin() ....
12340 2a 2a 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  **         if( n
12350 65 77 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a  ew partition ){.
12360 2a 2a 20 20 20 20 20 20 20 20 20 20 20 47 6f 73  **           Gos
12370 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20 20 20 20  ub flush.**     
12380 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20      }.**        
12390 20 49 6e 73 65 72 74 20 6e 65 77 20 72 6f 77 20   Insert new row 
123a0 69 6e 74 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a  into eph table..
123b0 2a 2a 20 20 20 20 20 20 20 20 20 69 66 28 20 66  **         if( f
123c0 69 72 73 74 20 72 6f 77 20 6f 66 20 70 61 72 74  irst row of part
123d0 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20  ition ){.**     
123e0 20 20 20 20 20 20 52 65 77 69 6e 64 28 63 73 72        Rewind(csr
123f0 45 6e 64 29 20 3b 20 52 65 77 69 6e 64 28 63 73  End) ; Rewind(cs
12400 72 53 74 61 72 74 29 20 3b 20 52 65 77 69 6e 64  rStart) ; Rewind
12410 28 63 73 72 43 75 72 72 65 6e 74 29 0a 2a 2a 20  (csrCurrent).** 
12420 20 20 20 20 20 20 20 20 20 20 72 65 67 45 6e 64            regEnd
12430 20 3d 20 3c 65 78 70 72 32 3e 0a 2a 2a 20 20 20   = <expr2>.**   
12440 20 20 20 20 20 20 20 20 72 65 67 53 74 61 72 74          regStart
12450 20 3d 20 3c 65 78 70 72 31 3e 0a 2a 2a 20 20 20   = <expr1>.**   
12460 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
12470 6e 65 77 20 67 72 6f 75 70 20 29 7b 0a 2a 2a 20  new group ){.** 
12480 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 20 0a 2a            ... .*
12490 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  *         }.**  
124a0 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 32       }.**.**   2
124b0 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 70 72 6f  . Instead of pro
124c0 63 65 73 73 69 6e 67 20 61 20 73 69 6e 67 6c 65  cessing a single
124d0 20 72 6f 77 2c 20 65 61 63 68 20 52 45 54 55 52   row, each RETUR
124e0 4e 5f 52 4f 57 2c 20 41 47 47 53 54 45 50 20 6f  N_ROW, AGGSTEP o
124f0 72 20 0a 2a 2a 20 20 20 20 20 20 41 47 47 49 4e  r .**      AGGIN
12500 56 45 52 53 45 20 73 74 65 70 20 70 72 6f 63 65  VERSE step proce
12510 73 73 65 73 20 74 68 65 20 63 75 72 72 65 6e 74  sses the current
12520 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 6c 65   row of the rele
12530 76 61 6e 74 20 63 75 72 73 6f 72 20 61 6e 64 0a  vant cursor and.
12540 2a 2a 20 20 20 20 20 20 61 6c 6c 20 73 75 62 73  **      all subs
12550 65 71 75 65 6e 74 20 72 6f 77 73 20 62 65 6c 6f  equent rows belo
12560 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 73 61 6d  nging to the sam
12570 65 20 67 72 6f 75 70 2e 0a 2a 2a 0a 2a 2a 20 52  e group..**.** R
12580 41 4e 47 45 20 77 69 6e 64 6f 77 20 66 72 61 6d  ANGE window fram
12590 65 73 20 61 72 65 20 61 20 6c 69 74 74 6c 65 20  es are a little 
125a0 64 69 66 66 65 72 65 6e 74 20 61 67 61 69 6e 2e  different again.
125b0 20 41 73 20 66 6f 72 20 47 52 4f 55 50 53 2c 20   As for GROUPS, 
125c0 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6c 6f 6f  the .** main loo
125d0 70 20 72 75 6e 73 20 6f 6e 63 65 20 70 65 72 20  p runs once per 
125e0 67 72 6f 75 70 20 6f 6e 6c 79 2e 20 41 6e 64 20  group only. And 
125f0 52 45 54 55 52 4e 5f 52 4f 57 2c 20 41 47 47 53  RETURN_ROW, AGGS
12600 54 45 50 20 61 6e 64 20 41 47 47 49 4e 56 45 52  TEP and AGGINVER
12610 53 45 0a 2a 2a 20 64 65 61 6c 20 69 6e 20 67 72  SE.** deal in gr
12620 6f 75 70 73 20 69 6e 73 74 65 61 64 20 6f 66 20  oups instead of 
12630 72 6f 77 73 2e 20 41 73 20 66 6f 72 20 52 4f 57  rows. As for ROW
12640 53 20 61 6e 64 20 47 52 4f 55 50 53 2c 20 74 68  S and GROUPS, th
12650 65 72 65 20 61 72 65 20 74 68 72 65 65 0a 2a 2a  ere are three.**
12660 20 62 61 73 69 63 20 63 61 73 65 73 3a 0a 2a 2a   basic cases:.**
12670 0a 2a 2a 20 20 20 52 41 4e 47 45 20 42 45 54 57  .**   RANGE BETW
12680 45 45 4e 20 3c 65 78 70 72 31 3e 20 50 52 45 43  EEN <expr1> PREC
12690 45 44 49 4e 47 20 41 4e 44 20 3c 65 78 70 72 32  EDING AND <expr2
126a0 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a  > FOLLOWING.**.*
126b0 2a 20 20 20 20 20 2e 2e 2e 20 6c 6f 6f 70 20 73  *     ... loop s
126c0 74 61 72 74 65 64 20 62 79 20 73 71 6c 69 74 65  tarted by sqlite
126d0 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2e 2e  3WhereBegin() ..
126e0 2e 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 6e  ..**       if( n
126f0 65 77 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a  ew partition ){.
12700 2a 2a 20 20 20 20 20 20 20 20 20 47 6f 73 75 62  **         Gosub
12710 20 66 6c 75 73 68 0a 2a 2a 20 20 20 20 20 20 20   flush.**       
12720 7d 0a 2a 2a 20 20 20 20 20 20 20 49 6e 73 65 72  }.**       Inser
12730 74 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20 65  t new row into e
12740 70 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20  ph table..**    
12750 20 20 20 69 66 28 20 66 69 72 73 74 20 72 6f 77     if( first row
12760 20 6f 66 20 70 61 72 74 69 74 69 6f 6e 20 29 7b   of partition ){
12770 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 65 77 69  .**         Rewi
12780 6e 64 28 63 73 72 45 6e 64 29 20 3b 20 52 65 77  nd(csrEnd) ; Rew
12790 69 6e 64 28 63 73 72 53 74 61 72 74 29 20 3b 20  ind(csrStart) ; 
127a0 52 65 77 69 6e 64 28 63 73 72 43 75 72 72 65 6e  Rewind(csrCurren
127b0 74 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 72 65  t).**         re
127c0 67 45 6e 64 20 3d 20 3c 65 78 70 72 32 3e 0a 2a  gEnd = <expr2>.*
127d0 2a 20 20 20 20 20 20 20 20 20 72 65 67 53 74 61  *         regSta
127e0 72 74 20 3d 20 3c 65 78 70 72 31 3e 0a 2a 2a 20  rt = <expr1>.** 
127f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20        }else{.** 
12800 20 20 20 20 20 20 20 20 41 47 47 53 54 45 50 0a          AGGSTEP.
12810 2a 2a 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  **         while
12820 28 20 28 63 73 72 43 75 72 72 65 6e 74 2e 6b 65  ( (csrCurrent.ke
12830 79 20 2b 20 72 65 67 45 6e 64 29 20 3c 20 63 73  y + regEnd) < cs
12840 72 45 6e 64 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20  rEnd.key ){.**  
12850 20 20 20 20 20 20 20 20 20 52 45 54 55 52 4e 5f           RETURN_
12860 52 4f 57 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ROW.**          
12870 20 77 68 69 6c 65 28 20 63 73 72 53 74 61 72 74   while( csrStart
12880 2e 6b 65 79 20 2b 20 72 65 67 53 74 61 72 74 29  .key + regStart)
12890 20 3c 20 63 73 72 43 75 72 72 65 6e 74 2e 6b 65   < csrCurrent.ke
128a0 79 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  y ){.**         
128b0 20 20 20 20 41 47 47 49 4e 56 45 52 53 45 0a 2a      AGGINVERSE.*
128c0 2a 20 20 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a  *           }.**
128d0 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20           }.**   
128e0 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a      }.**     }.*
128f0 2a 20 20 20 20 20 66 6c 75 73 68 3a 0a 2a 2a 20  *     flush:.** 
12900 20 20 20 20 20 20 41 47 47 53 54 45 50 0a 2a 2a        AGGSTEP.**
12910 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 31 20         while( 1 
12920 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 45  ){.**         RE
12930 54 55 52 4e 20 52 4f 57 0a 2a 2a 20 20 20 20 20  TURN ROW.**     
12940 20 20 20 20 69 66 28 20 63 73 72 43 75 72 72 65      if( csrCurre
12950 6e 74 20 69 73 20 45 4f 46 20 29 20 62 72 65 61  nt is EOF ) brea
12960 6b 3b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  k;.**           
12970 77 68 69 6c 65 28 20 63 73 72 53 74 61 72 74 2e  while( csrStart.
12980 6b 65 79 20 2b 20 72 65 67 53 74 61 72 74 29 20  key + regStart) 
12990 3c 20 63 73 72 43 75 72 72 65 6e 74 2e 6b 65 79  < csrCurrent.key
129a0 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   ){.**          
129b0 20 20 20 41 47 47 49 4e 56 45 52 53 45 0a 2a 2a     AGGINVERSE.**
129c0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20             }.** 
129d0 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20          }.**    
129e0 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68     }.**.** In th
129f0 65 20 61 62 6f 76 65 20 6e 6f 74 61 74 69 6f 6e  e above notation
12a00 2c 20 22 63 73 72 2e 6b 65 79 22 20 6d 65 61 6e  , "csr.key" mean
12a10 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  s the current va
12a20 6c 75 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52  lue of the ORDER
12a30 20 42 59 20 0a 2a 2a 20 65 78 70 72 65 73 73 69   BY .** expressi
12a40 6f 6e 20 28 74 68 65 72 65 20 69 73 20 6f 6e 6c  on (there is onl
12a50 79 20 65 76 65 72 20 31 20 66 6f 72 20 61 20 52  y ever 1 for a R
12a60 41 4e 47 45 20 74 68 61 74 20 75 73 65 73 20 61  ANGE that uses a
12a70 6e 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49  n <expr> FOLLOWI
12a80 4e 47 0a 2a 2a 20 6f 72 20 3c 65 78 70 72 20 50  NG.** or <expr P
12a90 52 45 43 45 44 49 4e 47 29 20 72 65 61 64 20 66  RECEDING) read f
12aa0 72 6f 6d 20 63 75 72 73 6f 72 20 63 73 72 2e 0a  rom cursor csr..
12ab0 2a 2a 0a 2a 2a 20 20 20 52 41 4e 47 45 20 42 45  **.**   RANGE BE
12ac0 54 57 45 45 4e 20 3c 65 78 70 72 31 3e 20 50 52  TWEEN <expr1> PR
12ad0 45 43 45 44 49 4e 47 20 41 4e 44 20 3c 65 78 70  ECEDING AND <exp
12ae0 72 32 3e 20 50 52 45 43 45 44 49 4e 47 0a 2a 2a  r2> PRECEDING.**
12af0 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 6c 6f 6f 70  .**     ... loop
12b00 20 73 74 61 72 74 65 64 20 62 79 20 73 71 6c 69   started by sqli
12b10 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
12b20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 69 66 28  ....**       if(
12b30 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 20 29   new partition )
12b40 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 47 6f 73  {.**         Gos
12b50 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20 20 20 20  ub flush.**     
12b60 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 49 6e 73    }.**       Ins
12b70 65 72 74 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f  ert new row into
12b80 20 65 70 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20   eph table..**  
12b90 20 20 20 20 20 69 66 28 20 66 69 72 73 74 20 72       if( first r
12ba0 6f 77 20 6f 66 20 70 61 72 74 69 74 69 6f 6e 20  ow of partition 
12bb0 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 65  ){.**         Re
12bc0 77 69 6e 64 28 63 73 72 45 6e 64 29 20 3b 20 52  wind(csrEnd) ; R
12bd0 65 77 69 6e 64 28 63 73 72 53 74 61 72 74 29 20  ewind(csrStart) 
12be0 3b 20 52 65 77 69 6e 64 28 63 73 72 43 75 72 72  ; Rewind(csrCurr
12bf0 65 6e 74 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  ent).**         
12c00 72 65 67 45 6e 64 20 3d 20 3c 65 78 70 72 32 3e  regEnd = <expr2>
12c10 0a 2a 2a 20 20 20 20 20 20 20 20 20 72 65 67 53  .**         regS
12c20 74 61 72 74 20 3d 20 3c 65 78 70 72 31 3e 0a 2a  tart = <expr1>.*
12c30 2a 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 2a  *       }else{.*
12c40 2a 20 20 20 20 20 20 20 20 20 69 66 28 20 28 63  *         if( (c
12c50 73 72 45 6e 64 2e 6b 65 79 20 2b 20 72 65 67 45  srEnd.key + regE
12c60 6e 64 29 20 3c 3d 20 63 73 72 43 75 72 72 65 6e  nd) <= csrCurren
12c70 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20 20  t.key ){.**     
12c80 20 20 20 20 20 20 41 47 47 53 54 45 50 0a 2a 2a        AGGSTEP.**
12c90 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20           }.**   
12ca0 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 73        while( (cs
12cb0 72 53 74 61 72 74 2e 6b 65 79 20 2b 20 72 65 67  rStart.key + reg
12cc0 53 74 61 72 74 29 20 3c 20 63 73 72 43 75 72 72  Start) < csrCurr
12cd0 65 6e 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20  ent.key ){.**   
12ce0 20 20 20 20 20 20 20 20 41 47 47 49 4e 56 45 52          AGGINVER
12cf0 53 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a  SE.**         }.
12d00 2a 2a 20 20 20 20 20 20 20 20 20 52 45 54 55 52  **         RETUR
12d10 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 20 20 7d  N_ROW.**       }
12d20 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  .**     }.**    
12d30 20 66 6c 75 73 68 3a 0a 2a 2a 20 20 20 20 20 20   flush:.**      
12d40 20 77 68 69 6c 65 28 20 28 63 73 72 45 6e 64 2e   while( (csrEnd.
12d50 6b 65 79 20 2b 20 72 65 67 45 6e 64 29 20 3c 3d  key + regEnd) <=
12d60 20 63 73 72 43 75 72 72 65 6e 74 2e 6b 65 79 20   csrCurrent.key 
12d70 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 47  ){.**         AG
12d80 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 7d  GSTEP.**       }
12d90 0a 2a 2a 20 20 20 20 20 20 20 77 68 69 6c 65 28  .**       while(
12da0 20 28 63 73 72 53 74 61 72 74 2e 6b 65 79 20 2b   (csrStart.key +
12db0 20 72 65 67 53 74 61 72 74 29 20 3c 20 63 73 72   regStart) < csr
12dc0 43 75 72 72 65 6e 74 2e 6b 65 79 20 29 7b 0a 2a  Current.key ){.*
12dd0 2a 20 20 20 20 20 20 20 20 20 41 47 47 49 4e 56  *         AGGINV
12de0 45 52 53 45 0a 2a 2a 20 20 20 20 20 20 20 7d 0a  ERSE.**       }.
12df0 2a 2a 20 20 20 20 20 20 20 52 45 54 55 52 4e 5f  **       RETURN_
12e00 52 4f 57 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e 47  ROW.**.**   RANG
12e10 45 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31  E BETWEEN <expr1
12e20 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e 44 20  > FOLLOWING AND 
12e30 3c 65 78 70 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e  <expr2> FOLLOWIN
12e40 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20  G.**.**     ... 
12e50 6c 6f 6f 70 20 73 74 61 72 74 65 64 20 62 79 20  loop started by 
12e60 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
12e70 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20  n() ....**      
12e80 20 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69   if( new partiti
12e90 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  on ){.**        
12ea0 20 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20   Gosub flush.** 
12eb0 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20        }.**      
12ec0 20 49 6e 73 65 72 74 20 6e 65 77 20 72 6f 77 20   Insert new row 
12ed0 69 6e 74 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a  into eph table..
12ee0 2a 2a 20 20 20 20 20 20 20 69 66 28 20 66 69 72  **       if( fir
12ef0 73 74 20 72 6f 77 20 6f 66 20 70 61 72 74 69 74  st row of partit
12f00 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  ion ){.**       
12f10 20 20 52 65 77 69 6e 64 28 63 73 72 45 6e 64 29    Rewind(csrEnd)
12f20 20 3b 20 52 65 77 69 6e 64 28 63 73 72 53 74 61   ; Rewind(csrSta
12f30 72 74 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72  rt) ; Rewind(csr
12f40 43 75 72 72 65 6e 74 29 0a 2a 2a 20 20 20 20 20  Current).**     
12f50 20 20 20 20 72 65 67 45 6e 64 20 3d 20 3c 65 78      regEnd = <ex
12f60 70 72 32 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20  pr2>.**         
12f70 72 65 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72  regStart = <expr
12f80 31 3e 0a 2a 2a 20 20 20 20 20 20 20 7d 65 6c 73  1>.**       }els
12f90 65 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 47  e{.**         AG
12fa0 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 20  GSTEP.**        
12fb0 20 77 68 69 6c 65 28 20 28 63 73 72 43 75 72 72   while( (csrCurr
12fc0 65 6e 74 2e 6b 65 79 20 2b 20 72 65 67 45 6e 64  ent.key + regEnd
12fd0 29 20 3c 20 63 73 72 45 6e 64 2e 6b 65 79 20 29  ) < csrEnd.key )
12fe0 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 77  {.**           w
12ff0 68 69 6c 65 28 20 28 63 73 72 43 75 72 72 65 6e  hile( (csrCurren
13000 74 2e 6b 65 79 20 2b 20 72 65 67 53 74 61 72 74  t.key + regStart
13010 29 20 3e 20 63 73 72 53 74 61 72 74 2e 6b 65 79  ) > csrStart.key
13020 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   ){.**          
13030 20 20 20 41 47 47 49 4e 56 45 52 53 45 0a 2a 2a     AGGINVERSE.**
13040 20 20 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20             }.** 
13050 20 20 20 20 20 20 20 20 20 20 52 45 54 55 52 4e            RETURN
13060 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 20 20 20 20  _ROW.**         
13070 7d 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20  }.**       }.** 
13080 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 66 6c 75      }.**     flu
13090 73 68 3a 0a 2a 2a 20 20 20 20 20 20 20 41 47 47  sh:.**       AGG
130a0 53 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 77 68  STEP.**       wh
130b0 69 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20  ile( 1 ){.**    
130c0 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 73 72       while( (csr
130d0 43 75 72 72 65 6e 74 2e 6b 65 79 20 2b 20 72 65  Current.key + re
130e0 67 53 74 61 72 74 29 20 3e 20 63 73 72 53 74 61  gStart) > csrSta
130f0 72 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20  rt.key ){.**    
13100 20 20 20 20 20 20 20 41 47 47 49 4e 56 45 52 53         AGGINVERS
13110 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 69  E.**           i
13120 66 28 20 65 6f 66 20 29 20 62 72 65 61 6b 20 22  f( eof ) break "
13130 77 68 69 6c 65 28 20 31 20 29 22 20 6c 6f 6f 70  while( 1 )" loop
13140 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a  ..**         }.*
13150 2a 20 20 20 20 20 20 20 20 20 52 45 54 55 52 4e  *         RETURN
13160 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 20 20 7d 0a  _ROW.**       }.
13170 2a 2a 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  **       while( 
13180 21 65 6f 66 20 63 73 72 43 75 72 72 65 6e 74 20  !eof csrCurrent 
13190 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 45  ){.**         RE
131a0 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20  TURN_ROW.**     
131b0 20 20 7d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65    }.**.** The te
131c0 78 74 20 61 62 6f 76 65 20 6c 65 61 76 65 73 20  xt above leaves 
131d0 6f 75 74 20 6d 61 6e 79 20 64 65 74 61 69 6c 73  out many details
131e0 2e 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 63  . Refer to the c
131f0 6f 64 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73  ode and comments
13200 0a 2a 2a 20 62 65 6c 6f 77 20 66 6f 72 20 61 20  .** below for a 
13210 6d 6f 72 65 20 63 6f 6d 70 6c 65 74 65 20 70 69  more complete pi
13220 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  cture..*/.void s
13230 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65  qlite3WindowCode
13240 53 74 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70  Step(.  Parse *p
13250 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
13260 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
13270 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
13280 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
13290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
132a0 20 52 65 77 72 69 74 74 65 6e 20 53 45 4c 45 43   Rewritten SELEC
132b0 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
132c0 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
132d0 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
132e0 20 2f 2a 20 43 6f 6e 74 65 78 74 20 72 65 74 75   /* Context retu
132f0 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 57  rned by sqlite3W
13300 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20  hereBegin() */. 
13310 20 69 6e 74 20 72 65 67 47 6f 73 75 62 2c 20 20   int regGosub,  
13320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13330 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72   /* Register for
13340 20 4f 50 5f 47 6f 73 75 62 20 2a 2f 0a 20 20 69   OP_Gosub */.  i
13350 6e 74 20 61 64 64 72 47 6f 73 75 62 20 20 20 20  nt addrGosub    
13360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13370 2a 20 4f 50 5f 47 6f 73 75 62 20 68 65 72 65 20  * OP_Gosub here 
13380 74 6f 20 72 65 74 75 72 6e 20 65 61 63 68 20 72  to return each r
13390 6f 77 20 2a 2f 0a 29 7b 0a 20 20 57 69 6e 64 6f  ow */.){.  Windo
133a0 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57  w *pMWin = p->pW
133b0 69 6e 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  in;.  ExprList *
133c0 70 4f 72 64 65 72 42 79 20 3d 20 70 4d 57 69 6e  pOrderBy = pMWin
133d0 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 56 64  ->pOrderBy;.  Vd
133e0 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
133f0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
13400 20 20 69 6e 74 20 63 73 72 57 72 69 74 65 3b 20    int csrWrite; 
13410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13420 20 20 2f 2a 20 43 75 72 73 6f 72 20 75 73 65 64    /* Cursor used
13430 20 74 6f 20 77 72 69 74 65 20 74 6f 20 65 70 68   to write to eph
13440 2e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  . table */.  int
13450 20 63 73 72 49 6e 70 75 74 20 3d 20 70 2d 3e 70   csrInput = p->p
13460 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f  Src->a[0].iCurso
13470 72 3b 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  r;     /* Cursor
13480 20 6f 66 20 73 75 62 2d 73 65 6c 65 63 74 20 2a   of sub-select *
13490 2f 0a 20 20 69 6e 74 20 6e 49 6e 70 75 74 20 3d  /.  int nInput =
134a0 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
134b0 54 61 62 2d 3e 6e 43 6f 6c 3b 20 20 20 20 2f 2a  Tab->nCol;    /*
134c0 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 73 20   Number of cols 
134d0 72 65 74 75 72 6e 65 64 20 62 79 20 73 75 62 20  returned by sub 
134e0 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 70 75 74 3b  */.  int iInput;
134f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13510 2a 20 54 6f 20 69 74 65 72 61 74 65 20 74 68 72  * To iterate thr
13520 6f 75 67 68 20 73 75 62 20 63 6f 6c 73 20 2a 2f  ough sub cols */
13530 0a 20 20 69 6e 74 20 61 64 64 72 4e 65 3b 20 20  .  int addrNe;  
13540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13550 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
13560 20 4f 50 5f 4e 65 20 2a 2f 0a 20 20 69 6e 74 20   OP_Ne */.  int 
13570 61 64 64 72 47 6f 73 75 62 46 6c 75 73 68 20 3d  addrGosubFlush =
13580 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41   0;         /* A
13590 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 47 6f 73  ddress of OP_Gos
135a0 75 62 20 74 6f 20 66 6c 75 73 68 3a 20 2a 2f 0a  ub to flush: */.
135b0 20 20 69 6e 74 20 61 64 64 72 49 6e 74 65 67 65    int addrIntege
135c0 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
135d0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
135e0 4f 50 5f 49 6e 74 65 67 65 72 20 2a 2f 0a 20 20  OP_Integer */.  
135f0 69 6e 74 20 61 64 64 72 45 6d 70 74 79 3b 20 20  int addrEmpty;  
13600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13610 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50  /* Address of OP
13620 5f 52 65 77 69 6e 64 20 69 6e 20 66 6c 75 73 68  _Rewind in flush
13630 3a 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 53 74  : */.  int regSt
13640 61 72 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  art = 0;        
13650 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
13660 6f 66 20 3c 65 78 70 72 3e 20 50 52 45 43 45 44  of <expr> PRECED
13670 49 4e 47 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ING */.  int reg
13680 45 6e 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  End = 0;        
13690 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
136a0 65 20 6f 66 20 3c 65 78 70 72 3e 20 46 4f 4c 4c  e of <expr> FOLL
136b0 4f 57 49 4e 47 20 2a 2f 0a 20 20 69 6e 74 20 72  OWING */.  int r
136c0 65 67 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  egNew;          
136d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
136e0 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
136f0 20 68 6f 6c 64 69 6e 67 20 6e 65 77 20 69 6e 70   holding new inp
13700 75 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20  ut row */.  int 
13710 72 65 67 52 65 63 6f 72 64 3b 20 20 20 20 20 20  regRecord;      
13720 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72              /* r
13730 65 67 4e 65 77 20 61 72 72 61 79 20 69 6e 20 72  egNew array in r
13740 65 63 6f 72 64 20 66 6f 72 6d 20 2a 2f 0a 20 20  ecord form */.  
13750 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 20 20 20  int regRowid;   
13760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13770 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 72 65 67  /* Rowid for reg
13780 52 65 63 6f 72 64 20 69 6e 20 65 70 68 20 74 61  Record in eph ta
13790 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ble */.  int reg
137a0 4e 65 77 50 65 65 72 20 3d 20 30 3b 20 20 20 20  NewPeer = 0;    
137b0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 65 65 72           /* Peer
137c0 20 76 61 6c 75 65 73 20 66 6f 72 20 6e 65 77 20   values for new 
137d0 72 6f 77 20 28 70 61 72 74 20 6f 66 20 72 65 67  row (part of reg
137e0 4e 65 77 29 20 2a 2f 0a 20 20 69 6e 74 20 72 65  New) */.  int re
137f0 67 50 65 65 72 20 3d 20 30 3b 20 20 20 20 20 20  gPeer = 0;      
13800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 65 65            /* Pee
13810 72 20 76 61 6c 75 65 73 20 66 6f 72 20 63 75 72  r values for cur
13820 72 65 6e 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e  rent row */.  in
13830 74 20 72 65 67 46 6c 75 73 68 50 61 72 74 20 3d  t regFlushPart =
13840 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
13850 20 52 65 67 69 73 74 65 72 20 66 6f 72 20 22 47   Register for "G
13860 6f 73 75 62 20 66 6c 75 73 68 5f 70 61 72 74 69  osub flush_parti
13870 74 69 6f 6e 22 20 2a 2f 0a 20 20 57 69 6e 64 6f  tion" */.  Windo
13880 77 43 6f 64 65 41 72 67 20 73 3b 20 20 20 20 20  wCodeArg s;     
13890 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
138a0 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 66 6f 72  ntext object for
138b0 20 73 75 62 2d 72 6f 75 74 69 6e 65 73 20 2a 2f   sub-routines */
138c0 0a 20 20 69 6e 74 20 6c 62 6c 57 68 65 72 65 45  .  int lblWhereE
138d0 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
138e0 20 20 20 2f 2a 20 4c 61 62 65 6c 20 6a 75 73 74     /* Label just
138f0 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33 57   before sqlite3W
13900 68 65 72 65 45 6e 64 28 29 20 63 6f 64 65 20 2a  hereEnd() code *
13910 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4d 57  /..  assert( pMW
13920 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 50  in->eStart==TK_P
13930 52 45 43 45 44 49 4e 47 20 7c 7c 20 70 4d 57 69  RECEDING || pMWi
13940 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55  n->eStart==TK_CU
13950 52 52 45 4e 54 20 0a 20 20 20 20 20 20 20 7c 7c  RRENT .       ||
13960 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d   pMWin->eStart==
13970 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 7c 7c 20  TK_FOLLOWING || 
13980 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
13990 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 0a 20 20 29  K_UNBOUNDED .  )
139a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 57 69  ;.  assert( pMWi
139b0 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c  n->eEnd==TK_FOLL
139c0 4f 57 49 4e 47 20 7c 7c 20 70 4d 57 69 6e 2d 3e  OWING || pMWin->
139d0 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54  eEnd==TK_CURRENT
139e0 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69   .       || pMWi
139f0 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f  n->eEnd==TK_UNBO
13a00 55 4e 44 45 44 20 7c 7c 20 70 4d 57 69 6e 2d 3e  UNDED || pMWin->
13a10 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49  eEnd==TK_PRECEDI
13a20 4e 47 20 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  NG .  );.  asser
13a30 74 28 20 70 4d 57 69 6e 2d 3e 65 45 78 63 6c 75  t( pMWin->eExclu
13a40 64 65 3d 3d 30 20 7c 7c 20 70 4d 57 69 6e 2d 3e  de==0 || pMWin->
13a50 65 45 78 63 6c 75 64 65 3d 3d 54 4b 5f 43 55 52  eExclude==TK_CUR
13a60 52 45 4e 54 0a 20 20 20 20 20 20 20 7c 7c 20 70  RENT.       || p
13a70 4d 57 69 6e 2d 3e 65 45 78 63 6c 75 64 65 3d 3d  MWin->eExclude==
13a80 54 4b 5f 47 52 4f 55 50 20 7c 7c 20 70 4d 57 69  TK_GROUP || pMWi
13a90 6e 2d 3e 65 45 78 63 6c 75 64 65 3d 3d 54 4b 5f  n->eExclude==TK_
13aa0 54 49 45 53 0a 20 20 20 20 20 20 20 7c 7c 20 70  TIES.       || p
13ab0 4d 57 69 6e 2d 3e 65 45 78 63 6c 75 64 65 3d 3d  MWin->eExclude==
13ac0 54 4b 5f 4e 4f 0a 20 20 29 3b 0a 0a 20 20 6c 62  TK_NO.  );..  lb
13ad0 6c 57 68 65 72 65 45 6e 64 20 3d 20 73 71 6c 69  lWhereEnd = sqli
13ae0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
13af0 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20  (pParse);..  /* 
13b00 46 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74  Fill in the cont
13b10 65 78 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ext object */.  
13b20 6d 65 6d 73 65 74 28 26 73 2c 20 30 2c 20 73 69  memset(&s, 0, si
13b30 7a 65 6f 66 28 57 69 6e 64 6f 77 43 6f 64 65 41  zeof(WindowCodeA
13b40 72 67 29 29 3b 0a 20 20 73 2e 70 50 61 72 73 65  rg));.  s.pParse
13b50 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 2e 70   = pParse;.  s.p
13b60 4d 57 69 6e 20 3d 20 70 4d 57 69 6e 3b 0a 20 20  MWin = pMWin;.  
13b70 73 2e 70 56 64 62 65 20 3d 20 76 3b 0a 20 20 73  s.pVdbe = v;.  s
13b80 2e 72 65 67 47 6f 73 75 62 20 3d 20 72 65 67 47  .regGosub = regG
13b90 6f 73 75 62 3b 0a 20 20 73 2e 61 64 64 72 47 6f  osub;.  s.addrGo
13ba0 73 75 62 20 3d 20 61 64 64 72 47 6f 73 75 62 3b  sub = addrGosub;
13bb0 0a 20 20 73 2e 63 75 72 72 65 6e 74 2e 63 73 72  .  s.current.csr
13bc0 20 3d 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73   = pMWin->iEphCs
13bd0 72 3b 0a 20 20 63 73 72 57 72 69 74 65 20 3d 20  r;.  csrWrite = 
13be0 73 2e 63 75 72 72 65 6e 74 2e 63 73 72 2b 31 3b  s.current.csr+1;
13bf0 0a 20 20 73 2e 73 74 61 72 74 2e 63 73 72 20 3d  .  s.start.csr =
13c00 20 73 2e 63 75 72 72 65 6e 74 2e 63 73 72 2b 32   s.current.csr+2
13c10 3b 0a 20 20 73 2e 65 6e 64 2e 63 73 72 20 3d 20  ;.  s.end.csr = 
13c20 73 2e 63 75 72 72 65 6e 74 2e 63 73 72 2b 33 3b  s.current.csr+3;
13c30 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
13c40 74 20 77 68 65 6e 20 72 6f 77 73 20 6d 61 79 20  t when rows may 
13c50 62 65 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20  be deleted from 
13c60 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61  the ephemeral ta
13c70 62 6c 65 2e 20 54 68 65 72 65 0a 20 20 2a 2a 20  ble. There.  ** 
13c80 61 72 65 20 66 6f 75 72 20 6f 70 74 69 6f 6e 73  are four options
13c90 20 2d 20 74 68 65 79 20 6d 61 79 20 6e 65 76 65   - they may neve
13ca0 72 20 62 65 20 64 65 6c 65 74 65 64 20 28 65 44  r be deleted (eD
13cb0 65 6c 65 74 65 3d 3d 30 29 2c 20 74 68 65 79 20  elete==0), they 
13cc0 6d 61 79 20 0a 20 20 2a 2a 20 62 65 20 64 65 6c  may .  ** be del
13cd0 65 74 65 64 20 61 73 20 73 6f 6f 6e 20 61 73 20  eted as soon as 
13ce0 74 68 65 79 20 61 72 65 20 6e 6f 20 6c 6f 6e 67  they are no long
13cf0 65 72 20 70 61 72 74 20 6f 66 20 74 68 65 20 77  er part of the w
13d00 69 6e 64 6f 77 20 66 72 61 6d 65 0a 20 20 2a 2a  indow frame.  **
13d10 20 28 65 44 65 6c 65 74 65 3d 3d 57 49 4e 44 4f   (eDelete==WINDO
13d20 57 5f 41 47 47 49 4e 56 45 52 53 45 29 2c 20 74  W_AGGINVERSE), t
13d30 68 65 79 20 6d 61 79 20 62 65 20 64 65 6c 65 74  hey may be delet
13d40 65 64 20 61 73 20 61 66 74 65 72 20 74 68 65 20  ed as after the 
13d50 72 6f 77 20 0a 20 20 2a 2a 20 68 61 73 20 62 65  row .  ** has be
13d60 65 6e 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  en returned to t
13d70 68 65 20 63 61 6c 6c 65 72 20 28 57 49 4e 44 4f  he caller (WINDO
13d80 57 5f 52 45 54 55 52 4e 5f 52 4f 57 29 2c 20 6f  W_RETURN_ROW), o
13d90 72 20 74 68 65 79 20 6d 61 79 0a 20 20 2a 2a 20  r they may.  ** 
13da0 62 65 20 64 65 6c 65 74 65 64 20 61 66 74 65 72  be deleted after
13db0 20 74 68 65 79 20 65 6e 74 65 72 20 74 68 65 20   they enter the 
13dc0 66 72 61 6d 65 20 28 57 49 4e 44 4f 57 5f 41 47  frame (WINDOW_AG
13dd0 47 53 54 45 50 29 2e 20 2a 2f 0a 20 20 73 77 69  GSTEP). */.  swi
13de0 74 63 68 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61  tch( pMWin->eSta
13df0 72 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  rt ){.    case T
13e00 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 3a 0a 20 20 20  K_FOLLOWING:.   
13e10 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 46     if( pMWin->eF
13e20 72 6d 54 79 70 65 21 3d 54 4b 5f 52 41 4e 47 45  rmType!=TK_RANGE
13e30 0a 20 20 20 20 20 20 20 26 26 20 77 69 6e 64 6f  .       && windo
13e40 77 45 78 70 72 47 74 5a 65 72 6f 28 70 50 61 72  wExprGtZero(pPar
13e50 73 65 2c 20 70 4d 57 69 6e 2d 3e 70 53 74 61 72  se, pMWin->pStar
13e60 74 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  t).      ){.    
13e70 20 20 20 20 73 2e 65 44 65 6c 65 74 65 20 3d 20      s.eDelete = 
13e80 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f  WINDOW_RETURN_RO
13e90 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  W;.      }.     
13ea0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
13eb0 20 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 3a 0a 20   TK_UNBOUNDED:. 
13ec0 20 20 20 20 20 69 66 28 20 77 69 6e 64 6f 77 43       if( windowC
13ed0 61 63 68 65 46 72 61 6d 65 28 70 4d 57 69 6e 29  acheFrame(pMWin)
13ee0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
13ef0 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  f( pMWin->eEnd==
13f00 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 29 7b 0a  TK_PRECEDING ){.
13f10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4d            if( pM
13f20 57 69 6e 2d 3e 65 46 72 6d 54 79 70 65 21 3d 54  Win->eFrmType!=T
13f30 4b 5f 52 41 4e 47 45 0a 20 20 20 20 20 20 20 20  K_RANGE.        
13f40 20 20 20 26 26 20 77 69 6e 64 6f 77 45 78 70 72     && windowExpr
13f50 47 74 5a 65 72 6f 28 70 50 61 72 73 65 2c 20 70  GtZero(pParse, p
13f60 4d 57 69 6e 2d 3e 70 45 6e 64 29 0a 20 20 20 20  MWin->pEnd).    
13f70 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
13f80 20 20 20 20 20 73 2e 65 44 65 6c 65 74 65 20 3d       s.eDelete =
13f90 20 57 49 4e 44 4f 57 5f 41 47 47 53 54 45 50 3b   WINDOW_AGGSTEP;
13fa0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
13fb0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13fc0 20 20 20 20 20 20 73 2e 65 44 65 6c 65 74 65 20        s.eDelete 
13fd0 3d 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f  = WINDOW_RETURN_
13fe0 52 4f 57 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ROW;.        }. 
13ff0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
14000 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
14010 0a 20 20 20 20 20 20 73 2e 65 44 65 6c 65 74 65  .      s.eDelete
14020 20 3d 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56   = WINDOW_AGGINV
14030 45 52 53 45 3b 0a 20 20 20 20 20 20 62 72 65 61  ERSE;.      brea
14040 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c  k;.  }..  /* All
14050 6f 63 61 74 65 20 72 65 67 69 73 74 65 72 73 20  ocate registers 
14060 66 6f 72 20 74 68 65 20 61 72 72 61 79 20 6f 66  for the array of
14070 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 74 68 65   values from the
14080 20 73 75 62 2d 71 75 65 72 79 2c 20 74 68 65 0a   sub-query, the.
14090 20 20 2a 2a 20 73 61 6d 76 65 20 76 61 6c 75 65    ** samve value
140a0 73 20 69 6e 20 72 65 63 6f 72 64 20 66 6f 72 6d  s in record form
140b0 2c 20 61 6e 64 20 74 68 65 20 72 6f 77 69 64 20  , and the rowid 
140c0 75 73 65 64 20 74 6f 20 69 6e 73 65 72 74 20 73  used to insert s
140d0 61 69 64 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20  aid record.  ** 
140e0 69 6e 74 6f 20 74 68 65 20 65 70 68 65 6d 65 72  into the ephemer
140f0 61 6c 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  al table.  */.  
14100 72 65 67 4e 65 77 20 3d 20 70 50 61 72 73 65 2d  regNew = pParse-
14110 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 70 50 61 72 73  >nMem+1;.  pPars
14120 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 49 6e 70 75  e->nMem += nInpu
14130 74 3b 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d  t;.  regRecord =
14140 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
14150 0a 20 20 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b  .  regRowid = ++
14160 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20  pParse->nMem;.. 
14170 20 2f 2a 20 49 66 20 74 68 65 20 77 69 6e 64 6f   /* If the windo
14180 77 20 66 72 61 6d 65 20 63 6f 6e 74 61 69 6e 73  w frame contains
14190 20 61 6e 20 22 3c 65 78 70 72 3e 20 50 52 45 43   an "<expr> PREC
141a0 45 44 49 4e 47 22 20 6f 72 20 22 3c 65 78 70 72  EDING" or "<expr
141b0 3e 20 46 4f 4c 4c 4f 57 49 4e 47 22 0a 20 20 2a  > FOLLOWING".  *
141c0 2a 20 63 6c 61 75 73 65 2c 20 61 6c 6c 6f 63 61  * clause, alloca
141d0 74 65 20 72 65 67 69 73 74 65 72 73 20 74 6f 20  te registers to 
141e0 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
141f0 73 20 6f 66 20 65 76 61 6c 75 61 74 69 6e 67 20  s of evaluating 
14200 65 61 63 68 0a 20 20 2a 2a 20 3c 65 78 70 72 3e  each.  ** <expr>
14210 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69  .  */.  if( pMWi
14220 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 50 52  n->eStart==TK_PR
14230 45 43 45 44 49 4e 47 20 7c 7c 20 70 4d 57 69 6e  ECEDING || pMWin
14240 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c  ->eStart==TK_FOL
14250 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 72 65  LOWING ){.    re
14260 67 53 74 61 72 74 20 3d 20 2b 2b 70 50 61 72 73  gStart = ++pPars
14270 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69  e->nMem;.  }.  i
14280 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  f( pMWin->eEnd==
14290 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 7c 7c 20  TK_PRECEDING || 
142a0 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f  pMWin->eEnd==TK_
142b0 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20  FOLLOWING ){.   
142c0 20 72 65 67 45 6e 64 20 3d 20 2b 2b 70 50 61 72   regEnd = ++pPar
142d0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 0a 20  se->nMem;.  }.. 
142e0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e   /* If this is n
142f0 6f 74 20 61 20 22 52 4f 57 53 20 42 45 54 57 45  ot a "ROWS BETWE
14300 45 4e 20 2e 2e 2e 22 20 66 72 61 6d 65 2c 20 74  EN ..." frame, t
14310 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 72 72  hen allocate arr
14320 61 79 73 20 6f 66 0a 20 20 2a 2a 20 72 65 67 69  ays of.  ** regi
14330 73 74 65 72 73 20 74 6f 20 73 74 6f 72 65 20 63  sters to store c
14340 6f 70 69 65 73 20 6f 66 20 74 68 65 20 4f 52 44  opies of the ORD
14350 45 52 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e  ER BY expression
14360 73 20 28 70 65 65 72 20 76 61 6c 75 65 73 29 20  s (peer values) 
14370 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6d 61  .  ** for the ma
14380 69 6e 20 6c 6f 6f 70 2c 20 61 6e 64 20 66 6f 72  in loop, and for
14390 20 65 61 63 68 20 63 75 72 73 6f 72 20 28 73 74   each cursor (st
143a0 61 72 74 2c 20 63 75 72 72 65 6e 74 20 61 6e 64  art, current and
143b0 20 65 6e 64 29 2e 20 2a 2f 0a 20 20 69 66 28 20   end). */.  if( 
143c0 70 4d 57 69 6e 2d 3e 65 46 72 6d 54 79 70 65 21  pMWin->eFrmType!
143d0 3d 54 4b 5f 52 4f 57 53 20 29 7b 0a 20 20 20 20  =TK_ROWS ){.    
143e0 69 6e 74 20 6e 50 65 65 72 20 3d 20 28 70 4f 72  int nPeer = (pOr
143f0 64 65 72 42 79 20 3f 20 70 4f 72 64 65 72 42 79  derBy ? pOrderBy
14400 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20  ->nExpr : 0);.  
14410 20 20 72 65 67 4e 65 77 50 65 65 72 20 3d 20 72    regNewPeer = r
14420 65 67 4e 65 77 20 2b 20 70 4d 57 69 6e 2d 3e 6e  egNew + pMWin->n
14430 42 75 66 66 65 72 43 6f 6c 3b 0a 20 20 20 20 69  BufferCol;.    i
14440 66 28 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69  f( pMWin->pParti
14450 74 69 6f 6e 20 29 20 72 65 67 4e 65 77 50 65 65  tion ) regNewPee
14460 72 20 2b 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72  r += pMWin->pPar
14470 74 69 74 69 6f 6e 2d 3e 6e 45 78 70 72 3b 0a 20  tition->nExpr;. 
14480 20 20 20 72 65 67 50 65 65 72 20 3d 20 70 50 61     regPeer = pPa
14490 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 20 20 20 20  rse->nMem+1;    
144a0 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
144b0 2b 3d 20 6e 50 65 65 72 3b 0a 20 20 20 20 73 2e  += nPeer;.    s.
144c0 73 74 61 72 74 2e 72 65 67 20 3d 20 70 50 61 72  start.reg = pPar
144d0 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 20 20 20 70 50  se->nMem+1;   pP
144e0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50  arse->nMem += nP
144f0 65 65 72 3b 0a 20 20 20 20 73 2e 63 75 72 72 65  eer;.    s.curre
14500 6e 74 2e 72 65 67 20 3d 20 70 50 61 72 73 65 2d  nt.reg = pParse-
14510 3e 6e 4d 65 6d 2b 31 3b 20 70 50 61 72 73 65 2d  >nMem+1; pParse-
14520 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 65 65 72 3b 0a  >nMem += nPeer;.
14530 20 20 20 20 73 2e 65 6e 64 2e 72 65 67 20 3d 20      s.end.reg = 
14540 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 20  pParse->nMem+1; 
14550 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
14560 20 2b 3d 20 6e 50 65 65 72 3b 0a 20 20 7d 0a 0a   += nPeer;.  }..
14570 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 63 6f    /* Load the co
14580 6c 75 6d 6e 20 76 61 6c 75 65 73 20 66 6f 72 20  lumn values for 
14590 74 68 65 20 72 6f 77 20 72 65 74 75 72 6e 65 64  the row returned
145a0 20 62 79 20 74 68 65 20 73 75 62 2d 73 65 6c 65   by the sub-sele
145b0 63 74 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20  ct.  ** into an 
145c0 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  array of registe
145d0 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 72  rs starting at r
145e0 65 67 4e 65 77 2e 20 41 73 73 65 6d 62 6c 65 20  egNew. Assemble 
145f0 74 68 65 6d 20 69 6e 74 6f 0a 20 20 2a 2a 20 61  them into.  ** a
14600 20 72 65 63 6f 72 64 20 69 6e 20 72 65 67 69 73   record in regis
14610 74 65 72 20 72 65 67 52 65 63 6f 72 64 2e 20 2a  ter regRecord. *
14620 2f 0a 20 20 66 6f 72 28 69 49 6e 70 75 74 3d 30  /.  for(iInput=0
14630 3b 20 69 49 6e 70 75 74 3c 6e 49 6e 70 75 74 3b  ; iInput<nInput;
14640 20 69 49 6e 70 75 74 2b 2b 29 7b 0a 20 20 20 20   iInput++){.    
14650 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14660 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
14670 63 73 72 49 6e 70 75 74 2c 20 69 49 6e 70 75 74  csrInput, iInput
14680 2c 20 72 65 67 4e 65 77 2b 69 49 6e 70 75 74 29  , regNew+iInput)
14690 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
146a0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
146b0 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 4e  MakeRecord, regN
146c0 65 77 2c 20 6e 49 6e 70 75 74 2c 20 72 65 67 52  ew, nInput, regR
146d0 65 63 6f 72 64 29 3b 0a 0a 20 20 2f 2a 20 41 6e  ecord);..  /* An
146e0 20 69 6e 70 75 74 20 72 6f 77 20 68 61 73 20 6a   input row has j
146f0 75 73 74 20 62 65 65 6e 20 72 65 61 64 20 69 6e  ust been read in
14700 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72  to an array of r
14710 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
14720 67 0a 20 20 2a 2a 20 61 74 20 72 65 67 4e 65 77  g.  ** at regNew
14730 2e 20 49 66 20 74 68 65 20 77 69 6e 64 6f 77 20  . If the window 
14740 68 61 73 20 61 20 50 41 52 54 49 54 49 4f 4e 20  has a PARTITION 
14750 63 6c 61 75 73 65 2c 20 74 68 69 73 20 62 6c 6f  clause, this blo
14760 63 6b 20 67 65 6e 65 72 61 74 65 73 20 0a 20 20  ck generates .  
14770 2a 2a 20 56 4d 20 63 6f 64 65 20 74 6f 20 63 68  ** VM code to ch
14780 65 63 6b 20 69 66 20 74 68 65 20 69 6e 70 75 74  eck if the input
14790 20 72 6f 77 20 69 73 20 74 68 65 20 73 74 61 72   row is the star
147a0 74 20 6f 66 20 61 20 6e 65 77 20 70 61 72 74 69  t of a new parti
147b0 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49 66 20 73 6f  tion..  ** If so
147c0 2c 20 69 74 20 64 6f 65 73 20 61 6e 20 4f 50 5f  , it does an OP_
147d0 47 6f 73 75 62 20 74 6f 20 61 6e 20 61 64 64 72  Gosub to an addr
147e0 65 73 73 20 74 6f 20 62 65 20 66 69 6c 6c 65 64  ess to be filled
147f0 20 69 6e 20 6c 61 74 65 72 2e 20 54 68 65 0a 20   in later. The. 
14800 20 2a 2a 20 61 64 64 72 65 73 73 20 6f 66 20 74   ** address of t
14810 68 65 20 4f 50 5f 47 6f 73 75 62 20 69 73 20 73  he OP_Gosub is s
14820 74 6f 72 65 64 20 69 6e 20 6c 6f 63 61 6c 20 76  tored in local v
14830 61 72 69 61 62 6c 65 20 61 64 64 72 47 6f 73 75  ariable addrGosu
14840 62 46 6c 75 73 68 2e 20 2a 2f 0a 20 20 69 66 28  bFlush. */.  if(
14850 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69   pMWin->pPartiti
14860 6f 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  on ){.    int ad
14870 64 72 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  dr;.    ExprList
14880 20 2a 70 50 61 72 74 20 3d 20 70 4d 57 69 6e 2d   *pPart = pMWin-
14890 3e 70 50 61 72 74 69 74 69 6f 6e 3b 0a 20 20 20  >pPartition;.   
148a0 20 69 6e 74 20 6e 50 61 72 74 20 3d 20 70 50 61   int nPart = pPa
148b0 72 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69  rt->nExpr;.    i
148c0 6e 74 20 72 65 67 4e 65 77 50 61 72 74 20 3d 20  nt regNewPart = 
148d0 72 65 67 4e 65 77 20 2b 20 70 4d 57 69 6e 2d 3e  regNew + pMWin->
148e0 6e 42 75 66 66 65 72 43 6f 6c 3b 0a 20 20 20 20  nBufferCol;.    
148f0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
14900 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
14910 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
14920 50 61 72 73 65 2c 20 70 50 61 72 74 2c 20 30 2c  Parse, pPart, 0,
14930 20 30 29 3b 0a 0a 20 20 20 20 72 65 67 46 6c 75   0);..    regFlu
14940 73 68 50 61 72 74 20 3d 20 2b 2b 70 50 61 72 73  shPart = ++pPars
14950 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 61 64 64  e->nMem;.    add
14960 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
14970 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp3(v, OP_Comp
14980 61 72 65 2c 20 72 65 67 4e 65 77 50 61 72 74 2c  are, regNewPart,
14990 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c   pMWin->regPart,
149a0 20 6e 50 61 72 74 29 3b 0a 20 20 20 20 73 71 6c   nPart);.    sql
149b0 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
149c0 28 76 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79 49  (v, (void*)pKeyI
149d0 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
149e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
149f0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
14a00 6d 70 2c 20 61 64 64 72 2b 32 2c 20 61 64 64 72  mp, addr+2, addr
14a10 2b 34 2c 20 61 64 64 72 2b 32 29 3b 0a 20 20 20  +4, addr+2);.   
14a20 20 56 64 62 65 43 6f 76 65 72 61 67 65 45 71 4e   VdbeCoverageEqN
14a30 65 28 76 29 3b 0a 20 20 20 20 61 64 64 72 47 6f  e(v);.    addrGo
14a40 73 75 62 46 6c 75 73 68 20 3d 20 73 71 6c 69 74  subFlush = sqlit
14a50 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
14a60 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 46 6c 75  OP_Gosub, regFlu
14a70 73 68 50 61 72 74 29 3b 0a 20 20 20 20 56 64 62  shPart);.    Vdb
14a80 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 61  eComment((v, "ca
14a90 6c 6c 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69  ll flush_partiti
14aa0 6f 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  on"));.    sqlit
14ab0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
14ac0 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4e 65 77 50  OP_Copy, regNewP
14ad0 61 72 74 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50  art, pMWin->regP
14ae0 61 72 74 2c 20 6e 50 61 72 74 2d 31 29 3b 0a 20  art, nPart-1);. 
14af0 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20   }..  /* Insert 
14b00 74 68 65 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f  the new row into
14b10 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74   the ephemeral t
14b20 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
14b30 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14b40 50 5f 4e 65 77 52 6f 77 69 64 2c 20 63 73 72 57  P_NewRowid, csrW
14b50 72 69 74 65 2c 20 72 65 67 52 6f 77 69 64 29 3b  rite, regRowid);
14b60 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
14b70 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
14b80 74 2c 20 63 73 72 57 72 69 74 65 2c 20 72 65 67  t, csrWrite, reg
14b90 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 69 64  Record, regRowid
14ba0 29 3b 0a 20 20 61 64 64 72 4e 65 20 3d 20 73 71  );.  addrNe = sq
14bb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
14bc0 76 2c 20 4f 50 5f 4e 65 2c 20 70 4d 57 69 6e 2d  v, OP_Ne, pMWin-
14bd0 3e 72 65 67 4f 6e 65 2c 20 30 2c 20 72 65 67 52  >regOne, 0, regR
14be0 6f 77 69 64 29 3b 0a 20 20 56 64 62 65 43 6f 76  owid);.  VdbeCov
14bf0 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c 28 76  erageNeverNull(v
14c00 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c  );..  /* This bl
14c10 6f 63 6b 20 69 73 20 72 75 6e 20 66 6f 72 20 74  ock is run for t
14c20 68 65 20 66 69 72 73 74 20 72 6f 77 20 6f 66 20  he first row of 
14c30 65 61 63 68 20 70 61 72 74 69 74 69 6f 6e 20 2a  each partition *
14c40 2f 0a 20 20 73 2e 72 65 67 41 72 67 20 3d 20 77  /.  s.regArg = w
14c50 69 6e 64 6f 77 49 6e 69 74 41 63 63 75 6d 28 70  indowInitAccum(p
14c60 50 61 72 73 65 2c 20 70 4d 57 69 6e 29 3b 0a 0a  Parse, pMWin);..
14c70 20 20 69 66 28 20 72 65 67 53 74 61 72 74 20 29    if( regStart )
14c80 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
14c90 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4d  rCode(pParse, pM
14ca0 57 69 6e 2d 3e 70 53 74 61 72 74 2c 20 72 65 67  Win->pStart, reg
14cb0 53 74 61 72 74 29 3b 0a 20 20 20 20 77 69 6e 64  Start);.    wind
14cc0 6f 77 43 68 65 63 6b 56 61 6c 75 65 28 70 50 61  owCheckValue(pPa
14cd0 72 73 65 2c 20 72 65 67 53 74 61 72 74 2c 20 30  rse, regStart, 0
14ce0 20 2b 20 28 70 4d 57 69 6e 2d 3e 65 46 72 6d 54   + (pMWin->eFrmT
14cf0 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 3f 20  ype==TK_RANGE ? 
14d00 33 20 3a 20 30 29 29 3b 0a 20 20 7d 0a 20 20 69  3 : 0));.  }.  i
14d10 66 28 20 72 65 67 45 6e 64 20 29 7b 0a 20 20 20  f( regEnd ){.   
14d20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
14d30 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2d 3e  (pParse, pMWin->
14d40 70 45 6e 64 2c 20 72 65 67 45 6e 64 29 3b 0a 20  pEnd, regEnd);. 
14d50 20 20 20 77 69 6e 64 6f 77 43 68 65 63 6b 56 61     windowCheckVa
14d60 6c 75 65 28 70 50 61 72 73 65 2c 20 72 65 67 45  lue(pParse, regE
14d70 6e 64 2c 20 31 20 2b 20 28 70 4d 57 69 6e 2d 3e  nd, 1 + (pMWin->
14d80 65 46 72 6d 54 79 70 65 3d 3d 54 4b 5f 52 41 4e  eFrmType==TK_RAN
14d90 47 45 20 3f 20 33 20 3a 20 30 29 29 3b 0a 20 20  GE ? 3 : 0));.  
14da0 7d 0a 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  }..  if( pMWin->
14db0 65 53 74 61 72 74 3d 3d 70 4d 57 69 6e 2d 3e 65  eStart==pMWin->e
14dc0 45 6e 64 20 26 26 20 72 65 67 53 74 61 72 74 20  End && regStart 
14dd0 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  ){.    int op = 
14de0 28 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d  ((pMWin->eStart=
14df0 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 29 20 3f  =TK_FOLLOWING) ?
14e00 20 4f 50 5f 47 65 20 3a 20 4f 50 5f 4c 65 29 3b   OP_Ge : OP_Le);
14e10 0a 20 20 20 20 69 6e 74 20 61 64 64 72 47 65 20  .    int addrGe 
14e20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
14e30 4f 70 33 28 76 2c 20 6f 70 2c 20 72 65 67 53 74  Op3(v, op, regSt
14e40 61 72 74 2c 20 30 2c 20 72 65 67 45 6e 64 29 3b  art, 0, regEnd);
14e50 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
14e60 65 4e 65 76 65 72 4e 75 6c 6c 49 66 28 76 2c 20  eNeverNullIf(v, 
14e70 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 2f 2a 20 4e  op==OP_Ge); /* N
14e80 65 76 65 72 4e 75 6c 6c 20 62 65 63 61 75 73 65  everNull because
14e90 20 62 6f 75 6e 64 20 3c 65 78 70 72 3e 20 2a 2f   bound <expr> */
14ea0 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
14eb0 65 4e 65 76 65 72 4e 75 6c 6c 49 66 28 76 2c 20  eNeverNullIf(v, 
14ec0 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 2f 2a 20 20  op==OP_Le); /*  
14ed0 20 76 61 6c 75 65 73 20 70 72 65 76 69 6f 75 73   values previous
14ee0 6c 79 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20  ly checked */.  
14ef0 20 20 77 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c    windowAggFinal
14f00 28 26 73 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  (&s, 0);.    sql
14f10 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14f20 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 73 2e 63  , OP_Rewind, s.c
14f30 75 72 72 65 6e 74 2e 63 73 72 2c 20 31 29 3b 0a  urrent.csr, 1);.
14f40 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
14f50 4e 65 76 65 72 54 61 6b 65 6e 28 76 29 3b 0a 20  NeverTaken(v);. 
14f60 20 20 20 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f     windowReturnO
14f70 6e 65 52 6f 77 28 26 73 29 3b 0a 20 20 20 20 73  neRow(&s);.    s
14f80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
14f90 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74  (v, OP_ResetSort
14fa0 65 72 2c 20 73 2e 63 75 72 72 65 6e 74 2e 63 73  er, s.current.cs
14fb0 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  r);.    sqlite3V
14fc0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14fd0 47 6f 74 6f 2c 20 30 2c 20 6c 62 6c 57 68 65 72  Goto, 0, lblWher
14fe0 65 45 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  eEnd);.    sqlit
14ff0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
15000 2c 20 61 64 64 72 47 65 29 3b 0a 20 20 7d 0a 20  , addrGe);.  }. 
15010 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61   if( pMWin->eSta
15020 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  rt==TK_FOLLOWING
15030 20 26 26 20 70 4d 57 69 6e 2d 3e 65 46 72 6d 54   && pMWin->eFrmT
15040 79 70 65 21 3d 54 4b 5f 52 41 4e 47 45 20 26 26  ype!=TK_RANGE &&
15050 20 72 65 67 45 6e 64 20 29 7b 0a 20 20 20 20 61   regEnd ){.    a
15060 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 45  ssert( pMWin->eE
15070 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  nd==TK_FOLLOWING
15080 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
15090 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
150a0 53 75 62 74 72 61 63 74 2c 20 72 65 67 53 74 61  Subtract, regSta
150b0 72 74 2c 20 72 65 67 45 6e 64 2c 20 72 65 67 53  rt, regEnd, regS
150c0 74 61 72 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  tart);.  }..  if
150d0 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 21  ( pMWin->eStart!
150e0 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b  =TK_UNBOUNDED ){
150f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15100 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
15110 69 6e 64 2c 20 73 2e 73 74 61 72 74 2e 63 73 72  ind, s.start.csr
15120 2c 20 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  , 1);.    VdbeCo
15130 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b 65 6e  verageNeverTaken
15140 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  (v);.  }.  sqlit
15150 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15160 4f 50 5f 52 65 77 69 6e 64 2c 20 73 2e 63 75 72  OP_Rewind, s.cur
15170 72 65 6e 74 2e 63 73 72 2c 20 31 29 3b 0a 20 20  rent.csr, 1);.  
15180 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65  VdbeCoverageNeve
15190 72 54 61 6b 65 6e 28 76 29 3b 0a 20 20 73 71 6c  rTaken(v);.  sql
151a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
151b0 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 73 2e 65  , OP_Rewind, s.e
151c0 6e 64 2e 63 73 72 2c 20 31 29 3b 0a 20 20 56 64  nd.csr, 1);.  Vd
151d0 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72 54  beCoverageNeverT
151e0 61 6b 65 6e 28 76 29 3b 0a 20 20 69 66 28 20 72  aken(v);.  if( r
151f0 65 67 50 65 65 72 20 26 26 20 70 4f 72 64 65 72  egPeer && pOrder
15200 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
15210 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
15220 50 5f 43 6f 70 79 2c 20 72 65 67 4e 65 77 50 65  P_Copy, regNewPe
15230 65 72 2c 20 72 65 67 50 65 65 72 2c 20 70 4f 72  er, regPeer, pOr
15240 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b  derBy->nExpr-1);
15250 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15260 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70  AddOp3(v, OP_Cop
15270 79 2c 20 72 65 67 50 65 65 72 2c 20 73 2e 73 74  y, regPeer, s.st
15280 61 72 74 2e 72 65 67 2c 20 70 4f 72 64 65 72 42  art.reg, pOrderB
15290 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20  y->nExpr-1);.   
152a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
152b0 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p3(v, OP_Copy, r
152c0 65 67 50 65 65 72 2c 20 73 2e 63 75 72 72 65 6e  egPeer, s.curren
152d0 74 2e 72 65 67 2c 20 70 4f 72 64 65 72 42 79 2d  t.reg, pOrderBy-
152e0 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 73  >nExpr-1);.    s
152f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
15300 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67  (v, OP_Copy, reg
15310 50 65 65 72 2c 20 73 2e 65 6e 64 2e 72 65 67 2c  Peer, s.end.reg,
15320 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
15330 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  -1);.  }..  sqli
15340 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15350 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 62 6c   OP_Goto, 0, lbl
15360 57 68 65 72 65 45 6e 64 29 3b 0a 0a 20 20 73 71  WhereEnd);..  sq
15370 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
15380 65 28 76 2c 20 61 64 64 72 4e 65 29 3b 0a 0a 20  e(v, addrNe);.. 
15390 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66   /* Beginning of
153a0 20 74 68 65 20 62 6c 6f 63 6b 20 65 78 65 63 75   the block execu
153b0 74 65 64 20 66 6f 72 20 74 68 65 20 73 65 63 6f  ted for the seco
153c0 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e  nd and subsequen
153d0 74 20 72 6f 77 73 2e 20 2a 2f 0a 20 20 69 66 28  t rows. */.  if(
153e0 20 72 65 67 50 65 65 72 20 29 7b 0a 20 20 20 20   regPeer ){.    
153f0 77 69 6e 64 6f 77 49 66 4e 65 77 50 65 65 72 28  windowIfNewPeer(
15400 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
15410 2c 20 72 65 67 4e 65 77 50 65 65 72 2c 20 72 65  , regNewPeer, re
15420 67 50 65 65 72 2c 20 6c 62 6c 57 68 65 72 65 45  gPeer, lblWhereE
15430 6e 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  nd);.  }.  if( p
15440 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
15450 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20  _FOLLOWING ){.  
15460 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26    windowCodeOp(&
15470 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 53 54 45  s, WINDOW_AGGSTE
15480 50 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  P, 0, 0);.    if
15490 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 21 3d 54  ( pMWin->eEnd!=T
154a0 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20  K_UNBOUNDED ){. 
154b0 20 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e       if( pMWin->
154c0 65 46 72 6d 54 79 70 65 3d 3d 54 4b 5f 52 41 4e  eFrmType==TK_RAN
154d0 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  GE ){.        in
154e0 74 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33 56  t lbl = sqlite3V
154f0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
15500 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  rse);.        in
15510 74 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c  t addrNext = sql
15520 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
15530 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20  ddr(v);.        
15540 77 69 6e 64 6f 77 43 6f 64 65 52 61 6e 67 65 54  windowCodeRangeT
15550 65 73 74 28 26 73 2c 20 4f 50 5f 47 65 2c 20 73  est(&s, OP_Ge, s
15560 2e 63 75 72 72 65 6e 74 2e 63 73 72 2c 20 72 65  .current.csr, re
15570 67 45 6e 64 2c 20 73 2e 65 6e 64 2e 63 73 72 2c  gEnd, s.end.csr,
15580 20 6c 62 6c 29 3b 0a 20 20 20 20 20 20 20 20 77   lbl);.        w
15590 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20  indowCodeOp(&s, 
155a0 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53  WINDOW_AGGINVERS
155b0 45 2c 20 72 65 67 53 74 61 72 74 2c 20 30 29 3b  E, regStart, 0);
155c0 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43  .        windowC
155d0 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57  odeOp(&s, WINDOW
155e0 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 30 2c 20  _RETURN_ROW, 0, 
155f0 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
15600 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15610 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
15620 72 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20  rNext);.        
15630 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
15640 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b  veLabel(v, lbl);
15650 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
15660 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65        windowCode
15670 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45  Op(&s, WINDOW_RE
15680 54 55 52 4e 5f 52 4f 57 2c 20 72 65 67 45 6e 64  TURN_ROW, regEnd
15690 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 77 69  , 0);.        wi
156a0 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57  ndowCodeOp(&s, W
156b0 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45  INDOW_AGGINVERSE
156c0 2c 20 72 65 67 53 74 61 72 74 2c 20 30 29 3b 0a  , regStart, 0);.
156d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
156e0 7d 65 6c 73 65 0a 20 20 69 66 28 20 70 4d 57 69  }else.  if( pMWi
156f0 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43  n->eEnd==TK_PREC
15700 45 44 49 4e 47 20 29 7b 0a 20 20 20 20 69 6e 74  EDING ){.    int
15710 20 62 52 50 53 20 3d 20 28 70 4d 57 69 6e 2d 3e   bRPS = (pMWin->
15720 65 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45  eStart==TK_PRECE
15730 44 49 4e 47 20 26 26 20 70 4d 57 69 6e 2d 3e 65  DING && pMWin->e
15740 46 72 6d 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47  FrmType==TK_RANG
15750 45 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f  E);.    windowCo
15760 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f  deOp(&s, WINDOW_
15770 41 47 47 53 54 45 50 2c 20 72 65 67 45 6e 64 2c  AGGSTEP, regEnd,
15780 20 30 29 3b 0a 20 20 20 20 69 66 28 20 62 52 50   0);.    if( bRP
15790 53 20 29 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70  S ) windowCodeOp
157a0 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49  (&s, WINDOW_AGGI
157b0 4e 56 45 52 53 45 2c 20 72 65 67 53 74 61 72 74  NVERSE, regStart
157c0 2c 20 30 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77  , 0);.    window
157d0 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f  CodeOp(&s, WINDO
157e0 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 30 2c  W_RETURN_ROW, 0,
157f0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 21 62 52   0);.    if( !bR
15800 50 53 20 29 20 77 69 6e 64 6f 77 43 6f 64 65 4f  PS ) windowCodeO
15810 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47  p(&s, WINDOW_AGG
15820 49 4e 56 45 52 53 45 2c 20 72 65 67 53 74 61 72  INVERSE, regStar
15830 74 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t, 0);.  }else{.
15840 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 30      int addr = 0
15850 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65  ;.    windowCode
15860 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47  Op(&s, WINDOW_AG
15870 47 53 54 45 50 2c 20 30 2c 20 30 29 3b 0a 20 20  GSTEP, 0, 0);.  
15880 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e    if( pMWin->eEn
15890 64 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20  d!=TK_UNBOUNDED 
158a0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 57  ){.      if( pMW
158b0 69 6e 2d 3e 65 46 72 6d 54 79 70 65 3d 3d 54 4b  in->eFrmType==TK
158c0 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20  _RANGE ){.      
158d0 20 20 69 6e 74 20 6c 62 6c 20 3d 20 30 3b 0a 20    int lbl = 0;. 
158e0 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71         addr = sq
158f0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
15900 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20  Addr(v);.       
15910 20 69 66 28 20 72 65 67 45 6e 64 20 29 7b 0a 20   if( regEnd ){. 
15920 20 20 20 20 20 20 20 20 20 6c 62 6c 20 3d 20 73           lbl = s
15930 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
15940 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20  bel(pParse);.   
15950 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64         windowCod
15960 65 52 61 6e 67 65 54 65 73 74 28 26 73 2c 20 4f  eRangeTest(&s, O
15970 50 5f 47 65 2c 20 73 2e 63 75 72 72 65 6e 74 2e  P_Ge, s.current.
15980 63 73 72 2c 20 72 65 67 45 6e 64 2c 20 73 2e 65  csr, regEnd, s.e
15990 6e 64 2e 63 73 72 2c 20 6c 62 6c 29 3b 0a 20 20  nd.csr, lbl);.  
159a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
159b0 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c  windowCodeOp(&s,
159c0 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52   WINDOW_RETURN_R
159d0 4f 57 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  OW, 0, 0);.     
159e0 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28     windowCodeOp(
159f0 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e  &s, WINDOW_AGGIN
15a00 56 45 52 53 45 2c 20 72 65 67 53 74 61 72 74 2c  VERSE, regStart,
15a10 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
15a20 20 72 65 67 45 6e 64 20 29 7b 0a 20 20 20 20 20   regEnd ){.     
15a30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15a40 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
15a50 6f 2c 20 30 2c 20 61 64 64 72 29 3b 0a 20 20 20  o, 0, addr);.   
15a60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15a70 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
15a80 2c 20 6c 62 6c 29 3b 0a 20 20 20 20 20 20 20 20  , lbl);.        
15a90 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
15aa0 20 20 20 20 20 20 20 69 66 28 20 72 65 67 45 6e         if( regEn
15ab0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  d ){.          a
15ac0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
15ad0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
15ae0 50 6f 73 2c 20 72 65 67 45 6e 64 2c 20 30 2c 20  Pos, regEnd, 0, 
15af0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64  1);.          Vd
15b00 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
15b10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15b20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73   windowCodeOp(&s
15b30 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f  , WINDOW_RETURN_
15b40 52 4f 57 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ROW, 0, 0);.    
15b50 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70      windowCodeOp
15b60 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49  (&s, WINDOW_AGGI
15b70 4e 56 45 52 53 45 2c 20 72 65 67 53 74 61 72 74  NVERSE, regStart
15b80 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
15b90 28 20 72 65 67 45 6e 64 20 29 20 73 71 6c 69 74  ( regEnd ) sqlit
15ba0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
15bb0 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 7d  , addr);.      }
15bc0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
15bd0 20 45 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e   End of the main
15be0 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20   input loop */. 
15bf0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
15c00 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 57  lveLabel(v, lblW
15c10 68 65 72 65 45 6e 64 29 3b 0a 20 20 73 71 6c 69  hereEnd);.  sqli
15c20 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
15c30 66 6f 29 3b 0a 0a 20 20 2f 2a 20 46 61 6c 6c 20  fo);..  /* Fall 
15c40 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 69 66 28  through */.  if(
15c50 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69   pMWin->pPartiti
15c60 6f 6e 20 29 7b 0a 20 20 20 20 61 64 64 72 49 6e  on ){.    addrIn
15c70 74 65 67 65 72 20 3d 20 73 71 6c 69 74 65 33 56  teger = sqlite3V
15c80 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15c90 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 46  Integer, 0, regF
15ca0 6c 75 73 68 50 61 72 74 29 3b 0a 20 20 20 20 73  lushPart);.    s
15cb0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
15cc0 72 65 28 76 2c 20 61 64 64 72 47 6f 73 75 62 46  re(v, addrGosubF
15cd0 6c 75 73 68 29 3b 0a 20 20 7d 0a 0a 20 20 61 64  lush);.  }..  ad
15ce0 64 72 45 6d 70 74 79 20 3d 20 73 71 6c 69 74 65  drEmpty = sqlite
15cf0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
15d00 50 5f 52 65 77 69 6e 64 2c 20 63 73 72 57 72 69  P_Rewind, csrWri
15d10 74 65 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72  te);.  VdbeCover
15d20 61 67 65 28 76 29 3b 0a 20 20 69 66 28 20 70 4d  age(v);.  if( pM
15d30 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52  Win->eEnd==TK_PR
15d40 45 43 45 44 49 4e 47 20 29 7b 0a 20 20 20 20 69  ECEDING ){.    i
15d50 6e 74 20 62 52 50 53 20 3d 20 28 70 4d 57 69 6e  nt bRPS = (pMWin
15d60 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45  ->eStart==TK_PRE
15d70 43 45 44 49 4e 47 20 26 26 20 70 4d 57 69 6e 2d  CEDING && pMWin-
15d80 3e 65 46 72 6d 54 79 70 65 3d 3d 54 4b 5f 52 41  >eFrmType==TK_RA
15d90 4e 47 45 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77  NGE);.    window
15da0 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f  CodeOp(&s, WINDO
15db0 57 5f 41 47 47 53 54 45 50 2c 20 72 65 67 45 6e  W_AGGSTEP, regEn
15dc0 64 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 62  d, 0);.    if( b
15dd0 52 50 53 20 29 20 77 69 6e 64 6f 77 43 6f 64 65  RPS ) windowCode
15de0 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47  Op(&s, WINDOW_AG
15df0 47 49 4e 56 45 52 53 45 2c 20 72 65 67 53 74 61  GINVERSE, regSta
15e00 72 74 2c 20 30 29 3b 0a 20 20 20 20 77 69 6e 64  rt, 0);.    wind
15e10 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e  owCodeOp(&s, WIN
15e20 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20  DOW_RETURN_ROW, 
15e30 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69  0, 0);.  }else i
15e40 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  f( pMWin->eStart
15e50 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29  ==TK_FOLLOWING )
15e60 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 53 74  {.    int addrSt
15e70 61 72 74 3b 0a 20 20 20 20 69 6e 74 20 61 64 64  art;.    int add
15e80 72 42 72 65 61 6b 31 3b 0a 20 20 20 20 69 6e 74  rBreak1;.    int
15e90 20 61 64 64 72 42 72 65 61 6b 32 3b 0a 20 20 20   addrBreak2;.   
15ea0 20 69 6e 74 20 61 64 64 72 42 72 65 61 6b 33 3b   int addrBreak3;
15eb0 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f  .    windowCodeO
15ec0 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47  p(&s, WINDOW_AGG
15ed0 53 54 45 50 2c 20 30 2c 20 30 29 3b 0a 20 20 20  STEP, 0, 0);.   
15ee0 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 46 72 6d   if( pMWin->eFrm
15ef0 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 29  Type==TK_RANGE )
15f00 7b 0a 20 20 20 20 20 20 61 64 64 72 53 74 61 72  {.      addrStar
15f10 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
15f20 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
15f30 20 20 20 20 20 61 64 64 72 42 72 65 61 6b 32 20       addrBreak2 
15f40 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26  = windowCodeOp(&
15f50 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56  s, WINDOW_AGGINV
15f60 45 52 53 45 2c 20 72 65 67 53 74 61 72 74 2c 20  ERSE, regStart, 
15f70 31 29 3b 0a 20 20 20 20 20 20 61 64 64 72 42 72  1);.      addrBr
15f80 65 61 6b 31 20 3d 20 77 69 6e 64 6f 77 43 6f 64  eak1 = windowCod
15f90 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52  eOp(&s, WINDOW_R
15fa0 45 54 55 52 4e 5f 52 4f 57 2c 20 30 2c 20 31 29  ETURN_ROW, 0, 1)
15fb0 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20  ;.    }else.    
15fc0 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d  if( pMWin->eEnd=
15fd0 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b  =TK_UNBOUNDED ){
15fe0 0a 20 20 20 20 20 20 61 64 64 72 53 74 61 72 74  .      addrStart
15ff0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
16000 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
16010 20 20 20 20 61 64 64 72 42 72 65 61 6b 31 20 3d      addrBreak1 =
16020 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73   windowCodeOp(&s
16030 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f  , WINDOW_RETURN_
16040 52 4f 57 2c 20 72 65 67 53 74 61 72 74 2c 20 31  ROW, regStart, 1
16050 29 3b 0a 20 20 20 20 20 20 61 64 64 72 42 72 65  );.      addrBre
16060 61 6b 32 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65  ak2 = windowCode
16070 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47  Op(&s, WINDOW_AG
16080 47 49 4e 56 45 52 53 45 2c 20 30 2c 20 31 29 3b  GINVERSE, 0, 1);
16090 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
160a0 20 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d    assert( pMWin-
160b0 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57  >eEnd==TK_FOLLOW
160c0 49 4e 47 20 29 3b 0a 20 20 20 20 20 20 61 64 64  ING );.      add
160d0 72 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  rStart = sqlite3
160e0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
160f0 76 29 3b 0a 20 20 20 20 20 20 61 64 64 72 42 72  v);.      addrBr
16100 65 61 6b 31 20 3d 20 77 69 6e 64 6f 77 43 6f 64  eak1 = windowCod
16110 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52  eOp(&s, WINDOW_R
16120 45 54 55 52 4e 5f 52 4f 57 2c 20 72 65 67 45 6e  ETURN_ROW, regEn
16130 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 64 64  d, 1);.      add
16140 72 42 72 65 61 6b 32 20 3d 20 77 69 6e 64 6f 77  rBreak2 = window
16150 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f  CodeOp(&s, WINDO
16160 57 5f 41 47 47 49 4e 56 45 52 53 45 2c 20 72 65  W_AGGINVERSE, re
16170 67 53 74 61 72 74 2c 20 31 29 3b 0a 20 20 20 20  gStart, 1);.    
16180 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
16190 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
161a0 74 6f 2c 20 30 2c 20 61 64 64 72 53 74 61 72 74  to, 0, addrStart
161b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
161c0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
161d0 64 72 42 72 65 61 6b 32 29 3b 0a 20 20 20 20 61  drBreak2);.    a
161e0 64 64 72 53 74 61 72 74 20 3d 20 73 71 6c 69 74  ddrStart = sqlit
161f0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
16200 72 28 76 29 3b 0a 20 20 20 20 61 64 64 72 42 72  r(v);.    addrBr
16210 65 61 6b 33 20 3d 20 77 69 6e 64 6f 77 43 6f 64  eak3 = windowCod
16220 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52  eOp(&s, WINDOW_R
16230 45 54 55 52 4e 5f 52 4f 57 2c 20 30 2c 20 31 29  ETURN_ROW, 0, 1)
16240 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
16250 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
16260 74 6f 2c 20 30 2c 20 61 64 64 72 53 74 61 72 74  to, 0, addrStart
16270 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
16280 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
16290 64 72 42 72 65 61 6b 31 29 3b 0a 20 20 20 20 73  drBreak1);.    s
162a0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
162b0 72 65 28 76 2c 20 61 64 64 72 42 72 65 61 6b 33  re(v, addrBreak3
162c0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
162d0 69 6e 74 20 61 64 64 72 42 72 65 61 6b 3b 0a 20  int addrBreak;. 
162e0 20 20 20 69 6e 74 20 61 64 64 72 53 74 61 72 74     int addrStart
162f0 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65  ;.    windowCode
16300 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47  Op(&s, WINDOW_AG
16310 47 53 54 45 50 2c 20 30 2c 20 30 29 3b 0a 20 20  GSTEP, 0, 0);.  
16320 20 20 61 64 64 72 53 74 61 72 74 20 3d 20 73 71    addrStart = sq
16330 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
16340 41 64 64 72 28 76 29 3b 0a 20 20 20 20 61 64 64  Addr(v);.    add
16350 72 42 72 65 61 6b 20 3d 20 77 69 6e 64 6f 77 43  rBreak = windowC
16360 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57  odeOp(&s, WINDOW
16370 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 30 2c 20  _RETURN_ROW, 0, 
16380 31 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f  1);.    windowCo
16390 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f  deOp(&s, WINDOW_
163a0 41 47 47 49 4e 56 45 52 53 45 2c 20 72 65 67 53  AGGINVERSE, regS
163b0 74 61 72 74 2c 20 30 29 3b 0a 20 20 20 20 73 71  tart, 0);.    sq
163c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
163d0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
163e0 64 64 72 53 74 61 72 74 29 3b 0a 20 20 20 20 73  ddrStart);.    s
163f0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
16400 72 65 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29  re(v, addrBreak)
16410 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
16420 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
16430 64 64 72 45 6d 70 74 79 29 3b 0a 0a 20 20 73 71  ddrEmpty);..  sq
16440 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
16450 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74 65  v, OP_ResetSorte
16460 72 2c 20 73 2e 63 75 72 72 65 6e 74 2e 63 73 72  r, s.current.csr
16470 29 3b 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  );.  if( pMWin->
16480 70 50 61 72 74 69 74 69 6f 6e 20 29 7b 0a 20 20  pPartition ){.  
16490 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 72 65 67    if( pMWin->reg
164a0 53 74 61 72 74 52 6f 77 69 64 20 29 7b 0a 20 20  StartRowid ){.  
164b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
164c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
164d0 67 65 72 2c 20 31 2c 20 70 4d 57 69 6e 2d 3e 72  ger, 1, pMWin->r
164e0 65 67 53 74 61 72 74 52 6f 77 69 64 29 3b 0a 20  egStartRowid);. 
164f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16500 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
16510 65 67 65 72 2c 20 30 2c 20 70 4d 57 69 6e 2d 3e  eger, 0, pMWin->
16520 72 65 67 45 6e 64 52 6f 77 69 64 29 3b 0a 20 20  regEndRowid);.  
16530 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
16540 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 61  dbeChangeP1(v, a
16550 64 64 72 49 6e 74 65 67 65 72 2c 20 73 71 6c 69  ddrInteger, sqli
16560 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
16570 64 72 28 76 29 29 3b 0a 20 20 20 20 73 71 6c 69  dr(v));.    sqli
16580 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
16590 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 46   OP_Return, regF
165a0 6c 75 73 68 50 61 72 74 29 3b 0a 20 20 7d 0a 7d  lushPart);.  }.}
165b0 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
165c0 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55  TE_OMIT_WINDOWFU
165d0 4e 43 20 2a 2f 0a                                NC */.