/ Hex Artifact Content
Login

Artifact 1c3e20fc23e1c3cc0c2516626d7b0bcaf6a25d9a19ba397153363fd57bde2325:


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 53 65 6c  ist *pSub;.  Sel
5aa0: 65 63 74 20 2a 70 53 75 62 53 65 6c 65 63 74 3b  ect *pSubSelect;
5ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5ac0: 43 75 72 72 65 6e 74 20 73 75 62 2d 73 65 6c 65  Current sub-sele
5ad0: 63 74 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 7d 3b  ct, if any */.};
5ae0: 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 62 61 63 6b  ../*.** Callback
5af0: 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 64 20 62   function used b
5b00: 79 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65  y selectWindowRe
5b10: 77 72 69 74 65 45 4c 69 73 74 28 29 2e 20 49 66  writeEList(). If
5b20: 20 6e 65 63 65 73 73 61 72 79 2c 0a 2a 2a 20 74   necessary,.** t
5b30: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 70 70  his function app
5b40: 65 6e 64 73 20 74 6f 20 74 68 65 20 6f 75 74 70  ends to the outp
5b50: 75 74 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69  ut expression-li
5b60: 73 74 20 61 6e 64 20 75 70 64 61 74 65 73 20 0a  st and updates .
5b70: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 28 2a  ** expression (*
5b80: 70 70 45 78 70 72 29 20 69 6e 20 70 6c 61 63 65  ppExpr) in place
5b90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5ba0: 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72  selectWindowRewr
5bb0: 69 74 65 45 78 70 72 43 62 28 57 61 6c 6b 65 72  iteExprCb(Walker
5bc0: 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
5bd0: 2a 70 45 78 70 72 29 7b 0a 20 20 73 74 72 75 63  *pExpr){.  struc
5be0: 74 20 57 69 6e 64 6f 77 52 65 77 72 69 74 65 20  t WindowRewrite 
5bf0: 2a 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  *p = pWalker->u.
5c00: 70 52 65 77 72 69 74 65 3b 0a 20 20 50 61 72 73  pRewrite;.  Pars
5c10: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c  e *pParse = pWal
5c20: 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 0a 20 20  ker->pParse;..  
5c30: 2f 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74  /* If this funct
5c40: 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c  ion is being cal
5c50: 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  led from within 
5c60: 61 20 73 63 61 6c 61 72 20 73 75 62 2d 73 65 6c  a scalar sub-sel
5c70: 65 63 74 0a 20 20 2a 2a 20 74 68 61 74 20 75 73  ect.  ** that us
5c80: 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54  ed by the SELECT
5c90: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
5ca0: 20 70 72 6f 63 65 73 73 65 64 2c 20 6f 6e 6c 79   processed, only
5cb0: 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 54 4b   process.  ** TK
5cc0: 5f 43 4f 4c 55 4d 4e 20 65 78 70 72 65 73 73 69  _COLUMN expressi
5cd0: 6f 6e 73 20 74 68 61 74 20 72 65 66 65 72 20 74  ons that refer t
5ce0: 6f 20 69 74 20 28 74 68 65 20 6f 75 74 65 72 20  o it (the outer 
5cf0: 53 45 4c 45 43 54 29 2e 20 44 6f 0a 20 20 2a 2a  SELECT). Do.  **
5d00: 20 6e 6f 74 20 70 72 6f 63 65 73 73 20 61 67 67   not process agg
5d10: 72 65 67 61 74 65 73 20 6f 72 20 77 69 6e 64 6f  regates or windo
5d20: 77 20 66 75 6e 63 74 69 6f 6e 73 20 61 74 20 61  w functions at a
5d30: 6c 6c 2c 20 61 73 20 74 68 65 79 20 62 65 6c 6f  ll, as they belo
5d40: 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 73  ng.  ** to the s
5d50: 63 61 6c 61 72 20 73 75 62 2d 73 65 6c 65 63 74  calar sub-select
5d60: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
5d70: 53 75 62 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  SubSelect ){.   
5d80: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
5d90: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
5da0: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
5db0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 65 6c 73  ntinue;.    }els
5dc0: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 72  e{.      int nSr
5dd0: 63 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72  c = p->pSrc->nSr
5de0: 63 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  c;.      int i;.
5df0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
5e00: 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nSrc; i++){.   
5e10: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
5e20: 69 54 61 62 6c 65 3d 3d 70 2d 3e 70 53 72 63 2d  iTable==p->pSrc-
5e30: 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 29 20  >a[i].iCursor ) 
5e40: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
5e50: 20 20 20 20 20 69 66 28 20 69 3d 3d 6e 53 72 63       if( i==nSrc
5e60: 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f   ) return WRC_Co
5e70: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
5e80: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  }..  switch( pEx
5e90: 70 72 2d 3e 6f 70 20 29 7b 0a 0a 20 20 20 20 63  pr->op ){..    c
5ea0: 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
5eb0: 0a 20 20 20 20 20 20 69 66 28 20 21 45 78 70 72  .      if( !Expr
5ec0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
5ed0: 72 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29  r, EP_WinFunc) )
5ee0: 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
5ef0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5f00: 20 20 20 20 20 20 57 69 6e 64 6f 77 20 2a 70 57        Window *pW
5f10: 69 6e 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  in;.        for(
5f20: 70 57 69 6e 3d 70 2d 3e 70 57 69 6e 3b 20 70 57  pWin=p->pWin; pW
5f30: 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70  in; pWin=pWin->p
5f40: 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 20 20  NextWin){.      
5f50: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 79      if( pExpr->y
5f60: 2e 70 57 69 6e 3d 3d 70 57 69 6e 20 29 7b 0a 20  .pWin==pWin ){. 
5f70: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
5f80: 74 28 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 3d  t( pWin->pOwner=
5f90: 3d 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  =pExpr );.      
5fa0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
5fb0: 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 20 20  _Prune;.        
5fc0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
5fd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46      }.      /* F
5fe0: 61 6c 6c 20 74 68 72 6f 75 67 68 2e 20 20 2a 2f  all through.  */
5ff0: 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  ..    case TK_AG
6000: 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  G_FUNCTION:.    
6010: 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
6020: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 44  {.      Expr *pD
6030: 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  up = sqlite3Expr
6040: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
6050: 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  pExpr, 0);.     
6060: 20 70 2d 3e 70 53 75 62 20 3d 20 73 71 6c 69 74   p->pSub = sqlit
6070: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
6080: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 53 75 62  (pParse, p->pSub
6090: 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 69  , pDup);.      i
60a0: 66 28 20 70 2d 3e 70 53 75 62 20 29 7b 0a 20 20  f( p->pSub ){.  
60b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78        assert( Ex
60c0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
60d0: 78 70 72 2c 20 45 50 5f 53 74 61 74 69 63 29 3d  xpr, EP_Static)=
60e0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 45 78  =0 );.        Ex
60f0: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
6100: 78 70 72 2c 20 45 50 5f 53 74 61 74 69 63 29 3b  xpr, EP_Static);
6110: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6120: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
6130: 65 2d 3e 64 62 2c 20 70 45 78 70 72 29 3b 0a 20  e->db, pExpr);. 
6140: 20 20 20 20 20 20 20 45 78 70 72 43 6c 65 61 72         ExprClear
6150: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
6160: 45 50 5f 53 74 61 74 69 63 29 3b 0a 20 20 20 20  EP_Static);.    
6170: 20 20 20 20 6d 65 6d 73 65 74 28 70 45 78 70 72      memset(pExpr
6180: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  , 0, sizeof(Expr
6190: 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 70 45 78  ));..        pEx
61a0: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55  pr->op = TK_COLU
61b0: 4d 4e 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70  MN;.        pExp
61c0: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 2d 3e  r->iColumn = p->
61d0: 70 53 75 62 2d 3e 6e 45 78 70 72 2d 31 3b 0a 20  pSub->nExpr-1;. 
61e0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
61f0: 61 62 6c 65 20 3d 20 70 2d 3e 70 57 69 6e 2d 3e  able = p->pWin->
6200: 69 45 70 68 43 73 72 3b 0a 20 20 20 20 20 20 7d  iEphCsr;.      }
6210: 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ..      break;. 
6220: 20 20 20 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c     }..    defaul
6230: 74 3a 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20  t: /* no-op */. 
6240: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
6250: 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
6260: 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63  ntinue;.}.static
6270: 20 69 6e 74 20 73 65 6c 65 63 74 57 69 6e 64 6f   int selectWindo
6280: 77 52 65 77 72 69 74 65 53 65 6c 65 63 74 43 62  wRewriteSelectCb
6290: 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
62a0: 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
62b0: 74 29 7b 0a 20 20 73 74 72 75 63 74 20 57 69 6e  t){.  struct Win
62c0: 64 6f 77 52 65 77 72 69 74 65 20 2a 70 20 3d 20  dowRewrite *p = 
62d0: 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 52 65 77 72  pWalker->u.pRewr
62e0: 69 74 65 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  ite;.  Select *p
62f0: 53 61 76 65 20 3d 20 70 2d 3e 70 53 75 62 53 65  Save = p->pSubSe
6300: 6c 65 63 74 3b 0a 20 20 69 66 28 20 70 53 61 76  lect;.  if( pSav
6310: 65 3d 3d 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  e==pSelect ){.  
6320: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
6330: 74 69 6e 75 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tinue;.  }else{.
6340: 20 20 20 20 70 2d 3e 70 53 75 62 53 65 6c 65 63      p->pSubSelec
6350: 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20 20  t = pSelect;.   
6360: 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
6370: 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c  ct(pWalker, pSel
6380: 65 63 74 29 3b 0a 20 20 20 20 70 2d 3e 70 53 75  ect);.    p->pSu
6390: 62 53 65 6c 65 63 74 20 3d 20 70 53 61 76 65 3b  bSelect = pSave;
63a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
63b0: 43 5f 50 72 75 6e 65 3b 0a 7d 0a 0a 0a 2f 2a 0a  C_Prune;.}.../*.
63c0: 2a 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75  ** Iterate throu
63d0: 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69  gh each expressi
63e0: 6f 6e 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  on in expression
63f0: 2d 6c 69 73 74 20 70 45 4c 69 73 74 2e 20 46 6f  -list pEList. Fo
6400: 72 20 65 61 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20  r each:.**.**   
6410: 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 2c 0a 2a 2a 20  * TK_COLUMN,.** 
6420: 20 20 2a 20 61 67 67 72 65 67 61 74 65 20 66 75    * aggregate fu
6430: 6e 63 74 69 6f 6e 2c 20 6f 72 0a 2a 2a 20 20 20  nction, or.**   
6440: 2a 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  * window functio
6450: 6e 20 77 69 74 68 20 61 20 57 69 6e 64 6f 77 20  n with a Window 
6460: 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73 20 6e  object that is n
6470: 6f 74 20 61 20 6d 65 6d 62 65 72 20 6f 66 20 74  ot a member of t
6480: 68 65 20 0a 2a 2a 20 20 20 20 20 57 69 6e 64 6f  he .**     Windo
6490: 77 20 6c 69 73 74 20 70 61 73 73 65 64 20 61 73  w list passed as
64a0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
64b0: 6d 65 6e 74 20 28 70 57 69 6e 29 2e 0a 2a 2a 0a  ment (pWin)..**.
64c0: 2a 2a 20 41 70 70 65 6e 64 20 74 68 65 20 6e 6f  ** Append the no
64d0: 64 65 20 74 6f 20 6f 75 74 70 75 74 20 65 78 70  de to output exp
64e0: 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 28 2a 70  ression-list (*p
64f0: 70 53 75 62 29 2e 20 41 6e 64 20 72 65 70 6c 61  pSub). And repla
6500: 63 65 20 69 74 0a 2a 2a 20 77 69 74 68 20 61 20  ce it.** with a 
6510: 54 4b 5f 43 4f 4c 55 4d 4e 20 74 68 61 74 20 72  TK_COLUMN that r
6520: 65 61 64 73 20 74 68 65 20 28 4e 2d 31 29 74 68  eads the (N-1)th
6530: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 61 62 6c   element of tabl
6540: 65 20 0a 2a 2a 20 70 57 69 6e 2d 3e 69 45 70 68  e .** pWin->iEph
6550: 43 73 72 2c 20 77 68 65 72 65 20 4e 20 69 73 20  Csr, where N is 
6560: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
6570: 65 6d 65 6e 74 73 20 69 6e 20 28 2a 70 70 53 75  ements in (*ppSu
6580: 62 29 20 61 66 74 65 72 0a 2a 2a 20 61 70 70 65  b) after.** appe
6590: 6e 64 69 6e 67 20 74 68 65 20 6e 65 77 20 6f 6e  nding the new on
65a0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
65b0: 64 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65  d selectWindowRe
65c0: 77 72 69 74 65 45 4c 69 73 74 28 0a 20 20 50 61  writeEList(.  Pa
65d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20  rse *pParse, .  
65e0: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 2c 0a 20 20  Window *pWin,.  
65f0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 0a 20  SrcList *pSrc,. 
6600: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
6610: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
6620: 20 2f 2a 20 52 65 77 72 69 74 65 20 65 78 70 72   /* Rewrite expr
6630: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 69 73 20  essions in this 
6640: 6c 69 73 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  list */.  ExprLi
6650: 73 74 20 2a 2a 70 70 53 75 62 20 20 20 20 20 20  st **ppSub      
6660: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
6670: 4f 55 54 3a 20 53 75 62 2d 73 65 6c 65 63 74 20  OUT: Sub-select 
6680: 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20  expression-list 
6690: 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65 72 20 73  */.){.  Walker s
66a0: 57 61 6c 6b 65 72 3b 0a 20 20 57 69 6e 64 6f 77  Walker;.  Window
66b0: 52 65 77 72 69 74 65 20 73 52 65 77 72 69 74 65  Rewrite sRewrite
66c0: 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 61  ;..  memset(&sWa
66d0: 6c 6b 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  lker, 0, sizeof(
66e0: 57 61 6c 6b 65 72 29 29 3b 0a 20 20 6d 65 6d 73  Walker));.  mems
66f0: 65 74 28 26 73 52 65 77 72 69 74 65 2c 20 30 2c  et(&sRewrite, 0,
6700: 20 73 69 7a 65 6f 66 28 57 69 6e 64 6f 77 52 65   sizeof(WindowRe
6710: 77 72 69 74 65 29 29 3b 0a 0a 20 20 73 52 65 77  write));..  sRew
6720: 72 69 74 65 2e 70 53 75 62 20 3d 20 2a 70 70 53  rite.pSub = *ppS
6730: 75 62 3b 0a 20 20 73 52 65 77 72 69 74 65 2e 70  ub;.  sRewrite.p
6740: 57 69 6e 20 3d 20 70 57 69 6e 3b 0a 20 20 73 52  Win = pWin;.  sR
6750: 65 77 72 69 74 65 2e 70 53 72 63 20 3d 20 70 53  ewrite.pSrc = pS
6760: 72 63 3b 0a 0a 20 20 73 57 61 6c 6b 65 72 2e 70  rc;..  sWalker.p
6770: 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
6780: 20 20 73 57 61 6c 6b 65 72 2e 78 45 78 70 72 43    sWalker.xExprC
6790: 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74  allback = select
67a0: 57 69 6e 64 6f 77 52 65 77 72 69 74 65 45 78 70  WindowRewriteExp
67b0: 72 43 62 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 78  rCb;.  sWalker.x
67c0: 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
67d0: 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77   selectWindowRew
67e0: 72 69 74 65 53 65 6c 65 63 74 43 62 3b 0a 20 20  riteSelectCb;.  
67f0: 73 57 61 6c 6b 65 72 2e 75 2e 70 52 65 77 72 69  sWalker.u.pRewri
6800: 74 65 20 3d 20 26 73 52 65 77 72 69 74 65 3b 0a  te = &sRewrite;.
6810: 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33  .  (void)sqlite3
6820: 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 26 73 57  WalkExprList(&sW
6830: 61 6c 6b 65 72 2c 20 70 45 4c 69 73 74 29 3b 0a  alker, pEList);.
6840: 0a 20 20 2a 70 70 53 75 62 20 3d 20 73 52 65 77  .  *ppSub = sRew
6850: 72 69 74 65 2e 70 53 75 62 3b 0a 7d 0a 0a 2f 2a  rite.pSub;.}../*
6860: 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 63 6f 70  .** Append a cop
6870: 79 20 6f 66 20 65 61 63 68 20 65 78 70 72 65 73  y of each expres
6880: 73 69 6f 6e 20 69 6e 20 65 78 70 72 65 73 73 69  sion in expressi
6890: 6f 6e 2d 6c 69 73 74 20 70 41 70 70 65 6e 64 20  on-list pAppend 
68a0: 74 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  to.** expression
68b0: 20 6c 69 73 74 20 70 4c 69 73 74 2e 20 52 65 74   list pList. Ret
68c0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
68d0: 20 74 68 65 20 72 65 73 75 6c 74 20 6c 69 73 74   the result list
68e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72  ..*/.static Expr
68f0: 4c 69 73 74 20 2a 65 78 70 72 4c 69 73 74 41 70  List *exprListAp
6900: 70 65 6e 64 4c 69 73 74 28 0a 20 20 50 61 72 73  pendList(.  Pars
6910: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
6920: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
6930: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
6940: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
6950: 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77      /* List to w
6960: 68 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20  hich to append. 
6970: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
6980: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 41 70  .  ExprList *pAp
6990: 70 65 6e 64 20 20 20 20 20 20 20 2f 2a 20 4c 69  pend       /* Li
69a0: 73 74 20 6f 66 20 76 61 6c 75 65 73 20 74 6f 20  st of values to 
69b0: 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65  append. Might be
69c0: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66   NULL */.){.  if
69d0: 28 20 70 41 70 70 65 6e 64 20 29 7b 0a 20 20 20  ( pAppend ){.   
69e0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
69f0: 6e 49 6e 69 74 20 3d 20 70 4c 69 73 74 20 3f 20  nInit = pList ? 
6a00: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
6a10: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
6a20: 3c 70 41 70 70 65 6e 64 2d 3e 6e 45 78 70 72 3b  <pAppend->nExpr;
6a30: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
6a40: 72 20 2a 70 44 75 70 20 3d 20 73 71 6c 69 74 65  r *pDup = sqlite
6a50: 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d  3ExprDup(pParse-
6a60: 3e 64 62 2c 20 70 41 70 70 65 6e 64 2d 3e 61 5b  >db, pAppend->a[
6a70: 69 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  i].pExpr, 0);.  
6a80: 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
6a90: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
6aa0: 64 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c  d(pParse, pList,
6ab0: 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 69 66   pDup);.      if
6ac0: 28 20 70 4c 69 73 74 20 29 20 70 4c 69 73 74 2d  ( pList ) pList-
6ad0: 3e 61 5b 6e 49 6e 69 74 2b 69 5d 2e 73 6f 72 74  >a[nInit+i].sort
6ae0: 4f 72 64 65 72 20 3d 20 70 41 70 70 65 6e 64 2d  Order = pAppend-
6af0: 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
6b00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
6b10: 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
6b20: 0a 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43  .** If the SELEC
6b30: 54 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  T statement pass
6b40: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
6b50: 20 61 72 67 75 6d 65 6e 74 20 64 6f 65 73 20 6e   argument does n
6b60: 6f 74 20 69 6e 76 6f 6b 65 0a 2a 2a 20 61 6e 79  ot invoke.** any
6b70: 20 53 51 4c 20 77 69 6e 64 6f 77 20 66 75 6e 63   SQL window func
6b80: 74 69 6f 6e 73 2c 20 74 68 69 73 20 66 75 6e 63  tions, this func
6b90: 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
6ba0: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 0a   Otherwise, it .
6bb0: 2a 2a 20 72 65 77 72 69 74 65 73 20 74 68 65 20  ** rewrites the 
6bc0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
6bd0: 20 73 6f 20 74 68 61 74 20 77 69 6e 64 6f 77 20   so that window 
6be0: 66 75 6e 63 74 69 6f 6e 20 78 53 74 65 70 20 66  function xStep f
6bf0: 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 61 72 65 20  unctions.** are 
6c00: 69 6e 76 6f 6b 65 64 20 69 6e 20 74 68 65 20 63  invoked in the c
6c10: 6f 72 72 65 63 74 20 6f 72 64 65 72 20 61 73 20  orrect order as 
6c20: 64 65 73 63 72 69 62 65 64 20 75 6e 64 65 72 20  described under 
6c30: 22 53 45 4c 45 43 54 20 52 45 57 52 49 54 49 4e  "SELECT REWRITIN
6c40: 47 22 0a 2a 2a 20 61 74 20 74 68 65 20 74 6f 70  G".** at the top
6c50: 20 6f 66 20 74 68 69 73 20 66 69 6c 65 2e 0a 2a   of this file..*
6c60: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 69 6e  /.int sqlite3Win
6c70: 64 6f 77 52 65 77 72 69 74 65 28 50 61 72 73 65  dowRewrite(Parse
6c80: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
6c90: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d   *p){.  int rc =
6ca0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
6cb0: 28 20 70 2d 3e 70 57 69 6e 20 26 26 20 70 2d 3e  ( p->pWin && p->
6cc0: 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20  pPrior==0 ){.   
6cd0: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
6ce0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
6cf0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  );.    sqlite3 *
6d00: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
6d10: 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75  .    Select *pSu
6d20: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
6d30: 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65     /* The subque
6d40: 72 79 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73  ry */.    SrcLis
6d50: 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  t *pSrc = p->pSr
6d60: 63 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 57 68  c;.    Expr *pWh
6d70: 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ere = p->pWhere;
6d80: 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
6d90: 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
6da0: 6f 75 70 42 79 3b 0a 20 20 20 20 45 78 70 72 20  oupBy;.    Expr 
6db0: 2a 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48  *pHaving = p->pH
6dc0: 61 76 69 6e 67 3b 0a 20 20 20 20 45 78 70 72 4c  aving;.    ExprL
6dd0: 69 73 74 20 2a 70 53 6f 72 74 20 3d 20 30 3b 0a  ist *pSort = 0;.
6de0: 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
6df0: 53 75 62 6c 69 73 74 20 3d 20 30 3b 20 20 20 20  Sublist = 0;    
6e00: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
6e10: 20 6c 69 73 74 20 66 6f 72 20 73 75 62 2d 71 75   list for sub-qu
6e20: 65 72 79 20 2a 2f 0a 20 20 20 20 57 69 6e 64 6f  ery */.    Windo
6e30: 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57  w *pMWin = p->pW
6e40: 69 6e 3b 20 20 20 20 20 20 2f 2a 20 4d 61 73 74  in;      /* Mast
6e50: 65 72 20 77 69 6e 64 6f 77 20 6f 62 6a 65 63 74  er window object
6e60: 20 2a 2f 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a   */.    Window *
6e70: 70 57 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20  pWin;           
6e80: 20 20 20 20 20 20 2f 2a 20 57 69 6e 64 6f 77 20        /* Window 
6e90: 6f 62 6a 65 63 74 20 69 74 65 72 61 74 6f 72 20  object iterator 
6ea0: 2a 2f 0a 0a 20 20 20 20 70 2d 3e 70 53 72 63 20  */..    p->pSrc 
6eb0: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65  = 0;.    p->pWhe
6ec0: 72 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  re = 0;.    p->p
6ed0: 47 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20 20  GroupBy = 0;.   
6ee0: 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b   p->pHaving = 0;
6ef0: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
6f00: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
6f10: 75 73 65 20 66 6f 72 20 74 68 65 20 73 75 62 2d  use for the sub-
6f20: 73 65 6c 65 63 74 2e 20 54 68 69 73 20 69 73 20  select. This is 
6f30: 74 68 65 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f  the concatenatio
6f40: 6e 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  n.    ** of the 
6f50: 77 69 6e 64 6f 77 20 50 41 52 54 49 54 49 4f 4e  window PARTITION
6f60: 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 63 6c   and ORDER BY cl
6f70: 61 75 73 65 73 2e 20 54 68 65 6e 2c 20 69 66 20  auses. Then, if 
6f80: 74 68 69 73 20 6d 61 6b 65 73 20 69 74 0a 20 20  this makes it.  
6f90: 20 20 2a 2a 20 72 65 64 75 6e 64 61 6e 74 2c 20    ** redundant, 
6fa0: 72 65 6d 6f 76 65 20 74 68 65 20 4f 52 44 45 52  remove the ORDER
6fb0: 20 42 59 20 66 72 6f 6d 20 74 68 65 20 70 61 72   BY from the par
6fc0: 65 6e 74 20 53 45 4c 45 43 54 2e 20 20 2a 2f 0a  ent SELECT.  */.
6fd0: 20 20 20 20 70 53 6f 72 74 20 3d 20 73 71 6c 69      pSort = sqli
6fe0: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
6ff0: 62 2c 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69  b, pMWin->pParti
7000: 74 69 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 70 53  tion, 0);.    pS
7010: 6f 72 74 20 3d 20 65 78 70 72 4c 69 73 74 41 70  ort = exprListAp
7020: 70 65 6e 64 4c 69 73 74 28 70 50 61 72 73 65 2c  pendList(pParse,
7030: 20 70 53 6f 72 74 2c 20 70 4d 57 69 6e 2d 3e 70   pSort, pMWin->p
7040: 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66  OrderBy);.    if
7050: 28 20 70 53 6f 72 74 20 26 26 20 70 2d 3e 70 4f  ( pSort && p->pO
7060: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
7070: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c  if( sqlite3ExprL
7080: 69 73 74 43 6f 6d 70 61 72 65 28 70 53 6f 72 74  istCompare(pSort
7090: 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d  , p->pOrderBy, -
70a0: 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1)==0 ){.       
70b0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
70c0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f  Delete(db, p->pO
70d0: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 20  rderBy);.       
70e0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30   p->pOrderBy = 0
70f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7100: 0a 20 20 20 20 2f 2a 20 41 73 73 69 67 6e 20 61  .    /* Assign a
7110: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
7120: 6f 72 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  or the ephemeral
7130: 20 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20 62   table used to b
7140: 75 66 66 65 72 20 72 6f 77 73 2e 0a 20 20 20 20  uffer rows..    
7150: 2a 2a 20 54 68 65 20 4f 70 65 6e 45 70 68 65 6d  ** The OpenEphem
7160: 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  eral instruction
7170: 20 69 73 20 63 6f 64 65 64 20 6c 61 74 65 72 2c   is coded later,
7180: 20 61 66 74 65 72 20 69 74 20 69 73 20 6b 6e 6f   after it is kno
7190: 77 6e 20 68 6f 77 0a 20 20 20 20 2a 2a 20 6d 61  wn how.    ** ma
71a0: 6e 79 20 63 6f 6c 75 6d 6e 73 20 74 68 65 20 74  ny columns the t
71b0: 61 62 6c 65 20 77 69 6c 6c 20 68 61 76 65 2e 20  able will have. 
71c0: 20 2a 2f 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 69   */.    pMWin->i
71d0: 45 70 68 43 73 72 20 3d 20 70 50 61 72 73 65 2d  EphCsr = pParse-
71e0: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70 50 61  >nTab++;.    pPa
71f0: 72 73 65 2d 3e 6e 54 61 62 20 2b 3d 20 33 3b 0a  rse->nTab += 3;.
7200: 0a 20 20 20 20 73 65 6c 65 63 74 57 69 6e 64 6f  .    selectWindo
7210: 77 52 65 77 72 69 74 65 45 4c 69 73 74 28 70 50  wRewriteEList(pP
7220: 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 70 53 72  arse, pMWin, pSr
7230: 63 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 26 70  c, p->pEList, &p
7240: 53 75 62 6c 69 73 74 29 3b 0a 20 20 20 20 73 65  Sublist);.    se
7250: 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74  lectWindowRewrit
7260: 65 45 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  eEList(pParse, p
7270: 4d 57 69 6e 2c 20 70 53 72 63 2c 20 70 2d 3e 70  MWin, pSrc, p->p
7280: 4f 72 64 65 72 42 79 2c 20 26 70 53 75 62 6c 69  OrderBy, &pSubli
7290: 73 74 29 3b 0a 20 20 20 20 70 4d 57 69 6e 2d 3e  st);.    pMWin->
72a0: 6e 42 75 66 66 65 72 43 6f 6c 20 3d 20 28 70 53  nBufferCol = (pS
72b0: 75 62 6c 69 73 74 20 3f 20 70 53 75 62 6c 69 73  ublist ? pSublis
72c0: 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 0a  t->nExpr : 0);..
72d0: 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68      /* Append th
72e0: 65 20 50 41 52 54 49 54 49 4f 4e 20 42 59 20 61  e PARTITION BY a
72f0: 6e 64 20 4f 52 44 45 52 20 42 59 20 65 78 70 72  nd ORDER BY expr
7300: 65 73 73 69 6f 6e 73 20 74 6f 20 74 68 65 20 74  essions to the t
7310: 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 75  o the .    ** su
7320: 62 2d 73 65 6c 65 63 74 20 65 78 70 72 65 73 73  b-select express
7330: 69 6f 6e 20 6c 69 73 74 2e 20 54 68 65 79 20 61  ion list. They a
7340: 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 66  re required to f
7350: 69 67 75 72 65 20 6f 75 74 20 77 68 65 72 65 20  igure out where 
7360: 0a 20 20 20 20 2a 2a 20 62 6f 75 6e 64 61 72 69  .    ** boundari
7370: 65 73 20 66 6f 72 20 70 61 72 74 69 74 69 6f 6e  es for partition
7380: 73 20 61 6e 64 20 73 65 74 73 20 6f 66 20 70 65  s and sets of pe
7390: 65 72 20 72 6f 77 73 20 6c 69 65 2e 20 20 2a 2f  er rows lie.  */
73a0: 0a 20 20 20 20 70 53 75 62 6c 69 73 74 20 3d 20  .    pSublist = 
73b0: 65 78 70 72 4c 69 73 74 41 70 70 65 6e 64 4c 69  exprListAppendLi
73c0: 73 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 6c  st(pParse, pSubl
73d0: 69 73 74 2c 20 70 4d 57 69 6e 2d 3e 70 50 61 72  ist, pMWin->pPar
73e0: 74 69 74 69 6f 6e 29 3b 0a 20 20 20 20 70 53 75  tition);.    pSu
73f0: 62 6c 69 73 74 20 3d 20 65 78 70 72 4c 69 73 74  blist = exprList
7400: 41 70 70 65 6e 64 4c 69 73 74 28 70 50 61 72 73  AppendList(pPars
7410: 65 2c 20 70 53 75 62 6c 69 73 74 2c 20 70 4d 57  e, pSublist, pMW
7420: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 0a  in->pOrderBy);..
7430: 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68      /* Append th
7440: 65 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73  e arguments pass
7450: 65 64 20 74 6f 20 65 61 63 68 20 77 69 6e 64 6f  ed to each windo
7460: 77 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 74 68  w function to th
7470: 65 0a 20 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c  e.    ** sub-sel
7480: 65 63 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  ect expression l
7490: 69 73 74 2e 20 41 6c 73 6f 20 61 6c 6c 6f 63 61  ist. Also alloca
74a0: 74 65 20 74 77 6f 20 72 65 67 69 73 74 65 72 73  te two registers
74b0: 20 66 6f 72 20 65 61 63 68 0a 20 20 20 20 2a 2a   for each.    **
74c0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
74d0: 20 2d 20 6f 6e 65 20 66 6f 72 20 74 68 65 20 61   - one for the a
74e0: 63 63 75 6d 75 6c 61 74 6f 72 2c 20 61 6e 6f 74  ccumulator, anot
74f0: 68 65 72 20 66 6f 72 20 69 6e 74 65 72 69 6d 0a  her for interim.
7500: 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 73 2e 20      ** results. 
7510: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 57 69 6e   */.    for(pWin
7520: 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57  =pMWin; pWin; pW
7530: 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69  in=pWin->pNextWi
7540: 6e 29 7b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e  n){.      pWin->
7550: 69 41 72 67 43 6f 6c 20 3d 20 28 70 53 75 62 6c  iArgCol = (pSubl
7560: 69 73 74 20 3f 20 70 53 75 62 6c 69 73 74 2d 3e  ist ? pSublist->
7570: 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20  nExpr : 0);.    
7580: 20 20 70 53 75 62 6c 69 73 74 20 3d 20 65 78 70    pSublist = exp
7590: 72 4c 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28  rListAppendList(
75a0: 70 50 61 72 73 65 2c 20 70 53 75 62 6c 69 73 74  pParse, pSublist
75b0: 2c 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e  , pWin->pOwner->
75c0: 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  x.pList);.      
75d0: 69 66 28 20 70 57 69 6e 2d 3e 70 46 69 6c 74 65  if( pWin->pFilte
75e0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  r ){.        Exp
75f0: 72 20 2a 70 46 69 6c 74 65 72 20 3d 20 73 71 6c  r *pFilter = sql
7600: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
7610: 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72 2c 20 30  pWin->pFilter, 0
7620: 29 3b 0a 20 20 20 20 20 20 20 20 70 53 75 62 6c  );.        pSubl
7630: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
7640: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
7650: 73 65 2c 20 70 53 75 62 6c 69 73 74 2c 20 70 46  se, pSublist, pF
7660: 69 6c 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  ilter);.      }.
7670: 20 20 20 20 20 20 70 57 69 6e 2d 3e 72 65 67 41        pWin->regA
7680: 63 63 75 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  ccum = ++pParse-
7690: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 57 69  >nMem;.      pWi
76a0: 6e 2d 3e 72 65 67 52 65 73 75 6c 74 20 3d 20 2b  n->regResult = +
76b0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
76c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
76d0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
76e0: 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41  l, 0, pWin->regA
76f0: 63 63 75 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ccum);.    }..  
7700: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
7710: 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20   no ORDER BY or 
7720: 50 41 52 54 49 54 49 4f 4e 20 42 59 20 63 6c 61  PARTITION BY cla
7730: 75 73 65 2c 20 61 6e 64 20 74 68 65 20 77 69 6e  use, and the win
7740: 64 6f 77 0a 20 20 20 20 2a 2a 20 66 75 6e 63 74  dow.    ** funct
7750: 69 6f 6e 20 61 63 63 65 70 74 73 20 7a 65 72 6f  ion accepts zero
7760: 20 61 72 67 75 6d 65 6e 74 73 2c 20 61 6e 64 20   arguments, and 
7770: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 74 68  there are no oth
7780: 65 72 20 63 6f 6c 75 6d 6e 73 0a 20 20 20 20 2a  er columns.    *
7790: 2a 20 73 65 6c 65 63 74 65 64 20 28 65 2e 67 2e  * selected (e.g.
77a0: 20 22 53 45 4c 45 43 54 20 72 6f 77 5f 6e 75 6d   "SELECT row_num
77b0: 62 65 72 28 29 20 4f 56 45 52 20 28 29 20 46 52  ber() OVER () FR
77c0: 4f 4d 20 74 31 22 29 2c 20 69 74 20 69 73 20 70  OM t1"), it is p
77d0: 6f 73 73 69 62 6c 65 0a 20 20 20 20 2a 2a 20 74  ossible.    ** t
77e0: 68 61 74 20 70 53 75 62 6c 69 73 74 20 69 73 20  hat pSublist is 
77f0: 73 74 69 6c 6c 20 4e 55 4c 4c 20 68 65 72 65 2e  still NULL here.
7800: 20 41 64 64 20 61 20 63 6f 6e 73 74 61 6e 74 20   Add a constant 
7810: 65 78 70 72 65 73 73 69 6f 6e 20 68 65 72 65 20  expression here 
7820: 74 6f 20 0a 20 20 20 20 2a 2a 20 6b 65 65 70 20  to .    ** keep 
7830: 65 76 65 72 79 74 68 69 6e 67 20 6c 65 67 61 6c  everything legal
7840: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 0a   in this case. .
7850: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
7860: 53 75 62 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  Sublist==0 ){.  
7870: 20 20 20 20 70 53 75 62 6c 69 73 74 20 3d 20 73      pSublist = s
7880: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
7890: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20  pend(pParse, 0, 
78a0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
78b0: 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20  e3ExprAlloc(db, 
78c0: 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73 71 6c  TK_INTEGER, &sql
78d0: 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 30 5d  ite3IntTokens[0]
78e0: 2c 20 30 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  , 0).      );.  
78f0: 20 20 7d 0a 0a 20 20 20 20 70 53 75 62 20 3d 20    }..    pSub = 
7900: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77  sqlite3SelectNew
7910: 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  (.        pParse
7920: 2c 20 70 53 75 62 6c 69 73 74 2c 20 70 53 72 63  , pSublist, pSrc
7930: 2c 20 70 57 68 65 72 65 2c 20 70 47 72 6f 75 70  , pWhere, pGroup
7940: 42 79 2c 20 70 48 61 76 69 6e 67 2c 20 70 53 6f  By, pHaving, pSo
7950: 72 74 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a  rt, 0, 0.    );.
7960: 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 73 71      p->pSrc = sq
7970: 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
7980: 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c  nd(pParse, 0, 0,
7990: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e   0);.    if( p->
79a0: 70 53 72 63 20 29 7b 0a 20 20 20 20 20 20 70 2d  pSrc ){.      p-
79b0: 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c  >pSrc->a[0].pSel
79c0: 65 63 74 20 3d 20 70 53 75 62 3b 0a 20 20 20 20  ect = pSub;.    
79d0: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
79e0: 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50  AssignCursors(pP
79f0: 61 72 73 65 2c 20 70 2d 3e 70 53 72 63 29 3b 0a  arse, p->pSrc);.
7a00: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
7a10: 33 45 78 70 61 6e 64 53 75 62 71 75 65 72 79 28  3ExpandSubquery(
7a20: 70 50 61 72 73 65 2c 20 26 70 2d 3e 70 53 72 63  pParse, &p->pSrc
7a30: 2d 3e 61 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  ->a[0]) ){.     
7a40: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
7a50: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  OMEM;.      }els
7a60: 65 7b 0a 20 20 20 20 20 20 20 20 70 53 75 62 2d  e{.        pSub-
7a70: 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
7a80: 45 78 70 61 6e 64 65 64 3b 0a 20 20 20 20 20 20  Expanded;.      
7a90: 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d    p->selFlags &=
7aa0: 20 7e 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a   ~SF_Aggregate;.
7ab0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
7ac0: 65 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65  electPrep(pParse
7ad0: 2c 20 70 53 75 62 2c 20 30 29 3b 0a 20 20 20 20  , pSub, 0);.    
7ae0: 20 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69 74    }..      sqlit
7af0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
7b00: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
7b10: 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
7b20: 2c 20 70 53 75 62 6c 69 73 74 2d 3e 6e 45 78 70  , pSublist->nExp
7b30: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
7b40: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7b50: 50 5f 4f 70 65 6e 44 75 70 2c 20 70 4d 57 69 6e  P_OpenDup, pMWin
7b60: 2d 3e 69 45 70 68 43 73 72 2b 31 2c 20 70 4d 57  ->iEphCsr+1, pMW
7b70: 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20  in->iEphCsr);.  
7b80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7b90: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
7ba0: 44 75 70 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  Dup, pMWin->iEph
7bb0: 43 73 72 2b 32 2c 20 70 4d 57 69 6e 2d 3e 69 45  Csr+2, pMWin->iE
7bc0: 70 68 43 73 72 29 3b 0a 20 20 20 20 20 20 73 71  phCsr);.      sq
7bd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7be0: 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70  v, OP_OpenDup, p
7bf0: 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2b 33 2c  MWin->iEphCsr+3,
7c00: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29   pMWin->iEphCsr)
7c10: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7c20: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
7c30: 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 29  Delete(db, pSub)
7c40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
7c50: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
7c60: 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e   ) rc = SQLITE_N
7c70: 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  OMEM;.  }..  ret
7c80: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
7c90: 20 46 72 65 65 20 74 68 65 20 57 69 6e 64 6f 77   Free the Window
7ca0: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
7cb0: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
7cc0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ument..*/.void s
7cd0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65  qlite3WindowDele
7ce0: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
7cf0: 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 69 66  Window *p){.  if
7d00: 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( p ){.    sqlit
7d10: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
7d20: 20 70 2d 3e 70 46 69 6c 74 65 72 29 3b 0a 20 20   p->pFilter);.  
7d30: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
7d40: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
7d50: 50 61 72 74 69 74 69 6f 6e 29 3b 0a 20 20 20 20  Partition);.    
7d60: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
7d70: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
7d80: 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71 6c 69  derBy);.    sqli
7d90: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
7da0: 2c 20 70 2d 3e 70 45 6e 64 29 3b 0a 20 20 20 20  , p->pEnd);.    
7db0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
7dc0: 65 28 64 62 2c 20 70 2d 3e 70 53 74 61 72 74 29  e(db, p->pStart)
7dd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
7de0: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4e 61 6d 65  ree(db, p->zName
7df0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
7e00: 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 42 61 73  Free(db, p->zBas
7e10: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  e);.    sqlite3D
7e20: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
7e30: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
7e40: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
7e50: 6f 66 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74  of Window object
7e60: 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 74 68  s starting at th
7e70: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
7e80: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
7e90: 65 33 57 69 6e 64 6f 77 4c 69 73 74 44 65 6c 65  e3WindowListDele
7ea0: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
7eb0: 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 77 68  Window *p){.  wh
7ec0: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 57 69  ile( p ){.    Wi
7ed0: 6e 64 6f 77 20 2a 70 4e 65 78 74 20 3d 20 70 2d  ndow *pNext = p-
7ee0: 3e 70 4e 65 78 74 57 69 6e 3b 0a 20 20 20 20 73  >pNextWin;.    s
7ef0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65  qlite3WindowDele
7f00: 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 70  te(db, p);.    p
7f10: 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 7d 0a   = pNext;.  }.}.
7f20: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  ./*.** The argum
7f30: 65 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ent expression i
7f40: 73 20 61 6e 20 50 52 45 43 45 44 49 4e 47 20 6f  s an PRECEDING o
7f50: 72 20 46 4f 4c 4c 4f 57 49 4e 47 20 6f 66 66 73  r FOLLOWING offs
7f60: 65 74 2e 20 20 54 68 65 0a 2a 2a 20 76 61 6c 75  et.  The.** valu
7f70: 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f  e should be a no
7f80: 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67  n-negative integ
7f90: 65 72 2e 20 20 49 66 20 74 68 65 20 76 61 6c 75  er.  If the valu
7fa0: 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 63 6f  e is not a.** co
7fb0: 6e 73 74 61 6e 74 2c 20 63 68 61 6e 67 65 20 69  nstant, change i
7fc0: 74 20 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 65 20  t to NULL.  The 
7fd0: 66 61 63 74 20 74 68 61 74 20 69 74 20 69 73 20  fact that it is 
7fe0: 74 68 65 6e 20 61 20 6e 6f 6e 2d 6e 65 67 61 74  then a non-negat
7ff0: 69 76 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 77  ive.** integer w
8000: 69 6c 6c 20 62 65 20 63 61 75 67 68 74 20 6c 61  ill be caught la
8010: 74 65 72 2e 20 20 42 75 74 20 69 74 20 69 73 20  ter.  But it is 
8020: 69 6d 70 6f 72 74 61 6e 74 20 6e 6f 74 20 74 6f  important not to
8030: 20 6c 65 61 76 65 0a 2a 2a 20 76 61 72 69 61 62   leave.** variab
8040: 6c 65 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65  le values in the
8050: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
8060: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72  ..*/.static Expr
8070: 20 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4f   *sqlite3WindowO
8080: 66 66 73 65 74 45 78 70 72 28 50 61 72 73 65 20  ffsetExpr(Parse 
8090: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
80a0: 45 78 70 72 29 7b 0a 20 20 69 66 28 20 30 3d 3d  Expr){.  if( 0==
80b0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
80c0: 73 74 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a  stant(pExpr) ){.
80d0: 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d      if( IN_RENAM
80e0: 45 5f 4f 42 4a 45 43 54 20 29 20 73 71 6c 69 74  E_OBJECT ) sqlit
80f0: 65 33 52 65 6e 61 6d 65 45 78 70 72 55 6e 6d 61  e3RenameExprUnma
8100: 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  p(pParse, pExpr)
8110: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
8120: 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
8130: 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  db, pExpr);.    
8140: 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
8150: 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d  xprAlloc(pParse-
8160: 3e 64 62 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c  >db, TK_NULL, 0,
8170: 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
8180: 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pExpr;.}../*.*
8190: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72  * Allocate and r
81a0: 65 74 75 72 6e 20 61 20 6e 65 77 20 57 69 6e 64  eturn a new Wind
81b0: 6f 77 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69  ow object descri
81c0: 62 69 6e 67 20 61 20 57 69 6e 64 6f 77 20 44 65  bing a Window De
81d0: 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 57 69 6e  finition..*/.Win
81e0: 64 6f 77 20 2a 73 71 6c 69 74 65 33 57 69 6e 64  dow *sqlite3Wind
81f0: 6f 77 41 6c 6c 6f 63 28 0a 20 20 50 61 72 73 65  owAlloc(.  Parse
8200: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
8210: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
8220: 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 2c 20  */.  int eType, 
8230: 20 20 20 20 20 20 20 2f 2a 20 46 72 61 6d 65 20         /* Frame 
8240: 74 79 70 65 2e 20 54 4b 5f 52 41 4e 47 45 2c 20  type. TK_RANGE, 
8250: 54 4b 5f 52 4f 57 53 2c 20 54 4b 5f 47 52 4f 55  TK_ROWS, TK_GROU
8260: 50 53 2c 20 6f 72 20 30 20 2a 2f 0a 20 20 69 6e  PS, or 0 */.  in
8270: 74 20 65 53 74 61 72 74 2c 20 20 20 20 20 20 20  t eStart,       
8280: 2f 2a 20 53 74 61 72 74 20 74 79 70 65 3a 20 43  /* Start type: C
8290: 55 52 52 45 4e 54 2c 20 50 52 45 43 45 44 49 4e  URRENT, PRECEDIN
82a0: 47 2c 20 46 4f 4c 4c 4f 57 49 4e 47 2c 20 55 4e  G, FOLLOWING, UN
82b0: 42 4f 55 4e 44 45 44 20 2a 2f 0a 20 20 45 78 70  BOUNDED */.  Exp
82c0: 72 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20 2f  r *pStart,     /
82d0: 2a 20 53 74 61 72 74 20 77 69 6e 64 6f 77 20 73  * Start window s
82e0: 69 7a 65 20 69 66 20 54 4b 5f 50 52 45 43 45 44  ize if TK_PRECED
82f0: 49 4e 47 20 6f 72 20 46 4f 4c 4c 4f 57 49 4e 47  ING or FOLLOWING
8300: 20 2a 2f 0a 20 20 69 6e 74 20 65 45 6e 64 2c 20   */.  int eEnd, 
8310: 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 74          /* End t
8320: 79 70 65 3a 20 43 55 52 52 45 4e 54 2c 20 46 4f  ype: CURRENT, FO
8330: 4c 4c 4f 57 49 4e 47 2c 20 54 4b 5f 55 4e 42 4f  LLOWING, TK_UNBO
8340: 55 4e 44 45 44 2c 20 50 52 45 43 45 44 49 4e 47  UNDED, PRECEDING
8350: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 6e 64   */.  Expr *pEnd
8360: 2c 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 77  ,       /* End w
8370: 69 6e 64 6f 77 20 73 69 7a 65 20 69 66 20 54 4b  indow size if TK
8380: 5f 46 4f 4c 4c 4f 57 49 4e 47 20 6f 72 20 50 52  _FOLLOWING or PR
8390: 45 43 45 44 49 4e 47 20 2a 2f 0a 20 20 75 38 20  ECEDING */.  u8 
83a0: 65 45 78 63 6c 75 64 65 20 20 20 20 20 20 20 2f  eExclude       /
83b0: 2a 20 45 58 43 4c 55 44 45 20 63 6c 61 75 73 65  * EXCLUDE clause
83c0: 20 2a 2f 0a 29 7b 0a 20 20 57 69 6e 64 6f 77 20   */.){.  Window 
83d0: 2a 70 57 69 6e 20 3d 20 30 3b 0a 20 20 69 6e 74  *pWin = 0;.  int
83e0: 20 62 49 6d 70 6c 69 63 69 74 46 72 61 6d 65 20   bImplicitFrame 
83f0: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65  = 0;..  /* Parse
8400: 72 20 61 73 73 75 72 65 73 20 74 68 65 20 66 6f  r assures the fo
8410: 6c 6c 6f 77 69 6e 67 3a 20 2a 2f 0a 20 20 61 73  llowing: */.  as
8420: 73 65 72 74 28 20 65 54 79 70 65 3d 3d 30 20 7c  sert( eType==0 |
8430: 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47  | eType==TK_RANG
8440: 45 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 52  E || eType==TK_R
8450: 4f 57 53 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b  OWS || eType==TK
8460: 5f 47 52 4f 55 50 53 20 29 3b 0a 20 20 61 73 73  _GROUPS );.  ass
8470: 65 72 74 28 20 65 53 74 61 72 74 3d 3d 54 4b 5f  ert( eStart==TK_
8480: 43 55 52 52 45 4e 54 20 7c 7c 20 65 53 74 61 72  CURRENT || eStar
8490: 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 0a  t==TK_PRECEDING.
84a0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 53             || eS
84b0: 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44  tart==TK_UNBOUND
84c0: 45 44 20 7c 7c 20 65 53 74 61 72 74 3d 3d 54 4b  ED || eStart==TK
84d0: 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 3b 0a 20 20  _FOLLOWING );.  
84e0: 61 73 73 65 72 74 28 20 65 45 6e 64 3d 3d 54 4b  assert( eEnd==TK
84f0: 5f 43 55 52 52 45 4e 54 20 7c 7c 20 65 45 6e 64  _CURRENT || eEnd
8500: 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 0a 20  ==TK_FOLLOWING. 
8510: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 45 6e            || eEn
8520: 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20  d==TK_UNBOUNDED 
8530: 7c 7c 20 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43  || eEnd==TK_PREC
8540: 45 44 49 4e 47 20 29 3b 0a 20 20 61 73 73 65 72  EDING );.  asser
8550: 74 28 20 28 65 53 74 61 72 74 3d 3d 54 4b 5f 50  t( (eStart==TK_P
8560: 52 45 43 45 44 49 4e 47 20 7c 7c 20 65 53 74 61  RECEDING || eSta
8570: 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  rt==TK_FOLLOWING
8580: 29 3d 3d 28 70 53 74 61 72 74 21 3d 30 29 20 29  )==(pStart!=0) )
8590: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 65 45 6e  ;.  assert( (eEn
85a0: 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  d==TK_FOLLOWING 
85b0: 7c 7c 20 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43  || eEnd==TK_PREC
85c0: 45 44 49 4e 47 29 3d 3d 28 70 45 6e 64 21 3d 30  EDING)==(pEnd!=0
85d0: 29 20 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70  ) );..  if( eTyp
85e0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 62 49 6d 70  e==0 ){.    bImp
85f0: 6c 69 63 69 74 46 72 61 6d 65 20 3d 20 31 3b 0a  licitFrame = 1;.
8600: 20 20 20 20 65 54 79 70 65 20 3d 20 54 4b 5f 52      eType = TK_R
8610: 41 4e 47 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ANGE;.  }..  /* 
8620: 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68  Additionally, th
8630: 65 0a 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20  e.  ** starting 
8640: 62 6f 75 6e 64 61 72 79 20 74 79 70 65 20 6d 61  boundary type ma
8650: 79 20 6e 6f 74 20 6f 63 63 75 72 20 65 61 72 6c  y not occur earl
8660: 69 65 72 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ier in the follo
8670: 77 69 6e 67 20 6c 69 73 74 20 74 68 61 6e 0a 20  wing list than. 
8680: 20 2a 2a 20 74 68 65 20 65 6e 64 69 6e 67 20 62   ** the ending b
8690: 6f 75 6e 64 61 72 79 20 74 79 70 65 3a 0a 20 20  oundary type:.  
86a0: 2a 2a 0a 20 20 2a 2a 20 20 20 55 4e 42 4f 55 4e  **.  **   UNBOUN
86b0: 44 45 44 20 50 52 45 43 45 44 49 4e 47 0a 20 20  DED PRECEDING.  
86c0: 2a 2a 20 20 20 3c 65 78 70 72 3e 20 50 52 45 43  **   <expr> PREC
86d0: 45 44 49 4e 47 0a 20 20 2a 2a 20 20 20 43 55 52  EDING.  **   CUR
86e0: 52 45 4e 54 20 52 4f 57 0a 20 20 2a 2a 20 20 20  RENT ROW.  **   
86f0: 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47  <expr> FOLLOWING
8700: 0a 20 20 2a 2a 20 20 20 55 4e 42 4f 55 4e 44 45  .  **   UNBOUNDE
8710: 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20 2a 2a  D FOLLOWING.  **
8720: 0a 20 20 2a 2a 20 54 68 65 20 70 61 72 73 65 72  .  ** The parser
8730: 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 22 55   ensures that "U
8740: 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49  NBOUNDED PRECEDI
8750: 4e 47 22 20 63 61 6e 6e 6f 74 20 62 65 20 75 73  NG" cannot be us
8760: 65 64 20 61 73 20 61 6e 20 65 6e 64 69 6e 67 0a  ed as an ending.
8770: 20 20 2a 2a 20 62 6f 75 6e 64 61 72 79 2c 20 61    ** boundary, a
8780: 6e 64 20 74 68 61 6e 20 22 55 4e 42 4f 55 4e 44  nd than "UNBOUND
8790: 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 22 20 63 61  ED FOLLOWING" ca
87a0: 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 61 73 20  nnot be used as 
87b0: 61 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20  a starting.  ** 
87c0: 66 72 61 6d 65 20 62 6f 75 6e 64 61 72 79 2e 0a  frame boundary..
87d0: 20 20 2a 2f 0a 20 20 69 66 28 20 28 65 53 74 61    */.  if( (eSta
87e0: 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 26  rt==TK_CURRENT &
87f0: 26 20 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45  & eEnd==TK_PRECE
8800: 44 49 4e 47 29 0a 20 20 20 7c 7c 20 28 65 53 74  DING).   || (eSt
8810: 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e  art==TK_FOLLOWIN
8820: 47 20 26 26 20 28 65 45 6e 64 3d 3d 54 4b 5f 50  G && (eEnd==TK_P
8830: 52 45 43 45 44 49 4e 47 20 7c 7c 20 65 45 6e 64  RECEDING || eEnd
8840: 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29 29 0a 20  ==TK_CURRENT)). 
8850: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
8860: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
8870: 22 75 6e 73 75 70 70 6f 72 74 65 64 20 66 72 61  "unsupported fra
8880: 6d 65 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e  me specification
8890: 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 77 69 6e  ");.    goto win
88a0: 64 6f 77 41 6c 6c 6f 63 45 72 72 3b 0a 20 20 7d  dowAllocErr;.  }
88b0: 0a 0a 20 20 70 57 69 6e 20 3d 20 28 57 69 6e 64  ..  pWin = (Wind
88c0: 6f 77 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c  ow*)sqlite3DbMal
88d0: 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e  locZero(pParse->
88e0: 64 62 2c 20 73 69 7a 65 6f 66 28 57 69 6e 64 6f  db, sizeof(Windo
88f0: 77 29 29 3b 0a 20 20 69 66 28 20 70 57 69 6e 3d  w));.  if( pWin=
8900: 3d 30 20 29 20 67 6f 74 6f 20 77 69 6e 64 6f 77  =0 ) goto window
8910: 41 6c 6c 6f 63 45 72 72 3b 0a 20 20 70 57 69 6e  AllocErr;.  pWin
8920: 2d 3e 65 46 72 6d 54 79 70 65 20 3d 20 65 54 79  ->eFrmType = eTy
8930: 70 65 3b 0a 20 20 70 57 69 6e 2d 3e 65 53 74 61  pe;.  pWin->eSta
8940: 72 74 20 3d 20 65 53 74 61 72 74 3b 0a 20 20 70  rt = eStart;.  p
8950: 57 69 6e 2d 3e 65 45 6e 64 20 3d 20 65 45 6e 64  Win->eEnd = eEnd
8960: 3b 0a 20 20 69 66 28 20 65 45 78 63 6c 75 64 65  ;.  if( eExclude
8970: 3d 3d 30 20 26 26 20 4f 70 74 69 6d 69 7a 61 74  ==0 && Optimizat
8980: 69 6f 6e 44 69 73 61 62 6c 65 64 28 70 50 61 72  ionDisabled(pPar
8990: 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 57  se->db, SQLITE_W
89a0: 69 6e 64 6f 77 46 75 6e 63 29 20 29 7b 0a 20 20  indowFunc) ){.  
89b0: 20 20 65 45 78 63 6c 75 64 65 20 3d 20 54 4b 5f    eExclude = TK_
89c0: 4e 4f 3b 0a 20 20 7d 0a 20 20 70 57 69 6e 2d 3e  NO;.  }.  pWin->
89d0: 65 45 78 63 6c 75 64 65 20 3d 20 65 45 78 63 6c  eExclude = eExcl
89e0: 75 64 65 3b 0a 20 20 70 57 69 6e 2d 3e 62 49 6d  ude;.  pWin->bIm
89f0: 70 6c 69 63 69 74 46 72 61 6d 65 20 3d 20 62 49  plicitFrame = bI
8a00: 6d 70 6c 69 63 69 74 46 72 61 6d 65 3b 0a 20 20  mplicitFrame;.  
8a10: 70 57 69 6e 2d 3e 70 45 6e 64 20 3d 20 73 71 6c  pWin->pEnd = sql
8a20: 69 74 65 33 57 69 6e 64 6f 77 4f 66 66 73 65 74  ite3WindowOffset
8a30: 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 6e  Expr(pParse, pEn
8a40: 64 29 3b 0a 20 20 70 57 69 6e 2d 3e 70 53 74 61  d);.  pWin->pSta
8a50: 72 74 20 3d 20 73 71 6c 69 74 65 33 57 69 6e 64  rt = sqlite3Wind
8a60: 6f 77 4f 66 66 73 65 74 45 78 70 72 28 70 50 61  owOffsetExpr(pPa
8a70: 72 73 65 2c 20 70 53 74 61 72 74 29 3b 0a 20 20  rse, pStart);.  
8a80: 72 65 74 75 72 6e 20 70 57 69 6e 3b 0a 0a 77 69  return pWin;..wi
8a90: 6e 64 6f 77 41 6c 6c 6f 63 45 72 72 3a 0a 20 20  ndowAllocErr:.  
8aa0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
8ab0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45  e(pParse->db, pE
8ac0: 6e 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  nd);.  sqlite3Ex
8ad0: 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  prDelete(pParse-
8ae0: 3e 64 62 2c 20 70 53 74 61 72 74 29 3b 0a 20 20  >db, pStart);.  
8af0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
8b00: 2a 2a 20 41 74 74 61 63 68 20 50 41 52 54 49 54  ** Attach PARTIT
8b10: 49 4f 4e 20 61 6e 64 20 4f 52 44 45 52 20 42 59  ION and ORDER BY
8b20: 20 63 6c 61 75 73 65 73 20 70 50 61 72 74 69 74   clauses pPartit
8b30: 69 6f 6e 20 61 6e 64 20 70 4f 72 64 65 72 42 79  ion and pOrderBy
8b40: 20 74 6f 20 77 69 6e 64 6f 77 0a 2a 2a 20 70 57   to window.** pW
8b50: 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 70 61 72  in. Also, if par
8b60: 61 6d 65 74 65 72 20 70 42 61 73 65 20 69 73 20  ameter pBase is 
8b70: 6e 6f 74 20 4e 55 4c 4c 2c 20 73 65 74 20 70 57  not NULL, set pW
8b80: 69 6e 2d 3e 7a 42 61 73 65 20 74 6f 20 74 68 65  in->zBase to the
8b90: 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 6e  .** equivalent n
8ba0: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
8bb0: 72 69 6e 67 2e 0a 2a 2f 0a 57 69 6e 64 6f 77 20  ring..*/.Window 
8bc0: 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 41 73  *sqlite3WindowAs
8bd0: 73 65 6d 62 6c 65 28 0a 20 20 50 61 72 73 65 20  semble(.  Parse 
8be0: 2a 70 50 61 72 73 65 2c 20 0a 20 20 57 69 6e 64  *pParse, .  Wind
8bf0: 6f 77 20 2a 70 57 69 6e 2c 20 0a 20 20 45 78 70  ow *pWin, .  Exp
8c00: 72 4c 69 73 74 20 2a 70 50 61 72 74 69 74 69 6f  rList *pPartitio
8c10: 6e 2c 20 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  n, .  ExprList *
8c20: 70 4f 72 64 65 72 42 79 2c 20 0a 20 20 54 6f 6b  pOrderBy, .  Tok
8c30: 65 6e 20 2a 70 42 61 73 65 0a 29 7b 0a 20 20 69  en *pBase.){.  i
8c40: 66 28 20 70 57 69 6e 20 29 7b 0a 20 20 20 20 70  f( pWin ){.    p
8c50: 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20  Win->pPartition 
8c60: 3d 20 70 50 61 72 74 69 74 69 6f 6e 3b 0a 20 20  = pPartition;.  
8c70: 20 20 70 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79    pWin->pOrderBy
8c80: 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20   = pOrderBy;.   
8c90: 20 69 66 28 20 70 42 61 73 65 20 29 7b 0a 20 20   if( pBase ){.  
8ca0: 20 20 20 20 70 57 69 6e 2d 3e 7a 42 61 73 65 20      pWin->zBase 
8cb0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
8cc0: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
8cd0: 42 61 73 65 2d 3e 7a 2c 20 70 42 61 73 65 2d 3e  Base->z, pBase->
8ce0: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  n);.    }.  }els
8cf0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  e{.    sqlite3Ex
8d00: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  prListDelete(pPa
8d10: 72 73 65 2d 3e 64 62 2c 20 70 50 61 72 74 69 74  rse->db, pPartit
8d20: 69 6f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ion);.    sqlite
8d30: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
8d40: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64  pParse->db, pOrd
8d50: 65 72 42 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74  erBy);.  }.  ret
8d60: 75 72 6e 20 70 57 69 6e 3b 0a 7d 0a 0a 2f 2a 0a  urn pWin;.}../*.
8d70: 2a 2a 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 20  ** Window *pWin 
8d80: 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 63 72  has just been cr
8d90: 65 61 74 65 64 20 66 72 6f 6d 20 61 20 57 49 4e  eated from a WIN
8da0: 44 4f 57 20 63 6c 61 75 73 65 2e 20 54 6f 6b 6e  DOW clause. Tokn
8db0: 65 20 70 42 61 73 65 0a 2a 2a 20 69 73 20 74 68  e pBase.** is th
8dc0: 65 20 62 61 73 65 20 77 69 6e 64 6f 77 2e 20 45  e base window. E
8dd0: 61 72 6c 69 65 72 20 77 69 6e 64 6f 77 73 20 66  arlier windows f
8de0: 72 6f 6d 20 74 68 65 20 73 61 6d 65 20 57 49 4e  rom the same WIN
8df0: 44 4f 57 20 63 6c 61 75 73 65 20 61 72 65 0a 2a  DOW clause are.*
8e00: 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  * stored in the 
8e10: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72  linked list star
8e20: 74 69 6e 67 20 61 74 20 70 57 69 6e 2d 3e 70 4e  ting at pWin->pN
8e30: 65 78 74 57 69 6e 2e 20 54 68 69 73 20 66 75 6e  extWin. This fun
8e40: 63 74 69 6f 6e 0a 2a 2a 20 65 69 74 68 65 72 20  ction.** either 
8e50: 75 70 64 61 74 65 73 20 2a 70 57 69 6e 20 61 63  updates *pWin ac
8e60: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 62  cording to the b
8e70: 61 73 65 20 73 70 65 63 69 66 69 63 61 74 69 6f  ase specificatio
8e80: 6e 2c 20 6f 72 20 65 6c 73 65 0a 2a 2a 20 6c 65  n, or else.** le
8e90: 61 76 65 73 20 61 6e 20 65 72 72 6f 72 20 69 6e  aves an error in
8ea0: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64   pParse..*/.void
8eb0: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 68   sqlite3WindowCh
8ec0: 61 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ain(Parse *pPars
8ed0: 65 2c 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 2c  e, Window *pWin,
8ee0: 20 57 69 6e 64 6f 77 20 2a 70 4c 69 73 74 29 7b   Window *pList){
8ef0: 0a 20 20 69 66 28 20 70 57 69 6e 2d 3e 7a 42 61  .  if( pWin->zBa
8f00: 73 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  se ){.    sqlite
8f10: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
8f20: 64 62 3b 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a  db;.    Window *
8f30: 70 45 78 69 73 74 20 3d 20 77 69 6e 64 6f 77 46  pExist = windowF
8f40: 69 6e 64 28 70 50 61 72 73 65 2c 20 70 4c 69 73  ind(pParse, pLis
8f50: 74 2c 20 70 57 69 6e 2d 3e 7a 42 61 73 65 29 3b  t, pWin->zBase);
8f60: 0a 20 20 20 20 69 66 28 20 70 45 78 69 73 74 20  .    if( pExist 
8f70: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
8f80: 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20  har *zErr = 0;. 
8f90: 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f       /* Check fo
8fa0: 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20  r errors */.    
8fb0: 20 20 69 66 28 20 70 57 69 6e 2d 3e 70 50 61 72    if( pWin->pPar
8fc0: 74 69 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  tition ){.      
8fd0: 20 20 7a 45 72 72 20 3d 20 22 50 41 52 54 49 54    zErr = "PARTIT
8fe0: 49 4f 4e 20 63 6c 61 75 73 65 22 3b 0a 20 20 20  ION clause";.   
8ff0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78     }else if( pEx
9000: 69 73 74 2d 3e 70 4f 72 64 65 72 42 79 20 26 26  ist->pOrderBy &&
9010: 20 70 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20   pWin->pOrderBy 
9020: 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20  ){.        zErr 
9030: 3d 20 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75  = "ORDER BY clau
9040: 73 65 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  se";.      }else
9050: 20 69 66 28 20 70 45 78 69 73 74 2d 3e 62 49 6d   if( pExist->bIm
9060: 70 6c 69 63 69 74 46 72 61 6d 65 3d 3d 30 20 29  plicitFrame==0 )
9070: 7b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d  {.        zErr =
9080: 20 22 66 72 61 6d 65 20 73 70 65 63 69 66 69 63   "frame specific
9090: 61 74 69 6f 6e 22 3b 0a 20 20 20 20 20 20 7d 0a  ation";.      }.
90a0: 20 20 20 20 20 20 69 66 28 20 7a 45 72 72 20 29        if( zErr )
90b0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
90c0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
90d0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  , .            "
90e0: 63 61 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65 20  cannot override 
90f0: 25 73 20 6f 66 20 77 69 6e 64 6f 77 3a 20 25 73  %s of window: %s
9100: 22 2c 20 7a 45 72 72 2c 20 70 57 69 6e 2d 3e 7a  ", zErr, pWin->z
9110: 42 61 73 65 0a 20 20 20 20 20 20 20 20 29 3b 0a  Base.        );.
9120: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9130: 20 20 20 20 20 70 57 69 6e 2d 3e 70 50 61 72 74       pWin->pPart
9140: 69 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 45  ition = sqlite3E
9150: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
9160: 45 78 69 73 74 2d 3e 70 50 61 72 74 69 74 69 6f  Exist->pPartitio
9170: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  n, 0);.        i
9180: 66 28 20 70 45 78 69 73 74 2d 3e 70 4f 72 64 65  f( pExist->pOrde
9190: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rBy ){.         
91a0: 20 61 73 73 65 72 74 28 20 70 57 69 6e 2d 3e 70   assert( pWin->p
91b0: 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
91c0: 20 20 20 20 20 20 20 20 70 57 69 6e 2d 3e 70 4f          pWin->pO
91d0: 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33  rderBy = sqlite3
91e0: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
91f0: 70 45 78 69 73 74 2d 3e 70 4f 72 64 65 72 42 79  pExist->pOrderBy
9200: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
9210: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
9220: 62 46 72 65 65 28 64 62 2c 20 70 57 69 6e 2d 3e  bFree(db, pWin->
9230: 7a 42 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20  zBase);.        
9240: 70 57 69 6e 2d 3e 7a 42 61 73 65 20 3d 20 30 3b  pWin->zBase = 0;
9250: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9260: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61   }.}../*.** Atta
9270: 63 68 20 77 69 6e 64 6f 77 20 6f 62 6a 65 63 74  ch window object
9280: 20 70 57 69 6e 20 74 6f 20 65 78 70 72 65 73 73   pWin to express
9290: 69 6f 6e 20 70 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ion p..*/.void s
92a0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 41 74 74 61  qlite3WindowAtta
92b0: 63 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ch(Parse *pParse
92c0: 2c 20 45 78 70 72 20 2a 70 2c 20 57 69 6e 64 6f  , Expr *p, Windo
92d0: 77 20 2a 70 57 69 6e 29 7b 0a 20 20 69 66 28 20  w *pWin){.  if( 
92e0: 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  p ){.    assert(
92f0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54   p->op==TK_FUNCT
9300: 49 4f 4e 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68  ION );.    /* Th
9310: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
9320: 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68  ly called for th
9330: 65 20 70 61 72 73 65 72 2e 20 20 49 66 20 70 57  e parser.  If pW
9340: 69 6e 20 77 61 73 20 6e 6f 74 0a 20 20 20 20 2a  in was not.    *
9350: 2a 20 61 6c 6c 6f 63 61 74 65 64 20 64 75 65 20  * allocated due 
9360: 74 6f 20 61 6e 20 4f 4f 4d 2c 20 74 68 65 6e 20  to an OOM, then 
9370: 74 68 65 20 70 61 72 73 65 72 20 77 6f 75 6c 64  the parser would
9380: 20 66 61 69 6c 20 62 65 66 6f 72 65 20 65 76 65   fail before eve
9390: 72 0a 20 20 20 20 2a 2a 20 69 6e 76 6f 6b 69 6e  r.    ** invokin
93a0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a  g this routine *
93b0: 2f 0a 20 20 20 20 69 66 28 20 41 4c 57 41 59 53  /.    if( ALWAYS
93c0: 28 70 57 69 6e 29 20 29 7b 0a 20 20 20 20 20 20  (pWin) ){.      
93d0: 70 2d 3e 79 2e 70 57 69 6e 20 3d 20 70 57 69 6e  p->y.pWin = pWin
93e0: 3b 0a 20 20 20 20 20 20 45 78 70 72 53 65 74 50  ;.      ExprSetP
93f0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 57 69  roperty(p, EP_Wi
9400: 6e 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 70 57  nFunc);.      pW
9410: 69 6e 2d 3e 70 4f 77 6e 65 72 20 3d 20 70 3b 0a  in->pOwner = p;.
9420: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61        if( p->fla
9430: 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74  gs & EP_Distinct
9440: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
9450: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
9460: 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 22  se,.           "
9470: 44 49 53 54 49 4e 43 54 20 69 73 20 6e 6f 74 20  DISTINCT is not 
9480: 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20 77 69  supported for wi
9490: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 22 29  ndow functions")
94a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
94b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
94c0: 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65 74 65  ite3WindowDelete
94d0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 57 69  (pParse->db, pWi
94e0: 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  n);.  }.}../*.**
94f0: 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   Return 0 if the
9500: 20 74 77 6f 20 77 69 6e 64 6f 77 20 6f 62 6a 65   two window obje
9510: 63 74 73 20 61 72 65 20 69 64 65 6e 74 69 63 61  cts are identica
9520: 6c 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 6f  l, or non-zero o
9530: 74 68 65 72 77 69 73 65 2e 0a 2a 2a 20 49 64 65  therwise..** Ide
9540: 6e 74 69 63 61 6c 20 77 69 6e 64 6f 77 20 6f 62  ntical window ob
9550: 6a 65 63 74 73 20 63 61 6e 20 62 65 20 70 72 6f  jects can be pro
9560: 63 65 73 73 65 64 20 69 6e 20 61 20 73 69 6e 67  cessed in a sing
9570: 6c 65 20 73 63 61 6e 2e 0a 2a 2f 0a 69 6e 74 20  le scan..*/.int 
9580: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 6d  sqlite3WindowCom
9590: 70 61 72 65 28 50 61 72 73 65 20 2a 70 50 61 72  pare(Parse *pPar
95a0: 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70 31 2c 20  se, Window *p1, 
95b0: 57 69 6e 64 6f 77 20 2a 70 32 29 7b 0a 20 20 69  Window *p2){.  i
95c0: 66 28 20 70 31 2d 3e 65 46 72 6d 54 79 70 65 21  f( p1->eFrmType!
95d0: 3d 70 32 2d 3e 65 46 72 6d 54 79 70 65 20 29 20  =p2->eFrmType ) 
95e0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
95f0: 70 31 2d 3e 65 53 74 61 72 74 21 3d 70 32 2d 3e  p1->eStart!=p2->
9600: 65 53 74 61 72 74 20 29 20 72 65 74 75 72 6e 20  eStart ) return 
9610: 31 3b 0a 20 20 69 66 28 20 70 31 2d 3e 65 45 6e  1;.  if( p1->eEn
9620: 64 21 3d 70 32 2d 3e 65 45 6e 64 20 29 20 72 65  d!=p2->eEnd ) re
9630: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 31  turn 1;.  if( p1
9640: 2d 3e 65 45 78 63 6c 75 64 65 21 3d 70 32 2d 3e  ->eExclude!=p2->
9650: 65 45 78 63 6c 75 64 65 20 29 20 72 65 74 75 72  eExclude ) retur
9660: 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
9670: 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50  e3ExprCompare(pP
9680: 61 72 73 65 2c 20 70 31 2d 3e 70 53 74 61 72 74  arse, p1->pStart
9690: 2c 20 70 32 2d 3e 70 53 74 61 72 74 2c 20 2d 31  , p2->pStart, -1
96a0: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
96b0: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
96c0: 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
96d0: 31 2d 3e 70 45 6e 64 2c 20 70 32 2d 3e 70 45 6e  1->pEnd, p2->pEn
96e0: 64 2c 20 2d 31 29 20 29 20 72 65 74 75 72 6e 20  d, -1) ) return 
96f0: 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
9700: 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
9710: 70 31 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20  p1->pPartition, 
9720: 70 32 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20  p2->pPartition, 
9730: 2d 31 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  -1) ) return 1;.
9740: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
9750: 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 31 2d  rListCompare(p1-
9760: 3e 70 4f 72 64 65 72 42 79 2c 20 70 32 2d 3e 70  >pOrderBy, p2->p
9770: 4f 72 64 65 72 42 79 2c 20 2d 31 29 20 29 20 72  OrderBy, -1) ) r
9780: 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
9790: 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  n 0;.}.../*.** T
97a0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 62 79  his is called by
97b0: 20 63 6f 64 65 20 69 6e 20 73 65 6c 65 63 74 2e   code in select.
97c0: 63 20 62 65 66 6f 72 65 20 69 74 20 63 61 6c 6c  c before it call
97d0: 73 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  s sqlite3WhereBe
97e0: 67 69 6e 28 29 0a 2a 2a 20 74 6f 20 62 65 67 69  gin().** to begi
97f0: 6e 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  n iterating thro
9800: 75 67 68 20 74 68 65 20 73 75 62 2d 71 75 65 72  ugh the sub-quer
9810: 79 20 72 65 73 75 6c 74 73 2e 20 49 74 20 69 73  y results. It is
9820: 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74   used to allocat
9830: 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c  e.** and initial
9840: 69 7a 65 20 72 65 67 69 73 74 65 72 73 20 61 6e  ize registers an
9850: 64 20 63 75 72 73 6f 72 73 20 75 73 65 64 20 62  d cursors used b
9860: 79 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43  y sqlite3WindowC
9870: 6f 64 65 53 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f  odeStep()..*/.vo
9880: 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  id sqlite3Window
9890: 43 6f 64 65 49 6e 69 74 28 50 61 72 73 65 20 2a  CodeInit(Parse *
98a0: 70 50 61 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a  pParse, Window *
98b0: 70 4d 57 69 6e 29 7b 0a 20 20 57 69 6e 64 6f 77  pMWin){.  Window
98c0: 20 2a 70 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a   *pWin;.  Vdbe *
98d0: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
98e0: 62 65 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f  be(pParse);..  /
98f0: 2a 20 41 6c 6c 6f 63 61 74 65 20 72 65 67 69 73  * Allocate regis
9900: 74 65 72 73 20 74 6f 20 75 73 65 20 66 6f 72 20  ters to use for 
9910: 50 41 52 54 49 54 49 4f 4e 20 42 59 20 76 61 6c  PARTITION BY val
9920: 75 65 73 2c 20 69 66 20 61 6e 79 2e 20 49 6e 69  ues, if any. Ini
9930: 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 73 61 69  tialize.  ** sai
9940: 64 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 4e  d registers to N
9950: 55 4c 4c 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ULL.  */.  if( p
9960: 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e  MWin->pPartition
9970: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70   ){.    int nExp
9980: 72 20 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74  r = pMWin->pPart
9990: 69 74 69 6f 6e 2d 3e 6e 45 78 70 72 3b 0a 20 20  ition->nExpr;.  
99a0: 20 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74    pMWin->regPart
99b0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
99c0: 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
99d0: 4d 65 6d 20 2b 3d 20 6e 45 78 70 72 3b 0a 20 20  Mem += nExpr;.  
99e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
99f0: 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op3(v, OP_Null, 
9a00: 30 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72  0, pMWin->regPar
9a10: 74 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72  t, pMWin->regPar
9a20: 74 2b 6e 45 78 70 72 2d 31 29 3b 0a 20 20 7d 0a  t+nExpr-1);.  }.
9a30: 0a 20 20 70 4d 57 69 6e 2d 3e 72 65 67 4f 6e 65  .  pMWin->regOne
9a40: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
9a50: 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  m;.  sqlite3Vdbe
9a60: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
9a70: 65 67 65 72 2c 20 31 2c 20 70 4d 57 69 6e 2d 3e  eger, 1, pMWin->
9a80: 72 65 67 4f 6e 65 29 3b 0a 0a 20 20 69 66 28 20  regOne);..  if( 
9a90: 70 4d 57 69 6e 2d 3e 65 45 78 63 6c 75 64 65 20  pMWin->eExclude 
9aa0: 29 7b 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 72 65  ){.    pMWin->re
9ab0: 67 53 74 61 72 74 52 6f 77 69 64 20 3d 20 2b 2b  gStartRowid = ++
9ac0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
9ad0: 20 20 70 4d 57 69 6e 2d 3e 72 65 67 45 6e 64 52    pMWin->regEndR
9ae0: 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d  owid = ++pParse-
9af0: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 70 4d 57 69 6e  >nMem;.    pMWin
9b00: 2d 3e 63 73 72 41 70 70 20 3d 20 70 50 61 72 73  ->csrApp = pPars
9b10: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73  e->nTab++;.    s
9b20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
9b30: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
9b40: 31 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61  1, pMWin->regSta
9b50: 72 74 52 6f 77 69 64 29 3b 0a 20 20 20 20 73 71  rtRowid);.    sq
9b60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
9b70: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
9b80: 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 45 6e 64 52  , pMWin->regEndR
9b90: 6f 77 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  owid);.    sqlit
9ba0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
9bb0: 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70 4d 57 69  OP_OpenDup, pMWi
9bc0: 6e 2d 3e 63 73 72 41 70 70 2c 20 70 4d 57 69 6e  n->csrApp, pMWin
9bd0: 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 20 20  ->iEphCsr);.    
9be0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66  return;.  }..  f
9bf0: 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70  or(pWin=pMWin; p
9c00: 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e  Win; pWin=pWin->
9c10: 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 46  pNextWin){.    F
9c20: 75 6e 63 44 65 66 20 2a 70 20 3d 20 70 57 69 6e  uncDef *p = pWin
9c30: 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 69 66 28  ->pFunc;.    if(
9c40: 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26   (p->funcFlags &
9c50: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e   SQLITE_FUNC_MIN
9c60: 4d 41 58 29 20 26 26 20 70 57 69 6e 2d 3e 65 53  MAX) && pWin->eS
9c70: 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44  tart!=TK_UNBOUND
9c80: 45 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  ED ){.      /* T
9c90: 68 65 20 69 6e 6c 69 6e 65 20 76 65 72 73 69 6f  he inline versio
9ca0: 6e 73 20 6f 66 20 6d 69 6e 28 29 20 61 6e 64 20  ns of min() and 
9cb0: 6d 61 78 28 29 20 72 65 71 75 69 72 65 20 61 20  max() require a 
9cc0: 73 69 6e 67 6c 65 20 65 70 68 65 6d 65 72 61 6c  single ephemeral
9cd0: 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20  .      ** table 
9ce0: 61 6e 64 20 33 20 72 65 67 69 73 74 65 72 73 2e  and 3 registers.
9cf0: 20 54 68 65 20 72 65 67 69 73 74 65 72 73 20 61   The registers a
9d00: 72 65 20 75 73 65 64 20 61 73 20 66 6f 6c 6c 6f  re used as follo
9d10: 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ws:.      **.   
9d20: 20 20 20 2a 2a 20 20 20 72 65 67 41 70 70 2b 30     **   regApp+0
9d30: 3a 20 73 6c 6f 74 20 74 6f 20 63 6f 70 79 20 6d  : slot to copy m
9d40: 69 6e 28 29 2f 6d 61 78 28 29 20 61 72 67 75 6d  in()/max() argum
9d50: 65 6e 74 20 74 6f 20 66 6f 72 20 4d 61 6b 65 52  ent to for MakeR
9d60: 65 63 6f 72 64 0a 20 20 20 20 20 20 2a 2a 20 20  ecord.      **  
9d70: 20 72 65 67 41 70 70 2b 31 3a 20 69 6e 74 65 67   regApp+1: integ
9d80: 65 72 20 76 61 6c 75 65 20 75 73 65 64 20 74 6f  er value used to
9d90: 20 65 6e 73 75 72 65 20 6b 65 79 73 20 61 72 65   ensure keys are
9da0: 20 75 6e 69 71 75 65 0a 20 20 20 20 20 20 2a 2a   unique.      **
9db0: 20 20 20 72 65 67 41 70 70 2b 32 3a 20 6f 75 74     regApp+2: out
9dc0: 70 75 74 20 6f 66 20 4d 61 6b 65 52 65 63 6f 72  put of MakeRecor
9dd0: 64 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  d.      */.     
9de0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
9df0: 20 3d 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d   = pWin->pOwner-
9e00: 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  >x.pList;.      
9e10: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
9e20: 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
9e30: 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
9e40: 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 30 2c  Parse, pList, 0,
9e50: 20 30 29 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d   0);.      pWin-
9e60: 3e 63 73 72 41 70 70 20 3d 20 70 50 61 72 73 65  >csrApp = pParse
9e70: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
9e80: 70 57 69 6e 2d 3e 72 65 67 41 70 70 20 3d 20 70  pWin->regApp = p
9e90: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
9ea0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
9eb0: 6d 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20 69 66  m += 3;.      if
9ec0: 28 20 70 4b 65 79 49 6e 66 6f 20 26 26 20 70 57  ( pKeyInfo && pW
9ed0: 69 6e 2d 3e 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65  in->pFunc->zName
9ee0: 5b 31 5d 3d 3d 27 69 27 20 29 7b 0a 20 20 20 20  [1]=='i' ){.    
9ef0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79      assert( pKey
9f00: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
9f10: 5b 30 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  [0]==0 );.      
9f20: 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72    pKeyInfo->aSor
9f30: 74 4f 72 64 65 72 5b 30 5d 20 3d 20 31 3b 0a 20  tOrder[0] = 1;. 
9f40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
9f50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
9f60: 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
9f70: 61 6c 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70  al, pWin->csrApp
9f80: 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 2);.      sqli
9f90: 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
9fa0: 76 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  v, pKeyInfo, P4_
9fb0: 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
9fc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9fd0: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
9fe0: 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70   0, pWin->regApp
9ff0: 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65  +1);.    }.    e
a000: 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4e 61 6d 65  lse if( p->zName
a010: 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 20  ==nth_valueName 
a020: 7c 7c 20 70 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72  || p->zName==fir
a030: 73 74 5f 76 61 6c 75 65 4e 61 6d 65 20 29 7b 0a  st_valueName ){.
a040: 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
a050: 65 20 74 77 6f 20 72 65 67 69 73 74 65 72 73 20  e two registers 
a060: 61 74 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2e  at pWin->regApp.
a070: 20 54 68 65 73 65 20 77 69 6c 6c 20 62 65 20 75   These will be u
a080: 73 65 64 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  sed to.      ** 
a090: 73 74 6f 72 65 20 74 68 65 20 73 74 61 72 74 20  store the start 
a0a0: 61 6e 64 20 65 6e 64 20 69 6e 64 65 78 20 6f 66  and end index of
a0b0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 61   the current fra
a0c0: 6d 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 70 57  me.  */.      pW
a0d0: 69 6e 2d 3e 72 65 67 41 70 70 20 3d 20 70 50 61  in->regApp = pPa
a0e0: 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
a0f0: 20 20 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 20     pWin->csrApp 
a100: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
a110: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
a120: 6e 4d 65 6d 20 2b 3d 20 32 3b 0a 20 20 20 20 20  nMem += 2;.     
a130: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a140: 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70  p2(v, OP_OpenDup
a150: 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20  , pWin->csrApp, 
a160: 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b  pMWin->iEphCsr);
a170: 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20  .    }.    else 
a180: 69 66 28 20 70 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65  if( p->zName==le
a190: 61 64 4e 61 6d 65 20 7c 7c 20 70 2d 3e 7a 4e 61  adName || p->zNa
a1a0: 6d 65 3d 3d 6c 61 67 4e 61 6d 65 20 29 7b 0a 20  me==lagName ){. 
a1b0: 20 20 20 20 20 70 57 69 6e 2d 3e 63 73 72 41 70       pWin->csrAp
a1c0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  p = pParse->nTab
a1d0: 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
a1e0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a1f0: 50 5f 4f 70 65 6e 44 75 70 2c 20 70 57 69 6e 2d  P_OpenDup, pWin-
a200: 3e 63 73 72 41 70 70 2c 20 70 4d 57 69 6e 2d 3e  >csrApp, pMWin->
a210: 69 45 70 68 43 73 72 29 3b 0a 20 20 20 20 7d 0a  iEphCsr);.    }.
a220: 20 20 7d 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 57    }.}..#define W
a230: 49 4e 44 4f 57 5f 53 54 41 52 54 49 4e 47 5f 49  INDOW_STARTING_I
a240: 4e 54 20 20 30 0a 23 64 65 66 69 6e 65 20 57 49  NT  0.#define WI
a250: 4e 44 4f 57 5f 45 4e 44 49 4e 47 5f 49 4e 54 20  NDOW_ENDING_INT 
a260: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 57 49 4e     1.#define WIN
a270: 44 4f 57 5f 4e 54 48 5f 56 41 4c 55 45 5f 49 4e  DOW_NTH_VALUE_IN
a280: 54 20 32 0a 23 64 65 66 69 6e 65 20 57 49 4e 44  T 2.#define WIND
a290: 4f 57 5f 53 54 41 52 54 49 4e 47 5f 4e 55 4d 20  OW_STARTING_NUM 
a2a0: 20 33 0a 23 64 65 66 69 6e 65 20 57 49 4e 44 4f   3.#define WINDO
a2b0: 57 5f 45 4e 44 49 4e 47 5f 4e 55 4d 20 20 20 20  W_ENDING_NUM    
a2c0: 34 0a 0a 2f 2a 0a 2a 2a 20 41 20 22 50 52 45 43  4../*.** A "PREC
a2d0: 45 44 49 4e 47 20 3c 65 78 70 72 3e 22 20 28 65  EDING <expr>" (e
a2e0: 43 6f 6e 64 3d 3d 30 29 20 6f 72 20 22 46 4f 4c  Cond==0) or "FOL
a2f0: 4c 4f 57 49 4e 47 20 3c 65 78 70 72 3e 22 20 28  LOWING <expr>" (
a300: 65 43 6f 6e 64 3d 3d 31 29 20 6f 72 20 74 68 65  eCond==1) or the
a310: 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65  .** value of the
a320: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
a330: 20 74 6f 20 6e 74 68 5f 76 61 6c 75 65 28 29 20   to nth_value() 
a340: 28 65 43 6f 6e 64 3d 3d 32 29 20 68 61 73 20 6a  (eCond==2) has j
a350: 75 73 74 20 62 65 65 6e 0a 2a 2a 20 65 76 61 6c  ust been.** eval
a360: 75 61 74 65 64 20 61 6e 64 20 74 68 65 20 72 65  uated and the re
a370: 73 75 6c 74 20 6c 65 66 74 20 69 6e 20 72 65 67  sult left in reg
a380: 69 73 74 65 72 20 72 65 67 2e 20 54 68 69 73 20  ister reg. This 
a390: 66 75 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61 74  function generat
a3a0: 65 73 20 56 4d 0a 2a 2a 20 63 6f 64 65 20 74 6f  es VM.** code to
a3b0: 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   check that the 
a3c0: 76 61 6c 75 65 20 69 73 20 61 20 6e 6f 6e 2d 6e  value is a non-n
a3d0: 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72 20  egative integer 
a3e0: 61 6e 64 20 74 68 72 6f 77 73 20 61 6e 0a 2a 2a  and throws an.**
a3f0: 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20 69 74   exception if it
a400: 20 69 73 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74   is not..*/.stat
a410: 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 43 68  ic void windowCh
a420: 65 63 6b 56 61 6c 75 65 28 50 61 72 73 65 20 2a  eckValue(Parse *
a430: 70 50 61 72 73 65 2c 20 69 6e 74 20 72 65 67 2c  pParse, int reg,
a440: 20 69 6e 74 20 65 43 6f 6e 64 29 7b 0a 20 20 73   int eCond){.  s
a450: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
a460: 20 2a 61 7a 45 72 72 5b 5d 20 3d 20 7b 0a 20 20   *azErr[] = {.  
a470: 20 20 22 66 72 61 6d 65 20 73 74 61 72 74 69 6e    "frame startin
a480: 67 20 6f 66 66 73 65 74 20 6d 75 73 74 20 62 65  g offset must be
a490: 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20   a non-negative 
a4a0: 69 6e 74 65 67 65 72 22 2c 0a 20 20 20 20 22 66  integer",.    "f
a4b0: 72 61 6d 65 20 65 6e 64 69 6e 67 20 6f 66 66 73  rame ending offs
a4c0: 65 74 20 6d 75 73 74 20 62 65 20 61 20 6e 6f 6e  et must be a non
a4d0: 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67 65  -negative intege
a4e0: 72 22 2c 0a 20 20 20 20 22 73 65 63 6f 6e 64 20  r",.    "second 
a4f0: 61 72 67 75 6d 65 6e 74 20 74 6f 20 6e 74 68 5f  argument to nth_
a500: 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20 61 20  value must be a 
a510: 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72  positive integer
a520: 22 2c 0a 20 20 20 20 22 66 72 61 6d 65 20 73 74  ",.    "frame st
a530: 61 72 74 69 6e 67 20 6f 66 66 73 65 74 20 6d 75  arting offset mu
a540: 73 74 20 62 65 20 61 20 6e 6f 6e 2d 6e 65 67 61  st be a non-nega
a550: 74 69 76 65 20 6e 75 6d 62 65 72 22 2c 0a 20 20  tive number",.  
a560: 20 20 22 66 72 61 6d 65 20 65 6e 64 69 6e 67 20    "frame ending 
a570: 6f 66 66 73 65 74 20 6d 75 73 74 20 62 65 20 61  offset must be a
a580: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 6e 75   non-negative nu
a590: 6d 62 65 72 22 2c 0a 20 20 7d 3b 0a 20 20 73 74  mber",.  };.  st
a5a0: 61 74 69 63 20 69 6e 74 20 61 4f 70 5b 5d 20 3d  atic int aOp[] =
a5b0: 20 7b 20 4f 50 5f 47 65 2c 20 4f 50 5f 47 65 2c   { OP_Ge, OP_Ge,
a5c0: 20 4f 50 5f 47 74 2c 20 4f 50 5f 47 65 2c 20 4f   OP_Gt, OP_Ge, O
a5d0: 50 5f 47 65 20 7d 3b 0a 20 20 56 64 62 65 20 2a  P_Ge };.  Vdbe *
a5e0: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
a5f0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e  be(pParse);.  in
a600: 74 20 72 65 67 5a 65 72 6f 20 3d 20 73 71 6c 69  t regZero = sqli
a610: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
a620: 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
a630: 20 65 43 6f 6e 64 3e 3d 30 20 26 26 20 65 43 6f   eCond>=0 && eCo
a640: 6e 64 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 45  nd<ArraySize(azE
a650: 72 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  rr) );.  sqlite3
a660: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
a670: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
a680: 5a 65 72 6f 29 3b 0a 20 20 69 66 28 20 65 43 6f  Zero);.  if( eCo
a690: 6e 64 3e 3d 57 49 4e 44 4f 57 5f 53 54 41 52 54  nd>=WINDOW_START
a6a0: 49 4e 47 5f 4e 55 4d 20 29 7b 0a 20 20 20 20 69  ING_NUM ){.    i
a6b0: 6e 74 20 72 65 67 53 74 72 69 6e 67 20 3d 20 73  nt regString = s
a6c0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
a6d0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 73 71  (pParse);.    sq
a6e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
a6f0: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
a700: 2c 20 72 65 67 53 74 72 69 6e 67 2c 20 30 2c 20  , regString, 0, 
a710: 22 22 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  "", P4_STATIC);.
a720: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a730: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 47 65 2c 20  ddOp3(v, OP_Ge, 
a740: 72 65 67 53 74 72 69 6e 67 2c 20 73 71 6c 69 74  regString, sqlit
a750: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
a760: 72 28 76 29 2b 32 2c 20 72 65 67 29 3b 0a 20 20  r(v)+2, reg);.  
a770: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
a780: 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f  ngeP5(v, SQLITE_
a790: 41 46 46 5f 4e 55 4d 45 52 49 43 7c 53 51 4c 49  AFF_NUMERIC|SQLI
a7a0: 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
a7b0: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
a7c0: 28 76 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  (v);.    assert(
a7d0: 20 65 43 6f 6e 64 3d 3d 33 20 7c 7c 20 65 43 6f   eCond==3 || eCo
a7e0: 6e 64 3d 3d 34 20 29 3b 0a 20 20 20 20 56 64 62  nd==4 );.    Vdb
a7f0: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 65  eCoverageIf(v, e
a800: 43 6f 6e 64 3d 3d 33 29 3b 0a 20 20 20 20 56 64  Cond==3);.    Vd
a810: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
a820: 65 43 6f 6e 64 3d 3d 34 29 3b 0a 20 20 7d 65 6c  eCond==4);.  }el
a830: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
a840: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
a850: 4d 75 73 74 42 65 49 6e 74 2c 20 72 65 67 2c 20  MustBeInt, reg, 
a860: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
a870: 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20  ntAddr(v)+2);.  
a880: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
a890: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  );.    assert( e
a8a0: 43 6f 6e 64 3d 3d 30 20 7c 7c 20 65 43 6f 6e 64  Cond==0 || eCond
a8b0: 3d 3d 31 20 7c 7c 20 65 43 6f 6e 64 3d 3d 32 20  ==1 || eCond==2 
a8c0: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
a8d0: 61 67 65 49 66 28 76 2c 20 65 43 6f 6e 64 3d 3d  ageIf(v, eCond==
a8e0: 30 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  0);.    VdbeCove
a8f0: 72 61 67 65 49 66 28 76 2c 20 65 43 6f 6e 64 3d  rageIf(v, eCond=
a900: 3d 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  =1);.    VdbeCov
a910: 65 72 61 67 65 49 66 28 76 2c 20 65 43 6f 6e 64  erageIf(v, eCond
a920: 3d 3d 32 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ==2);.  }.  sqli
a930: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
a940: 20 61 4f 70 5b 65 43 6f 6e 64 5d 2c 20 72 65 67   aOp[eCond], reg
a950: 5a 65 72 6f 2c 20 73 71 6c 69 74 65 33 56 64 62  Zero, sqlite3Vdb
a960: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
a970: 32 2c 20 72 65 67 29 3b 0a 20 20 56 64 62 65 43  2, reg);.  VdbeC
a980: 6f 76 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c  overageNeverNull
a990: 49 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 30 29 3b  If(v, eCond==0);
a9a0: 20 2f 2a 20 4e 55 4c 4c 20 63 61 73 65 20 63 61   /* NULL case ca
a9b0: 70 74 75 72 65 64 20 62 79 20 2a 2f 0a 20 20 56  ptured by */.  V
a9c0: 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72  dbeCoverageNever
a9d0: 4e 75 6c 6c 49 66 28 76 2c 20 65 43 6f 6e 64 3d  NullIf(v, eCond=
a9e0: 3d 31 29 3b 20 2f 2a 20 20 20 74 68 65 20 4f 50  =1); /*   the OP
a9f0: 5f 4d 75 73 74 42 65 49 6e 74 20 2a 2f 0a 20 20  _MustBeInt */.  
aa00: 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65  VdbeCoverageNeve
aa10: 72 4e 75 6c 6c 49 66 28 76 2c 20 65 43 6f 6e 64  rNullIf(v, eCond
aa20: 3d 3d 32 29 3b 0a 20 20 56 64 62 65 43 6f 76 65  ==2);.  VdbeCove
aa30: 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c 49 66 28  rageNeverNullIf(
aa40: 76 2c 20 65 43 6f 6e 64 3d 3d 33 29 3b 20 2f 2a  v, eCond==3); /*
aa50: 20 4e 55 4c 4c 20 63 61 73 65 20 63 61 75 67 68   NULL case caugh
aa60: 74 20 62 79 20 2a 2f 0a 20 20 56 64 62 65 43 6f  t by */.  VdbeCo
aa70: 76 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c 49  verageNeverNullI
aa80: 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 34 29 3b 20  f(v, eCond==4); 
aa90: 2f 2a 20 20 20 74 68 65 20 4f 50 5f 47 65 20 2a  /*   the OP_Ge *
aaa0: 2f 0a 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62  /.  sqlite3MayAb
aab0: 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 73  ort(pParse);.  s
aac0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
aad0: 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c  (v, OP_Halt, SQL
aae0: 49 54 45 5f 45 52 52 4f 52 2c 20 4f 45 5f 41 62  ITE_ERROR, OE_Ab
aaf0: 6f 72 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ort);.  sqlite3V
ab00: 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28  dbeAppendP4(v, (
ab10: 76 6f 69 64 2a 29 61 7a 45 72 72 5b 65 43 6f 6e  void*)azErr[eCon
ab20: 64 5d 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  d], P4_STATIC);.
ab30: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
ab40: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
ab50: 72 65 67 5a 65 72 6f 29 3b 0a 7d 0a 0a 2f 2a 0a  regZero);.}../*.
ab60: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
ab70: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
ab80: 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  s passed to the 
ab90: 77 69 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e 20  window-function 
aba0: 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
abb0: 74 68 20 74 68 65 20 6f 62 6a 65 63 74 20 70 61  th the object pa
abc0: 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79  ssed as the only
abd0: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
abe0: 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  s function..*/.s
abf0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 64 6f 77  tatic int window
ac00: 41 72 67 43 6f 75 6e 74 28 57 69 6e 64 6f 77 20  ArgCount(Window 
ac10: 2a 70 57 69 6e 29 7b 0a 20 20 45 78 70 72 4c 69  *pWin){.  ExprLi
ac20: 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 57 69 6e  st *pList = pWin
ac30: 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73  ->pOwner->x.pLis
ac40: 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 4c 69  t;.  return (pLi
ac50: 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70  st ? pList->nExp
ac60: 72 20 3a 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  r : 0);.}../*.**
ac70: 20 47 65 6e 65 72 61 74 65 20 56 4d 20 63 6f 64   Generate VM cod
ac80: 65 20 74 6f 20 69 6e 76 6f 6b 65 20 65 69 74 68  e to invoke eith
ac90: 65 72 20 78 53 74 65 70 28 29 20 28 69 66 20 62  er xStep() (if b
aca0: 49 6e 76 65 72 73 65 20 69 73 20 30 29 20 6f 72  Inverse is 0) or
acb0: 20 0a 2a 2a 20 78 49 6e 76 65 72 73 65 20 28 69   .** xInverse (i
acc0: 66 20 62 49 6e 76 65 72 73 65 20 69 73 20 6e 6f  f bInverse is no
acd0: 6e 2d 7a 65 72 6f 29 20 66 6f 72 20 65 61 63 68  n-zero) for each
ace0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
acf0: 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b   in the .** link
ad00: 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67  ed list starting
ad10: 20 61 74 20 70 4d 57 69 6e 2e 20 4f 72 2c 20 66   at pMWin. Or, f
ad20: 6f 72 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64  or built-in wind
ad30: 6f 77 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20  ow functions.** 
ad40: 74 68 61 74 20 64 6f 20 6e 6f 74 20 75 73 65 20  that do not use 
ad50: 74 68 65 20 73 74 61 6e 64 61 72 64 20 66 75 6e  the standard fun
ad60: 63 74 69 6f 6e 20 41 50 49 2c 20 67 65 6e 65 72  ction API, gener
ad70: 61 74 65 20 74 68 65 20 72 65 71 75 69 72 65 64  ate the required
ad80: 0a 2a 2a 20 69 6e 6c 69 6e 65 20 56 4d 20 63 6f  .** inline VM co
ad90: 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67  de..**.** If arg
ada0: 75 6d 65 6e 74 20 63 73 72 20 69 73 20 67 72 65  ument csr is gre
adb0: 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
adc0: 61 6c 20 74 6f 20 30 2c 20 74 68 65 6e 20 61 72  al to 0, then ar
add0: 67 75 6d 65 6e 74 20 72 65 67 20 69 73 0a 2a 2a  gument reg is.**
ade0: 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73   the first regis
adf0: 74 65 72 20 69 6e 20 61 6e 20 61 72 72 61 79 20  ter in an array 
ae00: 6f 66 20 72 65 67 69 73 74 65 72 73 20 67 75 61  of registers gua
ae10: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 61  ranteed to be la
ae20: 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 20 74 6f  rge.** enough to
ae30: 20 68 6f 6c 64 20 74 68 65 20 61 72 72 61 79 20   hold the array 
ae40: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 66 6f 72  of arguments for
ae50: 20 65 61 63 68 20 66 75 6e 63 74 69 6f 6e 2e 20   each function. 
ae60: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20  In this case.** 
ae70: 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 61 72  the arguments ar
ae80: 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
ae90: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
aea0: 20 6f 66 20 63 73 72 20 69 6e 74 6f 20 74 68 65   of csr into the
aeb0: 0a 2a 2a 20 61 72 72 61 79 20 6f 66 20 72 65 67  .** array of reg
aec0: 69 73 74 65 72 73 20 62 65 66 6f 72 65 20 69 6e  isters before in
aed0: 76 6f 6b 69 6e 67 20 4f 50 5f 41 67 67 53 74 65  voking OP_AggSte
aee0: 70 20 6f 72 20 4f 50 5f 41 67 67 49 6e 76 65 72  p or OP_AggInver
aef0: 73 65 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20  se.**.** Or, if 
af00: 63 73 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e  csr is less than
af10: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
af20: 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  array of registe
af30: 72 73 20 61 74 20 72 65 67 20 69 73 0a 2a 2a 20  rs at reg is.** 
af40: 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65  already populate
af50: 64 20 77 69 74 68 20 61 6c 6c 20 63 6f 6c 75 6d  d with all colum
af60: 6e 73 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72  ns from the curr
af70: 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 73  ent row of the s
af80: 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  ub-query..**.** 
af90: 49 66 20 61 72 67 75 6d 65 6e 74 20 72 65 67 50  If argument regP
afa0: 61 72 74 53 69 7a 65 20 69 73 20 6e 6f 6e 2d 7a  artSize is non-z
afb0: 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ero, then it is 
afc0: 61 20 72 65 67 69 73 74 65 72 20 63 6f 6e 74 61  a register conta
afd0: 69 6e 69 6e 67 20 74 68 65 0a 2a 2a 20 6e 75 6d  ining the.** num
afe0: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
aff0: 68 65 20 63 75 72 72 65 6e 74 20 70 61 72 74 69  he current parti
b000: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
b010: 76 6f 69 64 20 77 69 6e 64 6f 77 41 67 67 53 74  void windowAggSt
b020: 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ep(.  Parse *pPa
b030: 72 73 65 2c 20 0a 20 20 57 69 6e 64 6f 77 20 2a  rse, .  Window *
b040: 70 4d 57 69 6e 2c 20 20 20 20 20 20 20 20 20 20  pMWin,          
b050: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 65          /* Linke
b060: 64 20 6c 69 73 74 20 6f 66 20 77 69 6e 64 6f 77  d list of window
b070: 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20   functions */.  
b080: 69 6e 74 20 63 73 72 2c 20 20 20 20 20 20 20 20  int csr,        
b090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0a0: 2f 2a 20 52 65 61 64 20 61 72 67 75 6d 65 6e 74  /* Read argument
b0b0: 73 20 66 72 6f 6d 20 74 68 69 73 20 63 75 72 73  s from this curs
b0c0: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 76  or */.  int bInv
b0d0: 65 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  erse,           
b0e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
b0f0: 74 6f 20 69 6e 76 6f 6b 65 20 78 49 6e 76 65 72  to invoke xInver
b100: 73 65 20 69 6e 73 74 65 61 64 20 6f 66 20 78 53  se instead of xS
b110: 74 65 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  tep */.  int reg
b120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b130: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
b140: 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 2a  y of registers *
b150: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
b160: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
b170: 70 50 61 72 73 65 29 3b 0a 20 20 57 69 6e 64 6f  pParse);.  Windo
b180: 77 20 2a 70 57 69 6e 3b 0a 20 20 66 6f 72 28 70  w *pWin;.  for(p
b190: 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b  Win=pMWin; pWin;
b1a0: 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78   pWin=pWin->pNex
b1b0: 74 57 69 6e 29 7b 0a 20 20 20 20 46 75 6e 63 44  tWin){.    FuncD
b1c0: 65 66 20 2a 70 46 75 6e 63 20 3d 20 70 57 69 6e  ef *pFunc = pWin
b1d0: 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 69 6e 74  ->pFunc;.    int
b1e0: 20 72 65 67 41 72 67 3b 0a 20 20 20 20 69 6e 74   regArg;.    int
b1f0: 20 6e 41 72 67 20 3d 20 77 69 6e 64 6f 77 41 72   nArg = windowAr
b200: 67 43 6f 75 6e 74 28 70 57 69 6e 29 3b 0a 20 20  gCount(pWin);.  
b210: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 66 6f    int i;..    fo
b220: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
b230: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  ++){.      if( i
b240: 21 3d 31 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e  !=1 || pFunc->zN
b250: 61 6d 65 21 3d 6e 74 68 5f 76 61 6c 75 65 4e 61  ame!=nth_valueNa
b260: 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  me ){.        sq
b270: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
b280: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73  v, OP_Column, cs
b290: 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c  r, pWin->iArgCol
b2a0: 2b 69 2c 20 72 65 67 2b 69 29 3b 0a 20 20 20 20  +i, reg+i);.    
b2b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b2c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b2d0: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
b2e0: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c   pMWin->iEphCsr,
b2f0: 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 69   pWin->iArgCol+i
b300: 2c 20 72 65 67 2b 69 29 3b 0a 20 20 20 20 20 20  , reg+i);.      
b310: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 67 41  }.    }.    regA
b320: 72 67 20 3d 20 72 65 67 3b 0a 0a 20 20 20 20 69  rg = reg;..    i
b330: 66 28 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61  f( pMWin->regSta
b340: 72 74 52 6f 77 69 64 3d 3d 30 0a 20 20 20 20 20  rtRowid==0.     
b350: 26 26 20 28 70 46 75 6e 63 2d 3e 66 75 6e 63 46  && (pFunc->funcF
b360: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
b370: 4e 43 5f 4d 49 4e 4d 41 58 29 20 0a 20 20 20 20  NC_MINMAX) .    
b380: 20 26 26 20 28 70 57 69 6e 2d 3e 65 53 74 61 72   && (pWin->eStar
b390: 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 29  t!=TK_UNBOUNDED)
b3a0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 6e  .    ){.      in
b3b0: 74 20 61 64 64 72 49 73 4e 75 6c 6c 20 3d 20 73  t addrIsNull = s
b3c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
b3d0: 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
b3e0: 65 67 41 72 67 29 3b 0a 20 20 20 20 20 20 56 64  egArg);.      Vd
b3f0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
b400: 20 20 20 20 20 69 66 28 20 62 49 6e 76 65 72 73       if( bInvers
b410: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
b420: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b430: 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
b440: 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31 2c 20  pWin->regApp+1, 
b450: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
b460: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
b470: 20 4f 50 5f 53 43 6f 70 79 2c 20 72 65 67 41 72   OP_SCopy, regAr
b480: 67 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 29  g, pWin->regApp)
b490: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
b4a0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
b4b0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 57  P_MakeRecord, pW
b4c0: 69 6e 2d 3e 72 65 67 41 70 70 2c 20 32 2c 20 70  in->regApp, 2, p
b4d0: 57 69 6e 2d 3e 72 65 67 41 70 70 2b 32 29 3b 0a  Win->regApp+2);.
b4e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b4f0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b500: 49 64 78 49 6e 73 65 72 74 2c 20 70 57 69 6e 2d  IdxInsert, pWin-
b510: 3e 63 73 72 41 70 70 2c 20 70 57 69 6e 2d 3e 72  >csrApp, pWin->r
b520: 65 67 41 70 70 2b 32 29 3b 0a 20 20 20 20 20 20  egApp+2);.      
b530: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
b540: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
b550: 49 6e 74 28 76 2c 20 4f 50 5f 53 65 65 6b 47 45  Int(v, OP_SeekGE
b560: 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20  , pWin->csrApp, 
b570: 30 2c 20 72 65 67 41 72 67 2c 20 31 29 3b 0a 20  0, regArg, 1);. 
b580: 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
b590: 61 67 65 4e 65 76 65 72 54 61 6b 65 6e 28 76 29  ageNeverTaken(v)
b5a0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
b5b0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
b5c0: 50 5f 44 65 6c 65 74 65 2c 20 70 57 69 6e 2d 3e  P_Delete, pWin->
b5d0: 63 73 72 41 70 70 29 3b 0a 20 20 20 20 20 20 20  csrApp);.       
b5e0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
b5f0: 48 65 72 65 28 76 2c 20 73 71 6c 69 74 65 33 56  Here(v, sqlite3V
b600: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
b610: 29 2d 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  )-2);.      }.  
b620: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
b630: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49  umpHere(v, addrI
b640: 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 65 6c 73  sNull);.    }els
b650: 65 20 69 66 28 20 70 57 69 6e 2d 3e 72 65 67 41  e if( pWin->regA
b660: 70 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  pp ){.      asse
b670: 72 74 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65  rt( pFunc->zName
b680: 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 0a  ==nth_valueName.
b690: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46             || pF
b6a0: 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72 73  unc->zName==firs
b6b0: 74 5f 76 61 6c 75 65 4e 61 6d 65 0a 20 20 20 20  t_valueName.    
b6c0: 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72    );.      asser
b6d0: 74 28 20 62 49 6e 76 65 72 73 65 3d 3d 30 20 7c  t( bInverse==0 |
b6e0: 7c 20 62 49 6e 76 65 72 73 65 3d 3d 31 20 29 3b  | bInverse==1 );
b6f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b700: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
b710: 64 64 49 6d 6d 2c 20 70 57 69 6e 2d 3e 72 65 67  ddImm, pWin->reg
b720: 41 70 70 2b 31 2d 62 49 6e 76 65 72 73 65 2c 20  App+1-bInverse, 
b730: 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  1);.    }else if
b740: 28 20 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63 21  ( pFunc->xSFunc!
b750: 3d 6e 6f 6f 70 53 74 65 70 46 75 6e 63 20 29 7b  =noopStepFunc ){
b760: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 49  .      int addrI
b770: 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  f = 0;.      if(
b780: 20 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72 20 29   pWin->pFilter )
b790: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  {.        int re
b7a0: 67 54 6d 70 3b 0a 20 20 20 20 20 20 20 20 61 73  gTmp;.        as
b7b0: 73 65 72 74 28 20 6e 41 72 67 3d 3d 30 20 7c 7c  sert( nArg==0 ||
b7c0: 20 6e 41 72 67 3d 3d 70 57 69 6e 2d 3e 70 4f 77   nArg==pWin->pOw
b7d0: 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  ner->x.pList->nE
b7e0: 78 70 72 20 29 3b 0a 20 20 20 20 20 20 20 20 61  xpr );.        a
b7f0: 73 73 65 72 74 28 20 6e 41 72 67 20 7c 7c 20 70  ssert( nArg || p
b800: 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70  Win->pOwner->x.p
b810: 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  List==0 );.     
b820: 20 20 20 72 65 67 54 6d 70 20 3d 20 73 71 6c 69     regTmp = sqli
b830: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
b840: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
b850: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
b860: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63  (v, OP_Column, c
b870: 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f  sr, pWin->iArgCo
b880: 6c 2b 6e 41 72 67 2c 72 65 67 54 6d 70 29 3b 0a  l+nArg,regTmp);.
b890: 20 20 20 20 20 20 20 20 61 64 64 72 49 66 20 3d          addrIf =
b8a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b8b0: 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p3(v, OP_IfNot, 
b8c0: 72 65 67 54 6d 70 2c 20 30 2c 20 31 29 3b 0a 20  regTmp, 0, 1);. 
b8d0: 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
b8e0: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
b8f0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
b900: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
b910: 67 54 6d 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  gTmp);.      }. 
b920: 20 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e       if( pFunc->
b930: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
b940: 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c  TE_FUNC_NEEDCOLL
b950: 20 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c   ){.        Coll
b960: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
b970: 20 20 20 20 61 73 73 65 72 74 28 20 6e 41 72 67      assert( nArg
b980: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 43  >0 );.        pC
b990: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
b9a0: 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  rNNCollSeq(pPars
b9b0: 65 2c 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d  e, pWin->pOwner-
b9c0: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  >x.pList->a[0].p
b9d0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73  Expr);.        s
b9e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
b9f0: 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20  (v, OP_CollSeq, 
ba00: 30 2c 30 2c 30 2c 20 28 63 6f 6e 73 74 20 63 68  0,0,0, (const ch
ba10: 61 72 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  ar*)pColl, P4_CO
ba20: 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a  LLSEQ);.      }.
ba30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ba40: 65 41 64 64 4f 70 33 28 76 2c 20 62 49 6e 76 65  eAddOp3(v, bInve
ba50: 72 73 65 3f 20 4f 50 5f 41 67 67 49 6e 76 65 72  rse? OP_AggInver
ba60: 73 65 20 3a 20 4f 50 5f 41 67 67 53 74 65 70 2c  se : OP_AggStep,
ba70: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
ba80: 20 20 20 20 20 20 20 20 20 20 62 49 6e 76 65 72            bInver
ba90: 73 65 2c 20 72 65 67 41 72 67 2c 20 70 57 69 6e  se, regArg, pWin
baa0: 2d 3e 72 65 67 41 63 63 75 6d 29 3b 0a 20 20 20  ->regAccum);.   
bab0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70     sqlite3VdbeAp
bac0: 70 65 6e 64 50 34 28 76 2c 20 70 46 75 6e 63 2c  pendP4(v, pFunc,
bad0: 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
bae0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
baf0: 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e  hangeP5(v, (u8)n
bb00: 41 72 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Arg);.      if( 
bb10: 61 64 64 72 49 66 20 29 20 73 71 6c 69 74 65 33  addrIf ) sqlite3
bb20: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
bb30: 61 64 64 72 49 66 29 3b 0a 20 20 20 20 7d 0a 20  addrIf);.    }. 
bb40: 20 7d 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74   }.}..typedef st
bb50: 72 75 63 74 20 57 69 6e 64 6f 77 43 6f 64 65 41  ruct WindowCodeA
bb60: 72 67 20 57 69 6e 64 6f 77 43 6f 64 65 41 72 67  rg WindowCodeArg
bb70: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
bb80: 20 57 69 6e 64 6f 77 43 73 72 41 6e 64 52 65 67   WindowCsrAndReg
bb90: 20 57 69 6e 64 6f 77 43 73 72 41 6e 64 52 65 67   WindowCsrAndReg
bba0: 3b 0a 73 74 72 75 63 74 20 57 69 6e 64 6f 77 43  ;.struct WindowC
bbb0: 73 72 41 6e 64 52 65 67 20 7b 0a 20 20 69 6e 74  srAndReg {.  int
bbc0: 20 63 73 72 3b 0a 20 20 69 6e 74 20 72 65 67 3b   csr;.  int reg;
bbd0: 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 57 69 6e 64  .};..struct Wind
bbe0: 6f 77 43 6f 64 65 41 72 67 20 7b 0a 20 20 50 61  owCodeArg {.  Pa
bbf0: 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 57  rse *pParse;.  W
bc00: 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 3b 0a 20 20  indow *pMWin;.  
bc10: 56 64 62 65 20 2a 70 56 64 62 65 3b 0a 20 20 69  Vdbe *pVdbe;.  i
bc20: 6e 74 20 72 65 67 47 6f 73 75 62 3b 0a 20 20 69  nt regGosub;.  i
bc30: 6e 74 20 61 64 64 72 47 6f 73 75 62 3b 0a 20 20  nt addrGosub;.  
bc40: 69 6e 74 20 72 65 67 41 72 67 3b 0a 20 20 69 6e  int regArg;.  in
bc50: 74 20 65 44 65 6c 65 74 65 3b 0a 0a 20 20 57 69  t eDelete;..  Wi
bc60: 6e 64 6f 77 43 73 72 41 6e 64 52 65 67 20 73 74  ndowCsrAndReg st
bc70: 61 72 74 3b 0a 20 20 57 69 6e 64 6f 77 43 73 72  art;.  WindowCsr
bc80: 41 6e 64 52 65 67 20 63 75 72 72 65 6e 74 3b 0a  AndReg current;.
bc90: 20 20 57 69 6e 64 6f 77 43 73 72 41 6e 64 52 65    WindowCsrAndRe
bca0: 67 20 65 6e 64 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  g end;.};../*.**
bcb0: 20 56 61 6c 75 65 73 20 74 68 61 74 20 6d 61 79   Values that may
bcc0: 20 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68   be passed as th
bcd0: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
bce0: 74 20 74 6f 20 77 69 6e 64 6f 77 43 6f 64 65 4f  t to windowCodeO
bcf0: 70 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  p()..*/.#define 
bd00: 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f  WINDOW_RETURN_RO
bd10: 57 20 31 0a 23 64 65 66 69 6e 65 20 57 49 4e 44  W 1.#define WIND
bd20: 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 20 32 0a  OW_AGGINVERSE 2.
bd30: 23 64 65 66 69 6e 65 20 57 49 4e 44 4f 57 5f 41  #define WINDOW_A
bd40: 47 47 53 54 45 50 20 20 20 20 33 0a 0a 2f 2a 0a  GGSTEP    3../*.
bd50: 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 4d 20 63  ** Generate VM c
bd60: 6f 64 65 20 74 6f 20 72 65 61 64 20 74 68 65 20  ode to read the 
bd70: 77 69 6e 64 6f 77 20 66 72 61 6d 65 73 20 70 65  window frames pe
bd80: 65 72 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 63  er values from c
bd90: 75 72 73 6f 72 20 63 73 72 20 69 6e 74 6f 0a 2a  ursor csr into.*
bda0: 2a 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65  * an array of re
bdb0: 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
bdc0: 20 61 74 20 72 65 67 2e 0a 2a 2f 0a 73 74 61 74   at reg..*/.stat
bdd0: 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 52 65  ic void windowRe
bde0: 61 64 50 65 65 72 56 61 6c 75 65 73 28 0a 20 20  adPeerValues(.  
bdf0: 57 69 6e 64 6f 77 43 6f 64 65 41 72 67 20 2a 70  WindowCodeArg *p
be00: 2c 0a 20 20 69 6e 74 20 63 73 72 2c 0a 20 20 69  ,.  int csr,.  i
be10: 6e 74 20 72 65 67 0a 29 7b 0a 20 20 57 69 6e 64  nt reg.){.  Wind
be20: 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70  ow *pMWin = p->p
be30: 4d 57 69 6e 3b 0a 20 20 45 78 70 72 4c 69 73 74  MWin;.  ExprList
be40: 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 4d 57   *pOrderBy = pMW
be50: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  in->pOrderBy;.  
be60: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
be70: 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71      Vdbe *v = sq
be80: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 2d 3e  lite3GetVdbe(p->
be90: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 45 78 70  pParse);.    Exp
bea0: 72 4c 69 73 74 20 2a 70 50 61 72 74 20 3d 20 70  rList *pPart = p
beb0: 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e  MWin->pPartition
bec0: 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 4f 66  ;.    int iColOf
bed0: 66 20 3d 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66  f = pMWin->nBuff
bee0: 65 72 43 6f 6c 20 2b 20 28 70 50 61 72 74 20 3f  erCol + (pPart ?
bef0: 20 70 50 61 72 74 2d 3e 6e 45 78 70 72 20 3a 20   pPart->nExpr : 
bf00: 30 29 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  0);.    int i;. 
bf10: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f     for(i=0; i<pO
bf20: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
bf30: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
bf40: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
bf50: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20  OP_Column, csr, 
bf60: 69 43 6f 6c 4f 66 66 2b 69 2c 20 72 65 67 2b 69  iColOff+i, reg+i
bf70: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
bf80: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56  /*.** Generate V
bf90: 4d 20 63 6f 64 65 20 74 6f 20 69 6e 76 6f 6b 65  M code to invoke
bfa0: 20 65 69 74 68 65 72 20 78 56 61 6c 75 65 28 29   either xValue()
bfb0: 20 28 62 46 69 6e 3d 3d 30 29 20 6f 72 20 78 46   (bFin==0) or xF
bfc0: 69 6e 61 6c 69 7a 65 28 29 0a 2a 2a 20 28 62 46  inalize().** (bF
bfd0: 69 6e 3d 3d 31 29 20 66 6f 72 20 65 61 63 68 20  in==1) for each 
bfe0: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
bff0: 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  in the linked li
c000: 73 74 20 73 74 61 72 74 69 6e 67 20 61 74 0a 2a  st starting at.*
c010: 2a 20 70 4d 57 69 6e 2e 20 4f 72 2c 20 66 6f 72  * pMWin. Or, for
c020: 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77   built-in window
c030: 2d 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20  -functions that 
c040: 64 6f 20 6e 6f 74 20 75 73 65 20 74 68 65 20 73  do not use the s
c050: 74 61 6e 64 61 72 64 0a 2a 2a 20 41 50 49 2c 20  tandard.** API, 
c060: 67 65 6e 65 72 61 74 65 20 74 68 65 20 65 71 75  generate the equ
c070: 69 76 61 6c 65 6e 74 20 56 4d 20 63 6f 64 65 2e  ivalent VM code.
c080: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c090: 77 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 57  windowAggFinal(W
c0a0: 69 6e 64 6f 77 43 6f 64 65 41 72 67 20 2a 70 2c  indowCodeArg *p,
c0b0: 20 69 6e 74 20 62 46 69 6e 29 7b 0a 20 20 50 61   int bFin){.  Pa
c0c0: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d  rse *pParse = p-
c0d0: 3e 70 50 61 72 73 65 3b 0a 20 20 57 69 6e 64 6f  >pParse;.  Windo
c0e0: 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 4d  w *pMWin = p->pM
c0f0: 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  Win;.  Vdbe *v =
c100: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
c110: 70 50 61 72 73 65 29 3b 0a 20 20 57 69 6e 64 6f  pParse);.  Windo
c120: 77 20 2a 70 57 69 6e 3b 0a 0a 20 20 66 6f 72 28  w *pWin;..  for(
c130: 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e  pWin=pMWin; pWin
c140: 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65  ; pWin=pWin->pNe
c150: 78 74 57 69 6e 29 7b 0a 20 20 20 20 69 66 28 20  xtWin){.    if( 
c160: 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72 74 52  pMWin->regStartR
c170: 6f 77 69 64 3d 3d 30 0a 20 20 20 20 20 26 26 20  owid==0.     && 
c180: 28 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66 75  (pWin->pFunc->fu
c190: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
c1a0: 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 20 0a 20  _FUNC_MINMAX) . 
c1b0: 20 20 20 20 26 26 20 28 70 57 69 6e 2d 3e 65 53      && (pWin->eS
c1c0: 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44  tart!=TK_UNBOUND
c1d0: 45 44 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ED).    ){.     
c1e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c1f0: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
c200: 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c  , pWin->regResul
c210: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
c220: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
c230: 50 5f 4c 61 73 74 2c 20 70 57 69 6e 2d 3e 63 73  P_Last, pWin->cs
c240: 72 41 70 70 29 3b 0a 20 20 20 20 20 20 56 64 62  rApp);.      Vdb
c250: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
c260: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c270: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
c280: 6d 6e 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70  mn, pWin->csrApp
c290: 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65  , 0, pWin->regRe
c2a0: 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  sult);.      sql
c2b0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
c2c0: 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  (v, sqlite3VdbeC
c2d0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 32 29  urrentAddr(v)-2)
c2e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
c2f0: 70 57 69 6e 2d 3e 72 65 67 41 70 70 20 29 7b 0a  pWin->regApp ){.
c300: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
c310: 57 69 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f 77  Win->regStartRow
c320: 69 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c  id==0 );.    }el
c330: 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 41  se{.      int nA
c340: 72 67 20 3d 20 77 69 6e 64 6f 77 41 72 67 43 6f  rg = windowArgCo
c350: 75 6e 74 28 70 57 69 6e 29 3b 0a 20 20 20 20 20  unt(pWin);.     
c360: 20 69 66 28 20 62 46 69 6e 20 29 7b 0a 20 20 20   if( bFin ){.   
c370: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c380: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 67 67  AddOp2(v, OP_Agg
c390: 46 69 6e 61 6c 2c 20 70 57 69 6e 2d 3e 72 65 67  Final, pWin->reg
c3a0: 41 63 63 75 6d 2c 20 6e 41 72 67 29 3b 0a 20 20  Accum, nArg);.  
c3b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c3c0: 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 57 69  eAppendP4(v, pWi
c3d0: 6e 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e  n->pFunc, P4_FUN
c3e0: 43 44 45 46 29 3b 0a 20 20 20 20 20 20 20 20 73  CDEF);.        s
c3f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
c400: 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 57 69  (v, OP_Copy, pWi
c410: 6e 2d 3e 72 65 67 41 63 63 75 6d 2c 20 70 57 69  n->regAccum, pWi
c420: 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20  n->regResult);. 
c430: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
c440: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
c450: 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65  ull, 0, pWin->re
c460: 67 41 63 63 75 6d 29 3b 0a 20 20 20 20 20 20 7d  gAccum);.      }
c470: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
c480: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
c490: 76 2c 20 4f 50 5f 41 67 67 56 61 6c 75 65 2c 70  v, OP_AggValue,p
c4a0: 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 2c 6e 41  Win->regAccum,nA
c4b0: 72 67 2c 70 57 69 6e 2d 3e 72 65 67 52 65 73 75  rg,pWin->regResu
c4c0: 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  lt);.        sql
c4d0: 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
c4e0: 28 76 2c 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2c  (v, pWin->pFunc,
c4f0: 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
c500: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
c510: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
c520: 65 20 63 6f 64 65 20 74 6f 20 63 61 6c 63 75 6c  e code to calcul
c530: 61 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ate the current 
c540: 76 61 6c 75 65 73 20 6f 66 20 61 6c 6c 20 77 69  values of all wi
c550: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 69  ndow functions i
c560: 6e 20 74 68 65 0a 2a 2a 20 70 2d 3e 70 4d 57 69  n the.** p->pMWi
c570: 6e 20 6c 69 73 74 20 62 79 20 64 6f 69 6e 67 20  n list by doing 
c580: 61 20 66 75 6c 6c 20 73 63 61 6e 20 6f 66 20 74  a full scan of t
c590: 68 65 20 63 75 72 72 65 6e 74 20 77 69 6e 64 6f  he current windo
c5a0: 77 20 66 72 61 6d 65 2e 20 53 74 6f 72 65 20 74  w frame. Store t
c5b0: 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e  he.** results in
c5c0: 20 74 68 65 20 57 69 6e 64 6f 77 2e 72 65 67 52   the Window.regR
c5d0: 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 73 2c  esult registers,
c5e0: 20 72 65 61 64 79 20 74 6f 20 72 65 74 75 72 6e   ready to return
c5f0: 20 74 68 65 20 75 70 70 65 72 0a 2a 2a 20 6c 61   the upper.** la
c600: 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  yer..*/.static v
c610: 6f 69 64 20 77 69 6e 64 6f 77 46 75 6c 6c 53 63  oid windowFullSc
c620: 61 6e 28 57 69 6e 64 6f 77 43 6f 64 65 41 72 67  an(WindowCodeArg
c630: 20 2a 70 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a   *p){.  Window *
c640: 70 57 69 6e 3b 0a 20 20 50 61 72 73 65 20 2a 70  pWin;.  Parse *p
c650: 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73  Parse = p->pPars
c660: 65 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57  e;.  Window *pMW
c670: 69 6e 20 3d 20 70 2d 3e 70 4d 57 69 6e 3b 0a 20  in = p->pMWin;. 
c680: 20 56 64 62 65 20 2a 76 20 3d 20 70 2d 3e 70 56   Vdbe *v = p->pV
c690: 64 62 65 3b 0a 0a 20 20 69 6e 74 20 72 65 67 43  dbe;..  int regC
c6a0: 52 6f 77 69 64 20 3d 20 30 3b 20 20 20 20 20 20  Rowid = 0;      
c6b0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
c6c0: 6e 74 20 72 6f 77 69 64 20 76 61 6c 75 65 20 2a  nt rowid value *
c6d0: 2f 0a 20 20 69 6e 74 20 72 65 67 43 50 65 65 72  /.  int regCPeer
c6e0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
c6f0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 70      /* Current p
c700: 65 65 72 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  eer values */.  
c710: 69 6e 74 20 72 65 67 52 6f 77 69 64 20 3d 20 30  int regRowid = 0
c720: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c730: 2f 2a 20 41 67 67 53 74 65 70 20 72 6f 77 69 64  /* AggStep rowid
c740: 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20   value */.  int 
c750: 72 65 67 50 65 65 72 20 3d 20 30 3b 20 20 20 20  regPeer = 0;    
c760: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
c770: 67 67 53 74 65 70 20 70 65 65 72 20 76 61 6c 75  ggStep peer valu
c780: 65 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 50 65  es */..  int nPe
c790: 65 72 3b 0a 20 20 69 6e 74 20 6c 62 6c 4e 65 78  er;.  int lblNex
c7a0: 74 3b 0a 20 20 69 6e 74 20 6c 62 6c 42 72 6b 3b  t;.  int lblBrk;
c7b0: 0a 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 3b  .  int addrNext;
c7c0: 0a 20 20 69 6e 74 20 63 73 72 20 3d 20 70 4d 57  .  int csr = pMW
c7d0: 69 6e 2d 3e 63 73 72 41 70 70 3b 0a 0a 20 20 6e  in->csrApp;..  n
c7e0: 50 65 65 72 20 3d 20 28 70 4d 57 69 6e 2d 3e 70  Peer = (pMWin->p
c7f0: 4f 72 64 65 72 42 79 20 3f 20 70 4d 57 69 6e 2d  OrderBy ? pMWin-
c800: 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
c810: 20 3a 20 30 29 3b 0a 0a 20 20 6c 62 6c 4e 65 78   : 0);..  lblNex
c820: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
c830: 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
c840: 3b 0a 20 20 6c 62 6c 42 72 6b 20 3d 20 73 71 6c  ;.  lblBrk = sql
c850: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
c860: 6c 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 72 65  l(pParse);..  re
c870: 67 43 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65  gCRowid = sqlite
c880: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
c890: 73 65 29 3b 0a 20 20 72 65 67 52 6f 77 69 64 20  se);.  regRowid 
c8a0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
c8b0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69  Reg(pParse);.  i
c8c0: 66 28 20 6e 50 65 65 72 20 29 7b 0a 20 20 20 20  f( nPeer ){.    
c8d0: 72 65 67 43 50 65 65 72 20 3d 20 73 71 6c 69 74  regCPeer = sqlit
c8e0: 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
c8f0: 50 61 72 73 65 2c 20 6e 50 65 65 72 29 3b 0a 20  Parse, nPeer);. 
c900: 20 20 20 72 65 67 50 65 65 72 20 3d 20 73 71 6c     regPeer = sql
c910: 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
c920: 28 70 50 61 72 73 65 2c 20 6e 50 65 65 72 29 3b  (pParse, nPeer);
c930: 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56  .  }..  sqlite3V
c940: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
c950: 52 6f 77 69 64 2c 20 70 4d 57 69 6e 2d 3e 69 45  Rowid, pMWin->iE
c960: 70 68 43 73 72 2c 20 72 65 67 43 52 6f 77 69 64  phCsr, regCRowid
c970: 29 3b 0a 20 20 77 69 6e 64 6f 77 52 65 61 64 50  );.  windowReadP
c980: 65 65 72 56 61 6c 75 65 73 28 70 2c 20 70 4d 57  eerValues(p, pMW
c990: 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 72 65 67  in->iEphCsr, reg
c9a0: 43 50 65 65 72 29 3b 0a 0a 20 20 66 6f 72 28 70  CPeer);..  for(p
c9b0: 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b  Win=pMWin; pWin;
c9c0: 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78   pWin=pWin->pNex
c9d0: 74 57 69 6e 29 7b 0a 20 20 20 20 73 71 6c 69 74  tWin){.    sqlit
c9e0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
c9f0: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e  OP_Null, 0, pWin
ca00: 2d 3e 72 65 67 41 63 63 75 6d 29 3b 0a 20 20 7d  ->regAccum);.  }
ca10: 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ..  sqlite3VdbeA
ca20: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b  ddOp3(v, OP_Seek
ca30: 47 45 2c 20 63 73 72 2c 20 6c 62 6c 42 72 6b 2c  GE, csr, lblBrk,
ca40: 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72 74   pMWin->regStart
ca50: 52 6f 77 69 64 29 3b 0a 20 20 56 64 62 65 43 6f  Rowid);.  VdbeCo
ca60: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 61 64 64  verage(v);.  add
ca70: 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56  rNext = sqlite3V
ca80: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
ca90: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
caa0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
cab0: 69 64 2c 20 63 73 72 2c 20 72 65 67 52 6f 77 69  id, csr, regRowi
cac0: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  d);.  sqlite3Vdb
cad0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 47 74  eAddOp3(v, OP_Gt
cae0: 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 45 6e 64 52  , pMWin->regEndR
caf0: 6f 77 69 64 2c 20 6c 62 6c 42 72 6b 2c 20 72 65  owid, lblBrk, re
cb00: 67 52 6f 77 69 64 29 3b 0a 20 20 56 64 62 65 43  gRowid);.  VdbeC
cb10: 6f 76 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c  overageNeverNull
cb20: 28 76 29 3b 0a 0a 20 20 69 66 28 20 70 4d 57 69  (v);..  if( pMWi
cb30: 6e 2d 3e 65 45 78 63 6c 75 64 65 3d 3d 54 4b 5f  n->eExclude==TK_
cb40: 43 55 52 52 45 4e 54 20 29 7b 0a 20 20 20 20 73  CURRENT ){.    s
cb50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
cb60: 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65 67 43 52  (v, OP_Eq, regCR
cb70: 6f 77 69 64 2c 20 6c 62 6c 4e 65 78 74 2c 20 72  owid, lblNext, r
cb80: 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 56 64  egRowid);.    Vd
cb90: 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72 4e  beCoverageNeverN
cba0: 75 6c 6c 28 76 29 3b 0a 20 20 7d 65 6c 73 65 20  ull(v);.  }else 
cbb0: 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 78 63 6c  if( pMWin->eExcl
cbc0: 75 64 65 21 3d 54 4b 5f 4e 4f 20 29 7b 0a 20 20  ude!=TK_NO ){.  
cbd0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
cbe0: 69 6e 74 20 61 64 64 72 45 71 20 3d 20 30 3b 0a  int addrEq = 0;.
cbf0: 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
cc00: 79 49 6e 66 6f 20 3d 20 30 3b 0a 0a 20 20 20 20  yInfo = 0;..    
cc10: 69 66 28 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65  if( pMWin->pOrde
cc20: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 70 4b 65  rBy ){.      pKe
cc30: 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
cc40: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
cc50: 73 74 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  st(pParse, pMWin
cc60: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 30 2c 20 30  ->pOrderBy, 0, 0
cc70: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
cc80: 20 70 4d 57 69 6e 2d 3e 65 45 78 63 6c 75 64 65   pMWin->eExclude
cc90: 3d 3d 54 4b 5f 54 49 45 53 20 29 7b 0a 20 20 20  ==TK_TIES ){.   
cca0: 20 20 20 61 64 64 72 45 71 20 3d 20 73 71 6c 69     addrEq = sqli
ccb0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
ccc0: 20 4f 50 5f 45 71 2c 20 72 65 67 43 52 6f 77 69   OP_Eq, regCRowi
ccd0: 64 2c 20 30 2c 20 72 65 67 52 6f 77 69 64 29 3b  d, 0, regRowid);
cce0: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
ccf0: 61 67 65 4e 65 76 65 72 4e 75 6c 6c 28 76 29 3b  ageNeverNull(v);
cd00: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
cd10: 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  KeyInfo ){.     
cd20: 20 77 69 6e 64 6f 77 52 65 61 64 50 65 65 72 56   windowReadPeerV
cd30: 61 6c 75 65 73 28 70 2c 20 63 73 72 2c 20 72 65  alues(p, csr, re
cd40: 67 50 65 65 72 29 3b 0a 20 20 20 20 20 20 73 71  gPeer);.      sq
cd50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
cd60: 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72  v, OP_Compare, r
cd70: 65 67 50 65 65 72 2c 20 72 65 67 43 50 65 65 72  egPeer, regCPeer
cd80: 2c 20 6e 50 65 65 72 29 3b 0a 20 20 20 20 20 20  , nPeer);.      
cd90: 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e  sqlite3VdbeAppen
cda0: 64 50 34 28 76 2c 20 28 76 6f 69 64 2a 29 70 4b  dP4(v, (void*)pK
cdb0: 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
cdc0: 46 4f 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20  FO);.      addr 
cdd0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
cde0: 72 65 6e 74 41 64 64 72 28 76 29 2b 31 3b 0a 20  rentAddr(v)+1;. 
cdf0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ce00: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
ce10: 70 2c 20 61 64 64 72 2c 20 6c 62 6c 4e 65 78 74  p, addr, lblNext
ce20: 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 56  , addr);.      V
ce30: 64 62 65 43 6f 76 65 72 61 67 65 45 71 4e 65 28  dbeCoverageEqNe(
ce40: 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  v);.    }else{. 
ce50: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ce60: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
ce70: 6f 2c 20 30 2c 20 6c 62 6c 4e 65 78 74 29 3b 0a  o, 0, lblNext);.
ce80: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 61 64      }.    if( ad
ce90: 64 72 45 71 20 29 20 73 71 6c 69 74 65 33 56 64  drEq ) sqlite3Vd
cea0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
ceb0: 64 72 45 71 29 3b 0a 20 20 7d 0a 0a 20 20 77 69  drEq);.  }..  wi
cec0: 6e 64 6f 77 41 67 67 53 74 65 70 28 70 50 61 72  ndowAggStep(pPar
ced0: 73 65 2c 20 70 4d 57 69 6e 2c 20 63 73 72 2c 20  se, pMWin, csr, 
cee0: 30 2c 20 70 2d 3e 72 65 67 41 72 67 29 3b 0a 0a  0, p->regArg);..
cef0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
cf00: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c  olveLabel(v, lbl
cf10: 4e 65 78 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  Next);.  sqlite3
cf20: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
cf30: 5f 4e 65 78 74 2c 20 63 73 72 2c 20 61 64 64 72  _Next, csr, addr
cf40: 4e 65 78 74 29 3b 0a 20 20 56 64 62 65 43 6f 76  Next);.  VdbeCov
cf50: 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
cf60: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
cf70: 76 2c 20 61 64 64 72 4e 65 78 74 2d 31 29 3b 0a  v, addrNext-1);.
cf80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
cf90: 70 48 65 72 65 28 76 2c 20 61 64 64 72 4e 65 78  pHere(v, addrNex
cfa0: 74 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  t+1);.  sqlite3R
cfb0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
cfc0: 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64 29 3b  arse, regRowid);
cfd0: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
cfe0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
cff0: 20 72 65 67 43 52 6f 77 69 64 29 3b 0a 20 20 69   regCRowid);.  i
d000: 66 28 20 6e 50 65 65 72 20 29 7b 0a 20 20 20 20  f( nPeer ){.    
d010: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
d020: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
d030: 72 65 67 50 65 65 72 2c 20 6e 50 65 65 72 29 3b  regPeer, nPeer);
d040: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
d050: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
d060: 72 73 65 2c 20 72 65 67 43 50 65 65 72 2c 20 6e  rse, regCPeer, n
d070: 50 65 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 77 69  Peer);.  }..  wi
d080: 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 70 2c 20  ndowAggFinal(p, 
d090: 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76  1);.}../*.** Inv
d0a0: 6f 6b 65 20 74 68 65 20 73 75 62 2d 72 6f 75 74  oke the sub-rout
d0b0: 69 6e 65 20 61 74 20 72 65 67 47 6f 73 75 62 20  ine at regGosub 
d0c0: 28 67 65 6e 65 72 61 74 65 64 20 62 79 20 63 6f  (generated by co
d0d0: 64 65 20 69 6e 20 73 65 6c 65 63 74 2e 63 29 20  de in select.c) 
d0e0: 74 6f 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65  to.** return the
d0f0: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
d100: 57 69 6e 64 6f 77 2e 69 45 70 68 43 73 72 2e 20  Window.iEphCsr. 
d110: 49 66 20 61 6c 6c 20 77 69 6e 64 6f 77 20 66 75  If all window fu
d120: 6e 63 74 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 61  nctions are.** a
d130: 67 67 72 65 67 61 74 65 20 77 69 6e 64 6f 77 20  ggregate window 
d140: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 75  functions that u
d150: 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  se the standard 
d160: 41 50 49 2c 20 61 20 73 69 6e 67 6c 65 0a 2a 2a  API, a single.**
d170: 20 4f 50 5f 47 6f 73 75 62 20 69 6e 73 74 72 75   OP_Gosub instru
d180: 63 74 69 6f 6e 20 69 73 20 61 6c 6c 20 74 68 61  ction is all tha
d190: 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67  t this routine g
d1a0: 65 6e 65 72 61 74 65 73 2e 20 45 78 74 72 61 20  enerates. Extra 
d1b0: 56 4d 20 63 6f 64 65 0a 2a 2a 20 66 6f 72 20 70  VM code.** for p
d1c0: 65 72 2d 72 6f 77 20 70 72 6f 63 65 73 73 69 6e  er-row processin
d1d0: 67 20 69 73 20 6f 6e 6c 79 20 67 65 6e 65 72 61  g is only genera
d1e0: 74 65 64 20 66 6f 72 20 74 68 65 20 66 6f 6c 6c  ted for the foll
d1f0: 6f 77 69 6e 67 20 62 75 69 6c 74 2d 69 6e 20 77  owing built-in w
d200: 69 6e 64 6f 77 0a 2a 2a 20 66 75 6e 63 74 69 6f  indow.** functio
d210: 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6e 74 68 5f  ns:.**.**   nth_
d220: 76 61 6c 75 65 28 29 0a 2a 2a 20 20 20 66 69 72  value().**   fir
d230: 73 74 5f 76 61 6c 75 65 28 29 0a 2a 2a 20 20 20  st_value().**   
d240: 6c 61 67 28 29 0a 2a 2a 20 20 20 6c 65 61 64 28  lag().**   lead(
d250: 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ).*/.static void
d260: 20 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65   windowReturnOne
d270: 52 6f 77 28 57 69 6e 64 6f 77 43 6f 64 65 41 72  Row(WindowCodeAr
d280: 67 20 2a 70 29 7b 0a 20 20 57 69 6e 64 6f 77 20  g *p){.  Window 
d290: 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 4d 57 69  *pMWin = p->pMWi
d2a0: 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  n;.  Vdbe *v = p
d2b0: 2d 3e 70 56 64 62 65 3b 0a 0a 20 20 69 66 28 20  ->pVdbe;..  if( 
d2c0: 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72 74 52  pMWin->regStartR
d2d0: 6f 77 69 64 20 29 7b 0a 20 20 20 20 77 69 6e 64  owid ){.    wind
d2e0: 6f 77 46 75 6c 6c 53 63 61 6e 28 70 29 3b 0a 20  owFullScan(p);. 
d2f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 61 72 73   }else{.    Pars
d300: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70  e *pParse = p->p
d310: 50 61 72 73 65 3b 0a 20 20 20 20 57 69 6e 64 6f  Parse;.    Windo
d320: 77 20 2a 70 57 69 6e 3b 0a 0a 20 20 20 20 66 6f  w *pWin;..    fo
d330: 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57  r(pWin=pMWin; pW
d340: 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70  in; pWin=pWin->p
d350: 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 20 20  NextWin){.      
d360: 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20 3d  FuncDef *pFunc =
d370: 20 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20   pWin->pFunc;.  
d380: 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 7a      if( pFunc->z
d390: 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e  Name==nth_valueN
d3a0: 61 6d 65 0a 20 20 20 20 20 20 20 7c 7c 20 70 46  ame.       || pF
d3b0: 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72 73  unc->zName==firs
d3c0: 74 5f 76 61 6c 75 65 4e 61 6d 65 0a 20 20 20 20  t_valueName.    
d3d0: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74    ){.        int
d3e0: 20 63 73 72 20 3d 20 70 57 69 6e 2d 3e 63 73 72   csr = pWin->csr
d3f0: 41 70 70 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  App;.        int
d400: 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33 56 64   lbl = sqlite3Vd
d410: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
d420: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  se);.        int
d430: 20 74 6d 70 52 65 67 20 3d 20 73 71 6c 69 74 65   tmpReg = sqlite
d440: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
d450: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
d460: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
d470: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57  , OP_Null, 0, pW
d480: 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a  in->regResult);.
d490: 20 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 70    .        if( p
d4a0: 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68  Func->zName==nth
d4b0: 5f 76 61 6c 75 65 4e 61 6d 65 20 29 7b 0a 20 20  _valueName ){.  
d4c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d4d0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
d4e0: 43 6f 6c 75 6d 6e 2c 70 4d 57 69 6e 2d 3e 69 45  Column,pMWin->iE
d4f0: 70 68 43 73 72 2c 70 57 69 6e 2d 3e 69 41 72 67  phCsr,pWin->iArg
d500: 43 6f 6c 2b 31 2c 74 6d 70 52 65 67 29 3b 0a 20  Col+1,tmpReg);. 
d510: 20 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43           windowC
d520: 68 65 63 6b 56 61 6c 75 65 28 70 50 61 72 73 65  heckValue(pParse
d530: 2c 20 74 6d 70 52 65 67 2c 20 32 29 3b 0a 20 20  , tmpReg, 2);.  
d540: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d550: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d560: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
d570: 6e 74 65 67 65 72 2c 20 31 2c 20 74 6d 70 52 65  nteger, 1, tmpRe
d580: 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  g);.        }.  
d590: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d5a0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64  eAddOp3(v, OP_Ad
d5b0: 64 2c 20 74 6d 70 52 65 67 2c 20 70 57 69 6e 2d  d, tmpReg, pWin-
d5c0: 3e 72 65 67 41 70 70 2c 20 74 6d 70 52 65 67 29  >regApp, tmpReg)
d5d0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
d5e0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
d5f0: 50 5f 47 74 2c 20 70 57 69 6e 2d 3e 72 65 67 41  P_Gt, pWin->regA
d600: 70 70 2b 31 2c 20 6c 62 6c 2c 20 74 6d 70 52 65  pp+1, lbl, tmpRe
d610: 67 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  g);.        Vdbe
d620: 43 6f 76 65 72 61 67 65 4e 65 76 65 72 4e 75 6c  CoverageNeverNul
d630: 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  l(v);.        sq
d640: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
d650: 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c  v, OP_SeekRowid,
d660: 20 63 73 72 2c 20 30 2c 20 74 6d 70 52 65 67 29   csr, 0, tmpReg)
d670: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
d680: 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b 65 6e  verageNeverTaken
d690: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
d6a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
d6b0: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72  , OP_Column, csr
d6c0: 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2c  , pWin->iArgCol,
d6d0: 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74   pWin->regResult
d6e0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
d6f0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
d700: 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20 20 20 20  el(v, lbl);.    
d710: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
d720: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
d730: 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20  , tmpReg);.     
d740: 20 7d 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66   }.      else if
d750: 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d  ( pFunc->zName==
d760: 6c 65 61 64 4e 61 6d 65 20 7c 7c 20 70 46 75 6e  leadName || pFun
d770: 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 61 67 4e 61 6d  c->zName==lagNam
d780: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  e ){.        int
d790: 20 6e 41 72 67 20 3d 20 70 57 69 6e 2d 3e 70 4f   nArg = pWin->pO
d7a0: 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  wner->x.pList->n
d7b0: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 6e  Expr;.        in
d7c0: 74 20 63 73 72 20 3d 20 70 57 69 6e 2d 3e 63 73  t csr = pWin->cs
d7d0: 72 41 70 70 3b 0a 20 20 20 20 20 20 20 20 69 6e  rApp;.        in
d7e0: 74 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33 56  t lbl = sqlite3V
d7f0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
d800: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  rse);.        in
d810: 74 20 74 6d 70 52 65 67 20 3d 20 73 71 6c 69 74  t tmpReg = sqlit
d820: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
d830: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  rse);.        in
d840: 74 20 69 45 70 68 20 3d 20 70 4d 57 69 6e 2d 3e  t iEph = pMWin->
d850: 69 45 70 68 43 73 72 3b 0a 20 20 0a 20 20 20 20  iEphCsr;.  .    
d860: 20 20 20 20 69 66 28 20 6e 41 72 67 3c 33 20 29      if( nArg<3 )
d870: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
d880: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
d890: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69   OP_Null, 0, pWi
d8a0: 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20  n->regResult);. 
d8b0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
d8c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d8d0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
d8e0: 43 6f 6c 75 6d 6e 2c 20 69 45 70 68 2c 70 57 69  Column, iEph,pWi
d8f0: 6e 2d 3e 69 41 72 67 43 6f 6c 2b 32 2c 70 57 69  n->iArgCol+2,pWi
d900: 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20  n->regResult);. 
d910: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d920: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d930: 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20  p2(v, OP_Rowid, 
d940: 69 45 70 68 2c 20 74 6d 70 52 65 67 29 3b 0a 20  iEph, tmpReg);. 
d950: 20 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3c         if( nArg<
d960: 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  2 ){.          i
d970: 6e 74 20 76 61 6c 20 3d 20 28 70 46 75 6e 63 2d  nt val = (pFunc-
d980: 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65  >zName==leadName
d990: 20 3f 20 31 20 3a 20 2d 31 29 3b 0a 20 20 20 20   ? 1 : -1);.    
d9a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d9b0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
d9c0: 64 49 6d 6d 2c 20 74 6d 70 52 65 67 2c 20 76 61  dImm, tmpReg, va
d9d0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  l);.        }els
d9e0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  e{.          int
d9f0: 20 6f 70 20 3d 20 28 70 46 75 6e 63 2d 3e 7a 4e   op = (pFunc->zN
da00: 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65 20 3f 20  ame==leadName ? 
da10: 4f 50 5f 41 64 64 20 3a 20 4f 50 5f 53 75 62 74  OP_Add : OP_Subt
da20: 72 61 63 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ract);.         
da30: 20 69 6e 74 20 74 6d 70 52 65 67 32 20 3d 20 73   int tmpReg2 = s
da40: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
da50: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
da60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
da70: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
da80: 6d 6e 2c 20 69 45 70 68 2c 20 70 57 69 6e 2d 3e  mn, iEph, pWin->
da90: 69 41 72 67 43 6f 6c 2b 31 2c 20 74 6d 70 52 65  iArgCol+1, tmpRe
daa0: 67 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  g2);.          s
dab0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
dac0: 28 76 2c 20 6f 70 2c 20 74 6d 70 52 65 67 32 2c  (v, op, tmpReg2,
dad0: 20 74 6d 70 52 65 67 2c 20 74 6d 70 52 65 67 29   tmpReg, tmpReg)
dae0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
daf0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
db00: 67 28 70 50 61 72 73 65 2c 20 74 6d 70 52 65 67  g(pParse, tmpReg
db10: 32 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  2);.        }.  
db20: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
db30: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
db40: 5f 53 65 65 6b 52 6f 77 69 64 2c 20 63 73 72 2c  _SeekRowid, csr,
db50: 20 6c 62 6c 2c 20 74 6d 70 52 65 67 29 3b 0a 20   lbl, tmpReg);. 
db60: 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
db70: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
db80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
db90: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
dba0: 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43  csr, pWin->iArgC
dbb0: 6f 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73  ol, pWin->regRes
dbc0: 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ult);.        sq
dbd0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
dbe0: 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20  Label(v, lbl);. 
dbf0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
dc00: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
dc10: 72 73 65 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20  rse, tmpReg);.  
dc20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
dc30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
dc40: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
dc50: 20 70 2d 3e 72 65 67 47 6f 73 75 62 2c 20 70 2d   p->regGosub, p-
dc60: 3e 61 64 64 72 47 6f 73 75 62 29 3b 0a 7d 0a 0a  >addrGosub);.}..
dc70: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
dc80: 6f 64 65 20 74 6f 20 73 65 74 20 74 68 65 20 61  ode to set the a
dc90: 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73  ccumulator regis
dca0: 74 65 72 20 66 6f 72 20 65 61 63 68 20 77 69 6e  ter for each win
dcb0: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  dow function.** 
dcc0: 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  in the linked li
dcd0: 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  st passed as the
dce0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
dcf0: 20 74 6f 20 4e 55 4c 4c 2e 20 41 6e 64 20 70 65   to NULL. And pe
dd00: 72 66 6f 72 6d 0a 2a 2a 20 61 6e 79 20 65 71 75  rform.** any equ
dd10: 69 76 61 6c 65 6e 74 20 69 6e 69 74 69 61 6c 69  ivalent initiali
dd20: 7a 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20  zation required 
dd30: 62 79 20 61 6e 79 20 62 75 69 6c 74 2d 69 6e 20  by any built-in 
dd40: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73  window functions
dd50: 0a 2a 2a 20 69 6e 20 74 68 65 20 6c 69 73 74 2e  .** in the list.
dd60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
dd70: 69 6e 64 6f 77 49 6e 69 74 41 63 63 75 6d 28 50  indowInitAccum(P
dd80: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 57 69  arse *pParse, Wi
dd90: 6e 64 6f 77 20 2a 70 4d 57 69 6e 29 7b 0a 20 20  ndow *pMWin){.  
dda0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
ddb0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
ddc0: 3b 0a 20 20 69 6e 74 20 72 65 67 41 72 67 3b 0a  ;.  int regArg;.
ddd0: 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 30 3b 0a    int nArg = 0;.
dde0: 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a    Window *pWin;.
ddf0: 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e    for(pWin=pMWin
de00: 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69  ; pWin; pWin=pWi
de10: 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20  n->pNextWin){.  
de20: 20 20 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63    FuncDef *pFunc
de30: 20 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a   = pWin->pFunc;.
de40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
de50: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
de60: 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63  , 0, pWin->regAc
de70: 63 75 6d 29 3b 0a 20 20 20 20 6e 41 72 67 20 3d  cum);.    nArg =
de80: 20 4d 41 58 28 6e 41 72 67 2c 20 77 69 6e 64 6f   MAX(nArg, windo
de90: 77 41 72 67 43 6f 75 6e 74 28 70 57 69 6e 29 29  wArgCount(pWin))
dea0: 3b 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d  ;.    if( pMWin-
deb0: 3e 72 65 67 53 74 61 72 74 52 6f 77 69 64 3d 3d  >regStartRowid==
dec0: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
ded0: 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68  Func->zName==nth
dee0: 5f 76 61 6c 75 65 4e 61 6d 65 20 7c 7c 20 70 46  _valueName || pF
def0: 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72 73  unc->zName==firs
df00: 74 5f 76 61 6c 75 65 4e 61 6d 65 20 29 7b 0a 20  t_valueName ){. 
df10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
df20: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
df30: 6e 74 65 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d  nteger, 0, pWin-
df40: 3e 72 65 67 41 70 70 29 3b 0a 20 20 20 20 20 20  >regApp);.      
df50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
df60: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
df70: 72 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41  r, 0, pWin->regA
df80: 70 70 2b 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  pp+1);.      }..
df90: 20 20 20 20 20 20 69 66 28 20 28 70 46 75 6e 63        if( (pFunc
dfa0: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
dfb0: 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58  LITE_FUNC_MINMAX
dfc0: 29 20 26 26 20 70 57 69 6e 2d 3e 63 73 72 41 70  ) && pWin->csrAp
dfd0: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  p ){.        ass
dfe0: 65 72 74 28 20 70 57 69 6e 2d 3e 65 53 74 61 72  ert( pWin->eStar
dff0: 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20  t!=TK_UNBOUNDED 
e000: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
e010: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
e020: 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20  OP_ResetSorter, 
e030: 70 57 69 6e 2d 3e 63 73 72 41 70 70 29 3b 0a 20  pWin->csrApp);. 
e040: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
e050: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
e060: 6e 74 65 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d  nteger, 0, pWin-
e070: 3e 72 65 67 41 70 70 2b 31 29 3b 0a 20 20 20 20  >regApp+1);.    
e080: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
e090: 72 65 67 41 72 67 20 3d 20 70 50 61 72 73 65 2d  regArg = pParse-
e0a0: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 70 50 61 72 73  >nMem+1;.  pPars
e0b0: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 41 72 67 3b  e->nMem += nArg;
e0c0: 0a 20 20 72 65 74 75 72 6e 20 72 65 67 41 72 67  .  return regArg
e0d0: 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 74 75  ;.}../* .** Retu
e0e0: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 63  rn true if the c
e0f0: 75 72 72 65 6e 74 20 66 72 61 6d 65 20 73 68 6f  urrent frame sho
e100: 75 6c 64 20 62 65 20 63 61 63 68 65 64 20 69 6e  uld be cached in
e110: 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74   the ephemeral t
e120: 61 62 6c 65 2c 0a 2a 2a 20 65 76 65 6e 20 69 66  able,.** even if
e130: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 78 49   there are no xI
e140: 6e 76 65 72 73 65 28 29 20 63 61 6c 6c 73 20 72  nverse() calls r
e150: 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  equired..*/.stat
e160: 69 63 20 69 6e 74 20 77 69 6e 64 6f 77 43 61 63  ic int windowCac
e170: 68 65 46 72 61 6d 65 28 57 69 6e 64 6f 77 20 2a  heFrame(Window *
e180: 70 4d 57 69 6e 29 7b 0a 20 20 57 69 6e 64 6f 77  pMWin){.  Window
e190: 20 2a 70 57 69 6e 3b 0a 20 20 69 66 28 20 70 4d   *pWin;.  if( pM
e1a0: 57 69 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f 77  Win->regStartRow
e1b0: 69 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  id ) return 1;. 
e1c0: 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b   for(pWin=pMWin;
e1d0: 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e   pWin; pWin=pWin
e1e0: 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20  ->pNextWin){.   
e1f0: 20 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20   FuncDef *pFunc 
e200: 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20  = pWin->pFunc;. 
e210: 20 20 20 69 66 28 20 28 70 46 75 6e 63 2d 3e 7a     if( (pFunc->z
e220: 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e  Name==nth_valueN
e230: 61 6d 65 29 0a 20 20 20 20 20 7c 7c 20 28 70 46  ame).     || (pF
e240: 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72 73  unc->zName==firs
e250: 74 5f 76 61 6c 75 65 4e 61 6d 65 29 0a 20 20 20  t_valueName).   
e260: 20 20 7c 7c 20 28 70 46 75 6e 63 2d 3e 7a 4e 61    || (pFunc->zNa
e270: 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65 29 0a 20 20  me==leadName).  
e280: 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d 3e 7a 4e     || (pFunc->zN
e290: 61 6d 65 3d 3d 6c 61 67 4e 61 6d 65 29 0a 20 20  ame==lagName).  
e2a0: 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
e2b0: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
e2c0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
e2d0: 0a 2a 2a 20 72 65 67 4f 6c 64 20 61 6e 64 20 72  .** regOld and r
e2e0: 65 67 4e 65 77 20 61 72 65 20 65 61 63 68 20 74  egNew are each t
e2f0: 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
e300: 72 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  r in an array of
e310: 20 73 69 7a 65 0a 2a 2a 20 70 4f 72 64 65 72 42   size.** pOrderB
e320: 79 2d 3e 6e 45 78 70 72 2e 20 54 68 69 73 20 66  y->nExpr. This f
e330: 75 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61 74 65  unction generate
e340: 73 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70 61 72  s code to compar
e350: 65 20 74 68 65 20 74 77 6f 0a 2a 2a 20 61 72 72  e the two.** arr
e360: 61 79 73 20 6f 66 20 72 65 67 69 73 74 65 72 73  ays of registers
e370: 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61   using the colla
e380: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20 61  tion sequences a
e390: 6e 64 20 6f 74 68 65 72 20 63 6f 6d 70 61 72 69  nd other compari
e3a0: 73 6f 6e 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  son.** parameter
e3b0: 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  s specified by p
e3c0: 4f 72 64 65 72 42 79 2e 20 0a 2a 2a 0a 2a 2a 20  OrderBy. .**.** 
e3d0: 49 66 20 74 68 65 20 74 77 6f 20 61 72 72 61 79  If the two array
e3e0: 73 20 61 72 65 20 6e 6f 74 20 65 71 75 61 6c 2c  s are not equal,
e3f0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
e400: 20 72 65 67 4e 65 77 20 69 73 20 63 6f 70 69 65   regNew is copie
e410: 64 20 74 6f 20 0a 2a 2a 20 72 65 67 4f 6c 64 20  d to .** regOld 
e420: 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 66 61 6c 6c  and control fall
e430: 73 20 74 68 72 6f 75 67 68 2e 20 4f 74 68 65 72  s through. Other
e440: 77 69 73 65 2c 20 69 66 20 74 68 65 20 63 6f 6e  wise, if the con
e450: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 61 72 72  tents of the arr
e460: 61 79 73 0a 2a 2a 20 61 72 65 20 65 71 75 61 6c  ays.** are equal
e470: 2c 20 61 6e 20 4f 50 5f 47 6f 74 6f 20 69 73 20  , an OP_Goto is 
e480: 65 78 65 63 75 74 65 64 2e 20 54 68 65 20 61 64  executed. The ad
e490: 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f  dress of the OP_
e4a0: 47 6f 74 6f 20 69 73 20 72 65 74 75 72 6e 65 64  Goto is returned
e4b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
e4c0: 20 77 69 6e 64 6f 77 49 66 4e 65 77 50 65 65 72   windowIfNewPeer
e4d0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
e4e0: 65 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  e,.  ExprList *p
e4f0: 4f 72 64 65 72 42 79 2c 0a 20 20 69 6e 74 20 72  OrderBy,.  int r
e500: 65 67 4e 65 77 2c 20 20 20 20 20 20 20 20 20 20  egNew,          
e510: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
e520: 72 73 74 20 69 6e 20 61 72 72 61 79 20 6f 66 20  rst in array of 
e530: 6e 65 77 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  new values */.  
e540: 69 6e 74 20 72 65 67 4f 6c 64 2c 20 20 20 20 20  int regOld,     
e550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e560: 2f 2a 20 46 69 72 73 74 20 69 6e 20 61 72 72 61  /* First in arra
e570: 79 20 6f 66 20 6f 6c 64 20 76 61 6c 75 65 73 20  y of old values 
e580: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 20 20 20  */.  int addr   
e590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5a0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
e5b0: 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  e */.){.  Vdbe *
e5c0: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
e5d0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
e5e0: 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
e5f0: 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 70 4f 72    int nVal = pOr
e600: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
e610: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
e620: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
e630: 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
e640: 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
e650: 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  y, 0, 0);.    sq
e660: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
e670: 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72  v, OP_Compare, r
e680: 65 67 4f 6c 64 2c 20 72 65 67 4e 65 77 2c 20 6e  egOld, regNew, n
e690: 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Val);.    sqlite
e6a0: 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c  3VdbeAppendP4(v,
e6b0: 20 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f   (void*)pKeyInfo
e6c0: 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
e6d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e6e0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
e6f0: 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56   .      sqlite3V
e700: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
e710: 29 2b 31 2c 20 61 64 64 72 2c 20 73 71 6c 69 74  )+1, addr, sqlit
e720: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
e730: 72 28 76 29 2b 31 0a 20 20 20 20 29 3b 0a 20 20  r(v)+1.    );.  
e740: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 45 71    VdbeCoverageEq
e750: 4e 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  Ne(v);.    sqlit
e760: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
e770: 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4e 65 77 2c  OP_Copy, regNew,
e780: 20 72 65 67 4f 6c 64 2c 20 6e 56 61 6c 2d 31 29   regOld, nVal-1)
e790: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
e7a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
e7b0: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
e7c0: 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  addr);.  }.}../*
e7d0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
e7e0: 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70  n is called as p
e7f0: 61 72 74 20 6f 66 20 67 65 6e 65 72 61 74 69 6e  art of generatin
e800: 67 20 56 4d 20 70 72 6f 67 72 61 6d 73 20 66 6f  g VM programs fo
e810: 72 20 52 41 4e 47 45 0a 2a 2a 20 6f 66 66 73 65  r RANGE.** offse
e820: 74 20 50 52 45 43 45 44 49 4e 47 2f 46 4f 4c 4c  t PRECEDING/FOLL
e830: 4f 57 49 4e 47 20 66 72 61 6d 65 20 62 6f 75 6e  OWING frame boun
e840: 64 61 72 69 65 73 2e 20 41 73 73 75 6d 69 6e 67  daries. Assuming
e850: 20 22 41 53 43 22 20 6f 72 64 65 72 20 66 6f 72   "ASC" order for
e860: 0a 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59  .** the ORDER BY
e870: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 77 69 6e   term in the win
e880: 64 6f 77 2c 20 69 74 20 67 65 6e 65 72 61 74 65  dow, it generate
e890: 73 20 63 6f 64 65 20 65 71 75 69 76 61 6c 65 6e  s code equivalen
e8a0: 74 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66  t to:.**.**   if
e8b0: 28 20 63 73 72 31 2e 70 65 65 72 56 61 6c 20 2b  ( csr1.peerVal +
e8c0: 20 72 65 67 56 61 6c 20 3e 3d 20 63 73 72 32 2e   regVal >= csr2.
e8d0: 70 65 65 72 56 61 6c 20 29 20 67 6f 74 6f 20 6c  peerVal ) goto l
e8e0: 62 6c 3b 0a 2a 2a 0a 2a 2a 20 41 20 73 70 65 63  bl;.**.** A spec
e8f0: 69 61 6c 20 74 79 70 65 20 6f 66 20 61 72 69 74  ial type of arit
e900: 68 6d 65 74 69 63 20 69 73 20 75 73 65 64 20 73  hmetic is used s
e910: 75 63 68 20 74 68 61 74 20 69 66 20 63 73 72 2e  uch that if csr.
e920: 70 65 65 72 56 61 6c 20 69 73 20 6e 6f 74 0a 2a  peerVal is not.*
e930: 2a 20 61 20 6e 75 6d 65 72 69 63 20 74 79 70 65  * a numeric type
e940: 20 28 72 65 61 6c 20 6f 72 20 69 6e 74 65 67 65   (real or intege
e950: 72 29 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  r), then the res
e960: 75 6c 74 20 6f 66 20 74 68 65 20 61 64 64 69 74  ult of the addit
e970: 69 6f 6e 20 69 73 0a 2a 2a 20 61 20 63 6f 70 79  ion is.** a copy
e980: 20 6f 66 20 63 73 72 31 2e 70 65 65 72 56 61 6c   of csr1.peerVal
e990: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
e9a0: 20 77 69 6e 64 6f 77 43 6f 64 65 52 61 6e 67 65   windowCodeRange
e9b0: 54 65 73 74 28 0a 20 20 57 69 6e 64 6f 77 43 6f  Test(.  WindowCo
e9c0: 64 65 41 72 67 20 2a 70 2c 20 0a 20 20 69 6e 74  deArg *p, .  int
e9d0: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
e9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e9f0: 20 4f 50 5f 47 65 20 6f 72 20 4f 50 5f 47 74 20   OP_Ge or OP_Gt 
ea00: 2a 2f 0a 20 20 69 6e 74 20 63 73 72 31 2c 20 0a  */.  int csr1, .
ea10: 20 20 69 6e 74 20 72 65 67 56 61 6c 2c 20 0a 20    int regVal, . 
ea20: 20 69 6e 74 20 63 73 72 32 2c 0a 20 20 69 6e 74   int csr2,.  int
ea30: 20 6c 62 6c 0a 29 7b 0a 20 20 50 61 72 73 65 20   lbl.){.  Parse 
ea40: 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61  *pParse = p->pPa
ea50: 72 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  rse;.  Vdbe *v =
ea60: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
ea70: 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72  pParse);.  int r
ea80: 65 67 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74  eg1 = sqlite3Get
ea90: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
eaa0: 0a 20 20 69 6e 74 20 72 65 67 32 20 3d 20 73 71  .  int reg2 = sq
eab0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
eac0: 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 61  pParse);.  int a
ead0: 72 69 74 68 20 3d 20 4f 50 5f 41 64 64 3b 0a 20  rith = OP_Add;. 
eae0: 20 69 6e 74 20 61 64 64 72 47 65 3b 0a 0a 20 20   int addrGe;..  
eaf0: 69 6e 74 20 72 65 67 53 74 72 69 6e 67 20 3d 20  int regString = 
eb00: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
eb10: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 4f  .  assert( op==O
eb20: 50 5f 47 65 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47  P_Ge || op==OP_G
eb30: 74 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29  t || op==OP_Le )
eb40: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
eb50: 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20 26  MWin->pOrderBy &
eb60: 26 20 70 2d 3e 70 4d 57 69 6e 2d 3e 70 4f 72 64  & p->pMWin->pOrd
eb70: 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 31 20 29  erBy->nExpr==1 )
eb80: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4d 57 69 6e  ;.  if( p->pMWin
eb90: 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d  ->pOrderBy->a[0]
eba0: 2e 73 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20 20  .sortOrder ){.  
ebb0: 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
ebc0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 47 65        case OP_Ge
ebd0: 3a 20 6f 70 20 3d 20 4f 50 5f 4c 65 3b 20 62 72  : op = OP_Le; br
ebe0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
ebf0: 4f 50 5f 47 74 3a 20 6f 70 20 3d 20 4f 50 5f 4c  OP_Gt: op = OP_L
ec00: 74 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  t; break;.      
ec10: 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28  default: assert(
ec20: 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 20 6f 70   op==OP_Le ); op
ec30: 20 3d 20 4f 50 5f 47 65 3b 20 62 72 65 61 6b 3b   = OP_Ge; break;
ec40: 0a 20 20 20 20 7d 0a 20 20 20 20 61 72 69 74 68  .    }.    arith
ec50: 20 3d 20 4f 50 5f 53 75 62 74 72 61 63 74 3b 0a   = OP_Subtract;.
ec60: 20 20 7d 0a 0a 20 20 77 69 6e 64 6f 77 52 65 61    }..  windowRea
ec70: 64 50 65 65 72 56 61 6c 75 65 73 28 70 2c 20 63  dPeerValues(p, c
ec80: 73 72 31 2c 20 72 65 67 31 29 3b 0a 20 20 77 69  sr1, reg1);.  wi
ec90: 6e 64 6f 77 52 65 61 64 50 65 65 72 56 61 6c 75  ndowReadPeerValu
eca0: 65 73 28 70 2c 20 63 73 72 32 2c 20 72 65 67 32  es(p, csr2, reg2
ecb0: 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  );..  /* Check i
ecc0: 66 20 74 68 65 20 70 65 65 72 20 76 61 6c 75 65  f the peer value
ecd0: 20 66 6f 72 20 63 73 72 31 20 76 61 6c 75 65 20   for csr1 value 
ece0: 69 73 20 61 20 74 65 78 74 20 6f 72 20 62 6c 6f  is a text or blo
ecf0: 62 20 62 79 20 63 6f 6d 70 61 72 69 6e 67 0a 20  b by comparing. 
ed00: 20 2a 2a 20 69 74 20 74 6f 20 74 68 65 20 73 6d   ** it to the sm
ed10: 61 6c 6c 65 73 74 20 70 6f 73 73 69 62 6c 65 20  allest possible 
ed20: 73 74 72 69 6e 67 20 2d 20 27 27 2e 20 49 66 20  string - ''. If 
ed30: 69 74 20 69 73 2c 20 6a 75 6d 70 20 6f 76 65 72  it is, jump over
ed40: 20 74 68 65 0a 20 20 2a 2a 20 4f 50 5f 41 64 64   the.  ** OP_Add
ed50: 20 6f 72 20 4f 50 5f 53 75 62 74 72 61 63 74 20   or OP_Subtract 
ed60: 6f 70 65 72 61 74 69 6f 6e 20 61 6e 64 20 70 72  operation and pr
ed70: 6f 63 65 65 64 20 64 69 72 65 63 74 6c 79 20 74  oceed directly t
ed80: 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  o the comparison
ed90: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  . */.  sqlite3Vd
eda0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53  beAddOp4(v, OP_S
edb0: 74 72 69 6e 67 38 2c 20 30 2c 20 72 65 67 53 74  tring8, 0, regSt
edc0: 72 69 6e 67 2c 20 30 2c 20 22 22 2c 20 50 34 5f  ring, 0, "", P4_
edd0: 53 54 41 54 49 43 29 3b 0a 20 20 61 64 64 72 47  STATIC);.  addrG
ede0: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  e = sqlite3VdbeA
edf0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 47 65 2c 20  ddOp3(v, OP_Ge, 
ee00: 72 65 67 53 74 72 69 6e 67 2c 20 30 2c 20 72 65  regString, 0, re
ee10: 67 31 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72  g1);.  VdbeCover
ee20: 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
ee30: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 61  3VdbeAddOp3(v, a
ee40: 72 69 74 68 2c 20 72 65 67 56 61 6c 2c 20 72 65  rith, regVal, re
ee50: 67 31 2c 20 72 65 67 31 29 3b 0a 20 20 73 71 6c  g1, reg1);.  sql
ee60: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
ee70: 28 76 2c 20 61 64 64 72 47 65 29 3b 0a 20 20 73  (v, addrGe);.  s
ee80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
ee90: 28 76 2c 20 6f 70 2c 20 72 65 67 32 2c 20 6c 62  (v, op, reg2, lb
eea0: 6c 2c 20 72 65 67 31 29 3b 20 56 64 62 65 43 6f  l, reg1); VdbeCo
eeb0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
eec0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
eed0: 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  (v, SQLITE_NULLE
eee0: 51 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70  Q);.  assert( op
eef0: 3d 3d 4f 50 5f 47 65 20 7c 7c 20 6f 70 3d 3d 4f  ==OP_Ge || op==O
ef00: 50 5f 47 74 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c  P_Gt || op==OP_L
ef10: 74 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29  t || op==OP_Le )
ef20: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d  ;.  testcase(op=
ef30: 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Ge); VdbeCov
ef40: 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
ef50: 50 5f 47 65 29 3b 0a 20 20 74 65 73 74 63 61 73  P_Ge);.  testcas
ef60: 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64  e(op==OP_Lt); Vd
ef70: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
ef80: 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 74 65  op==OP_Lt);.  te
ef90: 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65  stcase(op==OP_Le
efa0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
efb0: 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  f(v, op==OP_Le);
efc0: 0a 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  .  testcase(op==
efd0: 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65  OP_Gt); VdbeCove
efe0: 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
eff0: 5f 47 74 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  _Gt);..  sqlite3
f000: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
f010: 50 61 72 73 65 2c 20 72 65 67 31 29 3b 0a 20 20  Parse, reg1);.  
f020: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
f030: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
f040: 67 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65  g2);.}../*.** He
f050: 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f  lper function fo
f060: 72 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43  r sqlite3WindowC
f070: 6f 64 65 53 74 65 70 28 29 2e 20 45 61 63 68 20  odeStep(). Each 
f080: 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 66 75 6e  call to this fun
f090: 63 74 69 6f 6e 0a 2a 2a 20 67 65 6e 65 72 61 74  ction.** generat
f0a0: 65 73 20 56 4d 20 63 6f 64 65 20 66 6f 72 20 61  es VM code for a
f0b0: 20 73 69 6e 67 6c 65 20 52 45 54 55 52 4e 5f 52   single RETURN_R
f0c0: 4f 57 2c 20 41 47 47 53 54 45 50 20 6f 72 20 41  OW, AGGSTEP or A
f0d0: 47 47 49 4e 56 45 52 53 45 20 0a 2a 2a 20 6f 70  GGINVERSE .** op
f0e0: 65 72 61 74 69 6f 6e 2e 20 52 65 66 65 72 20 74  eration. Refer t
f0f0: 6f 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d  o the header com
f100: 6d 65 6e 74 20 66 6f 72 20 73 71 6c 69 74 65 33  ment for sqlite3
f110: 57 69 6e 64 6f 77 43 6f 64 65 53 74 65 70 28 29  WindowCodeStep()
f120: 20 66 6f 72 0a 2a 2a 20 64 65 74 61 69 6c 73 2e   for.** details.
f130: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
f140: 69 6e 64 6f 77 43 6f 64 65 4f 70 28 0a 20 57 69  indowCodeOp(. Wi
f150: 6e 64 6f 77 43 6f 64 65 41 72 67 20 2a 70 2c 20  ndowCodeArg *p, 
f160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f170: 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74  * Context object
f180: 20 2a 2f 0a 20 69 6e 74 20 6f 70 2c 20 20 20 20   */. int op,    
f190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1a0: 20 20 20 20 20 20 2f 2a 20 57 49 4e 44 4f 57 5f        /* WINDOW_
f1b0: 52 45 54 55 52 4e 5f 52 4f 57 2c 20 41 47 47 53  RETURN_ROW, AGGS
f1c0: 54 45 50 20 6f 72 20 41 47 47 49 4e 56 45 52 53  TEP or AGGINVERS
f1d0: 45 20 2a 2f 0a 20 69 6e 74 20 72 65 67 43 6f 75  E */. int regCou
f1e0: 6e 74 64 6f 77 6e 2c 20 20 20 20 20 20 20 20 20  ntdown,         
f1f0: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
f200: 65 72 20 66 6f 72 20 4f 50 5f 49 66 50 6f 73 20  er for OP_IfPos 
f210: 63 6f 75 6e 74 64 6f 77 6e 20 2a 2f 0a 20 69 6e  countdown */. in
f220: 74 20 6a 75 6d 70 4f 6e 45 6f 66 20 20 20 20 20  t jumpOnEof     
f230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f240: 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 73  * Jump here if s
f250: 74 65 70 70 65 64 20 63 75 72 73 6f 72 20 72 65  tepped cursor re
f260: 61 63 68 65 73 20 45 4f 46 20 2a 2f 0a 29 7b 0a  aches EOF */.){.
f270: 20 20 69 6e 74 20 63 73 72 2c 20 72 65 67 3b 0a    int csr, reg;.
f280: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
f290: 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 57  = p->pParse;.  W
f2a0: 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70  indow *pMWin = p
f2b0: 2d 3e 70 4d 57 69 6e 3b 0a 20 20 69 6e 74 20 72  ->pMWin;.  int r
f2c0: 65 74 20 3d 20 30 3b 0a 20 20 56 64 62 65 20 2a  et = 0;.  Vdbe *
f2d0: 76 20 3d 20 70 2d 3e 70 56 64 62 65 3b 0a 20 20  v = p->pVdbe;.  
f2e0: 69 6e 74 20 61 64 64 72 49 66 20 3d 20 30 3b 20  int addrIf = 0; 
f2f0: 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 69  .  int addrConti
f300: 6e 75 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61  nue = 0;.  int a
f310: 64 64 72 47 6f 74 6f 20 3d 20 30 3b 0a 20 20 69  ddrGoto = 0;.  i
f320: 6e 74 20 62 50 65 65 72 20 3d 20 28 70 4d 57 69  nt bPeer = (pMWi
f330: 6e 2d 3e 65 46 72 6d 54 79 70 65 21 3d 54 4b 5f  n->eFrmType!=TK_
f340: 52 4f 57 53 29 3b 0a 0a 20 20 69 6e 74 20 6c 62  ROWS);..  int lb
f350: 6c 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56  lDone = sqlite3V
f360: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
f370: 72 73 65 29 3b 0a 20 20 69 6e 74 20 61 64 64 72  rse);.  int addr
f380: 4e 65 78 74 52 61 6e 67 65 20 3d 20 30 3b 0a 0a  NextRange = 0;..
f390: 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73    /* Special cas
f3a0: 65 20 2d 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e  e - WINDOW_AGGIN
f3b0: 56 45 52 53 45 20 69 73 20 61 6c 77 61 79 73 20  VERSE is always 
f3c0: 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 66  a no-op if the f
f3d0: 72 61 6d 65 0a 20 20 2a 2a 20 73 74 61 72 74 73  rame.  ** starts
f3e0: 20 77 69 74 68 20 55 4e 42 4f 55 4e 44 45 44 20   with UNBOUNDED 
f3f0: 50 52 45 43 45 44 49 4e 47 2e 20 2a 2f 0a 20 20  PRECEDING. */.  
f400: 69 66 28 20 6f 70 3d 3d 57 49 4e 44 4f 57 5f 41  if( op==WINDOW_A
f410: 47 47 49 4e 56 45 52 53 45 20 26 26 20 70 4d 57  GGINVERSE && pMW
f420: 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55  in->eStart==TK_U
f430: 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20 20  NBOUNDED ){.    
f440: 61 73 73 65 72 74 28 20 72 65 67 43 6f 75 6e 74  assert( regCount
f450: 64 6f 77 6e 3d 3d 30 20 26 26 20 6a 75 6d 70 4f  down==0 && jumpO
f460: 6e 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 20 20 72  nEof==0 );.    r
f470: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
f480: 69 66 28 20 72 65 67 43 6f 75 6e 74 64 6f 77 6e  if( regCountdown
f490: 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4d  >0 ){.    if( pM
f4a0: 57 69 6e 2d 3e 65 46 72 6d 54 79 70 65 3d 3d 54  Win->eFrmType==T
f4b0: 4b 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20  K_RANGE ){.     
f4c0: 20 61 64 64 72 4e 65 78 74 52 61 6e 67 65 20 3d   addrNextRange =
f4d0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
f4e0: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
f4f0: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 57 49    assert( op==WI
f500: 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 20  NDOW_AGGINVERSE 
f510: 7c 7c 20 6f 70 3d 3d 57 49 4e 44 4f 57 5f 41 47  || op==WINDOW_AG
f520: 47 53 54 45 50 20 29 3b 0a 20 20 20 20 20 20 69  GSTEP );.      i
f530: 66 28 20 6f 70 3d 3d 57 49 4e 44 4f 57 5f 41 47  f( op==WINDOW_AG
f540: 47 49 4e 56 45 52 53 45 20 29 7b 0a 20 20 20 20  GINVERSE ){.    
f550: 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65      if( pMWin->e
f560: 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57  Start==TK_FOLLOW
f570: 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ING ){.         
f580: 20 77 69 6e 64 6f 77 43 6f 64 65 52 61 6e 67 65   windowCodeRange
f590: 54 65 73 74 28 0a 20 20 20 20 20 20 20 20 20 20  Test(.          
f5a0: 20 20 20 20 70 2c 20 4f 50 5f 4c 65 2c 20 70 2d      p, OP_Le, p-
f5b0: 3e 63 75 72 72 65 6e 74 2e 63 73 72 2c 20 72 65  >current.csr, re
f5c0: 67 43 6f 75 6e 74 64 6f 77 6e 2c 20 70 2d 3e 73  gCountdown, p->s
f5d0: 74 61 72 74 2e 63 73 72 2c 20 6c 62 6c 44 6f 6e  tart.csr, lblDon
f5e0: 65 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  e.          );. 
f5f0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
f600: 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f          windowCo
f610: 64 65 52 61 6e 67 65 54 65 73 74 28 0a 20 20 20  deRangeTest(.   
f620: 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 4f 50             p, OP
f630: 5f 47 65 2c 20 70 2d 3e 73 74 61 72 74 2e 63 73  _Ge, p->start.cs
f640: 72 2c 20 72 65 67 43 6f 75 6e 74 64 6f 77 6e 2c  r, regCountdown,
f650: 20 70 2d 3e 63 75 72 72 65 6e 74 2e 63 73 72 2c   p->current.csr,
f660: 20 6c 62 6c 44 6f 6e 65 0a 20 20 20 20 20 20 20   lblDone.       
f670: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a     );.        }.
f680: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f690: 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 52       windowCodeR
f6a0: 61 6e 67 65 54 65 73 74 28 0a 20 20 20 20 20 20  angeTest(.      
f6b0: 20 20 20 20 20 20 70 2c 20 4f 50 5f 47 74 2c 20        p, OP_Gt, 
f6c0: 70 2d 3e 65 6e 64 2e 63 73 72 2c 20 72 65 67 43  p->end.csr, regC
f6d0: 6f 75 6e 74 64 6f 77 6e 2c 20 70 2d 3e 63 75 72  ountdown, p->cur
f6e0: 72 65 6e 74 2e 63 73 72 2c 20 6c 62 6c 44 6f 6e  rent.csr, lblDon
f6f0: 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  e.        );.   
f700: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
f710: 20 20 20 20 20 20 61 64 64 72 49 66 20 3d 20 73        addrIf = s
f720: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
f730: 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 72 65  (v, OP_IfPos, re
f740: 67 43 6f 75 6e 74 64 6f 77 6e 2c 20 30 2c 20 31  gCountdown, 0, 1
f750: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
f760: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a  erage(v);.    }.
f770: 20 20 7d 0a 0a 20 20 69 66 28 20 6f 70 3d 3d 57    }..  if( op==W
f780: 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57  INDOW_RETURN_ROW
f790: 20 26 26 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74   && pMWin->regSt
f7a0: 61 72 74 52 6f 77 69 64 3d 3d 30 20 29 7b 0a 20  artRowid==0 ){. 
f7b0: 20 20 20 77 69 6e 64 6f 77 41 67 67 46 69 6e 61     windowAggFina
f7c0: 6c 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 61  l(p, 0);.  }.  a
f7d0: 64 64 72 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71  ddrContinue = sq
f7e0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
f7f0: 41 64 64 72 28 76 29 3b 0a 20 20 73 77 69 74 63  Addr(v);.  switc
f800: 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
f810: 65 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f  e WINDOW_RETURN_
f820: 52 4f 57 3a 0a 20 20 20 20 20 20 63 73 72 20 3d  ROW:.      csr =
f830: 20 70 2d 3e 63 75 72 72 65 6e 74 2e 63 73 72 3b   p->current.csr;
f840: 0a 20 20 20 20 20 20 72 65 67 20 3d 20 70 2d 3e  .      reg = p->
f850: 63 75 72 72 65 6e 74 2e 72 65 67 3b 0a 20 20 20  current.reg;.   
f860: 20 20 20 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f     windowReturnO
f870: 6e 65 52 6f 77 28 70 29 3b 0a 20 20 20 20 20 20  neRow(p);.      
f880: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
f890: 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52   WINDOW_AGGINVER
f8a0: 53 45 3a 0a 20 20 20 20 20 20 63 73 72 20 3d 20  SE:.      csr = 
f8b0: 70 2d 3e 73 74 61 72 74 2e 63 73 72 3b 0a 20 20  p->start.csr;.  
f8c0: 20 20 20 20 72 65 67 20 3d 20 70 2d 3e 73 74 61      reg = p->sta
f8d0: 72 74 2e 72 65 67 3b 0a 20 20 20 20 20 20 69 66  rt.reg;.      if
f8e0: 28 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72  ( pMWin->regStar
f8f0: 74 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  tRowid ){.      
f900: 20 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d    assert( pMWin-
f910: 3e 72 65 67 45 6e 64 52 6f 77 69 64 20 29 3b 0a  >regEndRowid );.
f920: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
f930: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f940: 41 64 64 49 6d 6d 2c 20 70 4d 57 69 6e 2d 3e 72  AddImm, pMWin->r
f950: 65 67 53 74 61 72 74 52 6f 77 69 64 2c 20 31 29  egStartRowid, 1)
f960: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
f970: 20 20 20 20 20 20 20 77 69 6e 64 6f 77 41 67 67         windowAgg
f980: 53 74 65 70 28 70 50 61 72 73 65 2c 20 70 4d 57  Step(pParse, pMW
f990: 69 6e 2c 20 63 73 72 2c 20 31 2c 20 70 2d 3e 72  in, csr, 1, p->r
f9a0: 65 67 41 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a  egArg);.      }.
f9b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
f9c0: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
f9d0: 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 57 49 4e   assert( op==WIN
f9e0: 44 4f 57 5f 41 47 47 53 54 45 50 20 29 3b 0a 20  DOW_AGGSTEP );. 
f9f0: 20 20 20 20 20 63 73 72 20 3d 20 70 2d 3e 65 6e       csr = p->en
fa00: 64 2e 63 73 72 3b 0a 20 20 20 20 20 20 72 65 67  d.csr;.      reg
fa10: 20 3d 20 70 2d 3e 65 6e 64 2e 72 65 67 3b 0a 20   = p->end.reg;. 
fa20: 20 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e       if( pMWin->
fa30: 72 65 67 53 74 61 72 74 52 6f 77 69 64 20 29 7b  regStartRowid ){
fa40: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
fa50: 20 70 4d 57 69 6e 2d 3e 72 65 67 45 6e 64 52 6f   pMWin->regEndRo
fa60: 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20 73  wid );.        s
fa70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
fa80: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70  (v, OP_AddImm, p
fa90: 4d 57 69 6e 2d 3e 72 65 67 45 6e 64 52 6f 77 69  MWin->regEndRowi
faa0: 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  d, 1);.      }el
fab0: 73 65 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 64  se{.        wind
fac0: 6f 77 41 67 67 53 74 65 70 28 70 50 61 72 73 65  owAggStep(pParse
fad0: 2c 20 70 4d 57 69 6e 2c 20 63 73 72 2c 20 30 2c  , pMWin, csr, 0,
fae0: 20 70 2d 3e 72 65 67 41 72 67 29 3b 0a 20 20 20   p->regArg);.   
faf0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
fb00: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f 70 3d  ;.  }..  if( op=
fb10: 3d 70 2d 3e 65 44 65 6c 65 74 65 20 29 7b 0a 20  =p->eDelete ){. 
fb20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fb30: 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74  dOp1(v, OP_Delet
fb40: 65 2c 20 63 73 72 29 3b 0a 20 20 20 20 73 71 6c  e, csr);.    sql
fb50: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
fb60: 28 76 2c 20 4f 50 46 4c 41 47 5f 53 41 56 45 50  (v, OPFLAG_SAVEP
fb70: 4f 53 49 54 49 4f 4e 29 3b 0a 20 20 7d 0a 0a 20  OSITION);.  }.. 
fb80: 20 69 66 28 20 6a 75 6d 70 4f 6e 45 6f 66 20 29   if( jumpOnEof )
fb90: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
fba0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
fbb0: 78 74 2c 20 63 73 72 2c 20 73 71 6c 69 74 65 33  xt, csr, sqlite3
fbc0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
fbd0: 76 29 2b 32 29 3b 0a 20 20 20 20 56 64 62 65 43  v)+2);.    VdbeC
fbe0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
fbf0: 72 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ret = sqlite3Vdb
fc00: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f  eAddOp0(v, OP_Go
fc10: 74 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  to);.  }else{.  
fc20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fc30: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
fc40: 63 73 72 2c 20 73 71 6c 69 74 65 33 56 64 62 65  csr, sqlite3Vdbe
fc50: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31  CurrentAddr(v)+1
fc60: 2b 62 50 65 65 72 29 3b 0a 20 20 20 20 56 64 62  +bPeer);.    Vdb
fc70: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
fc80: 20 20 69 66 28 20 62 50 65 65 72 20 29 7b 0a 20    if( bPeer ){. 
fc90: 20 20 20 20 20 61 64 64 72 47 6f 74 6f 20 3d 20       addrGoto = 
fca0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fcb0: 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20  0(v, OP_Goto);. 
fcc0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
fcd0: 62 50 65 65 72 20 29 7b 0a 20 20 20 20 69 6e 74  bPeer ){.    int
fce0: 20 6e 52 65 67 20 3d 20 28 70 4d 57 69 6e 2d 3e   nReg = (pMWin->
fcf0: 70 4f 72 64 65 72 42 79 20 3f 20 70 4d 57 69 6e  pOrderBy ? pMWin
fd00: 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
fd10: 72 20 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74 20  r : 0);.    int 
fd20: 72 65 67 54 6d 70 20 3d 20 28 6e 52 65 67 20 3f  regTmp = (nReg ?
fd30: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
fd40: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 52 65  ange(pParse, nRe
fd50: 67 29 20 3a 20 30 29 3b 0a 20 20 20 20 77 69 6e  g) : 0);.    win
fd60: 64 6f 77 52 65 61 64 50 65 65 72 56 61 6c 75 65  dowReadPeerValue
fd70: 73 28 70 2c 20 63 73 72 2c 20 72 65 67 54 6d 70  s(p, csr, regTmp
fd80: 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 49 66 4e  );.    windowIfN
fd90: 65 77 50 65 65 72 28 70 50 61 72 73 65 2c 20 70  ewPeer(pParse, p
fda0: 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 2c 20  MWin->pOrderBy, 
fdb0: 72 65 67 54 6d 70 2c 20 72 65 67 2c 20 61 64 64  regTmp, reg, add
fdc0: 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20  rContinue);.    
fdd0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
fde0: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
fdf0: 72 65 67 54 6d 70 2c 20 6e 52 65 67 29 3b 0a 20  regTmp, nReg);. 
fe00: 20 7d 0a 0a 20 20 69 66 28 20 61 64 64 72 4e 65   }..  if( addrNe
fe10: 78 74 52 61 6e 67 65 20 29 7b 0a 20 20 20 20 73  xtRange ){.    s
fe20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
fe30: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
fe40: 61 64 64 72 4e 65 78 74 52 61 6e 67 65 29 3b 0a  addrNextRange);.
fe50: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
fe60: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
fe70: 20 6c 62 6c 44 6f 6e 65 29 3b 0a 20 20 69 66 28   lblDone);.  if(
fe80: 20 61 64 64 72 47 6f 74 6f 20 29 20 73 71 6c 69   addrGoto ) sqli
fe90: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
fea0: 76 2c 20 61 64 64 72 47 6f 74 6f 29 3b 0a 20 20  v, addrGoto);.  
feb0: 69 66 28 20 61 64 64 72 49 66 20 29 20 73 71 6c  if( addrIf ) sql
fec0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
fed0: 28 76 2c 20 61 64 64 72 49 66 29 3b 0a 20 20 72  (v, addrIf);.  r
fee0: 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 0a 2f  eturn ret;.}.../
fef0: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
ff00: 64 20 72 65 74 75 72 6e 20 61 20 64 75 70 6c 69  d return a dupli
ff10: 63 61 74 65 20 6f 66 20 74 68 65 20 57 69 6e 64  cate of the Wind
ff20: 6f 77 20 6f 62 6a 65 63 74 20 69 6e 64 69 63 61  ow object indica
ff30: 74 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 74 68  ted by the.** th
ff40: 69 72 64 20 61 72 67 75 6d 65 6e 74 2e 20 53 65  ird argument. Se
ff50: 74 20 74 68 65 20 57 69 6e 64 6f 77 2e 70 4f 77  t the Window.pOw
ff60: 6e 65 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ner field of the
ff70: 20 6e 65 77 20 6f 62 6a 65 63 74 20 74 6f 0a 2a   new object to.*
ff80: 2a 20 70 4f 77 6e 65 72 2e 0a 2a 2f 0a 57 69 6e  * pOwner..*/.Win
ff90: 64 6f 77 20 2a 73 71 6c 69 74 65 33 57 69 6e 64  dow *sqlite3Wind
ffa0: 6f 77 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  owDup(sqlite3 *d
ffb0: 62 2c 20 45 78 70 72 20 2a 70 4f 77 6e 65 72 2c  b, Expr *pOwner,
ffc0: 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 57   Window *p){.  W
ffd0: 69 6e 64 6f 77 20 2a 70 4e 65 77 20 3d 20 30 3b  indow *pNew = 0;
ffe0: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 29  .  if( ALWAYS(p)
fff0: 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73   ){.    pNew = s
10000 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
10010 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 57 69  ro(db, sizeof(Wi
10020 6e 64 6f 77 29 29 3b 0a 20 20 20 20 69 66 28 20  ndow));.    if( 
10030 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e  pNew ){.      pN
10040 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ew->zName = sqli
10050 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
10060 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  p->zName);.     
10070 20 70 4e 65 77 2d 3e 70 46 69 6c 74 65 72 20 3d   pNew->pFilter =
10080 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
10090 64 62 2c 20 70 2d 3e 70 46 69 6c 74 65 72 2c 20  db, p->pFilter, 
100a0 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  0);.      pNew->
100b0 70 46 75 6e 63 20 3d 20 70 2d 3e 70 46 75 6e 63  pFunc = p->pFunc
100c0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50  ;.      pNew->pP
100d0 61 72 74 69 74 69 6f 6e 20 3d 20 73 71 6c 69 74  artition = sqlit
100e0 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
100f0 2c 20 70 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c  , p->pPartition,
10100 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d   0);.      pNew-
10110 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69  >pOrderBy = sqli
10120 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
10130 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  b, p->pOrderBy, 
10140 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  0);.      pNew->
10150 65 46 72 6d 54 79 70 65 20 3d 20 70 2d 3e 65 46  eFrmType = p->eF
10160 72 6d 54 79 70 65 3b 0a 20 20 20 20 20 20 70 4e  rmType;.      pN
10170 65 77 2d 3e 65 45 6e 64 20 3d 20 70 2d 3e 65 45  ew->eEnd = p->eE
10180 6e 64 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  nd;.      pNew->
10190 65 53 74 61 72 74 20 3d 20 70 2d 3e 65 53 74 61  eStart = p->eSta
101a0 72 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  rt;.      pNew->
101b0 65 45 78 63 6c 75 64 65 20 3d 20 70 2d 3e 65 45  eExclude = p->eE
101c0 78 63 6c 75 64 65 3b 0a 20 20 20 20 20 20 70 4e  xclude;.      pN
101d0 65 77 2d 3e 70 53 74 61 72 74 20 3d 20 73 71 6c  ew->pStart = sql
101e0 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
101f0 70 2d 3e 70 53 74 61 72 74 2c 20 30 29 3b 0a 20  p->pStart, 0);. 
10200 20 20 20 20 20 70 4e 65 77 2d 3e 70 45 6e 64 20       pNew->pEnd 
10210 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
10220 28 64 62 2c 20 70 2d 3e 70 45 6e 64 2c 20 30 29  (db, p->pEnd, 0)
10230 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4f  ;.      pNew->pO
10240 77 6e 65 72 20 3d 20 70 4f 77 6e 65 72 3b 0a 20  wner = pOwner;. 
10250 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
10260 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
10270 20 52 65 74 75 72 6e 20 61 20 63 6f 70 79 20 6f   Return a copy o
10280 66 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  f the linked lis
10290 74 20 6f 66 20 57 69 6e 64 6f 77 20 6f 62 6a 65  t of Window obje
102a0 63 74 73 20 70 61 73 73 65 64 20 61 73 20 74 68  cts passed as th
102b0 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75  e.** second argu
102c0 6d 65 6e 74 2e 0a 2a 2f 0a 57 69 6e 64 6f 77 20  ment..*/.Window 
102d0 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4c 69  *sqlite3WindowLi
102e0 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  stDup(sqlite3 *d
102f0 62 2c 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20  b, Window *p){. 
10300 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20   Window *pWin;. 
10310 20 57 69 6e 64 6f 77 20 2a 70 52 65 74 20 3d 20   Window *pRet = 
10320 30 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 2a 70 70  0;.  Window **pp
10330 20 3d 20 26 70 52 65 74 3b 0a 0a 20 20 66 6f 72   = &pRet;..  for
10340 28 70 57 69 6e 3d 70 3b 20 70 57 69 6e 3b 20 70  (pWin=p; pWin; p
10350 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57  Win=pWin->pNextW
10360 69 6e 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20 73  in){.    *pp = s
10370 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 75 70 28  qlite3WindowDup(
10380 64 62 2c 20 30 2c 20 70 57 69 6e 29 3b 0a 20 20  db, 0, pWin);.  
10390 20 20 69 66 28 20 2a 70 70 3d 3d 30 20 29 20 62    if( *pp==0 ) b
103a0 72 65 61 6b 3b 0a 20 20 20 20 70 70 20 3d 20 26  reak;.    pp = &
103b0 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 57 69 6e  ((*pp)->pNextWin
103c0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
103d0 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pRet;.}../*.** 
103e0 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69  Return true if i
103f0 74 20 63 61 6e 20 62 65 20 64 65 74 65 72 6d 69  t can be determi
10400 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  ned at compile t
10410 69 6d 65 20 74 68 61 74 20 65 78 70 72 65 73 73  ime that express
10420 69 6f 6e 20 0a 2a 2a 20 70 45 78 70 72 20 65 76  ion .** pExpr ev
10430 61 6c 75 61 74 65 73 20 74 6f 20 61 20 76 61 6c  aluates to a val
10440 75 65 20 74 68 61 74 2c 20 77 68 65 6e 20 63 61  ue that, when ca
10450 73 74 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  st to an integer
10460 2c 20 69 73 20 67 72 65 61 74 65 72 20 0a 2a 2a  , is greater .**
10470 20 74 68 61 6e 20 7a 65 72 6f 2e 20 46 61 6c 73   than zero. Fals
10480 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a  e otherwise..**.
10490 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72  ** If an OOM err
104a0 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20  or occurs, this 
104b0 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68  function sets th
104c0 65 20 50 61 72 73 65 2e 64 62 2e 6d 61 6c 6c 6f  e Parse.db.mallo
104d0 63 46 61 69 6c 65 64 20 0a 2a 2a 20 66 6c 61 67  cFailed .** flag
104e0 20 61 6e 64 20 72 65 74 75 72 6e 73 20 7a 65 72   and returns zer
104f0 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
10500 20 77 69 6e 64 6f 77 45 78 70 72 47 74 5a 65 72   windowExprGtZer
10510 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  o(Parse *pParse,
10520 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
10530 20 69 6e 74 20 72 65 74 20 3d 20 30 3b 0a 20 20   int ret = 0;.  
10540 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
10550 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73 71 6c 69  arse->db;.  sqli
10560 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20  te3_value *pVal 
10570 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 61  = 0;.  sqlite3Va
10580 6c 75 65 46 72 6f 6d 45 78 70 72 28 64 62 2c 20  lueFromExpr(db, 
10590 70 45 78 70 72 2c 20 64 62 2d 3e 65 6e 63 2c 20  pExpr, db->enc, 
105a0 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
105b0 49 43 2c 20 26 70 56 61 6c 29 3b 0a 20 20 69 66  IC, &pVal);.  if
105c0 28 20 70 56 61 6c 20 26 26 20 73 71 6c 69 74 65  ( pVal && sqlite
105d0 33 5f 76 61 6c 75 65 5f 69 6e 74 28 70 56 61 6c  3_value_int(pVal
105e0 29 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 20 3d  )>0 ){.    ret =
105f0 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   1;.  }.  sqlite
10600 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
10610 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a  ;.  return ret;.
10620 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33  }../*.** sqlite3
10630 57 68 65 72 65 42 65 67 69 6e 28 29 20 68 61 73  WhereBegin() has
10640 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
10650 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 53 45 4c  lled for the SEL
10660 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a  ECT statement .*
10670 2a 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  * passed as the 
10680 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
10690 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
106a0 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 2e 20 49  on is invoked. I
106b0 74 20 67 65 6e 65 72 61 74 65 73 0a 2a 2a 20 63  t generates.** c
106c0 6f 64 65 20 74 6f 20 70 6f 70 75 6c 61 74 65 20  ode to populate 
106d0 74 68 65 20 57 69 6e 64 6f 77 2e 72 65 67 52 65  the Window.regRe
106e0 73 75 6c 74 20 72 65 67 69 73 74 65 72 20 66 6f  sult register fo
106f0 72 20 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75  r each window fu
10700 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 6e 64 20 69  nction .** and i
10710 6e 76 6f 6b 65 20 74 68 65 20 73 75 62 2d 72 6f  nvoke the sub-ro
10720 75 74 69 6e 65 20 61 74 20 69 6e 73 74 72 75 63  utine at instruc
10730 74 69 6f 6e 20 61 64 64 72 47 6f 73 75 62 20 6f  tion addrGosub o
10740 6e 63 65 20 66 6f 72 20 65 61 63 68 20 72 6f 77  nce for each row
10750 2e 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72  ..** sqlite3Wher
10760 65 45 6e 64 28 29 20 69 73 20 61 6c 77 61 79 73  eEnd() is always
10770 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 72   called before r
10780 65 74 75 72 6e 69 6e 67 2e 20 0a 2a 2a 0a 2a 2a  eturning. .**.**
10790 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68   This function h
107a0 61 6e 64 6c 65 73 20 73 65 76 65 72 61 6c 20 64  andles several d
107b0 69 66 66 65 72 65 6e 74 20 74 79 70 65 73 20 6f  ifferent types o
107c0 66 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 73 2c  f window frames,
107d0 20 77 68 69 63 68 0a 2a 2a 20 72 65 71 75 69 72   which.** requir
107e0 65 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65  e slightly diffe
107f0 72 65 6e 74 20 70 72 6f 63 65 73 73 69 6e 67 2e  rent processing.
10800 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   The following p
10810 73 65 75 64 6f 20 63 6f 64 65 20 69 73 0a 2a 2a  seudo code is.**
10820 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
10830 6e 74 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 73  nt window frames
10840 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
10850 0a 2a 2a 20 20 20 52 4f 57 53 20 42 45 54 57 45  .**   ROWS BETWE
10860 45 4e 20 3c 65 78 70 72 31 3e 20 50 52 45 43 45  EN <expr1> PRECE
10870 44 49 4e 47 20 41 4e 44 20 3c 65 78 70 72 32 3e  DING AND <expr2>
10880 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a   FOLLOWING.**.**
10890 20 4f 74 68 65 72 20 77 69 6e 64 6f 77 20 66 72   Other window fr
108a0 61 6d 65 20 74 79 70 65 73 20 75 73 65 20 76 61  ame types use va
108b0 72 69 61 6e 74 73 20 6f 66 20 74 68 65 20 66 6f  riants of the fo
108c0 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
108d0 20 20 20 2e 2e 2e 20 6c 6f 6f 70 20 73 74 61 72     ... loop star
108e0 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 68  ted by sqlite3Wh
108f0 65 72 65 42 65 67 69 6e 28 29 20 2e 2e 2e 0a 2a  ereBegin() ....*
10900 2a 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 20  *       if( new 
10910 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20  partition ){.** 
10920 20 20 20 20 20 20 20 20 47 6f 73 75 62 20 66 6c          Gosub fl
10930 75 73 68 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a  ush.**       }.*
10940 2a 20 20 20 20 20 20 20 49 6e 73 65 72 74 20 6e  *       Insert n
10950 65 77 20 72 6f 77 20 69 6e 74 6f 20 65 70 68 20  ew row into eph 
10960 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 20 20  table..**       
10970 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 66 69  .**       if( fi
10980 72 73 74 20 72 6f 77 20 6f 66 20 70 61 72 74 69  rst row of parti
10990 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20  tion ){.**      
109a0 20 20 20 2f 2f 20 52 65 77 69 6e 64 20 74 68 72     // Rewind thr
109b0 65 65 20 63 75 72 73 6f 72 73 2c 20 61 6c 6c 20  ee cursors, all 
109c0 6f 70 65 6e 20 6f 6e 20 74 68 65 20 65 70 68 20  open on the eph 
109d0 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 20 20  table..**       
109e0 20 20 52 65 77 69 6e 64 28 63 73 72 45 6e 64 29    Rewind(csrEnd)
109f0 3b 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 65 77  ;.**         Rew
10a00 69 6e 64 28 63 73 72 53 74 61 72 74 29 3b 0a 2a  ind(csrStart);.*
10a10 2a 20 20 20 20 20 20 20 20 20 52 65 77 69 6e 64  *         Rewind
10a20 28 63 73 72 43 75 72 72 65 6e 74 29 3b 0a 2a 2a  (csrCurrent);.**
10a30 20 20 20 20 20 20 20 0a 2a 2a 20 20 20 20 20 20         .**      
10a40 20 20 20 72 65 67 45 6e 64 20 3d 20 3c 65 78 70     regEnd = <exp
10a50 72 32 3e 20 20 20 20 20 20 20 20 20 20 2f 2f 20  r2>          // 
10a60 46 4f 4c 4c 4f 57 49 4e 47 20 65 78 70 72 65 73  FOLLOWING expres
10a70 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  sion.**         
10a80 72 65 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72  regStart = <expr
10a90 31 3e 20 20 20 20 20 20 20 20 2f 2f 20 50 52 45  1>        // PRE
10aa0 43 45 44 49 4e 47 20 65 78 70 72 65 73 73 69 6f  CEDING expressio
10ab0 6e 0a 2a 2a 20 20 20 20 20 20 20 7d 65 6c 73 65  n.**       }else
10ac0 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 2f 2f 20  {.**         // 
10ad0 46 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20  First time this 
10ae0 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 2c  branch is taken,
10af0 20 74 68 65 20 65 70 68 20 74 61 62 6c 65 20 63   the eph table c
10b00 6f 6e 74 61 69 6e 73 20 74 77 6f 20 0a 2a 2a 20  ontains two .** 
10b10 20 20 20 20 20 20 20 20 2f 2f 20 72 6f 77 73 2e          // rows.
10b20 20 54 68 65 20 66 69 72 73 74 20 72 6f 77 20 69   The first row i
10b30 6e 20 74 68 65 20 70 61 72 74 69 74 69 6f 6e 2c  n the partition,
10b40 20 77 68 69 63 68 20 61 6c 6c 20 74 68 72 65 65   which all three
10b50 20 63 75 72 73 6f 72 73 0a 2a 2a 20 20 20 20 20   cursors.**     
10b60 20 20 20 20 2f 2f 20 63 75 72 72 65 6e 74 6c 79      // currently
10b70 20 70 6f 69 6e 74 20 74 6f 2c 20 61 6e 64 20 74   point to, and t
10b80 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 77  he following row
10b90 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 47 47  ..**         AGG
10ba0 53 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 20 20  STEP.**         
10bb0 69 66 28 20 28 72 65 67 45 6e 64 2d 2d 29 3c 3d  if( (regEnd--)<=
10bc0 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  0 ){.**         
10bd0 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20    RETURN_ROW.** 
10be0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 72            if( (r
10bf0 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20 29 7b  egStart--)<=0 ){
10c00 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
10c10 41 47 47 49 4e 56 45 52 53 45 0a 2a 2a 20 20 20  AGGINVERSE.**   
10c20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20          }.**    
10c30 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20       }.**       
10c40 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20  }.**     }.**   
10c50 20 20 66 6c 75 73 68 3a 0a 2a 2a 20 20 20 20 20    flush:.**     
10c60 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20    AGGSTEP.**    
10c70 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 2a     while( 1 ){.*
10c80 2a 20 20 20 20 20 20 20 20 20 52 45 54 55 52 4e  *         RETURN
10c90 20 52 4f 57 0a 2a 2a 20 20 20 20 20 20 20 20 20   ROW.**         
10ca0 69 66 28 20 63 73 72 43 75 72 72 65 6e 74 20 69  if( csrCurrent i
10cb0 73 20 45 4f 46 20 29 20 62 72 65 61 6b 3b 0a 2a  s EOF ) break;.*
10cc0 2a 20 20 20 20 20 20 20 20 20 69 66 28 20 28 72  *         if( (r
10cd0 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20 29 7b  egStart--)<=0 ){
10ce0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 67  .**           Ag
10cf0 67 49 6e 76 65 72 73 65 28 63 73 72 53 74 61 72  gInverse(csrStar
10d00 74 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  t).**           
10d10 4e 65 78 74 28 63 73 72 53 74 61 72 74 29 0a 2a  Next(csrStart).*
10d20 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  *         }.**  
10d30 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 54 68 65       }.**.** The
10d40 20 70 73 65 75 64 6f 2d 63 6f 64 65 20 61 62 6f   pseudo-code abo
10d50 76 65 20 75 73 65 73 20 74 68 65 20 66 6f 6c 6c  ve uses the foll
10d60 6f 77 69 6e 67 20 73 68 6f 72 74 68 61 6e 64 3a  owing shorthand:
10d70 0a 2a 2a 0a 2a 2a 20 20 20 41 47 47 53 54 45 50  .**.**   AGGSTEP
10d80 3a 20 20 20 20 69 6e 76 6f 6b 65 20 74 68 65 20  :    invoke the 
10d90 61 67 67 72 65 67 61 74 65 20 78 53 74 65 70 28  aggregate xStep(
10da0 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65  ) function for e
10db0 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  ach window funct
10dc0 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ion.**          
10dd0 20 20 20 20 20 77 69 74 68 20 61 72 67 75 6d 65       with argume
10de0 6e 74 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68  nts read from th
10df0 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66  e current row of
10e00 20 63 75 72 73 6f 72 20 63 73 72 45 6e 64 2c 20   cursor csrEnd, 
10e10 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  then.**         
10e20 20 20 20 20 20 20 73 74 65 70 20 63 75 72 73 6f        step curso
10e30 72 20 63 73 72 45 6e 64 20 66 6f 72 77 61 72 64  r csrEnd forward
10e40 20 6f 6e 65 20 72 6f 77 20 28 69 2e 65 2e 20 73   one row (i.e. s
10e50 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
10e60 29 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 52 45 54 55  ))..**.**   RETU
10e70 52 4e 5f 52 4f 57 3a 20 72 65 74 75 72 6e 20 61  RN_ROW: return a
10e80 20 72 6f 77 20 74 6f 20 74 68 65 20 63 61 6c 6c   row to the call
10e90 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  er based on the 
10ea0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
10eb0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
10ec0 20 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66    current row of
10ed0 20 63 73 72 43 75 72 72 65 6e 74 20 61 6e 64 20   csrCurrent and 
10ee0 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
10ef0 65 20 6f 66 20 61 6c 6c 20 0a 2a 2a 20 20 20 20  e of all .**    
10f00 20 20 20 20 20 20 20 20 20 20 20 61 67 67 72 65             aggre
10f10 67 61 74 65 73 2e 20 54 68 65 6e 20 73 74 65 70  gates. Then step
10f20 20 63 75 72 73 6f 72 20 63 73 72 43 75 72 72 65   cursor csrCurre
10f30 6e 74 20 66 6f 72 77 61 72 64 20 6f 6e 65 20 72  nt forward one r
10f40 6f 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 41 47 47 49  ow..**.**   AGGI
10f50 4e 56 45 52 53 45 3a 20 69 6e 76 6f 6b 65 20 74  NVERSE: invoke t
10f60 68 65 20 61 67 67 72 65 67 61 74 65 20 78 49 6e  he aggregate xIn
10f70 76 65 72 73 65 28 29 20 66 75 6e 63 74 69 6f 6e  verse() function
10f80 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77   for each window
10f90 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
10fa0 20 20 20 66 75 6e 63 74 69 6f 6e 73 20 77 69 74     functions wit
10fb0 68 20 61 72 67 75 6d 65 6e 74 73 20 72 65 61 64  h arguments read
10fc0 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
10fd0 74 20 72 6f 77 20 6f 66 20 63 75 72 73 6f 72 0a  t row of cursor.
10fe0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
10ff0 20 63 73 72 53 74 61 72 74 2e 20 54 68 65 6e 20   csrStart. Then 
11000 73 74 65 70 20 63 73 72 53 74 61 72 74 20 66 6f  step csrStart fo
11010 72 77 61 72 64 20 6f 6e 65 20 72 6f 77 2e 0a 2a  rward one row..*
11020 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 74  *.** There are t
11030 77 6f 20 6f 74 68 65 72 20 52 4f 57 53 20 77 69  wo other ROWS wi
11040 6e 64 6f 77 20 66 72 61 6d 65 73 20 74 68 61 74  ndow frames that
11050 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 69 67   are handled sig
11060 6e 69 66 69 63 61 6e 74 6c 79 0a 2a 2a 20 64 69  nificantly.** di
11070 66 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d 20 74  fferently from t
11080 68 65 20 61 62 6f 76 65 20 2d 20 22 42 45 54 57  he above - "BETW
11090 45 45 4e 20 3c 65 78 70 72 3e 20 50 52 45 43 45  EEN <expr> PRECE
110a0 44 49 4e 47 20 41 4e 44 20 3c 65 78 70 72 3e 20  DING AND <expr> 
110b0 50 52 45 43 45 44 49 4e 47 22 0a 2a 2a 20 61 6e  PRECEDING".** an
110c0 64 20 22 42 45 54 57 45 45 4e 20 3c 65 78 70 72  d "BETWEEN <expr
110d0 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e 44 20  > FOLLOWING AND 
110e0 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47  <expr> FOLLOWING
110f0 22 2e 20 54 68 65 73 65 20 61 72 65 20 73 70 65  ". These are spe
11100 63 69 61 6c 20 0a 2a 2a 20 63 61 73 65 73 20 62  cial .** cases b
11110 65 63 61 75 73 65 20 74 68 65 79 20 63 68 61 6e  ecause they chan
11120 67 65 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20  ge the order in 
11130 77 68 69 63 68 20 74 68 65 20 74 68 72 65 65 20  which the three 
11140 63 75 72 73 6f 72 73 20 28 63 73 72 53 74 61 72  cursors (csrStar
11150 74 2c 0a 2a 2a 20 63 73 72 43 75 72 72 65 6e 74  t,.** csrCurrent
11160 20 61 6e 64 20 63 73 72 45 6e 64 29 20 69 74 65   and csrEnd) ite
11170 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65  rate through the
11180 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
11190 2e 20 43 61 73 65 73 20 74 68 61 74 0a 2a 2a 20  . Cases that.** 
111a0 75 73 65 20 55 4e 42 4f 55 4e 44 45 44 20 6f 72  use UNBOUNDED or
111b0 20 43 55 52 52 45 4e 54 20 52 4f 57 20 61 72 65   CURRENT ROW are
111c0 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 76 61   much simpler va
111d0 72 69 61 74 69 6f 6e 73 20 6f 6e 20 6f 6e 65 20  riations on one 
111e0 6f 66 20 74 68 65 73 65 0a 2a 2a 20 74 68 72 65  of these.** thre
111f0 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57 53 20  e..**.**   ROWS 
11200 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31 3e 20  BETWEEN <expr1> 
11210 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 3c 65  PRECEDING AND <e
11220 78 70 72 32 3e 20 50 52 45 43 45 44 49 4e 47 0a  xpr2> PRECEDING.
11230 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 6c 6f  **.**     ... lo
11240 6f 70 20 73 74 61 72 74 65 64 20 62 79 20 73 71  op started by sq
11250 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
11260 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 69  ) ....**       i
11270 66 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e  f( new partition
11280 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 47   ){.**         G
11290 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20 20  osub flush.**   
112a0 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 49      }.**       I
112b0 6e 73 65 72 74 20 6e 65 77 20 72 6f 77 20 69 6e  nsert new row in
112c0 74 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a 2a 2a  to eph table..**
112d0 20 20 20 20 20 20 20 69 66 28 20 66 69 72 73 74         if( first
112e0 20 72 6f 77 20 6f 66 20 70 61 72 74 69 74 69 6f   row of partitio
112f0 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  n ){.**         
11300 52 65 77 69 6e 64 28 63 73 72 45 6e 64 29 20 3b  Rewind(csrEnd) ;
11310 20 52 65 77 69 6e 64 28 63 73 72 53 74 61 72 74   Rewind(csrStart
11320 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72 43 75  ) ; Rewind(csrCu
11330 72 72 65 6e 74 29 0a 2a 2a 20 20 20 20 20 20 20  rrent).**       
11340 20 20 72 65 67 45 6e 64 20 3d 20 3c 65 78 70 72    regEnd = <expr
11350 32 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20 72 65  2>.**         re
11360 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72 31 3e  gStart = <expr1>
11370 0a 2a 2a 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  .**       }else{
11380 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 66 28 20  .**         if( 
11390 28 72 65 67 45 6e 64 2d 2d 29 3c 3d 30 20 29 7b  (regEnd--)<=0 ){
113a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 47  .**           AG
113b0 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 20  GSTEP.**        
113c0 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 45   }.**         RE
113d0 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20  TURN_ROW.**     
113e0 20 20 20 20 69 66 28 20 28 72 65 67 53 74 61 72      if( (regStar
113f0 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20  t--)<=0 ){.**   
11400 20 20 20 20 20 20 20 20 41 47 47 49 4e 56 45 52          AGGINVER
11410 53 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a  SE.**         }.
11420 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20  **       }.**   
11430 20 20 7d 0a 2a 2a 20 20 20 20 20 66 6c 75 73 68    }.**     flush
11440 3a 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 28  :.**       if( (
11450 72 65 67 45 6e 64 2d 2d 29 3c 3d 30 20 29 7b 0a  regEnd--)<=0 ){.
11460 2a 2a 20 20 20 20 20 20 20 20 20 41 47 47 53 54  **         AGGST
11470 45 50 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a  EP.**       }.**
11480 20 20 20 20 20 20 20 52 45 54 55 52 4e 5f 52 4f         RETURN_RO
11490 57 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57  W.**.**.**   ROW
114a0 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31  S BETWEEN <expr1
114b0 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e 44 20  > FOLLOWING AND 
114c0 3c 65 78 70 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e  <expr2> FOLLOWIN
114d0 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20  G.**.**     ... 
114e0 6c 6f 6f 70 20 73 74 61 72 74 65 64 20 62 79 20  loop started by 
114f0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
11500 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 69  n() ....**     i
11510 66 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e  f( new partition
11520 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 47 6f 73   ){.**       Gos
11530 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20 20 20 20  ub flush.**     
11540 7d 0a 2a 2a 20 20 20 20 20 49 6e 73 65 72 74 20  }.**     Insert 
11550 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20 65 70 68  new row into eph
11560 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 69   table..**     i
11570 66 28 20 66 69 72 73 74 20 72 6f 77 20 6f 66 20  f( first row of 
11580 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20  partition ){.** 
11590 20 20 20 20 20 20 52 65 77 69 6e 64 28 63 73 72        Rewind(csr
115a0 45 6e 64 29 20 3b 20 52 65 77 69 6e 64 28 63 73  End) ; Rewind(cs
115b0 72 53 74 61 72 74 29 20 3b 20 52 65 77 69 6e 64  rStart) ; Rewind
115c0 28 63 73 72 43 75 72 72 65 6e 74 29 0a 2a 2a 20  (csrCurrent).** 
115d0 20 20 20 20 20 20 72 65 67 45 6e 64 20 3d 20 3c        regEnd = <
115e0 65 78 70 72 32 3e 0a 2a 2a 20 20 20 20 20 20 20  expr2>.**       
115f0 72 65 67 53 74 61 72 74 20 3d 20 72 65 67 45 6e  regStart = regEn
11600 64 20 2d 20 3c 65 78 70 72 31 3e 0a 2a 2a 20 20  d - <expr1>.**  
11610 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20 20     }else{.**    
11620 20 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20 20     AGGSTEP.**   
11630 20 20 20 20 69 66 28 20 28 72 65 67 45 6e 64 2d      if( (regEnd-
11640 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20  -)<=0 ){.**     
11650 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a      RETURN_ROW.*
11660 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  *       }.**    
11670 20 20 20 69 66 28 20 28 72 65 67 53 74 61 72 74     if( (regStart
11680 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20  --)<=0 ){.**    
11690 20 20 20 20 20 41 47 47 49 4e 56 45 52 53 45 0a       AGGINVERSE.
116a0 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20  **       }.**   
116b0 20 20 7d 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20    }.**   }.**   
116c0 66 6c 75 73 68 3a 0a 2a 2a 20 20 20 20 20 41 47  flush:.**     AG
116d0 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 77 68 69  GSTEP.**     whi
116e0 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20  le( 1 ){.**     
116f0 20 20 69 66 28 20 28 72 65 67 45 6e 64 2d 2d 29    if( (regEnd--)
11700 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  <=0 ){.**       
11710 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20    RETURN_ROW.** 
11720 20 20 20 20 20 20 20 20 69 66 28 20 65 6f 66 20          if( eof 
11730 29 20 62 72 65 61 6b 3b 0a 2a 2a 20 20 20 20 20  ) break;.**     
11740 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 69 66 28    }.**       if(
11750 20 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30   (regStart--)<=0
11760 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41   ){.**         A
11770 47 47 49 4e 56 45 52 53 45 0a 2a 2a 20 20 20 20  GGINVERSE.**    
11780 20 20 20 20 20 69 66 28 20 65 6f 66 20 29 20 62       if( eof ) b
11790 72 65 61 6b 0a 2a 2a 20 20 20 20 20 20 20 7d 0a  reak.**       }.
117a0 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20  **     }.**     
117b0 77 68 69 6c 65 28 20 21 65 6f 66 20 63 73 72 43  while( !eof csrC
117c0 75 72 72 65 6e 74 20 29 7b 0a 2a 2a 20 20 20 20  urrent ){.**    
117d0 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a     RETURN_ROW.**
117e0 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 46 6f 72       }.**.** For
117f0 20 74 68 65 20 6d 6f 73 74 20 70 61 72 74 2c 20   the most part, 
11800 74 68 65 20 70 61 74 74 65 72 6e 73 20 61 62 6f  the patterns abo
11810 76 65 20 61 72 65 20 61 64 61 70 74 65 64 20 74  ve are adapted t
11820 6f 20 73 75 70 70 6f 72 74 20 55 4e 42 4f 55 4e  o support UNBOUN
11830 44 45 44 20 62 79 0a 2a 2a 20 61 73 73 75 6d 69  DED by.** assumi
11840 6e 67 20 74 68 61 74 20 69 74 20 69 73 20 65 71  ng that it is eq
11850 75 69 76 61 6c 65 6e 74 20 74 6f 20 22 69 6e 66  uivalent to "inf
11860 69 6e 69 74 79 20 50 52 45 43 45 44 49 4e 47 2f  inity PRECEDING/
11870 46 4f 4c 4c 4f 57 49 4e 47 22 20 61 6e 64 0a 2a  FOLLOWING" and.*
11880 2a 20 43 55 52 52 45 4e 54 20 52 4f 57 20 62 79  * CURRENT ROW by
11890 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 69   assuming that i
118a0 74 20 69 73 20 65 71 75 69 76 69 6c 65 6e 74 20  t is equivilent 
118b0 74 6f 20 22 30 20 50 52 45 43 45 44 49 4e 47 2f  to "0 PRECEDING/
118c0 46 4f 4c 4c 4f 57 49 4e 47 22 2e 0a 2a 2a 20 54  FOLLOWING"..** T
118d0 68 69 73 20 69 73 20 6f 70 74 69 6d 69 7a 65 64  his is optimized
118e0 20 6f 66 20 63 6f 75 72 73 65 20 2d 20 62 72 61   of course - bra
118f0 6e 63 68 65 73 20 74 68 61 74 20 77 69 6c 6c 20  nches that will 
11900 6e 65 76 65 72 20 62 65 20 74 61 6b 65 6e 20 61  never be taken a
11910 6e 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73  nd.** conditions
11920 20 74 68 61 74 20 61 72 65 20 61 6c 77 61 79 73   that are always
11930 20 74 72 75 65 20 61 72 65 20 6f 6d 69 74 74 65   true are omitte
11940 64 20 66 72 6f 6d 20 74 68 65 20 56 4d 20 63 6f  d from the VM co
11950 64 65 2e 20 54 68 65 20 6f 6e 6c 79 0a 2a 2a 20  de. The only.** 
11960 65 78 63 65 70 74 69 6f 6e 61 6c 20 63 61 73 65  exceptional case
11970 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57   is:.**.**   ROW
11980 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31  S BETWEEN <expr1
11990 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e 44 20  > FOLLOWING AND 
119a0 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57  UNBOUNDED FOLLOW
119b0 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e  ING.**.**     ..
119c0 2e 20 6c 6f 6f 70 20 73 74 61 72 74 65 64 20 62  . loop started b
119d0 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
119e0 67 69 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20  gin() ....**    
119f0 20 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69   if( new partiti
11a00 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 47  on ){.**       G
11a10 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20 20  osub flush.**   
11a20 20 20 7d 0a 2a 2a 20 20 20 20 20 49 6e 73 65 72    }.**     Inser
11a30 74 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20 65  t new row into e
11a40 70 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20  ph table..**    
11a50 20 69 66 28 20 66 69 72 73 74 20 72 6f 77 20 6f   if( first row o
11a60 66 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a  f partition ){.*
11a70 2a 20 20 20 20 20 20 20 52 65 77 69 6e 64 28 63  *       Rewind(c
11a80 73 72 45 6e 64 29 20 3b 20 52 65 77 69 6e 64 28  srEnd) ; Rewind(
11a90 63 73 72 53 74 61 72 74 29 20 3b 20 52 65 77 69  csrStart) ; Rewi
11aa0 6e 64 28 63 73 72 43 75 72 72 65 6e 74 29 0a 2a  nd(csrCurrent).*
11ab0 2a 20 20 20 20 20 20 20 72 65 67 53 74 61 72 74  *       regStart
11ac0 20 3d 20 3c 65 78 70 72 31 3e 0a 2a 2a 20 20 20   = <expr1>.**   
11ad0 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20 20 20    }else{.**     
11ae0 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20    AGGSTEP.**    
11af0 20 7d 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20 66   }.**   }.**   f
11b00 6c 75 73 68 3a 0a 2a 2a 20 20 20 20 20 41 47 47  lush:.**     AGG
11b10 53 54 45 50 0a 2a 2a 20 20 20 20 20 77 68 69 6c  STEP.**     whil
11b20 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20 20  e( 1 ){.**      
11b30 20 69 66 28 20 28 72 65 67 53 74 61 72 74 2d 2d   if( (regStart--
11b40 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20  )<=0 ){.**      
11b50 20 20 20 41 47 47 49 4e 56 45 52 53 45 0a 2a 2a     AGGINVERSE.**
11b60 20 20 20 20 20 20 20 20 20 69 66 28 20 65 6f 66           if( eof
11b70 20 29 20 62 72 65 61 6b 0a 2a 2a 20 20 20 20 20   ) break.**     
11b80 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 52 45 54    }.**       RET
11b90 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 7d  URN_ROW.**     }
11ba0 0a 2a 2a 20 20 20 20 20 77 68 69 6c 65 28 20 21  .**     while( !
11bb0 65 6f 66 20 63 73 72 43 75 72 72 65 6e 74 20 29  eof csrCurrent )
11bc0 7b 0a 2a 2a 20 20 20 20 20 20 20 52 45 54 55 52  {.**       RETUR
11bd0 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 7d 0a 2a  N_ROW.**     }.*
11be0 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 71 75 69 72  *.** Also requir
11bf0 69 6e 67 20 73 70 65 63 69 61 6c 20 68 61 6e 64  ing special hand
11c00 6c 69 6e 67 20 61 72 65 20 74 68 65 20 63 61 73  ling are the cas
11c10 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57 53  es:.**.**   ROWS
11c20 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31 3e   BETWEEN <expr1>
11c30 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 3c   PRECEDING AND <
11c40 65 78 70 72 32 3e 20 50 52 45 43 45 44 49 4e 47  expr2> PRECEDING
11c50 0a 2a 2a 20 20 20 52 4f 57 53 20 42 45 54 57 45  .**   ROWS BETWE
11c60 45 4e 20 3c 65 78 70 72 31 3e 20 46 4f 4c 4c 4f  EN <expr1> FOLLO
11c70 57 49 4e 47 20 41 4e 44 20 3c 65 78 70 72 32 3e  WING AND <expr2>
11c80 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a   FOLLOWING.**.**
11c90 20 77 68 65 6e 20 28 65 78 70 72 31 20 3c 20 65   when (expr1 < e
11ca0 78 70 72 32 29 2e 20 54 68 69 73 20 69 73 20 64  xpr2). This is d
11cb0 65 74 65 63 74 65 64 20 61 74 20 72 75 6e 74 69  etected at runti
11cc0 6d 65 2c 20 6e 6f 74 20 62 79 20 74 68 69 73 20  me, not by this 
11cd0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 54 6f 20  function..** To 
11ce0 68 61 6e 64 6c 65 20 74 68 69 73 20 63 61 73 65  handle this case
11cf0 2c 20 74 68 65 20 70 73 65 75 64 6f 2d 63 6f 64  , the pseudo-cod
11d00 65 20 70 72 6f 67 72 61 6d 73 20 64 65 70 69 63  e programs depic
11d10 74 65 64 20 61 62 6f 76 65 20 61 72 65 20 6d 6f  ted above are mo
11d20 64 69 66 69 65 64 0a 2a 2a 20 73 6c 69 67 68 74  dified.** slight
11d30 6c 79 20 74 6f 20 62 65 3a 0a 2a 2a 0a 2a 2a 20  ly to be:.**.** 
11d40 20 20 20 20 2e 2e 2e 20 6c 6f 6f 70 20 73 74 61      ... loop sta
11d50 72 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 57  rted by sqlite3W
11d60 68 65 72 65 42 65 67 69 6e 28 29 20 2e 2e 2e 0a  hereBegin() ....
11d70 2a 2a 20 20 20 20 20 69 66 28 20 6e 65 77 20 70  **     if( new p
11d80 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20  artition ){.**  
11d90 20 20 20 20 20 47 6f 73 75 62 20 66 6c 75 73 68       Gosub flush
11da0 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  .**     }.**    
11db0 20 49 6e 73 65 72 74 20 6e 65 77 20 72 6f 77 20   Insert new row 
11dc0 69 6e 74 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a  into eph table..
11dd0 2a 2a 20 20 20 20 20 69 66 28 20 66 69 72 73 74  **     if( first
11de0 20 72 6f 77 20 6f 66 20 70 61 72 74 69 74 69 6f   row of partitio
11df0 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 52 65  n ){.**       Re
11e00 77 69 6e 64 28 63 73 72 45 6e 64 29 20 3b 20 52  wind(csrEnd) ; R
11e10 65 77 69 6e 64 28 63 73 72 53 74 61 72 74 29 20  ewind(csrStart) 
11e20 3b 20 52 65 77 69 6e 64 28 63 73 72 43 75 72 72  ; Rewind(csrCurr
11e30 65 6e 74 29 0a 2a 2a 20 20 20 20 20 20 20 72 65  ent).**       re
11e40 67 45 6e 64 20 3d 20 3c 65 78 70 72 32 3e 0a 2a  gEnd = <expr2>.*
11e50 2a 20 20 20 20 20 20 20 72 65 67 53 74 61 72 74  *       regStart
11e60 20 3d 20 3c 65 78 70 72 31 3e 0a 2a 2a 20 20 20   = <expr1>.**   
11e70 20 20 20 20 69 66 28 20 72 65 67 45 6e 64 20 3c      if( regEnd <
11e80 20 72 65 67 53 74 61 72 74 20 29 7b 0a 2a 2a 20   regStart ){.** 
11e90 20 20 20 20 20 20 20 20 52 45 54 55 52 4e 5f 52          RETURN_R
11ea0 4f 57 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65  OW.**         de
11eb0 6c 65 74 65 20 65 70 68 20 74 61 62 6c 65 20 63  lete eph table c
11ec0 6f 6e 74 65 6e 74 73 0a 2a 2a 20 20 20 20 20 20  ontents.**      
11ed0 20 20 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 20     continue.**  
11ee0 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 2e 2e       }.**     ..
11ef0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20  ..**.** The new 
11f00 22 63 6f 6e 74 69 6e 75 65 22 20 73 74 61 74 65  "continue" state
11f10 6d 65 6e 74 20 69 6e 20 74 68 65 20 61 62 6f 76  ment in the abov
11f20 65 20 6a 75 6d 70 73 20 74 6f 20 74 68 65 20 6e  e jumps to the n
11f30 65 78 74 20 69 74 65 72 61 74 69 6f 6e 0a 2a 2a  ext iteration.**
11f40 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f   of the outer lo
11f50 6f 70 20 2d 20 74 68 65 20 6f 6e 65 20 73 74 61  op - the one sta
11f60 72 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 57  rted by sqlite3W
11f70 68 65 72 65 42 65 67 69 6e 28 29 2e 0a 2a 2a 0a  hereBegin()..**.
11f80 2a 2a 20 54 68 65 20 76 61 72 69 6f 75 73 20 47  ** The various G
11f90 52 4f 55 50 53 20 63 61 73 65 73 20 61 72 65 20  ROUPS cases are 
11fa0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e  implemented usin
11fb0 67 20 74 68 65 20 73 61 6d 65 20 70 61 74 74 65  g the same patte
11fc0 72 6e 73 20 61 73 0a 2a 2a 20 52 4f 57 53 2e 20  rns as.** ROWS. 
11fd0 54 68 65 20 56 4d 20 63 6f 64 65 20 69 73 20 6d  The VM code is m
11fe0 6f 64 69 66 69 65 64 20 73 6c 69 67 68 74 6c 79  odified slightly
11ff0 20 73 6f 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20   so that:.**.** 
12000 20 20 31 2e 20 54 68 65 20 65 6c 73 65 20 62 72    1. The else br
12010 61 6e 63 68 20 69 6e 20 74 68 65 20 6d 61 69 6e  anch in the main
12020 20 6c 6f 6f 70 20 69 73 20 6f 6e 6c 79 20 74 61   loop is only ta
12030 6b 65 6e 20 69 66 20 74 68 65 20 72 6f 77 20 6a  ken if the row j
12040 75 73 74 0a 2a 2a 20 20 20 20 20 20 61 64 64 65  ust.**      adde
12050 64 20 74 6f 20 74 68 65 20 65 70 68 65 6d 65 72  d to the ephemer
12060 61 6c 20 74 61 62 6c 65 20 69 73 20 74 68 65 20  al table is the 
12070 73 74 61 72 74 20 6f 66 20 61 20 6e 65 77 20 67  start of a new g
12080 72 6f 75 70 2e 20 49 6e 0a 2a 2a 20 20 20 20 20  roup. In.**     
12090 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 74   other words, it
120a0 20 62 65 63 6f 6d 65 73 3a 0a 2a 2a 0a 2a 2a 20   becomes:.**.** 
120b0 20 20 20 20 20 20 20 20 2e 2e 2e 20 6c 6f 6f 70          ... loop
120c0 20 73 74 61 72 74 65 64 20 62 79 20 73 71 6c 69   started by sqli
120d0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
120e0 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 69  ....**         i
120f0 66 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e  f( new partition
12100 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   ){.**          
12110 20 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20   Gosub flush.** 
12120 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20          }.**    
12130 20 20 20 20 20 49 6e 73 65 72 74 20 6e 65 77 20       Insert new 
12140 72 6f 77 20 69 6e 74 6f 20 65 70 68 20 74 61 62  row into eph tab
12150 6c 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 69  le..**         i
12160 66 28 20 66 69 72 73 74 20 72 6f 77 20 6f 66 20  f( first row of 
12170 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20  partition ){.** 
12180 20 20 20 20 20 20 20 20 20 20 52 65 77 69 6e 64            Rewind
12190 28 63 73 72 45 6e 64 29 20 3b 20 52 65 77 69 6e  (csrEnd) ; Rewin
121a0 64 28 63 73 72 53 74 61 72 74 29 20 3b 20 52 65  d(csrStart) ; Re
121b0 77 69 6e 64 28 63 73 72 43 75 72 72 65 6e 74 29  wind(csrCurrent)
121c0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 72 65  .**           re
121d0 67 45 6e 64 20 3d 20 3c 65 78 70 72 32 3e 0a 2a  gEnd = <expr2>.*
121e0 2a 20 20 20 20 20 20 20 20 20 20 20 72 65 67 53  *           regS
121f0 74 61 72 74 20 3d 20 3c 65 78 70 72 31 3e 0a 2a  tart = <expr1>.*
12200 2a 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  *         }else 
12210 69 66 28 20 6e 65 77 20 67 72 6f 75 70 20 29 7b  if( new group ){
12220 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 2e 2e  .**           ..
12230 2e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a  . .**         }.
12240 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a  **       }.**.**
12250 20 20 20 32 2e 20 49 6e 73 74 65 61 64 20 6f 66     2. Instead of
12260 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20 73 69   processing a si
12270 6e 67 6c 65 20 72 6f 77 2c 20 65 61 63 68 20 52  ngle row, each R
12280 45 54 55 52 4e 5f 52 4f 57 2c 20 41 47 47 53 54  ETURN_ROW, AGGST
12290 45 50 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 41  EP or .**      A
122a0 47 47 49 4e 56 45 52 53 45 20 73 74 65 70 20 70  GGINVERSE step p
122b0 72 6f 63 65 73 73 65 73 20 74 68 65 20 63 75 72  rocesses the cur
122c0 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20  rent row of the 
122d0 72 65 6c 65 76 61 6e 74 20 63 75 72 73 6f 72 20  relevant cursor 
122e0 61 6e 64 0a 2a 2a 20 20 20 20 20 20 61 6c 6c 20  and.**      all 
122f0 73 75 62 73 65 71 75 65 6e 74 20 72 6f 77 73 20  subsequent rows 
12300 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65  belonging to the
12310 20 73 61 6d 65 20 67 72 6f 75 70 2e 0a 2a 2a 0a   same group..**.
12320 2a 2a 20 52 41 4e 47 45 20 77 69 6e 64 6f 77 20  ** RANGE window 
12330 66 72 61 6d 65 73 20 61 72 65 20 61 20 6c 69 74  frames are a lit
12340 74 6c 65 20 64 69 66 66 65 72 65 6e 74 20 61 67  tle different ag
12350 61 69 6e 2e 20 41 73 20 66 6f 72 20 47 52 4f 55  ain. As for GROU
12360 50 53 2c 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e  PS, the .** main
12370 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20   loop runs once 
12380 70 65 72 20 67 72 6f 75 70 20 6f 6e 6c 79 2e 20  per group only. 
12390 41 6e 64 20 52 45 54 55 52 4e 5f 52 4f 57 2c 20  And RETURN_ROW, 
123a0 41 47 47 53 54 45 50 20 61 6e 64 20 41 47 47 49  AGGSTEP and AGGI
123b0 4e 56 45 52 53 45 0a 2a 2a 20 64 65 61 6c 20 69  NVERSE.** deal i
123c0 6e 20 67 72 6f 75 70 73 20 69 6e 73 74 65 61 64  n groups instead
123d0 20 6f 66 20 72 6f 77 73 2e 20 41 73 20 66 6f 72   of rows. As for
123e0 20 52 4f 57 53 20 61 6e 64 20 47 52 4f 55 50 53   ROWS and GROUPS
123f0 2c 20 74 68 65 72 65 20 61 72 65 20 74 68 72 65  , there are thre
12400 65 0a 2a 2a 20 62 61 73 69 63 20 63 61 73 65 73  e.** basic cases
12410 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e 47 45 20  :.**.**   RANGE 
12420 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31 3e 20  BETWEEN <expr1> 
12430 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 3c 65  PRECEDING AND <e
12440 78 70 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a  xpr2> FOLLOWING.
12450 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 6c 6f  **.**     ... lo
12460 6f 70 20 73 74 61 72 74 65 64 20 62 79 20 73 71  op started by sq
12470 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
12480 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 69  ) ....**       i
12490 66 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e  f( new partition
124a0 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 47   ){.**         G
124b0 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20 20  osub flush.**   
124c0 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 49      }.**       I
124d0 6e 73 65 72 74 20 6e 65 77 20 72 6f 77 20 69 6e  nsert new row in
124e0 74 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a 2a 2a  to eph table..**
124f0 20 20 20 20 20 20 20 69 66 28 20 66 69 72 73 74         if( first
12500 20 72 6f 77 20 6f 66 20 70 61 72 74 69 74 69 6f   row of partitio
12510 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  n ){.**         
12520 52 65 77 69 6e 64 28 63 73 72 45 6e 64 29 20 3b  Rewind(csrEnd) ;
12530 20 52 65 77 69 6e 64 28 63 73 72 53 74 61 72 74   Rewind(csrStart
12540 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72 43 75  ) ; Rewind(csrCu
12550 72 72 65 6e 74 29 0a 2a 2a 20 20 20 20 20 20 20  rrent).**       
12560 20 20 72 65 67 45 6e 64 20 3d 20 3c 65 78 70 72    regEnd = <expr
12570 32 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20 72 65  2>.**         re
12580 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72 31 3e  gStart = <expr1>
12590 0a 2a 2a 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  .**       }else{
125a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 47 47 53  .**         AGGS
125b0 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 20 20 77  TEP.**         w
125c0 68 69 6c 65 28 20 28 63 73 72 43 75 72 72 65 6e  hile( (csrCurren
125d0 74 2e 6b 65 79 20 2b 20 72 65 67 45 6e 64 29 20  t.key + regEnd) 
125e0 3c 20 63 73 72 45 6e 64 2e 6b 65 79 20 29 7b 0a  < csrEnd.key ){.
125f0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 52 45 54  **           RET
12600 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 20  URN_ROW.**      
12610 20 20 20 20 20 77 68 69 6c 65 28 20 63 73 72 53       while( csrS
12620 74 61 72 74 2e 6b 65 79 20 2b 20 72 65 67 53 74  tart.key + regSt
12630 61 72 74 29 20 3c 20 63 73 72 43 75 72 72 65 6e  art) < csrCurren
12640 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20 20  t.key ){.**     
12650 20 20 20 20 20 20 20 20 41 47 47 49 4e 56 45 52          AGGINVER
12660 53 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  SE.**           
12670 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a  }.**         }.*
12680 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  *       }.**    
12690 20 7d 0a 2a 2a 20 20 20 20 20 66 6c 75 73 68 3a   }.**     flush:
126a0 0a 2a 2a 20 20 20 20 20 20 20 41 47 47 53 54 45  .**       AGGSTE
126b0 50 0a 2a 2a 20 20 20 20 20 20 20 77 68 69 6c 65  P.**       while
126c0 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  ( 1 ){.**       
126d0 20 20 52 45 54 55 52 4e 20 52 4f 57 0a 2a 2a 20    RETURN ROW.** 
126e0 20 20 20 20 20 20 20 20 69 66 28 20 63 73 72 43          if( csrC
126f0 75 72 72 65 6e 74 20 69 73 20 45 4f 46 20 29 20  urrent is EOF ) 
12700 62 72 65 61 6b 3b 0a 2a 2a 20 20 20 20 20 20 20  break;.**       
12710 20 20 20 20 77 68 69 6c 65 28 20 63 73 72 53 74      while( csrSt
12720 61 72 74 2e 6b 65 79 20 2b 20 72 65 67 53 74 61  art.key + regSta
12730 72 74 29 20 3c 20 63 73 72 43 75 72 72 65 6e 74  rt) < csrCurrent
12740 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20 20 20  .key ){.**      
12750 20 20 20 20 20 20 20 41 47 47 49 4e 56 45 52 53         AGGINVERS
12760 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 7d  E.**           }
12770 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a  .**         }.**
12780 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49         }.**.** I
12790 6e 20 74 68 65 20 61 62 6f 76 65 20 6e 6f 74 61  n the above nota
127a0 74 69 6f 6e 2c 20 22 63 73 72 2e 6b 65 79 22 20  tion, "csr.key" 
127b0 6d 65 61 6e 73 20 74 68 65 20 63 75 72 72 65 6e  means the curren
127c0 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 4f  t value of the O
127d0 52 44 45 52 20 42 59 20 0a 2a 2a 20 65 78 70 72  RDER BY .** expr
127e0 65 73 73 69 6f 6e 20 28 74 68 65 72 65 20 69 73  ession (there is
127f0 20 6f 6e 6c 79 20 65 76 65 72 20 31 20 66 6f 72   only ever 1 for
12800 20 61 20 52 41 4e 47 45 20 74 68 61 74 20 75 73   a RANGE that us
12810 65 73 20 61 6e 20 3c 65 78 70 72 3e 20 46 4f 4c  es an <expr> FOL
12820 4c 4f 57 49 4e 47 0a 2a 2a 20 6f 72 20 3c 65 78  LOWING.** or <ex
12830 70 72 20 50 52 45 43 45 44 49 4e 47 29 20 72 65  pr PRECEDING) re
12840 61 64 20 66 72 6f 6d 20 63 75 72 73 6f 72 20 63  ad from cursor c
12850 73 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e 47  sr..**.**   RANG
12860 45 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31  E BETWEEN <expr1
12870 3e 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20  > PRECEDING AND 
12880 3c 65 78 70 72 32 3e 20 50 52 45 43 45 44 49 4e  <expr2> PRECEDIN
12890 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20  G.**.**     ... 
128a0 6c 6f 6f 70 20 73 74 61 72 74 65 64 20 62 79 20  loop started by 
128b0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
128c0 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20  n() ....**      
128d0 20 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69   if( new partiti
128e0 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  on ){.**        
128f0 20 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20   Gosub flush.** 
12900 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20        }.**      
12910 20 49 6e 73 65 72 74 20 6e 65 77 20 72 6f 77 20   Insert new row 
12920 69 6e 74 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a  into eph table..
12930 2a 2a 20 20 20 20 20 20 20 69 66 28 20 66 69 72  **       if( fir
12940 73 74 20 72 6f 77 20 6f 66 20 70 61 72 74 69 74  st row of partit
12950 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  ion ){.**       
12960 20 20 52 65 77 69 6e 64 28 63 73 72 45 6e 64 29    Rewind(csrEnd)
12970 20 3b 20 52 65 77 69 6e 64 28 63 73 72 53 74 61   ; Rewind(csrSta
12980 72 74 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72  rt) ; Rewind(csr
12990 43 75 72 72 65 6e 74 29 0a 2a 2a 20 20 20 20 20  Current).**     
129a0 20 20 20 20 72 65 67 45 6e 64 20 3d 20 3c 65 78      regEnd = <ex
129b0 70 72 32 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20  pr2>.**         
129c0 72 65 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72  regStart = <expr
129d0 31 3e 0a 2a 2a 20 20 20 20 20 20 20 7d 65 6c 73  1>.**       }els
129e0 65 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 68  e{.**         wh
129f0 69 6c 65 28 20 28 63 73 72 45 6e 64 2e 6b 65 79  ile( (csrEnd.key
12a00 20 2b 20 72 65 67 45 6e 64 29 20 3c 3d 20 63 73   + regEnd) <= cs
12a10 72 43 75 72 72 65 6e 74 2e 6b 65 79 20 29 7b 0a  rCurrent.key ){.
12a20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 47 47  **           AGG
12a30 53 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 20 20  STEP.**         
12a40 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 45 54  }.**         RET
12a50 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 20  URN_ROW.**      
12a60 20 20 20 77 68 69 6c 65 28 20 28 63 73 72 53 74     while( (csrSt
12a70 61 72 74 2e 6b 65 79 20 2b 20 72 65 67 53 74 61  art.key + regSta
12a80 72 74 29 20 3c 20 63 73 72 43 75 72 72 65 6e 74  rt) < csrCurrent
12a90 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20 20 20  .key ){.**      
12aa0 20 20 20 20 20 41 47 47 49 4e 56 45 52 53 45 0a       AGGINVERSE.
12ab0 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20  **         }.** 
12ac0 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 7d        }.**     }
12ad0 0a 2a 2a 20 20 20 20 20 66 6c 75 73 68 3a 0a 2a  .**     flush:.*
12ae0 2a 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28  *       while( (
12af0 63 73 72 45 6e 64 2e 6b 65 79 20 2b 20 72 65 67  csrEnd.key + reg
12b00 45 6e 64 29 20 3c 3d 20 63 73 72 43 75 72 72 65  End) <= csrCurre
12b10 6e 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20  nt.key ){.**    
12b20 20 20 20 20 20 41 47 47 53 54 45 50 0a 2a 2a 20       AGGSTEP.** 
12b30 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20        }.**      
12b40 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 0a 2a   RETURN_ROW.**.*
12b50 2a 20 20 20 52 41 4e 47 45 20 42 45 54 57 45 45  *   RANGE BETWEE
12b60 4e 20 3c 65 78 70 72 31 3e 20 46 4f 4c 4c 4f 57  N <expr1> FOLLOW
12b70 49 4e 47 20 41 4e 44 20 3c 65 78 70 72 32 3e 20  ING AND <expr2> 
12b80 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20  FOLLOWING.**.** 
12b90 20 20 20 20 2e 2e 2e 20 6c 6f 6f 70 20 73 74 61      ... loop sta
12ba0 72 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 57  rted by sqlite3W
12bb0 68 65 72 65 42 65 67 69 6e 28 29 20 2e 2e 2e 0a  hereBegin() ....
12bc0 2a 2a 20 20 20 20 20 20 20 69 66 28 20 6e 65 77  **       if( new
12bd0 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a   partition ){.**
12be0 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20 66           Gosub f
12bf0 6c 75 73 68 0a 2a 2a 20 20 20 20 20 20 20 7d 0a  lush.**       }.
12c00 2a 2a 20 20 20 20 20 20 20 49 6e 73 65 72 74 20  **       Insert 
12c10 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20 65 70 68  new row into eph
12c20 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 20   table..**      
12c30 20 69 66 28 20 66 69 72 73 74 20 72 6f 77 20 6f   if( first row o
12c40 66 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a  f partition ){.*
12c50 2a 20 20 20 20 20 20 20 20 20 52 65 77 69 6e 64  *         Rewind
12c60 28 63 73 72 45 6e 64 29 20 3b 20 52 65 77 69 6e  (csrEnd) ; Rewin
12c70 64 28 63 73 72 53 74 61 72 74 29 20 3b 20 52 65  d(csrStart) ; Re
12c80 77 69 6e 64 28 63 73 72 43 75 72 72 65 6e 74 29  wind(csrCurrent)
12c90 0a 2a 2a 20 20 20 20 20 20 20 20 20 72 65 67 45  .**         regE
12ca0 6e 64 20 3d 20 3c 65 78 70 72 32 3e 0a 2a 2a 20  nd = <expr2>.** 
12cb0 20 20 20 20 20 20 20 20 72 65 67 53 74 61 72 74          regStart
12cc0 20 3d 20 3c 65 78 70 72 31 3e 0a 2a 2a 20 20 20   = <expr1>.**   
12cd0 20 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20      }else{.**   
12ce0 20 20 20 20 20 20 41 47 47 53 54 45 50 0a 2a 2a        AGGSTEP.**
12cf0 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
12d00 28 63 73 72 43 75 72 72 65 6e 74 2e 6b 65 79 20  (csrCurrent.key 
12d10 2b 20 72 65 67 45 6e 64 29 20 3c 20 63 73 72 45  + regEnd) < csrE
12d20 6e 64 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20  nd.key ){.**    
12d30 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63         while( (c
12d40 73 72 43 75 72 72 65 6e 74 2e 6b 65 79 20 2b 20  srCurrent.key + 
12d50 72 65 67 53 74 61 72 74 29 20 3e 20 63 73 72 53  regStart) > csrS
12d60 74 61 72 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20  tart.key ){.**  
12d70 20 20 20 20 20 20 20 20 20 20 20 41 47 47 49 4e             AGGIN
12d80 56 45 52 53 45 0a 2a 2a 20 20 20 20 20 20 20 20  VERSE.**        
12d90 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20     }.**         
12da0 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20    RETURN_ROW.** 
12db0 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20          }.**    
12dc0 20 20 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a     }.**     }.**
12dd0 20 20 20 20 20 66 6c 75 73 68 3a 0a 2a 2a 20 20       flush:.**  
12de0 20 20 20 20 20 41 47 47 53 54 45 50 0a 2a 2a 20       AGGSTEP.** 
12df0 20 20 20 20 20 20 77 68 69 6c 65 28 20 31 20 29        while( 1 )
12e00 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 68 69  {.**         whi
12e10 6c 65 28 20 28 63 73 72 43 75 72 72 65 6e 74 2e  le( (csrCurrent.
12e20 6b 65 79 20 2b 20 72 65 67 53 74 61 72 74 29 20  key + regStart) 
12e30 3e 20 63 73 72 53 74 61 72 74 2e 6b 65 79 20 29  > csrStart.key )
12e40 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41  {.**           A
12e50 47 47 49 4e 56 45 52 53 45 0a 2a 2a 20 20 20 20  GGINVERSE.**    
12e60 20 20 20 20 20 20 20 69 66 28 20 65 6f 66 20 29         if( eof )
12e70 20 62 72 65 61 6b 20 22 77 68 69 6c 65 28 20 31   break "while( 1
12e80 20 29 22 20 6c 6f 6f 70 2e 0a 2a 2a 20 20 20 20   )" loop..**    
12e90 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20       }.**       
12ea0 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20    RETURN_ROW.** 
12eb0 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20        }.**      
12ec0 20 77 68 69 6c 65 28 20 21 65 6f 66 20 63 73 72   while( !eof csr
12ed0 43 75 72 72 65 6e 74 20 29 7b 0a 2a 2a 20 20 20  Current ){.**   
12ee0 20 20 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57        RETURN_ROW
12ef0 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a  .**       }.**.*
12f00 2a 20 54 68 65 20 74 65 78 74 20 61 62 6f 76 65  * The text above
12f10 20 6c 65 61 76 65 73 20 6f 75 74 20 6d 61 6e 79   leaves out many
12f20 20 64 65 74 61 69 6c 73 2e 20 52 65 66 65 72 20   details. Refer 
12f30 74 6f 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20  to the code and 
12f40 63 6f 6d 6d 65 6e 74 73 0a 2a 2a 20 62 65 6c 6f  comments.** belo
12f50 77 20 66 6f 72 20 61 20 6d 6f 72 65 20 63 6f 6d  w for a more com
12f60 70 6c 65 74 65 20 70 69 63 74 75 72 65 2e 0a 2a  plete picture..*
12f70 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69  /.void sqlite3Wi
12f80 6e 64 6f 77 43 6f 64 65 53 74 65 70 28 0a 20 20  ndowCodeStep(.  
12f90 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
12fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fb0 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
12fc0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
12fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fe0 20 20 20 20 20 20 2f 2a 20 52 65 77 72 69 74 74        /* Rewritt
12ff0 65 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  en SELECT statem
13000 65 6e 74 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ent */.  WhereIn
13010 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 20  fo *pWInfo,     
13020 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74           /* Cont
13030 65 78 74 20 72 65 74 75 72 6e 65 64 20 62 79 20  ext returned by 
13040 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
13050 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  n() */.  int reg
13060 47 6f 73 75 62 2c 20 20 20 20 20 20 20 20 20 20  Gosub,          
13070 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
13080 73 74 65 72 20 66 6f 72 20 4f 50 5f 47 6f 73 75  ster for OP_Gosu
13090 62 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 47  b */.  int addrG
130a0 6f 73 75 62 20 20 20 20 20 20 20 20 20 20 20 20  osub            
130b0 20 20 20 20 20 20 20 2f 2a 20 4f 50 5f 47 6f 73         /* OP_Gos
130c0 75 62 20 68 65 72 65 20 74 6f 20 72 65 74 75 72  ub here to retur
130d0 6e 20 65 61 63 68 20 72 6f 77 20 2a 2f 0a 29 7b  n each row */.){
130e0 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e  .  Window *pMWin
130f0 20 3d 20 70 2d 3e 70 57 69 6e 3b 0a 20 20 45 78   = p->pWin;.  Ex
13100 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
13110 20 3d 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72   = pMWin->pOrder
13120 42 79 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  By;.  Vdbe *v = 
13130 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
13140 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 63 73  Parse);.  int cs
13150 72 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20  rWrite;         
13160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
13170 73 6f 72 20 75 73 65 64 20 74 6f 20 77 72 69 74  sor used to writ
13180 65 20 74 6f 20 65 70 68 2e 20 74 61 62 6c 65 20  e to eph. table 
13190 2a 2f 0a 20 20 69 6e 74 20 63 73 72 49 6e 70 75  */.  int csrInpu
131a0 74 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  t = p->pSrc->a[0
131b0 5d 2e 69 43 75 72 73 6f 72 3b 20 20 20 20 20 2f  ].iCursor;     /
131c0 2a 20 43 75 72 73 6f 72 20 6f 66 20 73 75 62 2d  * Cursor of sub-
131d0 73 65 6c 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  select */.  int 
131e0 6e 49 6e 70 75 74 20 3d 20 70 2d 3e 70 53 72 63  nInput = p->pSrc
131f0 2d 3e 61 5b 30 5d 2e 70 54 61 62 2d 3e 6e 43 6f  ->a[0].pTab->nCo
13200 6c 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  l;    /* Number 
13210 6f 66 20 63 6f 6c 73 20 72 65 74 75 72 6e 65 64  of cols returned
13220 20 62 79 20 73 75 62 20 2a 2f 0a 20 20 69 6e 74   by sub */.  int
13230 20 69 49 6e 70 75 74 3b 20 20 20 20 20 20 20 20   iInput;        
13240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13250 20 20 20 20 20 20 20 2f 2a 20 54 6f 20 69 74 65         /* To ite
13260 72 61 74 65 20 74 68 72 6f 75 67 68 20 73 75 62  rate through sub
13270 20 63 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 61   cols */.  int a
13280 64 64 72 4e 65 3b 20 20 20 20 20 20 20 20 20 20  ddrNe;          
13290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
132a0 64 72 65 73 73 20 6f 66 20 4f 50 5f 4e 65 20 2a  dress of OP_Ne *
132b0 2f 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75  /.  int addrGosu
132c0 62 46 6c 75 73 68 20 3d 20 30 3b 20 20 20 20 20  bFlush = 0;     
132d0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
132e0 66 20 4f 50 5f 47 6f 73 75 62 20 74 6f 20 66 6c  f OP_Gosub to fl
132f0 75 73 68 3a 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ush: */.  int ad
13300 64 72 49 6e 74 65 67 65 72 20 3d 20 30 3b 20 20  drInteger = 0;  
13310 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
13320 72 65 73 73 20 6f 66 20 4f 50 5f 49 6e 74 65 67  ress of OP_Integ
13330 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  er */.  int addr
13340 45 6d 70 74 79 3b 20 20 20 20 20 20 20 20 20 20  Empty;          
13350 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
13360 73 73 20 6f 66 20 4f 50 5f 52 65 77 69 6e 64 20  ss of OP_Rewind 
13370 69 6e 20 66 6c 75 73 68 3a 20 2a 2f 0a 20 20 69  in flush: */.  i
13380 6e 74 20 72 65 67 53 74 61 72 74 20 3d 20 30 3b  nt regStart = 0;
13390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
133a0 2a 20 56 61 6c 75 65 20 6f 66 20 3c 65 78 70 72  * Value of <expr
133b0 3e 20 50 52 45 43 45 44 49 4e 47 20 2a 2f 0a 20  > PRECEDING */. 
133c0 20 69 6e 74 20 72 65 67 45 6e 64 20 3d 20 30 3b   int regEnd = 0;
133d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133e0 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 3c 65 78   /* Value of <ex
133f0 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 2a 2f  pr> FOLLOWING */
13400 0a 20 20 69 6e 74 20 72 65 67 4e 65 77 3b 20 20  .  int regNew;  
13410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13420 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 72     /* Array of r
13430 65 67 69 73 74 65 72 73 20 68 6f 6c 64 69 6e 67  egisters holding
13440 20 6e 65 77 20 69 6e 70 75 74 20 72 6f 77 20 2a   new input row *
13450 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72  /.  int regRecor
13460 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
13470 20 20 20 20 2f 2a 20 72 65 67 4e 65 77 20 61 72      /* regNew ar
13480 72 61 79 20 69 6e 20 72 65 63 6f 72 64 20 66 6f  ray in record fo
13490 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52  rm */.  int regR
134a0 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  owid;           
134b0 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64          /* Rowid
134c0 20 66 6f 72 20 72 65 67 52 65 63 6f 72 64 20 69   for regRecord i
134d0 6e 20 65 70 68 20 74 61 62 6c 65 20 2a 2f 0a 20  n eph table */. 
134e0 20 69 6e 74 20 72 65 67 4e 65 77 50 65 65 72 20   int regNewPeer 
134f0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
13500 20 2f 2a 20 50 65 65 72 20 76 61 6c 75 65 73 20   /* Peer values 
13510 66 6f 72 20 6e 65 77 20 72 6f 77 20 28 70 61 72  for new row (par
13520 74 20 6f 66 20 72 65 67 4e 65 77 29 20 2a 2f 0a  t of regNew) */.
13530 20 20 69 6e 74 20 72 65 67 50 65 65 72 20 3d 20    int regPeer = 
13540 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
13550 20 20 2f 2a 20 50 65 65 72 20 76 61 6c 75 65 73    /* Peer values
13560 20 66 6f 72 20 63 75 72 72 65 6e 74 20 72 6f 77   for current row
13570 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 6c 75   */.  int regFlu
13580 73 68 50 61 72 74 20 3d 20 30 3b 20 20 20 20 20  shPart = 0;     
13590 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
135a0 72 20 66 6f 72 20 22 47 6f 73 75 62 20 66 6c 75  r for "Gosub flu
135b0 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 20 2a 2f  sh_partition" */
135c0 0a 20 20 57 69 6e 64 6f 77 43 6f 64 65 41 72 67  .  WindowCodeArg
135d0 20 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   s;             
135e0 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 6f 62     /* Context ob
135f0 6a 65 63 74 20 66 6f 72 20 73 75 62 2d 72 6f 75  ject for sub-rou
13600 74 69 6e 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6c  tines */.  int l
13610 62 6c 57 68 65 72 65 45 6e 64 3b 20 20 20 20 20  blWhereEnd;     
13620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
13630 62 65 6c 20 6a 75 73 74 20 62 65 66 6f 72 65 20  bel just before 
13640 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
13650 29 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73  ) code */..  ass
13660 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61  ert( pMWin->eSta
13670 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47  rt==TK_PRECEDING
13680 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72   || pMWin->eStar
13690 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 0a 20  t==TK_CURRENT . 
136a0 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e        || pMWin->
136b0 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f  eStart==TK_FOLLO
136c0 57 49 4e 47 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65  WING || pMWin->e
136d0 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e  Start==TK_UNBOUN
136e0 44 45 44 20 0a 20 20 29 3b 0a 20 20 61 73 73 65  DED .  );.  asse
136f0 72 74 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d  rt( pMWin->eEnd=
13700 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 7c 7c  =TK_FOLLOWING ||
13710 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b   pMWin->eEnd==TK
13720 5f 43 55 52 52 45 4e 54 20 0a 20 20 20 20 20 20  _CURRENT .      
13730 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d   || pMWin->eEnd=
13740 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 7c 7c  =TK_UNBOUNDED ||
13750 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b   pMWin->eEnd==TK
13760 5f 50 52 45 43 45 44 49 4e 47 20 0a 20 20 29 3b  _PRECEDING .  );
13770 0a 20 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e  .  assert( pMWin
13780 2d 3e 65 45 78 63 6c 75 64 65 3d 3d 30 20 7c 7c  ->eExclude==0 ||
13790 20 70 4d 57 69 6e 2d 3e 65 45 78 63 6c 75 64 65   pMWin->eExclude
137a0 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 0a 20 20 20  ==TK_CURRENT.   
137b0 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45      || pMWin->eE
137c0 78 63 6c 75 64 65 3d 3d 54 4b 5f 47 52 4f 55 50  xclude==TK_GROUP
137d0 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 78 63 6c   || pMWin->eExcl
137e0 75 64 65 3d 3d 54 4b 5f 54 49 45 53 0a 20 20 20  ude==TK_TIES.   
137f0 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45      || pMWin->eE
13800 78 63 6c 75 64 65 3d 3d 54 4b 5f 4e 4f 0a 20 20  xclude==TK_NO.  
13810 29 3b 0a 0a 20 20 6c 62 6c 57 68 65 72 65 45 6e  );..  lblWhereEn
13820 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
13830 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
13840 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20  ;..  /* Fill in 
13850 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 62 6a 65  the context obje
13860 63 74 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  ct */.  memset(&
13870 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57 69 6e  s, 0, sizeof(Win
13880 64 6f 77 43 6f 64 65 41 72 67 29 29 3b 0a 20 20  dowCodeArg));.  
13890 73 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  s.pParse = pPars
138a0 65 3b 0a 20 20 73 2e 70 4d 57 69 6e 20 3d 20 70  e;.  s.pMWin = p
138b0 4d 57 69 6e 3b 0a 20 20 73 2e 70 56 64 62 65 20  MWin;.  s.pVdbe 
138c0 3d 20 76 3b 0a 20 20 73 2e 72 65 67 47 6f 73 75  = v;.  s.regGosu
138d0 62 20 3d 20 72 65 67 47 6f 73 75 62 3b 0a 20 20  b = regGosub;.  
138e0 73 2e 61 64 64 72 47 6f 73 75 62 20 3d 20 61 64  s.addrGosub = ad
138f0 64 72 47 6f 73 75 62 3b 0a 20 20 73 2e 63 75 72  drGosub;.  s.cur
13900 72 65 6e 74 2e 63 73 72 20 3d 20 70 4d 57 69 6e  rent.csr = pMWin
13910 2d 3e 69 45 70 68 43 73 72 3b 0a 20 20 63 73 72  ->iEphCsr;.  csr
13920 57 72 69 74 65 20 3d 20 73 2e 63 75 72 72 65 6e  Write = s.curren
13930 74 2e 63 73 72 2b 31 3b 0a 20 20 73 2e 73 74 61  t.csr+1;.  s.sta
13940 72 74 2e 63 73 72 20 3d 20 73 2e 63 75 72 72 65  rt.csr = s.curre
13950 6e 74 2e 63 73 72 2b 32 3b 0a 20 20 73 2e 65 6e  nt.csr+2;.  s.en
13960 64 2e 63 73 72 20 3d 20 73 2e 63 75 72 72 65 6e  d.csr = s.curren
13970 74 2e 63 73 72 2b 33 3b 0a 0a 20 20 2f 2a 20 46  t.csr+3;..  /* F
13980 69 67 75 72 65 20 6f 75 74 20 77 68 65 6e 20 72  igure out when r
13990 6f 77 73 20 6d 61 79 20 62 65 20 64 65 6c 65 74  ows may be delet
139a0 65 64 20 66 72 6f 6d 20 74 68 65 20 65 70 68 65  ed from the ephe
139b0 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20 54 68 65  meral table. The
139c0 72 65 0a 20 20 2a 2a 20 61 72 65 20 66 6f 75 72  re.  ** are four
139d0 20 6f 70 74 69 6f 6e 73 20 2d 20 74 68 65 79 20   options - they 
139e0 6d 61 79 20 6e 65 76 65 72 20 62 65 20 64 65 6c  may never be del
139f0 65 74 65 64 20 28 65 44 65 6c 65 74 65 3d 3d 30  eted (eDelete==0
13a00 29 2c 20 74 68 65 79 20 6d 61 79 20 0a 20 20 2a  ), they may .  *
13a10 2a 20 62 65 20 64 65 6c 65 74 65 64 20 61 73 20  * be deleted as 
13a20 73 6f 6f 6e 20 61 73 20 74 68 65 79 20 61 72 65  soon as they are
13a30 20 6e 6f 20 6c 6f 6e 67 65 72 20 70 61 72 74 20   no longer part 
13a40 6f 66 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72  of the window fr
13a50 61 6d 65 0a 20 20 2a 2a 20 28 65 44 65 6c 65 74  ame.  ** (eDelet
13a60 65 3d 3d 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56  e==WINDOW_AGGINV
13a70 45 52 53 45 29 2c 20 74 68 65 79 20 6d 61 79 20  ERSE), they may 
13a80 62 65 20 64 65 6c 65 74 65 64 20 61 73 20 61 66  be deleted as af
13a90 74 65 72 20 74 68 65 20 72 6f 77 20 0a 20 20 2a  ter the row .  *
13aa0 2a 20 68 61 73 20 62 65 65 6e 20 72 65 74 75 72  * has been retur
13ab0 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ned to the calle
13ac0 72 20 28 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e  r (WINDOW_RETURN
13ad0 5f 52 4f 57 29 2c 20 6f 72 20 74 68 65 79 20 6d  _ROW), or they m
13ae0 61 79 0a 20 20 2a 2a 20 62 65 20 64 65 6c 65 74  ay.  ** be delet
13af0 65 64 20 61 66 74 65 72 20 74 68 65 79 20 65 6e  ed after they en
13b00 74 65 72 20 74 68 65 20 66 72 61 6d 65 20 28 57  ter the frame (W
13b10 49 4e 44 4f 57 5f 41 47 47 53 54 45 50 29 2e 20  INDOW_AGGSTEP). 
13b20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70 4d 57  */.  switch( pMW
13b30 69 6e 2d 3e 65 53 74 61 72 74 20 29 7b 0a 20 20  in->eStart ){.  
13b40 20 20 63 61 73 65 20 54 4b 5f 46 4f 4c 4c 4f 57    case TK_FOLLOW
13b50 49 4e 47 3a 0a 20 20 20 20 20 20 69 66 28 20 70  ING:.      if( p
13b60 4d 57 69 6e 2d 3e 65 46 72 6d 54 79 70 65 21 3d  MWin->eFrmType!=
13b70 54 4b 5f 52 41 4e 47 45 0a 20 20 20 20 20 20 20  TK_RANGE.       
13b80 26 26 20 77 69 6e 64 6f 77 45 78 70 72 47 74 5a  && windowExprGtZ
13b90 65 72 6f 28 70 50 61 72 73 65 2c 20 70 4d 57 69  ero(pParse, pMWi
13ba0 6e 2d 3e 70 53 74 61 72 74 29 0a 20 20 20 20 20  n->pStart).     
13bb0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 2e 65 44   ){.        s.eD
13bc0 65 6c 65 74 65 20 3d 20 57 49 4e 44 4f 57 5f 52  elete = WINDOW_R
13bd0 45 54 55 52 4e 5f 52 4f 57 3b 0a 20 20 20 20 20  ETURN_ROW;.     
13be0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
13bf0 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 42 4f      case TK_UNBO
13c00 55 4e 44 45 44 3a 0a 20 20 20 20 20 20 69 66 28  UNDED:.      if(
13c10 20 77 69 6e 64 6f 77 43 61 63 68 65 46 72 61 6d   windowCacheFram
13c20 65 28 70 4d 57 69 6e 29 3d 3d 30 20 29 7b 0a 20  e(pMWin)==0 ){. 
13c30 20 20 20 20 20 20 20 69 66 28 20 70 4d 57 69 6e         if( pMWin
13c40 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45  ->eEnd==TK_PRECE
13c50 44 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 20 20  DING ){.        
13c60 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 46 72    if( pMWin->eFr
13c70 6d 54 79 70 65 21 3d 54 4b 5f 52 41 4e 47 45 0a  mType!=TK_RANGE.
13c80 20 20 20 20 20 20 20 20 20 20 20 26 26 20 77 69             && wi
13c90 6e 64 6f 77 45 78 70 72 47 74 5a 65 72 6f 28 70  ndowExprGtZero(p
13ca0 50 61 72 73 65 2c 20 70 4d 57 69 6e 2d 3e 70 45  Parse, pMWin->pE
13cb0 6e 64 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  nd).          ){
13cc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 2e 65  .            s.e
13cd0 44 65 6c 65 74 65 20 3d 20 57 49 4e 44 4f 57 5f  Delete = WINDOW_
13ce0 41 47 47 53 54 45 50 3b 0a 20 20 20 20 20 20 20  AGGSTEP;.       
13cf0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
13d00 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 2e  se{.          s.
13d10 65 44 65 6c 65 74 65 20 3d 20 57 49 4e 44 4f 57  eDelete = WINDOW
13d20 5f 52 45 54 55 52 4e 5f 52 4f 57 3b 0a 20 20 20  _RETURN_ROW;.   
13d30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
13d40 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13d50 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 73  default:.      s
13d60 2e 65 44 65 6c 65 74 65 20 3d 20 57 49 4e 44 4f  .eDelete = WINDO
13d70 57 5f 41 47 47 49 4e 56 45 52 53 45 3b 0a 20 20  W_AGGINVERSE;.  
13d80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
13d90 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 72 65    /* Allocate re
13da0 67 69 73 74 65 72 73 20 66 6f 72 20 74 68 65 20  gisters for the 
13db0 61 72 72 61 79 20 6f 66 20 76 61 6c 75 65 73 20  array of values 
13dc0 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 71 75 65  from the sub-que
13dd0 72 79 2c 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d  ry, the.  ** sam
13de0 76 65 20 76 61 6c 75 65 73 20 69 6e 20 72 65 63  ve values in rec
13df0 6f 72 64 20 66 6f 72 6d 2c 20 61 6e 64 20 74 68  ord form, and th
13e00 65 20 72 6f 77 69 64 20 75 73 65 64 20 74 6f 20  e rowid used to 
13e10 69 6e 73 65 72 74 20 73 61 69 64 20 72 65 63 6f  insert said reco
13e20 72 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65  rd.  ** into the
13e30 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
13e40 2e 20 20 2a 2f 0a 20 20 72 65 67 4e 65 77 20 3d  .  */.  regNew =
13e50 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
13e60 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  .  pParse->nMem 
13e70 2b 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 72 65 67  += nInput;.  reg
13e80 52 65 63 6f 72 64 20 3d 20 2b 2b 70 50 61 72 73  Record = ++pPars
13e90 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 52 6f  e->nMem;.  regRo
13ea0 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  wid = ++pParse->
13eb0 6e 4d 65 6d 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  nMem;..  /* If t
13ec0 68 65 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 20  he window frame 
13ed0 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 3c 65 78  contains an "<ex
13ee0 70 72 3e 20 50 52 45 43 45 44 49 4e 47 22 20 6f  pr> PRECEDING" o
13ef0 72 20 22 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57  r "<expr> FOLLOW
13f00 49 4e 47 22 0a 20 20 2a 2a 20 63 6c 61 75 73 65  ING".  ** clause
13f10 2c 20 61 6c 6c 6f 63 61 74 65 20 72 65 67 69 73  , allocate regis
13f20 74 65 72 73 20 74 6f 20 73 74 6f 72 65 20 74 68  ters to store th
13f30 65 20 72 65 73 75 6c 74 73 20 6f 66 20 65 76 61  e results of eva
13f40 6c 75 61 74 69 6e 67 20 65 61 63 68 0a 20 20 2a  luating each.  *
13f50 2a 20 3c 65 78 70 72 3e 2e 20 20 2a 2f 0a 20 20  * <expr>.  */.  
13f60 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72  if( pMWin->eStar
13f70 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20  t==TK_PRECEDING 
13f80 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  || pMWin->eStart
13f90 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29  ==TK_FOLLOWING )
13fa0 7b 0a 20 20 20 20 72 65 67 53 74 61 72 74 20 3d  {.    regStart =
13fb0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
13fc0 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d 57 69 6e  .  }.  if( pMWin
13fd0 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45  ->eEnd==TK_PRECE
13fe0 44 49 4e 47 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65  DING || pMWin->e
13ff0 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e  End==TK_FOLLOWIN
14000 47 20 29 7b 0a 20 20 20 20 72 65 67 45 6e 64 20  G ){.    regEnd 
14010 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
14020 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
14030 68 69 73 20 69 73 20 6e 6f 74 20 61 20 22 52 4f  his is not a "RO
14040 57 53 20 42 45 54 57 45 45 4e 20 2e 2e 2e 22 20  WS BETWEEN ..." 
14050 66 72 61 6d 65 2c 20 74 68 65 6e 20 61 6c 6c 6f  frame, then allo
14060 63 61 74 65 20 61 72 72 61 79 73 20 6f 66 0a 20  cate arrays of. 
14070 20 2a 2a 20 72 65 67 69 73 74 65 72 73 20 74 6f   ** registers to
14080 20 73 74 6f 72 65 20 63 6f 70 69 65 73 20 6f 66   store copies of
14090 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 65 78   the ORDER BY ex
140a0 70 72 65 73 73 69 6f 6e 73 20 28 70 65 65 72 20  pressions (peer 
140b0 76 61 6c 75 65 73 29 20 0a 20 20 2a 2a 20 66 6f  values) .  ** fo
140c0 72 20 74 68 65 20 6d 61 69 6e 20 6c 6f 6f 70 2c  r the main loop,
140d0 20 61 6e 64 20 66 6f 72 20 65 61 63 68 20 63 75   and for each cu
140e0 72 73 6f 72 20 28 73 74 61 72 74 2c 20 63 75 72  rsor (start, cur
140f0 72 65 6e 74 20 61 6e 64 20 65 6e 64 29 2e 20 2a  rent and end). *
14100 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65  /.  if( pMWin->e
14110 46 72 6d 54 79 70 65 21 3d 54 4b 5f 52 4f 57 53  FrmType!=TK_ROWS
14120 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 50 65 65   ){.    int nPee
14130 72 20 3d 20 28 70 4f 72 64 65 72 42 79 20 3f 20  r = (pOrderBy ? 
14140 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
14150 3a 20 30 29 3b 0a 20 20 20 20 72 65 67 4e 65 77  : 0);.    regNew
14160 50 65 65 72 20 3d 20 72 65 67 4e 65 77 20 2b 20  Peer = regNew + 
14170 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f  pMWin->nBufferCo
14180 6c 3b 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e  l;.    if( pMWin
14190 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 29 20 72  ->pPartition ) r
141a0 65 67 4e 65 77 50 65 65 72 20 2b 3d 20 70 4d 57  egNewPeer += pMW
141b0 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2d 3e  in->pPartition->
141c0 6e 45 78 70 72 3b 0a 20 20 20 20 72 65 67 50 65  nExpr;.    regPe
141d0 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  er = pParse->nMe
141e0 6d 2b 31 3b 20 20 20 20 20 20 20 70 50 61 72 73  m+1;       pPars
141f0 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 65 65 72  e->nMem += nPeer
14200 3b 0a 20 20 20 20 73 2e 73 74 61 72 74 2e 72 65  ;.    s.start.re
14210 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  g = pParse->nMem
14220 2b 31 3b 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  +1;   pParse->nM
14230 65 6d 20 2b 3d 20 6e 50 65 65 72 3b 0a 20 20 20  em += nPeer;.   
14240 20 73 2e 63 75 72 72 65 6e 74 2e 72 65 67 20 3d   s.current.reg =
14250 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
14260 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
14270 20 6e 50 65 65 72 3b 0a 20 20 20 20 73 2e 65 6e   nPeer;.    s.en
14280 64 2e 72 65 67 20 3d 20 70 50 61 72 73 65 2d 3e  d.reg = pParse->
14290 6e 4d 65 6d 2b 31 3b 20 20 20 20 20 70 50 61 72  nMem+1;     pPar
142a0 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 65 65  se->nMem += nPee
142b0 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 61  r;.  }..  /* Loa
142c0 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c  d the column val
142d0 75 65 73 20 66 6f 72 20 74 68 65 20 72 6f 77 20  ues for the row 
142e0 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
142f0 73 75 62 2d 73 65 6c 65 63 74 0a 20 20 2a 2a 20  sub-select.  ** 
14300 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66  into an array of
14310 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74   registers start
14320 69 6e 67 20 61 74 20 72 65 67 4e 65 77 2e 20 41  ing at regNew. A
14330 73 73 65 6d 62 6c 65 20 74 68 65 6d 20 69 6e 74  ssemble them int
14340 6f 0a 20 20 2a 2a 20 61 20 72 65 63 6f 72 64 20  o.  ** a record 
14350 69 6e 20 72 65 67 69 73 74 65 72 20 72 65 67 52  in register regR
14360 65 63 6f 72 64 2e 20 2a 2f 0a 20 20 66 6f 72 28  ecord. */.  for(
14370 69 49 6e 70 75 74 3d 30 3b 20 69 49 6e 70 75 74  iInput=0; iInput
14380 3c 6e 49 6e 70 75 74 3b 20 69 49 6e 70 75 74 2b  <nInput; iInput+
14390 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +){.    sqlite3V
143a0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
143b0 43 6f 6c 75 6d 6e 2c 20 63 73 72 49 6e 70 75 74  Column, csrInput
143c0 2c 20 69 49 6e 70 75 74 2c 20 72 65 67 4e 65 77  , iInput, regNew
143d0 2b 69 49 6e 70 75 74 29 3b 0a 20 20 7d 0a 20 20  +iInput);.  }.  
143e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
143f0 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
14400 72 64 2c 20 72 65 67 4e 65 77 2c 20 6e 49 6e 70  rd, regNew, nInp
14410 75 74 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  ut, regRecord);.
14420 0a 20 20 2f 2a 20 41 6e 20 69 6e 70 75 74 20 72  .  /* An input r
14430 6f 77 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ow has just been
14440 20 72 65 61 64 20 69 6e 74 6f 20 61 6e 20 61 72   read into an ar
14450 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
14460 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61   starting.  ** a
14470 74 20 72 65 67 4e 65 77 2e 20 49 66 20 74 68 65  t regNew. If the
14480 20 77 69 6e 64 6f 77 20 68 61 73 20 61 20 50 41   window has a PA
14490 52 54 49 54 49 4f 4e 20 63 6c 61 75 73 65 2c 20  RTITION clause, 
144a0 74 68 69 73 20 62 6c 6f 63 6b 20 67 65 6e 65 72  this block gener
144b0 61 74 65 73 20 0a 20 20 2a 2a 20 56 4d 20 63 6f  ates .  ** VM co
144c0 64 65 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74  de to check if t
144d0 68 65 20 69 6e 70 75 74 20 72 6f 77 20 69 73 20  he input row is 
144e0 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 6e  the start of a n
144f0 65 77 20 70 61 72 74 69 74 69 6f 6e 2e 0a 20 20  ew partition..  
14500 2a 2a 20 49 66 20 73 6f 2c 20 69 74 20 64 6f 65  ** If so, it doe
14510 73 20 61 6e 20 4f 50 5f 47 6f 73 75 62 20 74 6f  s an OP_Gosub to
14520 20 61 6e 20 61 64 64 72 65 73 73 20 74 6f 20 62   an address to b
14530 65 20 66 69 6c 6c 65 64 20 69 6e 20 6c 61 74 65  e filled in late
14540 72 2e 20 54 68 65 0a 20 20 2a 2a 20 61 64 64 72  r. The.  ** addr
14550 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 47 6f  ess of the OP_Go
14560 73 75 62 20 69 73 20 73 74 6f 72 65 64 20 69 6e  sub is stored in
14570 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 20   local variable 
14580 61 64 64 72 47 6f 73 75 62 46 6c 75 73 68 2e 20  addrGosubFlush. 
14590 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  */.  if( pMWin->
145a0 70 50 61 72 74 69 74 69 6f 6e 20 29 7b 0a 20 20  pPartition ){.  
145b0 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
145c0 45 78 70 72 4c 69 73 74 20 2a 70 50 61 72 74 20  ExprList *pPart 
145d0 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74  = pMWin->pPartit
145e0 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 50 61  ion;.    int nPa
145f0 72 74 20 3d 20 70 50 61 72 74 2d 3e 6e 45 78 70  rt = pPart->nExp
14600 72 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 4e 65  r;.    int regNe
14610 77 50 61 72 74 20 3d 20 72 65 67 4e 65 77 20 2b  wPart = regNew +
14620 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43   pMWin->nBufferC
14630 6f 6c 3b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20  ol;.    KeyInfo 
14640 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69  *pKeyInfo = sqli
14650 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78  te3KeyInfoFromEx
14660 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
14670 50 61 72 74 2c 20 30 2c 20 30 29 3b 0a 0a 20 20  Part, 0, 0);..  
14680 20 20 72 65 67 46 6c 75 73 68 50 61 72 74 20 3d    regFlushPart =
14690 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
146a0 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69  .    addr = sqli
146b0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
146c0 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67   OP_Compare, reg
146d0 4e 65 77 50 61 72 74 2c 20 70 4d 57 69 6e 2d 3e  NewPart, pMWin->
146e0 72 65 67 50 61 72 74 2c 20 6e 50 61 72 74 29 3b  regPart, nPart);
146f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14700 41 70 70 65 6e 64 50 34 28 76 2c 20 28 76 6f 69  AppendP4(v, (voi
14710 64 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  d*)pKeyInfo, P4_
14720 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71  KEYINFO);.    sq
14730 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
14740 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72  v, OP_Jump, addr
14750 2b 32 2c 20 61 64 64 72 2b 34 2c 20 61 64 64 72  +2, addr+4, addr
14760 2b 32 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  +2);.    VdbeCov
14770 65 72 61 67 65 45 71 4e 65 28 76 29 3b 0a 20 20  erageEqNe(v);.  
14780 20 20 61 64 64 72 47 6f 73 75 62 46 6c 75 73 68    addrGosubFlush
14790 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
147a0 64 4f 70 31 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp1(v, OP_Gosub
147b0 2c 20 72 65 67 46 6c 75 73 68 50 61 72 74 29 3b  , regFlushPart);
147c0 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
147d0 28 28 76 2c 20 22 63 61 6c 6c 20 66 6c 75 73 68  ((v, "call flush
147e0 5f 70 61 72 74 69 74 69 6f 6e 22 29 29 3b 0a 20  _partition"));. 
147f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14800 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp3(v, OP_Copy,
14810 20 72 65 67 4e 65 77 50 61 72 74 2c 20 70 4d 57   regNewPart, pMW
14820 69 6e 2d 3e 72 65 67 50 61 72 74 2c 20 6e 50 61  in->regPart, nPa
14830 72 74 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rt-1);.  }..  /*
14840 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20   Insert the new 
14850 72 6f 77 20 69 6e 74 6f 20 74 68 65 20 65 70 68  row into the eph
14860 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  emeral table */.
14870 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14880 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
14890 69 64 2c 20 63 73 72 57 72 69 74 65 2c 20 72 65  id, csrWrite, re
148a0 67 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74  gRowid);.  sqlit
148b0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
148c0 4f 50 5f 49 6e 73 65 72 74 2c 20 63 73 72 57 72  OP_Insert, csrWr
148d0 69 74 65 2c 20 72 65 67 52 65 63 6f 72 64 2c 20  ite, regRecord, 
148e0 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 61 64 64  regRowid);.  add
148f0 72 4e 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  rNe = sqlite3Vdb
14900 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 65  eAddOp3(v, OP_Ne
14910 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 4f 6e 65 2c  , pMWin->regOne,
14920 20 30 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20   0, regRowid);. 
14930 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76   VdbeCoverageNev
14940 65 72 4e 75 6c 6c 28 76 29 3b 0a 0a 20 20 2f 2a  erNull(v);..  /*
14950 20 54 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 72   This block is r
14960 75 6e 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  un for the first
14970 20 72 6f 77 20 6f 66 20 65 61 63 68 20 70 61 72   row of each par
14980 74 69 74 69 6f 6e 20 2a 2f 0a 20 20 73 2e 72 65  tition */.  s.re
14990 67 41 72 67 20 3d 20 77 69 6e 64 6f 77 49 6e 69  gArg = windowIni
149a0 74 41 63 63 75 6d 28 70 50 61 72 73 65 2c 20 70  tAccum(pParse, p
149b0 4d 57 69 6e 29 3b 0a 0a 20 20 69 66 28 20 72 65  MWin);..  if( re
149c0 67 53 74 61 72 74 20 29 7b 0a 20 20 20 20 73 71  gStart ){.    sq
149d0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
149e0 61 72 73 65 2c 20 70 4d 57 69 6e 2d 3e 70 53 74  arse, pMWin->pSt
149f0 61 72 74 2c 20 72 65 67 53 74 61 72 74 29 3b 0a  art, regStart);.
14a00 20 20 20 20 77 69 6e 64 6f 77 43 68 65 63 6b 56      windowCheckV
14a10 61 6c 75 65 28 70 50 61 72 73 65 2c 20 72 65 67  alue(pParse, reg
14a20 53 74 61 72 74 2c 20 30 20 2b 20 28 70 4d 57 69  Start, 0 + (pMWi
14a30 6e 2d 3e 65 46 72 6d 54 79 70 65 3d 3d 54 4b 5f  n->eFrmType==TK_
14a40 52 41 4e 47 45 20 3f 20 33 20 3a 20 30 29 29 3b  RANGE ? 3 : 0));
14a50 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 67 45 6e  .  }.  if( regEn
14a60 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
14a70 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
14a80 20 70 4d 57 69 6e 2d 3e 70 45 6e 64 2c 20 72 65   pMWin->pEnd, re
14a90 67 45 6e 64 29 3b 0a 20 20 20 20 77 69 6e 64 6f  gEnd);.    windo
14aa0 77 43 68 65 63 6b 56 61 6c 75 65 28 70 50 61 72  wCheckValue(pPar
14ab0 73 65 2c 20 72 65 67 45 6e 64 2c 20 31 20 2b 20  se, regEnd, 1 + 
14ac0 28 70 4d 57 69 6e 2d 3e 65 46 72 6d 54 79 70 65  (pMWin->eFrmType
14ad0 3d 3d 54 4b 5f 52 41 4e 47 45 20 3f 20 33 20 3a  ==TK_RANGE ? 3 :
14ae0 20 30 29 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28   0));.  }..  if(
14af0 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d   pMWin->eStart==
14b00 70 4d 57 69 6e 2d 3e 65 45 6e 64 20 26 26 20 72  pMWin->eEnd && r
14b10 65 67 53 74 61 72 74 20 29 7b 0a 20 20 20 20 69  egStart ){.    i
14b20 6e 74 20 6f 70 20 3d 20 28 28 70 4d 57 69 6e 2d  nt op = ((pMWin-
14b30 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c  >eStart==TK_FOLL
14b40 4f 57 49 4e 47 29 20 3f 20 4f 50 5f 47 65 20 3a  OWING) ? OP_Ge :
14b50 20 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 69 6e 74   OP_Le);.    int
14b60 20 61 64 64 72 47 65 20 3d 20 73 71 6c 69 74 65   addrGe = sqlite
14b70 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f  3VdbeAddOp3(v, o
14b80 70 2c 20 72 65 67 53 74 61 72 74 2c 20 30 2c 20  p, regStart, 0, 
14b90 72 65 67 45 6e 64 29 3b 0a 20 20 20 20 56 64 62  regEnd);.    Vdb
14ba0 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72 4e 75  eCoverageNeverNu
14bb0 6c 6c 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 47  llIf(v, op==OP_G
14bc0 65 29 3b 20 2f 2a 20 4e 65 76 65 72 4e 75 6c 6c  e); /* NeverNull
14bd0 20 62 65 63 61 75 73 65 20 62 6f 75 6e 64 20 3c   because bound <
14be0 65 78 70 72 3e 20 2a 2f 0a 20 20 20 20 56 64 62  expr> */.    Vdb
14bf0 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72 4e 75  eCoverageNeverNu
14c00 6c 6c 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4c  llIf(v, op==OP_L
14c10 65 29 3b 20 2f 2a 20 20 20 76 61 6c 75 65 73 20  e); /*   values 
14c20 70 72 65 76 69 6f 75 73 6c 79 20 63 68 65 63 6b  previously check
14c30 65 64 20 2a 2f 0a 20 20 20 20 77 69 6e 64 6f 77  ed */.    window
14c40 41 67 67 46 69 6e 61 6c 28 26 73 2c 20 30 29 3b  AggFinal(&s, 0);
14c50 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14c60 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
14c70 69 6e 64 2c 20 73 2e 63 75 72 72 65 6e 74 2e 63  ind, s.current.c
14c80 73 72 2c 20 31 29 3b 0a 20 20 20 20 56 64 62 65  sr, 1);.    Vdbe
14c90 43 6f 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b  CoverageNeverTak
14ca0 65 6e 28 76 29 3b 0a 20 20 20 20 77 69 6e 64 6f  en(v);.    windo
14cb0 77 52 65 74 75 72 6e 4f 6e 65 52 6f 77 28 26 73  wReturnOneRow(&s
14cc0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
14cd0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
14ce0 65 73 65 74 53 6f 72 74 65 72 2c 20 73 2e 63 75  esetSorter, s.cu
14cf0 72 72 65 6e 74 2e 63 73 72 29 3b 0a 20 20 20 20  rrent.csr);.    
14d00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14d10 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
14d20 20 6c 62 6c 57 68 65 72 65 45 6e 64 29 3b 0a 20   lblWhereEnd);. 
14d30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
14d40 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 47 65  mpHere(v, addrGe
14d50 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d 57  );.  }.  if( pMW
14d60 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46  in->eStart==TK_F
14d70 4f 4c 4c 4f 57 49 4e 47 20 26 26 20 70 4d 57 69  OLLOWING && pMWi
14d80 6e 2d 3e 65 46 72 6d 54 79 70 65 21 3d 54 4b 5f  n->eFrmType!=TK_
14d90 52 41 4e 47 45 20 26 26 20 72 65 67 45 6e 64 20  RANGE && regEnd 
14da0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
14db0 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46  MWin->eEnd==TK_F
14dc0 4f 4c 4c 4f 57 49 4e 47 20 29 3b 0a 20 20 20 20  OLLOWING );.    
14dd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14de0 33 28 76 2c 20 4f 50 5f 53 75 62 74 72 61 63 74  3(v, OP_Subtract
14df0 2c 20 72 65 67 53 74 61 72 74 2c 20 72 65 67 45  , regStart, regE
14e00 6e 64 2c 20 72 65 67 53 74 61 72 74 29 3b 0a 20  nd, regStart);. 
14e10 20 7d 0a 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d   }..  if( pMWin-
14e20 3e 65 53 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f  >eStart!=TK_UNBO
14e30 55 4e 44 45 44 20 29 7b 0a 20 20 20 20 73 71 6c  UNDED ){.    sql
14e40 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14e50 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 73 2e 73  , OP_Rewind, s.s
14e60 74 61 72 74 2e 63 73 72 2c 20 31 29 3b 0a 20 20  tart.csr, 1);.  
14e70 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65    VdbeCoverageNe
14e80 76 65 72 54 61 6b 65 6e 28 76 29 3b 0a 20 20 7d  verTaken(v);.  }
14e90 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
14ea0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
14eb0 64 2c 20 73 2e 63 75 72 72 65 6e 74 2e 63 73 72  d, s.current.csr
14ec0 2c 20 31 29 3b 0a 20 20 56 64 62 65 43 6f 76 65  , 1);.  VdbeCove
14ed0 72 61 67 65 4e 65 76 65 72 54 61 6b 65 6e 28 76  rageNeverTaken(v
14ee0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
14ef0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
14f00 69 6e 64 2c 20 73 2e 65 6e 64 2e 63 73 72 2c 20  ind, s.end.csr, 
14f10 31 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61  1);.  VdbeCovera
14f20 67 65 4e 65 76 65 72 54 61 6b 65 6e 28 76 29 3b  geNeverTaken(v);
14f30 0a 20 20 69 66 28 20 72 65 67 50 65 65 72 20 26  .  if( regPeer &
14f40 26 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  & pOrderBy ){.  
14f50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14f60 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op3(v, OP_Copy, 
14f70 72 65 67 4e 65 77 50 65 65 72 2c 20 72 65 67 50  regNewPeer, regP
14f80 65 65 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  eer, pOrderBy->n
14f90 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 73 71 6c  Expr-1);.    sql
14fa0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
14fb0 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 50 65  , OP_Copy, regPe
14fc0 65 72 2c 20 73 2e 73 74 61 72 74 2e 72 65 67 2c  er, s.start.reg,
14fd0 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
14fe0 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  -1);.    sqlite3
14ff0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
15000 5f 43 6f 70 79 2c 20 72 65 67 50 65 65 72 2c 20  _Copy, regPeer, 
15010 73 2e 63 75 72 72 65 6e 74 2e 72 65 67 2c 20 70  s.current.reg, p
15020 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31  OrderBy->nExpr-1
15030 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
15040 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
15050 6f 70 79 2c 20 72 65 67 50 65 65 72 2c 20 73 2e  opy, regPeer, s.
15060 65 6e 64 2e 72 65 67 2c 20 70 4f 72 64 65 72 42  end.reg, pOrderB
15070 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 7d  y->nExpr-1);.  }
15080 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ..  sqlite3VdbeA
15090 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
150a0 2c 20 30 2c 20 6c 62 6c 57 68 65 72 65 45 6e 64  , 0, lblWhereEnd
150b0 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62  );..  sqlite3Vdb
150c0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
150d0 72 4e 65 29 3b 0a 20 20 69 66 28 20 72 65 67 50  rNe);.  if( regP
150e0 65 65 72 20 29 7b 0a 20 20 20 20 77 69 6e 64 6f  eer ){.    windo
150f0 77 49 66 4e 65 77 50 65 65 72 28 70 50 61 72 73  wIfNewPeer(pPars
15100 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 72 65 67  e, pOrderBy, reg
15110 4e 65 77 50 65 65 72 2c 20 72 65 67 50 65 65 72  NewPeer, regPeer
15120 2c 20 6c 62 6c 57 68 65 72 65 45 6e 64 29 3b 0a  , lblWhereEnd);.
15130 20 20 7d 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d    }.  if( pMWin-
15140 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c  >eStart==TK_FOLL
15150 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 77 69 6e  OWING ){.    win
15160 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49  dowCodeOp(&s, WI
15170 4e 44 4f 57 5f 41 47 47 53 54 45 50 2c 20 30 2c  NDOW_AGGSTEP, 0,
15180 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 57   0);.    if( pMW
15190 69 6e 2d 3e 65 45 6e 64 21 3d 54 4b 5f 55 4e 42  in->eEnd!=TK_UNB
151a0 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20 20 20 20  OUNDED ){.      
151b0 69 66 28 20 70 4d 57 69 6e 2d 3e 65 46 72 6d 54  if( pMWin->eFrmT
151c0 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 29 7b  ype==TK_RANGE ){
151d0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 62 6c  .        int lbl
151e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
151f0 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
15200 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64  .        int add
15210 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56  rNext = sqlite3V
15220 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
15230 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f  );.        windo
15240 77 43 6f 64 65 52 61 6e 67 65 54 65 73 74 28 26  wCodeRangeTest(&
15250 73 2c 20 4f 50 5f 47 65 2c 20 73 2e 63 75 72 72  s, OP_Ge, s.curr
15260 65 6e 74 2e 63 73 72 2c 20 72 65 67 45 6e 64 2c  ent.csr, regEnd,
15270 20 73 2e 65 6e 64 2e 63 73 72 2c 20 6c 62 6c 29   s.end.csr, lbl)
15280 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77  ;.        window
15290 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f  CodeOp(&s, WINDO
152a0 57 5f 41 47 47 49 4e 56 45 52 53 45 2c 20 72 65  W_AGGINVERSE, re
152b0 67 53 74 61 72 74 2c 20 30 29 3b 0a 20 20 20 20  gStart, 0);.    
152c0 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70      windowCodeOp
152d0 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55  (&s, WINDOW_RETU
152e0 52 4e 5f 52 4f 57 2c 20 30 2c 20 30 29 3b 0a 20  RN_ROW, 0, 0);. 
152f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15300 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
15310 6f 74 6f 2c 20 30 2c 20 61 64 64 72 4e 65 78 74  oto, 0, addrNext
15320 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
15330 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
15340 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20 20 20 20  el(v, lbl);.    
15350 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15360 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73   windowCodeOp(&s
15370 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f  , WINDOW_RETURN_
15380 52 4f 57 2c 20 72 65 67 45 6e 64 2c 20 30 29 3b  ROW, regEnd, 0);
15390 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43  .        windowC
153a0 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57  odeOp(&s, WINDOW
153b0 5f 41 47 47 49 4e 56 45 52 53 45 2c 20 72 65 67  _AGGINVERSE, reg
153c0 53 74 61 72 74 2c 20 30 29 3b 0a 20 20 20 20 20  Start, 0);.     
153d0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
153e0 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45  .  if( pMWin->eE
153f0 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47  nd==TK_PRECEDING
15400 20 29 7b 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f   ){.    windowCo
15410 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f  deOp(&s, WINDOW_
15420 41 47 47 53 54 45 50 2c 20 72 65 67 45 6e 64 2c  AGGSTEP, regEnd,
15430 20 30 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43   0);.    windowC
15440 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57  odeOp(&s, WINDOW
15450 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 30 2c 20  _RETURN_ROW, 0, 
15460 30 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f  0);.    windowCo
15470 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f  deOp(&s, WINDOW_
15480 41 47 47 49 4e 56 45 52 53 45 2c 20 72 65 67 53  AGGINVERSE, regS
15490 74 61 72 74 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  tart, 0);.  }els
154a0 65 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 20  e{.    int addr 
154b0 3d 20 30 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43  = 0;.    windowC
154c0 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57  odeOp(&s, WINDOW
154d0 5f 41 47 47 53 54 45 50 2c 20 30 2c 20 30 29 3b  _AGGSTEP, 0, 0);
154e0 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  .    if( pMWin->
154f0 65 45 6e 64 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44  eEnd!=TK_UNBOUND
15500 45 44 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ED ){.      if( 
15510 70 4d 57 69 6e 2d 3e 65 46 72 6d 54 79 70 65 3d  pMWin->eFrmType=
15520 3d 54 4b 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20  =TK_RANGE ){.   
15530 20 20 20 20 20 69 6e 74 20 6c 62 6c 20 3d 20 30       int lbl = 0
15540 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d  ;.        addr =
15550 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
15560 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
15570 20 20 20 20 69 66 28 20 72 65 67 45 6e 64 20 29      if( regEnd )
15580 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 62 6c 20  {.          lbl 
15590 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
155a0 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
155b0 20 20 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77            window
155c0 43 6f 64 65 52 61 6e 67 65 54 65 73 74 28 26 73  CodeRangeTest(&s
155d0 2c 20 4f 50 5f 47 65 2c 20 73 2e 63 75 72 72 65  , OP_Ge, s.curre
155e0 6e 74 2e 63 73 72 2c 20 72 65 67 45 6e 64 2c 20  nt.csr, regEnd, 
155f0 73 2e 65 6e 64 2e 63 73 72 2c 20 6c 62 6c 29 3b  s.end.csr, lbl);
15600 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15610 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28     windowCodeOp(
15620 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55 52  &s, WINDOW_RETUR
15630 4e 5f 52 4f 57 2c 20 30 2c 20 30 29 3b 0a 20 20  N_ROW, 0, 0);.  
15640 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65        windowCode
15650 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47  Op(&s, WINDOW_AG
15660 47 49 4e 56 45 52 53 45 2c 20 72 65 67 53 74 61  GINVERSE, regSta
15670 72 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  rt, 0);.        
15680 69 66 28 20 72 65 67 45 6e 64 20 29 7b 0a 20 20  if( regEnd ){.  
15690 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
156a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
156b0 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 29 3b 0a  Goto, 0, addr);.
156c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
156d0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
156e0 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20 20 20 20 20  l(v, lbl);.     
156f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
15700 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65  {.        if( re
15710 67 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20  gEnd ){.        
15720 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
15730 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
15740 5f 49 66 50 6f 73 2c 20 72 65 67 45 6e 64 2c 20  _IfPos, regEnd, 
15750 30 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  0, 1);.         
15760 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
15770 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15780 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70      windowCodeOp
15790 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55  (&s, WINDOW_RETU
157a0 52 4e 5f 52 4f 57 2c 20 30 2c 20 30 29 3b 0a 20  RN_ROW, 0, 0);. 
157b0 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64         windowCod
157c0 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41  eOp(&s, WINDOW_A
157d0 47 47 49 4e 56 45 52 53 45 2c 20 72 65 67 53 74  GGINVERSE, regSt
157e0 61 72 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  art, 0);.       
157f0 20 69 66 28 20 72 65 67 45 6e 64 20 29 20 73 71   if( regEnd ) sq
15800 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
15810 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
15820 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
15830 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6d   /* End of the m
15840 61 69 6e 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a  ain input loop *
15850 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
15860 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
15870 62 6c 57 68 65 72 65 45 6e 64 29 3b 0a 20 20 73  blWhereEnd);.  s
15880 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
15890 57 49 6e 66 6f 29 3b 0a 0a 20 20 2f 2a 20 46 61  WInfo);..  /* Fa
158a0 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20  ll through */.  
158b0 69 66 28 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74  if( pMWin->pPart
158c0 69 74 69 6f 6e 20 29 7b 0a 20 20 20 20 61 64 64  ition ){.    add
158d0 72 49 6e 74 65 67 65 72 20 3d 20 73 71 6c 69 74  rInteger = sqlit
158e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
158f0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72  OP_Integer, 0, r
15900 65 67 46 6c 75 73 68 50 61 72 74 29 3b 0a 20 20  egFlushPart);.  
15910 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
15920 70 48 65 72 65 28 76 2c 20 61 64 64 72 47 6f 73  pHere(v, addrGos
15930 75 62 46 6c 75 73 68 29 3b 0a 20 20 7d 0a 0a 20  ubFlush);.  }.. 
15940 20 61 64 64 72 45 6d 70 74 79 20 3d 20 73 71 6c   addrEmpty = sql
15950 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
15960 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 63 73 72  , OP_Rewind, csr
15970 57 72 69 74 65 29 3b 0a 20 20 56 64 62 65 43 6f  Write);.  VdbeCo
15980 76 65 72 61 67 65 28 76 29 3b 0a 20 20 69 66 28  verage(v);.  if(
15990 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b   pMWin->eEnd==TK
159a0 5f 50 52 45 43 45 44 49 4e 47 20 29 7b 0a 20 20  _PRECEDING ){.  
159b0 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26    windowCodeOp(&
159c0 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 53 54 45  s, WINDOW_AGGSTE
159d0 50 2c 20 72 65 67 45 6e 64 2c 20 30 29 3b 0a 20  P, regEnd, 0);. 
159e0 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28     windowCodeOp(
159f0 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55 52  &s, WINDOW_RETUR
15a00 4e 5f 52 4f 57 2c 20 30 2c 20 30 29 3b 0a 20 20  N_ROW, 0, 0);.  
15a10 7d 65 6c 73 65 20 69 66 28 20 70 4d 57 69 6e 2d  }else if( pMWin-
15a20 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c  >eStart==TK_FOLL
15a30 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 69 6e 74  OWING ){.    int
15a40 20 61 64 64 72 53 74 61 72 74 3b 0a 20 20 20 20   addrStart;.    
15a50 69 6e 74 20 61 64 64 72 42 72 65 61 6b 31 3b 0a  int addrBreak1;.
15a60 20 20 20 20 69 6e 74 20 61 64 64 72 42 72 65 61      int addrBrea
15a70 6b 32 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72  k2;.    int addr
15a80 42 72 65 61 6b 33 3b 0a 20 20 20 20 77 69 6e 64  Break3;.    wind
15a90 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e  owCodeOp(&s, WIN
15aa0 44 4f 57 5f 41 47 47 53 54 45 50 2c 20 30 2c 20  DOW_AGGSTEP, 0, 
15ab0 30 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 57 69  0);.    if( pMWi
15ac0 6e 2d 3e 65 46 72 6d 54 79 70 65 3d 3d 54 4b 5f  n->eFrmType==TK_
15ad0 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 61  RANGE ){.      a
15ae0 64 64 72 53 74 61 72 74 20 3d 20 73 71 6c 69 74  ddrStart = sqlit
15af0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
15b00 72 28 76 29 3b 0a 20 20 20 20 20 20 61 64 64 72  r(v);.      addr
15b10 42 72 65 61 6b 32 20 3d 20 77 69 6e 64 6f 77 43  Break2 = windowC
15b20 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57  odeOp(&s, WINDOW
15b30 5f 41 47 47 49 4e 56 45 52 53 45 2c 20 72 65 67  _AGGINVERSE, reg
15b40 53 74 61 72 74 2c 20 31 29 3b 0a 20 20 20 20 20  Start, 1);.     
15b50 20 61 64 64 72 42 72 65 61 6b 31 20 3d 20 77 69   addrBreak1 = wi
15b60 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57  ndowCodeOp(&s, W
15b70 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57  INDOW_RETURN_ROW
15b80 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c  , 0, 1);.    }el
15b90 73 65 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e  se.    if( pMWin
15ba0 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55  ->eEnd==TK_UNBOU
15bb0 4e 44 45 44 20 29 7b 0a 20 20 20 20 20 20 61 64  NDED ){.      ad
15bc0 64 72 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65  drStart = sqlite
15bd0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
15be0 28 76 29 3b 0a 20 20 20 20 20 20 61 64 64 72 42  (v);.      addrB
15bf0 72 65 61 6b 31 20 3d 20 77 69 6e 64 6f 77 43 6f  reak1 = windowCo
15c00 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f  deOp(&s, WINDOW_
15c10 52 45 54 55 52 4e 5f 52 4f 57 2c 20 72 65 67 53  RETURN_ROW, regS
15c20 74 61 72 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  tart, 1);.      
15c30 61 64 64 72 42 72 65 61 6b 32 20 3d 20 77 69 6e  addrBreak2 = win
15c40 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49  dowCodeOp(&s, WI
15c50 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 2c  NDOW_AGGINVERSE,
15c60 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73   0, 1);.    }els
15c70 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
15c80 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b   pMWin->eEnd==TK
15c90 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 3b 0a 20 20  _FOLLOWING );.  
15ca0 20 20 20 20 61 64 64 72 53 74 61 72 74 20 3d 20      addrStart = 
15cb0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
15cc0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
15cd0 20 61 64 64 72 42 72 65 61 6b 31 20 3d 20 77 69   addrBreak1 = wi
15ce0 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57  ndowCodeOp(&s, W
15cf0 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57  INDOW_RETURN_ROW
15d00 2c 20 72 65 67 45 6e 64 2c 20 31 29 3b 0a 20 20  , regEnd, 1);.  
15d10 20 20 20 20 61 64 64 72 42 72 65 61 6b 32 20 3d      addrBreak2 =
15d20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73   windowCodeOp(&s
15d30 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45  , WINDOW_AGGINVE
15d40 52 53 45 2c 20 72 65 67 53 74 61 72 74 2c 20 31  RSE, regStart, 1
15d50 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
15d60 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15d70 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
15d80 64 72 53 74 61 72 74 29 3b 0a 20 20 20 20 73 71  drStart);.    sq
15d90 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
15da0 65 28 76 2c 20 61 64 64 72 42 72 65 61 6b 32 29  e(v, addrBreak2)
15db0 3b 0a 20 20 20 20 61 64 64 72 53 74 61 72 74 20  ;.    addrStart 
15dc0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
15dd0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
15de0 20 61 64 64 72 42 72 65 61 6b 33 20 3d 20 77 69   addrBreak3 = wi
15df0 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57  ndowCodeOp(&s, W
15e00 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57  INDOW_RETURN_ROW
15e10 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  , 0, 1);.    sql
15e20 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15e30 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
15e40 64 72 53 74 61 72 74 29 3b 0a 20 20 20 20 73 71  drStart);.    sq
15e50 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
15e60 65 28 76 2c 20 61 64 64 72 42 72 65 61 6b 31 29  e(v, addrBreak1)
15e70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
15e80 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
15e90 72 42 72 65 61 6b 33 29 3b 0a 20 20 7d 65 6c 73  rBreak3);.  }els
15ea0 65 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 42  e{.    int addrB
15eb0 72 65 61 6b 3b 0a 20 20 20 20 69 6e 74 20 61 64  reak;.    int ad
15ec0 64 72 53 74 61 72 74 3b 0a 20 20 20 20 77 69 6e  drStart;.    win
15ed0 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49  dowCodeOp(&s, WI
15ee0 4e 44 4f 57 5f 41 47 47 53 54 45 50 2c 20 30 2c  NDOW_AGGSTEP, 0,
15ef0 20 30 29 3b 0a 20 20 20 20 61 64 64 72 53 74 61   0);.    addrSta
15f00 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
15f10 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
15f20 20 20 20 20 61 64 64 72 42 72 65 61 6b 20 3d 20      addrBreak = 
15f30 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c  windowCodeOp(&s,
15f40 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52   WINDOW_RETURN_R
15f50 4f 57 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 77  OW, 0, 1);.    w
15f60 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20  indowCodeOp(&s, 
15f70 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53  WINDOW_AGGINVERS
15f80 45 2c 20 72 65 67 53 74 61 72 74 2c 20 30 29 3b  E, regStart, 0);
15f90 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15fa0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
15fb0 6f 2c 20 30 2c 20 61 64 64 72 53 74 61 72 74 29  o, 0, addrStart)
15fc0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
15fd0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
15fe0 72 42 72 65 61 6b 29 3b 0a 20 20 7d 0a 20 20 73  rBreak);.  }.  s
15ff0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
16000 72 65 28 76 2c 20 61 64 64 72 45 6d 70 74 79 29  re(v, addrEmpty)
16010 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ;..  sqlite3Vdbe
16020 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73  AddOp1(v, OP_Res
16030 65 74 53 6f 72 74 65 72 2c 20 73 2e 63 75 72 72  etSorter, s.curr
16040 65 6e 74 2e 63 73 72 29 3b 0a 20 20 69 66 28 20  ent.csr);.  if( 
16050 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f  pMWin->pPartitio
16060 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 57  n ){.    if( pMW
16070 69 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f 77 69  in->regStartRowi
16080 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  d ){.      sqlit
16090 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
160a0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70  OP_Integer, 1, p
160b0 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f  MWin->regStartRo
160c0 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
160d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
160e0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
160f0 70 4d 57 69 6e 2d 3e 72 65 67 45 6e 64 52 6f 77  pMWin->regEndRow
16100 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  id);.    }.    s
16110 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
16120 50 31 28 76 2c 20 61 64 64 72 49 6e 74 65 67 65  P1(v, addrIntege
16130 72 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  r, sqlite3VdbeCu
16140 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20  rrentAddr(v));. 
16150 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16160 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
16170 6e 2c 20 72 65 67 46 6c 75 73 68 50 61 72 74 29  n, regFlushPart)
16180 3b 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20  ;.  }.}..#endif 
16190 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  /* SQLITE_OMIT_W
161a0 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a           INDOWFUNC */.