/ Hex Artifact Content
Login

Artifact 3ea716bb0dd5ffc8cdbaa48baffc525958b51bc61b2afd73a56baccfcd7ceb2f:


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 46  a[nInit+i].sortF
6c20: 6c 61 67 73 20 3d 20 70 41 70 70 65 6e 64 2d 3e  lags = pAppend->
6c30: 61 5b 69 5d 2e 73 6f 72 74 46 6c 61 67 73 3b 0a  a[i].sortFlags;.
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 26 26 20 70 2d 3e 70 4f 72 64 65 72  rBy && p->pOrder
7250: 42 79 2d 3e 6e 45 78 70 72 3c 3d 70 53 6f 72 74  By->nExpr<=pSort
7260: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
7270: 20 69 6e 74 20 6e 53 61 76 65 20 3d 20 70 53 6f   int nSave = pSo
7280: 72 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  rt->nExpr;.     
7290: 20 70 53 6f 72 74 2d 3e 6e 45 78 70 72 20 3d 20   pSort->nExpr = 
72a0: 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  p->pOrderBy->nEx
72b0: 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  pr;.      if( sq
72c0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d  lite3ExprListCom
72d0: 70 61 72 65 28 70 53 6f 72 74 2c 20 70 2d 3e 70  pare(pSort, p->p
72e0: 4f 72 64 65 72 42 79 2c 20 2d 31 29 3d 3d 30 20  OrderBy, -1)==0 
72f0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
7300: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
7310: 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
7320: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4f  );.        p->pO
7330: 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
7340: 20 20 7d 0a 20 20 20 20 20 20 70 53 6f 72 74 2d    }.      pSort-
7350: 3e 6e 45 78 70 72 20 3d 20 6e 53 61 76 65 3b 0a  >nExpr = nSave;.
7360: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 73      }..    /* As
7370: 73 69 67 6e 20 61 20 63 75 72 73 6f 72 20 6e 75  sign a cursor nu
7380: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 65 70 68  mber for the eph
7390: 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 75 73 65  emeral table use
73a0: 64 20 74 6f 20 62 75 66 66 65 72 20 72 6f 77 73  d to buffer rows
73b0: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 4f 70 65  ..    ** The Ope
73c0: 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72  nEphemeral instr
73d0: 75 63 74 69 6f 6e 20 69 73 20 63 6f 64 65 64 20  uction is coded 
73e0: 6c 61 74 65 72 2c 20 61 66 74 65 72 20 69 74 20  later, after it 
73f0: 69 73 20 6b 6e 6f 77 6e 20 68 6f 77 0a 20 20 20  is known how.   
7400: 20 2a 2a 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73   ** many columns
7410: 20 74 68 65 20 74 61 62 6c 65 20 77 69 6c 6c 20   the table will 
7420: 68 61 76 65 2e 20 20 2a 2f 0a 20 20 20 20 70 4d  have.  */.    pM
7430: 57 69 6e 2d 3e 69 45 70 68 43 73 72 20 3d 20 70  Win->iEphCsr = p
7440: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
7450: 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20     pParse->nTab 
7460: 2b 3d 20 33 3b 0a 0a 20 20 20 20 73 65 6c 65 63  += 3;..    selec
7470: 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65 45 4c  tWindowRewriteEL
7480: 69 73 74 28 70 50 61 72 73 65 2c 20 70 4d 57 69  ist(pParse, pMWi
7490: 6e 2c 20 70 53 72 63 2c 20 70 2d 3e 70 45 4c 69  n, pSrc, p->pELi
74a0: 73 74 2c 20 70 54 61 62 2c 20 26 70 53 75 62 6c  st, pTab, &pSubl
74b0: 69 73 74 29 3b 0a 20 20 20 20 73 65 6c 65 63 74  ist);.    select
74c0: 57 69 6e 64 6f 77 52 65 77 72 69 74 65 45 4c 69  WindowRewriteELi
74d0: 73 74 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  st(pParse, pMWin
74e0: 2c 20 70 53 72 63 2c 20 70 2d 3e 70 4f 72 64 65  , pSrc, p->pOrde
74f0: 72 42 79 2c 20 70 54 61 62 2c 20 26 70 53 75 62  rBy, pTab, &pSub
7500: 6c 69 73 74 29 3b 0a 20 20 20 20 70 4d 57 69 6e  list);.    pMWin
7510: 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 20 3d 20 28  ->nBufferCol = (
7520: 70 53 75 62 6c 69 73 74 20 3f 20 70 53 75 62 6c  pSublist ? pSubl
7530: 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b  ist->nExpr : 0);
7540: 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20  ..    /* Append 
7550: 74 68 65 20 50 41 52 54 49 54 49 4f 4e 20 42 59  the PARTITION BY
7560: 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 65 78   and ORDER BY ex
7570: 70 72 65 73 73 69 6f 6e 73 20 74 6f 20 74 68 65  pressions to the
7580: 20 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   to the .    ** 
7590: 73 75 62 2d 73 65 6c 65 63 74 20 65 78 70 72 65  sub-select expre
75a0: 73 73 69 6f 6e 20 6c 69 73 74 2e 20 54 68 65 79  ssion list. They
75b0: 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f   are required to
75c0: 20 66 69 67 75 72 65 20 6f 75 74 20 77 68 65 72   figure out wher
75d0: 65 20 0a 20 20 20 20 2a 2a 20 62 6f 75 6e 64 61  e .    ** bounda
75e0: 72 69 65 73 20 66 6f 72 20 70 61 72 74 69 74 69  ries for partiti
75f0: 6f 6e 73 20 61 6e 64 20 73 65 74 73 20 6f 66 20  ons and sets of 
7600: 70 65 65 72 20 72 6f 77 73 20 6c 69 65 2e 20 20  peer rows lie.  
7610: 2a 2f 0a 20 20 20 20 70 53 75 62 6c 69 73 74 20  */.    pSublist 
7620: 3d 20 65 78 70 72 4c 69 73 74 41 70 70 65 6e 64  = exprListAppend
7630: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 75  List(pParse, pSu
7640: 62 6c 69 73 74 2c 20 70 4d 57 69 6e 2d 3e 70 50  blist, pMWin->pP
7650: 61 72 74 69 74 69 6f 6e 2c 20 30 29 3b 0a 20 20  artition, 0);.  
7660: 20 20 70 53 75 62 6c 69 73 74 20 3d 20 65 78 70    pSublist = exp
7670: 72 4c 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28  rListAppendList(
7680: 70 50 61 72 73 65 2c 20 70 53 75 62 6c 69 73 74  pParse, pSublist
7690: 2c 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42  , pMWin->pOrderB
76a0: 79 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 41  y, 0);..    /* A
76b0: 70 70 65 6e 64 20 74 68 65 20 61 72 67 75 6d 65  ppend the argume
76c0: 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 65 61  nts passed to ea
76d0: 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  ch window functi
76e0: 6f 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  on to the.    **
76f0: 20 73 75 62 2d 73 65 6c 65 63 74 20 65 78 70 72   sub-select expr
7700: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 41 6c 73  ession list. Als
7710: 6f 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 72  o allocate two r
7720: 65 67 69 73 74 65 72 73 20 66 6f 72 20 65 61 63  egisters for eac
7730: 68 0a 20 20 20 20 2a 2a 20 77 69 6e 64 6f 77 20  h.    ** window 
7740: 66 75 6e 63 74 69 6f 6e 20 2d 20 6f 6e 65 20 66  function - one f
7750: 6f 72 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  or the accumulat
7760: 6f 72 2c 20 61 6e 6f 74 68 65 72 20 66 6f 72 20  or, another for 
7770: 69 6e 74 65 72 69 6d 0a 20 20 20 20 2a 2a 20 72  interim.    ** r
7780: 65 73 75 6c 74 73 2e 20 20 2a 2f 0a 20 20 20 20  esults.  */.    
7790: 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20  for(pWin=pMWin; 
77a0: 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d  pWin; pWin=pWin-
77b0: 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20  >pNextWin){.    
77c0: 20 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 20    pWin->iArgCol 
77d0: 3d 20 28 70 53 75 62 6c 69 73 74 20 3f 20 70 53  = (pSublist ? pS
77e0: 75 62 6c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20  ublist->nExpr : 
77f0: 30 29 3b 0a 20 20 20 20 20 20 70 53 75 62 6c 69  0);.      pSubli
7800: 73 74 20 3d 20 65 78 70 72 4c 69 73 74 41 70 70  st = exprListApp
7810: 65 6e 64 4c 69 73 74 28 70 50 61 72 73 65 2c 20  endList(pParse, 
7820: 70 53 75 62 6c 69 73 74 2c 20 70 57 69 6e 2d 3e  pSublist, pWin->
7830: 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 2c  pOwner->x.pList,
7840: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
7850: 57 69 6e 2d 3e 70 46 69 6c 74 65 72 20 29 7b 0a  Win->pFilter ){.
7860: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 46          Expr *pF
7870: 69 6c 74 65 72 20 3d 20 73 71 6c 69 74 65 33 45  ilter = sqlite3E
7880: 78 70 72 44 75 70 28 64 62 2c 20 70 57 69 6e 2d  xprDup(db, pWin-
7890: 3e 70 46 69 6c 74 65 72 2c 20 30 29 3b 0a 20 20  >pFilter, 0);.  
78a0: 20 20 20 20 20 20 70 53 75 62 6c 69 73 74 20 3d        pSublist =
78b0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
78c0: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
78d0: 53 75 62 6c 69 73 74 2c 20 70 46 69 6c 74 65 72  Sublist, pFilter
78e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
78f0: 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 20   pWin->regAccum 
7900: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
7910: 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 72 65  ;.      pWin->re
7920: 67 52 65 73 75 6c 74 20 3d 20 2b 2b 70 50 61 72  gResult = ++pPar
7930: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
7940: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7950: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
7960: 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 29   pWin->regAccum)
7970: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
7980: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f  If there is no O
7990: 52 44 45 52 20 42 59 20 6f 72 20 50 41 52 54 49  RDER BY or PARTI
79a0: 54 49 4f 4e 20 42 59 20 63 6c 61 75 73 65 2c 20  TION BY clause, 
79b0: 61 6e 64 20 74 68 65 20 77 69 6e 64 6f 77 0a 20  and the window. 
79c0: 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61     ** function a
79d0: 63 63 65 70 74 73 20 7a 65 72 6f 20 61 72 67 75  ccepts zero argu
79e0: 6d 65 6e 74 73 2c 20 61 6e 64 20 74 68 65 72 65  ments, and there
79f0: 20 61 72 65 20 6e 6f 20 6f 74 68 65 72 20 63 6f   are no other co
7a00: 6c 75 6d 6e 73 0a 20 20 20 20 2a 2a 20 73 65 6c  lumns.    ** sel
7a10: 65 63 74 65 64 20 28 65 2e 67 2e 20 22 53 45 4c  ected (e.g. "SEL
7a20: 45 43 54 20 72 6f 77 5f 6e 75 6d 62 65 72 28 29  ECT row_number()
7a30: 20 4f 56 45 52 20 28 29 20 46 52 4f 4d 20 74 31   OVER () FROM t1
7a40: 22 29 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  "), it is possib
7a50: 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 70  le.    ** that p
7a60: 53 75 62 6c 69 73 74 20 69 73 20 73 74 69 6c 6c  Sublist is still
7a70: 20 4e 55 4c 4c 20 68 65 72 65 2e 20 41 64 64 20   NULL here. Add 
7a80: 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65  a constant expre
7a90: 73 73 69 6f 6e 20 68 65 72 65 20 74 6f 20 0a 20  ssion here to . 
7aa0: 20 20 20 2a 2a 20 6b 65 65 70 20 65 76 65 72 79     ** keep every
7ab0: 74 68 69 6e 67 20 6c 65 67 61 6c 20 69 6e 20 74  thing legal in t
7ac0: 68 69 73 20 63 61 73 65 2e 20 0a 20 20 20 20 2a  his case. .    *
7ad0: 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 6c 69  /.    if( pSubli
7ae0: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  st==0 ){.      p
7af0: 53 75 62 6c 69 73 74 20 3d 20 73 71 6c 69 74 65  Sublist = sqlite
7b00: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
7b10: 70 50 61 72 73 65 2c 20 30 2c 20 0a 20 20 20 20  pParse, 0, .    
7b20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
7b30: 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e  rAlloc(db, TK_IN
7b40: 54 45 47 45 52 2c 20 26 73 71 6c 69 74 65 33 49  TEGER, &sqlite3I
7b50: 6e 74 54 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29 0a  ntTokens[0], 0).
7b60: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a        );.    }..
7b70: 20 20 20 20 70 53 75 62 20 3d 20 73 71 6c 69 74      pSub = sqlit
7b80: 65 33 53 65 6c 65 63 74 4e 65 77 28 0a 20 20 20  e3SelectNew(.   
7b90: 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 53 75       pParse, pSu
7ba0: 62 6c 69 73 74 2c 20 70 53 72 63 2c 20 70 57 68  blist, pSrc, pWh
7bb0: 65 72 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 70  ere, pGroupBy, p
7bc0: 48 61 76 69 6e 67 2c 20 70 53 6f 72 74 2c 20 30  Having, pSort, 0
7bd0: 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 20 20 70  , 0.    );.    p
7be0: 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  ->pSrc = sqlite3
7bf0: 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 70 50  SrcListAppend(pP
7c00: 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  arse, 0, 0, 0);.
7c10: 20 20 20 20 69 66 28 20 70 2d 3e 70 53 72 63 20      if( p->pSrc 
7c20: 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  ){.      Table *
7c30: 70 54 61 62 32 3b 0a 20 20 20 20 20 20 70 2d 3e  pTab2;.      p->
7c40: 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
7c50: 63 74 20 3d 20 70 53 75 62 3b 0a 20 20 20 20 20  ct = pSub;.     
7c60: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
7c70: 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61  ssignCursors(pPa
7c80: 72 73 65 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20  rse, p->pSrc);. 
7c90: 20 20 20 20 20 70 53 75 62 2d 3e 73 65 6c 46 6c       pSub->selFl
7ca0: 61 67 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64  ags |= SF_Expand
7cb0: 65 64 3b 0a 20 20 20 20 20 20 70 54 61 62 32 20  ed;.      pTab2 
7cc0: 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  = sqlite3ResultS
7cd0: 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73  etOfSelect(pPars
7ce0: 65 2c 20 70 53 75 62 2c 20 53 51 4c 49 54 45 5f  e, pSub, SQLITE_
7cf0: 41 46 46 5f 4e 4f 4e 45 29 3b 0a 20 20 20 20 20  AFF_NONE);.     
7d00: 20 69 66 28 20 70 54 61 62 32 3d 3d 30 20 29 7b   if( pTab2==0 ){
7d10: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
7d20: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
7d30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7d40: 20 6d 65 6d 63 70 79 28 70 54 61 62 2c 20 70 54   memcpy(pTab, pT
7d50: 61 62 32 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c  ab2, sizeof(Tabl
7d60: 65 29 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61  e));.        pTa
7d70: 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54  b->tabFlags |= T
7d80: 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20  F_Ephemeral;.   
7d90: 20 20 20 20 20 70 2d 3e 70 53 72 63 2d 3e 61 5b       p->pSrc->a[
7da0: 30 5d 2e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a  0].pTab = pTab;.
7db0: 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70          pTab = p
7dc0: 54 61 62 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Tab2;.      }.  
7dd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7de0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
7df0: 45 70 68 65 6d 65 72 61 6c 2c 20 70 4d 57 69 6e  Ephemeral, pMWin
7e00: 2d 3e 69 45 70 68 43 73 72 2c 20 70 53 75 62 6c  ->iEphCsr, pSubl
7e10: 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
7e20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7e30: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44  dOp2(v, OP_OpenD
7e40: 75 70 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43  up, pMWin->iEphC
7e50: 73 72 2b 31 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  sr+1, pMWin->iEp
7e60: 68 43 73 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  hCsr);.      sql
7e70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
7e80: 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70 4d  , OP_OpenDup, pM
7e90: 57 69 6e 2d 3e 69 45 70 68 43 73 72 2b 32 2c 20  Win->iEphCsr+2, 
7ea0: 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b  pMWin->iEphCsr);
7eb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
7ec0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
7ed0: 70 65 6e 44 75 70 2c 20 70 4d 57 69 6e 2d 3e 69  penDup, pMWin->i
7ee0: 45 70 68 43 73 72 2b 33 2c 20 70 4d 57 69 6e 2d  EphCsr+3, pMWin-
7ef0: 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 20 20 7d  >iEphCsr);.    }
7f00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
7f10: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
7f20: 64 62 2c 20 70 53 75 62 29 3b 0a 20 20 20 20 7d  db, pSub);.    }
7f30: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
7f40: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 63 20 3d  locFailed ) rc =
7f50: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
7f60: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
7f70: 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 7d 0a  (db, pTab);.  }.
7f80: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
7f90: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68  ./*.** Unlink th
7fa0: 65 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20  e Window object 
7fb0: 66 72 6f 6d 20 74 68 65 20 53 65 6c 65 63 74 20  from the Select 
7fc0: 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 61  to which it is a
7fd0: 74 74 61 63 68 65 64 2c 0a 2a 2a 20 69 66 20 69  ttached,.** if i
7fe0: 74 20 69 73 20 61 74 74 61 63 68 65 64 2e 0a 2a  t is attached..*
7ff0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69  /.void sqlite3Wi
8000: 6e 64 6f 77 55 6e 6c 69 6e 6b 46 72 6f 6d 53 65  ndowUnlinkFromSe
8010: 6c 65 63 74 28 57 69 6e 64 6f 77 20 2a 70 29 7b  lect(Window *p){
8020: 0a 20 20 69 66 28 20 70 2d 3e 70 70 54 68 69 73  .  if( p->ppThis
8030: 20 29 7b 0a 20 20 20 20 2a 70 2d 3e 70 70 54 68   ){.    *p->ppTh
8040: 69 73 20 3d 20 70 2d 3e 70 4e 65 78 74 57 69 6e  is = p->pNextWin
8050: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65  ;.    if( p->pNe
8060: 78 74 57 69 6e 20 29 20 70 2d 3e 70 4e 65 78 74  xtWin ) p->pNext
8070: 57 69 6e 2d 3e 70 70 54 68 69 73 20 3d 20 70 2d  Win->ppThis = p-
8080: 3e 70 70 54 68 69 73 3b 0a 20 20 20 20 70 2d 3e  >ppThis;.    p->
8090: 70 70 54 68 69 73 20 3d 20 30 3b 0a 20 20 7d 0a  ppThis = 0;.  }.
80a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  }../*.** Free th
80b0: 65 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20  e Window object 
80c0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
80d0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
80e0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69  /.void sqlite3Wi
80f0: 6e 64 6f 77 44 65 6c 65 74 65 28 73 71 6c 69 74  ndowDelete(sqlit
8100: 65 33 20 2a 64 62 2c 20 57 69 6e 64 6f 77 20 2a  e3 *db, Window *
8110: 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  p){.  if( p ){. 
8120: 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77     sqlite3Window
8130: 55 6e 6c 69 6e 6b 46 72 6f 6d 53 65 6c 65 63 74  UnlinkFromSelect
8140: 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (p);.    sqlite3
8150: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
8160: 2d 3e 70 46 69 6c 74 65 72 29 3b 0a 20 20 20 20  ->pFilter);.    
8170: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
8180: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 61  elete(db, p->pPa
8190: 72 74 69 74 69 6f 6e 29 3b 0a 20 20 20 20 73 71  rtition);.    sq
81a0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
81b0: 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  ete(db, p->pOrde
81c0: 72 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rBy);.    sqlite
81d0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
81e0: 70 2d 3e 70 45 6e 64 29 3b 0a 20 20 20 20 73 71  p->pEnd);.    sq
81f0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
8200: 64 62 2c 20 70 2d 3e 70 53 74 61 72 74 29 3b 0a  db, p->pStart);.
8210: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
8220: 65 28 64 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b  e(db, p->zName);
8230: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
8240: 65 65 28 64 62 2c 20 70 2d 3e 7a 42 61 73 65 29  ee(db, p->zBase)
8250: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
8260: 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a  ree(db, p);.  }.
8270: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  }../*.** Free th
8280: 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  e linked list of
8290: 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 73 20   Window objects 
82a0: 73 74 61 72 74 69 6e 67 20 61 74 20 74 68 65 20  starting at the 
82b0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
82c0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
82d0: 57 69 6e 64 6f 77 4c 69 73 74 44 65 6c 65 74 65  WindowListDelete
82e0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69  (sqlite3 *db, Wi
82f0: 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 77 68 69 6c  ndow *p){.  whil
8300: 65 28 20 70 20 29 7b 0a 20 20 20 20 57 69 6e 64  e( p ){.    Wind
8310: 6f 77 20 2a 70 4e 65 78 74 20 3d 20 70 2d 3e 70  ow *pNext = p->p
8320: 4e 65 78 74 57 69 6e 3b 0a 20 20 20 20 73 71 6c  NextWin;.    sql
8330: 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65 74 65  ite3WindowDelete
8340: 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 70 20 3d  (db, p);.    p =
8350: 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f   pNext;.  }.}../
8360: 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  *.** The argumen
8370: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  t expression is 
8380: 61 6e 20 50 52 45 43 45 44 49 4e 47 20 6f 72 20  an PRECEDING or 
8390: 46 4f 4c 4c 4f 57 49 4e 47 20 6f 66 66 73 65 74  FOLLOWING offset
83a0: 2e 20 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20  .  The.** value 
83b0: 73 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f 6e 2d  should be a non-
83c0: 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72  negative integer
83d0: 2e 20 20 49 66 20 74 68 65 20 76 61 6c 75 65 20  .  If the value 
83e0: 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 63 6f 6e 73  is not a.** cons
83f0: 74 61 6e 74 2c 20 63 68 61 6e 67 65 20 69 74 20  tant, change it 
8400: 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 65 20 66 61  to NULL.  The fa
8410: 63 74 20 74 68 61 74 20 69 74 20 69 73 20 74 68  ct that it is th
8420: 65 6e 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  en a non-negativ
8430: 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 77 69 6c  e.** integer wil
8440: 6c 20 62 65 20 63 61 75 67 68 74 20 6c 61 74 65  l be caught late
8450: 72 2e 20 20 42 75 74 20 69 74 20 69 73 20 69 6d  r.  But it is im
8460: 70 6f 72 74 61 6e 74 20 6e 6f 74 20 74 6f 20 6c  portant not to l
8470: 65 61 76 65 0a 2a 2a 20 76 61 72 69 61 62 6c 65  eave.** variable
8480: 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 65   values in the e
8490: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a  xpression tree..
84a0: 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a  */.static Expr *
84b0: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4f 66 66  sqlite3WindowOff
84c0: 73 65 74 45 78 70 72 28 50 61 72 73 65 20 2a 70  setExpr(Parse *p
84d0: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
84e0: 70 72 29 7b 0a 20 20 69 66 28 20 30 3d 3d 73 71  pr){.  if( 0==sq
84f0: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
8500: 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a 20 20  ant(pExpr) ){.  
8510: 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f    if( IN_RENAME_
8520: 4f 42 4a 45 43 54 20 29 20 73 71 6c 69 74 65 33  OBJECT ) sqlite3
8530: 52 65 6e 61 6d 65 45 78 70 72 55 6e 6d 61 70 28  RenameExprUnmap(
8540: 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a  pParse, pExpr);.
8550: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
8560: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
8570: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 70 45  , pExpr);.    pE
8580: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
8590: 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64  rAlloc(pParse->d
85a0: 62 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30  b, TK_NULL, 0, 0
85b0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
85c0: 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pExpr;.}../*.** 
85d0: 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74  Allocate and ret
85e0: 75 72 6e 20 61 20 6e 65 77 20 57 69 6e 64 6f 77  urn a new Window
85f0: 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69 62 69   object describi
8600: 6e 67 20 61 20 57 69 6e 64 6f 77 20 44 65 66 69  ng a Window Defi
8610: 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 57 69 6e 64 6f  nition..*/.Windo
8620: 77 20 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  w *sqlite3Window
8630: 41 6c 6c 6f 63 28 0a 20 20 50 61 72 73 65 20 2a  Alloc(.  Parse *
8640: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
8650: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
8660: 0a 20 20 69 6e 74 20 65 54 79 70 65 2c 20 20 20  .  int eType,   
8670: 20 20 20 20 20 2f 2a 20 46 72 61 6d 65 20 74 79       /* Frame ty
8680: 70 65 2e 20 54 4b 5f 52 41 4e 47 45 2c 20 54 4b  pe. TK_RANGE, TK
8690: 5f 52 4f 57 53 2c 20 54 4b 5f 47 52 4f 55 50 53  _ROWS, TK_GROUPS
86a0: 2c 20 6f 72 20 30 20 2a 2f 0a 20 20 69 6e 74 20  , or 0 */.  int 
86b0: 65 53 74 61 72 74 2c 20 20 20 20 20 20 20 2f 2a  eStart,       /*
86c0: 20 53 74 61 72 74 20 74 79 70 65 3a 20 43 55 52   Start type: CUR
86d0: 52 45 4e 54 2c 20 50 52 45 43 45 44 49 4e 47 2c  RENT, PRECEDING,
86e0: 20 46 4f 4c 4c 4f 57 49 4e 47 2c 20 55 4e 42 4f   FOLLOWING, UNBO
86f0: 55 4e 44 45 44 20 2a 2f 0a 20 20 45 78 70 72 20  UNDED */.  Expr 
8700: 2a 70 53 74 61 72 74 2c 20 20 20 20 20 2f 2a 20  *pStart,     /* 
8710: 53 74 61 72 74 20 77 69 6e 64 6f 77 20 73 69 7a  Start window siz
8720: 65 20 69 66 20 54 4b 5f 50 52 45 43 45 44 49 4e  e if TK_PRECEDIN
8730: 47 20 6f 72 20 46 4f 4c 4c 4f 57 49 4e 47 20 2a  G or FOLLOWING *
8740: 2f 0a 20 20 69 6e 74 20 65 45 6e 64 2c 20 20 20  /.  int eEnd,   
8750: 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 74 79 70        /* End typ
8760: 65 3a 20 43 55 52 52 45 4e 54 2c 20 46 4f 4c 4c  e: CURRENT, FOLL
8770: 4f 57 49 4e 47 2c 20 54 4b 5f 55 4e 42 4f 55 4e  OWING, TK_UNBOUN
8780: 44 45 44 2c 20 50 52 45 43 45 44 49 4e 47 20 2a  DED, PRECEDING *
8790: 2f 0a 20 20 45 78 70 72 20 2a 70 45 6e 64 2c 20  /.  Expr *pEnd, 
87a0: 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 77 69 6e        /* End win
87b0: 64 6f 77 20 73 69 7a 65 20 69 66 20 54 4b 5f 46  dow size if TK_F
87c0: 4f 4c 4c 4f 57 49 4e 47 20 6f 72 20 50 52 45 43  OLLOWING or PREC
87d0: 45 44 49 4e 47 20 2a 2f 0a 20 20 75 38 20 65 45  EDING */.  u8 eE
87e0: 78 63 6c 75 64 65 20 20 20 20 20 20 20 2f 2a 20  xclude       /* 
87f0: 45 58 43 4c 55 44 45 20 63 6c 61 75 73 65 20 2a  EXCLUDE clause *
8800: 2f 0a 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70  /.){.  Window *p
8810: 57 69 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 62  Win = 0;.  int b
8820: 49 6d 70 6c 69 63 69 74 46 72 61 6d 65 20 3d 20  ImplicitFrame = 
8830: 30 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 72 20  0;..  /* Parser 
8840: 61 73 73 75 72 65 73 20 74 68 65 20 66 6f 6c 6c  assures the foll
8850: 6f 77 69 6e 67 3a 20 2a 2f 0a 20 20 61 73 73 65  owing: */.  asse
8860: 72 74 28 20 65 54 79 70 65 3d 3d 30 20 7c 7c 20  rt( eType==0 || 
8870: 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 20  eType==TK_RANGE 
8880: 7c 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 52 4f 57  || eType==TK_ROW
8890: 53 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 47  S || eType==TK_G
88a0: 52 4f 55 50 53 20 29 3b 0a 20 20 61 73 73 65 72  ROUPS );.  asser
88b0: 74 28 20 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55  t( eStart==TK_CU
88c0: 52 52 45 4e 54 20 7c 7c 20 65 53 74 61 72 74 3d  RRENT || eStart=
88d0: 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 0a 20 20  =TK_PRECEDING.  
88e0: 20 20 20 20 20 20 20 20 20 7c 7c 20 65 53 74 61           || eSta
88f0: 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  rt==TK_UNBOUNDED
8900: 20 7c 7c 20 65 53 74 61 72 74 3d 3d 54 4b 5f 46   || eStart==TK_F
8910: 4f 4c 4c 4f 57 49 4e 47 20 29 3b 0a 20 20 61 73  OLLOWING );.  as
8920: 73 65 72 74 28 20 65 45 6e 64 3d 3d 54 4b 5f 43  sert( eEnd==TK_C
8930: 55 52 52 45 4e 54 20 7c 7c 20 65 45 6e 64 3d 3d  URRENT || eEnd==
8940: 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20 20  TK_FOLLOWING.   
8950: 20 20 20 20 20 20 20 20 7c 7c 20 65 45 6e 64 3d          || eEnd=
8960: 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 7c 7c  =TK_UNBOUNDED ||
8970: 20 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44   eEnd==TK_PRECED
8980: 49 4e 47 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ING );.  assert(
8990: 20 28 65 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45   (eStart==TK_PRE
89a0: 43 45 44 49 4e 47 20 7c 7c 20 65 53 74 61 72 74  CEDING || eStart
89b0: 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 29 3d  ==TK_FOLLOWING)=
89c0: 3d 28 70 53 74 61 72 74 21 3d 30 29 20 29 3b 0a  =(pStart!=0) );.
89d0: 20 20 61 73 73 65 72 74 28 20 28 65 45 6e 64 3d    assert( (eEnd=
89e0: 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 7c 7c  =TK_FOLLOWING ||
89f0: 20 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44   eEnd==TK_PRECED
8a00: 49 4e 47 29 3d 3d 28 70 45 6e 64 21 3d 30 29 20  ING)==(pEnd!=0) 
8a10: 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d  );..  if( eType=
8a20: 3d 30 20 29 7b 0a 20 20 20 20 62 49 6d 70 6c 69  =0 ){.    bImpli
8a30: 63 69 74 46 72 61 6d 65 20 3d 20 31 3b 0a 20 20  citFrame = 1;.  
8a40: 20 20 65 54 79 70 65 20 3d 20 54 4b 5f 52 41 4e    eType = TK_RAN
8a50: 47 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64  GE;.  }..  /* Ad
8a60: 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 0a  ditionally, the.
8a70: 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 62 6f    ** starting bo
8a80: 75 6e 64 61 72 79 20 74 79 70 65 20 6d 61 79 20  undary type may 
8a90: 6e 6f 74 20 6f 63 63 75 72 20 65 61 72 6c 69 65  not occur earlie
8aa0: 72 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  r in the followi
8ab0: 6e 67 20 6c 69 73 74 20 74 68 61 6e 0a 20 20 2a  ng list than.  *
8ac0: 2a 20 74 68 65 20 65 6e 64 69 6e 67 20 62 6f 75  * the ending bou
8ad0: 6e 64 61 72 79 20 74 79 70 65 3a 0a 20 20 2a 2a  ndary type:.  **
8ae0: 0a 20 20 2a 2a 20 20 20 55 4e 42 4f 55 4e 44 45  .  **   UNBOUNDE
8af0: 44 20 50 52 45 43 45 44 49 4e 47 0a 20 20 2a 2a  D PRECEDING.  **
8b00: 20 20 20 3c 65 78 70 72 3e 20 50 52 45 43 45 44     <expr> PRECED
8b10: 49 4e 47 0a 20 20 2a 2a 20 20 20 43 55 52 52 45  ING.  **   CURRE
8b20: 4e 54 20 52 4f 57 0a 20 20 2a 2a 20 20 20 3c 65  NT ROW.  **   <e
8b30: 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 20  xpr> FOLLOWING. 
8b40: 20 2a 2a 20 20 20 55 4e 42 4f 55 4e 44 45 44 20   **   UNBOUNDED 
8b50: 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20 2a 2a 0a 20  FOLLOWING.  **. 
8b60: 20 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 65   ** The parser e
8b70: 6e 73 75 72 65 73 20 74 68 61 74 20 22 55 4e 42  nsures that "UNB
8b80: 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47  OUNDED PRECEDING
8b90: 22 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  " cannot be used
8ba0: 20 61 73 20 61 6e 20 65 6e 64 69 6e 67 0a 20 20   as an ending.  
8bb0: 2a 2a 20 62 6f 75 6e 64 61 72 79 2c 20 61 6e 64  ** boundary, and
8bc0: 20 74 68 61 6e 20 22 55 4e 42 4f 55 4e 44 45 44   than "UNBOUNDED
8bd0: 20 46 4f 4c 4c 4f 57 49 4e 47 22 20 63 61 6e 6e   FOLLOWING" cann
8be0: 6f 74 20 62 65 20 75 73 65 64 20 61 73 20 61 20  ot be used as a 
8bf0: 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 66 72  starting.  ** fr
8c00: 61 6d 65 20 62 6f 75 6e 64 61 72 79 2e 0a 20 20  ame boundary..  
8c10: 2a 2f 0a 20 20 69 66 28 20 28 65 53 74 61 72 74  */.  if( (eStart
8c20: 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 26 26 20  ==TK_CURRENT && 
8c30: 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49  eEnd==TK_PRECEDI
8c40: 4e 47 29 0a 20 20 20 7c 7c 20 28 65 53 74 61 72  NG).   || (eStar
8c50: 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  t==TK_FOLLOWING 
8c60: 26 26 20 28 65 45 6e 64 3d 3d 54 4b 5f 50 52 45  && (eEnd==TK_PRE
8c70: 43 45 44 49 4e 47 20 7c 7c 20 65 45 6e 64 3d 3d  CEDING || eEnd==
8c80: 54 4b 5f 43 55 52 52 45 4e 54 29 29 0a 20 20 29  TK_CURRENT)).  )
8c90: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
8ca0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
8cb0: 6e 73 75 70 70 6f 72 74 65 64 20 66 72 61 6d 65  nsupported frame
8cc0: 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 22 29   specification")
8cd0: 3b 0a 20 20 20 20 67 6f 74 6f 20 77 69 6e 64 6f  ;.    goto windo
8ce0: 77 41 6c 6c 6f 63 45 72 72 3b 0a 20 20 7d 0a 0a  wAllocErr;.  }..
8cf0: 20 20 70 57 69 6e 20 3d 20 28 57 69 6e 64 6f 77    pWin = (Window
8d00: 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  *)sqlite3DbMallo
8d10: 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62  cZero(pParse->db
8d20: 2c 20 73 69 7a 65 6f 66 28 57 69 6e 64 6f 77 29  , sizeof(Window)
8d30: 29 3b 0a 20 20 69 66 28 20 70 57 69 6e 3d 3d 30  );.  if( pWin==0
8d40: 20 29 20 67 6f 74 6f 20 77 69 6e 64 6f 77 41 6c   ) goto windowAl
8d50: 6c 6f 63 45 72 72 3b 0a 20 20 70 57 69 6e 2d 3e  locErr;.  pWin->
8d60: 65 46 72 6d 54 79 70 65 20 3d 20 65 54 79 70 65  eFrmType = eType
8d70: 3b 0a 20 20 70 57 69 6e 2d 3e 65 53 74 61 72 74  ;.  pWin->eStart
8d80: 20 3d 20 65 53 74 61 72 74 3b 0a 20 20 70 57 69   = eStart;.  pWi
8d90: 6e 2d 3e 65 45 6e 64 20 3d 20 65 45 6e 64 3b 0a  n->eEnd = eEnd;.
8da0: 20 20 69 66 28 20 65 45 78 63 6c 75 64 65 3d 3d    if( eExclude==
8db0: 30 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f  0 && Optimizatio
8dc0: 6e 44 69 73 61 62 6c 65 64 28 70 50 61 72 73 65  nDisabled(pParse
8dd0: 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 57 69 6e  ->db, SQLITE_Win
8de0: 64 6f 77 46 75 6e 63 29 20 29 7b 0a 20 20 20 20  dowFunc) ){.    
8df0: 65 45 78 63 6c 75 64 65 20 3d 20 54 4b 5f 4e 4f  eExclude = TK_NO
8e00: 3b 0a 20 20 7d 0a 20 20 70 57 69 6e 2d 3e 65 45  ;.  }.  pWin->eE
8e10: 78 63 6c 75 64 65 20 3d 20 65 45 78 63 6c 75 64  xclude = eExclud
8e20: 65 3b 0a 20 20 70 57 69 6e 2d 3e 62 49 6d 70 6c  e;.  pWin->bImpl
8e30: 69 63 69 74 46 72 61 6d 65 20 3d 20 62 49 6d 70  icitFrame = bImp
8e40: 6c 69 63 69 74 46 72 61 6d 65 3b 0a 20 20 70 57  licitFrame;.  pW
8e50: 69 6e 2d 3e 70 45 6e 64 20 3d 20 73 71 6c 69 74  in->pEnd = sqlit
8e60: 65 33 57 69 6e 64 6f 77 4f 66 66 73 65 74 45 78  e3WindowOffsetEx
8e70: 70 72 28 70 50 61 72 73 65 2c 20 70 45 6e 64 29  pr(pParse, pEnd)
8e80: 3b 0a 20 20 70 57 69 6e 2d 3e 70 53 74 61 72 74  ;.  pWin->pStart
8e90: 20 3d 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77   = sqlite3Window
8ea0: 4f 66 66 73 65 74 45 78 70 72 28 70 50 61 72 73  OffsetExpr(pPars
8eb0: 65 2c 20 70 53 74 61 72 74 29 3b 0a 20 20 72 65  e, pStart);.  re
8ec0: 74 75 72 6e 20 70 57 69 6e 3b 0a 0a 77 69 6e 64  turn pWin;..wind
8ed0: 6f 77 41 6c 6c 6f 63 45 72 72 3a 0a 20 20 73 71  owAllocErr:.  sq
8ee0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
8ef0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 6e 64  pParse->db, pEnd
8f00: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
8f10: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
8f20: 62 2c 20 70 53 74 61 72 74 29 3b 0a 20 20 72 65  b, pStart);.  re
8f30: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
8f40: 20 41 74 74 61 63 68 20 50 41 52 54 49 54 49 4f   Attach PARTITIO
8f50: 4e 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 63  N and ORDER BY c
8f60: 6c 61 75 73 65 73 20 70 50 61 72 74 69 74 69 6f  lauses pPartitio
8f70: 6e 20 61 6e 64 20 70 4f 72 64 65 72 42 79 20 74  n and pOrderBy t
8f80: 6f 20 77 69 6e 64 6f 77 0a 2a 2a 20 70 57 69 6e  o window.** pWin
8f90: 2e 20 41 6c 73 6f 2c 20 69 66 20 70 61 72 61 6d  . Also, if param
8fa0: 65 74 65 72 20 70 42 61 73 65 20 69 73 20 6e 6f  eter pBase is no
8fb0: 74 20 4e 55 4c 4c 2c 20 73 65 74 20 70 57 69 6e  t NULL, set pWin
8fc0: 2d 3e 7a 42 61 73 65 20 74 6f 20 74 68 65 0a 2a  ->zBase to the.*
8fd0: 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 6e 75 6c  * equivalent nul
8fe0: 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
8ff0: 6e 67 2e 0a 2a 2f 0a 57 69 6e 64 6f 77 20 2a 73  ng..*/.Window *s
9000: 71 6c 69 74 65 33 57 69 6e 64 6f 77 41 73 73 65  qlite3WindowAsse
9010: 6d 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70  mble(.  Parse *p
9020: 50 61 72 73 65 2c 20 0a 20 20 57 69 6e 64 6f 77  Parse, .  Window
9030: 20 2a 70 57 69 6e 2c 20 0a 20 20 45 78 70 72 4c   *pWin, .  ExprL
9040: 69 73 74 20 2a 70 50 61 72 74 69 74 69 6f 6e 2c  ist *pPartition,
9050: 20 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f   .  ExprList *pO
9060: 72 64 65 72 42 79 2c 20 0a 20 20 54 6f 6b 65 6e  rderBy, .  Token
9070: 20 2a 70 42 61 73 65 0a 29 7b 0a 20 20 69 66 28   *pBase.){.  if(
9080: 20 70 57 69 6e 20 29 7b 0a 20 20 20 20 70 57 69   pWin ){.    pWi
9090: 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 3d 20  n->pPartition = 
90a0: 70 50 61 72 74 69 74 69 6f 6e 3b 0a 20 20 20 20  pPartition;.    
90b0: 70 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pWin->pOrderBy =
90c0: 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 69   pOrderBy;.    i
90d0: 66 28 20 70 42 61 73 65 20 29 7b 0a 20 20 20 20  f( pBase ){.    
90e0: 20 20 70 57 69 6e 2d 3e 7a 42 61 73 65 20 3d 20    pWin->zBase = 
90f0: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
9100: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 42 61  (pParse->db, pBa
9110: 73 65 2d 3e 7a 2c 20 70 42 61 73 65 2d 3e 6e 29  se->z, pBase->n)
9120: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
9130: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
9140: 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73  ListDelete(pPars
9150: 65 2d 3e 64 62 2c 20 70 50 61 72 74 69 74 69 6f  e->db, pPartitio
9160: 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  n);.    sqlite3E
9170: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50  xprListDelete(pP
9180: 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72  arse->db, pOrder
9190: 42 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  By);.  }.  retur
91a0: 6e 20 70 57 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pWin;.}../*.**
91b0: 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 20 68 61   Window *pWin ha
91c0: 73 20 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61  s just been crea
91d0: 74 65 64 20 66 72 6f 6d 20 61 20 57 49 4e 44 4f  ted from a WINDO
91e0: 57 20 63 6c 61 75 73 65 2e 20 54 6f 6b 6e 65 20  W clause. Tokne 
91f0: 70 42 61 73 65 0a 2a 2a 20 69 73 20 74 68 65 20  pBase.** is the 
9200: 62 61 73 65 20 77 69 6e 64 6f 77 2e 20 45 61 72  base window. Ear
9210: 6c 69 65 72 20 77 69 6e 64 6f 77 73 20 66 72 6f  lier windows fro
9220: 6d 20 74 68 65 20 73 61 6d 65 20 57 49 4e 44 4f  m the same WINDO
9230: 57 20 63 6c 61 75 73 65 20 61 72 65 0a 2a 2a 20  W clause are.** 
9240: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6c 69  stored in the li
9250: 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69  nked list starti
9260: 6e 67 20 61 74 20 70 57 69 6e 2d 3e 70 4e 65 78  ng at pWin->pNex
9270: 74 57 69 6e 2e 20 54 68 69 73 20 66 75 6e 63 74  tWin. This funct
9280: 69 6f 6e 0a 2a 2a 20 65 69 74 68 65 72 20 75 70  ion.** either up
9290: 64 61 74 65 73 20 2a 70 57 69 6e 20 61 63 63 6f  dates *pWin acco
92a0: 72 64 69 6e 67 20 74 6f 20 74 68 65 20 62 61 73  rding to the bas
92b0: 65 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 2c  e specification,
92c0: 20 6f 72 20 65 6c 73 65 0a 2a 2a 20 6c 65 61 76   or else.** leav
92d0: 65 73 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70  es an error in p
92e0: 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  Parse..*/.void s
92f0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 68 61 69  qlite3WindowChai
9300: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
9310: 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 2c 20 57   Window *pWin, W
9320: 69 6e 64 6f 77 20 2a 70 4c 69 73 74 29 7b 0a 20  indow *pList){. 
9330: 20 69 66 28 20 70 57 69 6e 2d 3e 7a 42 61 73 65   if( pWin->zBase
9340: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20   ){.    sqlite3 
9350: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
9360: 3b 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a 70 45  ;.    Window *pE
9370: 78 69 73 74 20 3d 20 77 69 6e 64 6f 77 46 69 6e  xist = windowFin
9380: 64 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c  d(pParse, pList,
9390: 20 70 57 69 6e 2d 3e 7a 42 61 73 65 29 3b 0a 20   pWin->zBase);. 
93a0: 20 20 20 69 66 28 20 70 45 78 69 73 74 20 29 7b     if( pExist ){
93b0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
93c0: 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 20  r *zErr = 0;.   
93d0: 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
93e0: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20  errors */.      
93f0: 69 66 28 20 70 57 69 6e 2d 3e 70 50 61 72 74 69  if( pWin->pParti
9400: 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  tion ){.        
9410: 7a 45 72 72 20 3d 20 22 50 41 52 54 49 54 49 4f  zErr = "PARTITIO
9420: 4e 20 63 6c 61 75 73 65 22 3b 0a 20 20 20 20 20  N clause";.     
9430: 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 69 73   }else if( pExis
9440: 74 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70  t->pOrderBy && p
9450: 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  Win->pOrderBy ){
9460: 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20  .        zErr = 
9470: 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65  "ORDER BY clause
9480: 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ";.      }else i
9490: 66 28 20 70 45 78 69 73 74 2d 3e 62 49 6d 70 6c  f( pExist->bImpl
94a0: 69 63 69 74 46 72 61 6d 65 3d 3d 30 20 29 7b 0a  icitFrame==0 ){.
94b0: 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 22          zErr = "
94c0: 66 72 61 6d 65 20 73 70 65 63 69 66 69 63 61 74  frame specificat
94d0: 69 6f 6e 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ion";.      }.  
94e0: 20 20 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a      if( zErr ){.
94f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
9500: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
9510: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 63 61  .            "ca
9520: 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65 20 25 73  nnot override %s
9530: 20 6f 66 20 77 69 6e 64 6f 77 3a 20 25 73 22 2c   of window: %s",
9540: 20 7a 45 72 72 2c 20 70 57 69 6e 2d 3e 7a 42 61   zErr, pWin->zBa
9550: 73 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  se.        );.  
9560: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9570: 20 20 20 70 57 69 6e 2d 3e 70 50 61 72 74 69 74     pWin->pPartit
9580: 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ion = sqlite3Exp
9590: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 45 78  rListDup(db, pEx
95a0: 69 73 74 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c  ist->pPartition,
95b0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
95c0: 20 70 45 78 69 73 74 2d 3e 70 4f 72 64 65 72 42   pExist->pOrderB
95d0: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  y ){.          a
95e0: 73 73 65 72 74 28 20 70 57 69 6e 2d 3e 70 4f 72  ssert( pWin->pOr
95f0: 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  derBy==0 );.    
9600: 20 20 20 20 20 20 70 57 69 6e 2d 3e 70 4f 72 64        pWin->pOrd
9610: 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
9620: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 45  prListDup(db, pE
9630: 78 69 73 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20  xist->pOrderBy, 
9640: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
9650: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
9660: 72 65 65 28 64 62 2c 20 70 57 69 6e 2d 3e 7a 42  ree(db, pWin->zB
9670: 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 70 57  ase);.        pW
9680: 69 6e 2d 3e 7a 42 61 73 65 20 3d 20 30 3b 0a 20  in->zBase = 0;. 
9690: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
96a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68  .}../*.** Attach
96b0: 20 77 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 70   window object p
96c0: 57 69 6e 20 74 6f 20 65 78 70 72 65 73 73 69 6f  Win to expressio
96d0: 6e 20 70 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  n p..*/.void sql
96e0: 69 74 65 33 57 69 6e 64 6f 77 41 74 74 61 63 68  ite3WindowAttach
96f0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
9700: 45 78 70 72 20 2a 70 2c 20 57 69 6e 64 6f 77 20  Expr *p, Window 
9710: 2a 70 57 69 6e 29 7b 0a 20 20 69 66 28 20 70 20  *pWin){.  if( p 
9720: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
9730: 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op==TK_FUNCTIO
9740: 4e 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  N );.    assert(
9750: 20 70 57 69 6e 20 29 3b 0a 20 20 20 20 70 2d 3e   pWin );.    p->
9760: 79 2e 70 57 69 6e 20 3d 20 70 57 69 6e 3b 0a 20  y.pWin = pWin;. 
9770: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
9780: 74 79 28 70 2c 20 45 50 5f 57 69 6e 46 75 6e 63  ty(p, EP_WinFunc
9790: 29 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70 4f 77  );.    pWin->pOw
97a0: 6e 65 72 20 3d 20 70 3b 0a 20 20 20 20 69 66 28  ner = p;.    if(
97b0: 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f   (p->flags & EP_
97c0: 44 69 73 74 69 6e 63 74 29 20 26 26 20 70 57 69  Distinct) && pWi
97d0: 6e 2d 3e 65 46 72 6d 54 79 70 65 21 3d 54 4b 5f  n->eFrmType!=TK_
97e0: 46 49 4c 54 45 52 20 29 7b 0a 20 20 20 20 20 20  FILTER ){.      
97f0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
9800: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
9810: 20 20 22 44 49 53 54 49 4e 43 54 20 69 73 20 6e    "DISTINCT is n
9820: 6f 74 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72  ot supported for
9830: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
9840: 73 22 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  s".      );.    
9850: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  }.  }else{.    s
9860: 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65  qlite3WindowDele
9870: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
9880: 57 69 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Win);.  }.}../*.
9890: 2a 2a 20 50 6f 73 73 69 62 6c 79 20 6c 69 6e 6b  ** Possibly link
98a0: 20 77 69 6e 64 6f 77 20 70 57 69 6e 20 69 6e 74   window pWin int
98b0: 6f 20 74 68 65 20 6c 69 73 74 20 61 74 20 70 53  o the list at pS
98c0: 65 6c 2d 3e 70 57 69 6e 20 28 77 69 6e 64 6f 77  el->pWin (window
98d0: 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 74 6f   functions.** to
98e0: 20 62 65 20 70 72 6f 63 65 73 73 65 64 20 61 73   be processed as
98f0: 20 70 61 72 74 20 6f 66 20 53 45 4c 45 43 54 20   part of SELECT 
9900: 73 74 61 74 65 6d 65 6e 74 20 70 53 65 6c 29 2e  statement pSel).
9910: 20 54 68 65 20 77 69 6e 64 6f 77 20 69 73 20 6c   The window is l
9920: 69 6e 6b 65 64 0a 2a 2a 20 69 6e 20 69 66 20 65  inked.** in if e
9930: 69 74 68 65 72 20 28 61 29 20 74 68 65 72 65 20  ither (a) there 
9940: 61 72 65 20 6e 6f 20 6f 74 68 65 72 20 77 69 6e  are no other win
9950: 64 6f 77 73 20 61 6c 72 65 61 64 79 20 6c 69 6e  dows already lin
9960: 6b 65 64 20 74 6f 20 74 68 69 73 0a 2a 2a 20 53  ked to this.** S
9970: 45 4c 45 43 54 2c 20 6f 72 20 28 62 29 20 74 68  ELECT, or (b) th
9980: 65 20 77 69 6e 64 6f 77 73 20 61 6c 72 65 61 64  e windows alread
9990: 79 20 6c 69 6e 6b 65 64 20 75 73 65 20 61 20 63  y linked use a c
99a0: 6f 6d 70 61 74 69 62 6c 65 20 77 69 6e 64 6f 77  ompatible window
99b0: 20 66 72 61 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20   frame..*/.void 
99c0: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4c 69 6e  sqlite3WindowLin
99d0: 6b 28 53 65 6c 65 63 74 20 2a 70 53 65 6c 2c 20  k(Select *pSel, 
99e0: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 29 7b 0a 20  Window *pWin){. 
99f0: 20 69 66 28 20 30 3d 3d 70 53 65 6c 2d 3e 70 57   if( 0==pSel->pW
9a00: 69 6e 20 0a 20 20 20 7c 7c 20 30 3d 3d 73 71 6c  in .   || 0==sql
9a10: 69 74 65 33 57 69 6e 64 6f 77 43 6f 6d 70 61 72  ite3WindowCompar
9a20: 65 28 30 2c 20 70 53 65 6c 2d 3e 70 57 69 6e 2c  e(0, pSel->pWin,
9a30: 20 70 57 69 6e 2c 20 30 29 0a 20 20 29 7b 0a 20   pWin, 0).  ){. 
9a40: 20 20 20 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69     pWin->pNextWi
9a50: 6e 20 3d 20 70 53 65 6c 2d 3e 70 57 69 6e 3b 0a  n = pSel->pWin;.
9a60: 20 20 20 20 69 66 28 20 70 53 65 6c 2d 3e 70 57      if( pSel->pW
9a70: 69 6e 20 29 7b 0a 20 20 20 20 20 20 70 53 65 6c  in ){.      pSel
9a80: 2d 3e 70 57 69 6e 2d 3e 70 70 54 68 69 73 20 3d  ->pWin->ppThis =
9a90: 20 26 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e   &pWin->pNextWin
9aa0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 65 6c  ;.    }.    pSel
9ab0: 2d 3e 70 57 69 6e 20 3d 20 70 57 69 6e 3b 0a 20  ->pWin = pWin;. 
9ac0: 20 20 20 70 57 69 6e 2d 3e 70 70 54 68 69 73 20     pWin->ppThis 
9ad0: 3d 20 26 70 53 65 6c 2d 3e 70 57 69 6e 3b 0a 20  = &pSel->pWin;. 
9ae0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
9af0: 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 20  rn 0 if the two 
9b00: 77 69 6e 64 6f 77 20 6f 62 6a 65 63 74 73 20 61  window objects a
9b10: 72 65 20 69 64 65 6e 74 69 63 61 6c 2c 20 6f 72  re identical, or
9b20: 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 74 68 65 72 77   non-zero otherw
9b30: 69 73 65 2e 0a 2a 2a 20 49 64 65 6e 74 69 63 61  ise..** Identica
9b40: 6c 20 77 69 6e 64 6f 77 20 6f 62 6a 65 63 74 73  l window objects
9b50: 20 63 61 6e 20 62 65 20 70 72 6f 63 65 73 73 65   can be processe
9b60: 64 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 73 63  d in a single sc
9b70: 61 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  an..*/.int sqlit
9b80: 65 33 57 69 6e 64 6f 77 43 6f 6d 70 61 72 65 28  e3WindowCompare(
9b90: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 57  Parse *pParse, W
9ba0: 69 6e 64 6f 77 20 2a 70 31 2c 20 57 69 6e 64 6f  indow *p1, Windo
9bb0: 77 20 2a 70 32 2c 20 69 6e 74 20 62 46 69 6c 74  w *p2, int bFilt
9bc0: 65 72 29 7b 0a 20 20 69 66 28 20 70 31 2d 3e 65  er){.  if( p1->e
9bd0: 46 72 6d 54 79 70 65 21 3d 70 32 2d 3e 65 46 72  FrmType!=p2->eFr
9be0: 6d 54 79 70 65 20 29 20 72 65 74 75 72 6e 20 31  mType ) return 1
9bf0: 3b 0a 20 20 69 66 28 20 70 31 2d 3e 65 53 74 61  ;.  if( p1->eSta
9c00: 72 74 21 3d 70 32 2d 3e 65 53 74 61 72 74 20 29  rt!=p2->eStart )
9c10: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
9c20: 20 70 31 2d 3e 65 45 6e 64 21 3d 70 32 2d 3e 65   p1->eEnd!=p2->e
9c30: 45 6e 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  End ) return 1;.
9c40: 20 20 69 66 28 20 70 31 2d 3e 65 45 78 63 6c 75    if( p1->eExclu
9c50: 64 65 21 3d 70 32 2d 3e 65 45 78 63 6c 75 64 65  de!=p2->eExclude
9c60: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
9c70: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
9c80: 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 31  mpare(pParse, p1
9c90: 2d 3e 70 53 74 61 72 74 2c 20 70 32 2d 3e 70 53  ->pStart, p2->pS
9ca0: 74 61 72 74 2c 20 2d 31 29 20 29 20 72 65 74 75  tart, -1) ) retu
9cb0: 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 1;.  if( sqli
9cc0: 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
9cd0: 50 61 72 73 65 2c 20 70 31 2d 3e 70 45 6e 64 2c  Parse, p1->pEnd,
9ce0: 20 70 32 2d 3e 70 45 6e 64 2c 20 2d 31 29 20 29   p2->pEnd, -1) )
9cf0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
9d00: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
9d10: 43 6f 6d 70 61 72 65 28 70 31 2d 3e 70 50 61 72  Compare(p1->pPar
9d20: 74 69 74 69 6f 6e 2c 20 70 32 2d 3e 70 50 61 72  tition, p2->pPar
9d30: 74 69 74 69 6f 6e 2c 20 2d 31 29 20 29 20 72 65  tition, -1) ) re
9d40: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
9d50: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d  lite3ExprListCom
9d60: 70 61 72 65 28 70 31 2d 3e 70 4f 72 64 65 72 42  pare(p1->pOrderB
9d70: 79 2c 20 70 32 2d 3e 70 4f 72 64 65 72 42 79 2c  y, p2->pOrderBy,
9d80: 20 2d 31 29 20 29 20 72 65 74 75 72 6e 20 31 3b   -1) ) return 1;
9d90: 0a 20 20 69 66 28 20 62 46 69 6c 74 65 72 20 29  .  if( bFilter )
9da0: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
9db0: 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61  3ExprCompare(pPa
9dc0: 72 73 65 2c 20 70 31 2d 3e 70 46 69 6c 74 65 72  rse, p1->pFilter
9dd0: 2c 20 70 32 2d 3e 70 46 69 6c 74 65 72 2c 20 2d  , p2->pFilter, -
9de0: 31 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  1) ) return 1;. 
9df0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
9e00: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  .../*.** This is
9e10: 20 63 61 6c 6c 65 64 20 62 79 20 63 6f 64 65 20   called by code 
9e20: 69 6e 20 73 65 6c 65 63 74 2e 63 20 62 65 66 6f  in select.c befo
9e30: 72 65 20 69 74 20 63 61 6c 6c 73 20 73 71 6c 69  re it calls sqli
9e40: 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a  te3WhereBegin().
9e50: 2a 2a 20 74 6f 20 62 65 67 69 6e 20 69 74 65 72  ** to begin iter
9e60: 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68  ating through th
9e70: 65 20 73 75 62 2d 71 75 65 72 79 20 72 65 73 75  e sub-query resu
9e80: 6c 74 73 2e 20 49 74 20 69 73 20 75 73 65 64 20  lts. It is used 
9e90: 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 61  to allocate.** a
9ea0: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 72 65  nd initialize re
9eb0: 67 69 73 74 65 72 73 20 61 6e 64 20 63 75 72 73  gisters and curs
9ec0: 6f 72 73 20 75 73 65 64 20 62 79 20 73 71 6c 69  ors used by sqli
9ed0: 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 53 74 65  te3WindowCodeSte
9ee0: 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  p()..*/.void sql
9ef0: 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 49 6e  ite3WindowCodeIn
9f00: 69 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  it(Parse *pParse
9f10: 2c 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 29  , Window *pMWin)
9f20: 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e  {.  Window *pWin
9f30: 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  ;.  Vdbe *v = sq
9f40: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
9f50: 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  rse);..  /* Allo
9f60: 63 61 74 65 20 72 65 67 69 73 74 65 72 73 20 74  cate registers t
9f70: 6f 20 75 73 65 20 66 6f 72 20 50 41 52 54 49 54  o use for PARTIT
9f80: 49 4f 4e 20 42 59 20 76 61 6c 75 65 73 2c 20 69  ION BY values, i
9f90: 66 20 61 6e 79 2e 20 49 6e 69 74 69 61 6c 69 7a  f any. Initializ
9fa0: 65 0a 20 20 2a 2a 20 73 61 69 64 20 72 65 67 69  e.  ** said regi
9fb0: 73 74 65 72 73 20 74 6f 20 4e 55 4c 4c 2e 20 20  sters to NULL.  
9fc0: 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  */.  if( pMWin->
9fd0: 70 50 61 72 74 69 74 69 6f 6e 20 29 7b 0a 20 20  pPartition ){.  
9fe0: 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 4d    int nExpr = pM
9ff0: 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2d  Win->pPartition-
a000: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70 4d 57 69  >nExpr;.    pMWi
a010: 6e 2d 3e 72 65 67 50 61 72 74 20 3d 20 70 50 61  n->regPart = pPa
a020: 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
a030: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
a040: 20 6e 45 78 70 72 3b 0a 20 20 20 20 73 71 6c 69   nExpr;.    sqli
a050: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
a060: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 4d 57   OP_Null, 0, pMW
a070: 69 6e 2d 3e 72 65 67 50 61 72 74 2c 20 70 4d 57  in->regPart, pMW
a080: 69 6e 2d 3e 72 65 67 50 61 72 74 2b 6e 45 78 70  in->regPart+nExp
a090: 72 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 70 4d 57  r-1);.  }..  pMW
a0a0: 69 6e 2d 3e 72 65 67 4f 6e 65 20 3d 20 2b 2b 70  in->regOne = ++p
a0b0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73  Parse->nMem;.  s
a0c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
a0d0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
a0e0: 31 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 4f 6e 65  1, pMWin->regOne
a0f0: 29 3b 0a 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d  );..  if( pMWin-
a100: 3e 65 45 78 63 6c 75 64 65 20 29 7b 0a 20 20 20  >eExclude ){.   
a110: 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72 74   pMWin->regStart
a120: 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65  Rowid = ++pParse
a130: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 70 4d 57 69  ->nMem;.    pMWi
a140: 6e 2d 3e 72 65 67 45 6e 64 52 6f 77 69 64 20 3d  n->regEndRowid =
a150: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
a160: 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 63 73 72 41  .    pMWin->csrA
a170: 70 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  pp = pParse->nTa
a180: 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  b++;.    sqlite3
a190: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
a1a0: 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4d 57  _Integer, 1, pMW
a1b0: 69 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f 77 69  in->regStartRowi
a1c0: 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  d);.    sqlite3V
a1d0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
a1e0: 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 4d 57 69  Integer, 0, pMWi
a1f0: 6e 2d 3e 72 65 67 45 6e 64 52 6f 77 69 64 29 3b  n->regEndRowid);
a200: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a210: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
a220: 6e 44 75 70 2c 20 70 4d 57 69 6e 2d 3e 63 73 72  nDup, pMWin->csr
a230: 41 70 70 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  App, pMWin->iEph
a240: 43 73 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Csr);.    return
a250: 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 57 69  ;.  }..  for(pWi
a260: 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70  n=pMWin; pWin; p
a270: 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57  Win=pWin->pNextW
a280: 69 6e 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66  in){.    FuncDef
a290: 20 2a 70 20 3d 20 70 57 69 6e 2d 3e 70 46 75 6e   *p = pWin->pFun
a2a0: 63 3b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 66  c;.    if( (p->f
a2b0: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
a2c0: 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 20 26  E_FUNC_MINMAX) &
a2d0: 26 20 70 57 69 6e 2d 3e 65 53 74 61 72 74 21 3d  & pWin->eStart!=
a2e0: 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a  TK_UNBOUNDED ){.
a2f0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6c        /* The inl
a300: 69 6e 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ine versions of 
a310: 6d 69 6e 28 29 20 61 6e 64 20 6d 61 78 28 29 20  min() and max() 
a320: 72 65 71 75 69 72 65 20 61 20 73 69 6e 67 6c 65  require a single
a330: 20 65 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 20   ephemeral.     
a340: 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 33 20   ** table and 3 
a350: 72 65 67 69 73 74 65 72 73 2e 20 54 68 65 20 72  registers. The r
a360: 65 67 69 73 74 65 72 73 20 61 72 65 20 75 73 65  egisters are use
a370: 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  d as follows:.  
a380: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
a390: 20 20 72 65 67 41 70 70 2b 30 3a 20 73 6c 6f 74    regApp+0: slot
a3a0: 20 74 6f 20 63 6f 70 79 20 6d 69 6e 28 29 2f 6d   to copy min()/m
a3b0: 61 78 28 29 20 61 72 67 75 6d 65 6e 74 20 74 6f  ax() argument to
a3c0: 20 66 6f 72 20 4d 61 6b 65 52 65 63 6f 72 64 0a   for MakeRecord.
a3d0: 20 20 20 20 20 20 2a 2a 20 20 20 72 65 67 41 70        **   regAp
a3e0: 70 2b 31 3a 20 69 6e 74 65 67 65 72 20 76 61 6c  p+1: integer val
a3f0: 75 65 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72  ue used to ensur
a400: 65 20 6b 65 79 73 20 61 72 65 20 75 6e 69 71 75  e keys are uniqu
a410: 65 0a 20 20 20 20 20 20 2a 2a 20 20 20 72 65 67  e.      **   reg
a420: 41 70 70 2b 32 3a 20 6f 75 74 70 75 74 20 6f 66  App+2: output of
a430: 20 4d 61 6b 65 52 65 63 6f 72 64 0a 20 20 20 20   MakeRecord.    
a440: 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c    */.      ExprL
a450: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 57 69  ist *pList = pWi
a460: 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69  n->pOwner->x.pLi
a470: 73 74 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66  st;.      KeyInf
a480: 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71  o *pKeyInfo = sq
a490: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d  lite3KeyInfoFrom
a4a0: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
a4b0: 20 70 4c 69 73 74 2c 20 30 2c 20 30 29 3b 0a 20   pList, 0, 0);. 
a4c0: 20 20 20 20 20 70 57 69 6e 2d 3e 63 73 72 41 70       pWin->csrAp
a4d0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  p = pParse->nTab
a4e0: 2b 2b 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e  ++;.      pWin->
a4f0: 72 65 67 41 70 70 20 3d 20 70 50 61 72 73 65 2d  regApp = pParse-
a500: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 70  >nMem+1;.      p
a510: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 33  Parse->nMem += 3
a520: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79  ;.      if( pKey
a530: 49 6e 66 6f 20 26 26 20 70 57 69 6e 2d 3e 70 46  Info && pWin->pF
a540: 75 6e 63 2d 3e 7a 4e 61 6d 65 5b 31 5d 3d 3d 27  unc->zName[1]=='
a550: 69 27 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  i' ){.        as
a560: 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  sert( pKeyInfo->
a570: 61 53 6f 72 74 46 6c 61 67 73 5b 30 5d 3d 3d 30  aSortFlags[0]==0
a580: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79   );.        pKey
a590: 49 6e 66 6f 2d 3e 61 53 6f 72 74 46 6c 61 67 73  Info->aSortFlags
a5a0: 5b 30 5d 20 3d 20 4b 45 59 49 4e 46 4f 5f 4f 52  [0] = KEYINFO_OR
a5b0: 44 45 52 5f 44 45 53 43 3b 0a 20 20 20 20 20 20  DER_DESC;.      
a5c0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
a5d0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
a5e0: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70  OpenEphemeral, p
a5f0: 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20 32 29 3b  Win->csrApp, 2);
a600: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a610: 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 4b  beAppendP4(v, pK
a620: 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
a630: 46 4f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  FO);.      sqlit
a640: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
a650: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70  OP_Integer, 0, p
a660: 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31 29 3b 0a  Win->regApp+1);.
a670: 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69      }.    else i
a680: 66 28 20 70 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68  f( p->zName==nth
a690: 5f 76 61 6c 75 65 4e 61 6d 65 20 7c 7c 20 70 2d  _valueName || p-
a6a0: 3e 7a 4e 61 6d 65 3d 3d 66 69 72 73 74 5f 76 61  >zName==first_va
a6b0: 6c 75 65 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  lueName ){.     
a6c0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 77 6f   /* Allocate two
a6d0: 20 72 65 67 69 73 74 65 72 73 20 61 74 20 70 57   registers at pW
a6e0: 69 6e 2d 3e 72 65 67 41 70 70 2e 20 54 68 65 73  in->regApp. Thes
a6f0: 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  e will be used t
a700: 6f 0a 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65  o.      ** store
a710: 20 74 68 65 20 73 74 61 72 74 20 61 6e 64 20 65   the start and e
a720: 6e 64 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  nd index of the 
a730: 63 75 72 72 65 6e 74 20 66 72 61 6d 65 2e 20 20  current frame.  
a740: 2a 2f 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 72  */.      pWin->r
a750: 65 67 41 70 70 20 3d 20 70 50 61 72 73 65 2d 3e  egApp = pParse->
a760: 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 70 57  nMem+1;.      pW
a770: 69 6e 2d 3e 63 73 72 41 70 70 20 3d 20 70 50 61  in->csrApp = pPa
a780: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
a790: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
a7a0: 2b 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69  += 2;.      sqli
a7b0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
a7c0: 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70 57 69   OP_OpenDup, pWi
a7d0: 6e 2d 3e 63 73 72 41 70 70 2c 20 70 4d 57 69 6e  n->csrApp, pMWin
a7e0: 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 20 20  ->iEphCsr);.    
a7f0: 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70  }.    else if( p
a800: 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d  ->zName==leadNam
a810: 65 20 7c 7c 20 70 2d 3e 7a 4e 61 6d 65 3d 3d 6c  e || p->zName==l
a820: 61 67 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  agName ){.      
a830: 70 57 69 6e 2d 3e 63 73 72 41 70 70 20 3d 20 70  pWin->csrApp = p
a840: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
a850: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a860: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
a870: 6e 44 75 70 2c 20 70 57 69 6e 2d 3e 63 73 72 41  nDup, pWin->csrA
a880: 70 70 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43  pp, pMWin->iEphC
a890: 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  sr);.    }.  }.}
a8a0: 0a 0a 23 64 65 66 69 6e 65 20 57 49 4e 44 4f 57  ..#define WINDOW
a8b0: 5f 53 54 41 52 54 49 4e 47 5f 49 4e 54 20 20 30  _STARTING_INT  0
a8c0: 0a 23 64 65 66 69 6e 65 20 57 49 4e 44 4f 57 5f  .#define WINDOW_
a8d0: 45 4e 44 49 4e 47 5f 49 4e 54 20 20 20 20 31 0a  ENDING_INT    1.
a8e0: 23 64 65 66 69 6e 65 20 57 49 4e 44 4f 57 5f 4e  #define WINDOW_N
a8f0: 54 48 5f 56 41 4c 55 45 5f 49 4e 54 20 32 0a 23  TH_VALUE_INT 2.#
a900: 64 65 66 69 6e 65 20 57 49 4e 44 4f 57 5f 53 54  define WINDOW_ST
a910: 41 52 54 49 4e 47 5f 4e 55 4d 20 20 33 0a 23 64  ARTING_NUM  3.#d
a920: 65 66 69 6e 65 20 57 49 4e 44 4f 57 5f 45 4e 44  efine WINDOW_END
a930: 49 4e 47 5f 4e 55 4d 20 20 20 20 34 0a 0a 2f 2a  ING_NUM    4../*
a940: 0a 2a 2a 20 41 20 22 50 52 45 43 45 44 49 4e 47  .** A "PRECEDING
a950: 20 3c 65 78 70 72 3e 22 20 28 65 43 6f 6e 64 3d   <expr>" (eCond=
a960: 3d 30 29 20 6f 72 20 22 46 4f 4c 4c 4f 57 49 4e  =0) or "FOLLOWIN
a970: 47 20 3c 65 78 70 72 3e 22 20 28 65 43 6f 6e 64  G <expr>" (eCond
a980: 3d 3d 31 29 20 6f 72 20 74 68 65 0a 2a 2a 20 76  ==1) or the.** v
a990: 61 6c 75 65 20 6f 66 20 74 68 65 20 73 65 63 6f  alue of the seco
a9a0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6e  nd argument to n
a9b0: 74 68 5f 76 61 6c 75 65 28 29 20 28 65 43 6f 6e  th_value() (eCon
a9c0: 64 3d 3d 32 29 20 68 61 73 20 6a 75 73 74 20 62  d==2) has just b
a9d0: 65 65 6e 0a 2a 2a 20 65 76 61 6c 75 61 74 65 64  een.** evaluated
a9e0: 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 20   and the result 
a9f0: 6c 65 66 74 20 69 6e 20 72 65 67 69 73 74 65 72  left in register
aa00: 20 72 65 67 2e 20 54 68 69 73 20 66 75 6e 63 74   reg. This funct
aa10: 69 6f 6e 20 67 65 6e 65 72 61 74 65 73 20 56 4d  ion generates VM
aa20: 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 63 68 65 63  .** code to chec
aa30: 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  k that the value
aa40: 20 69 73 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69   is a non-negati
aa50: 76 65 20 69 6e 74 65 67 65 72 20 61 6e 64 20 74  ve integer and t
aa60: 68 72 6f 77 73 20 61 6e 0a 2a 2a 20 65 78 63 65  hrows an.** exce
aa70: 70 74 69 6f 6e 20 69 66 20 69 74 20 69 73 20 6e  ption if it is n
aa80: 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ot..*/.static vo
aa90: 69 64 20 77 69 6e 64 6f 77 43 68 65 63 6b 56 61  id windowCheckVa
aaa0: 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  lue(Parse *pPars
aab0: 65 2c 20 69 6e 74 20 72 65 67 2c 20 69 6e 74 20  e, int reg, int 
aac0: 65 43 6f 6e 64 29 7b 0a 20 20 73 74 61 74 69 63  eCond){.  static
aad0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 45   const char *azE
aae0: 72 72 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 66 72  rr[] = {.    "fr
aaf0: 61 6d 65 20 73 74 61 72 74 69 6e 67 20 6f 66 66  ame starting off
ab00: 73 65 74 20 6d 75 73 74 20 62 65 20 61 20 6e 6f  set must be a no
ab10: 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67  n-negative integ
ab20: 65 72 22 2c 0a 20 20 20 20 22 66 72 61 6d 65 20  er",.    "frame 
ab30: 65 6e 64 69 6e 67 20 6f 66 66 73 65 74 20 6d 75  ending offset mu
ab40: 73 74 20 62 65 20 61 20 6e 6f 6e 2d 6e 65 67 61  st be a non-nega
ab50: 74 69 76 65 20 69 6e 74 65 67 65 72 22 2c 0a 20  tive integer",. 
ab60: 20 20 20 22 73 65 63 6f 6e 64 20 61 72 67 75 6d     "second argum
ab70: 65 6e 74 20 74 6f 20 6e 74 68 5f 76 61 6c 75 65  ent to nth_value
ab80: 20 6d 75 73 74 20 62 65 20 61 20 70 6f 73 69 74   must be a posit
ab90: 69 76 65 20 69 6e 74 65 67 65 72 22 2c 0a 20 20  ive integer",.  
aba0: 20 20 22 66 72 61 6d 65 20 73 74 61 72 74 69 6e    "frame startin
abb0: 67 20 6f 66 66 73 65 74 20 6d 75 73 74 20 62 65  g offset must be
abc0: 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20   a non-negative 
abd0: 6e 75 6d 62 65 72 22 2c 0a 20 20 20 20 22 66 72  number",.    "fr
abe0: 61 6d 65 20 65 6e 64 69 6e 67 20 6f 66 66 73 65  ame ending offse
abf0: 74 20 6d 75 73 74 20 62 65 20 61 20 6e 6f 6e 2d  t must be a non-
ac00: 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 22  negative number"
ac10: 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20  ,.  };.  static 
ac20: 69 6e 74 20 61 4f 70 5b 5d 20 3d 20 7b 20 4f 50  int aOp[] = { OP
ac30: 5f 47 65 2c 20 4f 50 5f 47 65 2c 20 4f 50 5f 47  _Ge, OP_Ge, OP_G
ac40: 74 2c 20 4f 50 5f 47 65 2c 20 4f 50 5f 47 65 20  t, OP_Ge, OP_Ge 
ac50: 7d 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  };.  Vdbe *v = s
ac60: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
ac70: 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 65 67  arse);.  int reg
ac80: 5a 65 72 6f 20 3d 20 73 71 6c 69 74 65 33 47 65  Zero = sqlite3Ge
ac90: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
aca0: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 43 6f 6e  ;.  assert( eCon
acb0: 64 3e 3d 30 20 26 26 20 65 43 6f 6e 64 3c 41 72  d>=0 && eCond<Ar
acc0: 72 61 79 53 69 7a 65 28 61 7a 45 72 72 29 20 29  raySize(azErr) )
acd0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
ace0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
acf0: 67 65 72 2c 20 30 2c 20 72 65 67 5a 65 72 6f 29  ger, 0, regZero)
ad00: 3b 0a 20 20 69 66 28 20 65 43 6f 6e 64 3e 3d 57  ;.  if( eCond>=W
ad10: 49 4e 44 4f 57 5f 53 54 41 52 54 49 4e 47 5f 4e  INDOW_STARTING_N
ad20: 55 4d 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  UM ){.    int re
ad30: 67 53 74 72 69 6e 67 20 3d 20 73 71 6c 69 74 65  gString = sqlite
ad40: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
ad50: 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  se);.    sqlite3
ad60: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
ad70: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 72 65 67  _String8, 0, reg
ad80: 53 74 72 69 6e 67 2c 20 30 2c 20 22 22 2c 20 50  String, 0, "", P
ad90: 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73  4_STATIC);.    s
ada0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
adb0: 28 76 2c 20 4f 50 5f 47 65 2c 20 72 65 67 53 74  (v, OP_Ge, regSt
adc0: 72 69 6e 67 2c 20 73 71 6c 69 74 65 33 56 64 62  ring, sqlite3Vdb
add0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
ade0: 32 2c 20 72 65 67 29 3b 0a 20 20 20 20 73 71 6c  2, reg);.    sql
adf0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
ae00: 28 76 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  (v, SQLITE_AFF_N
ae10: 55 4d 45 52 49 43 7c 53 51 4c 49 54 45 5f 4a 55  UMERIC|SQLITE_JU
ae20: 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 56  MPIFNULL);.    V
ae30: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
ae40: 20 20 20 20 61 73 73 65 72 74 28 20 65 43 6f 6e      assert( eCon
ae50: 64 3d 3d 33 20 7c 7c 20 65 43 6f 6e 64 3d 3d 34  d==3 || eCond==4
ae60: 20 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65   );.    VdbeCove
ae70: 72 61 67 65 49 66 28 76 2c 20 65 43 6f 6e 64 3d  rageIf(v, eCond=
ae80: 3d 33 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  =3);.    VdbeCov
ae90: 65 72 61 67 65 49 66 28 76 2c 20 65 43 6f 6e 64  erageIf(v, eCond
aea0: 3d 3d 34 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ==4);.  }else{. 
aeb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
aec0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp2(v, OP_MustB
aed0: 65 49 6e 74 2c 20 72 65 67 2c 20 73 71 6c 69 74  eInt, reg, sqlit
aee0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
aef0: 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 56 64 62  r(v)+2);.    Vdb
af00: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
af10: 20 20 61 73 73 65 72 74 28 20 65 43 6f 6e 64 3d    assert( eCond=
af20: 3d 30 20 7c 7c 20 65 43 6f 6e 64 3d 3d 31 20 7c  =0 || eCond==1 |
af30: 7c 20 65 43 6f 6e 64 3d 3d 32 20 29 3b 0a 20 20  | eCond==2 );.  
af40: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
af50: 28 76 2c 20 65 43 6f 6e 64 3d 3d 30 29 3b 0a 20  (v, eCond==0);. 
af60: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
af70: 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 31 29 3b 0a  f(v, eCond==1);.
af80: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
af90: 49 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 32 29 3b  If(v, eCond==2);
afa0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
afb0: 62 65 41 64 64 4f 70 33 28 76 2c 20 61 4f 70 5b  beAddOp3(v, aOp[
afc0: 65 43 6f 6e 64 5d 2c 20 72 65 67 5a 65 72 6f 2c  eCond], regZero,
afd0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
afe0: 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 72 65  entAddr(v)+2, re
aff0: 67 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61  g);.  VdbeCovera
b000: 67 65 4e 65 76 65 72 4e 75 6c 6c 49 66 28 76 2c  geNeverNullIf(v,
b010: 20 65 43 6f 6e 64 3d 3d 30 29 3b 20 2f 2a 20 4e   eCond==0); /* N
b020: 55 4c 4c 20 63 61 73 65 20 63 61 70 74 75 72 65  ULL case capture
b030: 64 20 62 79 20 2a 2f 0a 20 20 56 64 62 65 43 6f  d by */.  VdbeCo
b040: 76 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c 49  verageNeverNullI
b050: 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 31 29 3b 20  f(v, eCond==1); 
b060: 2f 2a 20 20 20 74 68 65 20 4f 50 5f 4d 75 73 74  /*   the OP_Must
b070: 42 65 49 6e 74 20 2a 2f 0a 20 20 56 64 62 65 43  BeInt */.  VdbeC
b080: 6f 76 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c  overageNeverNull
b090: 49 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 32 29 3b  If(v, eCond==2);
b0a0: 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e  .  VdbeCoverageN
b0b0: 65 76 65 72 4e 75 6c 6c 49 66 28 76 2c 20 65 43  everNullIf(v, eC
b0c0: 6f 6e 64 3d 3d 33 29 3b 20 2f 2a 20 4e 55 4c 4c  ond==3); /* NULL
b0d0: 20 63 61 73 65 20 63 61 75 67 68 74 20 62 79 20   case caught by 
b0e0: 2a 2f 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67  */.  VdbeCoverag
b0f0: 65 4e 65 76 65 72 4e 75 6c 6c 49 66 28 76 2c 20  eNeverNullIf(v, 
b100: 65 43 6f 6e 64 3d 3d 34 29 3b 20 2f 2a 20 20 20  eCond==4); /*   
b110: 74 68 65 20 4f 50 5f 47 65 20 2a 2f 0a 20 20 73  the OP_Ge */.  s
b120: 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70  qlite3MayAbort(p
b130: 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
b140: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b150: 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 45  P_Halt, SQLITE_E
b160: 52 52 4f 52 2c 20 4f 45 5f 41 62 6f 72 74 29 3b  RROR, OE_Abort);
b170: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70  .  sqlite3VdbeAp
b180: 70 65 6e 64 50 34 28 76 2c 20 28 76 6f 69 64 2a  pendP4(v, (void*
b190: 29 61 7a 45 72 72 5b 65 43 6f 6e 64 5d 2c 20 50  )azErr[eCond], P
b1a0: 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c  4_STATIC);.  sql
b1b0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
b1c0: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 5a 65  eg(pParse, regZe
b1d0: 72 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ro);.}../*.** Re
b1e0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
b1f0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73  of arguments pas
b200: 73 65 64 20 74 6f 20 74 68 65 20 77 69 6e 64 6f  sed to the windo
b210: 77 2d 66 75 6e 63 74 69 6f 6e 20 61 73 73 6f 63  w-function assoc
b220: 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
b230: 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  e object passed 
b240: 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
b250: 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
b260: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
b270: 20 69 6e 74 20 77 69 6e 64 6f 77 41 72 67 43 6f   int windowArgCo
b280: 75 6e 74 28 57 69 6e 64 6f 77 20 2a 70 57 69 6e  unt(Window *pWin
b290: 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
b2a0: 4c 69 73 74 20 3d 20 70 57 69 6e 2d 3e 70 4f 77  List = pWin->pOw
b2b0: 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  ner->x.pList;.  
b2c0: 72 65 74 75 72 6e 20 28 70 4c 69 73 74 20 3f 20  return (pList ? 
b2d0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
b2e0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
b2f0: 72 61 74 65 20 56 4d 20 63 6f 64 65 20 74 6f 20  rate VM code to 
b300: 69 6e 76 6f 6b 65 20 65 69 74 68 65 72 20 78 53  invoke either xS
b310: 74 65 70 28 29 20 28 69 66 20 62 49 6e 76 65 72  tep() (if bInver
b320: 73 65 20 69 73 20 30 29 20 6f 72 20 0a 2a 2a 20  se is 0) or .** 
b330: 78 49 6e 76 65 72 73 65 20 28 69 66 20 62 49 6e  xInverse (if bIn
b340: 76 65 72 73 65 20 69 73 20 6e 6f 6e 2d 7a 65 72  verse is non-zer
b350: 6f 29 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64  o) for each wind
b360: 6f 77 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 74  ow function in t
b370: 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69  he .** linked li
b380: 73 74 20 73 74 61 72 74 69 6e 67 20 61 74 20 70  st starting at p
b390: 4d 57 69 6e 2e 20 4f 72 2c 20 66 6f 72 20 62 75  MWin. Or, for bu
b3a0: 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75  ilt-in window fu
b3b0: 6e 63 74 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20  nctions.** that 
b3c0: 64 6f 20 6e 6f 74 20 75 73 65 20 74 68 65 20 73  do not use the s
b3d0: 74 61 6e 64 61 72 64 20 66 75 6e 63 74 69 6f 6e  tandard function
b3e0: 20 41 50 49 2c 20 67 65 6e 65 72 61 74 65 20 74   API, generate t
b3f0: 68 65 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 69  he required.** i
b400: 6e 6c 69 6e 65 20 56 4d 20 63 6f 64 65 2e 0a 2a  nline VM code..*
b410: 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  *.** If argument
b420: 20 63 73 72 20 69 73 20 67 72 65 61 74 65 72 20   csr is greater 
b430: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
b440: 20 30 2c 20 74 68 65 6e 20 61 72 67 75 6d 65 6e   0, then argumen
b450: 74 20 72 65 67 20 69 73 0a 2a 2a 20 74 68 65 20  t reg is.** the 
b460: 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20 69  first register i
b470: 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65  n an array of re
b480: 67 69 73 74 65 72 73 20 67 75 61 72 61 6e 74 65  gisters guarante
b490: 65 64 20 74 6f 20 62 65 20 6c 61 72 67 65 0a 2a  ed to be large.*
b4a0: 2a 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  * enough to hold
b4b0: 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 61 72   the array of ar
b4c0: 67 75 6d 65 6e 74 73 20 66 6f 72 20 65 61 63 68  guments for each
b4d0: 20 66 75 6e 63 74 69 6f 6e 2e 20 49 6e 20 74 68   function. In th
b4e0: 69 73 20 63 61 73 65 0a 2a 2a 20 74 68 65 20 61  is case.** the a
b4f0: 72 67 75 6d 65 6e 74 73 20 61 72 65 20 65 78 74  rguments are ext
b500: 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20  racted from the 
b510: 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 63  current row of c
b520: 73 72 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 61  sr into the.** a
b530: 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
b540: 73 20 62 65 66 6f 72 65 20 69 6e 76 6f 6b 69 6e  s before invokin
b550: 67 20 4f 50 5f 41 67 67 53 74 65 70 20 6f 72 20  g OP_AggStep or 
b560: 4f 50 5f 41 67 67 49 6e 76 65 72 73 65 0a 2a 2a  OP_AggInverse.**
b570: 0a 2a 2a 20 4f 72 2c 20 69 66 20 63 73 72 20 69  .** Or, if csr i
b580: 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
b590: 2c 20 74 68 65 6e 20 74 68 65 20 61 72 72 61 79  , then the array
b5a0: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 61 74   of registers at
b5b0: 20 72 65 67 20 69 73 0a 2a 2a 20 61 6c 72 65 61   reg is.** alrea
b5c0: 64 79 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  dy populated wit
b5d0: 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 66 72  h all columns fr
b5e0: 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  om the current r
b5f0: 6f 77 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75  ow of the sub-qu
b600: 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72  ery..**.** If ar
b610: 67 75 6d 65 6e 74 20 72 65 67 50 61 72 74 53 69  gument regPartSi
b620: 7a 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ze is non-zero, 
b630: 74 68 65 6e 20 69 74 20 69 73 20 61 20 72 65 67  then it is a reg
b640: 69 73 74 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  ister containing
b650: 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
b660: 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 63 75  f rows in the cu
b670: 72 72 65 6e 74 20 70 61 72 74 69 74 69 6f 6e 2e  rrent partition.
b680: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b690: 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28 0a 20  windowAggStep(. 
b6a0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
b6b0: 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e  .  Window *pMWin
b6c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
b6d0: 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73     /* Linked lis
b6e0: 74 20 6f 66 20 77 69 6e 64 6f 77 20 66 75 6e 63  t of window func
b6f0: 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 63  tions */.  int c
b700: 73 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sr,             
b710: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
b720: 61 64 20 61 72 67 75 6d 65 6e 74 73 20 66 72 6f  ad arguments fro
b730: 6d 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f  m this cursor */
b740: 0a 20 20 69 6e 74 20 62 49 6e 76 65 72 73 65 2c  .  int bInverse,
b750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b760: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e     /* True to in
b770: 76 6f 6b 65 20 78 49 6e 76 65 72 73 65 20 69 6e  voke xInverse in
b780: 73 74 65 61 64 20 6f 66 20 78 53 74 65 70 20 2a  stead of xStep *
b790: 2f 0a 20 20 69 6e 74 20 72 65 67 20 20 20 20 20  /.  int reg     
b7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7b0: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
b7c0: 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 29 7b 0a  registers */.){.
b7d0: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
b7e0: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
b7f0: 65 29 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57  e);.  Window *pW
b800: 69 6e 3b 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70  in;.  for(pWin=p
b810: 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e  MWin; pWin; pWin
b820: 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29  =pWin->pNextWin)
b830: 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70  {.    FuncDef *p
b840: 46 75 6e 63 20 3d 20 70 57 69 6e 2d 3e 70 46 75  Func = pWin->pFu
b850: 6e 63 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 41  nc;.    int regA
b860: 72 67 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67  rg;.    int nArg
b870: 20 3d 20 77 69 6e 64 6f 77 41 72 67 43 6f 75 6e   = windowArgCoun
b880: 74 28 70 57 69 6e 29 3b 0a 20 20 20 20 69 6e 74  t(pWin);.    int
b890: 20 69 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28   i;..    assert(
b8a0: 20 62 49 6e 76 65 72 73 65 3d 3d 30 20 7c 7c 20   bInverse==0 || 
b8b0: 70 57 69 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b  pWin->eStart!=TK
b8c0: 5f 55 4e 42 4f 55 4e 44 45 44 20 29 3b 0a 0a 20  _UNBOUNDED );.. 
b8d0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
b8e0: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
b8f0: 69 66 28 20 69 21 3d 31 20 7c 7c 20 70 46 75 6e  if( i!=1 || pFun
b900: 63 2d 3e 7a 4e 61 6d 65 21 3d 6e 74 68 5f 76 61  c->zName!=nth_va
b910: 6c 75 65 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  lueName ){.     
b920: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b930: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
b940: 6e 2c 20 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41  n, csr, pWin->iA
b950: 72 67 43 6f 6c 2b 69 2c 20 72 65 67 2b 69 29 3b  rgCol+i, reg+i);
b960: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
b970: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b980: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
b990: 6c 75 6d 6e 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  lumn, pMWin->iEp
b9a0: 68 43 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67  hCsr, pWin->iArg
b9b0: 43 6f 6c 2b 69 2c 20 72 65 67 2b 69 29 3b 0a 20  Col+i, reg+i);. 
b9c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
b9d0: 20 72 65 67 41 72 67 20 3d 20 72 65 67 3b 0a 0a   regArg = reg;..
b9e0: 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 72      if( pMWin->r
b9f0: 65 67 53 74 61 72 74 52 6f 77 69 64 3d 3d 30 0a  egStartRowid==0.
ba00: 20 20 20 20 20 26 26 20 28 70 46 75 6e 63 2d 3e       && (pFunc->
ba10: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
ba20: 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 20  TE_FUNC_MINMAX) 
ba30: 0a 20 20 20 20 20 26 26 20 28 70 57 69 6e 2d 3e  .     && (pWin->
ba40: 65 53 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55  eStart!=TK_UNBOU
ba50: 4e 44 45 44 29 0a 20 20 20 20 29 7b 0a 20 20 20  NDED).    ){.   
ba60: 20 20 20 69 6e 74 20 61 64 64 72 49 73 4e 75 6c     int addrIsNul
ba70: 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  l = sqlite3VdbeA
ba80: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp1(v, OP_IsNu
ba90: 6c 6c 2c 20 72 65 67 41 72 67 29 3b 0a 20 20 20  ll, regArg);.   
baa0: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
bab0: 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 49  v);.      if( bI
bac0: 6e 76 65 72 73 65 3d 3d 30 20 29 7b 0a 20 20 20  nverse==0 ){.   
bad0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bae0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
baf0: 49 6d 6d 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70  Imm, pWin->regAp
bb00: 70 2b 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  p+1, 1);.       
bb10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bb20: 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  p2(v, OP_SCopy, 
bb30: 72 65 67 41 72 67 2c 20 70 57 69 6e 2d 3e 72 65  regArg, pWin->re
bb40: 67 41 70 70 29 3b 0a 20 20 20 20 20 20 20 20 73  gApp);.        s
bb50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
bb60: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
bb70: 64 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2c  d, pWin->regApp,
bb80: 20 32 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70   2, pWin->regApp
bb90: 2b 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  +2);.        sql
bba0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
bbb0: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
bbc0: 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20 70 57  pWin->csrApp, pW
bbd0: 69 6e 2d 3e 72 65 67 41 70 70 2b 32 29 3b 0a 20  in->regApp+2);. 
bbe0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
bbf0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
bc00: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 53  ddOp4Int(v, OP_S
bc10: 65 65 6b 47 45 2c 20 70 57 69 6e 2d 3e 63 73 72  eekGE, pWin->csr
bc20: 41 70 70 2c 20 30 2c 20 72 65 67 41 72 67 2c 20  App, 0, regArg, 
bc30: 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  1);.        Vdbe
bc40: 43 6f 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b  CoverageNeverTak
bc50: 65 6e 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  en(v);.        s
bc60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
bc70: 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 70  (v, OP_Delete, p
bc80: 57 69 6e 2d 3e 63 73 72 41 70 70 29 3b 0a 20 20  Win->csrApp);.  
bc90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
bca0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 73 71 6c  eJumpHere(v, sql
bcb0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
bcc0: 64 64 72 28 76 29 2d 32 29 3b 0a 20 20 20 20 20  ddr(v)-2);.     
bcd0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
bce0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
bcf0: 61 64 64 72 49 73 4e 75 6c 6c 29 3b 0a 20 20 20  addrIsNull);.   
bd00: 20 7d 65 6c 73 65 20 69 66 28 20 70 57 69 6e 2d   }else if( pWin-
bd10: 3e 72 65 67 41 70 70 20 29 7b 0a 20 20 20 20 20  >regApp ){.     
bd20: 20 61 73 73 65 72 74 28 20 70 46 75 6e 63 2d 3e   assert( pFunc->
bd30: 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65  zName==nth_value
bd40: 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 20  Name.           
bd50: 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d  || pFunc->zName=
bd60: 3d 66 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65  =first_valueName
bd70: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
bd80: 61 73 73 65 72 74 28 20 62 49 6e 76 65 72 73 65  assert( bInverse
bd90: 3d 3d 30 20 7c 7c 20 62 49 6e 76 65 72 73 65 3d  ==0 || bInverse=
bda0: 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
bdb0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
bdc0: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 57 69 6e   OP_AddImm, pWin
bdd0: 2d 3e 72 65 67 41 70 70 2b 31 2d 62 49 6e 76 65  ->regApp+1-bInve
bde0: 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c  rse, 1);.    }el
bdf0: 73 65 20 69 66 28 20 70 46 75 6e 63 2d 3e 78 53  se if( pFunc->xS
be00: 46 75 6e 63 21 3d 6e 6f 6f 70 53 74 65 70 46 75  Func!=noopStepFu
be10: 6e 63 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  nc ){.      int 
be20: 61 64 64 72 49 66 20 3d 20 30 3b 0a 20 20 20 20  addrIf = 0;.    
be30: 20 20 69 66 28 20 70 57 69 6e 2d 3e 70 46 69 6c    if( pWin->pFil
be40: 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ter ){.        i
be50: 6e 74 20 72 65 67 54 6d 70 3b 0a 20 20 20 20 20  nt regTmp;.     
be60: 20 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d     assert( nArg=
be70: 3d 30 20 7c 7c 20 6e 41 72 67 3d 3d 70 57 69 6e  =0 || nArg==pWin
be80: 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73  ->pOwner->x.pLis
be90: 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
bea0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 41 72 67      assert( nArg
beb0: 20 7c 7c 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72   || pWin->pOwner
bec0: 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a  ->x.pList==0 );.
bed0: 20 20 20 20 20 20 20 20 72 65 67 54 6d 70 20 3d          regTmp =
bee0: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
bef0: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
bf00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
bf10: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
bf20: 6d 6e 2c 20 63 73 72 2c 20 70 57 69 6e 2d 3e 69  mn, csr, pWin->i
bf30: 41 72 67 43 6f 6c 2b 6e 41 72 67 2c 72 65 67 54  ArgCol+nArg,regT
bf40: 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64  mp);.        add
bf50: 72 49 66 20 3d 20 73 71 6c 69 74 65 33 56 64 62  rIf = sqlite3Vdb
bf60: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
bf70: 4e 6f 74 2c 20 72 65 67 54 6d 70 2c 20 30 2c 20  Not, regTmp, 0, 
bf80: 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  1);.        Vdbe
bf90: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
bfa0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
bfb0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
bfc0: 65 2c 20 72 65 67 54 6d 70 29 3b 0a 20 20 20 20  e, regTmp);.    
bfd0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 46    }.      if( pF
bfe0: 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  unc->funcFlags &
bff0: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45   SQLITE_FUNC_NEE
c000: 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  DCOLL ){.       
c010: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
c020: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
c030: 20 6e 41 72 67 3e 30 20 29 3b 0a 20 20 20 20 20   nArg>0 );.     
c040: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
c050: 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28  e3ExprNNCollSeq(
c060: 70 50 61 72 73 65 2c 20 70 57 69 6e 2d 3e 70 4f  pParse, pWin->pO
c070: 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  wner->x.pList->a
c080: 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [0].pExpr);.    
c090: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c0a0: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c  ddOp4(v, OP_Coll
c0b0: 53 65 71 2c 20 30 2c 30 2c 30 2c 20 28 63 6f 6e  Seq, 0,0,0, (con
c0c0: 73 74 20 63 68 61 72 2a 29 70 43 6f 6c 6c 2c 20  st char*)pColl, 
c0d0: 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
c0e0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
c0f0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
c100: 62 49 6e 76 65 72 73 65 3f 20 4f 50 5f 41 67 67  bInverse? OP_Agg
c110: 49 6e 76 65 72 73 65 20 3a 20 4f 50 5f 41 67 67  Inverse : OP_Agg
c120: 53 74 65 70 2c 20 0a 20 20 20 20 20 20 20 20 20  Step, .         
c130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
c140: 49 6e 76 65 72 73 65 2c 20 72 65 67 41 72 67 2c  Inverse, regArg,
c150: 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 29   pWin->regAccum)
c160: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
c170: 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70  dbeAppendP4(v, p
c180: 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46  Func, P4_FUNCDEF
c190: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c1a0: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
c1b0: 28 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20 20  (u8)nArg);.     
c1c0: 20 69 66 28 20 61 64 64 72 49 66 20 29 20 73 71   if( addrIf ) sq
c1d0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
c1e0: 65 28 76 2c 20 61 64 64 72 49 66 29 3b 0a 20 20  e(v, addrIf);.  
c1f0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 74 79 70 65 64    }.  }.}..typed
c200: 65 66 20 73 74 72 75 63 74 20 57 69 6e 64 6f 77  ef struct Window
c210: 43 6f 64 65 41 72 67 20 57 69 6e 64 6f 77 43 6f  CodeArg WindowCo
c220: 64 65 41 72 67 3b 0a 74 79 70 65 64 65 66 20 73  deArg;.typedef s
c230: 74 72 75 63 74 20 57 69 6e 64 6f 77 43 73 72 41  truct WindowCsrA
c240: 6e 64 52 65 67 20 57 69 6e 64 6f 77 43 73 72 41  ndReg WindowCsrA
c250: 6e 64 52 65 67 3b 0a 73 74 72 75 63 74 20 57 69  ndReg;.struct Wi
c260: 6e 64 6f 77 43 73 72 41 6e 64 52 65 67 20 7b 0a  ndowCsrAndReg {.
c270: 20 20 69 6e 74 20 63 73 72 3b 0a 20 20 69 6e 74    int csr;.  int
c280: 20 72 65 67 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74   reg;.};..struct
c290: 20 57 69 6e 64 6f 77 43 6f 64 65 41 72 67 20 7b   WindowCodeArg {
c2a0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
c2b0: 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69  ;.  Window *pMWi
c2c0: 6e 3b 0a 20 20 56 64 62 65 20 2a 70 56 64 62 65  n;.  Vdbe *pVdbe
c2d0: 3b 0a 20 20 69 6e 74 20 72 65 67 47 6f 73 75 62  ;.  int regGosub
c2e0: 3b 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75  ;.  int addrGosu
c2f0: 62 3b 0a 20 20 69 6e 74 20 72 65 67 41 72 67 3b  b;.  int regArg;
c300: 0a 20 20 69 6e 74 20 65 44 65 6c 65 74 65 3b 0a  .  int eDelete;.
c310: 0a 20 20 57 69 6e 64 6f 77 43 73 72 41 6e 64 52  .  WindowCsrAndR
c320: 65 67 20 73 74 61 72 74 3b 0a 20 20 57 69 6e 64  eg start;.  Wind
c330: 6f 77 43 73 72 41 6e 64 52 65 67 20 63 75 72 72  owCsrAndReg curr
c340: 65 6e 74 3b 0a 20 20 57 69 6e 64 6f 77 43 73 72  ent;.  WindowCsr
c350: 41 6e 64 52 65 67 20 65 6e 64 3b 0a 7d 3b 0a 0a  AndReg end;.};..
c360: 2f 2a 0a 2a 2a 20 56 61 6c 75 65 73 20 74 68 61  /*.** Values tha
c370: 74 20 6d 61 79 20 62 65 20 70 61 73 73 65 64 20  t may be passed 
c380: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
c390: 67 75 6d 65 6e 74 20 74 6f 20 77 69 6e 64 6f 77  gument to window
c3a0: 43 6f 64 65 4f 70 28 29 2e 0a 2a 2f 0a 23 64 65  CodeOp()..*/.#de
c3b0: 66 69 6e 65 20 57 49 4e 44 4f 57 5f 52 45 54 55  fine WINDOW_RETU
c3c0: 52 4e 5f 52 4f 57 20 31 0a 23 64 65 66 69 6e 65  RN_ROW 1.#define
c3d0: 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52   WINDOW_AGGINVER
c3e0: 53 45 20 32 0a 23 64 65 66 69 6e 65 20 57 49 4e  SE 2.#define WIN
c3f0: 44 4f 57 5f 41 47 47 53 54 45 50 20 20 20 20 33  DOW_AGGSTEP    3
c400: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
c410: 20 56 4d 20 63 6f 64 65 20 74 6f 20 72 65 61 64   VM code to read
c420: 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61 6d   the window fram
c430: 65 73 20 70 65 65 72 20 76 61 6c 75 65 73 20 66  es peer values f
c440: 72 6f 6d 20 63 75 72 73 6f 72 20 63 73 72 20 69  rom cursor csr i
c450: 6e 74 6f 0a 2a 2a 20 61 6e 20 61 72 72 61 79 20  nto.** an array 
c460: 6f 66 20 72 65 67 69 73 74 65 72 73 20 73 74 61  of registers sta
c470: 72 74 69 6e 67 20 61 74 20 72 65 67 2e 0a 2a 2f  rting at reg..*/
c480: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
c490: 64 6f 77 52 65 61 64 50 65 65 72 56 61 6c 75 65  dowReadPeerValue
c4a0: 73 28 0a 20 20 57 69 6e 64 6f 77 43 6f 64 65 41  s(.  WindowCodeA
c4b0: 72 67 20 2a 70 2c 0a 20 20 69 6e 74 20 63 73 72  rg *p,.  int csr
c4c0: 2c 0a 20 20 69 6e 74 20 72 65 67 0a 29 7b 0a 20  ,.  int reg.){. 
c4d0: 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d   Window *pMWin =
c4e0: 20 70 2d 3e 70 4d 57 69 6e 3b 0a 20 20 45 78 70   p->pMWin;.  Exp
c4f0: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
c500: 3d 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42  = pMWin->pOrderB
c510: 79 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  y;.  if( pOrderB
c520: 79 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76  y ){.    Vdbe *v
c530: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
c540: 65 28 70 2d 3e 70 50 61 72 73 65 29 3b 0a 20 20  e(p->pParse);.  
c550: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 50 61 72    ExprList *pPar
c560: 74 20 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74  t = pMWin->pPart
c570: 69 74 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 69  ition;.    int i
c580: 43 6f 6c 4f 66 66 20 3d 20 70 4d 57 69 6e 2d 3e  ColOff = pMWin->
c590: 6e 42 75 66 66 65 72 43 6f 6c 20 2b 20 28 70 50  nBufferCol + (pP
c5a0: 61 72 74 20 3f 20 70 50 61 72 74 2d 3e 6e 45 78  art ? pPart->nEx
c5b0: 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74  pr : 0);.    int
c5c0: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
c5d0: 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
c5e0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
c5f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c600: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
c610: 63 73 72 2c 20 69 43 6f 6c 4f 66 66 2b 69 2c 20  csr, iColOff+i, 
c620: 72 65 67 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20  reg+i);.    }.  
c630: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
c640: 61 74 65 20 56 4d 20 63 6f 64 65 20 74 6f 20 69  ate VM code to i
c650: 6e 76 6f 6b 65 20 65 69 74 68 65 72 20 78 56 61  nvoke either xVa
c660: 6c 75 65 28 29 20 28 62 46 69 6e 3d 3d 30 29 20  lue() (bFin==0) 
c670: 6f 72 20 78 46 69 6e 61 6c 69 7a 65 28 29 0a 2a  or xFinalize().*
c680: 2a 20 28 62 46 69 6e 3d 3d 31 29 20 66 6f 72 20  * (bFin==1) for 
c690: 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63  each window func
c6a0: 74 69 6f 6e 20 69 6e 20 74 68 65 20 6c 69 6e 6b  tion in the link
c6b0: 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67  ed list starting
c6c0: 20 61 74 0a 2a 2a 20 70 4d 57 69 6e 2e 20 4f 72   at.** pMWin. Or
c6d0: 2c 20 66 6f 72 20 62 75 69 6c 74 2d 69 6e 20 77  , for built-in w
c6e0: 69 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e 73 20  indow-functions 
c6f0: 74 68 61 74 20 64 6f 20 6e 6f 74 20 75 73 65 20  that do not use 
c700: 74 68 65 20 73 74 61 6e 64 61 72 64 0a 2a 2a 20  the standard.** 
c710: 41 50 49 2c 20 67 65 6e 65 72 61 74 65 20 74 68  API, generate th
c720: 65 20 65 71 75 69 76 61 6c 65 6e 74 20 56 4d 20  e equivalent VM 
c730: 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
c740: 76 6f 69 64 20 77 69 6e 64 6f 77 41 67 67 46 69  void windowAggFi
c750: 6e 61 6c 28 57 69 6e 64 6f 77 43 6f 64 65 41 72  nal(WindowCodeAr
c760: 67 20 2a 70 2c 20 69 6e 74 20 62 46 69 6e 29 7b  g *p, int bFin){
c770: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
c780: 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20   = p->pParse;.  
c790: 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20  Window *pMWin = 
c7a0: 70 2d 3e 70 4d 57 69 6e 3b 0a 20 20 56 64 62 65  p->pMWin;.  Vdbe
c7b0: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
c7c0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
c7d0: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 0a 20  Window *pWin;.. 
c7e0: 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b   for(pWin=pMWin;
c7f0: 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e   pWin; pWin=pWin
c800: 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20  ->pNextWin){.   
c810: 20 69 66 28 20 70 4d 57 69 6e 2d 3e 72 65 67 53   if( pMWin->regS
c820: 74 61 72 74 52 6f 77 69 64 3d 3d 30 0a 20 20 20  tartRowid==0.   
c830: 20 20 26 26 20 28 70 57 69 6e 2d 3e 70 46 75 6e    && (pWin->pFun
c840: 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  c->funcFlags & S
c850: 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41  QLITE_FUNC_MINMA
c860: 58 29 20 0a 20 20 20 20 20 26 26 20 28 70 57 69  X) .     && (pWi
c870: 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b 5f 55 4e  n->eStart!=TK_UN
c880: 42 4f 55 4e 44 45 44 29 0a 20 20 20 20 29 7b 0a  BOUNDED).    ){.
c890: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c8a0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
c8b0: 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67  ll, 0, pWin->reg
c8c0: 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 73  Result);.      s
c8d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
c8e0: 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 57 69  (v, OP_Last, pWi
c8f0: 6e 2d 3e 63 73 72 41 70 70 29 3b 0a 20 20 20 20  n->csrApp);.    
c900: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
c910: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c920: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
c930: 5f 43 6f 6c 75 6d 6e 2c 20 70 57 69 6e 2d 3e 63  _Column, pWin->c
c940: 73 72 41 70 70 2c 20 30 2c 20 70 57 69 6e 2d 3e  srApp, 0, pWin->
c950: 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  regResult);.    
c960: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
c970: 70 48 65 72 65 28 76 2c 20 73 71 6c 69 74 65 33  pHere(v, sqlite3
c980: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
c990: 76 29 2d 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65  v)-2);.    }else
c9a0: 20 69 66 28 20 70 57 69 6e 2d 3e 72 65 67 41 70   if( pWin->regAp
c9b0: 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  p ){.      asser
c9c0: 74 28 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61  t( pMWin->regSta
c9d0: 72 74 52 6f 77 69 64 3d 3d 30 20 29 3b 0a 20 20  rtRowid==0 );.  
c9e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
c9f0: 6e 74 20 6e 41 72 67 20 3d 20 77 69 6e 64 6f 77  nt nArg = window
ca00: 41 72 67 43 6f 75 6e 74 28 70 57 69 6e 29 3b 0a  ArgCount(pWin);.
ca10: 20 20 20 20 20 20 69 66 28 20 62 46 69 6e 20 29        if( bFin )
ca20: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
ca30: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
ca40: 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 57 69 6e  P_AggFinal, pWin
ca50: 2d 3e 72 65 67 41 63 63 75 6d 2c 20 6e 41 72 67  ->regAccum, nArg
ca60: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
ca70: 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76  e3VdbeAppendP4(v
ca80: 2c 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2c 20 50  , pWin->pFunc, P
ca90: 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20  4_FUNCDEF);.    
caa0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
cab0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp2(v, OP_Copy
cac0: 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d  , pWin->regAccum
cad0: 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c  , pWin->regResul
cae0: 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
caf0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
cb00: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69   OP_Null, 0, pWi
cb10: 6e 2d 3e 72 65 67 41 63 63 75 6d 29 3b 0a 20 20  n->regAccum);.  
cb20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
cb30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cb40: 64 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67 56 61  dOp3(v, OP_AggVa
cb50: 6c 75 65 2c 70 57 69 6e 2d 3e 72 65 67 41 63 63  lue,pWin->regAcc
cb60: 75 6d 2c 6e 41 72 67 2c 70 57 69 6e 2d 3e 72 65  um,nArg,pWin->re
cb70: 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20  gResult);.      
cb80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70    sqlite3VdbeApp
cb90: 65 6e 64 50 34 28 76 2c 20 70 57 69 6e 2d 3e 70  endP4(v, pWin->p
cba0: 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46  Func, P4_FUNCDEF
cbb0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
cbc0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
cbd0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63  nerate code to c
cbe0: 61 6c 63 75 6c 61 74 65 20 74 68 65 20 63 75 72  alculate the cur
cbf0: 72 65 6e 74 20 76 61 6c 75 65 73 20 6f 66 20 61  rent values of a
cc00: 6c 6c 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  ll window functi
cc10: 6f 6e 73 20 69 6e 20 74 68 65 0a 2a 2a 20 70 2d  ons in the.** p-
cc20: 3e 70 4d 57 69 6e 20 6c 69 73 74 20 62 79 20 64  >pMWin list by d
cc30: 6f 69 6e 67 20 61 20 66 75 6c 6c 20 73 63 61 6e  oing a full scan
cc40: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
cc50: 77 69 6e 64 6f 77 20 66 72 61 6d 65 2e 20 53 74  window frame. St
cc60: 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  ore the.** resul
cc70: 74 73 20 69 6e 20 74 68 65 20 57 69 6e 64 6f 77  ts in the Window
cc80: 2e 72 65 67 52 65 73 75 6c 74 20 72 65 67 69 73  .regResult regis
cc90: 74 65 72 73 2c 20 72 65 61 64 79 20 74 6f 20 72  ters, ready to r
cca0: 65 74 75 72 6e 20 74 68 65 20 75 70 70 65 72 0a  eturn the upper.
ccb0: 2a 2a 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61  ** layer..*/.sta
ccc0: 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 46  tic void windowF
ccd0: 75 6c 6c 53 63 61 6e 28 57 69 6e 64 6f 77 43 6f  ullScan(WindowCo
cce0: 64 65 41 72 67 20 2a 70 29 7b 0a 20 20 57 69 6e  deArg *p){.  Win
ccf0: 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 50 61 72  dow *pWin;.  Par
cd00: 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e  se *pParse = p->
cd10: 70 50 61 72 73 65 3b 0a 20 20 57 69 6e 64 6f 77  pParse;.  Window
cd20: 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 4d 57   *pMWin = p->pMW
cd30: 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  in;.  Vdbe *v = 
cd40: 70 2d 3e 70 56 64 62 65 3b 0a 0a 20 20 69 6e 74  p->pVdbe;..  int
cd50: 20 72 65 67 43 52 6f 77 69 64 20 3d 20 30 3b 20   regCRowid = 0; 
cd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cd70: 43 75 72 72 65 6e 74 20 72 6f 77 69 64 20 76 61  Current rowid va
cd80: 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  lue */.  int reg
cd90: 43 50 65 65 72 20 3d 20 30 3b 20 20 20 20 20 20  CPeer = 0;      
cda0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
cdb0: 65 6e 74 20 70 65 65 72 20 76 61 6c 75 65 73 20  ent peer values 
cdc0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69  */.  int regRowi
cdd0: 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
cde0: 20 20 20 20 20 2f 2a 20 41 67 67 53 74 65 70 20       /* AggStep 
cdf0: 72 6f 77 69 64 20 76 61 6c 75 65 20 2a 2f 0a 20  rowid value */. 
ce00: 20 69 6e 74 20 72 65 67 50 65 65 72 20 3d 20 30   int regPeer = 0
ce10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ce20: 20 2f 2a 20 41 67 67 53 74 65 70 20 70 65 65 72   /* AggStep peer
ce30: 20 76 61 6c 75 65 73 20 2a 2f 0a 0a 20 20 69 6e   values */..  in
ce40: 74 20 6e 50 65 65 72 3b 0a 20 20 69 6e 74 20 6c  t nPeer;.  int l
ce50: 62 6c 4e 65 78 74 3b 0a 20 20 69 6e 74 20 6c 62  blNext;.  int lb
ce60: 6c 42 72 6b 3b 0a 20 20 69 6e 74 20 61 64 64 72  lBrk;.  int addr
ce70: 4e 65 78 74 3b 0a 20 20 69 6e 74 20 63 73 72 3b  Next;.  int csr;
ce80: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4d 57 69  ..  assert( pMWi
ce90: 6e 21 3d 30 20 29 3b 0a 20 20 63 73 72 20 3d 20  n!=0 );.  csr = 
cea0: 70 4d 57 69 6e 2d 3e 63 73 72 41 70 70 3b 0a 20  pMWin->csrApp;. 
ceb0: 20 6e 50 65 65 72 20 3d 20 28 70 4d 57 69 6e 2d   nPeer = (pMWin-
cec0: 3e 70 4f 72 64 65 72 42 79 20 3f 20 70 4d 57 69  >pOrderBy ? pMWi
ced0: 6e 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  n->pOrderBy->nEx
cee0: 70 72 20 3a 20 30 29 3b 0a 0a 20 20 6c 62 6c 4e  pr : 0);..  lblN
cef0: 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ext = sqlite3Vdb
cf00: 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
cf10: 65 29 3b 0a 20 20 6c 62 6c 42 72 6b 20 3d 20 73  e);.  lblBrk = s
cf20: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
cf30: 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a 20 20  bel(pParse);..  
cf40: 72 65 67 43 52 6f 77 69 64 20 3d 20 73 71 6c 69  regCRowid = sqli
cf50: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
cf60: 61 72 73 65 29 3b 0a 20 20 72 65 67 52 6f 77 69  arse);.  regRowi
cf70: 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
cf80: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
cf90: 20 69 66 28 20 6e 50 65 65 72 20 29 7b 0a 20 20   if( nPeer ){.  
cfa0: 20 20 72 65 67 43 50 65 65 72 20 3d 20 73 71 6c    regCPeer = sql
cfb0: 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
cfc0: 28 70 50 61 72 73 65 2c 20 6e 50 65 65 72 29 3b  (pParse, nPeer);
cfd0: 0a 20 20 20 20 72 65 67 50 65 65 72 20 3d 20 73  .    regPeer = s
cfe0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
cff0: 67 65 28 70 50 61 72 73 65 2c 20 6e 50 65 65 72  ge(pParse, nPeer
d000: 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
d010: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
d020: 50 5f 52 6f 77 69 64 2c 20 70 4d 57 69 6e 2d 3e  P_Rowid, pMWin->
d030: 69 45 70 68 43 73 72 2c 20 72 65 67 43 52 6f 77  iEphCsr, regCRow
d040: 69 64 29 3b 0a 20 20 77 69 6e 64 6f 77 52 65 61  id);.  windowRea
d050: 64 50 65 65 72 56 61 6c 75 65 73 28 70 2c 20 70  dPeerValues(p, p
d060: 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 72  MWin->iEphCsr, r
d070: 65 67 43 50 65 65 72 29 3b 0a 0a 20 20 66 6f 72  egCPeer);..  for
d080: 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69  (pWin=pMWin; pWi
d090: 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e  n; pWin=pWin->pN
d0a0: 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 73 71 6c  extWin){.    sql
d0b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
d0c0: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57  , OP_Null, 0, pW
d0d0: 69 6e 2d 3e 72 65 67 41 63 63 75 6d 29 3b 0a 20  in->regAccum);. 
d0e0: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62   }..  sqlite3Vdb
d0f0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65  eAddOp3(v, OP_Se
d100: 65 6b 47 45 2c 20 63 73 72 2c 20 6c 62 6c 42 72  ekGE, csr, lblBr
d110: 6b 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61  k, pMWin->regSta
d120: 72 74 52 6f 77 69 64 29 3b 0a 20 20 56 64 62 65  rtRowid);.  Vdbe
d130: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 61  Coverage(v);.  a
d140: 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65  ddrNext = sqlite
d150: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
d160: 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
d170: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
d180: 6f 77 69 64 2c 20 63 73 72 2c 20 72 65 67 52 6f  owid, csr, regRo
d190: 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  wid);.  sqlite3V
d1a0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
d1b0: 47 74 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 45 6e  Gt, pMWin->regEn
d1c0: 64 52 6f 77 69 64 2c 20 6c 62 6c 42 72 6b 2c 20  dRowid, lblBrk, 
d1d0: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 56 64 62  regRowid);.  Vdb
d1e0: 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72 4e 75  eCoverageNeverNu
d1f0: 6c 6c 28 76 29 3b 0a 0a 20 20 69 66 28 20 70 4d  ll(v);..  if( pM
d200: 57 69 6e 2d 3e 65 45 78 63 6c 75 64 65 3d 3d 54  Win->eExclude==T
d210: 4b 5f 43 55 52 52 45 4e 54 20 29 7b 0a 20 20 20  K_CURRENT ){.   
d220: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d230: 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65 67  p3(v, OP_Eq, reg
d240: 43 52 6f 77 69 64 2c 20 6c 62 6c 4e 65 78 74 2c  CRowid, lblNext,
d250: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
d260: 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65  VdbeCoverageNeve
d270: 72 4e 75 6c 6c 28 76 29 3b 0a 20 20 7d 65 6c 73  rNull(v);.  }els
d280: 65 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 78  e if( pMWin->eEx
d290: 63 6c 75 64 65 21 3d 54 4b 5f 4e 4f 20 29 7b 0a  clude!=TK_NO ){.
d2a0: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
d2b0: 20 20 69 6e 74 20 61 64 64 72 45 71 20 3d 20 30    int addrEq = 0
d2c0: 3b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  ;.    KeyInfo *p
d2d0: 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 0a 0a 20 20  KeyInfo = 0;..  
d2e0: 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70 4f 72    if( pMWin->pOr
d2f0: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 70  derBy ){.      p
d300: 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
d310: 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  3KeyInfoFromExpr
d320: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4d 57  List(pParse, pMW
d330: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 2c 20 30 2c  in->pOrderBy, 0,
d340: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
d350: 66 28 20 70 4d 57 69 6e 2d 3e 65 45 78 63 6c 75  f( pMWin->eExclu
d360: 64 65 3d 3d 54 4b 5f 54 49 45 53 20 29 7b 0a 20  de==TK_TIES ){. 
d370: 20 20 20 20 20 61 64 64 72 45 71 20 3d 20 73 71       addrEq = sq
d380: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
d390: 76 2c 20 4f 50 5f 45 71 2c 20 72 65 67 43 52 6f  v, OP_Eq, regCRo
d3a0: 77 69 64 2c 20 30 2c 20 72 65 67 52 6f 77 69 64  wid, 0, regRowid
d3b0: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
d3c0: 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c 28 76  erageNeverNull(v
d3d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
d3e0: 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20   pKeyInfo ){.   
d3f0: 20 20 20 77 69 6e 64 6f 77 52 65 61 64 50 65 65     windowReadPee
d400: 72 56 61 6c 75 65 73 28 70 2c 20 63 73 72 2c 20  rValues(p, csr, 
d410: 72 65 67 50 65 65 72 29 3b 0a 20 20 20 20 20 20  regPeer);.      
d420: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d430: 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  3(v, OP_Compare,
d440: 20 72 65 67 50 65 65 72 2c 20 72 65 67 43 50 65   regPeer, regCPe
d450: 65 72 2c 20 6e 50 65 65 72 29 3b 0a 20 20 20 20  er, nPeer);.    
d460: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70    sqlite3VdbeApp
d470: 65 6e 64 50 34 28 76 2c 20 28 76 6f 69 64 2a 29  endP4(v, (void*)
d480: 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
d490: 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 61 64 64  INFO);.      add
d4a0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
d4b0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31 3b  urrentAddr(v)+1;
d4c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d4d0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
d4e0: 75 6d 70 2c 20 61 64 64 72 2c 20 6c 62 6c 4e 65  ump, addr, lblNe
d4f0: 78 74 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20  xt, addr);.     
d500: 20 56 64 62 65 43 6f 76 65 72 61 67 65 45 71 4e   VdbeCoverageEqN
d510: 65 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  e(v);.    }else{
d520: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d530: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
d540: 6f 74 6f 2c 20 30 2c 20 6c 62 6c 4e 65 78 74 29  oto, 0, lblNext)
d550: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
d560: 61 64 64 72 45 71 20 29 20 73 71 6c 69 74 65 33  addrEq ) sqlite3
d570: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
d580: 61 64 64 72 45 71 29 3b 0a 20 20 7d 0a 0a 20 20  addrEq);.  }..  
d590: 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28 70 50  windowAggStep(pP
d5a0: 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 63 73 72  arse, pMWin, csr
d5b0: 2c 20 30 2c 20 70 2d 3e 72 65 67 41 72 67 29 3b  , 0, p->regArg);
d5c0: 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  ..  sqlite3VdbeR
d5d0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
d5e0: 62 6c 4e 65 78 74 29 3b 0a 20 20 73 71 6c 69 74  blNext);.  sqlit
d5f0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
d600: 4f 50 5f 4e 65 78 74 2c 20 63 73 72 2c 20 61 64  OP_Next, csr, ad
d610: 64 72 4e 65 78 74 29 3b 0a 20 20 56 64 62 65 43  drNext);.  VdbeC
d620: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
d630: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
d640: 65 28 76 2c 20 61 64 64 72 4e 65 78 74 2d 31 29  e(v, addrNext-1)
d650: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  ;.  sqlite3VdbeJ
d660: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4e  umpHere(v, addrN
d670: 65 78 74 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65  ext+1);.  sqlite
d680: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
d690: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64  pParse, regRowid
d6a0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
d6b0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
d6c0: 65 2c 20 72 65 67 43 52 6f 77 69 64 29 3b 0a 20  e, regCRowid);. 
d6d0: 20 69 66 28 20 6e 50 65 65 72 20 29 7b 0a 20 20   if( nPeer ){.  
d6e0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
d6f0: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
d700: 2c 20 72 65 67 50 65 65 72 2c 20 6e 50 65 65 72  , regPeer, nPeer
d710: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
d720: 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
d730: 50 61 72 73 65 2c 20 72 65 67 43 50 65 65 72 2c  Parse, regCPeer,
d740: 20 6e 50 65 65 72 29 3b 0a 20 20 7d 0a 0a 20 20   nPeer);.  }..  
d750: 77 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 70  windowAggFinal(p
d760: 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  , 1);.}../*.** I
d770: 6e 76 6f 6b 65 20 74 68 65 20 73 75 62 2d 72 6f  nvoke the sub-ro
d780: 75 74 69 6e 65 20 61 74 20 72 65 67 47 6f 73 75  utine at regGosu
d790: 62 20 28 67 65 6e 65 72 61 74 65 64 20 62 79 20  b (generated by 
d7a0: 63 6f 64 65 20 69 6e 20 73 65 6c 65 63 74 2e 63  code in select.c
d7b0: 29 20 74 6f 0a 2a 2a 20 72 65 74 75 72 6e 20 74  ) to.** return t
d7c0: 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f  he current row o
d7d0: 66 20 57 69 6e 64 6f 77 2e 69 45 70 68 43 73 72  f Window.iEphCsr
d7e0: 2e 20 49 66 20 61 6c 6c 20 77 69 6e 64 6f 77 20  . If all window 
d7f0: 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 0a 2a 2a  functions are.**
d800: 20 61 67 67 72 65 67 61 74 65 20 77 69 6e 64 6f   aggregate windo
d810: 77 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74  w functions that
d820: 20 75 73 65 20 74 68 65 20 73 74 61 6e 64 61 72   use the standar
d830: 64 20 41 50 49 2c 20 61 20 73 69 6e 67 6c 65 0a  d API, a single.
d840: 2a 2a 20 4f 50 5f 47 6f 73 75 62 20 69 6e 73 74  ** OP_Gosub inst
d850: 72 75 63 74 69 6f 6e 20 69 73 20 61 6c 6c 20 74  ruction is all t
d860: 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hat this routine
d870: 20 67 65 6e 65 72 61 74 65 73 2e 20 45 78 74 72   generates. Extr
d880: 61 20 56 4d 20 63 6f 64 65 0a 2a 2a 20 66 6f 72  a VM code.** for
d890: 20 70 65 72 2d 72 6f 77 20 70 72 6f 63 65 73 73   per-row process
d8a0: 69 6e 67 20 69 73 20 6f 6e 6c 79 20 67 65 6e 65  ing is only gene
d8b0: 72 61 74 65 64 20 66 6f 72 20 74 68 65 20 66 6f  rated for the fo
d8c0: 6c 6c 6f 77 69 6e 67 20 62 75 69 6c 74 2d 69 6e  llowing built-in
d8d0: 20 77 69 6e 64 6f 77 0a 2a 2a 20 66 75 6e 63 74   window.** funct
d8e0: 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6e 74  ions:.**.**   nt
d8f0: 68 5f 76 61 6c 75 65 28 29 0a 2a 2a 20 20 20 66  h_value().**   f
d900: 69 72 73 74 5f 76 61 6c 75 65 28 29 0a 2a 2a 20  irst_value().** 
d910: 20 20 6c 61 67 28 29 0a 2a 2a 20 20 20 6c 65 61    lag().**   lea
d920: 64 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  d().*/.static vo
d930: 69 64 20 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f  id windowReturnO
d940: 6e 65 52 6f 77 28 57 69 6e 64 6f 77 43 6f 64 65  neRow(WindowCode
d950: 41 72 67 20 2a 70 29 7b 0a 20 20 57 69 6e 64 6f  Arg *p){.  Windo
d960: 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 4d  w *pMWin = p->pM
d970: 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  Win;.  Vdbe *v =
d980: 20 70 2d 3e 70 56 64 62 65 3b 0a 0a 20 20 69 66   p->pVdbe;..  if
d990: 28 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72  ( pMWin->regStar
d9a0: 74 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 77 69  tRowid ){.    wi
d9b0: 6e 64 6f 77 46 75 6c 6c 53 63 61 6e 28 70 29 3b  ndowFullScan(p);
d9c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 61  .  }else{.    Pa
d9d0: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d  rse *pParse = p-
d9e0: 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 57 69 6e  >pParse;.    Win
d9f0: 64 6f 77 20 2a 70 57 69 6e 3b 0a 0a 20 20 20 20  dow *pWin;..    
da00: 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20  for(pWin=pMWin; 
da10: 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d  pWin; pWin=pWin-
da20: 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20  >pNextWin){.    
da30: 20 20 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63    FuncDef *pFunc
da40: 20 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a   = pWin->pFunc;.
da50: 20 20 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d        if( pFunc-
da60: 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75  >zName==nth_valu
da70: 65 4e 61 6d 65 0a 20 20 20 20 20 20 20 7c 7c 20  eName.       || 
da80: 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69  pFunc->zName==fi
da90: 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65 0a 20 20  rst_valueName.  
daa0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69      ){.        i
dab0: 6e 74 20 63 73 72 20 3d 20 70 57 69 6e 2d 3e 63  nt csr = pWin->c
dac0: 73 72 41 70 70 3b 0a 20 20 20 20 20 20 20 20 69  srApp;.        i
dad0: 6e 74 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33  nt lbl = sqlite3
dae0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
daf0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69  arse);.        i
db00: 6e 74 20 74 6d 70 52 65 67 20 3d 20 73 71 6c 69  nt tmpReg = sqli
db10: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
db20: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
db30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
db40: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
db50: 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29  pWin->regResult)
db60: 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 69 66 28  ;.  .        if(
db70: 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e   pFunc->zName==n
db80: 74 68 5f 76 61 6c 75 65 4e 61 6d 65 20 29 7b 0a  th_valueName ){.
db90: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
dba0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
dbb0: 50 5f 43 6f 6c 75 6d 6e 2c 70 4d 57 69 6e 2d 3e  P_Column,pMWin->
dbc0: 69 45 70 68 43 73 72 2c 70 57 69 6e 2d 3e 69 41  iEphCsr,pWin->iA
dbd0: 72 67 43 6f 6c 2b 31 2c 74 6d 70 52 65 67 29 3b  rgCol+1,tmpReg);
dbe0: 0a 20 20 20 20 20 20 20 20 20 20 77 69 6e 64 6f  .          windo
dbf0: 77 43 68 65 63 6b 56 61 6c 75 65 28 70 50 61 72  wCheckValue(pPar
dc00: 73 65 2c 20 74 6d 70 52 65 67 2c 20 32 29 3b 0a  se, tmpReg, 2);.
dc10: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
dc20: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
dc30: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
dc40: 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 6d 70  _Integer, 1, tmp
dc50: 52 65 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Reg);.        }.
dc60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
dc70: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
dc80: 41 64 64 2c 20 74 6d 70 52 65 67 2c 20 70 57 69  Add, tmpReg, pWi
dc90: 6e 2d 3e 72 65 67 41 70 70 2c 20 74 6d 70 52 65  n->regApp, tmpRe
dca0: 67 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  g);.        sqli
dcb0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
dcc0: 20 4f 50 5f 47 74 2c 20 70 57 69 6e 2d 3e 72 65   OP_Gt, pWin->re
dcd0: 67 41 70 70 2b 31 2c 20 6c 62 6c 2c 20 74 6d 70  gApp+1, lbl, tmp
dce0: 52 65 67 29 3b 0a 20 20 20 20 20 20 20 20 56 64  Reg);.        Vd
dcf0: 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72 4e  beCoverageNeverN
dd00: 75 6c 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  ull(v);.        
dd10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dd20: 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69  3(v, OP_SeekRowi
dd30: 64 2c 20 63 73 72 2c 20 30 2c 20 74 6d 70 52 65  d, csr, 0, tmpRe
dd40: 67 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  g);.        Vdbe
dd50: 43 6f 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b  CoverageNeverTak
dd60: 65 6e 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  en(v);.        s
dd70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
dd80: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63  (v, OP_Column, c
dd90: 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f  sr, pWin->iArgCo
dda0: 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75  l, pWin->regResu
ddb0: 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  lt);.        sql
ddc0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
ddd0: 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20 20  abel(v, lbl);.  
dde0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
ddf0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
de00: 73 65 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20  se, tmpReg);.   
de10: 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65 20     }.      else 
de20: 69 66 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65  if( pFunc->zName
de30: 3d 3d 6c 65 61 64 4e 61 6d 65 20 7c 7c 20 70 46  ==leadName || pF
de40: 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 61 67 4e  unc->zName==lagN
de50: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ame ){.        i
de60: 6e 74 20 6e 41 72 67 20 3d 20 70 57 69 6e 2d 3e  nt nArg = pWin->
de70: 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 2d  pOwner->x.pList-
de80: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >nExpr;.        
de90: 69 6e 74 20 63 73 72 20 3d 20 70 57 69 6e 2d 3e  int csr = pWin->
dea0: 63 73 72 41 70 70 3b 0a 20 20 20 20 20 20 20 20  csrApp;.        
deb0: 69 6e 74 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65  int lbl = sqlite
dec0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70  3VdbeMakeLabel(p
ded0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
dee0: 69 6e 74 20 74 6d 70 52 65 67 20 3d 20 73 71 6c  int tmpReg = sql
def0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
df00: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
df10: 69 6e 74 20 69 45 70 68 20 3d 20 70 4d 57 69 6e  int iEph = pMWin
df20: 2d 3e 69 45 70 68 43 73 72 3b 0a 20 20 0a 20 20  ->iEphCsr;.  .  
df30: 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3c 33        if( nArg<3
df40: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
df50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
df60: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70  v, OP_Null, 0, p
df70: 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b  Win->regResult);
df80: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
df90: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
dfa0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
dfb0: 50 5f 43 6f 6c 75 6d 6e 2c 20 69 45 70 68 2c 70  P_Column, iEph,p
dfc0: 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 32 2c 70  Win->iArgCol+2,p
dfd0: 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b  Win->regResult);
dfe0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
dff0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e000: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64  dOp2(v, OP_Rowid
e010: 2c 20 69 45 70 68 2c 20 74 6d 70 52 65 67 29 3b  , iEph, tmpReg);
e020: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 41 72  .        if( nAr
e030: 67 3c 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  g<2 ){.         
e040: 20 69 6e 74 20 76 61 6c 20 3d 20 28 70 46 75 6e   int val = (pFun
e050: 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61  c->zName==leadNa
e060: 6d 65 20 3f 20 31 20 3a 20 2d 31 29 3b 0a 20 20  me ? 1 : -1);.  
e070: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
e080: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
e090: 41 64 64 49 6d 6d 2c 20 74 6d 70 52 65 67 2c 20  AddImm, tmpReg, 
e0a0: 76 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  val);.        }e
e0b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
e0c0: 6e 74 20 6f 70 20 3d 20 28 70 46 75 6e 63 2d 3e  nt op = (pFunc->
e0d0: 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65 20  zName==leadName 
e0e0: 3f 20 4f 50 5f 41 64 64 20 3a 20 4f 50 5f 53 75  ? OP_Add : OP_Su
e0f0: 62 74 72 61 63 74 29 3b 0a 20 20 20 20 20 20 20  btract);.       
e100: 20 20 20 69 6e 74 20 74 6d 70 52 65 67 32 20 3d     int tmpReg2 =
e110: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
e120: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
e130: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e140: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
e150: 6c 75 6d 6e 2c 20 69 45 70 68 2c 20 70 57 69 6e  lumn, iEph, pWin
e160: 2d 3e 69 41 72 67 43 6f 6c 2b 31 2c 20 74 6d 70  ->iArgCol+1, tmp
e170: 52 65 67 32 29 3b 0a 20 20 20 20 20 20 20 20 20  Reg2);.         
e180: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e190: 70 33 28 76 2c 20 6f 70 2c 20 74 6d 70 52 65 67  p3(v, op, tmpReg
e1a0: 32 2c 20 74 6d 70 52 65 67 2c 20 74 6d 70 52 65  2, tmpReg, tmpRe
e1b0: 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  g);.          sq
e1c0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
e1d0: 52 65 67 28 70 50 61 72 73 65 2c 20 74 6d 70 52  Reg(pParse, tmpR
e1e0: 65 67 32 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  eg2);.        }.
e1f0: 20 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74    .        sqlit
e200: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
e210: 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 63 73  OP_SeekRowid, cs
e220: 72 2c 20 6c 62 6c 2c 20 74 6d 70 52 65 67 29 3b  r, lbl, tmpReg);
e230: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
e240: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
e250: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e260: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
e270: 2c 20 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72  , csr, pWin->iAr
e280: 67 43 6f 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 52  gCol, pWin->regR
e290: 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20  esult);.        
e2a0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
e2b0: 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b  veLabel(v, lbl);
e2c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e2d0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
e2e0: 50 61 72 73 65 2c 20 74 6d 70 52 65 67 29 3b 0a  Parse, tmpReg);.
e2f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e300: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
e310: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
e320: 62 2c 20 70 2d 3e 72 65 67 47 6f 73 75 62 2c 20  b, p->regGosub, 
e330: 70 2d 3e 61 64 64 72 47 6f 73 75 62 29 3b 0a 7d  p->addrGosub);.}
e340: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
e350: 20 63 6f 64 65 20 74 6f 20 73 65 74 20 74 68 65   code to set the
e360: 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67   accumulator reg
e370: 69 73 74 65 72 20 66 6f 72 20 65 61 63 68 20 77  ister for each w
e380: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 0a 2a  indow function.*
e390: 2a 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20  * in the linked 
e3a0: 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74  list passed as t
e3b0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
e3c0: 6e 74 20 74 6f 20 4e 55 4c 4c 2e 20 41 6e 64 20  nt to NULL. And 
e3d0: 70 65 72 66 6f 72 6d 0a 2a 2a 20 61 6e 79 20 65  perform.** any e
e3e0: 71 75 69 76 61 6c 65 6e 74 20 69 6e 69 74 69 61  quivalent initia
e3f0: 6c 69 7a 61 74 69 6f 6e 20 72 65 71 75 69 72 65  lization require
e400: 64 20 62 79 20 61 6e 79 20 62 75 69 6c 74 2d 69  d by any built-i
e410: 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  n window functio
e420: 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 6c 69 73  ns.** in the lis
e430: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
e440: 20 77 69 6e 64 6f 77 49 6e 69 74 41 63 63 75 6d   windowInitAccum
e450: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
e460: 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 29 7b 0a  Window *pMWin){.
e470: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
e480: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
e490: 65 29 3b 0a 20 20 69 6e 74 20 72 65 67 41 72 67  e);.  int regArg
e4a0: 3b 0a 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 30  ;.  int nArg = 0
e4b0: 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e  ;.  Window *pWin
e4c0: 3b 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57  ;.  for(pWin=pMW
e4d0: 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70  in; pWin; pWin=p
e4e0: 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a  Win->pNextWin){.
e4f0: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 46 75      FuncDef *pFu
e500: 6e 63 20 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63  nc = pWin->pFunc
e510: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
e520: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
e530: 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67  ll, 0, pWin->reg
e540: 41 63 63 75 6d 29 3b 0a 20 20 20 20 6e 41 72 67  Accum);.    nArg
e550: 20 3d 20 4d 41 58 28 6e 41 72 67 2c 20 77 69 6e   = MAX(nArg, win
e560: 64 6f 77 41 72 67 43 6f 75 6e 74 28 70 57 69 6e  dowArgCount(pWin
e570: 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 57 69  ));.    if( pMWi
e580: 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f 77 69 64  n->regStartRowid
e590: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
e5a0: 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e   pFunc->zName==n
e5b0: 74 68 5f 76 61 6c 75 65 4e 61 6d 65 20 7c 7c 20  th_valueName || 
e5c0: 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69  pFunc->zName==fi
e5d0: 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65 20 29 7b  rst_valueName ){
e5e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e5f0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
e600: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 57 69  _Integer, 0, pWi
e610: 6e 2d 3e 72 65 67 41 70 70 29 3b 0a 20 20 20 20  n->regApp);.    
e620: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e630: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
e640: 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65  ger, 0, pWin->re
e650: 67 41 70 70 2b 31 29 3b 0a 20 20 20 20 20 20 7d  gApp+1);.      }
e660: 0a 0a 20 20 20 20 20 20 69 66 28 20 28 70 46 75  ..      if( (pFu
e670: 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  nc->funcFlags & 
e680: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d  SQLITE_FUNC_MINM
e690: 41 58 29 20 26 26 20 70 57 69 6e 2d 3e 63 73 72  AX) && pWin->csr
e6a0: 41 70 70 20 29 7b 0a 20 20 20 20 20 20 20 20 61  App ){.        a
e6b0: 73 73 65 72 74 28 20 70 57 69 6e 2d 3e 65 53 74  ssert( pWin->eSt
e6c0: 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  art!=TK_UNBOUNDE
e6d0: 44 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  D );.        sql
e6e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
e6f0: 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72  , OP_ResetSorter
e700: 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 29 3b  , pWin->csrApp);
e710: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e720: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
e730: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 57 69  _Integer, 0, pWi
e740: 6e 2d 3e 72 65 67 41 70 70 2b 31 29 3b 0a 20 20  n->regApp+1);.  
e750: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
e760: 20 20 72 65 67 41 72 67 20 3d 20 70 50 61 72 73    regArg = pPars
e770: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 70 50 61  e->nMem+1;.  pPa
e780: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 41 72  rse->nMem += nAr
e790: 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 67 41  g;.  return regA
e7a0: 72 67 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65  rg;.}../* .** Re
e7b0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
e7c0: 20 63 75 72 72 65 6e 74 20 66 72 61 6d 65 20 73   current frame s
e7d0: 68 6f 75 6c 64 20 62 65 20 63 61 63 68 65 64 20  hould be cached 
e7e0: 69 6e 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  in the ephemeral
e7f0: 20 74 61 62 6c 65 2c 0a 2a 2a 20 65 76 65 6e 20   table,.** even 
e800: 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  if there are no 
e810: 78 49 6e 76 65 72 73 65 28 29 20 63 61 6c 6c 73  xInverse() calls
e820: 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74   required..*/.st
e830: 61 74 69 63 20 69 6e 74 20 77 69 6e 64 6f 77 43  atic int windowC
e840: 61 63 68 65 46 72 61 6d 65 28 57 69 6e 64 6f 77  acheFrame(Window
e850: 20 2a 70 4d 57 69 6e 29 7b 0a 20 20 57 69 6e 64   *pMWin){.  Wind
e860: 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 69 66 28 20  ow *pWin;.  if( 
e870: 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72 74 52  pMWin->regStartR
e880: 6f 77 69 64 20 29 20 72 65 74 75 72 6e 20 31 3b  owid ) return 1;
e890: 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69  .  for(pWin=pMWi
e8a0: 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57  n; pWin; pWin=pW
e8b0: 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20  in->pNextWin){. 
e8c0: 20 20 20 46 75 6e 63 44 65 66 20 2a 70 46 75 6e     FuncDef *pFun
e8d0: 63 20 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63 3b  c = pWin->pFunc;
e8e0: 0a 20 20 20 20 69 66 28 20 28 70 46 75 6e 63 2d  .    if( (pFunc-
e8f0: 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75  >zName==nth_valu
e900: 65 4e 61 6d 65 29 0a 20 20 20 20 20 7c 7c 20 28  eName).     || (
e910: 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69  pFunc->zName==fi
e920: 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65 29 0a 20  rst_valueName). 
e930: 20 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d 3e 7a      || (pFunc->z
e940: 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65 29 0a  Name==leadName).
e950: 20 20 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d 3e       || (pFunc->
e960: 7a 4e 61 6d 65 3d 3d 6c 61 67 4e 61 6d 65 29 0a  zName==lagName).
e970: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
e980: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
e990: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
e9a0: 2f 2a 0a 2a 2a 20 72 65 67 4f 6c 64 20 61 6e 64  /*.** regOld and
e9b0: 20 72 65 67 4e 65 77 20 61 72 65 20 65 61 63 68   regNew are each
e9c0: 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73   the first regis
e9d0: 74 65 72 20 69 6e 20 61 6e 20 61 72 72 61 79 20  ter in an array 
e9e0: 6f 66 20 73 69 7a 65 0a 2a 2a 20 70 4f 72 64 65  of size.** pOrde
e9f0: 72 42 79 2d 3e 6e 45 78 70 72 2e 20 54 68 69 73  rBy->nExpr. This
ea00: 20 66 75 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61   function genera
ea10: 74 65 73 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70  tes code to comp
ea20: 61 72 65 20 74 68 65 20 74 77 6f 0a 2a 2a 20 61  are the two.** a
ea30: 72 72 61 79 73 20 6f 66 20 72 65 67 69 73 74 65  rrays of registe
ea40: 72 73 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c  rs using the col
ea50: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73  lation sequences
ea60: 20 61 6e 64 20 6f 74 68 65 72 20 63 6f 6d 70 61   and other compa
ea70: 72 69 73 6f 6e 0a 2a 2a 20 70 61 72 61 6d 65 74  rison.** paramet
ea80: 65 72 73 20 73 70 65 63 69 66 69 65 64 20 62 79  ers specified by
ea90: 20 70 4f 72 64 65 72 42 79 2e 20 0a 2a 2a 0a 2a   pOrderBy. .**.*
eaa0: 2a 20 49 66 20 74 68 65 20 74 77 6f 20 61 72 72  * If the two arr
eab0: 61 79 73 20 61 72 65 20 6e 6f 74 20 65 71 75 61  ays are not equa
eac0: 6c 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  l, the contents 
ead0: 6f 66 20 72 65 67 4e 65 77 20 69 73 20 63 6f 70  of regNew is cop
eae0: 69 65 64 20 74 6f 20 0a 2a 2a 20 72 65 67 4f 6c  ied to .** regOl
eaf0: 64 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 66 61  d and control fa
eb00: 6c 6c 73 20 74 68 72 6f 75 67 68 2e 20 4f 74 68  lls through. Oth
eb10: 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 63  erwise, if the c
eb20: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 61  ontents of the a
eb30: 72 72 61 79 73 0a 2a 2a 20 61 72 65 20 65 71 75  rrays.** are equ
eb40: 61 6c 2c 20 61 6e 20 4f 50 5f 47 6f 74 6f 20 69  al, an OP_Goto i
eb50: 73 20 65 78 65 63 75 74 65 64 2e 20 54 68 65 20  s executed. The 
eb60: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f  address of the O
eb70: 50 5f 47 6f 74 6f 20 69 73 20 72 65 74 75 72 6e  P_Goto is return
eb80: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
eb90: 69 64 20 77 69 6e 64 6f 77 49 66 4e 65 77 50 65  id windowIfNewPe
eba0: 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  er(.  Parse *pPa
ebb0: 72 73 65 2c 0a 20 20 45 78 70 72 4c 69 73 74 20  rse,.  ExprList 
ebc0: 2a 70 4f 72 64 65 72 42 79 2c 0a 20 20 69 6e 74  *pOrderBy,.  int
ebd0: 20 72 65 67 4e 65 77 2c 20 20 20 20 20 20 20 20   regNew,        
ebe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ebf0: 46 69 72 73 74 20 69 6e 20 61 72 72 61 79 20 6f  First in array o
ec00: 66 20 6e 65 77 20 76 61 6c 75 65 73 20 2a 2f 0a  f new values */.
ec10: 20 20 69 6e 74 20 72 65 67 4f 6c 64 2c 20 20 20    int regOld,   
ec20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec30: 20 20 2f 2a 20 46 69 72 73 74 20 69 6e 20 61 72    /* First in ar
ec40: 72 61 79 20 6f 66 20 6f 6c 64 20 76 61 6c 75 65  ray of old value
ec50: 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 20  s */.  int addr 
ec60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec70: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
ec80: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  ere */.){.  Vdbe
ec90: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
eca0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
ecb0: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
ecc0: 20 20 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 70      int nVal = p
ecd0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
ece0: 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
ecf0: 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
ed00: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
ed10: 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  st(pParse, pOrde
ed20: 72 42 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  rBy, 0, 0);.    
ed30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ed40: 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  3(v, OP_Compare,
ed50: 20 72 65 67 4f 6c 64 2c 20 72 65 67 4e 65 77 2c   regOld, regNew,
ed60: 20 6e 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69   nVal);.    sqli
ed70: 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
ed80: 76 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e  v, (void*)pKeyIn
ed90: 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
eda0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
edb0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
edc0: 70 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p, .      sqlite
edd0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
ede0: 28 76 29 2b 31 2c 20 61 64 64 72 2c 20 73 71 6c  (v)+1, addr, sql
edf0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
ee00: 64 64 72 28 76 29 2b 31 0a 20 20 20 20 29 3b 0a  ddr(v)+1.    );.
ee10: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
ee20: 45 71 4e 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  EqNe(v);.    sql
ee30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
ee40: 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4e 65  , OP_Copy, regNe
ee50: 77 2c 20 72 65 67 4f 6c 64 2c 20 6e 56 61 6c 2d  w, regOld, nVal-
ee60: 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
ee70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ee80: 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
ee90: 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  , addr);.  }.}..
eea0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
eeb0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73  ion is called as
eec0: 20 70 61 72 74 20 6f 66 20 67 65 6e 65 72 61 74   part of generat
eed0: 69 6e 67 20 56 4d 20 70 72 6f 67 72 61 6d 73 20  ing VM programs 
eee0: 66 6f 72 20 52 41 4e 47 45 0a 2a 2a 20 6f 66 66  for RANGE.** off
eef0: 73 65 74 20 50 52 45 43 45 44 49 4e 47 2f 46 4f  set PRECEDING/FO
ef00: 4c 4c 4f 57 49 4e 47 20 66 72 61 6d 65 20 62 6f  LLOWING frame bo
ef10: 75 6e 64 61 72 69 65 73 2e 20 41 73 73 75 6d 69  undaries. Assumi
ef20: 6e 67 20 22 41 53 43 22 20 6f 72 64 65 72 20 66  ng "ASC" order f
ef30: 6f 72 0a 2a 2a 20 74 68 65 20 4f 52 44 45 52 20  or.** the ORDER 
ef40: 42 59 20 74 65 72 6d 20 69 6e 20 74 68 65 20 77  BY term in the w
ef50: 69 6e 64 6f 77 2c 20 69 74 20 67 65 6e 65 72 61  indow, it genera
ef60: 74 65 73 20 63 6f 64 65 20 65 71 75 69 76 61 6c  tes code equival
ef70: 65 6e 74 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20  ent to:.**.**   
ef80: 69 66 28 20 63 73 72 31 2e 70 65 65 72 56 61 6c  if( csr1.peerVal
ef90: 20 2b 20 72 65 67 56 61 6c 20 3e 3d 20 63 73 72   + regVal >= csr
efa0: 32 2e 70 65 65 72 56 61 6c 20 29 20 67 6f 74 6f  2.peerVal ) goto
efb0: 20 6c 62 6c 3b 0a 2a 2a 0a 2a 2a 20 41 20 73 70   lbl;.**.** A sp
efc0: 65 63 69 61 6c 20 74 79 70 65 20 6f 66 20 61 72  ecial type of ar
efd0: 69 74 68 6d 65 74 69 63 20 69 73 20 75 73 65 64  ithmetic is used
efe0: 20 73 75 63 68 20 74 68 61 74 20 69 66 20 63 73   such that if cs
eff0: 72 2e 70 65 65 72 56 61 6c 20 69 73 20 6e 6f 74  r.peerVal is not
f000: 0a 2a 2a 20 61 20 6e 75 6d 65 72 69 63 20 74 79  .** a numeric ty
f010: 70 65 20 28 72 65 61 6c 20 6f 72 20 69 6e 74 65  pe (real or inte
f020: 67 65 72 29 2c 20 74 68 65 6e 20 74 68 65 20 72  ger), then the r
f030: 65 73 75 6c 74 20 6f 66 20 74 68 65 20 61 64 64  esult of the add
f040: 69 74 69 6f 6e 20 69 73 0a 2a 2a 20 61 20 63 6f  ition is.** a co
f050: 70 79 20 6f 66 20 63 73 72 31 2e 70 65 65 72 56  py of csr1.peerV
f060: 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  al..*/.static vo
f070: 69 64 20 77 69 6e 64 6f 77 43 6f 64 65 52 61 6e  id windowCodeRan
f080: 67 65 54 65 73 74 28 0a 20 20 57 69 6e 64 6f 77  geTest(.  Window
f090: 43 6f 64 65 41 72 67 20 2a 70 2c 20 0a 20 20 69  CodeArg *p, .  i
f0a0: 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
f0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0c0: 2f 2a 20 4f 50 5f 47 65 20 6f 72 20 4f 50 5f 47  /* OP_Ge or OP_G
f0d0: 74 20 2a 2f 0a 20 20 69 6e 74 20 63 73 72 31 2c  t */.  int csr1,
f0e0: 20 0a 20 20 69 6e 74 20 72 65 67 56 61 6c 2c 20   .  int regVal, 
f0f0: 0a 20 20 69 6e 74 20 63 73 72 32 2c 0a 20 20 69  .  int csr2,.  i
f100: 6e 74 20 6c 62 6c 0a 29 7b 0a 20 20 50 61 72 73  nt lbl.){.  Pars
f110: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70  e *pParse = p->p
f120: 50 61 72 73 65 3b 0a 20 20 56 64 62 65 20 2a 76  Parse;.  Vdbe *v
f130: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
f140: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  e(pParse);.  int
f150: 20 72 65 67 31 20 3d 20 73 71 6c 69 74 65 33 47   reg1 = sqlite3G
f160: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
f170: 29 3b 0a 20 20 69 6e 74 20 72 65 67 32 20 3d 20  );.  int reg2 = 
f180: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
f190: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  g(pParse);.  int
f1a0: 20 61 72 69 74 68 20 3d 20 4f 50 5f 41 64 64 3b   arith = OP_Add;
f1b0: 0a 20 20 69 6e 74 20 61 64 64 72 47 65 3b 0a 20  .  int addrGe;. 
f1c0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
f1d0: 72 42 79 20 3d 20 70 2d 3e 70 4d 57 69 6e 2d 3e  rBy = p->pMWin->
f1e0: 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 69 6e 74  pOrderBy;..  int
f1f0: 20 72 65 67 53 74 72 69 6e 67 20 3d 20 2b 2b 70   regString = ++p
f200: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20  Parse->nMem;..  
f210: 61 73 73 65 72 74 28 20 6f 70 3d 3d 4f 50 5f 47  assert( op==OP_G
f220: 65 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 7c  e || op==OP_Gt |
f230: 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20  | op==OP_Le );. 
f240: 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
f250: 79 20 26 26 20 70 4f 72 64 65 72 42 79 2d 3e 6e  y && pOrderBy->n
f260: 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 69 66 28  Expr==1 );.  if(
f270: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e   pOrderBy->a[0].
f280: 73 6f 72 74 46 6c 61 67 73 20 26 20 4b 45 59 49  sortFlags & KEYI
f290: 4e 46 4f 5f 4f 52 44 45 52 5f 44 45 53 43 20 29  NFO_ORDER_DESC )
f2a0: 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f 70  {.    switch( op
f2b0: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f   ){.      case O
f2c0: 50 5f 47 65 3a 20 6f 70 20 3d 20 4f 50 5f 4c 65  P_Ge: op = OP_Le
f2d0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
f2e0: 61 73 65 20 4f 50 5f 47 74 3a 20 6f 70 20 3d 20  ase OP_Gt: op = 
f2f0: 4f 50 5f 4c 74 3b 20 62 72 65 61 6b 3b 0a 20 20  OP_Lt; break;.  
f300: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
f310: 65 72 74 28 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29  ert( op==OP_Le )
f320: 3b 20 6f 70 20 3d 20 4f 50 5f 47 65 3b 20 62 72  ; op = OP_Ge; br
f330: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  eak;.    }.    a
f340: 72 69 74 68 20 3d 20 4f 50 5f 53 75 62 74 72 61  rith = OP_Subtra
f350: 63 74 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 64 6f  ct;.  }..  windo
f360: 77 52 65 61 64 50 65 65 72 56 61 6c 75 65 73 28  wReadPeerValues(
f370: 70 2c 20 63 73 72 31 2c 20 72 65 67 31 29 3b 0a  p, csr1, reg1);.
f380: 20 20 77 69 6e 64 6f 77 52 65 61 64 50 65 65 72    windowReadPeer
f390: 56 61 6c 75 65 73 28 70 2c 20 63 73 72 32 2c 20  Values(p, csr2, 
f3a0: 72 65 67 32 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  reg2);..  /* Che
f3b0: 63 6b 20 69 66 20 74 68 65 20 70 65 65 72 20 76  ck if the peer v
f3c0: 61 6c 75 65 20 66 6f 72 20 63 73 72 31 20 76 61  alue for csr1 va
f3d0: 6c 75 65 20 69 73 20 61 20 74 65 78 74 20 6f 72  lue is a text or
f3e0: 20 62 6c 6f 62 20 62 79 20 63 6f 6d 70 61 72 69   blob by compari
f3f0: 6e 67 0a 20 20 2a 2a 20 69 74 20 74 6f 20 74 68  ng.  ** it to th
f400: 65 20 73 6d 61 6c 6c 65 73 74 20 70 6f 73 73 69  e smallest possi
f410: 62 6c 65 20 73 74 72 69 6e 67 20 2d 20 27 27 2e  ble string - ''.
f420: 20 49 66 20 69 74 20 69 73 2c 20 6a 75 6d 70 20   If it is, jump 
f430: 6f 76 65 72 20 74 68 65 0a 20 20 2a 2a 20 4f 50  over the.  ** OP
f440: 5f 41 64 64 20 6f 72 20 4f 50 5f 53 75 62 74 72  _Add or OP_Subtr
f450: 61 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 61 6e  act operation an
f460: 64 20 70 72 6f 63 65 65 64 20 64 69 72 65 63 74  d proceed direct
f470: 6c 79 20 74 6f 20 74 68 65 20 63 6f 6d 70 61 72  ly to the compar
f480: 69 73 6f 6e 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  ison. */.  sqlit
f490: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
f4a0: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 72  OP_String8, 0, r
f4b0: 65 67 53 74 72 69 6e 67 2c 20 30 2c 20 22 22 2c  egString, 0, "",
f4c0: 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 61   P4_STATIC);.  a
f4d0: 64 64 72 47 65 20 3d 20 73 71 6c 69 74 65 33 56  ddrGe = sqlite3V
f4e0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
f4f0: 47 65 2c 20 72 65 67 53 74 72 69 6e 67 2c 20 30  Ge, regString, 0
f500: 2c 20 72 65 67 31 29 3b 0a 20 20 56 64 62 65 43  , reg1);.  VdbeC
f510: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
f520: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
f530: 76 2c 20 61 72 69 74 68 2c 20 72 65 67 56 61 6c  v, arith, regVal
f540: 2c 20 72 65 67 31 2c 20 72 65 67 31 29 3b 0a 20  , reg1, reg1);. 
f550: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
f560: 48 65 72 65 28 76 2c 20 61 64 64 72 47 65 29 3b  Here(v, addrGe);
f570: 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d  .  if( pOrderBy-
f580: 3e 61 5b 30 5d 2e 73 6f 72 74 46 6c 61 67 73 20  >a[0].sortFlags 
f590: 26 20 4b 45 59 49 4e 46 4f 5f 4f 52 44 45 52 5f  & KEYINFO_ORDER_
f5a0: 42 49 47 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69  BIGNULL ){.    i
f5b0: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 61 64 64  nt addr;.    add
f5c0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
f5d0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e  ddOp1(v, OP_NotN
f5e0: 75 6c 6c 2c 20 72 65 67 31 29 3b 20 56 64 62 65  ull, reg1); Vdbe
f5f0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
f600: 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
f610: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 47 65 3a       case OP_Ge:
f620: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f630: 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
f640: 2c 20 6c 62 6c 29 3b 20 62 72 65 61 6b 3b 0a 20  , lbl); break;. 
f650: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 47 74 3a       case OP_Gt:
f660: 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
f670: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
f680: 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 65 67 32 2c  P_NotNull, reg2,
f690: 20 6c 62 6c 29 3b 20 0a 20 20 20 20 20 20 20 20   lbl); .        
f6a0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
f6b0: 20 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b   .        break;
f6c0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4c  .      case OP_L
f6d0: 65 3a 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e: .        sqli
f6e0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f6f0: 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 32   OP_IsNull, reg2
f700: 2c 20 6c 62 6c 29 3b 20 0a 20 20 20 20 20 20 20  , lbl); .       
f710: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
f720: 3b 20 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ; .        break
f730: 3b 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  ;.      default:
f740: 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 4f 50 5f   assert( op==OP_
f750: 4c 74 20 29 3b 20 2f 2a 20 6e 6f 2d 6f 70 20 2a  Lt ); /* no-op *
f760: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  /.    }.    sqli
f770: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f780: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 71 6c   OP_Goto, 0, sql
f790: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
f7a0: 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 73  ddr(v)+2);.    s
f7b0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
f7c0: 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
f7d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f7e0: 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p2(v, OP_IsNull,
f7f0: 20 72 65 67 32 2c 20 6c 62 6c 29 3b 20 56 64 62   reg2, lbl); Vdb
f800: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
f810: 20 20 69 66 28 20 6f 70 3d 3d 4f 50 5f 47 74 20    if( op==OP_Gt 
f820: 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 7b 0a  || op==OP_Ge ){.
f830: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f840: 65 43 68 61 6e 67 65 50 32 28 76 2c 20 2d 31 2c  eChangeP2(v, -1,
f850: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
f860: 65 6e 74 41 64 64 72 28 76 29 2b 31 29 3b 0a 20  entAddr(v)+1);. 
f870: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
f880: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
f890: 6f 70 2c 20 72 65 67 32 2c 20 6c 62 6c 2c 20 72  op, reg2, lbl, r
f8a0: 65 67 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eg1); VdbeCovera
f8b0: 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
f8c0: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
f8d0: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
f8e0: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 4f 50    assert( op==OP
f8f0: 5f 47 65 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74  _Ge || op==OP_Gt
f900: 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 7c 7c   || op==OP_Lt ||
f910: 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20   op==OP_Le );.  
f920: 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
f930: 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ge); VdbeCoverag
f940: 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 47 65  eIf(v, op==OP_Ge
f950: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 6f 70  );.  testcase(op
f960: 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f  ==OP_Lt); VdbeCo
f970: 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
f980: 4f 50 5f 4c 74 29 3b 0a 20 20 74 65 73 74 63 61  OP_Lt);.  testca
f990: 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56  se(op==OP_Le); V
f9a0: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
f9b0: 20 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 74   op==OP_Le);.  t
f9c0: 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
f9d0: 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
f9e0: 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 47 74 29  If(v, op==OP_Gt)
f9f0: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  ;..  sqlite3Rele
fa00: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
fa10: 65 2c 20 72 65 67 31 29 3b 0a 20 20 73 71 6c 69  e, reg1);.  sqli
fa20: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
fa30: 67 28 70 50 61 72 73 65 2c 20 72 65 67 32 29 3b  g(pParse, reg2);
fa40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72  .}../*.** Helper
fa50: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 73 71   function for sq
fa60: 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 53  lite3WindowCodeS
fa70: 74 65 70 28 29 2e 20 45 61 63 68 20 63 61 6c 6c  tep(). Each call
fa80: 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
fa90: 6e 0a 2a 2a 20 67 65 6e 65 72 61 74 65 73 20 56  n.** generates V
faa0: 4d 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e  M code for a sin
fab0: 67 6c 65 20 52 45 54 55 52 4e 5f 52 4f 57 2c 20  gle RETURN_ROW, 
fac0: 41 47 47 53 54 45 50 20 6f 72 20 41 47 47 49 4e  AGGSTEP or AGGIN
fad0: 56 45 52 53 45 20 0a 2a 2a 20 6f 70 65 72 61 74  VERSE .** operat
fae0: 69 6f 6e 2e 20 52 65 66 65 72 20 74 6f 20 74 68  ion. Refer to th
faf0: 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74  e header comment
fb00: 20 66 6f 72 20 73 71 6c 69 74 65 33 57 69 6e 64   for sqlite3Wind
fb10: 6f 77 43 6f 64 65 53 74 65 70 28 29 20 66 6f 72  owCodeStep() for
fb20: 0a 2a 2a 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a  .** details..*/.
fb30: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 64 6f  static int windo
fb40: 77 43 6f 64 65 4f 70 28 0a 20 57 69 6e 64 6f 77  wCodeOp(. Window
fb50: 43 6f 64 65 41 72 67 20 2a 70 2c 20 20 20 20 20  CodeArg *p,     
fb60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
fb70: 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 2a 2f 0a  ntext object */.
fb80: 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20   int op,        
fb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fba0: 20 20 2f 2a 20 57 49 4e 44 4f 57 5f 52 45 54 55    /* WINDOW_RETU
fbb0: 52 4e 5f 52 4f 57 2c 20 41 47 47 53 54 45 50 20  RN_ROW, AGGSTEP 
fbc0: 6f 72 20 41 47 47 49 4e 56 45 52 53 45 20 2a 2f  or AGGINVERSE */
fbd0: 0a 20 69 6e 74 20 72 65 67 43 6f 75 6e 74 64 6f  . int regCountdo
fbe0: 77 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  wn,             
fbf0: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66     /* Register f
fc00: 6f 72 20 4f 50 5f 49 66 50 6f 73 20 63 6f 75 6e  or OP_IfPos coun
fc10: 74 64 6f 77 6e 20 2a 2f 0a 20 69 6e 74 20 6a 75  tdown */. int ju
fc20: 6d 70 4f 6e 45 6f 66 20 20 20 20 20 20 20 20 20  mpOnEof         
fc30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
fc40: 6d 70 20 68 65 72 65 20 69 66 20 73 74 65 70 70  mp here if stepp
fc50: 65 64 20 63 75 72 73 6f 72 20 72 65 61 63 68 65  ed cursor reache
fc60: 73 20 45 4f 46 20 2a 2f 0a 29 7b 0a 20 20 69 6e  s EOF */.){.  in
fc70: 74 20 63 73 72 2c 20 72 65 67 3b 0a 20 20 50 61  t csr, reg;.  Pa
fc80: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d  rse *pParse = p-
fc90: 3e 70 50 61 72 73 65 3b 0a 20 20 57 69 6e 64 6f  >pParse;.  Windo
fca0: 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 4d  w *pMWin = p->pM
fcb0: 57 69 6e 3b 0a 20 20 69 6e 74 20 72 65 74 20 3d  Win;.  int ret =
fcc0: 20 30 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   0;.  Vdbe *v = 
fcd0: 70 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  p->pVdbe;.  int 
fce0: 61 64 64 72 49 66 20 3d 20 30 3b 20 0a 20 20 69  addrIf = 0; .  i
fcf0: 6e 74 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 20  nt addrContinue 
fd00: 3d 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72 47  = 0;.  int addrG
fd10: 6f 74 6f 20 3d 20 30 3b 0a 20 20 69 6e 74 20 62  oto = 0;.  int b
fd20: 50 65 65 72 20 3d 20 28 70 4d 57 69 6e 2d 3e 65  Peer = (pMWin->e
fd30: 46 72 6d 54 79 70 65 21 3d 54 4b 5f 52 4f 57 53  FrmType!=TK_ROWS
fd40: 29 3b 0a 0a 20 20 69 6e 74 20 6c 62 6c 44 6f 6e  );..  int lblDon
fd50: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
fd60: 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
fd70: 3b 0a 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74  ;.  int addrNext
fd80: 52 61 6e 67 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a  Range = 0;..  /*
fd90: 20 53 70 65 63 69 61 6c 20 63 61 73 65 20 2d 20   Special case - 
fda0: 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53  WINDOW_AGGINVERS
fdb0: 45 20 69 73 20 61 6c 77 61 79 73 20 61 20 6e 6f  E is always a no
fdc0: 2d 6f 70 20 69 66 20 74 68 65 20 66 72 61 6d 65  -op if the frame
fdd0: 0a 20 20 2a 2a 20 73 74 61 72 74 73 20 77 69 74  .  ** starts wit
fde0: 68 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43  h UNBOUNDED PREC
fdf0: 45 44 49 4e 47 2e 20 2a 2f 0a 20 20 69 66 28 20  EDING. */.  if( 
fe00: 6f 70 3d 3d 57 49 4e 44 4f 57 5f 41 47 47 49 4e  op==WINDOW_AGGIN
fe10: 56 45 52 53 45 20 26 26 20 70 4d 57 69 6e 2d 3e  VERSE && pMWin->
fe20: 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55  eStart==TK_UNBOU
fe30: 4e 44 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65  NDED ){.    asse
fe40: 72 74 28 20 72 65 67 43 6f 75 6e 74 64 6f 77 6e  rt( regCountdown
fe50: 3d 3d 30 20 26 26 20 6a 75 6d 70 4f 6e 45 6f 66  ==0 && jumpOnEof
fe60: 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ==0 );.    retur
fe70: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  n 0;.  }..  if( 
fe80: 72 65 67 43 6f 75 6e 74 64 6f 77 6e 3e 30 20 29  regCountdown>0 )
fe90: 7b 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d  {.    if( pMWin-
fea0: 3e 65 46 72 6d 54 79 70 65 3d 3d 54 4b 5f 52 41  >eFrmType==TK_RA
feb0: 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 61 64 64  NGE ){.      add
fec0: 72 4e 65 78 74 52 61 6e 67 65 20 3d 20 73 71 6c  rNextRange = sql
fed0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
fee0: 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 61 73  ddr(v);.      as
fef0: 73 65 72 74 28 20 6f 70 3d 3d 57 49 4e 44 4f 57  sert( op==WINDOW
ff00: 5f 41 47 47 49 4e 56 45 52 53 45 20 7c 7c 20 6f  _AGGINVERSE || o
ff10: 70 3d 3d 57 49 4e 44 4f 57 5f 41 47 47 53 54 45  p==WINDOW_AGGSTE
ff20: 50 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  P );.      if( o
ff30: 70 3d 3d 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56  p==WINDOW_AGGINV
ff40: 45 52 53 45 20 29 7b 0a 20 20 20 20 20 20 20 20  ERSE ){.        
ff50: 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72  if( pMWin->eStar
ff60: 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  t==TK_FOLLOWING 
ff70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 69 6e  ){.          win
ff80: 64 6f 77 43 6f 64 65 52 61 6e 67 65 54 65 73 74  dowCodeRangeTest
ff90: 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
ffa0: 70 2c 20 4f 50 5f 4c 65 2c 20 70 2d 3e 63 75 72  p, OP_Le, p->cur
ffb0: 72 65 6e 74 2e 63 73 72 2c 20 72 65 67 43 6f 75  rent.csr, regCou
ffc0: 6e 74 64 6f 77 6e 2c 20 70 2d 3e 73 74 61 72 74  ntdown, p->start
ffd0: 2e 63 73 72 2c 20 6c 62 6c 44 6f 6e 65 0a 20 20  .csr, lblDone.  
ffe0: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
fff0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10000 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 52 61      windowCodeRa
10010 6e 67 65 54 65 73 74 28 0a 20 20 20 20 20 20 20  ngeTest(.       
10020 20 20 20 20 20 20 20 70 2c 20 4f 50 5f 47 65 2c         p, OP_Ge,
10030 20 70 2d 3e 73 74 61 72 74 2e 63 73 72 2c 20 72   p->start.csr, r
10040 65 67 43 6f 75 6e 74 64 6f 77 6e 2c 20 70 2d 3e  egCountdown, p->
10050 63 75 72 72 65 6e 74 2e 63 73 72 2c 20 6c 62 6c  current.csr, lbl
10060 44 6f 6e 65 0a 20 20 20 20 20 20 20 20 20 20 29  Done.          )
10070 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10080 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10090 20 77 69 6e 64 6f 77 43 6f 64 65 52 61 6e 67 65   windowCodeRange
100a0 54 65 73 74 28 0a 20 20 20 20 20 20 20 20 20 20  Test(.          
100b0 20 20 70 2c 20 4f 50 5f 47 74 2c 20 70 2d 3e 65    p, OP_Gt, p->e
100c0 6e 64 2e 63 73 72 2c 20 72 65 67 43 6f 75 6e 74  nd.csr, regCount
100d0 64 6f 77 6e 2c 20 70 2d 3e 63 75 72 72 65 6e 74  down, p->current
100e0 2e 63 73 72 2c 20 6c 62 6c 44 6f 6e 65 0a 20 20  .csr, lblDone.  
100f0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
10100 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10110 20 20 61 64 64 72 49 66 20 3d 20 73 71 6c 69 74    addrIf = sqlit
10120 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
10130 4f 50 5f 49 66 50 6f 73 2c 20 72 65 67 43 6f 75  OP_IfPos, regCou
10140 6e 74 64 6f 77 6e 2c 20 30 2c 20 31 29 3b 0a 20  ntdown, 0, 1);. 
10150 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
10160 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  e(v);.    }.  }.
10170 0a 20 20 69 66 28 20 6f 70 3d 3d 57 49 4e 44 4f  .  if( op==WINDO
10180 57 5f 52 45 54 55 52 4e 5f 52 4f 57 20 26 26 20  W_RETURN_ROW && 
10190 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72 74 52  pMWin->regStartR
101a0 6f 77 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 77  owid==0 ){.    w
101b0 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 70 2c  indowAggFinal(p,
101c0 20 30 29 3b 0a 20 20 7d 0a 20 20 61 64 64 72 43   0);.  }.  addrC
101d0 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
101e0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
101f0 28 76 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  (v);.  switch( o
10200 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 57 49  p ){.    case WI
10210 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 3a  NDOW_RETURN_ROW:
10220 0a 20 20 20 20 20 20 63 73 72 20 3d 20 70 2d 3e  .      csr = p->
10230 63 75 72 72 65 6e 74 2e 63 73 72 3b 0a 20 20 20  current.csr;.   
10240 20 20 20 72 65 67 20 3d 20 70 2d 3e 63 75 72 72     reg = p->curr
10250 65 6e 74 2e 72 65 67 3b 0a 20 20 20 20 20 20 77  ent.reg;.      w
10260 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52 6f  indowReturnOneRo
10270 77 28 70 29 3b 0a 20 20 20 20 20 20 62 72 65 61  w(p);.      brea
10280 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 57 49 4e  k;..    case WIN
10290 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 3a 0a  DOW_AGGINVERSE:.
102a0 20 20 20 20 20 20 63 73 72 20 3d 20 70 2d 3e 73        csr = p->s
102b0 74 61 72 74 2e 63 73 72 3b 0a 20 20 20 20 20 20  tart.csr;.      
102c0 72 65 67 20 3d 20 70 2d 3e 73 74 61 72 74 2e 72  reg = p->start.r
102d0 65 67 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d  eg;.      if( pM
102e0 57 69 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f 77  Win->regStartRow
102f0 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  id ){.        as
10300 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 72 65 67  sert( pMWin->reg
10310 45 6e 64 52 6f 77 69 64 20 29 3b 0a 20 20 20 20  EndRowid );.    
10320 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10330 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
10340 6d 6d 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74  mm, pMWin->regSt
10350 61 72 74 52 6f 77 69 64 2c 20 31 29 3b 0a 20 20  artRowid, 1);.  
10360 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10370 20 20 20 77 69 6e 64 6f 77 41 67 67 53 74 65 70     windowAggStep
10380 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20  (pParse, pMWin, 
10390 63 73 72 2c 20 31 2c 20 70 2d 3e 72 65 67 41 72  csr, 1, p->regAr
103a0 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
103b0 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65    break;..    de
103c0 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73  fault:.      ass
103d0 65 72 74 28 20 6f 70 3d 3d 57 49 4e 44 4f 57 5f  ert( op==WINDOW_
103e0 41 47 47 53 54 45 50 20 29 3b 0a 20 20 20 20 20  AGGSTEP );.     
103f0 20 63 73 72 20 3d 20 70 2d 3e 65 6e 64 2e 63 73   csr = p->end.cs
10400 72 3b 0a 20 20 20 20 20 20 72 65 67 20 3d 20 70  r;.      reg = p
10410 2d 3e 65 6e 64 2e 72 65 67 3b 0a 20 20 20 20 20  ->end.reg;.     
10420 20 69 66 28 20 70 4d 57 69 6e 2d 3e 72 65 67 53   if( pMWin->regS
10430 74 61 72 74 52 6f 77 69 64 20 29 7b 0a 20 20 20  tartRowid ){.   
10440 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 57       assert( pMW
10450 69 6e 2d 3e 72 65 67 45 6e 64 52 6f 77 69 64 20  in->regEndRowid 
10460 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
10470 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
10480 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 4d 57 69 6e  OP_AddImm, pMWin
10490 2d 3e 72 65 67 45 6e 64 52 6f 77 69 64 2c 20 31  ->regEndRowid, 1
104a0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
104b0 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 41 67          windowAg
104c0 67 53 74 65 70 28 70 50 61 72 73 65 2c 20 70 4d  gStep(pParse, pM
104d0 57 69 6e 2c 20 63 73 72 2c 20 30 2c 20 70 2d 3e  Win, csr, 0, p->
104e0 72 65 67 41 72 67 29 3b 0a 20 20 20 20 20 20 7d  regArg);.      }
104f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
10500 7d 0a 0a 20 20 69 66 28 20 6f 70 3d 3d 70 2d 3e  }..  if( op==p->
10510 65 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 73  eDelete ){.    s
10520 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
10530 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 63  (v, OP_Delete, c
10540 73 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  sr);.    sqlite3
10550 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
10560 4f 50 46 4c 41 47 5f 53 41 56 45 50 4f 53 49 54  OPFLAG_SAVEPOSIT
10570 49 4f 4e 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ION);.  }..  if(
10580 20 6a 75 6d 70 4f 6e 45 6f 66 20 29 7b 0a 20 20   jumpOnEof ){.  
10590 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
105a0 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
105b0 63 73 72 2c 20 73 71 6c 69 74 65 33 56 64 62 65  csr, sqlite3Vdbe
105c0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32  CurrentAddr(v)+2
105d0 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
105e0 61 67 65 28 76 29 3b 0a 20 20 20 20 72 65 74 20  age(v);.    ret 
105f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
10600 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b  Op0(v, OP_Goto);
10610 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
10620 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
10630 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 63 73 72 2c  v, OP_Next, csr,
10640 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
10650 65 6e 74 41 64 64 72 28 76 29 2b 31 2b 62 50 65  entAddr(v)+1+bPe
10660 65 72 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  er);.    VdbeCov
10670 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 69 66  erage(v);.    if
10680 28 20 62 50 65 65 72 20 29 7b 0a 20 20 20 20 20  ( bPeer ){.     
10690 20 61 64 64 72 47 6f 74 6f 20 3d 20 73 71 6c 69   addrGoto = sqli
106a0 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
106b0 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 7d   OP_Goto);.    }
106c0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 50 65 65  .  }..  if( bPee
106d0 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 52 65  r ){.    int nRe
106e0 67 20 3d 20 28 70 4d 57 69 6e 2d 3e 70 4f 72 64  g = (pMWin->pOrd
106f0 65 72 42 79 20 3f 20 70 4d 57 69 6e 2d 3e 70 4f  erBy ? pMWin->pO
10700 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 3a 20  rderBy->nExpr : 
10710 30 29 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 54  0);.    int regT
10720 6d 70 20 3d 20 28 6e 52 65 67 20 3f 20 73 71 6c  mp = (nReg ? sql
10730 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
10740 28 70 50 61 72 73 65 2c 20 6e 52 65 67 29 20 3a  (pParse, nReg) :
10750 20 30 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 52   0);.    windowR
10760 65 61 64 50 65 65 72 56 61 6c 75 65 73 28 70 2c  eadPeerValues(p,
10770 20 63 73 72 2c 20 72 65 67 54 6d 70 29 3b 0a 20   csr, regTmp);. 
10780 20 20 20 77 69 6e 64 6f 77 49 66 4e 65 77 50 65     windowIfNewPe
10790 65 72 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  er(pParse, pMWin
107a0 2d 3e 70 4f 72 64 65 72 42 79 2c 20 72 65 67 54  ->pOrderBy, regT
107b0 6d 70 2c 20 72 65 67 2c 20 61 64 64 72 43 6f 6e  mp, reg, addrCon
107c0 74 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69  tinue);.    sqli
107d0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
107e0 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 54  nge(pParse, regT
107f0 6d 70 2c 20 6e 52 65 67 29 3b 0a 20 20 7d 0a 0a  mp, nReg);.  }..
10800 20 20 69 66 28 20 61 64 64 72 4e 65 78 74 52 61    if( addrNextRa
10810 6e 67 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nge ){.    sqlit
10820 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
10830 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
10840 4e 65 78 74 52 61 6e 67 65 29 3b 0a 20 20 7d 0a  NextRange);.  }.
10850 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
10860 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c  olveLabel(v, lbl
10870 44 6f 6e 65 29 3b 0a 20 20 69 66 28 20 61 64 64  Done);.  if( add
10880 72 47 6f 74 6f 20 29 20 73 71 6c 69 74 65 33 56  rGoto ) sqlite3V
10890 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
108a0 64 64 72 47 6f 74 6f 29 3b 0a 20 20 69 66 28 20  ddrGoto);.  if( 
108b0 61 64 64 72 49 66 20 29 20 73 71 6c 69 74 65 33  addrIf ) sqlite3
108c0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
108d0 61 64 64 72 49 66 29 3b 0a 20 20 72 65 74 75 72  addrIf);.  retur
108e0 6e 20 72 65 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  n ret;.}.../*.**
108f0 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65   Allocate and re
10900 74 75 72 6e 20 61 20 64 75 70 6c 69 63 61 74 65  turn a duplicate
10910 20 6f 66 20 74 68 65 20 57 69 6e 64 6f 77 20 6f   of the Window o
10920 62 6a 65 63 74 20 69 6e 64 69 63 61 74 65 64 20  bject indicated 
10930 62 79 20 74 68 65 0a 2a 2a 20 74 68 69 72 64 20  by the.** third 
10940 61 72 67 75 6d 65 6e 74 2e 20 53 65 74 20 74 68  argument. Set th
10950 65 20 57 69 6e 64 6f 77 2e 70 4f 77 6e 65 72 20  e Window.pOwner 
10960 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6e 65 77  field of the new
10970 20 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 70 4f   object to.** pO
10980 77 6e 65 72 2e 0a 2a 2f 0a 57 69 6e 64 6f 77 20  wner..*/.Window 
10990 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 75  *sqlite3WindowDu
109a0 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  p(sqlite3 *db, E
109b0 78 70 72 20 2a 70 4f 77 6e 65 72 2c 20 57 69 6e  xpr *pOwner, Win
109c0 64 6f 77 20 2a 70 29 7b 0a 20 20 57 69 6e 64 6f  dow *p){.  Windo
109d0 77 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 69  w *pNew = 0;.  i
109e0 66 28 20 41 4c 57 41 59 53 28 70 29 20 29 7b 0a  f( ALWAYS(p) ){.
109f0 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
10a00 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
10a10 62 2c 20 73 69 7a 65 6f 66 28 57 69 6e 64 6f 77  b, sizeof(Window
10a20 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  ));.    if( pNew
10a30 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   ){.      pNew->
10a40 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
10a50 62 53 74 72 44 75 70 28 64 62 2c 20 70 2d 3e 7a  bStrDup(db, p->z
10a60 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 4e 65  Name);.      pNe
10a70 77 2d 3e 70 46 69 6c 74 65 72 20 3d 20 73 71 6c  w->pFilter = sql
10a80 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
10a90 70 2d 3e 70 46 69 6c 74 65 72 2c 20 30 29 3b 0a  p->pFilter, 0);.
10aa0 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 46 75 6e        pNew->pFun
10ab0 63 20 3d 20 70 2d 3e 70 46 75 6e 63 3b 0a 20 20  c = p->pFunc;.  
10ac0 20 20 20 20 70 4e 65 77 2d 3e 70 50 61 72 74 69      pNew->pParti
10ad0 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78  tion = sqlite3Ex
10ae0 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
10af0 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20 30 29 3b  >pPartition, 0);
10b00 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4f 72  .      pNew->pOr
10b10 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45  derBy = sqlite3E
10b20 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
10b30 2d 3e 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a  ->pOrderBy, 0);.
10b40 20 20 20 20 20 20 70 4e 65 77 2d 3e 65 46 72 6d        pNew->eFrm
10b50 54 79 70 65 20 3d 20 70 2d 3e 65 46 72 6d 54 79  Type = p->eFrmTy
10b60 70 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  pe;.      pNew->
10b70 65 45 6e 64 20 3d 20 70 2d 3e 65 45 6e 64 3b 0a  eEnd = p->eEnd;.
10b80 20 20 20 20 20 20 70 4e 65 77 2d 3e 65 53 74 61        pNew->eSta
10b90 72 74 20 3d 20 70 2d 3e 65 53 74 61 72 74 3b 0a  rt = p->eStart;.
10ba0 20 20 20 20 20 20 70 4e 65 77 2d 3e 65 45 78 63        pNew->eExc
10bb0 6c 75 64 65 20 3d 20 70 2d 3e 65 45 78 63 6c 75  lude = p->eExclu
10bc0 64 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  de;.      pNew->
10bd0 72 65 67 52 65 73 75 6c 74 20 3d 20 70 2d 3e 72  regResult = p->r
10be0 65 67 52 65 73 75 6c 74 3b 0a 20 20 20 20 20 20  egResult;.      
10bf0 70 4e 65 77 2d 3e 70 53 74 61 72 74 20 3d 20 73  pNew->pStart = s
10c00 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
10c10 2c 20 70 2d 3e 70 53 74 61 72 74 2c 20 30 29 3b  , p->pStart, 0);
10c20 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 45 6e  .      pNew->pEn
10c30 64 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  d = sqlite3ExprD
10c40 75 70 28 64 62 2c 20 70 2d 3e 70 45 6e 64 2c 20  up(db, p->pEnd, 
10c50 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  0);.      pNew->
10c60 70 4f 77 6e 65 72 20 3d 20 70 4f 77 6e 65 72 3b  pOwner = pOwner;
10c70 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
10c80 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
10c90 2a 2a 20 52 65 74 75 72 6e 20 61 20 63 6f 70 79  ** Return a copy
10ca0 20 6f 66 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   of the linked l
10cb0 69 73 74 20 6f 66 20 57 69 6e 64 6f 77 20 6f 62  ist of Window ob
10cc0 6a 65 63 74 73 20 70 61 73 73 65 64 20 61 73 20  jects passed as 
10cd0 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 61 72  the.** second ar
10ce0 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 57 69 6e 64 6f  gument..*/.Windo
10cf0 77 20 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  w *sqlite3Window
10d00 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20  ListDup(sqlite3 
10d10 2a 64 62 2c 20 57 69 6e 64 6f 77 20 2a 70 29 7b  *db, Window *p){
10d20 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b  .  Window *pWin;
10d30 0a 20 20 57 69 6e 64 6f 77 20 2a 70 52 65 74 20  .  Window *pRet 
10d40 3d 20 30 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 2a  = 0;.  Window **
10d50 70 70 20 3d 20 26 70 52 65 74 3b 0a 0a 20 20 66  pp = &pRet;..  f
10d60 6f 72 28 70 57 69 6e 3d 70 3b 20 70 57 69 6e 3b  or(pWin=p; pWin;
10d70 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78   pWin=pWin->pNex
10d80 74 57 69 6e 29 7b 0a 20 20 20 20 2a 70 70 20 3d  tWin){.    *pp =
10d90 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 75   sqlite3WindowDu
10da0 70 28 64 62 2c 20 30 2c 20 70 57 69 6e 29 3b 0a  p(db, 0, pWin);.
10db0 20 20 20 20 69 66 28 20 2a 70 70 3d 3d 30 20 29      if( *pp==0 )
10dc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 70 20 3d   break;.    pp =
10dd0 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 57   &((*pp)->pNextW
10de0 69 6e 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  in);.  }..  retu
10df0 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pRet;.}../*.*
10e00 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
10e10 20 69 74 20 63 61 6e 20 62 65 20 64 65 74 65 72   it can be deter
10e20 6d 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  mined at compile
10e30 20 74 69 6d 65 20 74 68 61 74 20 65 78 70 72 65   time that expre
10e40 73 73 69 6f 6e 20 0a 2a 2a 20 70 45 78 70 72 20  ssion .** pExpr 
10e50 65 76 61 6c 75 61 74 65 73 20 74 6f 20 61 20 76  evaluates to a v
10e60 61 6c 75 65 20 74 68 61 74 2c 20 77 68 65 6e 20  alue that, when 
10e70 63 61 73 74 20 74 6f 20 61 6e 20 69 6e 74 65 67  cast to an integ
10e80 65 72 2c 20 69 73 20 67 72 65 61 74 65 72 20 0a  er, is greater .
10e90 2a 2a 20 74 68 61 6e 20 7a 65 72 6f 2e 20 46 61  ** than zero. Fa
10ea0 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  lse otherwise..*
10eb0 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65  *.** If an OOM e
10ec0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69  rror occurs, thi
10ed0 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20  s function sets 
10ee0 74 68 65 20 50 61 72 73 65 2e 64 62 2e 6d 61 6c  the Parse.db.mal
10ef0 6c 6f 63 46 61 69 6c 65 64 20 0a 2a 2a 20 66 6c  locFailed .** fl
10f00 61 67 20 61 6e 64 20 72 65 74 75 72 6e 73 20 7a  ag and returns z
10f10 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
10f20 6e 74 20 77 69 6e 64 6f 77 45 78 70 72 47 74 5a  nt windowExprGtZ
10f30 65 72 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73  ero(Parse *pPars
10f40 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
10f50 0a 20 20 69 6e 74 20 72 65 74 20 3d 20 30 3b 0a  .  int ret = 0;.
10f60 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
10f70 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73 71  pParse->db;.  sq
10f80 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
10f90 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  l = 0;.  sqlite3
10fa0 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 64 62  ValueFromExpr(db
10fb0 2c 20 70 45 78 70 72 2c 20 64 62 2d 3e 65 6e 63  , pExpr, db->enc
10fc0 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  , SQLITE_AFF_NUM
10fd0 45 52 49 43 2c 20 26 70 56 61 6c 29 3b 0a 20 20  ERIC, &pVal);.  
10fe0 69 66 28 20 70 56 61 6c 20 26 26 20 73 71 6c 69  if( pVal && sqli
10ff0 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 70 56  te3_value_int(pV
11000 61 6c 29 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  al)>0 ){.    ret
11010 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 1;.  }.  sqli
11020 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
11030 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 74  l);.  return ret
11040 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74  ;.}../*.** sqlit
11050 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 68  e3WhereBegin() h
11060 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
11070 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 53  called for the S
11080 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
11090 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74 68  .** passed as th
110a0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
110b0 74 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  t when this func
110c0 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 2e  tion is invoked.
110d0 20 49 74 20 67 65 6e 65 72 61 74 65 73 0a 2a 2a   It generates.**
110e0 20 63 6f 64 65 20 74 6f 20 70 6f 70 75 6c 61 74   code to populat
110f0 65 20 74 68 65 20 57 69 6e 64 6f 77 2e 72 65 67  e the Window.reg
11100 52 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 20  Result register 
11110 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77 20  for each window 
11120 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 6e 64  function .** and
11130 20 69 6e 76 6f 6b 65 20 74 68 65 20 73 75 62 2d   invoke the sub-
11140 72 6f 75 74 69 6e 65 20 61 74 20 69 6e 73 74 72  routine at instr
11150 75 63 74 69 6f 6e 20 61 64 64 72 47 6f 73 75 62  uction addrGosub
11160 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 72   once for each r
11170 6f 77 2e 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68  ow..** sqlite3Wh
11180 65 72 65 45 6e 64 28 29 20 69 73 20 61 6c 77 61  ereEnd() is alwa
11190 79 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  ys called before
111a0 20 72 65 74 75 72 6e 69 6e 67 2e 20 0a 2a 2a 0a   returning. .**.
111b0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
111c0 20 68 61 6e 64 6c 65 73 20 73 65 76 65 72 61 6c   handles several
111d0 20 64 69 66 66 65 72 65 6e 74 20 74 79 70 65 73   different types
111e0 20 6f 66 20 77 69 6e 64 6f 77 20 66 72 61 6d 65   of window frame
111f0 73 2c 20 77 68 69 63 68 0a 2a 2a 20 72 65 71 75  s, which.** requ
11200 69 72 65 20 73 6c 69 67 68 74 6c 79 20 64 69 66  ire slightly dif
11210 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 69 6e  ferent processin
11220 67 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  g. The following
11230 20 70 73 65 75 64 6f 20 63 6f 64 65 20 69 73 0a   pseudo code is.
11240 2a 2a 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  ** used to imple
11250 6d 65 6e 74 20 77 69 6e 64 6f 77 20 66 72 61 6d  ment window fram
11260 65 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  es of the form:.
11270 2a 2a 0a 2a 2a 20 20 20 52 4f 57 53 20 42 45 54  **.**   ROWS BET
11280 57 45 45 4e 20 3c 65 78 70 72 31 3e 20 50 52 45  WEEN <expr1> PRE
11290 43 45 44 49 4e 47 20 41 4e 44 20 3c 65 78 70 72  CEDING AND <expr
112a0 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a  2> FOLLOWING.**.
112b0 2a 2a 20 4f 74 68 65 72 20 77 69 6e 64 6f 77 20  ** Other window 
112c0 66 72 61 6d 65 20 74 79 70 65 73 20 75 73 65 20  frame types use 
112d0 76 61 72 69 61 6e 74 73 20 6f 66 20 74 68 65 20  variants of the 
112e0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
112f0 20 20 20 20 20 2e 2e 2e 20 6c 6f 6f 70 20 73 74       ... loop st
11300 61 72 74 65 64 20 62 79 20 73 71 6c 69 74 65 33  arted by sqlite3
11310 57 68 65 72 65 42 65 67 69 6e 28 29 20 2e 2e 2e  WhereBegin() ...
11320 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 6e 65  .**       if( ne
11330 77 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a  w partition ){.*
11340 2a 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20  *         Gosub 
11350 66 6c 75 73 68 0a 2a 2a 20 20 20 20 20 20 20 7d  flush.**       }
11360 0a 2a 2a 20 20 20 20 20 20 20 49 6e 73 65 72 74  .**       Insert
11370 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20 65 70   new row into ep
11380 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20  h table..**     
11390 20 20 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20    .**       if( 
113a0 66 69 72 73 74 20 72 6f 77 20 6f 66 20 70 61 72  first row of par
113b0 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20  tition ){.**    
113c0 20 20 20 20 20 2f 2f 20 52 65 77 69 6e 64 20 74       // Rewind t
113d0 68 72 65 65 20 63 75 72 73 6f 72 73 2c 20 61 6c  hree cursors, al
113e0 6c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 65 70  l open on the ep
113f0 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20  h table..**     
11400 20 20 20 20 52 65 77 69 6e 64 28 63 73 72 45 6e      Rewind(csrEn
11410 64 29 3b 0a 2a 2a 20 20 20 20 20 20 20 20 20 52  d);.**         R
11420 65 77 69 6e 64 28 63 73 72 53 74 61 72 74 29 3b  ewind(csrStart);
11430 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 65 77 69  .**         Rewi
11440 6e 64 28 63 73 72 43 75 72 72 65 6e 74 29 3b 0a  nd(csrCurrent);.
11450 2a 2a 20 20 20 20 20 20 20 0a 2a 2a 20 20 20 20  **       .**    
11460 20 20 20 20 20 72 65 67 45 6e 64 20 3d 20 3c 65       regEnd = <e
11470 78 70 72 32 3e 20 20 20 20 20 20 20 20 20 20 2f  xpr2>          /
11480 2f 20 46 4f 4c 4c 4f 57 49 4e 47 20 65 78 70 72  / FOLLOWING expr
11490 65 73 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20  ession.**       
114a0 20 20 72 65 67 53 74 61 72 74 20 3d 20 3c 65 78    regStart = <ex
114b0 70 72 31 3e 20 20 20 20 20 20 20 20 2f 2f 20 50  pr1>        // P
114c0 52 45 43 45 44 49 4e 47 20 65 78 70 72 65 73 73  RECEDING express
114d0 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 7d 65 6c  ion.**       }el
114e0 73 65 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 2f  se{.**         /
114f0 2f 20 46 69 72 73 74 20 74 69 6d 65 20 74 68 69  / First time thi
11500 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
11510 6e 2c 20 74 68 65 20 65 70 68 20 74 61 62 6c 65  n, the eph table
11520 20 63 6f 6e 74 61 69 6e 73 20 74 77 6f 20 0a 2a   contains two .*
11530 2a 20 20 20 20 20 20 20 20 20 2f 2f 20 72 6f 77  *         // row
11540 73 2e 20 54 68 65 20 66 69 72 73 74 20 72 6f 77  s. The first row
11550 20 69 6e 20 74 68 65 20 70 61 72 74 69 74 69 6f   in the partitio
11560 6e 2c 20 77 68 69 63 68 20 61 6c 6c 20 74 68 72  n, which all thr
11570 65 65 20 63 75 72 73 6f 72 73 0a 2a 2a 20 20 20  ee cursors.**   
11580 20 20 20 20 20 20 2f 2f 20 63 75 72 72 65 6e 74        // current
11590 6c 79 20 70 6f 69 6e 74 20 74 6f 2c 20 61 6e 64  ly point to, and
115a0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   the following r
115b0 6f 77 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 41  ow..**         A
115c0 47 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 20 20  GGSTEP.**       
115d0 20 20 69 66 28 20 28 72 65 67 45 6e 64 2d 2d 29    if( (regEnd--)
115e0 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  <=0 ){.**       
115f0 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a      RETURN_ROW.*
11600 2a 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20  *           if( 
11610 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20  (regStart--)<=0 
11620 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ){.**           
11630 20 20 41 47 47 49 4e 56 45 52 53 45 0a 2a 2a 20    AGGINVERSE.** 
11640 20 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20            }.**  
11650 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
11660 20 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20    }.**     }.** 
11670 20 20 20 20 66 6c 75 73 68 3a 0a 2a 2a 20 20 20      flush:.**   
11680 20 20 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20      AGGSTEP.**  
11690 20 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b       while( 1 ){
116a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 45 54 55  .**         RETU
116b0 52 4e 20 52 4f 57 0a 2a 2a 20 20 20 20 20 20 20  RN ROW.**       
116c0 20 20 69 66 28 20 63 73 72 43 75 72 72 65 6e 74    if( csrCurrent
116d0 20 69 73 20 45 4f 46 20 29 20 62 72 65 61 6b 3b   is EOF ) break;
116e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 66 28 20  .**         if( 
116f0 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20  (regStart--)<=0 
11700 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ){.**           
11710 41 67 67 49 6e 76 65 72 73 65 28 63 73 72 53 74  AggInverse(csrSt
11720 61 72 74 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  art).**         
11730 20 20 4e 65 78 74 28 63 73 72 53 74 61 72 74 29    Next(csrStart)
11740 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a  .**         }.**
11750 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 54         }.**.** T
11760 68 65 20 70 73 65 75 64 6f 2d 63 6f 64 65 20 61  he pseudo-code a
11770 62 6f 76 65 20 75 73 65 73 20 74 68 65 20 66 6f  bove uses the fo
11780 6c 6c 6f 77 69 6e 67 20 73 68 6f 72 74 68 61 6e  llowing shorthan
11790 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 41 47 47 53 54  d:.**.**   AGGST
117a0 45 50 3a 20 20 20 20 69 6e 76 6f 6b 65 20 74 68  EP:    invoke th
117b0 65 20 61 67 67 72 65 67 61 74 65 20 78 53 74 65  e aggregate xSte
117c0 70 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  p() function for
117d0 20 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e   each window fun
117e0 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20  ction.**        
117f0 20 20 20 20 20 20 20 77 69 74 68 20 61 72 67 75         with argu
11800 6d 65 6e 74 73 20 72 65 61 64 20 66 72 6f 6d 20  ments read from 
11810 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
11820 6f 66 20 63 75 72 73 6f 72 20 63 73 72 45 6e 64  of cursor csrEnd
11830 2c 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20  , then.**       
11840 20 20 20 20 20 20 20 20 73 74 65 70 20 63 75 72          step cur
11850 73 6f 72 20 63 73 72 45 6e 64 20 66 6f 72 77 61  sor csrEnd forwa
11860 72 64 20 6f 6e 65 20 72 6f 77 20 28 69 2e 65 2e  rd one row (i.e.
11870 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
11880 74 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 52 45  t())..**.**   RE
11890 54 55 52 4e 5f 52 4f 57 3a 20 72 65 74 75 72 6e  TURN_ROW: return
118a0 20 61 20 72 6f 77 20 74 6f 20 74 68 65 20 63 61   a row to the ca
118b0 6c 6c 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68  ller based on th
118c0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
118d0 65 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  e .**           
118e0 20 20 20 20 63 75 72 72 65 6e 74 20 72 6f 77 20      current row 
118f0 6f 66 20 63 73 72 43 75 72 72 65 6e 74 20 61 6e  of csrCurrent an
11900 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  d the current st
11910 61 74 65 20 6f 66 20 61 6c 6c 20 0a 2a 2a 20 20  ate of all .**  
11920 20 20 20 20 20 20 20 20 20 20 20 20 20 61 67 67               agg
11930 72 65 67 61 74 65 73 2e 20 54 68 65 6e 20 73 74  regates. Then st
11940 65 70 20 63 75 72 73 6f 72 20 63 73 72 43 75 72  ep cursor csrCur
11950 72 65 6e 74 20 66 6f 72 77 61 72 64 20 6f 6e 65  rent forward one
11960 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 41 47   row..**.**   AG
11970 47 49 4e 56 45 52 53 45 3a 20 69 6e 76 6f 6b 65  GINVERSE: invoke
11980 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 78   the aggregate x
11990 49 6e 76 65 72 73 65 28 29 20 66 75 6e 63 74 69  Inverse() functi
119a0 6f 6e 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64  on for each wind
119b0 6f 77 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ow .**          
119c0 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 73 20 77       functions w
119d0 69 74 68 20 61 72 67 75 6d 65 6e 74 73 20 72 65  ith arguments re
119e0 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72  ad from the curr
119f0 65 6e 74 20 72 6f 77 20 6f 66 20 63 75 72 73 6f  ent row of curso
11a00 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
11a10 20 20 20 63 73 72 53 74 61 72 74 2e 20 54 68 65     csrStart. The
11a20 6e 20 73 74 65 70 20 63 73 72 53 74 61 72 74 20  n step csrStart 
11a30 66 6f 72 77 61 72 64 20 6f 6e 65 20 72 6f 77 2e  forward one row.
11a40 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65  .**.** There are
11a50 20 74 77 6f 20 6f 74 68 65 72 20 52 4f 57 53 20   two other ROWS 
11a60 77 69 6e 64 6f 77 20 66 72 61 6d 65 73 20 74 68  window frames th
11a70 61 74 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73  at are handled s
11a80 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 2a 2a 20  ignificantly.** 
11a90 64 69 66 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d  differently from
11aa0 20 74 68 65 20 61 62 6f 76 65 20 2d 20 22 42 45   the above - "BE
11ab0 54 57 45 45 4e 20 3c 65 78 70 72 3e 20 50 52 45  TWEEN <expr> PRE
11ac0 43 45 44 49 4e 47 20 41 4e 44 20 3c 65 78 70 72  CEDING AND <expr
11ad0 3e 20 50 52 45 43 45 44 49 4e 47 22 0a 2a 2a 20  > PRECEDING".** 
11ae0 61 6e 64 20 22 42 45 54 57 45 45 4e 20 3c 65 78  and "BETWEEN <ex
11af0 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e  pr> FOLLOWING AN
11b00 44 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49  D <expr> FOLLOWI
11b10 4e 47 22 2e 20 54 68 65 73 65 20 61 72 65 20 73  NG". These are s
11b20 70 65 63 69 61 6c 20 0a 2a 2a 20 63 61 73 65 73  pecial .** cases
11b30 20 62 65 63 61 75 73 65 20 74 68 65 79 20 63 68   because they ch
11b40 61 6e 67 65 20 74 68 65 20 6f 72 64 65 72 20 69  ange the order i
11b50 6e 20 77 68 69 63 68 20 74 68 65 20 74 68 72 65  n which the thre
11b60 65 20 63 75 72 73 6f 72 73 20 28 63 73 72 53 74  e cursors (csrSt
11b70 61 72 74 2c 0a 2a 2a 20 63 73 72 43 75 72 72 65  art,.** csrCurre
11b80 6e 74 20 61 6e 64 20 63 73 72 45 6e 64 29 20 69  nt and csrEnd) i
11b90 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
11ba0 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  he ephemeral tab
11bb0 6c 65 2e 20 43 61 73 65 73 20 74 68 61 74 0a 2a  le. Cases that.*
11bc0 2a 20 75 73 65 20 55 4e 42 4f 55 4e 44 45 44 20  * use UNBOUNDED 
11bd0 6f 72 20 43 55 52 52 45 4e 54 20 52 4f 57 20 61  or CURRENT ROW a
11be0 72 65 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20  re much simpler 
11bf0 76 61 72 69 61 74 69 6f 6e 73 20 6f 6e 20 6f 6e  variations on on
11c00 65 20 6f 66 20 74 68 65 73 65 0a 2a 2a 20 74 68  e of these.** th
11c10 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57  ree..**.**   ROW
11c20 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31  S BETWEEN <expr1
11c30 3e 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20  > PRECEDING AND 
11c40 3c 65 78 70 72 32 3e 20 50 52 45 43 45 44 49 4e  <expr2> PRECEDIN
11c50 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20  G.**.**     ... 
11c60 6c 6f 6f 70 20 73 74 61 72 74 65 64 20 62 79 20  loop started by 
11c70 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
11c80 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20  n() ....**      
11c90 20 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69   if( new partiti
11ca0 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  on ){.**        
11cb0 20 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20   Gosub flush.** 
11cc0 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20        }.**      
11cd0 20 49 6e 73 65 72 74 20 6e 65 77 20 72 6f 77 20   Insert new row 
11ce0 69 6e 74 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a  into eph table..
11cf0 2a 2a 20 20 20 20 20 20 20 69 66 28 20 66 69 72  **       if( fir
11d00 73 74 20 72 6f 77 20 6f 66 20 70 61 72 74 69 74  st row of partit
11d10 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  ion ){.**       
11d20 20 20 52 65 77 69 6e 64 28 63 73 72 45 6e 64 29    Rewind(csrEnd)
11d30 20 3b 20 52 65 77 69 6e 64 28 63 73 72 53 74 61   ; Rewind(csrSta
11d40 72 74 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72  rt) ; Rewind(csr
11d50 43 75 72 72 65 6e 74 29 0a 2a 2a 20 20 20 20 20  Current).**     
11d60 20 20 20 20 72 65 67 45 6e 64 20 3d 20 3c 65 78      regEnd = <ex
11d70 70 72 32 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20  pr2>.**         
11d80 72 65 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72  regStart = <expr
11d90 31 3e 0a 2a 2a 20 20 20 20 20 20 20 7d 65 6c 73  1>.**       }els
11da0 65 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 66  e{.**         if
11db0 28 20 28 72 65 67 45 6e 64 2d 2d 29 3c 3d 30 20  ( (regEnd--)<=0 
11dc0 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ){.**           
11dd0 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 20  AGGSTEP.**      
11de0 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20     }.**         
11df0 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20  RETURN_ROW.**   
11e00 20 20 20 20 20 20 69 66 28 20 28 72 65 67 53 74        if( (regSt
11e10 61 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20  art--)<=0 ){.** 
11e20 20 20 20 20 20 20 20 20 20 20 41 47 47 49 4e 56            AGGINV
11e30 45 52 53 45 0a 2a 2a 20 20 20 20 20 20 20 20 20  ERSE.**         
11e40 7d 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20  }.**       }.** 
11e50 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 66 6c 75      }.**     flu
11e60 73 68 3a 0a 2a 2a 20 20 20 20 20 20 20 69 66 28  sh:.**       if(
11e70 20 28 72 65 67 45 6e 64 2d 2d 29 3c 3d 30 20 29   (regEnd--)<=0 )
11e80 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 47 47  {.**         AGG
11e90 53 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 7d 0a  STEP.**       }.
11ea0 2a 2a 20 20 20 20 20 20 20 52 45 54 55 52 4e 5f  **       RETURN_
11eb0 52 4f 57 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 52  ROW.**.**.**   R
11ec0 4f 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70  OWS BETWEEN <exp
11ed0 72 31 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e  r1> FOLLOWING AN
11ee0 44 20 3c 65 78 70 72 32 3e 20 46 4f 4c 4c 4f 57  D <expr2> FOLLOW
11ef0 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e  ING.**.**     ..
11f00 2e 20 6c 6f 6f 70 20 73 74 61 72 74 65 64 20 62  . loop started b
11f10 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
11f20 67 69 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20  gin() ....**    
11f30 20 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69   if( new partiti
11f40 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 47  on ){.**       G
11f50 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20 20  osub flush.**   
11f60 20 20 7d 0a 2a 2a 20 20 20 20 20 49 6e 73 65 72    }.**     Inser
11f70 74 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20 65  t new row into e
11f80 70 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20  ph table..**    
11f90 20 69 66 28 20 66 69 72 73 74 20 72 6f 77 20 6f   if( first row o
11fa0 66 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a  f partition ){.*
11fb0 2a 20 20 20 20 20 20 20 52 65 77 69 6e 64 28 63  *       Rewind(c
11fc0 73 72 45 6e 64 29 20 3b 20 52 65 77 69 6e 64 28  srEnd) ; Rewind(
11fd0 63 73 72 53 74 61 72 74 29 20 3b 20 52 65 77 69  csrStart) ; Rewi
11fe0 6e 64 28 63 73 72 43 75 72 72 65 6e 74 29 0a 2a  nd(csrCurrent).*
11ff0 2a 20 20 20 20 20 20 20 72 65 67 45 6e 64 20 3d  *       regEnd =
12000 20 3c 65 78 70 72 32 3e 0a 2a 2a 20 20 20 20 20   <expr2>.**     
12010 20 20 72 65 67 53 74 61 72 74 20 3d 20 72 65 67    regStart = reg
12020 45 6e 64 20 2d 20 3c 65 78 70 72 31 3e 0a 2a 2a  End - <expr1>.**
12030 20 20 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20       }else{.**  
12040 20 20 20 20 20 41 47 47 53 54 45 50 0a 2a 2a 20       AGGSTEP.** 
12050 20 20 20 20 20 20 69 66 28 20 28 72 65 67 45 6e        if( (regEn
12060 64 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20  d--)<=0 ){.**   
12070 20 20 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57        RETURN_ROW
12080 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  .**       }.**  
12090 20 20 20 20 20 69 66 28 20 28 72 65 67 53 74 61       if( (regSta
120a0 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20  rt--)<=0 ){.**  
120b0 20 20 20 20 20 20 20 41 47 47 49 4e 56 45 52 53         AGGINVERS
120c0 45 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20  E.**       }.** 
120d0 20 20 20 20 7d 0a 2a 2a 20 20 20 7d 0a 2a 2a 20      }.**   }.** 
120e0 20 20 66 6c 75 73 68 3a 0a 2a 2a 20 20 20 20 20    flush:.**     
120f0 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 77  AGGSTEP.**     w
12100 68 69 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20  hile( 1 ){.**   
12110 20 20 20 20 69 66 28 20 28 72 65 67 45 6e 64 2d      if( (regEnd-
12120 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20  -)<=0 ){.**     
12130 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a      RETURN_ROW.*
12140 2a 20 20 20 20 20 20 20 20 20 69 66 28 20 65 6f  *         if( eo
12150 66 20 29 20 62 72 65 61 6b 3b 0a 2a 2a 20 20 20  f ) break;.**   
12160 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 69      }.**       i
12170 66 28 20 28 72 65 67 53 74 61 72 74 2d 2d 29 3c  f( (regStart--)<
12180 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  =0 ){.**        
12190 20 41 47 47 49 4e 56 45 52 53 45 0a 2a 2a 20 20   AGGINVERSE.**  
121a0 20 20 20 20 20 20 20 69 66 28 20 65 6f 66 20 29         if( eof )
121b0 20 62 72 65 61 6b 0a 2a 2a 20 20 20 20 20 20 20   break.**       
121c0 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20  }.**     }.**   
121d0 20 20 77 68 69 6c 65 28 20 21 65 6f 66 20 63 73    while( !eof cs
121e0 72 43 75 72 72 65 6e 74 20 29 7b 0a 2a 2a 20 20  rCurrent ){.**  
121f0 20 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a       RETURN_ROW.
12200 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 46  **     }.**.** F
12210 6f 72 20 74 68 65 20 6d 6f 73 74 20 70 61 72 74  or the most part
12220 2c 20 74 68 65 20 70 61 74 74 65 72 6e 73 20 61  , the patterns a
12230 62 6f 76 65 20 61 72 65 20 61 64 61 70 74 65 64  bove are adapted
12240 20 74 6f 20 73 75 70 70 6f 72 74 20 55 4e 42 4f   to support UNBO
12250 55 4e 44 45 44 20 62 79 0a 2a 2a 20 61 73 73 75  UNDED by.** assu
12260 6d 69 6e 67 20 74 68 61 74 20 69 74 20 69 73 20  ming that it is 
12270 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 22 69  equivalent to "i
12280 6e 66 69 6e 69 74 79 20 50 52 45 43 45 44 49 4e  nfinity PRECEDIN
12290 47 2f 46 4f 4c 4c 4f 57 49 4e 47 22 20 61 6e 64  G/FOLLOWING" and
122a0 0a 2a 2a 20 43 55 52 52 45 4e 54 20 52 4f 57 20  .** CURRENT ROW 
122b0 62 79 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  by assuming that
122c0 20 69 74 20 69 73 20 65 71 75 69 76 69 6c 65 6e   it is equivilen
122d0 74 20 74 6f 20 22 30 20 50 52 45 43 45 44 49 4e  t to "0 PRECEDIN
122e0 47 2f 46 4f 4c 4c 4f 57 49 4e 47 22 2e 0a 2a 2a  G/FOLLOWING"..**
122f0 20 54 68 69 73 20 69 73 20 6f 70 74 69 6d 69 7a   This is optimiz
12300 65 64 20 6f 66 20 63 6f 75 72 73 65 20 2d 20 62  ed of course - b
12310 72 61 6e 63 68 65 73 20 74 68 61 74 20 77 69 6c  ranches that wil
12320 6c 20 6e 65 76 65 72 20 62 65 20 74 61 6b 65 6e  l never be taken
12330 20 61 6e 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f   and.** conditio
12340 6e 73 20 74 68 61 74 20 61 72 65 20 61 6c 77 61  ns that are alwa
12350 79 73 20 74 72 75 65 20 61 72 65 20 6f 6d 69 74  ys true are omit
12360 74 65 64 20 66 72 6f 6d 20 74 68 65 20 56 4d 20  ted from the VM 
12370 63 6f 64 65 2e 20 54 68 65 20 6f 6e 6c 79 0a 2a  code. The only.*
12380 2a 20 65 78 63 65 70 74 69 6f 6e 61 6c 20 63 61  * exceptional ca
12390 73 65 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 52  se is:.**.**   R
123a0 4f 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70  OWS BETWEEN <exp
123b0 72 31 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e  r1> FOLLOWING AN
123c0 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c  D UNBOUNDED FOLL
123d0 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20  OWING.**.**     
123e0 2e 2e 2e 20 6c 6f 6f 70 20 73 74 61 72 74 65 64  ... loop started
123f0 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
12400 42 65 67 69 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20  Begin() ....**  
12410 20 20 20 69 66 28 20 6e 65 77 20 70 61 72 74 69     if( new parti
12420 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20  tion ){.**      
12430 20 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20   Gosub flush.** 
12440 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 49 6e 73      }.**     Ins
12450 65 72 74 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f  ert new row into
12460 20 65 70 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20   eph table..**  
12470 20 20 20 69 66 28 20 66 69 72 73 74 20 72 6f 77     if( first row
12480 20 6f 66 20 70 61 72 74 69 74 69 6f 6e 20 29 7b   of partition ){
12490 0a 2a 2a 20 20 20 20 20 20 20 52 65 77 69 6e 64  .**       Rewind
124a0 28 63 73 72 45 6e 64 29 20 3b 20 52 65 77 69 6e  (csrEnd) ; Rewin
124b0 64 28 63 73 72 53 74 61 72 74 29 20 3b 20 52 65  d(csrStart) ; Re
124c0 77 69 6e 64 28 63 73 72 43 75 72 72 65 6e 74 29  wind(csrCurrent)
124d0 0a 2a 2a 20 20 20 20 20 20 20 72 65 67 53 74 61  .**       regSta
124e0 72 74 20 3d 20 3c 65 78 70 72 31 3e 0a 2a 2a 20  rt = <expr1>.** 
124f0 20 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20      }else{.**   
12500 20 20 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20      AGGSTEP.**  
12510 20 20 20 7d 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20     }.**   }.**  
12520 20 66 6c 75 73 68 3a 0a 2a 2a 20 20 20 20 20 41   flush:.**     A
12530 47 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 77 68  GGSTEP.**     wh
12540 69 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20  ile( 1 ){.**    
12550 20 20 20 69 66 28 20 28 72 65 67 53 74 61 72 74     if( (regStart
12560 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20  --)<=0 ){.**    
12570 20 20 20 20 20 41 47 47 49 4e 56 45 52 53 45 0a       AGGINVERSE.
12580 2a 2a 20 20 20 20 20 20 20 20 20 69 66 28 20 65  **         if( e
12590 6f 66 20 29 20 62 72 65 61 6b 0a 2a 2a 20 20 20  of ) break.**   
125a0 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 52      }.**       R
125b0 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20  ETURN_ROW.**    
125c0 20 7d 0a 2a 2a 20 20 20 20 20 77 68 69 6c 65 28   }.**     while(
125d0 20 21 65 6f 66 20 63 73 72 43 75 72 72 65 6e 74   !eof csrCurrent
125e0 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 52 45 54   ){.**       RET
125f0 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 7d  URN_ROW.**     }
12600 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 71 75  .**.** Also requ
12610 69 72 69 6e 67 20 73 70 65 63 69 61 6c 20 68 61  iring special ha
12620 6e 64 6c 69 6e 67 20 61 72 65 20 74 68 65 20 63  ndling are the c
12630 61 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 4f  ases:.**.**   RO
12640 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72  WS BETWEEN <expr
12650 31 3e 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44  1> PRECEDING AND
12660 20 3c 65 78 70 72 32 3e 20 50 52 45 43 45 44 49   <expr2> PRECEDI
12670 4e 47 0a 2a 2a 20 20 20 52 4f 57 53 20 42 45 54  NG.**   ROWS BET
12680 57 45 45 4e 20 3c 65 78 70 72 31 3e 20 46 4f 4c  WEEN <expr1> FOL
12690 4c 4f 57 49 4e 47 20 41 4e 44 20 3c 65 78 70 72  LOWING AND <expr
126a0 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a  2> FOLLOWING.**.
126b0 2a 2a 20 77 68 65 6e 20 28 65 78 70 72 31 20 3c  ** when (expr1 <
126c0 20 65 78 70 72 32 29 2e 20 54 68 69 73 20 69 73   expr2). This is
126d0 20 64 65 74 65 63 74 65 64 20 61 74 20 72 75 6e   detected at run
126e0 74 69 6d 65 2c 20 6e 6f 74 20 62 79 20 74 68 69  time, not by thi
126f0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 54  s function..** T
12700 6f 20 68 61 6e 64 6c 65 20 74 68 69 73 20 63 61  o handle this ca
12710 73 65 2c 20 74 68 65 20 70 73 65 75 64 6f 2d 63  se, the pseudo-c
12720 6f 64 65 20 70 72 6f 67 72 61 6d 73 20 64 65 70  ode programs dep
12730 69 63 74 65 64 20 61 62 6f 76 65 20 61 72 65 20  icted above are 
12740 6d 6f 64 69 66 69 65 64 0a 2a 2a 20 73 6c 69 67  modified.** slig
12750 68 74 6c 79 20 74 6f 20 62 65 3a 0a 2a 2a 0a 2a  htly to be:.**.*
12760 2a 20 20 20 20 20 2e 2e 2e 20 6c 6f 6f 70 20 73  *     ... loop s
12770 74 61 72 74 65 64 20 62 79 20 73 71 6c 69 74 65  tarted by sqlite
12780 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2e 2e  3WhereBegin() ..
12790 2e 0a 2a 2a 20 20 20 20 20 69 66 28 20 6e 65 77  ..**     if( new
127a0 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a   partition ){.**
127b0 20 20 20 20 20 20 20 47 6f 73 75 62 20 66 6c 75         Gosub flu
127c0 73 68 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20  sh.**     }.**  
127d0 20 20 20 49 6e 73 65 72 74 20 6e 65 77 20 72 6f     Insert new ro
127e0 77 20 69 6e 74 6f 20 65 70 68 20 74 61 62 6c 65  w into eph table
127f0 2e 0a 2a 2a 20 20 20 20 20 69 66 28 20 66 69 72  ..**     if( fir
12800 73 74 20 72 6f 77 20 6f 66 20 70 61 72 74 69 74  st row of partit
12810 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  ion ){.**       
12820 52 65 77 69 6e 64 28 63 73 72 45 6e 64 29 20 3b  Rewind(csrEnd) ;
12830 20 52 65 77 69 6e 64 28 63 73 72 53 74 61 72 74   Rewind(csrStart
12840 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72 43 75  ) ; Rewind(csrCu
12850 72 72 65 6e 74 29 0a 2a 2a 20 20 20 20 20 20 20  rrent).**       
12860 72 65 67 45 6e 64 20 3d 20 3c 65 78 70 72 32 3e  regEnd = <expr2>
12870 0a 2a 2a 20 20 20 20 20 20 20 72 65 67 53 74 61  .**       regSta
12880 72 74 20 3d 20 3c 65 78 70 72 31 3e 0a 2a 2a 20  rt = <expr1>.** 
12890 20 20 20 20 20 20 69 66 28 20 72 65 67 45 6e 64        if( regEnd
128a0 20 3c 20 72 65 67 53 74 61 72 74 20 29 7b 0a 2a   < regStart ){.*
128b0 2a 20 20 20 20 20 20 20 20 20 52 45 54 55 52 4e  *         RETURN
128c0 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 20 20 20 20  _ROW.**         
128d0 64 65 6c 65 74 65 20 65 70 68 20 74 61 62 6c 65  delete eph table
128e0 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 20 20 20   contents.**    
128f0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a       continue.**
12900 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
12910 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  ....**.** The ne
12920 77 20 22 63 6f 6e 74 69 6e 75 65 22 20 73 74 61  w "continue" sta
12930 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 61 62  tement in the ab
12940 6f 76 65 20 6a 75 6d 70 73 20 74 6f 20 74 68 65  ove jumps to the
12950 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 0a   next iteration.
12960 2a 2a 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  ** of the outer 
12970 6c 6f 6f 70 20 2d 20 74 68 65 20 6f 6e 65 20 73  loop - the one s
12980 74 61 72 74 65 64 20 62 79 20 73 71 6c 69 74 65  tarted by sqlite
12990 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e 0a 2a  3WhereBegin()..*
129a0 2a 0a 2a 2a 20 54 68 65 20 76 61 72 69 6f 75 73  *.** The various
129b0 20 47 52 4f 55 50 53 20 63 61 73 65 73 20 61 72   GROUPS cases ar
129c0 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73  e implemented us
129d0 69 6e 67 20 74 68 65 20 73 61 6d 65 20 70 61 74  ing the same pat
129e0 74 65 72 6e 73 20 61 73 0a 2a 2a 20 52 4f 57 53  terns as.** ROWS
129f0 2e 20 54 68 65 20 56 4d 20 63 6f 64 65 20 69 73  . The VM code is
12a00 20 6d 6f 64 69 66 69 65 64 20 73 6c 69 67 68 74   modified slight
12a10 6c 79 20 73 6f 20 74 68 61 74 3a 0a 2a 2a 0a 2a  ly so that:.**.*
12a20 2a 20 20 20 31 2e 20 54 68 65 20 65 6c 73 65 20  *   1. The else 
12a30 62 72 61 6e 63 68 20 69 6e 20 74 68 65 20 6d 61  branch in the ma
12a40 69 6e 20 6c 6f 6f 70 20 69 73 20 6f 6e 6c 79 20  in loop is only 
12a50 74 61 6b 65 6e 20 69 66 20 74 68 65 20 72 6f 77  taken if the row
12a60 20 6a 75 73 74 0a 2a 2a 20 20 20 20 20 20 61 64   just.**      ad
12a70 64 65 64 20 74 6f 20 74 68 65 20 65 70 68 65 6d  ded to the ephem
12a80 65 72 61 6c 20 74 61 62 6c 65 20 69 73 20 74 68  eral table is th
12a90 65 20 73 74 61 72 74 20 6f 66 20 61 20 6e 65 77  e start of a new
12aa0 20 67 72 6f 75 70 2e 20 49 6e 0a 2a 2a 20 20 20   group. In.**   
12ab0 20 20 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20     other words, 
12ac0 69 74 20 62 65 63 6f 6d 65 73 3a 0a 2a 2a 0a 2a  it becomes:.**.*
12ad0 2a 20 20 20 20 20 20 20 20 20 2e 2e 2e 20 6c 6f  *         ... lo
12ae0 6f 70 20 73 74 61 72 74 65 64 20 62 79 20 73 71  op started by sq
12af0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
12b00 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20  ) ....**        
12b10 20 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69   if( new partiti
12b20 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  on ){.**        
12b30 20 20 20 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a     Gosub flush.*
12b40 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  *         }.**  
12b50 20 20 20 20 20 20 20 49 6e 73 65 72 74 20 6e 65         Insert ne
12b60 77 20 72 6f 77 20 69 6e 74 6f 20 65 70 68 20 74  w row into eph t
12b70 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20  able..**        
12b80 20 69 66 28 20 66 69 72 73 74 20 72 6f 77 20 6f   if( first row o
12b90 66 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a  f partition ){.*
12ba0 2a 20 20 20 20 20 20 20 20 20 20 20 52 65 77 69  *           Rewi
12bb0 6e 64 28 63 73 72 45 6e 64 29 20 3b 20 52 65 77  nd(csrEnd) ; Rew
12bc0 69 6e 64 28 63 73 72 53 74 61 72 74 29 20 3b 20  ind(csrStart) ; 
12bd0 52 65 77 69 6e 64 28 63 73 72 43 75 72 72 65 6e  Rewind(csrCurren
12be0 74 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  t).**           
12bf0 72 65 67 45 6e 64 20 3d 20 3c 65 78 70 72 32 3e  regEnd = <expr2>
12c00 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 72 65  .**           re
12c10 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72 31 3e  gStart = <expr1>
12c20 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 65 6c 73  .**         }els
12c30 65 20 69 66 28 20 6e 65 77 20 67 72 6f 75 70 20  e if( new group 
12c40 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ){.**           
12c50 2e 2e 2e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ... .**         
12c60 7d 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 0a  }.**       }.**.
12c70 2a 2a 20 20 20 32 2e 20 49 6e 73 74 65 61 64 20  **   2. Instead 
12c80 6f 66 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20  of processing a 
12c90 73 69 6e 67 6c 65 20 72 6f 77 2c 20 65 61 63 68  single row, each
12ca0 20 52 45 54 55 52 4e 5f 52 4f 57 2c 20 41 47 47   RETURN_ROW, AGG
12cb0 53 54 45 50 20 6f 72 20 0a 2a 2a 20 20 20 20 20  STEP or .**     
12cc0 20 41 47 47 49 4e 56 45 52 53 45 20 73 74 65 70   AGGINVERSE step
12cd0 20 70 72 6f 63 65 73 73 65 73 20 74 68 65 20 63   processes the c
12ce0 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68  urrent row of th
12cf0 65 20 72 65 6c 65 76 61 6e 74 20 63 75 72 73 6f  e relevant curso
12d00 72 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 61 6c  r and.**      al
12d10 6c 20 73 75 62 73 65 71 75 65 6e 74 20 72 6f 77  l subsequent row
12d20 73 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74  s belonging to t
12d30 68 65 20 73 61 6d 65 20 67 72 6f 75 70 2e 0a 2a  he same group..*
12d40 2a 0a 2a 2a 20 52 41 4e 47 45 20 77 69 6e 64 6f  *.** RANGE windo
12d50 77 20 66 72 61 6d 65 73 20 61 72 65 20 61 20 6c  w frames are a l
12d60 69 74 74 6c 65 20 64 69 66 66 65 72 65 6e 74 20  ittle different 
12d70 61 67 61 69 6e 2e 20 41 73 20 66 6f 72 20 47 52  again. As for GR
12d80 4f 55 50 53 2c 20 74 68 65 20 0a 2a 2a 20 6d 61  OUPS, the .** ma
12d90 69 6e 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63  in loop runs onc
12da0 65 20 70 65 72 20 67 72 6f 75 70 20 6f 6e 6c 79  e per group only
12db0 2e 20 41 6e 64 20 52 45 54 55 52 4e 5f 52 4f 57  . And RETURN_ROW
12dc0 2c 20 41 47 47 53 54 45 50 20 61 6e 64 20 41 47  , AGGSTEP and AG
12dd0 47 49 4e 56 45 52 53 45 0a 2a 2a 20 64 65 61 6c  GINVERSE.** deal
12de0 20 69 6e 20 67 72 6f 75 70 73 20 69 6e 73 74 65   in groups inste
12df0 61 64 20 6f 66 20 72 6f 77 73 2e 20 41 73 20 66  ad of rows. As f
12e00 6f 72 20 52 4f 57 53 20 61 6e 64 20 47 52 4f 55  or ROWS and GROU
12e10 50 53 2c 20 74 68 65 72 65 20 61 72 65 20 74 68  PS, there are th
12e20 72 65 65 0a 2a 2a 20 62 61 73 69 63 20 63 61 73  ree.** basic cas
12e30 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e 47  es:.**.**   RANG
12e40 45 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31  E BETWEEN <expr1
12e50 3e 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20  > PRECEDING AND 
12e60 3c 65 78 70 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e  <expr2> FOLLOWIN
12e70 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20  G.**.**     ... 
12e80 6c 6f 6f 70 20 73 74 61 72 74 65 64 20 62 79 20  loop started by 
12e90 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
12ea0 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20  n() ....**      
12eb0 20 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69   if( new partiti
12ec0 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  on ){.**        
12ed0 20 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20   Gosub flush.** 
12ee0 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20        }.**      
12ef0 20 49 6e 73 65 72 74 20 6e 65 77 20 72 6f 77 20   Insert new row 
12f00 69 6e 74 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a  into eph table..
12f10 2a 2a 20 20 20 20 20 20 20 69 66 28 20 66 69 72  **       if( fir
12f20 73 74 20 72 6f 77 20 6f 66 20 70 61 72 74 69 74  st row of partit
12f30 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  ion ){.**       
12f40 20 20 52 65 77 69 6e 64 28 63 73 72 45 6e 64 29    Rewind(csrEnd)
12f50 20 3b 20 52 65 77 69 6e 64 28 63 73 72 53 74 61   ; Rewind(csrSta
12f60 72 74 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72  rt) ; Rewind(csr
12f70 43 75 72 72 65 6e 74 29 0a 2a 2a 20 20 20 20 20  Current).**     
12f80 20 20 20 20 72 65 67 45 6e 64 20 3d 20 3c 65 78      regEnd = <ex
12f90 70 72 32 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20  pr2>.**         
12fa0 72 65 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72  regStart = <expr
12fb0 31 3e 0a 2a 2a 20 20 20 20 20 20 20 7d 65 6c 73  1>.**       }els
12fc0 65 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 47  e{.**         AG
12fd0 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 20  GSTEP.**        
12fe0 20 77 68 69 6c 65 28 20 28 63 73 72 43 75 72 72   while( (csrCurr
12ff0 65 6e 74 2e 6b 65 79 20 2b 20 72 65 67 45 6e 64  ent.key + regEnd
13000 29 20 3c 20 63 73 72 45 6e 64 2e 6b 65 79 20 29  ) < csrEnd.key )
13010 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 52  {.**           R
13020 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20  ETURN_ROW.**    
13030 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 63 73         while( cs
13040 72 53 74 61 72 74 2e 6b 65 79 20 2b 20 72 65 67  rStart.key + reg
13050 53 74 61 72 74 29 20 3c 20 63 73 72 43 75 72 72  Start) < csrCurr
13060 65 6e 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20  ent.key ){.**   
13070 20 20 20 20 20 20 20 20 20 20 41 47 47 49 4e 56            AGGINV
13080 45 52 53 45 0a 2a 2a 20 20 20 20 20 20 20 20 20  ERSE.**         
13090 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d    }.**         }
130a0 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  .**       }.**  
130b0 20 20 20 7d 0a 2a 2a 20 20 20 20 20 66 6c 75 73     }.**     flus
130c0 68 3a 0a 2a 2a 20 20 20 20 20 20 20 41 47 47 53  h:.**       AGGS
130d0 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 77 68 69  TEP.**       whi
130e0 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20  le( 1 ){.**     
130f0 20 20 20 20 52 45 54 55 52 4e 20 52 4f 57 0a 2a      RETURN ROW.*
13100 2a 20 20 20 20 20 20 20 20 20 69 66 28 20 63 73  *         if( cs
13110 72 43 75 72 72 65 6e 74 20 69 73 20 45 4f 46 20  rCurrent is EOF 
13120 29 20 62 72 65 61 6b 3b 0a 2a 2a 20 20 20 20 20  ) break;.**     
13130 20 20 20 20 20 20 77 68 69 6c 65 28 20 63 73 72        while( csr
13140 53 74 61 72 74 2e 6b 65 79 20 2b 20 72 65 67 53  Start.key + regS
13150 74 61 72 74 29 20 3c 20 63 73 72 43 75 72 72 65  tart) < csrCurre
13160 6e 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20  nt.key ){.**    
13170 20 20 20 20 20 20 20 20 20 41 47 47 49 4e 56 45           AGGINVE
13180 52 53 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  RSE.**          
13190 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a   }.**         }.
131a0 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a  **       }.**.**
131b0 20 49 6e 20 74 68 65 20 61 62 6f 76 65 20 6e 6f   In the above no
131c0 74 61 74 69 6f 6e 2c 20 22 63 73 72 2e 6b 65 79  tation, "csr.key
131d0 22 20 6d 65 61 6e 73 20 74 68 65 20 63 75 72 72  " means the curr
131e0 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65  ent value of the
131f0 20 4f 52 44 45 52 20 42 59 20 0a 2a 2a 20 65 78   ORDER BY .** ex
13200 70 72 65 73 73 69 6f 6e 20 28 74 68 65 72 65 20  pression (there 
13210 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 31 20 66  is only ever 1 f
13220 6f 72 20 61 20 52 41 4e 47 45 20 74 68 61 74 20  or a RANGE that 
13230 75 73 65 73 20 61 6e 20 3c 65 78 70 72 3e 20 46  uses an <expr> F
13240 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 20 6f 72 20 3c  OLLOWING.** or <
13250 65 78 70 72 20 50 52 45 43 45 44 49 4e 47 29 20  expr PRECEDING) 
13260 72 65 61 64 20 66 72 6f 6d 20 63 75 72 73 6f 72  read from cursor
13270 20 63 73 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 52 41   csr..**.**   RA
13280 4e 47 45 20 42 45 54 57 45 45 4e 20 3c 65 78 70  NGE BETWEEN <exp
13290 72 31 3e 20 50 52 45 43 45 44 49 4e 47 20 41 4e  r1> PRECEDING AN
132a0 44 20 3c 65 78 70 72 32 3e 20 50 52 45 43 45 44  D <expr2> PRECED
132b0 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e  ING.**.**     ..
132c0 2e 20 6c 6f 6f 70 20 73 74 61 72 74 65 64 20 62  . loop started b
132d0 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
132e0 67 69 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20  gin() ....**    
132f0 20 20 20 69 66 28 20 6e 65 77 20 70 61 72 74 69     if( new parti
13300 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20  tion ){.**      
13310 20 20 20 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a     Gosub flush.*
13320 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  *       }.**    
13330 20 20 20 49 6e 73 65 72 74 20 6e 65 77 20 72 6f     Insert new ro
13340 77 20 69 6e 74 6f 20 65 70 68 20 74 61 62 6c 65  w into eph table
13350 2e 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 66  ..**       if( f
13360 69 72 73 74 20 72 6f 77 20 6f 66 20 70 61 72 74  irst row of part
13370 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20  ition ){.**     
13380 20 20 20 20 52 65 77 69 6e 64 28 63 73 72 45 6e      Rewind(csrEn
13390 64 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72 53  d) ; Rewind(csrS
133a0 74 61 72 74 29 20 3b 20 52 65 77 69 6e 64 28 63  tart) ; Rewind(c
133b0 73 72 43 75 72 72 65 6e 74 29 0a 2a 2a 20 20 20  srCurrent).**   
133c0 20 20 20 20 20 20 72 65 67 45 6e 64 20 3d 20 3c        regEnd = <
133d0 65 78 70 72 32 3e 0a 2a 2a 20 20 20 20 20 20 20  expr2>.**       
133e0 20 20 72 65 67 53 74 61 72 74 20 3d 20 3c 65 78    regStart = <ex
133f0 70 72 31 3e 0a 2a 2a 20 20 20 20 20 20 20 7d 65  pr1>.**       }e
13400 6c 73 65 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  lse{.**         
13410 69 66 28 20 28 63 73 72 45 6e 64 2e 6b 65 79 20  if( (csrEnd.key 
13420 2b 20 72 65 67 45 6e 64 29 20 3c 3d 20 63 73 72  + regEnd) <= csr
13430 43 75 72 72 65 6e 74 2e 6b 65 79 20 29 7b 0a 2a  Current.key ){.*
13440 2a 20 20 20 20 20 20 20 20 20 20 20 41 47 47 53  *           AGGS
13450 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d  TEP.**         }
13460 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 68 69 6c  .**         whil
13470 65 28 20 28 63 73 72 53 74 61 72 74 2e 6b 65 79  e( (csrStart.key
13480 20 2b 20 72 65 67 53 74 61 72 74 29 20 3c 20 63   + regStart) < c
13490 73 72 43 75 72 72 65 6e 74 2e 6b 65 79 20 29 7b  srCurrent.key ){
134a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 47  .**           AG
134b0 47 49 4e 56 45 52 53 45 0a 2a 2a 20 20 20 20 20  GINVERSE.**     
134c0 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20      }.**        
134d0 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20   RETURN_ROW.**  
134e0 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a       }.**     }.
134f0 2a 2a 20 20 20 20 20 66 6c 75 73 68 3a 0a 2a 2a  **     flush:.**
13500 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63         while( (c
13510 73 72 45 6e 64 2e 6b 65 79 20 2b 20 72 65 67 45  srEnd.key + regE
13520 6e 64 29 20 3c 3d 20 63 73 72 43 75 72 72 65 6e  nd) <= csrCurren
13530 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20 20  t.key ){.**     
13540 20 20 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20      AGGSTEP.**  
13550 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20       }.**       
13560 77 68 69 6c 65 28 20 28 63 73 72 53 74 61 72 74  while( (csrStart
13570 2e 6b 65 79 20 2b 20 72 65 67 53 74 61 72 74 29  .key + regStart)
13580 20 3c 20 63 73 72 43 75 72 72 65 6e 74 2e 6b 65   < csrCurrent.ke
13590 79 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  y ){.**         
135a0 41 47 47 49 4e 56 45 52 53 45 0a 2a 2a 20 20 20  AGGINVERSE.**   
135b0 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 52      }.**       R
135c0 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 0a 2a 2a 20  ETURN_ROW.**.** 
135d0 20 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20    RANGE BETWEEN 
135e0 3c 65 78 70 72 31 3e 20 46 4f 4c 4c 4f 57 49 4e  <expr1> FOLLOWIN
135f0 47 20 41 4e 44 20 3c 65 78 70 72 32 3e 20 46 4f  G AND <expr2> FO
13600 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20  LLOWING.**.**   
13610 20 20 2e 2e 2e 20 6c 6f 6f 70 20 73 74 61 72 74    ... loop start
13620 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  ed by sqlite3Whe
13630 72 65 42 65 67 69 6e 28 29 20 2e 2e 2e 0a 2a 2a  reBegin() ....**
13640 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 20 70         if( new p
13650 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20  artition ){.**  
13660 20 20 20 20 20 20 20 47 6f 73 75 62 20 66 6c 75         Gosub flu
13670 73 68 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a  sh.**       }.**
13680 20 20 20 20 20 20 20 49 6e 73 65 72 74 20 6e 65         Insert ne
13690 77 20 72 6f 77 20 69 6e 74 6f 20 65 70 68 20 74  w row into eph t
136a0 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 20 20 69  able..**       i
136b0 66 28 20 66 69 72 73 74 20 72 6f 77 20 6f 66 20  f( first row of 
136c0 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20  partition ){.** 
136d0 20 20 20 20 20 20 20 20 52 65 77 69 6e 64 28 63          Rewind(c
136e0 73 72 45 6e 64 29 20 3b 20 52 65 77 69 6e 64 28  srEnd) ; Rewind(
136f0 63 73 72 53 74 61 72 74 29 20 3b 20 52 65 77 69  csrStart) ; Rewi
13700 6e 64 28 63 73 72 43 75 72 72 65 6e 74 29 0a 2a  nd(csrCurrent).*
13710 2a 20 20 20 20 20 20 20 20 20 72 65 67 45 6e 64  *         regEnd
13720 20 3d 20 3c 65 78 70 72 32 3e 0a 2a 2a 20 20 20   = <expr2>.**   
13730 20 20 20 20 20 20 72 65 67 53 74 61 72 74 20 3d        regStart =
13740 20 3c 65 78 70 72 31 3e 0a 2a 2a 20 20 20 20 20   <expr1>.**     
13750 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20 20 20    }else{.**     
13760 20 20 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20      AGGSTEP.**  
13770 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63         while( (c
13780 73 72 43 75 72 72 65 6e 74 2e 6b 65 79 20 2b 20  srCurrent.key + 
13790 72 65 67 45 6e 64 29 20 3c 20 63 73 72 45 6e 64  regEnd) < csrEnd
137a0 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20 20 20  .key ){.**      
137b0 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 73 72       while( (csr
137c0 43 75 72 72 65 6e 74 2e 6b 65 79 20 2b 20 72 65  Current.key + re
137d0 67 53 74 61 72 74 29 20 3e 20 63 73 72 53 74 61  gStart) > csrSta
137e0 72 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20  rt.key ){.**    
137f0 20 20 20 20 20 20 20 20 20 41 47 47 49 4e 56 45           AGGINVE
13800 52 53 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  RSE.**          
13810 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   }.**           
13820 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20  RETURN_ROW.**   
13830 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20        }.**      
13840 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20   }.**     }.**  
13850 20 20 20 66 6c 75 73 68 3a 0a 2a 2a 20 20 20 20     flush:.**    
13860 20 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20 20     AGGSTEP.**   
13870 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a      while( 1 ){.
13880 2a 2a 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  **         while
13890 28 20 28 63 73 72 43 75 72 72 65 6e 74 2e 6b 65  ( (csrCurrent.ke
138a0 79 20 2b 20 72 65 67 53 74 61 72 74 29 20 3e 20  y + regStart) > 
138b0 63 73 72 53 74 61 72 74 2e 6b 65 79 20 29 7b 0a  csrStart.key ){.
138c0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 47 47  **           AGG
138d0 49 4e 56 45 52 53 45 0a 2a 2a 20 20 20 20 20 20  INVERSE.**      
138e0 20 20 20 20 20 69 66 28 20 65 6f 66 20 29 20 62       if( eof ) b
138f0 72 65 61 6b 20 22 77 68 69 6c 65 28 20 31 20 29  reak "while( 1 )
13900 22 20 6c 6f 6f 70 2e 0a 2a 2a 20 20 20 20 20 20  " loop..**      
13910 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20     }.**         
13920 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20  RETURN_ROW.**   
13930 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 77      }.**       w
13940 68 69 6c 65 28 20 21 65 6f 66 20 63 73 72 43 75  hile( !eof csrCu
13950 72 72 65 6e 74 20 29 7b 0a 2a 2a 20 20 20 20 20  rrent ){.**     
13960 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a      RETURN_ROW.*
13970 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20  *       }.**.** 
13980 54 68 65 20 74 65 78 74 20 61 62 6f 76 65 20 6c  The text above l
13990 65 61 76 65 73 20 6f 75 74 20 6d 61 6e 79 20 64  eaves out many d
139a0 65 74 61 69 6c 73 2e 20 52 65 66 65 72 20 74 6f  etails. Refer to
139b0 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 63 6f   the code and co
139c0 6d 6d 65 6e 74 73 0a 2a 2a 20 62 65 6c 6f 77 20  mments.** below 
139d0 66 6f 72 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c  for a more compl
139e0 65 74 65 20 70 69 63 74 75 72 65 2e 0a 2a 2f 0a  ete picture..*/.
139f0 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64  void sqlite3Wind
13a00 6f 77 43 6f 64 65 53 74 65 70 28 0a 20 20 50 61  owCodeStep(.  Pa
13a10 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
13a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13a30 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
13a40 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
13a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a60 20 20 20 20 2f 2a 20 52 65 77 72 69 74 74 65 6e      /* Rewritten
13a70 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
13a80 74 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f  t */.  WhereInfo
13a90 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 20 20 20   *pWInfo,       
13aa0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78         /* Contex
13ab0 74 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71  t returned by sq
13ac0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
13ad0 29 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 47 6f  ) */.  int regGo
13ae0 73 75 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  sub,            
13af0 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
13b00 65 72 20 66 6f 72 20 4f 50 5f 47 6f 73 75 62 20  er for OP_Gosub 
13b10 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 73  */.  int addrGos
13b20 75 62 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ub              
13b30 20 20 20 20 20 2f 2a 20 4f 50 5f 47 6f 73 75 62       /* OP_Gosub
13b40 20 68 65 72 65 20 74 6f 20 72 65 74 75 72 6e 20   here to return 
13b50 65 61 63 68 20 72 6f 77 20 2a 2f 0a 29 7b 0a 20  each row */.){. 
13b60 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d   Window *pMWin =
13b70 20 70 2d 3e 70 57 69 6e 3b 0a 20 20 45 78 70 72   p->pWin;.  Expr
13b80 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
13b90 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79   pMWin->pOrderBy
13ba0 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  ;.  Vdbe *v = sq
13bb0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
13bc0 72 73 65 29 3b 0a 20 20 69 6e 74 20 63 73 72 57  rse);.  int csrW
13bd0 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  rite;           
13be0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
13bf0 72 20 75 73 65 64 20 74 6f 20 77 72 69 74 65 20  r used to write 
13c00 74 6f 20 65 70 68 2e 20 74 61 62 6c 65 20 2a 2f  to eph. table */
13c10 0a 20 20 69 6e 74 20 63 73 72 49 6e 70 75 74 20  .  int csrInput 
13c20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  = p->pSrc->a[0].
13c30 69 43 75 72 73 6f 72 3b 20 20 20 20 20 2f 2a 20  iCursor;     /* 
13c40 43 75 72 73 6f 72 20 6f 66 20 73 75 62 2d 73 65  Cursor of sub-se
13c50 6c 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 49  lect */.  int nI
13c60 6e 70 75 74 20 3d 20 70 2d 3e 70 53 72 63 2d 3e  nput = p->pSrc->
13c70 61 5b 30 5d 2e 70 54 61 62 2d 3e 6e 43 6f 6c 3b  a[0].pTab->nCol;
13c80 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
13c90 20 63 6f 6c 73 20 72 65 74 75 72 6e 65 64 20 62   cols returned b
13ca0 79 20 73 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69  y sub */.  int i
13cb0 49 6e 70 75 74 3b 20 20 20 20 20 20 20 20 20 20  Input;          
13cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cd0 20 20 20 20 20 2f 2a 20 54 6f 20 69 74 65 72 61       /* To itera
13ce0 74 65 20 74 68 72 6f 75 67 68 20 73 75 62 20 63  te through sub c
13cf0 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ols */.  int add
13d00 72 4e 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rNe;            
13d10 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
13d20 65 73 73 20 6f 66 20 4f 50 5f 4e 65 20 2a 2f 0a  ess of OP_Ne */.
13d30 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75 62 46    int addrGosubF
13d40 6c 75 73 68 20 3d 20 30 3b 20 20 20 20 20 20 20  lush = 0;       
13d50 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
13d60 4f 50 5f 47 6f 73 75 62 20 74 6f 20 66 6c 75 73  OP_Gosub to flus
13d70 68 3a 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  h: */.  int addr
13d80 49 6e 74 65 67 65 72 20 3d 20 30 3b 20 20 20 20  Integer = 0;    
13d90 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
13da0 73 73 20 6f 66 20 4f 50 5f 49 6e 74 65 67 65 72  ss of OP_Integer
13db0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6d   */.  int addrEm
13dc0 70 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  pty;            
13dd0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
13de0 20 6f 66 20 4f 50 5f 52 65 77 69 6e 64 20 69 6e   of OP_Rewind in
13df0 20 66 6c 75 73 68 3a 20 2a 2f 0a 20 20 69 6e 74   flush: */.  int
13e00 20 72 65 67 53 74 61 72 74 20 3d 20 30 3b 20 20   regStart = 0;  
13e10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13e20 56 61 6c 75 65 20 6f 66 20 3c 65 78 70 72 3e 20  Value of <expr> 
13e30 50 52 45 43 45 44 49 4e 47 20 2a 2f 0a 20 20 69  PRECEDING */.  i
13e40 6e 74 20 72 65 67 45 6e 64 20 3d 20 30 3b 20 20  nt regEnd = 0;  
13e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13e60 2a 20 56 61 6c 75 65 20 6f 66 20 3c 65 78 70 72  * Value of <expr
13e70 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 2a 2f 0a 20  > FOLLOWING */. 
13e80 20 69 6e 74 20 72 65 67 4e 65 77 3b 20 20 20 20   int regNew;    
13e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ea0 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 72 65 67   /* Array of reg
13eb0 69 73 74 65 72 73 20 68 6f 6c 64 69 6e 67 20 6e  isters holding n
13ec0 65 77 20 69 6e 70 75 74 20 72 6f 77 20 2a 2f 0a  ew input row */.
13ed0 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b    int regRecord;
13ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ef0 20 20 2f 2a 20 72 65 67 4e 65 77 20 61 72 72 61    /* regNew arra
13f00 79 20 69 6e 20 72 65 63 6f 72 64 20 66 6f 72 6d  y in record form
13f10 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 6f 77   */.  int regRow
13f20 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
13f30 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66        /* Rowid f
13f40 6f 72 20 72 65 67 52 65 63 6f 72 64 20 69 6e 20  or regRecord in 
13f50 65 70 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  eph table */.  i
13f60 6e 74 20 72 65 67 4e 65 77 50 65 65 72 20 3d 20  nt regNewPeer = 
13f70 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
13f80 2a 20 50 65 65 72 20 76 61 6c 75 65 73 20 66 6f  * Peer values fo
13f90 72 20 6e 65 77 20 72 6f 77 20 28 70 61 72 74 20  r new row (part 
13fa0 6f 66 20 72 65 67 4e 65 77 29 20 2a 2f 0a 20 20  of regNew) */.  
13fb0 69 6e 74 20 72 65 67 50 65 65 72 20 3d 20 30 3b  int regPeer = 0;
13fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fd0 2f 2a 20 50 65 65 72 20 76 61 6c 75 65 73 20 66  /* Peer values f
13fe0 6f 72 20 63 75 72 72 65 6e 74 20 72 6f 77 20 2a  or current row *
13ff0 2f 0a 20 20 69 6e 74 20 72 65 67 46 6c 75 73 68  /.  int regFlush
14000 50 61 72 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Part = 0;       
14010 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
14020 66 6f 72 20 22 47 6f 73 75 62 20 66 6c 75 73 68  for "Gosub flush
14030 5f 70 61 72 74 69 74 69 6f 6e 22 20 2a 2f 0a 20  _partition" */. 
14040 20 57 69 6e 64 6f 77 43 6f 64 65 41 72 67 20 73   WindowCodeArg s
14050 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14060 20 2f 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65   /* Context obje
14070 63 74 20 66 6f 72 20 73 75 62 2d 72 6f 75 74 69  ct for sub-routi
14080 6e 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6c 62 6c  nes */.  int lbl
14090 57 68 65 72 65 45 6e 64 3b 20 20 20 20 20 20 20  WhereEnd;       
140a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65           /* Labe
140b0 6c 20 6a 75 73 74 20 62 65 66 6f 72 65 20 73 71  l just before sq
140c0 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20  lite3WhereEnd() 
140d0 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  code */..  asser
140e0 74 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  t( pMWin->eStart
140f0 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 7c  ==TK_PRECEDING |
14100 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d  | pMWin->eStart=
14110 3d 54 4b 5f 43 55 52 52 45 4e 54 20 0a 20 20 20  =TK_CURRENT .   
14120 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53      || pMWin->eS
14130 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49  tart==TK_FOLLOWI
14140 4e 47 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74  NG || pMWin->eSt
14150 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  art==TK_UNBOUNDE
14160 44 20 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  D .  );.  assert
14170 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54  ( pMWin->eEnd==T
14180 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 7c 7c 20 70  K_FOLLOWING || p
14190 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43  MWin->eEnd==TK_C
141a0 55 52 52 45 4e 54 20 0a 20 20 20 20 20 20 20 7c  URRENT .       |
141b0 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54  | pMWin->eEnd==T
141c0 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 7c 7c 20 70  K_UNBOUNDED || p
141d0 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50  MWin->eEnd==TK_P
141e0 52 45 43 45 44 49 4e 47 20 0a 20 20 29 3b 0a 20  RECEDING .  );. 
141f0 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e   assert( pMWin->
14200 65 45 78 63 6c 75 64 65 3d 3d 30 20 7c 7c 20 70  eExclude==0 || p
14210 4d 57 69 6e 2d 3e 65 45 78 63 6c 75 64 65 3d 3d  MWin->eExclude==
14220 54 4b 5f 43 55 52 52 45 4e 54 0a 20 20 20 20 20  TK_CURRENT.     
14230 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 78 63    || pMWin->eExc
14240 6c 75 64 65 3d 3d 54 4b 5f 47 52 4f 55 50 20 7c  lude==TK_GROUP |
14250 7c 20 70 4d 57 69 6e 2d 3e 65 45 78 63 6c 75 64  | pMWin->eExclud
14260 65 3d 3d 54 4b 5f 54 49 45 53 0a 20 20 20 20 20  e==TK_TIES.     
14270 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 78 63    || pMWin->eExc
14280 6c 75 64 65 3d 3d 54 4b 5f 4e 4f 0a 20 20 29 3b  lude==TK_NO.  );
14290 0a 0a 20 20 6c 62 6c 57 68 65 72 65 45 6e 64 20  ..  lblWhereEnd 
142a0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
142b0 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
142c0 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68  .  /* Fill in th
142d0 65 20 63 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74  e context object
142e0 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 73 2c   */.  memset(&s,
142f0 20 30 2c 20 73 69 7a 65 6f 66 28 57 69 6e 64 6f   0, sizeof(Windo
14300 77 43 6f 64 65 41 72 67 29 29 3b 0a 20 20 73 2e  wCodeArg));.  s.
14310 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
14320 0a 20 20 73 2e 70 4d 57 69 6e 20 3d 20 70 4d 57  .  s.pMWin = pMW
14330 69 6e 3b 0a 20 20 73 2e 70 56 64 62 65 20 3d 20  in;.  s.pVdbe = 
14340 76 3b 0a 20 20 73 2e 72 65 67 47 6f 73 75 62 20  v;.  s.regGosub 
14350 3d 20 72 65 67 47 6f 73 75 62 3b 0a 20 20 73 2e  = regGosub;.  s.
14360 61 64 64 72 47 6f 73 75 62 20 3d 20 61 64 64 72  addrGosub = addr
14370 47 6f 73 75 62 3b 0a 20 20 73 2e 63 75 72 72 65  Gosub;.  s.curre
14380 6e 74 2e 63 73 72 20 3d 20 70 4d 57 69 6e 2d 3e  nt.csr = pMWin->
14390 69 45 70 68 43 73 72 3b 0a 20 20 63 73 72 57 72  iEphCsr;.  csrWr
143a0 69 74 65 20 3d 20 73 2e 63 75 72 72 65 6e 74 2e  ite = s.current.
143b0 63 73 72 2b 31 3b 0a 20 20 73 2e 73 74 61 72 74  csr+1;.  s.start
143c0 2e 63 73 72 20 3d 20 73 2e 63 75 72 72 65 6e 74  .csr = s.current
143d0 2e 63 73 72 2b 32 3b 0a 20 20 73 2e 65 6e 64 2e  .csr+2;.  s.end.
143e0 63 73 72 20 3d 20 73 2e 63 75 72 72 65 6e 74 2e  csr = s.current.
143f0 63 73 72 2b 33 3b 0a 0a 20 20 2f 2a 20 46 69 67  csr+3;..  /* Fig
14400 75 72 65 20 6f 75 74 20 77 68 65 6e 20 72 6f 77  ure out when row
14410 73 20 6d 61 79 20 62 65 20 64 65 6c 65 74 65 64  s may be deleted
14420 20 66 72 6f 6d 20 74 68 65 20 65 70 68 65 6d 65   from the epheme
14430 72 61 6c 20 74 61 62 6c 65 2e 20 54 68 65 72 65  ral table. There
14440 0a 20 20 2a 2a 20 61 72 65 20 66 6f 75 72 20 6f  .  ** are four o
14450 70 74 69 6f 6e 73 20 2d 20 74 68 65 79 20 6d 61  ptions - they ma
14460 79 20 6e 65 76 65 72 20 62 65 20 64 65 6c 65 74  y never be delet
14470 65 64 20 28 65 44 65 6c 65 74 65 3d 3d 30 29 2c  ed (eDelete==0),
14480 20 74 68 65 79 20 6d 61 79 20 0a 20 20 2a 2a 20   they may .  ** 
14490 62 65 20 64 65 6c 65 74 65 64 20 61 73 20 73 6f  be deleted as so
144a0 6f 6e 20 61 73 20 74 68 65 79 20 61 72 65 20 6e  on as they are n
144b0 6f 20 6c 6f 6e 67 65 72 20 70 61 72 74 20 6f 66  o longer part of
144c0 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61 6d   the window fram
144d0 65 0a 20 20 2a 2a 20 28 65 44 65 6c 65 74 65 3d  e.  ** (eDelete=
144e0 3d 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52  =WINDOW_AGGINVER
144f0 53 45 29 2c 20 74 68 65 79 20 6d 61 79 20 62 65  SE), they may be
14500 20 64 65 6c 65 74 65 64 20 61 73 20 61 66 74 65   deleted as afte
14510 72 20 74 68 65 20 72 6f 77 20 0a 20 20 2a 2a 20  r the row .  ** 
14520 68 61 73 20 62 65 65 6e 20 72 65 74 75 72 6e 65  has been returne
14530 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  d to the caller 
14540 28 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52  (WINDOW_RETURN_R
14550 4f 57 29 2c 20 6f 72 20 74 68 65 79 20 6d 61 79  OW), or they may
14560 0a 20 20 2a 2a 20 62 65 20 64 65 6c 65 74 65 64  .  ** be deleted
14570 20 61 66 74 65 72 20 74 68 65 79 20 65 6e 74 65   after they ente
14580 72 20 74 68 65 20 66 72 61 6d 65 20 28 57 49 4e  r the frame (WIN
14590 44 4f 57 5f 41 47 47 53 54 45 50 29 2e 20 2a 2f  DOW_AGGSTEP). */
145a0 0a 20 20 73 77 69 74 63 68 28 20 70 4d 57 69 6e  .  switch( pMWin
145b0 2d 3e 65 53 74 61 72 74 20 29 7b 0a 20 20 20 20  ->eStart ){.    
145c0 63 61 73 65 20 54 4b 5f 46 4f 4c 4c 4f 57 49 4e  case TK_FOLLOWIN
145d0 47 3a 0a 20 20 20 20 20 20 69 66 28 20 70 4d 57  G:.      if( pMW
145e0 69 6e 2d 3e 65 46 72 6d 54 79 70 65 21 3d 54 4b  in->eFrmType!=TK
145f0 5f 52 41 4e 47 45 0a 20 20 20 20 20 20 20 26 26  _RANGE.       &&
14600 20 77 69 6e 64 6f 77 45 78 70 72 47 74 5a 65 72   windowExprGtZer
14610 6f 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2d  o(pParse, pMWin-
14620 3e 70 53 74 61 72 74 29 0a 20 20 20 20 20 20 29  >pStart).      )
14630 7b 0a 20 20 20 20 20 20 20 20 73 2e 65 44 65 6c  {.        s.eDel
14640 65 74 65 20 3d 20 57 49 4e 44 4f 57 5f 52 45 54  ete = WINDOW_RET
14650 55 52 4e 5f 52 4f 57 3b 0a 20 20 20 20 20 20 7d  URN_ROW;.      }
14660 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14670 20 20 63 61 73 65 20 54 4b 5f 55 4e 42 4f 55 4e    case TK_UNBOUN
14680 44 45 44 3a 0a 20 20 20 20 20 20 69 66 28 20 77  DED:.      if( w
14690 69 6e 64 6f 77 43 61 63 68 65 46 72 61 6d 65 28  indowCacheFrame(
146a0 70 4d 57 69 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  pMWin)==0 ){.   
146b0 20 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e       if( pMWin->
146c0 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49  eEnd==TK_PRECEDI
146d0 4e 47 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NG ){.          
146e0 69 66 28 20 70 4d 57 69 6e 2d 3e 65 46 72 6d 54  if( pMWin->eFrmT
146f0 79 70 65 21 3d 54 4b 5f 52 41 4e 47 45 0a 20 20  ype!=TK_RANGE.  
14700 20 20 20 20 20 20 20 20 20 26 26 20 77 69 6e 64           && wind
14710 6f 77 45 78 70 72 47 74 5a 65 72 6f 28 70 50 61  owExprGtZero(pPa
14720 72 73 65 2c 20 70 4d 57 69 6e 2d 3e 70 45 6e 64  rse, pMWin->pEnd
14730 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20  ).          ){. 
14740 20 20 20 20 20 20 20 20 20 20 20 73 2e 65 44 65             s.eDe
14750 6c 65 74 65 20 3d 20 57 49 4e 44 4f 57 5f 41 47  lete = WINDOW_AG
14760 47 53 54 45 50 3b 0a 20 20 20 20 20 20 20 20 20  GSTEP;.         
14770 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
14780 7b 0a 20 20 20 20 20 20 20 20 20 20 73 2e 65 44  {.          s.eD
14790 65 6c 65 74 65 20 3d 20 57 49 4e 44 4f 57 5f 52  elete = WINDOW_R
147a0 45 54 55 52 4e 5f 52 4f 57 3b 0a 20 20 20 20 20  ETURN_ROW;.     
147b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
147c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
147d0 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 73 2e 65  fault:.      s.e
147e0 44 65 6c 65 74 65 20 3d 20 57 49 4e 44 4f 57 5f  Delete = WINDOW_
147f0 41 47 47 49 4e 56 45 52 53 45 3b 0a 20 20 20 20  AGGINVERSE;.    
14800 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
14810 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 72 65 67 69  /* Allocate regi
14820 73 74 65 72 73 20 66 6f 72 20 74 68 65 20 61 72  sters for the ar
14830 72 61 79 20 6f 66 20 76 61 6c 75 65 73 20 66 72  ray of values fr
14840 6f 6d 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  om the sub-query
14850 2c 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 76 65  , the.  ** samve
14860 20 76 61 6c 75 65 73 20 69 6e 20 72 65 63 6f 72   values in recor
14870 64 20 66 6f 72 6d 2c 20 61 6e 64 20 74 68 65 20  d form, and the 
14880 72 6f 77 69 64 20 75 73 65 64 20 74 6f 20 69 6e  rowid used to in
14890 73 65 72 74 20 73 61 69 64 20 72 65 63 6f 72 64  sert said record
148a0 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 65  .  ** into the e
148b0 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20  phemeral table. 
148c0 20 2a 2f 0a 20 20 72 65 67 4e 65 77 20 3d 20 70   */.  regNew = p
148d0 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
148e0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
148f0 20 6e 49 6e 70 75 74 3b 0a 20 20 72 65 67 52 65   nInput;.  regRe
14900 63 6f 72 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d  cord = ++pParse-
14910 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 52 6f 77 69  >nMem;.  regRowi
14920 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  d = ++pParse->nM
14930 65 6d 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  em;..  /* If the
14940 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 20 63 6f   window frame co
14950 6e 74 61 69 6e 73 20 61 6e 20 22 3c 65 78 70 72  ntains an "<expr
14960 3e 20 50 52 45 43 45 44 49 4e 47 22 20 6f 72 20  > PRECEDING" or 
14970 22 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e  "<expr> FOLLOWIN
14980 47 22 0a 20 20 2a 2a 20 63 6c 61 75 73 65 2c 20  G".  ** clause, 
14990 61 6c 6c 6f 63 61 74 65 20 72 65 67 69 73 74 65  allocate registe
149a0 72 73 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  rs to store the 
149b0 72 65 73 75 6c 74 73 20 6f 66 20 65 76 61 6c 75  results of evalu
149c0 61 74 69 6e 67 20 65 61 63 68 0a 20 20 2a 2a 20  ating each.  ** 
149d0 3c 65 78 70 72 3e 2e 20 20 2a 2f 0a 20 20 69 66  <expr>.  */.  if
149e0 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d  ( pMWin->eStart=
149f0 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 7c 7c  =TK_PRECEDING ||
14a00 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d   pMWin->eStart==
14a10 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a  TK_FOLLOWING ){.
14a20 20 20 20 20 72 65 67 53 74 61 72 74 20 3d 20 2b      regStart = +
14a30 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
14a40 20 7d 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e   }.  if( pMWin->
14a50 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49  eEnd==TK_PRECEDI
14a60 4e 47 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e  NG || pMWin->eEn
14a70 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  d==TK_FOLLOWING 
14a80 29 7b 0a 20 20 20 20 72 65 67 45 6e 64 20 3d 20  ){.    regEnd = 
14a90 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
14aa0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69    }..  /* If thi
14ab0 73 20 69 73 20 6e 6f 74 20 61 20 22 52 4f 57 53  s is not a "ROWS
14ac0 20 42 45 54 57 45 45 4e 20 2e 2e 2e 22 20 66 72   BETWEEN ..." fr
14ad0 61 6d 65 2c 20 74 68 65 6e 20 61 6c 6c 6f 63 61  ame, then alloca
14ae0 74 65 20 61 72 72 61 79 73 20 6f 66 0a 20 20 2a  te arrays of.  *
14af0 2a 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 73  * registers to s
14b00 74 6f 72 65 20 63 6f 70 69 65 73 20 6f 66 20 74  tore copies of t
14b10 68 65 20 4f 52 44 45 52 20 42 59 20 65 78 70 72  he ORDER BY expr
14b20 65 73 73 69 6f 6e 73 20 28 70 65 65 72 20 76 61  essions (peer va
14b30 6c 75 65 73 29 20 0a 20 20 2a 2a 20 66 6f 72 20  lues) .  ** for 
14b40 74 68 65 20 6d 61 69 6e 20 6c 6f 6f 70 2c 20 61  the main loop, a
14b50 6e 64 20 66 6f 72 20 65 61 63 68 20 63 75 72 73  nd for each curs
14b60 6f 72 20 28 73 74 61 72 74 2c 20 63 75 72 72 65  or (start, curre
14b70 6e 74 20 61 6e 64 20 65 6e 64 29 2e 20 2a 2f 0a  nt and end). */.
14b80 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 46 72    if( pMWin->eFr
14b90 6d 54 79 70 65 21 3d 54 4b 5f 52 4f 57 53 20 29  mType!=TK_ROWS )
14ba0 7b 0a 20 20 20 20 69 6e 74 20 6e 50 65 65 72 20  {.    int nPeer 
14bb0 3d 20 28 70 4f 72 64 65 72 42 79 20 3f 20 70 4f  = (pOrderBy ? pO
14bc0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 3a 20  rderBy->nExpr : 
14bd0 30 29 3b 0a 20 20 20 20 72 65 67 4e 65 77 50 65  0);.    regNewPe
14be0 65 72 20 3d 20 72 65 67 4e 65 77 20 2b 20 70 4d  er = regNew + pM
14bf0 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 3b  Win->nBufferCol;
14c00 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  .    if( pMWin->
14c10 70 50 61 72 74 69 74 69 6f 6e 20 29 20 72 65 67  pPartition ) reg
14c20 4e 65 77 50 65 65 72 20 2b 3d 20 70 4d 57 69 6e  NewPeer += pMWin
14c30 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2d 3e 6e 45  ->pPartition->nE
14c40 78 70 72 3b 0a 20 20 20 20 72 65 67 50 65 65 72  xpr;.    regPeer
14c50 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
14c60 31 3b 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  1;       pParse-
14c70 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 65 65 72 3b 0a  >nMem += nPeer;.
14c80 20 20 20 20 73 2e 73 74 61 72 74 2e 72 65 67 20      s.start.reg 
14c90 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
14ca0 3b 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  ;   pParse->nMem
14cb0 20 2b 3d 20 6e 50 65 65 72 3b 0a 20 20 20 20 73   += nPeer;.    s
14cc0 2e 63 75 72 72 65 6e 74 2e 72 65 67 20 3d 20 70  .current.reg = p
14cd0 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 20 70  Parse->nMem+1; p
14ce0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
14cf0 50 65 65 72 3b 0a 20 20 20 20 73 2e 65 6e 64 2e  Peer;.    s.end.
14d00 72 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  reg = pParse->nM
14d10 65 6d 2b 31 3b 20 20 20 20 20 70 50 61 72 73 65  em+1;     pParse
14d20 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 65 65 72 3b  ->nMem += nPeer;
14d30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20  .  }..  /* Load 
14d40 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  the column value
14d50 73 20 66 6f 72 20 74 68 65 20 72 6f 77 20 72 65  s for the row re
14d60 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 73 75  turned by the su
14d70 62 2d 73 65 6c 65 63 74 0a 20 20 2a 2a 20 69 6e  b-select.  ** in
14d80 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72  to an array of r
14d90 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
14da0 67 20 61 74 20 72 65 67 4e 65 77 2e 20 41 73 73  g at regNew. Ass
14db0 65 6d 62 6c 65 20 74 68 65 6d 20 69 6e 74 6f 0a  emble them into.
14dc0 20 20 2a 2a 20 61 20 72 65 63 6f 72 64 20 69 6e    ** a record in
14dd0 20 72 65 67 69 73 74 65 72 20 72 65 67 52 65 63   register regRec
14de0 6f 72 64 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 49  ord. */.  for(iI
14df0 6e 70 75 74 3d 30 3b 20 69 49 6e 70 75 74 3c 6e  nput=0; iInput<n
14e00 49 6e 70 75 74 3b 20 69 49 6e 70 75 74 2b 2b 29  Input; iInput++)
14e10 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
14e20 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
14e30 6c 75 6d 6e 2c 20 63 73 72 49 6e 70 75 74 2c 20  lumn, csrInput, 
14e40 69 49 6e 70 75 74 2c 20 72 65 67 4e 65 77 2b 69  iInput, regNew+i
14e50 49 6e 70 75 74 29 3b 0a 20 20 7d 0a 20 20 73 71  Input);.  }.  sq
14e60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
14e70 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
14e80 2c 20 72 65 67 4e 65 77 2c 20 6e 49 6e 70 75 74  , regNew, nInput
14e90 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 0a 20  , regRecord);.. 
14ea0 20 2f 2a 20 41 6e 20 69 6e 70 75 74 20 72 6f 77   /* An input row
14eb0 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72   has just been r
14ec0 65 61 64 20 69 6e 74 6f 20 61 6e 20 61 72 72 61  ead into an arra
14ed0 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 73  y of registers s
14ee0 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20  tarting.  ** at 
14ef0 72 65 67 4e 65 77 2e 20 49 66 20 74 68 65 20 77  regNew. If the w
14f00 69 6e 64 6f 77 20 68 61 73 20 61 20 50 41 52 54  indow has a PART
14f10 49 54 49 4f 4e 20 63 6c 61 75 73 65 2c 20 74 68  ITION clause, th
14f20 69 73 20 62 6c 6f 63 6b 20 67 65 6e 65 72 61 74  is block generat
14f30 65 73 20 0a 20 20 2a 2a 20 56 4d 20 63 6f 64 65  es .  ** VM code
14f40 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65   to check if the
14f50 20 69 6e 70 75 74 20 72 6f 77 20 69 73 20 74 68   input row is th
14f60 65 20 73 74 61 72 74 20 6f 66 20 61 20 6e 65 77  e start of a new
14f70 20 70 61 72 74 69 74 69 6f 6e 2e 0a 20 20 2a 2a   partition..  **
14f80 20 49 66 20 73 6f 2c 20 69 74 20 64 6f 65 73 20   If so, it does 
14f90 61 6e 20 4f 50 5f 47 6f 73 75 62 20 74 6f 20 61  an OP_Gosub to a
14fa0 6e 20 61 64 64 72 65 73 73 20 74 6f 20 62 65 20  n address to be 
14fb0 66 69 6c 6c 65 64 20 69 6e 20 6c 61 74 65 72 2e  filled in later.
14fc0 20 54 68 65 0a 20 20 2a 2a 20 61 64 64 72 65 73   The.  ** addres
14fd0 73 20 6f 66 20 74 68 65 20 4f 50 5f 47 6f 73 75  s of the OP_Gosu
14fe0 62 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6c  b is stored in l
14ff0 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 20 61 64  ocal variable ad
15000 64 72 47 6f 73 75 62 46 6c 75 73 68 2e 20 2a 2f  drGosubFlush. */
15010 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70 50  .  if( pMWin->pP
15020 61 72 74 69 74 69 6f 6e 20 29 7b 0a 20 20 20 20  artition ){.    
15030 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 45 78  int addr;.    Ex
15040 70 72 4c 69 73 74 20 2a 70 50 61 72 74 20 3d 20  prList *pPart = 
15050 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f  pMWin->pPartitio
15060 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 50 61 72 74  n;.    int nPart
15070 20 3d 20 70 50 61 72 74 2d 3e 6e 45 78 70 72 3b   = pPart->nExpr;
15080 0a 20 20 20 20 69 6e 74 20 72 65 67 4e 65 77 50  .    int regNewP
15090 61 72 74 20 3d 20 72 65 67 4e 65 77 20 2b 20 70  art = regNew + p
150a0 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c  MWin->nBufferCol
150b0 3b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  ;.    KeyInfo *p
150c0 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
150d0 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  3KeyInfoFromExpr
150e0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 50 61  List(pParse, pPa
150f0 72 74 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20  rt, 0, 0);..    
15100 72 65 67 46 6c 75 73 68 50 61 72 74 20 3d 20 2b  regFlushPart = +
15110 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
15120 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
15130 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
15140 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67 4e 65  P_Compare, regNe
15150 77 50 61 72 74 2c 20 70 4d 57 69 6e 2d 3e 72 65  wPart, pMWin->re
15160 67 50 61 72 74 2c 20 6e 50 61 72 74 29 3b 0a 20  gPart, nPart);. 
15170 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70     sqlite3VdbeAp
15180 70 65 6e 64 50 34 28 76 2c 20 28 76 6f 69 64 2a  pendP4(v, (void*
15190 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
151a0 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69  YINFO);.    sqli
151b0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
151c0 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 2b 32   OP_Jump, addr+2
151d0 2c 20 61 64 64 72 2b 34 2c 20 61 64 64 72 2b 32  , addr+4, addr+2
151e0 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
151f0 61 67 65 45 71 4e 65 28 76 29 3b 0a 20 20 20 20  ageEqNe(v);.    
15200 61 64 64 72 47 6f 73 75 62 46 6c 75 73 68 20 3d  addrGosubFlush =
15210 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15220 70 31 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p1(v, OP_Gosub, 
15230 72 65 67 46 6c 75 73 68 50 61 72 74 29 3b 0a 20  regFlushPart);. 
15240 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
15250 76 2c 20 22 63 61 6c 6c 20 66 6c 75 73 68 5f 70  v, "call flush_p
15260 61 72 74 69 74 69 6f 6e 22 29 29 3b 0a 20 20 20  artition"));.   
15270 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15280 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p3(v, OP_Copy, r
15290 65 67 4e 65 77 50 61 72 74 2c 20 70 4d 57 69 6e  egNewPart, pMWin
152a0 2d 3e 72 65 67 50 61 72 74 2c 20 6e 50 61 72 74  ->regPart, nPart
152b0 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  -1);.  }..  /* I
152c0 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 72 6f  nsert the new ro
152d0 77 20 69 6e 74 6f 20 74 68 65 20 65 70 68 65 6d  w into the ephem
152e0 65 72 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20  eral table */.  
152f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15300 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
15310 2c 20 63 73 72 57 72 69 74 65 2c 20 72 65 67 52  , csrWrite, regR
15320 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  owid);.  sqlite3
15330 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
15340 5f 49 6e 73 65 72 74 2c 20 63 73 72 57 72 69 74  _Insert, csrWrit
15350 65 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 72 65  e, regRecord, re
15360 67 52 6f 77 69 64 29 3b 0a 20 20 61 64 64 72 4e  gRowid);.  addrN
15370 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  e = sqlite3VdbeA
15380 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 65 2c 20  ddOp3(v, OP_Ne, 
15390 70 4d 57 69 6e 2d 3e 72 65 67 4f 6e 65 2c 20 30  pMWin->regOne, 0
153a0 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 56  , regRowid);.  V
153b0 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72  dbeCoverageNever
153c0 4e 75 6c 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 54  Null(v);..  /* T
153d0 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 72 75 6e  his block is run
153e0 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72   for the first r
153f0 6f 77 20 6f 66 20 65 61 63 68 20 70 61 72 74 69  ow of each parti
15400 74 69 6f 6e 20 2a 2f 0a 20 20 73 2e 72 65 67 41  tion */.  s.regA
15410 72 67 20 3d 20 77 69 6e 64 6f 77 49 6e 69 74 41  rg = windowInitA
15420 63 63 75 6d 28 70 50 61 72 73 65 2c 20 70 4d 57  ccum(pParse, pMW
15430 69 6e 29 3b 0a 0a 20 20 69 66 28 20 72 65 67 53  in);..  if( regS
15440 74 61 72 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  tart ){.    sqli
15450 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
15460 73 65 2c 20 70 4d 57 69 6e 2d 3e 70 53 74 61 72  se, pMWin->pStar
15470 74 2c 20 72 65 67 53 74 61 72 74 29 3b 0a 20 20  t, regStart);.  
15480 20 20 77 69 6e 64 6f 77 43 68 65 63 6b 56 61 6c    windowCheckVal
15490 75 65 28 70 50 61 72 73 65 2c 20 72 65 67 53 74  ue(pParse, regSt
154a0 61 72 74 2c 20 30 20 2b 20 28 70 4d 57 69 6e 2d  art, 0 + (pMWin-
154b0 3e 65 46 72 6d 54 79 70 65 3d 3d 54 4b 5f 52 41  >eFrmType==TK_RA
154c0 4e 47 45 20 3f 20 33 20 3a 20 30 29 29 3b 0a 20  NGE ? 3 : 0));. 
154d0 20 7d 0a 20 20 69 66 28 20 72 65 67 45 6e 64 20   }.  if( regEnd 
154e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
154f0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
15500 4d 57 69 6e 2d 3e 70 45 6e 64 2c 20 72 65 67 45  MWin->pEnd, regE
15510 6e 64 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43  nd);.    windowC
15520 68 65 63 6b 56 61 6c 75 65 28 70 50 61 72 73 65  heckValue(pParse
15530 2c 20 72 65 67 45 6e 64 2c 20 31 20 2b 20 28 70  , regEnd, 1 + (p
15540 4d 57 69 6e 2d 3e 65 46 72 6d 54 79 70 65 3d 3d  MWin->eFrmType==
15550 54 4b 5f 52 41 4e 47 45 20 3f 20 33 20 3a 20 30  TK_RANGE ? 3 : 0
15560 29 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  ));.  }..  if( p
15570 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 70 4d  MWin->eStart==pM
15580 57 69 6e 2d 3e 65 45 6e 64 20 26 26 20 72 65 67  Win->eEnd && reg
15590 53 74 61 72 74 20 29 7b 0a 20 20 20 20 69 6e 74  Start ){.    int
155a0 20 6f 70 20 3d 20 28 28 70 4d 57 69 6e 2d 3e 65   op = ((pMWin->e
155b0 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57  Start==TK_FOLLOW
155c0 49 4e 47 29 20 3f 20 4f 50 5f 47 65 20 3a 20 4f  ING) ? OP_Ge : O
155d0 50 5f 4c 65 29 3b 0a 20 20 20 20 69 6e 74 20 61  P_Le);.    int a
155e0 64 64 72 47 65 20 3d 20 73 71 6c 69 74 65 33 56  ddrGe = sqlite3V
155f0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c  dbeAddOp3(v, op,
15600 20 72 65 67 53 74 61 72 74 2c 20 30 2c 20 72 65   regStart, 0, re
15610 67 45 6e 64 29 3b 0a 20 20 20 20 56 64 62 65 43  gEnd);.    VdbeC
15620 6f 76 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c  overageNeverNull
15630 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 47 65 29  If(v, op==OP_Ge)
15640 3b 20 2f 2a 20 4e 65 76 65 72 4e 75 6c 6c 20 62  ; /* NeverNull b
15650 65 63 61 75 73 65 20 62 6f 75 6e 64 20 3c 65 78  ecause bound <ex
15660 70 72 3e 20 2a 2f 0a 20 20 20 20 56 64 62 65 43  pr> */.    VdbeC
15670 6f 76 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c  overageNeverNull
15680 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4c 65 29  If(v, op==OP_Le)
15690 3b 20 2f 2a 20 20 20 76 61 6c 75 65 73 20 70 72  ; /*   values pr
156a0 65 76 69 6f 75 73 6c 79 20 63 68 65 63 6b 65 64  eviously checked
156b0 20 2a 2f 0a 20 20 20 20 77 69 6e 64 6f 77 41 67   */.    windowAg
156c0 67 46 69 6e 61 6c 28 26 73 2c 20 30 29 3b 0a 20  gFinal(&s, 0);. 
156d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
156e0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
156f0 64 2c 20 73 2e 63 75 72 72 65 6e 74 2e 63 73 72  d, s.current.csr
15700 2c 20 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  , 1);.    VdbeCo
15710 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b 65 6e  verageNeverTaken
15720 28 76 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 52  (v);.    windowR
15730 65 74 75 72 6e 4f 6e 65 52 6f 77 28 26 73 29 3b  eturnOneRow(&s);
15740 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15750 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73  AddOp1(v, OP_Res
15760 65 74 53 6f 72 74 65 72 2c 20 73 2e 63 75 72 72  etSorter, s.curr
15770 65 6e 74 2e 63 73 72 29 3b 0a 20 20 20 20 73 71  ent.csr);.    sq
15780 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15790 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c  v, OP_Goto, 0, l
157a0 62 6c 57 68 65 72 65 45 6e 64 29 3b 0a 20 20 20  blWhereEnd);.   
157b0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
157c0 48 65 72 65 28 76 2c 20 61 64 64 72 47 65 29 3b  Here(v, addrGe);
157d0 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d 57 69 6e  .  }.  if( pMWin
157e0 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c  ->eStart==TK_FOL
157f0 4c 4f 57 49 4e 47 20 26 26 20 70 4d 57 69 6e 2d  LOWING && pMWin-
15800 3e 65 46 72 6d 54 79 70 65 21 3d 54 4b 5f 52 41  >eFrmType!=TK_RA
15810 4e 47 45 20 26 26 20 72 65 67 45 6e 64 20 29 7b  NGE && regEnd ){
15820 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 57  .    assert( pMW
15830 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c  in->eEnd==TK_FOL
15840 4c 4f 57 49 4e 47 20 29 3b 0a 20 20 20 20 73 71  LOWING );.    sq
15850 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
15860 76 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20  v, OP_Subtract, 
15870 72 65 67 53 74 61 72 74 2c 20 72 65 67 45 6e 64  regStart, regEnd
15880 2c 20 72 65 67 53 74 61 72 74 29 3b 0a 20 20 7d  , regStart);.  }
15890 0a 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65  ..  if( pMWin->e
158a0 53 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e  Start!=TK_UNBOUN
158b0 44 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  DED ){.    sqlit
158c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
158d0 4f 50 5f 52 65 77 69 6e 64 2c 20 73 2e 73 74 61  OP_Rewind, s.sta
158e0 72 74 2e 63 73 72 2c 20 31 29 3b 0a 20 20 20 20  rt.csr, 1);.    
158f0 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65  VdbeCoverageNeve
15900 72 54 61 6b 65 6e 28 76 29 3b 0a 20 20 7d 0a 20  rTaken(v);.  }. 
15910 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15920 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
15930 20 73 2e 63 75 72 72 65 6e 74 2e 63 73 72 2c 20   s.current.csr, 
15940 31 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61  1);.  VdbeCovera
15950 67 65 4e 65 76 65 72 54 61 6b 65 6e 28 76 29 3b  geNeverTaken(v);
15960 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
15970 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
15980 64 2c 20 73 2e 65 6e 64 2e 63 73 72 2c 20 31 29  d, s.end.csr, 1)
15990 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  ;.  VdbeCoverage
159a0 4e 65 76 65 72 54 61 6b 65 6e 28 76 29 3b 0a 20  NeverTaken(v);. 
159b0 20 69 66 28 20 72 65 67 50 65 65 72 20 26 26 20   if( regPeer && 
159c0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
159d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
159e0 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65  3(v, OP_Copy, re
159f0 67 4e 65 77 50 65 65 72 2c 20 72 65 67 50 65 65  gNewPeer, regPee
15a00 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  r, pOrderBy->nEx
15a10 70 72 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  pr-1);.    sqlit
15a20 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
15a30 4f 50 5f 43 6f 70 79 2c 20 72 65 67 50 65 65 72  OP_Copy, regPeer
15a40 2c 20 73 2e 73 74 61 72 74 2e 72 65 67 2c 20 70  , s.start.reg, p
15a50 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31  OrderBy->nExpr-1
15a60 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
15a70 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
15a80 6f 70 79 2c 20 72 65 67 50 65 65 72 2c 20 73 2e  opy, regPeer, s.
15a90 63 75 72 72 65 6e 74 2e 72 65 67 2c 20 70 4f 72  current.reg, pOr
15aa0 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b  derBy->nExpr-1);
15ab0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15ac0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70  AddOp3(v, OP_Cop
15ad0 79 2c 20 72 65 67 50 65 65 72 2c 20 73 2e 65 6e  y, regPeer, s.en
15ae0 64 2e 72 65 67 2c 20 70 4f 72 64 65 72 42 79 2d  d.reg, pOrderBy-
15af0 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 7d 0a 0a  >nExpr-1);.  }..
15b00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15b10 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
15b20 30 2c 20 6c 62 6c 57 68 65 72 65 45 6e 64 29 3b  0, lblWhereEnd);
15b30 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  ..  sqlite3VdbeJ
15b40 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4e  umpHere(v, addrN
15b50 65 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 6e  e);..  /* Beginn
15b60 69 6e 67 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b  ing of the block
15b70 20 65 78 65 63 75 74 65 64 20 66 6f 72 20 74 68   executed for th
15b80 65 20 73 65 63 6f 6e 64 20 61 6e 64 20 73 75 62  e second and sub
15b90 73 65 71 75 65 6e 74 20 72 6f 77 73 2e 20 2a 2f  sequent rows. */
15ba0 0a 20 20 69 66 28 20 72 65 67 50 65 65 72 20 29  .  if( regPeer )
15bb0 7b 0a 20 20 20 20 77 69 6e 64 6f 77 49 66 4e 65  {.    windowIfNe
15bc0 77 50 65 65 72 28 70 50 61 72 73 65 2c 20 70 4f  wPeer(pParse, pO
15bd0 72 64 65 72 42 79 2c 20 72 65 67 4e 65 77 50 65  rderBy, regNewPe
15be0 65 72 2c 20 72 65 67 50 65 65 72 2c 20 6c 62 6c  er, regPeer, lbl
15bf0 57 68 65 72 65 45 6e 64 29 3b 0a 20 20 7d 0a 20  WhereEnd);.  }. 
15c00 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61   if( pMWin->eSta
15c10 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  rt==TK_FOLLOWING
15c20 20 29 7b 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f   ){.    windowCo
15c30 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f  deOp(&s, WINDOW_
15c40 41 47 47 53 54 45 50 2c 20 30 2c 20 30 29 3b 0a  AGGSTEP, 0, 0);.
15c50 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65      if( pMWin->e
15c60 45 6e 64 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  End!=TK_UNBOUNDE
15c70 44 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  D ){.      if( p
15c80 4d 57 69 6e 2d 3e 65 46 72 6d 54 79 70 65 3d 3d  MWin->eFrmType==
15c90 54 4b 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20  TK_RANGE ){.    
15ca0 20 20 20 20 69 6e 74 20 6c 62 6c 20 3d 20 73 71      int lbl = sq
15cb0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
15cc0 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  el(pParse);.    
15cd0 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74      int addrNext
15ce0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
15cf0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
15d00 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65        windowCode
15d10 52 61 6e 67 65 54 65 73 74 28 26 73 2c 20 4f 50  RangeTest(&s, OP
15d20 5f 47 65 2c 20 73 2e 63 75 72 72 65 6e 74 2e 63  _Ge, s.current.c
15d30 73 72 2c 20 72 65 67 45 6e 64 2c 20 73 2e 65 6e  sr, regEnd, s.en
15d40 64 2e 63 73 72 2c 20 6c 62 6c 29 3b 0a 20 20 20  d.csr, lbl);.   
15d50 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f       windowCodeO
15d60 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47  p(&s, WINDOW_AGG
15d70 49 4e 56 45 52 53 45 2c 20 72 65 67 53 74 61 72  INVERSE, regStar
15d80 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 77  t, 0);.        w
15d90 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20  indowCodeOp(&s, 
15da0 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f  WINDOW_RETURN_RO
15db0 57 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  W, 0, 0);.      
15dc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15dd0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
15de0 30 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20  0, addrNext);.  
15df0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15e00 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
15e10 20 6c 62 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c   lbl);.      }el
15e20 73 65 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 64  se{.        wind
15e30 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e  owCodeOp(&s, WIN
15e40 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20  DOW_RETURN_ROW, 
15e50 72 65 67 45 6e 64 2c 20 30 29 3b 0a 20 20 20 20  regEnd, 0);.    
15e60 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70      windowCodeOp
15e70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49  (&s, WINDOW_AGGI
15e80 4e 56 45 52 53 45 2c 20 72 65 67 53 74 61 72 74  NVERSE, regStart
15e90 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
15ea0 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 20 20 69 66    }.  }else.  if
15eb0 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54  ( pMWin->eEnd==T
15ec0 4b 5f 50 52 45 43 45 44 49 4e 47 20 29 7b 0a 20  K_PRECEDING ){. 
15ed0 20 20 20 69 6e 74 20 62 52 50 53 20 3d 20 28 70     int bRPS = (p
15ee0 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
15ef0 5f 50 52 45 43 45 44 49 4e 47 20 26 26 20 70 4d  _PRECEDING && pM
15f00 57 69 6e 2d 3e 65 46 72 6d 54 79 70 65 3d 3d 54  Win->eFrmType==T
15f10 4b 5f 52 41 4e 47 45 29 3b 0a 20 20 20 20 77 69  K_RANGE);.    wi
15f20 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57  ndowCodeOp(&s, W
15f30 49 4e 44 4f 57 5f 41 47 47 53 54 45 50 2c 20 72  INDOW_AGGSTEP, r
15f40 65 67 45 6e 64 2c 20 30 29 3b 0a 20 20 20 20 69  egEnd, 0);.    i
15f50 66 28 20 62 52 50 53 20 29 20 77 69 6e 64 6f 77  f( bRPS ) window
15f60 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f  CodeOp(&s, WINDO
15f70 57 5f 41 47 47 49 4e 56 45 52 53 45 2c 20 72 65  W_AGGINVERSE, re
15f80 67 53 74 61 72 74 2c 20 30 29 3b 0a 20 20 20 20  gStart, 0);.    
15f90 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c  windowCodeOp(&s,
15fa0 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52   WINDOW_RETURN_R
15fb0 4f 57 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  OW, 0, 0);.    i
15fc0 66 28 20 21 62 52 50 53 20 29 20 77 69 6e 64 6f  f( !bRPS ) windo
15fd0 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44  wCodeOp(&s, WIND
15fe0 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 2c 20 72  OW_AGGINVERSE, r
15ff0 65 67 53 74 61 72 74 2c 20 30 29 3b 0a 20 20 7d  egStart, 0);.  }
16000 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 61 64  else{.    int ad
16010 64 72 20 3d 20 30 3b 0a 20 20 20 20 77 69 6e 64  dr = 0;.    wind
16020 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e  owCodeOp(&s, WIN
16030 44 4f 57 5f 41 47 47 53 54 45 50 2c 20 30 2c 20  DOW_AGGSTEP, 0, 
16040 30 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 57 69  0);.    if( pMWi
16050 6e 2d 3e 65 45 6e 64 21 3d 54 4b 5f 55 4e 42 4f  n->eEnd!=TK_UNBO
16060 55 4e 44 45 44 20 29 7b 0a 20 20 20 20 20 20 69  UNDED ){.      i
16070 66 28 20 70 4d 57 69 6e 2d 3e 65 46 72 6d 54 79  f( pMWin->eFrmTy
16080 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 29 7b 0a  pe==TK_RANGE ){.
16090 20 20 20 20 20 20 20 20 69 6e 74 20 6c 62 6c 20          int lbl 
160a0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61 64 64  = 0;.        add
160b0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
160c0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
160d0 20 20 20 20 20 20 20 69 66 28 20 72 65 67 45 6e         if( regEn
160e0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c  d ){.          l
160f0 62 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  bl = sqlite3Vdbe
16100 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65  MakeLabel(pParse
16110 29 3b 0a 20 20 20 20 20 20 20 20 20 20 77 69 6e  );.          win
16120 64 6f 77 43 6f 64 65 52 61 6e 67 65 54 65 73 74  dowCodeRangeTest
16130 28 26 73 2c 20 4f 50 5f 47 65 2c 20 73 2e 63 75  (&s, OP_Ge, s.cu
16140 72 72 65 6e 74 2e 63 73 72 2c 20 72 65 67 45 6e  rrent.csr, regEn
16150 64 2c 20 73 2e 65 6e 64 2e 63 73 72 2c 20 6c 62  d, s.end.csr, lb
16160 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  l);.        }.  
16170 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65        windowCode
16180 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45  Op(&s, WINDOW_RE
16190 54 55 52 4e 5f 52 4f 57 2c 20 30 2c 20 30 29 3b  TURN_ROW, 0, 0);
161a0 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43  .        windowC
161b0 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57  odeOp(&s, WINDOW
161c0 5f 41 47 47 49 4e 56 45 52 53 45 2c 20 72 65 67  _AGGINVERSE, reg
161d0 53 74 61 72 74 2c 20 30 29 3b 0a 20 20 20 20 20  Start, 0);.     
161e0 20 20 20 69 66 28 20 72 65 67 45 6e 64 20 29 7b     if( regEnd ){
161f0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
16200 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16210 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
16220 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
16230 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
16240 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20 20  abel(v, lbl);.  
16250 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
16260 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
16270 20 72 65 67 45 6e 64 20 29 7b 0a 20 20 20 20 20   regEnd ){.     
16280 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
16290 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
162a0 20 4f 50 5f 49 66 50 6f 73 2c 20 72 65 67 45 6e   OP_IfPos, regEn
162b0 64 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 20 20  d, 0, 1);.      
162c0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
162d0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  (v);.        }. 
162e0 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64         windowCod
162f0 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52  eOp(&s, WINDOW_R
16300 45 54 55 52 4e 5f 52 4f 57 2c 20 30 2c 20 30 29  ETURN_ROW, 0, 0)
16310 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77  ;.        window
16320 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f  CodeOp(&s, WINDO
16330 57 5f 41 47 47 49 4e 56 45 52 53 45 2c 20 72 65  W_AGGINVERSE, re
16340 67 53 74 61 72 74 2c 20 30 29 3b 0a 20 20 20 20  gStart, 0);.    
16350 20 20 20 20 69 66 28 20 72 65 67 45 6e 64 20 29      if( regEnd )
16360 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
16370 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
16380 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
16390 0a 0a 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68  ..  /* End of th
163a0 65 20 6d 61 69 6e 20 69 6e 70 75 74 20 6c 6f 6f  e main input loo
163b0 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  p */.  sqlite3Vd
163c0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
163d0 2c 20 6c 62 6c 57 68 65 72 65 45 6e 64 29 3b 0a  , lblWhereEnd);.
163e0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
163f0 64 28 70 57 49 6e 66 6f 29 3b 0a 0a 20 20 2f 2a  d(pWInfo);..  /*
16400 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f   Fall through */
16410 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70 50  .  if( pMWin->pP
16420 61 72 74 69 74 69 6f 6e 20 29 7b 0a 20 20 20 20  artition ){.    
16430 61 64 64 72 49 6e 74 65 67 65 72 20 3d 20 73 71  addrInteger = sq
16440 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16450 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
16460 2c 20 72 65 67 46 6c 75 73 68 50 61 72 74 29 3b  , regFlushPart);
16470 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16480 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
16490 47 6f 73 75 62 46 6c 75 73 68 29 3b 0a 20 20 7d  GosubFlush);.  }
164a0 0a 0a 20 20 61 64 64 72 45 6d 70 74 79 20 3d 20  ..  addrEmpty = 
164b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
164c0 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  1(v, OP_Rewind, 
164d0 63 73 72 57 72 69 74 65 29 3b 0a 20 20 56 64 62  csrWrite);.  Vdb
164e0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
164f0 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d  if( pMWin->eEnd=
16500 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 29 7b  =TK_PRECEDING ){
16510 0a 20 20 20 20 69 6e 74 20 62 52 50 53 20 3d 20  .    int bRPS = 
16520 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d  (pMWin->eStart==
16530 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 26 26 20  TK_PRECEDING && 
16540 70 4d 57 69 6e 2d 3e 65 46 72 6d 54 79 70 65 3d  pMWin->eFrmType=
16550 3d 54 4b 5f 52 41 4e 47 45 29 3b 0a 20 20 20 20  =TK_RANGE);.    
16560 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c  windowCodeOp(&s,
16570 20 57 49 4e 44 4f 57 5f 41 47 47 53 54 45 50 2c   WINDOW_AGGSTEP,
16580 20 72 65 67 45 6e 64 2c 20 30 29 3b 0a 20 20 20   regEnd, 0);.   
16590 20 69 66 28 20 62 52 50 53 20 29 20 77 69 6e 64   if( bRPS ) wind
165a0 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e  owCodeOp(&s, WIN
165b0 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 2c 20  DOW_AGGINVERSE, 
165c0 72 65 67 53 74 61 72 74 2c 20 30 29 3b 0a 20 20  regStart, 0);.  
165d0 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26    windowCodeOp(&
165e0 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e  s, WINDOW_RETURN
165f0 5f 52 4f 57 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  _ROW, 0, 0);.  }
16600 65 6c 73 65 20 69 66 28 20 70 4d 57 69 6e 2d 3e  else if( pMWin->
16610 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f  eStart==TK_FOLLO
16620 57 49 4e 47 20 29 7b 0a 20 20 20 20 69 6e 74 20  WING ){.    int 
16630 61 64 64 72 53 74 61 72 74 3b 0a 20 20 20 20 69  addrStart;.    i
16640 6e 74 20 61 64 64 72 42 72 65 61 6b 31 3b 0a 20  nt addrBreak1;. 
16650 20 20 20 69 6e 74 20 61 64 64 72 42 72 65 61 6b     int addrBreak
16660 32 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 42  2;.    int addrB
16670 72 65 61 6b 33 3b 0a 20 20 20 20 77 69 6e 64 6f  reak3;.    windo
16680 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44  wCodeOp(&s, WIND
16690 4f 57 5f 41 47 47 53 54 45 50 2c 20 30 2c 20 30  OW_AGGSTEP, 0, 0
166a0 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e  );.    if( pMWin
166b0 2d 3e 65 46 72 6d 54 79 70 65 3d 3d 54 4b 5f 52  ->eFrmType==TK_R
166c0 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 61 64  ANGE ){.      ad
166d0 64 72 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65  drStart = sqlite
166e0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
166f0 28 76 29 3b 0a 20 20 20 20 20 20 61 64 64 72 42  (v);.      addrB
16700 72 65 61 6b 32 20 3d 20 77 69 6e 64 6f 77 43 6f  reak2 = windowCo
16710 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f  deOp(&s, WINDOW_
16720 41 47 47 49 4e 56 45 52 53 45 2c 20 72 65 67 53  AGGINVERSE, regS
16730 74 61 72 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  tart, 1);.      
16740 61 64 64 72 42 72 65 61 6b 31 20 3d 20 77 69 6e  addrBreak1 = win
16750 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49  dowCodeOp(&s, WI
16760 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c  NDOW_RETURN_ROW,
16770 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73   0, 1);.    }els
16780 65 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d  e.    if( pMWin-
16790 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e  >eEnd==TK_UNBOUN
167a0 44 45 44 20 29 7b 0a 20 20 20 20 20 20 61 64 64  DED ){.      add
167b0 72 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  rStart = sqlite3
167c0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
167d0 76 29 3b 0a 20 20 20 20 20 20 61 64 64 72 42 72  v);.      addrBr
167e0 65 61 6b 31 20 3d 20 77 69 6e 64 6f 77 43 6f 64  eak1 = windowCod
167f0 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52  eOp(&s, WINDOW_R
16800 45 54 55 52 4e 5f 52 4f 57 2c 20 72 65 67 53 74  ETURN_ROW, regSt
16810 61 72 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 61  art, 1);.      a
16820 64 64 72 42 72 65 61 6b 32 20 3d 20 77 69 6e 64  ddrBreak2 = wind
16830 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e  owCodeOp(&s, WIN
16840 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 2c 20  DOW_AGGINVERSE, 
16850 30 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65  0, 1);.    }else
16860 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
16870 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f  pMWin->eEnd==TK_
16880 46 4f 4c 4c 4f 57 49 4e 47 20 29 3b 0a 20 20 20  FOLLOWING );.   
16890 20 20 20 61 64 64 72 53 74 61 72 74 20 3d 20 73     addrStart = s
168a0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
168b0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
168c0 61 64 64 72 42 72 65 61 6b 31 20 3d 20 77 69 6e  addrBreak1 = win
168d0 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49  dowCodeOp(&s, WI
168e0 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c  NDOW_RETURN_ROW,
168f0 20 72 65 67 45 6e 64 2c 20 31 29 3b 0a 20 20 20   regEnd, 1);.   
16900 20 20 20 61 64 64 72 42 72 65 61 6b 32 20 3d 20     addrBreak2 = 
16910 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c  windowCodeOp(&s,
16920 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52   WINDOW_AGGINVER
16930 53 45 2c 20 72 65 67 53 74 61 72 74 2c 20 31 29  SE, regStart, 1)
16940 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
16950 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16960 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
16970 72 53 74 61 72 74 29 3b 0a 20 20 20 20 73 71 6c  rStart);.    sql
16980 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
16990 28 76 2c 20 61 64 64 72 42 72 65 61 6b 32 29 3b  (v, addrBreak2);
169a0 0a 20 20 20 20 61 64 64 72 53 74 61 72 74 20 3d  .    addrStart =
169b0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
169c0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
169d0 61 64 64 72 42 72 65 61 6b 33 20 3d 20 77 69 6e  addrBreak3 = win
169e0 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49  dowCodeOp(&s, WI
169f0 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c  NDOW_RETURN_ROW,
16a00 20 30 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69   0, 1);.    sqli
16a10 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16a20 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
16a30 72 53 74 61 72 74 29 3b 0a 20 20 20 20 73 71 6c  rStart);.    sql
16a40 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
16a50 28 76 2c 20 61 64 64 72 42 72 65 61 6b 31 29 3b  (v, addrBreak1);
16a60 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16a70 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
16a80 42 72 65 61 6b 33 29 3b 0a 20 20 7d 65 6c 73 65  Break3);.  }else
16a90 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 42 72  {.    int addrBr
16aa0 65 61 6b 3b 0a 20 20 20 20 69 6e 74 20 61 64 64  eak;.    int add
16ab0 72 53 74 61 72 74 3b 0a 20 20 20 20 77 69 6e 64  rStart;.    wind
16ac0 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e  owCodeOp(&s, WIN
16ad0 44 4f 57 5f 41 47 47 53 54 45 50 2c 20 30 2c 20  DOW_AGGSTEP, 0, 
16ae0 30 29 3b 0a 20 20 20 20 61 64 64 72 53 74 61 72  0);.    addrStar
16af0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
16b00 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
16b10 20 20 20 61 64 64 72 42 72 65 61 6b 20 3d 20 77     addrBreak = w
16b20 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20  indowCodeOp(&s, 
16b30 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f  WINDOW_RETURN_RO
16b40 57 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 77 69  W, 0, 1);.    wi
16b50 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57  ndowCodeOp(&s, W
16b60 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45  INDOW_AGGINVERSE
16b70 2c 20 72 65 67 53 74 61 72 74 2c 20 30 29 3b 0a  , regStart, 0);.
16b80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16b90 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
16ba0 2c 20 30 2c 20 61 64 64 72 53 74 61 72 74 29 3b  , 0, addrStart);
16bb0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16bc0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
16bd0 42 72 65 61 6b 29 3b 0a 20 20 7d 0a 20 20 73 71  Break);.  }.  sq
16be0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
16bf0 65 28 76 2c 20 61 64 64 72 45 6d 70 74 79 29 3b  e(v, addrEmpty);
16c00 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ..  sqlite3VdbeA
16c10 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 65  ddOp1(v, OP_Rese
16c20 74 53 6f 72 74 65 72 2c 20 73 2e 63 75 72 72 65  tSorter, s.curre
16c30 6e 74 2e 63 73 72 29 3b 0a 20 20 69 66 28 20 70  nt.csr);.  if( p
16c40 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e  MWin->pPartition
16c50 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 57 69   ){.    if( pMWi
16c60 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f 77 69 64  n->regStartRowid
16c70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
16c80 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16c90 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4d  P_Integer, 1, pM
16ca0 57 69 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f 77  Win->regStartRow
16cb0 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
16cc0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16cd0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70  OP_Integer, 0, p
16ce0 4d 57 69 6e 2d 3e 72 65 67 45 6e 64 52 6f 77 69  MWin->regEndRowi
16cf0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  d);.    }.    sq
16d00 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
16d10 31 28 76 2c 20 61 64 64 72 49 6e 74 65 67 65 72  1(v, addrInteger
16d20 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
16d30 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20  rentAddr(v));.  
16d40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16d50 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
16d60 2c 20 72 65 67 46 6c 75 73 68 50 61 72 74 29 3b  , regFlushPart);
16d70 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  .  }.}..#endif /
16d80 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  * SQLITE_OMIT_WI
16d90 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a              NDOWFUNC */.