/ Hex Artifact Content
Login

Artifact bcf909b9aca293765bd5a3cd17dd72a63658d476a704b37ae0b766d2054fb864:


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 70 20 3d  nArg==0 );.  p =
2870: 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75   (struct CallCou
2880: 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72  nt*)sqlite3_aggr
2890: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43  egate_context(pC
28a0: 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b  tx, sizeof(*p));
28b0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
28c0: 70 2d 3e 6e 54 6f 74 61 6c 2b 2b 3b 0a 20 20 7d  p->nTotal++;.  }
28d0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  .}.static void p
28e0: 65 72 63 65 6e 74 5f 72 61 6e 6b 49 6e 76 46 75  ercent_rankInvFu
28f0: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
2900: 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20  ntext *pCtx, .  
2910: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69  int nArg,.  sqli
2920: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72  te3_value **apAr
2930: 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61  g.){.  struct Ca
2940: 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 55 4e  llCount *p;.  UN
2950: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
2960: 41 72 67 29 3b 20 61 73 73 65 72 74 28 20 6e 41  Arg); assert( nA
2970: 72 67 3d 3d 30 20 29 3b 0a 20 20 70 20 3d 20 28  rg==0 );.  p = (
2980: 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74  struct CallCount
2990: 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  *)sqlite3_aggreg
29a0: 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78  ate_context(pCtx
29b0: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
29c0: 20 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 7d 0a 73   p->nStep++;.}.s
29d0: 74 61 74 69 63 20 76 6f 69 64 20 70 65 72 63 65  tatic void perce
29e0: 6e 74 5f 72 61 6e 6b 56 61 6c 75 65 46 75 6e 63  nt_rankValueFunc
29f0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
2a00: 20 2a 70 43 74 78 29 7b 0a 20 20 73 74 72 75 63   *pCtx){.  struc
2a10: 74 20 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a  t CallCount *p;.
2a20: 20 20 70 20 3d 20 28 73 74 72 75 63 74 20 43 61    p = (struct Ca
2a30: 6c 6c 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33  llCount*)sqlite3
2a40: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
2a50: 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28  xt(pCtx, sizeof(
2a60: 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b  *p));.  if( p ){
2a70: 0a 20 20 20 20 70 2d 3e 6e 56 61 6c 75 65 20 3d  .    p->nValue =
2a80: 20 70 2d 3e 6e 53 74 65 70 3b 0a 20 20 20 20 69   p->nStep;.    i
2a90: 66 28 20 70 2d 3e 6e 54 6f 74 61 6c 3e 31 20 29  f( p->nTotal>1 )
2aa0: 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72  {.      double r
2ab0: 20 3d 20 28 64 6f 75 62 6c 65 29 70 2d 3e 6e 56   = (double)p->nV
2ac0: 61 6c 75 65 20 2f 20 28 64 6f 75 62 6c 65 29 28  alue / (double)(
2ad0: 70 2d 3e 6e 54 6f 74 61 6c 2d 31 29 3b 0a 20 20  p->nTotal-1);.  
2ae0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
2af0: 6c 74 5f 64 6f 75 62 6c 65 28 70 43 74 78 2c 20  lt_double(pCtx, 
2b00: 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r);.    }else{. 
2b10: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
2b20: 75 6c 74 5f 64 6f 75 62 6c 65 28 70 43 74 78 2c  ult_double(pCtx,
2b30: 20 30 2e 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   0.0);.    }.  }
2b40: 0a 7d 0a 23 64 65 66 69 6e 65 20 70 65 72 63 65  .}.#define perce
2b50: 6e 74 5f 72 61 6e 6b 46 69 6e 61 6c 69 7a 65 46  nt_rankFinalizeF
2b60: 75 6e 63 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b  unc percent_rank
2b70: 56 61 6c 75 65 46 75 6e 63 0a 0a 2f 2a 0a 2a 2a  ValueFunc../*.**
2b80: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
2b90: 6f 66 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64  of built-in wind
2ba0: 6f 77 20 66 75 6e 63 74 69 6f 6e 20 63 75 6d 65  ow function cume
2bb0: 5f 64 69 73 74 28 29 2e 20 41 73 73 75 6d 65 73  _dist(). Assumes
2bc0: 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 77 69 6e   that.** the win
2bd0: 64 6f 77 20 66 72 61 6d 65 20 68 61 73 20 62 65  dow frame has be
2be0: 65 6e 20 73 65 74 20 74 6f 3a 0a 2a 2a 0a 2a 2a  en set to:.**.**
2bf0: 20 20 20 47 52 4f 55 50 53 20 42 45 54 57 45 45     GROUPS BETWEE
2c00: 4e 20 31 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e  N 1 FOLLOWING AN
2c10: 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c  D UNBOUNDED FOLL
2c20: 4f 57 49 4e 47 0a 2a 2f 0a 73 74 61 74 69 63 20  OWING.*/.static 
2c30: 76 6f 69 64 20 63 75 6d 65 5f 64 69 73 74 53 74  void cume_distSt
2c40: 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  epFunc(.  sqlite
2c50: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
2c60: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
2c70: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
2c80: 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63  apArg.){.  struc
2c90: 74 20 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a  t CallCount *p;.
2ca0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2cb0: 45 52 28 6e 41 72 67 29 3b 20 61 73 73 65 72 74  ER(nArg); assert
2cc0: 28 20 6e 41 72 67 3d 3d 30 20 29 3b 0a 20 20 70  ( nArg==0 );.  p
2cd0: 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43   = (struct CallC
2ce0: 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67  ount*)sqlite3_ag
2cf0: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
2d00: 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29  pCtx, sizeof(*p)
2d10: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
2d20: 20 20 70 2d 3e 6e 54 6f 74 61 6c 2b 2b 3b 0a 20    p->nTotal++;. 
2d30: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
2d40: 20 63 75 6d 65 5f 64 69 73 74 49 6e 76 46 75 6e   cume_distInvFun
2d50: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
2d60: 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69  text *pCtx, .  i
2d70: 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74  nt nArg,.  sqlit
2d80: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72 67  e3_value **apArg
2d90: 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61 6c  .){.  struct Cal
2da0: 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 55 4e 55  lCount *p;.  UNU
2db0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 41  SED_PARAMETER(nA
2dc0: 72 67 29 3b 20 61 73 73 65 72 74 28 20 6e 41 72  rg); assert( nAr
2dd0: 67 3d 3d 30 20 29 3b 0a 20 20 70 20 3d 20 28 73  g==0 );.  p = (s
2de0: 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a  truct CallCount*
2df0: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
2e00: 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c  te_context(pCtx,
2e10: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
2e20: 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 7d 0a 73 74  p->nStep++;.}.st
2e30: 61 74 69 63 20 76 6f 69 64 20 63 75 6d 65 5f 64  atic void cume_d
2e40: 69 73 74 56 61 6c 75 65 46 75 6e 63 28 73 71 6c  istValueFunc(sql
2e50: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
2e60: 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61  tx){.  struct Ca
2e70: 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70 20  llCount *p;.  p 
2e80: 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  = (struct CallCo
2e90: 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67  unt*)sqlite3_agg
2ea0: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70  regate_context(p
2eb0: 43 74 78 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  Ctx, 0);.  if( p
2ec0: 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72   ){.    double r
2ed0: 20 3d 20 28 64 6f 75 62 6c 65 29 28 70 2d 3e 6e   = (double)(p->n
2ee0: 53 74 65 70 29 20 2f 20 28 64 6f 75 62 6c 65 29  Step) / (double)
2ef0: 28 70 2d 3e 6e 54 6f 74 61 6c 29 3b 0a 20 20 20  (p->nTotal);.   
2f00: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2f10: 64 6f 75 62 6c 65 28 70 43 74 78 2c 20 72 29 3b  double(pCtx, r);
2f20: 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 63  .  }.}.#define c
2f30: 75 6d 65 5f 64 69 73 74 46 69 6e 61 6c 69 7a 65  ume_distFinalize
2f40: 46 75 6e 63 20 63 75 6d 65 5f 64 69 73 74 56 61  Func cume_distVa
2f50: 6c 75 65 46 75 6e 63 0a 0a 2f 2a 0a 2a 2a 20 43  lueFunc../*.** C
2f60: 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 66 6f  ontext object fo
2f70: 72 20 6e 74 69 6c 65 28 29 20 77 69 6e 64 6f 77  r ntile() window
2f80: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
2f90: 72 75 63 74 20 4e 74 69 6c 65 43 74 78 20 7b 0a  ruct NtileCtx {.
2fa0: 20 20 69 36 34 20 6e 54 6f 74 61 6c 3b 20 20 20    i64 nTotal;   
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc0: 20 20 2f 2a 20 54 6f 74 61 6c 20 72 6f 77 73 20    /* Total rows 
2fd0: 69 6e 20 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a  in partition */.
2fe0: 20 20 69 36 34 20 6e 50 61 72 61 6d 3b 20 20 20    i64 nParam;   
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3000: 20 20 2f 2a 20 50 61 72 61 6d 65 74 65 72 20 70    /* Parameter p
3010: 61 73 73 65 64 20 74 6f 20 6e 74 69 6c 65 28 4e  assed to ntile(N
3020: 29 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 3b  ) */.  i64 iRow;
3030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3040: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
3050: 74 20 72 6f 77 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  t row */.};../*.
3060: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
3070: 6e 20 6f 66 20 6e 74 69 6c 65 28 29 2e 20 54 68  n of ntile(). Th
3080: 69 73 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  is assumes that 
3090: 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61 6d 65  the window frame
30a0: 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 63 6f 65   has.** been coe
30b0: 72 63 65 64 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20  rced to:.**.**  
30c0: 20 52 4f 57 53 20 43 55 52 52 45 4e 54 20 52 4f   ROWS CURRENT RO
30d0: 57 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20  W AND UNBOUNDED 
30e0: 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2f 0a 73 74 61  FOLLOWING.*/.sta
30f0: 74 69 63 20 76 6f 69 64 20 6e 74 69 6c 65 53 74  tic void ntileSt
3100: 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  epFunc(.  sqlite
3110: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
3120: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
3130: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
3140: 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63  apArg.){.  struc
3150: 74 20 4e 74 69 6c 65 43 74 78 20 2a 70 3b 0a 20  t NtileCtx *p;. 
3160: 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31   assert( nArg==1
3170: 20 29 3b 20 55 4e 55 53 45 44 5f 50 41 52 41 4d   ); UNUSED_PARAM
3180: 45 54 45 52 28 6e 41 72 67 29 3b 0a 20 20 70 20  ETER(nArg);.  p 
3190: 3d 20 28 73 74 72 75 63 74 20 4e 74 69 6c 65 43  = (struct NtileC
31a0: 74 78 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72  tx*)sqlite3_aggr
31b0: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43  egate_context(pC
31c0: 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b  tx, sizeof(*p));
31d0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
31e0: 69 66 28 20 70 2d 3e 6e 54 6f 74 61 6c 3d 3d 30  if( p->nTotal==0
31f0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 50 61   ){.      p->nPa
3200: 72 61 6d 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ram = sqlite3_va
3210: 6c 75 65 5f 69 6e 74 36 34 28 61 70 41 72 67 5b  lue_int64(apArg[
3220: 30 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0]);.      if( p
3230: 2d 3e 6e 50 61 72 61 6d 3c 3d 30 20 29 7b 0a 20  ->nParam<=0 ){. 
3240: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
3250: 65 73 75 6c 74 5f 65 72 72 6f 72 28 0a 20 20 20  esult_error(.   
3260: 20 20 20 20 20 20 20 20 20 70 43 74 78 2c 20 22           pCtx, "
3270: 61 72 67 75 6d 65 6e 74 20 6f 66 20 6e 74 69 6c  argument of ntil
3280: 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 73 69  e must be a posi
3290: 74 69 76 65 20 69 6e 74 65 67 65 72 22 2c 20 2d  tive integer", -
32a0: 31 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  1.        );.   
32b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
32c0: 2d 3e 6e 54 6f 74 61 6c 2b 2b 3b 0a 20 20 7d 0a  ->nTotal++;.  }.
32d0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e 74  }.static void nt
32e0: 69 6c 65 49 6e 76 46 75 6e 63 28 0a 20 20 73 71  ileInvFunc(.  sq
32f0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
3300: 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67  Ctx, .  int nArg
3310: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
3320: 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20 73  e **apArg.){.  s
3330: 74 72 75 63 74 20 4e 74 69 6c 65 43 74 78 20 2a  truct NtileCtx *
3340: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 41 72  p;.  assert( nAr
3350: 67 3d 3d 31 20 29 3b 20 55 4e 55 53 45 44 5f 50  g==1 ); UNUSED_P
3360: 41 52 41 4d 45 54 45 52 28 6e 41 72 67 29 3b 0a  ARAMETER(nArg);.
3370: 20 20 70 20 3d 20 28 73 74 72 75 63 74 20 4e 74    p = (struct Nt
3380: 69 6c 65 43 74 78 2a 29 73 71 6c 69 74 65 33 5f  ileCtx*)sqlite3_
3390: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
33a0: 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a  t(pCtx, sizeof(*
33b0: 70 29 29 3b 0a 20 20 70 2d 3e 69 52 6f 77 2b 2b  p));.  p->iRow++
33c0: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
33d0: 6e 74 69 6c 65 56 61 6c 75 65 46 75 6e 63 28 73  ntileValueFunc(s
33e0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
33f0: 70 43 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20  pCtx){.  struct 
3400: 4e 74 69 6c 65 43 74 78 20 2a 70 3b 0a 20 20 70  NtileCtx *p;.  p
3410: 20 3d 20 28 73 74 72 75 63 74 20 4e 74 69 6c 65   = (struct Ntile
3420: 43 74 78 2a 29 73 71 6c 69 74 65 33 5f 61 67 67  Ctx*)sqlite3_agg
3430: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70  regate_context(p
3440: 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  Ctx, sizeof(*p))
3450: 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e  ;.  if( p && p->
3460: 6e 50 61 72 61 6d 3e 30 20 29 7b 0a 20 20 20 20  nParam>0 ){.    
3470: 69 6e 74 20 6e 53 69 7a 65 20 3d 20 28 70 2d 3e  int nSize = (p->
3480: 6e 54 6f 74 61 6c 20 2f 20 70 2d 3e 6e 50 61 72  nTotal / p->nPar
3490: 61 6d 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69  am);.    if( nSi
34a0: 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ze==0 ){.      s
34b0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
34c0: 74 36 34 28 70 43 74 78 2c 20 70 2d 3e 69 52 6f  t64(pCtx, p->iRo
34d0: 77 2b 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  w+1);.    }else{
34e0: 0a 20 20 20 20 20 20 69 36 34 20 6e 4c 61 72 67  .      i64 nLarg
34f0: 65 20 3d 20 70 2d 3e 6e 54 6f 74 61 6c 20 2d 20  e = p->nTotal - 
3500: 70 2d 3e 6e 50 61 72 61 6d 2a 6e 53 69 7a 65 3b  p->nParam*nSize;
3510: 0a 20 20 20 20 20 20 69 36 34 20 69 53 6d 61 6c  .      i64 iSmal
3520: 6c 20 3d 20 6e 4c 61 72 67 65 2a 28 6e 53 69 7a  l = nLarge*(nSiz
3530: 65 2b 31 29 3b 0a 20 20 20 20 20 20 69 36 34 20  e+1);.      i64 
3540: 69 52 6f 77 20 3d 20 70 2d 3e 69 52 6f 77 3b 0a  iRow = p->iRow;.
3550: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
3560: 6e 4c 61 72 67 65 2a 28 6e 53 69 7a 65 2b 31 29  nLarge*(nSize+1)
3570: 20 2b 20 28 70 2d 3e 6e 50 61 72 61 6d 2d 6e 4c   + (p->nParam-nL
3580: 61 72 67 65 29 2a 6e 53 69 7a 65 29 3d 3d 70 2d  arge)*nSize)==p-
3590: 3e 6e 54 6f 74 61 6c 20 29 3b 0a 0a 20 20 20 20  >nTotal );..    
35a0: 20 20 69 66 28 20 69 52 6f 77 3c 69 53 6d 61 6c    if( iRow<iSmal
35b0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l ){.        sql
35c0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
35d0: 34 28 70 43 74 78 2c 20 31 20 2b 20 69 52 6f 77  4(pCtx, 1 + iRow
35e0: 2f 28 6e 53 69 7a 65 2b 31 29 29 3b 0a 20 20 20  /(nSize+1));.   
35f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3600: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
3610: 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 31 20 2b  _int64(pCtx, 1 +
3620: 20 6e 4c 61 72 67 65 20 2b 20 28 69 52 6f 77 2d   nLarge + (iRow-
3630: 69 53 6d 61 6c 6c 29 2f 6e 53 69 7a 65 29 3b 0a  iSmall)/nSize);.
3640: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3650: 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 6e 74 69 6c  }.}.#define ntil
3660: 65 46 69 6e 61 6c 69 7a 65 46 75 6e 63 20 6e 74  eFinalizeFunc nt
3670: 69 6c 65 56 61 6c 75 65 46 75 6e 63 0a 0a 2f 2a  ileValueFunc../*
3680: 0a 2a 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65  .** Context obje
3690: 63 74 20 66 6f 72 20 6c 61 73 74 5f 76 61 6c 75  ct for last_valu
36a0: 65 28 29 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  e() window funct
36b0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 4c  ion..*/.struct L
36c0: 61 73 74 56 61 6c 75 65 43 74 78 20 7b 0a 20 20  astValueCtx {.  
36d0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
36e0: 56 61 6c 3b 0a 20 20 69 6e 74 20 6e 56 61 6c 3b  Val;.  int nVal;
36f0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  .};../*.** Imple
3700: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6c 61 73  mentation of las
3710: 74 5f 76 61 6c 75 65 28 29 2e 0a 2a 2f 0a 73 74  t_value()..*/.st
3720: 61 74 69 63 20 76 6f 69 64 20 6c 61 73 74 5f 76  atic void last_v
3730: 61 6c 75 65 53 74 65 70 46 75 6e 63 28 0a 20 20  alueStepFunc(.  
3740: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
3750: 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41  *pCtx, .  int nA
3760: 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  rg,.  sqlite3_va
3770: 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 20  lue **apArg.){. 
3780: 20 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75   struct LastValu
3790: 65 43 74 78 20 2a 70 3b 0a 20 20 55 4e 55 53 45  eCtx *p;.  UNUSE
37a0: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72 67  D_PARAMETER(nArg
37b0: 29 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74  );.  p = (struct
37c0: 20 4c 61 73 74 56 61 6c 75 65 43 74 78 2a 29 73   LastValueCtx*)s
37d0: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
37e0: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
37f0: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
3800: 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( p ){.    sqlit
3810: 65 33 5f 76 61 6c 75 65 5f 66 72 65 65 28 70 2d  e3_value_free(p-
3820: 3e 70 56 61 6c 29 3b 0a 20 20 20 20 70 2d 3e 70  >pVal);.    p->p
3830: 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  Val = sqlite3_va
3840: 6c 75 65 5f 64 75 70 28 61 70 41 72 67 5b 30 5d  lue_dup(apArg[0]
3850: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 56  );.    if( p->pV
3860: 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  al==0 ){.      s
3870: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
3880: 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29 3b  ror_nomem(pCtx);
3890: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
38a0: 20 20 70 2d 3e 6e 56 61 6c 2b 2b 3b 0a 20 20 20    p->nVal++;.   
38b0: 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20   }.  }.}.static 
38c0: 76 6f 69 64 20 6c 61 73 74 5f 76 61 6c 75 65 49  void last_valueI
38d0: 6e 76 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  nvFunc(.  sqlite
38e0: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
38f0: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
3900: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
3910: 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63  apArg.){.  struc
3920: 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 20 2a  t LastValueCtx *
3930: 70 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  p;.  UNUSED_PARA
3940: 4d 45 54 45 52 28 6e 41 72 67 29 3b 0a 20 20 55  METER(nArg);.  U
3950: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
3960: 61 70 41 72 67 29 3b 0a 20 20 70 20 3d 20 28 73  apArg);.  p = (s
3970: 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75 65 43  truct LastValueC
3980: 74 78 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72  tx*)sqlite3_aggr
3990: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43  egate_context(pC
39a0: 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b  tx, sizeof(*p));
39b0: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 29  .  if( ALWAYS(p)
39c0: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 6c 2d   ){.    p->nVal-
39d0: 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 56  -;.    if( p->nV
39e0: 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  al==0 ){.      s
39f0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 66 72 65  qlite3_value_fre
3a00: 65 28 70 2d 3e 70 56 61 6c 29 3b 0a 20 20 20 20  e(p->pVal);.    
3a10: 20 20 70 2d 3e 70 56 61 6c 20 3d 20 30 3b 0a 20    p->pVal = 0;. 
3a20: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69     }.  }.}.stati
3a30: 63 20 76 6f 69 64 20 6c 61 73 74 5f 76 61 6c 75  c void last_valu
3a40: 65 56 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74  eValueFunc(sqlit
3a50: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
3a60: 29 7b 0a 20 20 73 74 72 75 63 74 20 4c 61 73 74  ){.  struct Last
3a70: 56 61 6c 75 65 43 74 78 20 2a 70 3b 0a 20 20 70  ValueCtx *p;.  p
3a80: 20 3d 20 28 73 74 72 75 63 74 20 4c 61 73 74 56   = (struct LastV
3a90: 61 6c 75 65 43 74 78 2a 29 73 71 6c 69 74 65 33  alueCtx*)sqlite3
3aa0: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
3ab0: 78 74 28 70 43 74 78 2c 20 30 29 3b 0a 20 20 69  xt(pCtx, 0);.  i
3ac0: 66 28 20 70 20 26 26 20 70 2d 3e 70 56 61 6c 20  f( p && p->pVal 
3ad0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
3ae0: 65 73 75 6c 74 5f 76 61 6c 75 65 28 70 43 74 78  esult_value(pCtx
3af0: 2c 20 70 2d 3e 70 56 61 6c 29 3b 0a 20 20 7d 0a  , p->pVal);.  }.
3b00: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 61  }.static void la
3b10: 73 74 5f 76 61 6c 75 65 46 69 6e 61 6c 69 7a 65  st_valueFinalize
3b20: 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Func(sqlite3_con
3b30: 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20 20 73  text *pCtx){.  s
3b40: 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75 65 43  truct LastValueC
3b50: 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74  tx *p;.  p = (st
3b60: 72 75 63 74 20 4c 61 73 74 56 61 6c 75 65 43 74  ruct LastValueCt
3b70: 78 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65  x*)sqlite3_aggre
3b80: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74  gate_context(pCt
3b90: 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  x, sizeof(*p));.
3ba0: 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 70 56    if( p && p->pV
3bb0: 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  al ){.    sqlite
3bc0: 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 70  3_result_value(p
3bd0: 43 74 78 2c 20 70 2d 3e 70 56 61 6c 29 3b 0a 20  Ctx, p->pVal);. 
3be0: 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
3bf0: 5f 66 72 65 65 28 70 2d 3e 70 56 61 6c 29 3b 0a  _free(p->pVal);.
3c00: 20 20 20 20 70 2d 3e 70 56 61 6c 20 3d 20 30 3b      p->pVal = 0;
3c10: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74  .  }.}../*.** St
3c20: 61 74 69 63 20 6e 61 6d 65 73 20 66 6f 72 20 74  atic names for t
3c30: 68 65 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64  he built-in wind
3c40: 6f 77 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  ow function name
3c50: 73 2e 20 20 54 68 65 73 65 20 73 74 61 74 69 63  s.  These static
3c60: 0a 2a 2a 20 6e 61 6d 65 73 20 61 72 65 20 75 73  .** names are us
3c70: 65 64 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20  ed, rather than 
3c80: 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 73 2c  string literals,
3c90: 20 73 6f 20 74 68 61 74 20 46 75 6e 63 44 65 66   so that FuncDef
3ca0: 20 6f 62 6a 65 63 74 73 0a 2a 2a 20 63 61 6e 20   objects.** can 
3cb0: 62 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  be associated wi
3cc0: 74 68 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  th a particular 
3cd0: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
3ce0: 62 79 20 64 69 72 65 63 74 0a 2a 2a 20 63 6f 6d  by direct.** com
3cf0: 70 61 72 69 73 6f 6e 20 6f 66 20 74 68 65 20 7a  parison of the z
3d00: 4e 61 6d 65 20 70 6f 69 6e 74 65 72 2e 20 20 45  Name pointer.  E
3d10: 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
3d20: 20 20 20 20 69 66 28 20 70 46 75 6e 63 44 65 66      if( pFuncDef
3d30: 2d 3e 7a 4e 61 6d 65 3d 3d 72 6f 77 5f 76 61 6c  ->zName==row_val
3d40: 75 65 4e 61 6d 65 20 29 7b 20 2e 2e 2e 20 7d 0a  ueName ){ ... }.
3d50: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
3d60: 63 68 61 72 20 72 6f 77 5f 6e 75 6d 62 65 72 4e  char row_numberN
3d70: 61 6d 65 5b 5d 20 3d 20 20 20 22 72 6f 77 5f 6e  ame[] =   "row_n
3d80: 75 6d 62 65 72 22 3b 0a 73 74 61 74 69 63 20 63  umber";.static c
3d90: 6f 6e 73 74 20 63 68 61 72 20 64 65 6e 73 65 5f  onst char dense_
3da0: 72 61 6e 6b 4e 61 6d 65 5b 5d 20 3d 20 20 20 22  rankName[] =   "
3db0: 64 65 6e 73 65 5f 72 61 6e 6b 22 3b 0a 73 74 61  dense_rank";.sta
3dc0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 72  tic const char r
3dd0: 61 6e 6b 4e 61 6d 65 5b 5d 20 3d 20 20 20 20 20  ankName[] =     
3de0: 20 20 20 20 22 72 61 6e 6b 22 3b 0a 73 74 61 74      "rank";.stat
3df0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 70 65  ic const char pe
3e00: 72 63 65 6e 74 5f 72 61 6e 6b 4e 61 6d 65 5b 5d  rcent_rankName[]
3e10: 20 3d 20 22 70 65 72 63 65 6e 74 5f 72 61 6e 6b   = "percent_rank
3e20: 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  ";.static const 
3e30: 63 68 61 72 20 63 75 6d 65 5f 64 69 73 74 4e 61  char cume_distNa
3e40: 6d 65 5b 5d 20 3d 20 20 20 20 22 63 75 6d 65 5f  me[] =    "cume_
3e50: 64 69 73 74 22 3b 0a 73 74 61 74 69 63 20 63 6f  dist";.static co
3e60: 6e 73 74 20 63 68 61 72 20 6e 74 69 6c 65 4e 61  nst char ntileNa
3e70: 6d 65 5b 5d 20 3d 20 20 20 20 20 20 20 20 22 6e  me[] =        "n
3e80: 74 69 6c 65 22 3b 0a 73 74 61 74 69 63 20 63 6f  tile";.static co
3e90: 6e 73 74 20 63 68 61 72 20 6c 61 73 74 5f 76 61  nst char last_va
3ea0: 6c 75 65 4e 61 6d 65 5b 5d 20 3d 20 20 20 22 6c  lueName[] =   "l
3eb0: 61 73 74 5f 76 61 6c 75 65 22 3b 0a 73 74 61 74  ast_value";.stat
3ec0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6e 74  ic const char nt
3ed0: 68 5f 76 61 6c 75 65 4e 61 6d 65 5b 5d 20 3d 20  h_valueName[] = 
3ee0: 20 20 20 22 6e 74 68 5f 76 61 6c 75 65 22 3b 0a     "nth_value";.
3ef0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
3f00: 72 20 66 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d  r first_valueNam
3f10: 65 5b 5d 20 3d 20 20 22 66 69 72 73 74 5f 76 61  e[] =  "first_va
3f20: 6c 75 65 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e  lue";.static con
3f30: 73 74 20 63 68 61 72 20 6c 65 61 64 4e 61 6d 65  st char leadName
3f40: 5b 5d 20 3d 20 20 20 20 20 20 20 20 20 22 6c 65  [] =         "le
3f50: 61 64 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73  ad";.static cons
3f60: 74 20 63 68 61 72 20 6c 61 67 4e 61 6d 65 5b 5d  t char lagName[]
3f70: 20 3d 20 20 20 20 20 20 20 20 20 20 22 6c 61 67   =          "lag
3f80: 22 3b 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20  ";../*.** No-op 
3f90: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
3fa0: 6f 66 20 78 53 74 65 70 28 29 20 61 6e 64 20 78  of xStep() and x
3fb0: 46 69 6e 61 6c 69 7a 65 28 29 2e 20 20 55 73 65  Finalize().  Use
3fc0: 64 20 61 73 20 70 6c 61 63 65 2d 68 6f 6c 64 65  d as place-holde
3fd0: 72 73 0a 2a 2a 20 66 6f 72 20 62 75 69 6c 74 2d  rs.** for built-
3fe0: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
3ff0: 6f 6e 73 20 74 68 61 74 20 6e 65 76 65 72 20 63  ons that never c
4000: 61 6c 6c 20 74 68 6f 73 65 20 69 6e 74 65 72 66  all those interf
4010: 61 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  aces..**.** The 
4020: 6e 6f 6f 70 56 61 6c 75 65 46 75 6e 63 28 29 20  noopValueFunc() 
4030: 69 73 20 63 61 6c 6c 65 64 20 62 75 74 20 69 73  is called but is
4040: 20 65 78 70 65 63 74 65 64 20 74 6f 20 64 6f 20   expected to do 
4050: 6e 6f 74 68 69 6e 67 2e 20 20 54 68 65 0a 2a 2a  nothing.  The.**
4060: 20 6e 6f 6f 70 53 74 65 70 46 75 6e 63 28 29 20   noopStepFunc() 
4070: 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2c  is never called,
4080: 20 61 6e 64 20 73 6f 20 69 74 20 69 73 20 6d 61   and so it is ma
4090: 72 6b 65 64 20 77 69 74 68 20 4e 4f 5f 54 45 53  rked with NO_TES
40a0: 54 20 74 6f 0a 2a 2a 20 6c 65 74 20 74 68 65 20  T to.** let the 
40b0: 74 65 73 74 20 63 6f 76 65 72 61 67 65 20 72 6f  test coverage ro
40c0: 75 74 69 6e 65 20 6b 6e 6f 77 20 6e 6f 74 20 74  utine know not t
40d0: 6f 20 65 78 70 65 63 74 20 74 68 69 73 20 66 75  o expect this fu
40e0: 6e 63 74 69 6f 6e 20 74 6f 20 62 65 0a 2a 2a 20  nction to be.** 
40f0: 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74  invoked..*/.stat
4100: 69 63 20 76 6f 69 64 20 6e 6f 6f 70 53 74 65 70  ic void noopStep
4110: 46 75 6e 63 28 20 20 20 20 2f 2a 4e 4f 5f 54 45  Func(    /*NO_TE
4120: 53 54 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 63  ST*/.  sqlite3_c
4130: 6f 6e 74 65 78 74 20 2a 70 2c 20 20 20 20 20 20  ontext *p,      
4140: 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20    /*NO_TEST*/.  
4150: 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20  int n,          
4160: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f             /*NO_
4170: 54 45 53 54 2a 2f 0a 20 20 73 71 6c 69 74 65 33  TEST*/.  sqlite3
4180: 5f 76 61 6c 75 65 20 2a 2a 61 20 20 20 20 20 20  _value **a      
4190: 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a      /*NO_TEST*/.
41a0: 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ){              
41b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4e               /*N
41c0: 4f 5f 54 45 53 54 2a 2f 0a 20 20 55 4e 55 53 45  O_TEST*/.  UNUSE
41d0: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 20  D_PARAMETER(p); 
41e0: 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a        /*NO_TEST*
41f0: 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  /.  UNUSED_PARAM
4200: 45 54 45 52 28 6e 29 3b 20 20 20 20 20 20 20 2f  ETER(n);       /
4210: 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 55 4e 55  *NO_TEST*/.  UNU
4220: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 29  SED_PARAMETER(a)
4230: 3b 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53  ;       /*NO_TES
4240: 54 2a 2f 0a 20 20 61 73 73 65 72 74 28 30 29 3b  T*/.  assert(0);
4250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4260: 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 7d 20 20   /*NO_TEST*/.}  
4270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4280: 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54            /*NO_T
4290: 45 53 54 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  EST*/.static voi
42a0: 64 20 6e 6f 6f 70 56 61 6c 75 65 46 75 6e 63 28  d noopValueFunc(
42b0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
42c0: 2a 70 29 7b 20 55 4e 55 53 45 44 5f 50 41 52 41  *p){ UNUSED_PARA
42d0: 4d 45 54 45 52 28 70 29 3b 20 2f 2a 6e 6f 2d 6f  METER(p); /*no-o
42e0: 70 2a 2f 20 7d 0a 0a 2f 2a 20 57 69 6e 64 6f 77  p*/ }../* Window
42f0: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
4300: 75 73 65 20 61 6c 6c 20 77 69 6e 64 6f 77 20 69  use all window i
4310: 6e 74 65 72 66 61 63 65 73 3a 20 78 53 74 65 70  nterfaces: xStep
4320: 2c 20 78 46 69 6e 61 6c 2c 0a 2a 2a 20 78 56 61  , xFinal,.** xVa
4330: 6c 75 65 2c 20 61 6e 64 20 78 49 6e 76 65 72 73  lue, and xInvers
4340: 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e  e */.#define WIN
4350: 44 4f 57 46 55 4e 43 41 4c 4c 28 6e 61 6d 65 2c  DOWFUNCALL(name,
4360: 6e 41 72 67 2c 65 78 74 72 61 29 20 7b 20 20 20  nArg,extra) {   
4370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4390: 5c 0a 20 20 6e 41 72 67 2c 20 28 53 51 4c 49 54  \.  nArg, (SQLIT
43a0: 45 5f 55 54 46 38 7c 53 51 4c 49 54 45 5f 46 55  E_UTF8|SQLITE_FU
43b0: 4e 43 5f 57 49 4e 44 4f 57 7c 65 78 74 72 61 29  NC_WINDOW|extra)
43c0: 2c 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 20  , 0, 0,         
43d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
43e0: 20 6e 61 6d 65 20 23 23 20 53 74 65 70 46 75 6e   name ## StepFun
43f0: 63 2c 20 6e 61 6d 65 20 23 23 20 46 69 6e 61 6c  c, name ## Final
4400: 69 7a 65 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23  izeFunc, name ##
4410: 20 56 61 6c 75 65 46 75 6e 63 2c 20 20 20 20 20   ValueFunc,     
4420: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6e 61            \.  na
4430: 6d 65 20 23 23 20 49 6e 76 46 75 6e 63 2c 20 6e  me ## InvFunc, n
4440: 61 6d 65 20 23 23 20 4e 61 6d 65 2c 20 7b 30 7d  ame ## Name, {0}
4450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4470: 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 20 57         \.}../* W
4480: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
4490: 74 68 61 74 20 61 72 65 20 69 6d 70 6c 65 6d 65  that are impleme
44a0: 6e 74 65 64 20 75 73 69 6e 67 20 62 79 74 65 63  nted using bytec
44b0: 6f 64 65 20 61 6e 64 20 74 68 75 73 20 68 61 76  ode and thus hav
44c0: 65 0a 2a 2a 20 6e 6f 2d 6f 70 20 72 6f 75 74 69  e.** no-op routi
44d0: 6e 65 73 20 66 6f 72 20 74 68 65 69 72 20 6d 65  nes for their me
44e0: 74 68 6f 64 73 20 2a 2f 0a 23 64 65 66 69 6e 65  thods */.#define
44f0: 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f 4f 50 28   WINDOWFUNCNOOP(
4500: 6e 61 6d 65 2c 6e 41 72 67 2c 65 78 74 72 61 29  name,nArg,extra)
4510: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
4520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4530: 20 20 20 20 5c 0a 20 20 6e 41 72 67 2c 20 28 53      \.  nArg, (S
4540: 51 4c 49 54 45 5f 55 54 46 38 7c 53 51 4c 49 54  QLITE_UTF8|SQLIT
4550: 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 7c 65 78  E_FUNC_WINDOW|ex
4560: 74 72 61 29 2c 20 30 2c 20 30 2c 20 20 20 20 20  tra), 0, 0,     
4570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4580: 20 5c 0a 20 20 6e 6f 6f 70 53 74 65 70 46 75 6e   \.  noopStepFun
4590: 63 2c 20 6e 6f 6f 70 56 61 6c 75 65 46 75 6e 63  c, noopValueFunc
45a0: 2c 20 6e 6f 6f 70 56 61 6c 75 65 46 75 6e 63 2c  , noopValueFunc,
45b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
45d0: 20 20 6e 6f 6f 70 53 74 65 70 46 75 6e 63 2c 20    noopStepFunc, 
45e0: 6e 61 6d 65 20 23 23 20 4e 61 6d 65 2c 20 7b 30  name ## Name, {0
45f0: 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }               
4600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4610: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a             \.}..
4620: 2f 2a 20 57 69 6e 64 6f 77 20 66 75 6e 63 74 69  /* Window functi
4630: 6f 6e 73 20 74 68 61 74 20 75 73 65 20 61 6c 6c  ons that use all
4640: 20 77 69 6e 64 6f 77 20 69 6e 74 65 72 66 61 63   window interfac
4650: 65 73 3a 20 78 53 74 65 70 2c 20 74 68 65 0a 2a  es: xStep, the.*
4660: 2a 20 73 61 6d 65 20 72 6f 75 74 69 6e 65 20 66  * same routine f
4670: 6f 72 20 78 46 69 6e 61 6c 69 7a 65 20 61 6e 64  or xFinalize and
4680: 20 78 56 61 6c 75 65 20 61 6e 64 20 77 68 69 63   xValue and whic
4690: 68 20 6e 65 76 65 72 20 63 61 6c 6c 0a 2a 2a 20  h never call.** 
46a0: 78 49 6e 76 65 72 73 65 2e 20 2a 2f 0a 23 64 65  xInverse. */.#de
46b0: 66 69 6e 65 20 57 49 4e 44 4f 57 46 55 4e 43 58  fine WINDOWFUNCX
46c0: 28 6e 61 6d 65 2c 6e 41 72 67 2c 65 78 74 72 61  (name,nArg,extra
46d0: 29 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  ) {             
46e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46f0: 20 20 20 20 20 20 20 20 5c 0a 20 20 6e 41 72 67          \.  nArg
4700: 2c 20 28 53 51 4c 49 54 45 5f 55 54 46 38 7c 53  , (SQLITE_UTF8|S
4710: 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f  QLITE_FUNC_WINDO
4720: 57 7c 65 78 74 72 61 29 2c 20 30 2c 20 30 2c 20  W|extra), 0, 0, 
4730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4740: 20 20 20 20 20 5c 0a 20 20 6e 61 6d 65 20 23 23       \.  name ##
4750: 20 53 74 65 70 46 75 6e 63 2c 20 6e 61 6d 65 20   StepFunc, name 
4760: 23 23 20 56 61 6c 75 65 46 75 6e 63 2c 20 6e 61  ## ValueFunc, na
4770: 6d 65 20 23 23 20 56 61 6c 75 65 46 75 6e 63 2c  me ## ValueFunc,
4780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4790: 20 20 5c 0a 20 20 6e 6f 6f 70 53 74 65 70 46 75    \.  noopStepFu
47a0: 6e 63 2c 20 6e 61 6d 65 20 23 23 20 4e 61 6d 65  nc, name ## Name
47b0: 2c 20 7b 30 7d 20 20 20 20 20 20 20 20 20 20 20  , {0}           
47c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
47e0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  .}.../*.** Regis
47f0: 74 65 72 20 74 68 6f 73 65 20 62 75 69 6c 74 2d  ter those built-
4800: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
4810: 6f 6e 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74  ons that are not
4820: 20 61 6c 73 6f 20 61 67 67 72 65 67 61 74 65 73   also aggregates
4830: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4840: 33 57 69 6e 64 6f 77 46 75 6e 63 74 69 6f 6e 73  3WindowFunctions
4850: 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
4860: 20 46 75 6e 63 44 65 66 20 61 57 69 6e 64 6f 77   FuncDef aWindow
4870: 46 75 6e 63 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  Funcs[] = {.    
4880: 57 49 4e 44 4f 57 46 55 4e 43 58 28 72 6f 77 5f  WINDOWFUNCX(row_
4890: 6e 75 6d 62 65 72 2c 20 30 2c 20 30 29 2c 0a 20  number, 0, 0),. 
48a0: 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 58 28 64     WINDOWFUNCX(d
48b0: 65 6e 73 65 5f 72 61 6e 6b 2c 20 30 2c 20 30 29  ense_rank, 0, 0)
48c0: 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43  ,.    WINDOWFUNC
48d0: 58 28 72 61 6e 6b 2c 20 30 2c 20 30 29 2c 0a 20  X(rank, 0, 0),. 
48e0: 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 41 4c 4c     WINDOWFUNCALL
48f0: 28 70 65 72 63 65 6e 74 5f 72 61 6e 6b 2c 20 30  (percent_rank, 0
4900: 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57  , 0),.    WINDOW
4910: 46 55 4e 43 41 4c 4c 28 63 75 6d 65 5f 64 69 73  FUNCALL(cume_dis
4920: 74 2c 20 30 2c 20 30 29 2c 0a 20 20 20 20 57 49  t, 0, 0),.    WI
4930: 4e 44 4f 57 46 55 4e 43 41 4c 4c 28 6e 74 69 6c  NDOWFUNCALL(ntil
4940: 65 2c 20 31 2c 20 30 29 2c 0a 20 20 20 20 57 49  e, 1, 0),.    WI
4950: 4e 44 4f 57 46 55 4e 43 41 4c 4c 28 6c 61 73 74  NDOWFUNCALL(last
4960: 5f 76 61 6c 75 65 2c 20 31 2c 20 30 29 2c 0a 20  _value, 1, 0),. 
4970: 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 41 4c 4c     WINDOWFUNCALL
4980: 28 6e 74 68 5f 76 61 6c 75 65 2c 20 32 2c 20 30  (nth_value, 2, 0
4990: 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e  ),.    WINDOWFUN
49a0: 43 41 4c 4c 28 66 69 72 73 74 5f 76 61 6c 75 65  CALL(first_value
49b0: 2c 20 31 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e  , 1, 0),.    WIN
49c0: 44 4f 57 46 55 4e 43 4e 4f 4f 50 28 6c 65 61 64  DOWFUNCNOOP(lead
49d0: 2c 20 31 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e  , 1, 0),.    WIN
49e0: 44 4f 57 46 55 4e 43 4e 4f 4f 50 28 6c 65 61 64  DOWFUNCNOOP(lead
49f0: 2c 20 32 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e  , 2, 0),.    WIN
4a00: 44 4f 57 46 55 4e 43 4e 4f 4f 50 28 6c 65 61 64  DOWFUNCNOOP(lead
4a10: 2c 20 33 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e  , 3, 0),.    WIN
4a20: 44 4f 57 46 55 4e 43 4e 4f 4f 50 28 6c 61 67 2c  DOWFUNCNOOP(lag,
4a30: 20 31 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44   1, 0),.    WIND
4a40: 4f 57 46 55 4e 43 4e 4f 4f 50 28 6c 61 67 2c 20  OWFUNCNOOP(lag, 
4a50: 32 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f  2, 0),.    WINDO
4a60: 57 46 55 4e 43 4e 4f 4f 50 28 6c 61 67 2c 20 33  WFUNCNOOP(lag, 3
4a70: 2c 20 30 29 2c 0a 20 20 7d 3b 0a 20 20 73 71 6c  , 0),.  };.  sql
4a80: 69 74 65 33 49 6e 73 65 72 74 42 75 69 6c 74 69  ite3InsertBuilti
4a90: 6e 46 75 6e 63 73 28 61 57 69 6e 64 6f 77 46 75  nFuncs(aWindowFu
4aa0: 6e 63 73 2c 20 41 72 72 61 79 53 69 7a 65 28 61  ncs, ArraySize(a
4ab0: 57 69 6e 64 6f 77 46 75 6e 63 73 29 29 3b 0a 7d  WindowFuncs));.}
4ac0: 0a 0a 73 74 61 74 69 63 20 57 69 6e 64 6f 77 20  ..static Window 
4ad0: 2a 77 69 6e 64 6f 77 46 69 6e 64 28 50 61 72 73  *windowFind(Pars
4ae0: 65 20 2a 70 50 61 72 73 65 2c 20 57 69 6e 64 6f  e *pParse, Windo
4af0: 77 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20  w *pList, const 
4b00: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
4b10: 57 69 6e 64 6f 77 20 2a 70 3b 0a 20 20 66 6f 72  Window *p;.  for
4b20: 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70  (p=pList; p; p=p
4b30: 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20  ->pNextWin){.   
4b40: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
4b50: 43 6d 70 28 70 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e  Cmp(p->zName, zN
4b60: 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ame)==0 ) break;
4b70: 0a 20 20 7d 0a 20 20 69 66 28 20 70 3d 3d 30 20  .  }.  if( p==0 
4b80: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
4b90: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
4ba0: 6e 6f 20 73 75 63 68 20 77 69 6e 64 6f 77 3a 20  no such window: 
4bb0: 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d  %s", zName);.  }
4bc0: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
4bd0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
4be0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 69 6d  ion is called im
4bf0: 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
4c00: 72 65 73 6f 6c 76 69 6e 67 20 74 68 65 20 66 75  resolving the fu
4c10: 6e 63 74 69 6f 6e 20 6e 61 6d 65 0a 2a 2a 20 66  nction name.** f
4c20: 6f 72 20 61 20 77 69 6e 64 6f 77 20 66 75 6e 63  or a window func
4c30: 74 69 6f 6e 20 77 69 74 68 69 6e 20 61 20 53 45  tion within a SE
4c40: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
4c50: 41 72 67 75 6d 65 6e 74 20 70 4c 69 73 74 20 69  Argument pList i
4c60: 73 20 61 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69  s a.** linked li
4c70: 73 74 20 6f 66 20 57 49 4e 44 4f 57 20 64 65 66  st of WINDOW def
4c80: 69 6e 69 74 69 6f 6e 73 20 66 6f 72 20 74 68 65  initions for the
4c90: 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
4ca0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 41 72  statement..** Ar
4cb0: 67 75 6d 65 6e 74 20 70 46 75 6e 63 20 69 73 20  gument pFunc is 
4cc0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 65 66  the function def
4cd0: 69 6e 69 74 69 6f 6e 20 6a 75 73 74 20 72 65 73  inition just res
4ce0: 6f 6c 76 65 64 20 61 6e 64 20 70 57 69 6e 0a 2a  olved and pWin.*
4cf0: 2a 20 69 73 20 74 68 65 20 57 69 6e 64 6f 77 20  * is the Window 
4d00: 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74  object represent
4d10: 69 6e 67 20 74 68 65 20 61 73 73 6f 63 69 61 74  ing the associat
4d20: 65 64 20 4f 56 45 52 20 63 6c 61 75 73 65 2e 20  ed OVER clause. 
4d30: 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
4d40: 20 75 70 64 61 74 65 73 20 74 68 65 20 63 6f 6e   updates the con
4d50: 74 65 6e 74 73 20 6f 66 20 70 57 69 6e 20 61 73  tents of pWin as
4d60: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
4d70: 20 20 2a 20 49 66 20 74 68 65 20 4f 56 45 52 20    * If the OVER 
4d80: 63 6c 61 75 73 65 20 72 65 66 65 72 65 64 20 74  clause refered t
4d90: 6f 20 61 20 6e 61 6d 65 64 20 77 69 6e 64 6f 77  o a named window
4da0: 20 28 61 73 20 69 6e 20 22 6d 61 78 28 78 29 20   (as in "max(x) 
4db0: 4f 56 45 52 20 77 69 6e 22 29 2c 0a 2a 2a 20 20  OVER win"),.**  
4dc0: 20 20 20 73 65 61 72 63 68 20 6c 69 73 74 20 70     search list p
4dd0: 4c 69 73 74 20 66 6f 72 20 61 20 6d 61 74 63 68  List for a match
4de0: 69 6e 67 20 57 49 4e 44 4f 57 20 64 65 66 69 6e  ing WINDOW defin
4df0: 69 74 69 6f 6e 2c 20 61 6e 64 20 75 70 64 61 74  ition, and updat
4e00: 65 20 70 57 69 6e 0a 2a 2a 20 20 20 20 20 61 63  e pWin.**     ac
4e10: 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20 6e 6f  cordingly. If no
4e20: 20 73 75 63 68 20 57 49 4e 44 4f 57 20 63 6c 61   such WINDOW cla
4e30: 75 73 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  use can be found
4e40: 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
4e50: 0a 2a 2a 20 20 20 20 20 69 6e 20 70 50 61 72 73  .**     in pPars
4e60: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20  e..**.**   * If 
4e70: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  the function is 
4e80: 61 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  a built-in windo
4e90: 77 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  w function that 
4ea0: 72 65 71 75 69 72 65 73 20 74 68 65 0a 2a 2a 20  requires the.** 
4eb0: 20 20 20 20 77 69 6e 64 6f 77 20 74 6f 20 62 65      window to be
4ec0: 20 63 6f 65 72 63 65 64 20 28 73 65 65 20 22 42   coerced (see "B
4ed0: 55 49 4c 54 2d 49 4e 20 57 49 4e 44 4f 57 20 46  UILT-IN WINDOW F
4ee0: 55 4e 43 54 49 4f 4e 53 22 20 61 74 20 74 68 65  UNCTIONS" at the
4ef0: 20 74 6f 70 0a 2a 2a 20 20 20 20 20 6f 66 20 74   top.**     of t
4f00: 68 69 73 20 66 69 6c 65 29 2c 20 70 57 69 6e 20  his file), pWin 
4f10: 69 73 20 75 70 64 61 74 65 64 20 68 65 72 65 2e  is updated here.
4f20: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4f30: 57 69 6e 64 6f 77 55 70 64 61 74 65 28 0a 20 20  WindowUpdate(.  
4f40: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a  Parse *pParse, .
4f50: 20 20 57 69 6e 64 6f 77 20 2a 70 4c 69 73 74 2c    Window *pList,
4f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f70: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6e 61 6d    /* List of nam
4f80: 65 64 20 77 69 6e 64 6f 77 73 20 66 6f 72 20 74  ed windows for t
4f90: 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  his SELECT */.  
4fa0: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 2c 20 20 20  Window *pWin,   
4fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fc0: 2f 2a 20 57 69 6e 64 6f 77 20 66 72 61 6d 65 20  /* Window frame 
4fd0: 74 6f 20 75 70 64 61 74 65 20 2a 2f 0a 20 20 46  to update */.  F
4fe0: 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20 20 20  uncDef *pFunc   
4ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5000: 2a 20 57 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  * Window functio
5010: 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 2a 2f 0a  n definition */.
5020: 29 7b 0a 20 20 69 66 28 20 70 57 69 6e 2d 3e 7a  ){.  if( pWin->z
5030: 4e 61 6d 65 20 26 26 20 70 57 69 6e 2d 3e 65 54  Name && pWin->eT
5040: 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 57 69  ype==0 ){.    Wi
5050: 6e 64 6f 77 20 2a 70 20 3d 20 77 69 6e 64 6f 77  ndow *p = window
5060: 46 69 6e 64 28 70 50 61 72 73 65 2c 20 70 4c 69  Find(pParse, pLi
5070: 73 74 2c 20 70 57 69 6e 2d 3e 7a 4e 61 6d 65 29  st, pWin->zName)
5080: 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29  ;.    if( p==0 )
5090: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 57 69   return;.    pWi
50a0: 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 3d 20  n->pPartition = 
50b0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
50c0: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
50d0: 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20 30 29  ->pPartition, 0)
50e0: 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70 4f 72 64  ;.    pWin->pOrd
50f0: 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
5100: 70 72 4c 69 73 74 44 75 70 28 70 50 61 72 73 65  prListDup(pParse
5110: 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  ->db, p->pOrderB
5120: 79 2c 20 30 29 3b 0a 20 20 20 20 70 57 69 6e 2d  y, 0);.    pWin-
5130: 3e 70 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65  >pStart = sqlite
5140: 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d  3ExprDup(pParse-
5150: 3e 64 62 2c 20 70 2d 3e 70 53 74 61 72 74 2c 20  >db, p->pStart, 
5160: 30 29 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70 45  0);.    pWin->pE
5170: 6e 64 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  nd = sqlite3Expr
5180: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
5190: 70 2d 3e 70 45 6e 64 2c 20 30 29 3b 0a 20 20 20  p->pEnd, 0);.   
51a0: 20 70 57 69 6e 2d 3e 65 53 74 61 72 74 20 3d 20   pWin->eStart = 
51b0: 70 2d 3e 65 53 74 61 72 74 3b 0a 20 20 20 20 70  p->eStart;.    p
51c0: 57 69 6e 2d 3e 65 45 6e 64 20 3d 20 70 2d 3e 65  Win->eEnd = p->e
51d0: 45 6e 64 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 65  End;.    pWin->e
51e0: 54 79 70 65 20 3d 20 70 2d 3e 65 54 79 70 65 3b  Type = p->eType;
51f0: 0a 20 20 20 20 70 57 69 6e 2d 3e 65 45 78 63 6c  .    pWin->eExcl
5200: 75 64 65 20 3d 20 70 2d 3e 65 45 78 63 6c 75 64  ude = p->eExclud
5210: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
5220: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 68 61  sqlite3WindowCha
5230: 69 6e 28 70 50 61 72 73 65 2c 20 70 57 69 6e 2c  in(pParse, pWin,
5240: 20 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69   pList);.  }.  i
5250: 66 28 20 28 70 57 69 6e 2d 3e 65 54 79 70 65 3d  f( (pWin->eType=
5260: 3d 54 4b 5f 52 41 4e 47 45 29 0a 20 20 20 26 26  =TK_RANGE).   &&
5270: 20 28 70 57 69 6e 2d 3e 70 53 74 61 72 74 20 7c   (pWin->pStart |
5280: 7c 20 70 57 69 6e 2d 3e 70 45 6e 64 29 20 0a 20  | pWin->pEnd) . 
5290: 20 20 26 26 20 28 70 57 69 6e 2d 3e 70 4f 72 64    && (pWin->pOrd
52a0: 65 72 42 79 3d 3d 30 20 7c 7c 20 70 57 69 6e 2d  erBy==0 || pWin-
52b0: 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
52c0: 21 3d 31 29 0a 20 20 29 7b 0a 20 20 20 20 73 71  !=1).  ){.    sq
52d0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
52e0: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52 41  arse, .      "RA
52f0: 4e 47 45 20 77 69 74 68 20 6f 66 66 73 65 74 20  NGE with offset 
5300: 50 52 45 43 45 44 49 4e 47 2f 46 4f 4c 4c 4f 57  PRECEDING/FOLLOW
5310: 49 4e 47 20 72 65 71 75 69 72 65 73 20 6f 6e 65  ING requires one
5320: 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73   ORDER BY expres
5330: 73 69 6f 6e 22 0a 20 20 20 20 29 3b 0a 20 20 7d  sion".    );.  }
5340: 65 6c 73 65 0a 20 20 69 66 28 20 70 46 75 6e 63  else.  if( pFunc
5350: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
5360: 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57  LITE_FUNC_WINDOW
5370: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20   ){.    sqlite3 
5380: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
5390: 3b 0a 20 20 20 20 69 66 28 20 70 57 69 6e 2d 3e  ;.    if( pWin->
53a0: 70 46 69 6c 74 65 72 20 29 7b 0a 20 20 20 20 20  pFilter ){.     
53b0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
53c0: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
53d0: 20 20 20 20 22 46 49 4c 54 45 52 20 63 6c 61 75      "FILTER clau
53e0: 73 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75  se may only be u
53f0: 73 65 64 20 77 69 74 68 20 61 67 67 72 65 67 61  sed with aggrega
5400: 74 65 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  te window functi
5410: 6f 6e 73 22 0a 20 20 20 20 20 20 29 3b 0a 20 20  ons".      );.  
5420: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
5430: 74 72 75 63 74 20 57 69 6e 64 6f 77 55 70 64 61  truct WindowUpda
5440: 74 65 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  te {.        con
5450: 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 3b 0a  st char *zFunc;.
5460: 20 20 20 20 20 20 20 20 69 6e 74 20 65 54 79 70          int eTyp
5470: 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65  e;.        int e
5480: 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 69  Start;.        i
5490: 6e 74 20 65 45 6e 64 3b 0a 20 20 20 20 20 20 7d  nt eEnd;.      }
54a0: 20 61 55 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20   aUp[] = {.     
54b0: 20 20 20 7b 20 72 6f 77 5f 6e 75 6d 62 65 72 4e     { row_numberN
54c0: 61 6d 65 2c 20 20 20 54 4b 5f 52 4f 57 53 2c 20  ame,   TK_ROWS, 
54d0: 20 20 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 2c 20    TK_UNBOUNDED, 
54e0: 54 4b 5f 43 55 52 52 45 4e 54 20 7d 2c 20 0a 20  TK_CURRENT }, . 
54f0: 20 20 20 20 20 20 20 7b 20 64 65 6e 73 65 5f 72         { dense_r
5500: 61 6e 6b 4e 61 6d 65 2c 20 20 20 54 4b 5f 52 41  ankName,   TK_RA
5510: 4e 47 45 2c 20 20 54 4b 5f 55 4e 42 4f 55 4e 44  NGE,  TK_UNBOUND
5520: 45 44 2c 20 54 4b 5f 43 55 52 52 45 4e 54 20 7d  ED, TK_CURRENT }
5530: 2c 20 0a 20 20 20 20 20 20 20 20 7b 20 72 61 6e  , .        { ran
5540: 6b 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 54  kName,         T
5550: 4b 5f 52 41 4e 47 45 2c 20 20 54 4b 5f 55 4e 42  K_RANGE,  TK_UNB
5560: 4f 55 4e 44 45 44 2c 20 54 4b 5f 43 55 52 52 45  OUNDED, TK_CURRE
5570: 4e 54 20 7d 2c 20 0a 20 20 20 20 20 20 20 20 7b  NT }, .        {
5580: 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b 4e 61 6d   percent_rankNam
5590: 65 2c 20 54 4b 5f 47 52 4f 55 50 53 2c 20 54 4b  e, TK_GROUPS, TK
55a0: 5f 43 55 52 52 45 4e 54 2c 20 20 20 54 4b 5f 55  _CURRENT,   TK_U
55b0: 4e 42 4f 55 4e 44 45 44 20 7d 2c 20 0a 20 20 20  NBOUNDED }, .   
55c0: 20 20 20 20 20 7b 20 63 75 6d 65 5f 64 69 73 74       { cume_dist
55d0: 4e 61 6d 65 2c 20 20 20 20 54 4b 5f 47 52 4f 55  Name,    TK_GROU
55e0: 50 53 2c 20 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  PS, TK_FOLLOWING
55f0: 2c 20 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 7d  , TK_UNBOUNDED }
5600: 2c 20 0a 20 20 20 20 20 20 20 20 7b 20 6e 74 69  , .        { nti
5610: 6c 65 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 54  leName,        T
5620: 4b 5f 52 4f 57 53 2c 20 20 20 54 4b 5f 43 55 52  K_ROWS,   TK_CUR
5630: 52 45 4e 54 2c 20 20 20 54 4b 5f 55 4e 42 4f 55  RENT,   TK_UNBOU
5640: 4e 44 45 44 20 7d 2c 20 0a 20 20 20 20 20 20 20  NDED }, .       
5650: 20 7b 20 6c 65 61 64 4e 61 6d 65 2c 20 20 20 20   { leadName,    
5660: 20 20 20 20 20 54 4b 5f 52 4f 57 53 2c 20 20 20       TK_ROWS,   
5670: 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 2c 20 54 4b  TK_UNBOUNDED, TK
5680: 5f 55 4e 42 4f 55 4e 44 45 44 20 7d 2c 20 0a 20  _UNBOUNDED }, . 
5690: 20 20 20 20 20 20 20 7b 20 6c 61 67 4e 61 6d 65         { lagName
56a0: 2c 20 20 20 20 20 20 20 20 20 20 54 4b 5f 52 4f  ,          TK_RO
56b0: 57 53 2c 20 20 20 54 4b 5f 55 4e 42 4f 55 4e 44  WS,   TK_UNBOUND
56c0: 45 44 2c 20 54 4b 5f 43 55 52 52 45 4e 54 20 7d  ED, TK_CURRENT }
56d0: 2c 20 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  , .      };.    
56e0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
56f0: 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
5700: 69 7a 65 28 61 55 70 29 3b 20 69 2b 2b 29 7b 0a  ize(aUp); i++){.
5710: 20 20 20 20 20 20 20 20 69 66 28 20 70 46 75 6e          if( pFun
5720: 63 2d 3e 7a 4e 61 6d 65 3d 3d 61 55 70 5b 69 5d  c->zName==aUp[i]
5730: 2e 7a 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20  .zFunc ){.      
5740: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
5750: 65 6c 65 74 65 28 64 62 2c 20 70 57 69 6e 2d 3e  elete(db, pWin->
5760: 70 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20  pStart);.       
5770: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
5780: 6c 65 74 65 28 64 62 2c 20 70 57 69 6e 2d 3e 70  lete(db, pWin->p
5790: 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  End);.          
57a0: 70 57 69 6e 2d 3e 70 45 6e 64 20 3d 20 70 57 69  pWin->pEnd = pWi
57b0: 6e 2d 3e 70 53 74 61 72 74 20 3d 20 30 3b 0a 20  n->pStart = 0;. 
57c0: 20 20 20 20 20 20 20 20 20 70 57 69 6e 2d 3e 65           pWin->e
57d0: 54 79 70 65 20 3d 20 61 55 70 5b 69 5d 2e 65 54  Type = aUp[i].eT
57e0: 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ype;.          p
57f0: 57 69 6e 2d 3e 65 53 74 61 72 74 20 3d 20 61 55  Win->eStart = aU
5800: 70 5b 69 5d 2e 65 53 74 61 72 74 3b 0a 20 20 20  p[i].eStart;.   
5810: 20 20 20 20 20 20 20 70 57 69 6e 2d 3e 65 45 6e         pWin->eEn
5820: 64 20 3d 20 61 55 70 5b 69 5d 2e 65 45 6e 64 3b  d = aUp[i].eEnd;
5830: 0a 20 20 20 20 20 20 20 20 20 20 70 57 69 6e 2d  .          pWin-
5840: 3e 65 45 78 63 6c 75 64 65 20 3d 20 30 3b 0a 20  >eExclude = 0;. 
5850: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 57 69           if( pWi
5860: 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f  n->eStart==TK_FO
5870: 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 20  LLOWING ){.     
5880: 20 20 20 20 20 20 20 70 57 69 6e 2d 3e 70 53 74         pWin->pSt
5890: 61 72 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  art = sqlite3Exp
58a0: 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52  r(db, TK_INTEGER
58b0: 2c 20 22 31 22 29 3b 0a 20 20 20 20 20 20 20 20  , "1");.        
58c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72    }.          br
58d0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
58e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
58f0: 0a 20 20 70 57 69 6e 2d 3e 70 46 75 6e 63 20 3d  .  pWin->pFunc =
5900: 20 70 46 75 6e 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pFunc;.}../*.**
5910: 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20   Context object 
5920: 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 73  passed through s
5930: 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69  qlite3WalkExprLi
5940: 73 74 28 29 20 74 6f 0a 2a 2a 20 73 65 6c 65 63  st() to.** selec
5950: 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65 45 78  tWindowRewriteEx
5960: 70 72 43 62 28 29 20 62 79 20 73 65 6c 65 63 74  prCb() by select
5970: 57 69 6e 64 6f 77 52 65 77 72 69 74 65 45 4c 69  WindowRewriteELi
5980: 73 74 28 29 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  st()..*/.typedef
5990: 20 73 74 72 75 63 74 20 57 69 6e 64 6f 77 52 65   struct WindowRe
59a0: 77 72 69 74 65 20 57 69 6e 64 6f 77 52 65 77 72  write WindowRewr
59b0: 69 74 65 3b 0a 73 74 72 75 63 74 20 57 69 6e 64  ite;.struct Wind
59c0: 6f 77 52 65 77 72 69 74 65 20 7b 0a 20 20 57 69  owRewrite {.  Wi
59d0: 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 53 72  ndow *pWin;.  Sr
59e0: 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 45  cList *pSrc;.  E
59f0: 78 70 72 4c 69 73 74 20 2a 70 53 75 62 3b 0a 20  xprList *pSub;. 
5a00: 20 53 65 6c 65 63 74 20 2a 70 53 75 62 53 65 6c   Select *pSubSel
5a10: 65 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ect;            
5a20: 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 75 62 2d   /* Current sub-
5a30: 73 65 6c 65 63 74 2c 20 69 66 20 61 6e 79 20 2a  select, if any *
5a40: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  /.};../*.** Call
5a50: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 75 73  back function us
5a60: 65 64 20 62 79 20 73 65 6c 65 63 74 57 69 6e 64  ed by selectWind
5a70: 6f 77 52 65 77 72 69 74 65 45 4c 69 73 74 28 29  owRewriteEList()
5a80: 2e 20 49 66 20 6e 65 63 65 73 73 61 72 79 2c 0a  . If necessary,.
5a90: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
5aa0: 20 61 70 70 65 6e 64 73 20 74 6f 20 74 68 65 20   appends to the 
5ab0: 6f 75 74 70 75 74 20 65 78 70 72 65 73 73 69 6f  output expressio
5ac0: 6e 2d 6c 69 73 74 20 61 6e 64 20 75 70 64 61 74  n-list and updat
5ad0: 65 73 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  es .** expressio
5ae0: 6e 20 28 2a 70 70 45 78 70 72 29 20 69 6e 20 70  n (*ppExpr) in p
5af0: 6c 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lace..*/.static 
5b00: 69 6e 74 20 73 65 6c 65 63 74 57 69 6e 64 6f 77  int selectWindow
5b10: 52 65 77 72 69 74 65 45 78 70 72 43 62 28 57 61  RewriteExprCb(Wa
5b20: 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
5b30: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 73  xpr *pExpr){.  s
5b40: 74 72 75 63 74 20 57 69 6e 64 6f 77 52 65 77 72  truct WindowRewr
5b50: 69 74 65 20 2a 70 20 3d 20 70 57 61 6c 6b 65 72  ite *p = pWalker
5b60: 2d 3e 75 2e 70 52 65 77 72 69 74 65 3b 0a 20 20  ->u.pRewrite;.  
5b70: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
5b80: 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
5b90: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 66  ..  /* If this f
5ba0: 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  unction is being
5bb0: 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74   called from wit
5bc0: 68 69 6e 20 61 20 73 63 61 6c 61 72 20 73 75 62  hin a scalar sub
5bd0: 2d 73 65 6c 65 63 74 0a 20 20 2a 2a 20 74 68 61  -select.  ** tha
5be0: 74 20 75 73 65 64 20 62 79 20 74 68 65 20 53 45  t used by the SE
5bf0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62  LECT statement b
5c00: 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2c 20  eing processed, 
5c10: 6f 6e 6c 79 20 70 72 6f 63 65 73 73 0a 20 20 2a  only process.  *
5c20: 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 20 65 78 70 72  * TK_COLUMN expr
5c30: 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72 65 66  essions that ref
5c40: 65 72 20 74 6f 20 69 74 20 28 74 68 65 20 6f 75  er to it (the ou
5c50: 74 65 72 20 53 45 4c 45 43 54 29 2e 20 44 6f 0a  ter SELECT). Do.
5c60: 20 20 2a 2a 20 6e 6f 74 20 70 72 6f 63 65 73 73    ** not process
5c70: 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 77   aggregates or w
5c80: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
5c90: 61 74 20 61 6c 6c 2c 20 61 73 20 74 68 65 79 20  at all, as they 
5ca0: 62 65 6c 6f 6e 67 0a 20 20 2a 2a 20 74 6f 20 74  belong.  ** to t
5cb0: 68 65 20 73 63 61 6c 61 72 20 73 75 62 2d 73 65  he scalar sub-se
5cc0: 6c 65 63 74 2e 20 20 2a 2f 0a 20 20 69 66 28 20  lect.  */.  if( 
5cd0: 70 2d 3e 70 53 75 62 53 65 6c 65 63 74 20 29 7b  p->pSubSelect ){
5ce0: 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
5cf0: 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op!=TK_COLUMN ){
5d00: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
5d10: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  C_Continue;.    
5d20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
5d30: 20 6e 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 2d   nSrc = p->pSrc-
5d40: 3e 6e 53 72 63 3b 0a 20 20 20 20 20 20 69 6e 74  >nSrc;.      int
5d50: 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
5d60: 30 3b 20 69 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b  0; i<nSrc; i++){
5d70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78  .        if( pEx
5d80: 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 2d 3e 70  pr->iTable==p->p
5d90: 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  Src->a[i].iCurso
5da0: 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  r ) break;.     
5db0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d   }.      if( i==
5dc0: 6e 53 72 63 20 29 20 72 65 74 75 72 6e 20 57 52  nSrc ) return WR
5dd0: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  C_Continue;.    
5de0: 7d 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28  }.  }..  switch(
5df0: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 0a 20   pExpr->op ){.. 
5e00: 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
5e10: 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 21  ION:.      if( !
5e20: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
5e30: 70 45 78 70 72 2c 20 45 50 5f 57 69 6e 46 75 6e  pExpr, EP_WinFun
5e40: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  c) ){.        br
5e50: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eak;.      }else
5e60: 7b 0a 20 20 20 20 20 20 20 20 57 69 6e 64 6f 77  {.        Window
5e70: 20 2a 70 57 69 6e 3b 0a 20 20 20 20 20 20 20 20   *pWin;.        
5e80: 66 6f 72 28 70 57 69 6e 3d 70 2d 3e 70 57 69 6e  for(pWin=p->pWin
5e90: 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69  ; pWin; pWin=pWi
5ea0: 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20  n->pNextWin){.  
5eb0: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
5ec0: 72 2d 3e 79 2e 70 57 69 6e 3d 3d 70 57 69 6e 20  r->y.pWin==pWin 
5ed0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
5ee0: 73 73 65 72 74 28 20 70 57 69 6e 2d 3e 70 4f 77  ssert( pWin->pOw
5ef0: 6e 65 72 3d 3d 70 45 78 70 72 20 29 3b 0a 20 20  ner==pExpr );.  
5f00: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
5f10: 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
5f20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5f30: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
5f40: 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 2e  /* Fall through.
5f50: 20 20 2a 2f 0a 0a 20 20 20 20 63 61 73 65 20 54    */..    case T
5f60: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a  K_AGG_FUNCTION:.
5f70: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
5f80: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  MN: {.      Expr
5f90: 20 2a 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33   *pDup = sqlite3
5fa0: 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e  ExprDup(pParse->
5fb0: 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  db, pExpr, 0);. 
5fc0: 20 20 20 20 20 70 2d 3e 70 53 75 62 20 3d 20 73       p->pSub = s
5fd0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
5fe0: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 2d 3e  pend(pParse, p->
5ff0: 70 53 75 62 2c 20 70 44 75 70 29 3b 0a 20 20 20  pSub, pDup);.   
6000: 20 20 20 69 66 28 20 70 2d 3e 70 53 75 62 20 29     if( p->pSub )
6010: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
6020: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
6030: 79 28 70 45 78 70 72 2c 20 45 50 5f 53 74 61 74  y(pExpr, EP_Stat
6040: 69 63 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ic)==0 );.      
6050: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
6060: 79 28 70 45 78 70 72 2c 20 45 50 5f 53 74 61 74  y(pExpr, EP_Stat
6070: 69 63 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ic);.        sql
6080: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
6090: 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72  Parse->db, pExpr
60a0: 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 43  );.        ExprC
60b0: 6c 65 61 72 50 72 6f 70 65 72 74 79 28 70 45 78  learProperty(pEx
60c0: 70 72 2c 20 45 50 5f 53 74 61 74 69 63 29 3b 0a  pr, EP_Static);.
60d0: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
60e0: 45 78 70 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Expr, 0, sizeof(
60f0: 45 78 70 72 29 29 3b 0a 0a 20 20 20 20 20 20 20  Expr));..       
6100: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
6110: 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20  COLUMN;.        
6120: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
6130: 20 70 2d 3e 70 53 75 62 2d 3e 6e 45 78 70 72 2d   p->pSub->nExpr-
6140: 31 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  1;.        pExpr
6150: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 2d 3e 70 57  ->iTable = p->pW
6160: 69 6e 2d 3e 69 45 70 68 43 73 72 3b 0a 20 20 20  in->iEphCsr;.   
6170: 20 20 20 7d 0a 0a 20 20 20 20 20 20 62 72 65 61     }..      brea
6180: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 65  k;.    }..    de
6190: 66 61 75 6c 74 3a 20 2f 2a 20 6e 6f 2d 6f 70 20  fault: /* no-op 
61a0: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
61b0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 57 52    }..  return WR
61c0: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74  C_Continue;.}.st
61d0: 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 57  atic int selectW
61e0: 69 6e 64 6f 77 52 65 77 72 69 74 65 53 65 6c 65  indowRewriteSele
61f0: 63 74 43 62 28 57 61 6c 6b 65 72 20 2a 70 57 61  ctCb(Walker *pWa
6200: 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53  lker, Select *pS
6210: 65 6c 65 63 74 29 7b 0a 20 20 73 74 72 75 63 74  elect){.  struct
6220: 20 57 69 6e 64 6f 77 52 65 77 72 69 74 65 20 2a   WindowRewrite *
6230: 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  p = pWalker->u.p
6240: 52 65 77 72 69 74 65 3b 0a 20 20 53 65 6c 65 63  Rewrite;.  Selec
6250: 74 20 2a 70 53 61 76 65 20 3d 20 70 2d 3e 70 53  t *pSave = p->pS
6260: 75 62 53 65 6c 65 63 74 3b 0a 20 20 69 66 28 20  ubSelect;.  if( 
6270: 70 53 61 76 65 3d 3d 70 53 65 6c 65 63 74 20 29  pSave==pSelect )
6280: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
6290: 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 65 6c  _Continue;.  }el
62a0: 73 65 7b 0a 20 20 20 20 70 2d 3e 70 53 75 62 53  se{.    p->pSubS
62b0: 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 3b  elect = pSelect;
62c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  .    sqlite3Walk
62d0: 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
62e0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 70 2d  pSelect);.    p-
62f0: 3e 70 53 75 62 53 65 6c 65 63 74 20 3d 20 70 53  >pSubSelect = pS
6300: 61 76 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ave;.  }.  retur
6310: 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 7d 0a 0a  n WRC_Prune;.}..
6320: 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 65 20 74  ./*.** Iterate t
6330: 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72  hrough each expr
6340: 65 73 73 69 6f 6e 20 69 6e 20 65 78 70 72 65 73  ession in expres
6350: 73 69 6f 6e 2d 6c 69 73 74 20 70 45 4c 69 73 74  sion-list pEList
6360: 2e 20 46 6f 72 20 65 61 63 68 3a 0a 2a 2a 0a 2a  . For each:.**.*
6370: 2a 20 20 20 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 2c  *   * TK_COLUMN,
6380: 0a 2a 2a 20 20 20 2a 20 61 67 67 72 65 67 61 74  .**   * aggregat
6390: 65 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 72 0a 2a  e function, or.*
63a0: 2a 20 20 20 2a 20 77 69 6e 64 6f 77 20 66 75 6e  *   * window fun
63b0: 63 74 69 6f 6e 20 77 69 74 68 20 61 20 57 69 6e  ction with a Win
63c0: 64 6f 77 20 6f 62 6a 65 63 74 20 74 68 61 74 20  dow object that 
63d0: 69 73 20 6e 6f 74 20 61 20 6d 65 6d 62 65 72 20  is not a member 
63e0: 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 57  of the .**     W
63f0: 69 6e 64 6f 77 20 6c 69 73 74 20 70 61 73 73 65  indow list passe
6400: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
6410: 61 72 67 75 6d 65 6e 74 20 28 70 57 69 6e 29 2e  argument (pWin).
6420: 0a 2a 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74 68  .**.** Append th
6430: 65 20 6e 6f 64 65 20 74 6f 20 6f 75 74 70 75 74  e node to output
6440: 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74   expression-list
6450: 20 28 2a 70 70 53 75 62 29 2e 20 41 6e 64 20 72   (*ppSub). And r
6460: 65 70 6c 61 63 65 20 69 74 0a 2a 2a 20 77 69 74  eplace it.** wit
6470: 68 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 74 68  h a TK_COLUMN th
6480: 61 74 20 72 65 61 64 73 20 74 68 65 20 28 4e 2d  at reads the (N-
6490: 31 29 74 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20  1)th element of 
64a0: 74 61 62 6c 65 20 0a 2a 2a 20 70 57 69 6e 2d 3e  table .** pWin->
64b0: 69 45 70 68 43 73 72 2c 20 77 68 65 72 65 20 4e  iEphCsr, where N
64c0: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
64d0: 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 28 2a  f elements in (*
64e0: 70 70 53 75 62 29 20 61 66 74 65 72 0a 2a 2a 20  ppSub) after.** 
64f0: 61 70 70 65 6e 64 69 6e 67 20 74 68 65 20 6e 65  appending the ne
6500: 77 20 6f 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  w one..*/.static
6510: 20 76 6f 69 64 20 73 65 6c 65 63 74 57 69 6e 64   void selectWind
6520: 6f 77 52 65 77 72 69 74 65 45 4c 69 73 74 28 0a  owRewriteEList(.
6530: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
6540: 20 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e   .  Window *pWin
6550: 2c 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  ,.  SrcList *pSr
6560: 63 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  c,.  ExprList *p
6570: 45 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  EList,          
6580: 20 20 20 20 20 2f 2a 20 52 65 77 72 69 74 65 20       /* Rewrite 
6590: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
65a0: 68 69 73 20 6c 69 73 74 20 2a 2f 0a 20 20 45 78  his list */.  Ex
65b0: 70 72 4c 69 73 74 20 2a 2a 70 70 53 75 62 20 20  prList **ppSub  
65c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
65d0: 20 49 4e 2f 4f 55 54 3a 20 53 75 62 2d 73 65 6c   IN/OUT: Sub-sel
65e0: 65 63 74 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c  ect expression-l
65f0: 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b  ist */.){.  Walk
6600: 65 72 20 73 57 61 6c 6b 65 72 3b 0a 20 20 57 69  er sWalker;.  Wi
6610: 6e 64 6f 77 52 65 77 72 69 74 65 20 73 52 65 77  ndowRewrite sRew
6620: 72 69 74 65 3b 0a 0a 20 20 6d 65 6d 73 65 74 28  rite;..  memset(
6630: 26 73 57 61 6c 6b 65 72 2c 20 30 2c 20 73 69 7a  &sWalker, 0, siz
6640: 65 6f 66 28 57 61 6c 6b 65 72 29 29 3b 0a 20 20  eof(Walker));.  
6650: 6d 65 6d 73 65 74 28 26 73 52 65 77 72 69 74 65  memset(&sRewrite
6660: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57 69 6e 64  , 0, sizeof(Wind
6670: 6f 77 52 65 77 72 69 74 65 29 29 3b 0a 0a 20 20  owRewrite));..  
6680: 73 52 65 77 72 69 74 65 2e 70 53 75 62 20 3d 20  sRewrite.pSub = 
6690: 2a 70 70 53 75 62 3b 0a 20 20 73 52 65 77 72 69  *ppSub;.  sRewri
66a0: 74 65 2e 70 57 69 6e 20 3d 20 70 57 69 6e 3b 0a  te.pWin = pWin;.
66b0: 20 20 73 52 65 77 72 69 74 65 2e 70 53 72 63 20    sRewrite.pSrc 
66c0: 3d 20 70 53 72 63 3b 0a 0a 20 20 73 57 61 6c 6b  = pSrc;..  sWalk
66d0: 65 72 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  er.pParse = pPar
66e0: 73 65 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 78 45  se;.  sWalker.xE
66f0: 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65  xprCallback = se
6700: 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74  lectWindowRewrit
6710: 65 45 78 70 72 43 62 3b 0a 20 20 73 57 61 6c 6b  eExprCb;.  sWalk
6720: 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61  er.xSelectCallba
6730: 63 6b 20 3d 20 73 65 6c 65 63 74 57 69 6e 64 6f  ck = selectWindo
6740: 77 52 65 77 72 69 74 65 53 65 6c 65 63 74 43 62  wRewriteSelectCb
6750: 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 75 2e 70 52  ;.  sWalker.u.pR
6760: 65 77 72 69 74 65 20 3d 20 26 73 52 65 77 72 69  ewrite = &sRewri
6770: 74 65 3b 0a 0a 20 20 28 76 6f 69 64 29 73 71 6c  te;..  (void)sql
6780: 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74  ite3WalkExprList
6790: 28 26 73 57 61 6c 6b 65 72 2c 20 70 45 4c 69 73  (&sWalker, pELis
67a0: 74 29 3b 0a 0a 20 20 2a 70 70 53 75 62 20 3d 20  t);..  *ppSub = 
67b0: 73 52 65 77 72 69 74 65 2e 70 53 75 62 3b 0a 7d  sRewrite.pSub;.}
67c0: 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
67d0: 20 63 6f 70 79 20 6f 66 20 65 61 63 68 20 65 78   copy of each ex
67e0: 70 72 65 73 73 69 6f 6e 20 69 6e 20 65 78 70 72  pression in expr
67f0: 65 73 73 69 6f 6e 2d 6c 69 73 74 20 70 41 70 70  ession-list pApp
6800: 65 6e 64 20 74 6f 0a 2a 2a 20 65 78 70 72 65 73  end to.** expres
6810: 73 69 6f 6e 20 6c 69 73 74 20 70 4c 69 73 74 2e  sion list pList.
6820: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
6830: 72 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20  r to the result 
6840: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
6850: 45 78 70 72 4c 69 73 74 20 2a 65 78 70 72 4c 69  ExprList *exprLi
6860: 73 74 41 70 70 65 6e 64 4c 69 73 74 28 0a 20 20  stAppendList(.  
6870: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
6880: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
6890: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
68a0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
68b0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
68c0: 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70 65  to which to appe
68d0: 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  nd. Might be NUL
68e0: 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
68f0: 2a 70 41 70 70 65 6e 64 20 20 20 20 20 20 20 2f  *pAppend       /
6900: 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73  * List of values
6910: 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68   to append. Migh
6920: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  t be NULL */.){.
6930: 20 20 69 66 28 20 70 41 70 70 65 6e 64 20 29 7b    if( pAppend ){
6940: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
6950: 69 6e 74 20 6e 49 6e 69 74 20 3d 20 70 4c 69 73  int nInit = pLis
6960: 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  t ? pList->nExpr
6970: 20 3a 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   : 0;.    for(i=
6980: 30 3b 20 69 3c 70 41 70 70 65 6e 64 2d 3e 6e 45  0; i<pAppend->nE
6990: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
69a0: 20 45 78 70 72 20 2a 70 44 75 70 20 3d 20 73 71   Expr *pDup = sq
69b0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61  lite3ExprDup(pPa
69c0: 72 73 65 2d 3e 64 62 2c 20 70 41 70 70 65 6e 64  rse->db, pAppend
69d0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 30 29  ->a[i].pExpr, 0)
69e0: 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20  ;.      pList = 
69f0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
6a00: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4c  ppend(pParse, pL
6a10: 69 73 74 2c 20 70 44 75 70 29 3b 0a 20 20 20 20  ist, pDup);.    
6a20: 20 20 69 66 28 20 70 4c 69 73 74 20 29 20 70 4c    if( pList ) pL
6a30: 69 73 74 2d 3e 61 5b 6e 49 6e 69 74 2b 69 5d 2e  ist->a[nInit+i].
6a40: 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 41 70 70  sortOrder = pApp
6a50: 65 6e 64 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  end->a[i].sortOr
6a60: 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  der;.    }.  }. 
6a70: 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d   return pList;.}
6a80: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53  ../*.** If the S
6a90: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
6aa0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
6ab0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 64 6f  cond argument do
6ac0: 65 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 0a 2a 2a  es not invoke.**
6ad0: 20 61 6e 79 20 53 51 4c 20 77 69 6e 64 6f 77 20   any SQL window 
6ae0: 66 75 6e 63 74 69 6f 6e 73 2c 20 74 68 69 73 20  functions, this 
6af0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
6b00: 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  -op. Otherwise, 
6b10: 69 74 20 0a 2a 2a 20 72 65 77 72 69 74 65 73 20  it .** rewrites 
6b20: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
6b30: 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77 69 6e  ment so that win
6b40: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 78 53 74  dow function xSt
6b50: 65 70 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20  ep functions.** 
6b60: 61 72 65 20 69 6e 76 6f 6b 65 64 20 69 6e 20 74  are invoked in t
6b70: 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72  he correct order
6b80: 20 61 73 20 64 65 73 63 72 69 62 65 64 20 75 6e   as described un
6b90: 64 65 72 20 22 53 45 4c 45 43 54 20 52 45 57 52  der "SELECT REWR
6ba0: 49 54 49 4e 47 22 0a 2a 2a 20 61 74 20 74 68 65  ITING".** at the
6bb0: 20 74 6f 70 20 6f 66 20 74 68 69 73 20 66 69 6c   top of this fil
6bc0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
6bd0: 33 57 69 6e 64 6f 77 52 65 77 72 69 74 65 28 50  3WindowRewrite(P
6be0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
6bf0: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20  lect *p){.  int 
6c00: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
6c10: 20 20 69 66 28 20 70 2d 3e 70 57 69 6e 20 26 26    if( p->pWin &&
6c20: 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b   p->pPrior==0 ){
6c30: 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73  .    Vdbe *v = s
6c40: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
6c50: 61 72 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  arse);.    sqlit
6c60: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
6c70: 3e 64 62 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  >db;.    Select 
6c80: 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20  *pSub = 0;      
6c90: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75         /* The su
6ca0: 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 53 72  bquery */.    Sr
6cb0: 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d  cList *pSrc = p-
6cc0: 3e 70 53 72 63 3b 0a 20 20 20 20 45 78 70 72 20  >pSrc;.    Expr 
6cd0: 2a 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68  *pWhere = p->pWh
6ce0: 65 72 65 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  ere;.    ExprLis
6cf0: 74 20 2a 70 47 72 6f 75 70 42 79 20 3d 20 70 2d  t *pGroupBy = p-
6d00: 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 45  >pGroupBy;.    E
6d10: 78 70 72 20 2a 70 48 61 76 69 6e 67 20 3d 20 70  xpr *pHaving = p
6d20: 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 20 20 45  ->pHaving;.    E
6d30: 78 70 72 4c 69 73 74 20 2a 70 53 6f 72 74 20 3d  xprList *pSort =
6d40: 20 30 3b 0a 0a 20 20 20 20 45 78 70 72 4c 69 73   0;..    ExprLis
6d50: 74 20 2a 70 53 75 62 6c 69 73 74 20 3d 20 30 3b  t *pSublist = 0;
6d60: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
6d70: 73 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20 73 75  sion list for su
6d80: 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 57  b-query */.    W
6d90: 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70  indow *pMWin = p
6da0: 2d 3e 70 57 69 6e 3b 20 20 20 20 20 20 2f 2a 20  ->pWin;      /* 
6db0: 4d 61 73 74 65 72 20 77 69 6e 64 6f 77 20 6f 62  Master window ob
6dc0: 6a 65 63 74 20 2a 2f 0a 20 20 20 20 57 69 6e 64  ject */.    Wind
6dd0: 6f 77 20 2a 70 57 69 6e 3b 20 20 20 20 20 20 20  ow *pWin;       
6de0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6e            /* Win
6df0: 64 6f 77 20 6f 62 6a 65 63 74 20 69 74 65 72 61  dow object itera
6e00: 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 70 2d 3e 70  tor */..    p->p
6e10: 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  Src = 0;.    p->
6e20: 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 20 20  pWhere = 0;.    
6e30: 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 30 3b  p->pGroupBy = 0;
6e40: 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20  .    p->pHaving 
6e50: 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65  = 0;..    /* Cre
6e60: 61 74 65 20 74 68 65 20 4f 52 44 45 52 20 42 59  ate the ORDER BY
6e70: 20 63 6c 61 75 73 65 20 66 6f 72 20 74 68 65 20   clause for the 
6e80: 73 75 62 2d 73 65 6c 65 63 74 2e 20 54 68 69 73  sub-select. This
6e90: 20 69 73 20 74 68 65 20 63 6f 6e 63 61 74 65 6e   is the concaten
6ea0: 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6f 66 20  ation.    ** of 
6eb0: 74 68 65 20 77 69 6e 64 6f 77 20 50 41 52 54 49  the window PARTI
6ec0: 54 49 4f 4e 20 61 6e 64 20 4f 52 44 45 52 20 42  TION and ORDER B
6ed0: 59 20 63 6c 61 75 73 65 73 2e 20 54 68 65 6e 2c  Y clauses. Then,
6ee0: 20 69 66 20 74 68 69 73 20 6d 61 6b 65 73 20 69   if this makes i
6ef0: 74 0a 20 20 20 20 2a 2a 20 72 65 64 75 6e 64 61  t.    ** redunda
6f00: 6e 74 2c 20 72 65 6d 6f 76 65 20 74 68 65 20 4f  nt, remove the O
6f10: 52 44 45 52 20 42 59 20 66 72 6f 6d 20 74 68 65  RDER BY from the
6f20: 20 70 61 72 65 6e 74 20 53 45 4c 45 43 54 2e 20   parent SELECT. 
6f30: 20 2a 2f 0a 20 20 20 20 70 53 6f 72 74 20 3d 20   */.    pSort = 
6f40: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
6f50: 75 70 28 64 62 2c 20 70 4d 57 69 6e 2d 3e 70 50  up(db, pMWin->pP
6f60: 61 72 74 69 74 69 6f 6e 2c 20 30 29 3b 0a 20 20  artition, 0);.  
6f70: 20 20 70 53 6f 72 74 20 3d 20 65 78 70 72 4c 69    pSort = exprLi
6f80: 73 74 41 70 70 65 6e 64 4c 69 73 74 28 70 50 61  stAppendList(pPa
6f90: 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 4d 57 69  rse, pSort, pMWi
6fa0: 6e 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  n->pOrderBy);.  
6fb0: 20 20 69 66 28 20 70 53 6f 72 74 20 26 26 20 70    if( pSort && p
6fc0: 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
6fd0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
6fe0: 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70  xprListCompare(p
6ff0: 53 6f 72 74 2c 20 70 2d 3e 70 4f 72 64 65 72 42  Sort, p->pOrderB
7000: 79 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20  y, -1)==0 ){.   
7010: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
7020: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
7030: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
7040: 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79       p->pOrderBy
7050: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
7060: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 73 73 69    }..    /* Assi
7070: 67 6e 20 61 20 63 75 72 73 6f 72 20 6e 75 6d 62  gn a cursor numb
7080: 65 72 20 66 6f 72 20 74 68 65 20 65 70 68 65 6d  er for the ephem
7090: 65 72 61 6c 20 74 61 62 6c 65 20 75 73 65 64 20  eral table used 
70a0: 74 6f 20 62 75 66 66 65 72 20 72 6f 77 73 2e 0a  to buffer rows..
70b0: 20 20 20 20 2a 2a 20 54 68 65 20 4f 70 65 6e 45      ** The OpenE
70c0: 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63  phemeral instruc
70d0: 74 69 6f 6e 20 69 73 20 63 6f 64 65 64 20 6c 61  tion is coded la
70e0: 74 65 72 2c 20 61 66 74 65 72 20 69 74 20 69 73  ter, after it is
70f0: 20 6b 6e 6f 77 6e 20 68 6f 77 0a 20 20 20 20 2a   known how.    *
7100: 2a 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 74  * many columns t
7110: 68 65 20 74 61 62 6c 65 20 77 69 6c 6c 20 68 61  he table will ha
7120: 76 65 2e 20 20 2a 2f 0a 20 20 20 20 70 4d 57 69  ve.  */.    pMWi
7130: 6e 2d 3e 69 45 70 68 43 73 72 20 3d 20 70 50 61  n->iEphCsr = pPa
7140: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
7150: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 2b 3d   pParse->nTab +=
7160: 20 33 3b 0a 0a 20 20 20 20 73 65 6c 65 63 74 57   3;..    selectW
7170: 69 6e 64 6f 77 52 65 77 72 69 74 65 45 4c 69 73  indowRewriteELis
7180: 74 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c  t(pParse, pMWin,
7190: 20 70 53 72 63 2c 20 70 2d 3e 70 45 4c 69 73 74   pSrc, p->pEList
71a0: 2c 20 26 70 53 75 62 6c 69 73 74 29 3b 0a 20 20  , &pSublist);.  
71b0: 20 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65    selectWindowRe
71c0: 77 72 69 74 65 45 4c 69 73 74 28 70 50 61 72 73  writeEList(pPars
71d0: 65 2c 20 70 4d 57 69 6e 2c 20 70 53 72 63 2c 20  e, pMWin, pSrc, 
71e0: 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 26 70 53  p->pOrderBy, &pS
71f0: 75 62 6c 69 73 74 29 3b 0a 20 20 20 20 70 4d 57  ublist);.    pMW
7200: 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 20 3d  in->nBufferCol =
7210: 20 28 70 53 75 62 6c 69 73 74 20 3f 20 70 53 75   (pSublist ? pSu
7220: 62 6c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  blist->nExpr : 0
7230: 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e  );..    /* Appen
7240: 64 20 74 68 65 20 50 41 52 54 49 54 49 4f 4e 20  d the PARTITION 
7250: 42 59 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20  BY and ORDER BY 
7260: 65 78 70 72 65 73 73 69 6f 6e 73 20 74 6f 20 74  expressions to t
7270: 68 65 20 74 6f 20 74 68 65 20 0a 20 20 20 20 2a  he to the .    *
7280: 2a 20 73 75 62 2d 73 65 6c 65 63 74 20 65 78 70  * sub-select exp
7290: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 54 68  ression list. Th
72a0: 65 79 20 61 72 65 20 72 65 71 75 69 72 65 64 20  ey are required 
72b0: 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20 77 68  to figure out wh
72c0: 65 72 65 20 0a 20 20 20 20 2a 2a 20 62 6f 75 6e  ere .    ** boun
72d0: 64 61 72 69 65 73 20 66 6f 72 20 70 61 72 74 69  daries for parti
72e0: 74 69 6f 6e 73 20 61 6e 64 20 73 65 74 73 20 6f  tions and sets o
72f0: 66 20 70 65 65 72 20 72 6f 77 73 20 6c 69 65 2e  f peer rows lie.
7300: 20 20 2a 2f 0a 20 20 20 20 70 53 75 62 6c 69 73    */.    pSublis
7310: 74 20 3d 20 65 78 70 72 4c 69 73 74 41 70 70 65  t = exprListAppe
7320: 6e 64 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  ndList(pParse, p
7330: 53 75 62 6c 69 73 74 2c 20 70 4d 57 69 6e 2d 3e  Sublist, pMWin->
7340: 70 50 61 72 74 69 74 69 6f 6e 29 3b 0a 20 20 20  pPartition);.   
7350: 20 70 53 75 62 6c 69 73 74 20 3d 20 65 78 70 72   pSublist = expr
7360: 4c 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28 70  ListAppendList(p
7370: 50 61 72 73 65 2c 20 70 53 75 62 6c 69 73 74 2c  Parse, pSublist,
7380: 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79   pMWin->pOrderBy
7390: 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e  );..    /* Appen
73a0: 64 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20  d the arguments 
73b0: 70 61 73 73 65 64 20 74 6f 20 65 61 63 68 20 77  passed to each w
73c0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 74  indow function t
73d0: 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 75 62  o the.    ** sub
73e0: 2d 73 65 6c 65 63 74 20 65 78 70 72 65 73 73 69  -select expressi
73f0: 6f 6e 20 6c 69 73 74 2e 20 41 6c 73 6f 20 61 6c  on list. Also al
7400: 6c 6f 63 61 74 65 20 74 77 6f 20 72 65 67 69 73  locate two regis
7410: 74 65 72 73 20 66 6f 72 20 65 61 63 68 0a 20 20  ters for each.  
7420: 20 20 2a 2a 20 77 69 6e 64 6f 77 20 66 75 6e 63    ** window func
7430: 74 69 6f 6e 20 2d 20 6f 6e 65 20 66 6f 72 20 74  tion - one for t
7440: 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2c 20  he accumulator, 
7450: 61 6e 6f 74 68 65 72 20 66 6f 72 20 69 6e 74 65  another for inte
7460: 72 69 6d 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c  rim.    ** resul
7470: 74 73 2e 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  ts.  */.    for(
7480: 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e  pWin=pMWin; pWin
7490: 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65  ; pWin=pWin->pNe
74a0: 78 74 57 69 6e 29 7b 0a 20 20 20 20 20 20 70 57  xtWin){.      pW
74b0: 69 6e 2d 3e 69 41 72 67 43 6f 6c 20 3d 20 28 70  in->iArgCol = (p
74c0: 53 75 62 6c 69 73 74 20 3f 20 70 53 75 62 6c 69  Sublist ? pSubli
74d0: 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a  st->nExpr : 0);.
74e0: 20 20 20 20 20 20 70 53 75 62 6c 69 73 74 20 3d        pSublist =
74f0: 20 65 78 70 72 4c 69 73 74 41 70 70 65 6e 64 4c   exprListAppendL
7500: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 75 62  ist(pParse, pSub
7510: 6c 69 73 74 2c 20 70 57 69 6e 2d 3e 70 4f 77 6e  list, pWin->pOwn
7520: 65 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  er->x.pList);.  
7530: 20 20 20 20 69 66 28 20 70 57 69 6e 2d 3e 70 46      if( pWin->pF
7540: 69 6c 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20  ilter ){.       
7550: 20 45 78 70 72 20 2a 70 46 69 6c 74 65 72 20 3d   Expr *pFilter =
7560: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
7570: 64 62 2c 20 70 57 69 6e 2d 3e 70 46 69 6c 74 65  db, pWin->pFilte
7580: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  r, 0);.        p
7590: 53 75 62 6c 69 73 74 20 3d 20 73 71 6c 69 74 65  Sublist = sqlite
75a0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
75b0: 70 50 61 72 73 65 2c 20 70 53 75 62 6c 69 73 74  pParse, pSublist
75c0: 2c 20 70 46 69 6c 74 65 72 29 3b 0a 20 20 20 20  , pFilter);.    
75d0: 20 20 7d 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e    }.      pWin->
75e0: 72 65 67 41 63 63 75 6d 20 3d 20 2b 2b 70 50 61  regAccum = ++pPa
75f0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
7600: 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74   pWin->regResult
7610: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
7620: 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
7630: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7640: 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e  _Null, 0, pWin->
7650: 72 65 67 41 63 63 75 6d 29 3b 0a 20 20 20 20 7d  regAccum);.    }
7660: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
7670: 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59  e is no ORDER BY
7680: 20 6f 72 20 50 41 52 54 49 54 49 4f 4e 20 42 59   or PARTITION BY
7690: 20 63 6c 61 75 73 65 2c 20 61 6e 64 20 74 68 65   clause, and the
76a0: 20 77 69 6e 64 6f 77 0a 20 20 20 20 2a 2a 20 66   window.    ** f
76b0: 75 6e 63 74 69 6f 6e 20 61 63 63 65 70 74 73 20  unction accepts 
76c0: 7a 65 72 6f 20 61 72 67 75 6d 65 6e 74 73 2c 20  zero arguments, 
76d0: 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f  and there are no
76e0: 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 73 0a 20   other columns. 
76f0: 20 20 20 2a 2a 20 73 65 6c 65 63 74 65 64 20 28     ** selected (
7700: 65 2e 67 2e 20 22 53 45 4c 45 43 54 20 72 6f 77  e.g. "SELECT row
7710: 5f 6e 75 6d 62 65 72 28 29 20 4f 56 45 52 20 28  _number() OVER (
7720: 29 20 46 52 4f 4d 20 74 31 22 29 2c 20 69 74 20  ) FROM t1"), it 
7730: 69 73 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20  is possible.    
7740: 2a 2a 20 74 68 61 74 20 70 53 75 62 6c 69 73 74  ** that pSublist
7750: 20 69 73 20 73 74 69 6c 6c 20 4e 55 4c 4c 20 68   is still NULL h
7760: 65 72 65 2e 20 41 64 64 20 61 20 63 6f 6e 73 74  ere. Add a const
7770: 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 68  ant expression h
7780: 65 72 65 20 74 6f 20 0a 20 20 20 20 2a 2a 20 6b  ere to .    ** k
7790: 65 65 70 20 65 76 65 72 79 74 68 69 6e 67 20 6c  eep everything l
77a0: 65 67 61 6c 20 69 6e 20 74 68 69 73 20 63 61 73  egal in this cas
77b0: 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  e. .    */.    i
77c0: 66 28 20 70 53 75 62 6c 69 73 74 3d 3d 30 20 29  f( pSublist==0 )
77d0: 7b 0a 20 20 20 20 20 20 70 53 75 62 6c 69 73 74  {.      pSublist
77e0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
77f0: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
7800: 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73   0, .          s
7810: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
7820: 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20  db, TK_INTEGER, 
7830: 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e  &sqlite3IntToken
7840: 73 5b 30 5d 2c 20 30 29 0a 20 20 20 20 20 20 29  s[0], 0).      )
7850: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 53 75  ;.    }..    pSu
7860: 62 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  b = sqlite3Selec
7870: 74 4e 65 77 28 0a 20 20 20 20 20 20 20 20 70 50  tNew(.        pP
7880: 61 72 73 65 2c 20 70 53 75 62 6c 69 73 74 2c 20  arse, pSublist, 
7890: 70 53 72 63 2c 20 70 57 68 65 72 65 2c 20 70 47  pSrc, pWhere, pG
78a0: 72 6f 75 70 42 79 2c 20 70 48 61 76 69 6e 67 2c  roupBy, pHaving,
78b0: 20 70 53 6f 72 74 2c 20 30 2c 20 30 0a 20 20 20   pSort, 0, 0.   
78c0: 20 29 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20   );.    p->pSrc 
78d0: 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
78e0: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
78f0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
7900: 20 70 2d 3e 70 53 72 63 20 29 7b 0a 20 20 20 20   p->pSrc ){.    
7910: 20 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e    p->pSrc->a[0].
7920: 70 53 65 6c 65 63 74 20 3d 20 70 53 75 62 3b 0a  pSelect = pSub;.
7930: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
7940: 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
7950: 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 53 72  s(pParse, p->pSr
7960: 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  c);.      if( sq
7970: 6c 69 74 65 33 45 78 70 61 6e 64 53 75 62 71 75  lite3ExpandSubqu
7980: 65 72 79 28 70 50 61 72 73 65 2c 20 26 70 2d 3e  ery(pParse, &p->
7990: 70 53 72 63 2d 3e 61 5b 30 5d 29 20 29 7b 0a 20  pSrc->a[0]) ){. 
79a0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
79b0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
79c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
79d0: 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  Sub->selFlags |=
79e0: 20 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20   SF_Expanded;.  
79f0: 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67        p->selFlag
7a00: 73 20 26 3d 20 7e 53 46 5f 41 67 67 72 65 67 61  s &= ~SF_Aggrega
7a10: 74 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  te;.        sqli
7a20: 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50  te3SelectPrep(pP
7a30: 61 72 73 65 2c 20 70 53 75 62 2c 20 30 29 3b 0a  arse, pSub, 0);.
7a40: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73        }..      s
7a50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
7a60: 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
7a70: 65 72 61 6c 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  eral, pMWin->iEp
7a80: 68 43 73 72 2c 20 70 53 75 62 6c 69 73 74 2d 3e  hCsr, pSublist->
7a90: 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71  nExpr);.      sq
7aa0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7ab0: 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70  v, OP_OpenDup, p
7ac0: 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2b 31 2c  MWin->iEphCsr+1,
7ad0: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29   pMWin->iEphCsr)
7ae0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
7af0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7b00: 4f 70 65 6e 44 75 70 2c 20 70 4d 57 69 6e 2d 3e  OpenDup, pMWin->
7b10: 69 45 70 68 43 73 72 2b 32 2c 20 70 4d 57 69 6e  iEphCsr+2, pMWin
7b20: 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 20 20  ->iEphCsr);.    
7b30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7b40: 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75  Op2(v, OP_OpenDu
7b50: 70 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  p, pMWin->iEphCs
7b60: 72 2b 33 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  r+3, pMWin->iEph
7b70: 43 73 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Csr);.    }else{
7b80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
7b90: 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
7ba0: 53 75 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sub);.    }.    
7bb0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
7bc0: 69 6c 65 64 20 29 20 72 63 20 3d 20 53 51 4c 49  iled ) rc = SQLI
7bd0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
7be0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
7bf0: 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 57 69  *.** Free the Wi
7c00: 6e 64 6f 77 20 6f 62 6a 65 63 74 20 70 61 73 73  ndow object pass
7c10: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
7c20: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f   argument..*/.vo
7c30: 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  id sqlite3Window
7c40: 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
7c50: 64 62 2c 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a  db, Window *p){.
7c60: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73    if( p ){.    s
7c70: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
7c80: 28 64 62 2c 20 70 2d 3e 70 46 69 6c 74 65 72 29  (db, p->pFilter)
7c90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
7ca0: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
7cb0: 70 2d 3e 70 50 61 72 74 69 74 69 6f 6e 29 3b 0a  p->pPartition);.
7cc0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
7cd0: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
7ce0: 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
7cf0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
7d00: 65 28 64 62 2c 20 70 2d 3e 70 45 6e 64 29 3b 0a  e(db, p->pEnd);.
7d10: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
7d20: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 53 74  elete(db, p->pSt
7d30: 61 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  art);.    sqlite
7d40: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
7d50: 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
7d60: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
7d70: 7a 42 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69  zBase);.    sqli
7d80: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
7d90: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ;.  }.}../*.** F
7da0: 72 65 65 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c  ree the linked l
7db0: 69 73 74 20 6f 66 20 57 69 6e 64 6f 77 20 6f 62  ist of Window ob
7dc0: 6a 65 63 74 73 20 73 74 61 72 74 69 6e 67 20 61  jects starting a
7dd0: 74 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  t the second arg
7de0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ument..*/.void s
7df0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 4c 69 73 74  qlite3WindowList
7e00: 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
7e10: 64 62 2c 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a  db, Window *p){.
7e20: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
7e30: 20 20 57 69 6e 64 6f 77 20 2a 70 4e 65 78 74 20    Window *pNext 
7e40: 3d 20 70 2d 3e 70 4e 65 78 74 57 69 6e 3b 0a 20  = p->pNextWin;. 
7e50: 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77     sqlite3Window
7e60: 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20  Delete(db, p);. 
7e70: 20 20 20 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20     p = pNext;.  
7e80: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  }.}../*.** The a
7e90: 72 67 75 6d 65 6e 74 20 65 78 70 72 65 73 73 69  rgument expressi
7ea0: 6f 6e 20 69 73 20 61 6e 20 50 52 45 43 45 44 49  on is an PRECEDI
7eb0: 4e 47 20 6f 72 20 46 4f 4c 4c 4f 57 49 4e 47 20  NG or FOLLOWING 
7ec0: 6f 66 66 73 65 74 2e 20 20 54 68 65 0a 2a 2a 20  offset.  The.** 
7ed0: 76 61 6c 75 65 20 73 68 6f 75 6c 64 20 62 65 20  value should be 
7ee0: 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69  a non-negative i
7ef0: 6e 74 65 67 65 72 2e 20 20 49 66 20 74 68 65 20  nteger.  If the 
7f00: 76 61 6c 75 65 20 69 73 20 6e 6f 74 20 61 0a 2a  value is not a.*
7f10: 2a 20 63 6f 6e 73 74 61 6e 74 2c 20 63 68 61 6e  * constant, chan
7f20: 67 65 20 69 74 20 74 6f 20 4e 55 4c 4c 2e 20 20  ge it to NULL.  
7f30: 54 68 65 20 66 61 63 74 20 74 68 61 74 20 69 74  The fact that it
7f40: 20 69 73 20 74 68 65 6e 20 61 20 6e 6f 6e 2d 6e   is then a non-n
7f50: 65 67 61 74 69 76 65 0a 2a 2a 20 69 6e 74 65 67  egative.** integ
7f60: 65 72 20 77 69 6c 6c 20 62 65 20 63 61 75 67 68  er will be caugh
7f70: 74 20 6c 61 74 65 72 2e 20 20 42 75 74 20 69 74  t later.  But it
7f80: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 6e 6f   is important no
7f90: 74 20 74 6f 20 6c 65 61 76 65 0a 2a 2a 20 76 61  t to leave.** va
7fa0: 72 69 61 62 6c 65 20 76 61 6c 75 65 73 20 69 6e  riable values in
7fb0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
7fc0: 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
7fd0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 57 69 6e  Expr *sqlite3Win
7fe0: 64 6f 77 4f 66 66 73 65 74 45 78 70 72 28 50 61  dowOffsetExpr(Pa
7ff0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
8000: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 66 28  r *pExpr){.  if(
8010: 20 30 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49   0==sqlite3ExprI
8020: 73 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72 29  sConstant(pExpr)
8030: 20 29 7b 0a 20 20 20 20 69 66 28 20 49 4e 5f 52   ){.    if( IN_R
8040: 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 20 73  ENAME_OBJECT ) s
8050: 71 6c 69 74 65 33 52 65 6e 61 6d 65 45 78 70 72  qlite3RenameExpr
8060: 55 6e 6d 61 70 28 70 50 61 72 73 65 2c 20 70 45  Unmap(pParse, pE
8070: 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  xpr);.    sqlite
8080: 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
8090: 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 29 3b 0a  se->db, pExpr);.
80a0: 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69      pExpr = sqli
80b0: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61  te3ExprAlloc(pPa
80c0: 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 4e 55 4c 4c  rse->db, TK_NULL
80d0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  , 0, 0);.  }.  r
80e0: 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a  eturn pExpr;.}..
80f0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
8100: 6e 64 20 72 65 74 75 72 6e 20 61 20 6e 65 77 20  nd return a new 
8110: 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 64 65  Window object de
8120: 73 63 72 69 62 69 6e 67 20 61 20 57 69 6e 64 6f  scribing a Windo
8130: 77 20 44 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f  w Definition..*/
8140: 0a 57 69 6e 64 6f 77 20 2a 73 71 6c 69 74 65 33  .Window *sqlite3
8150: 57 69 6e 64 6f 77 41 6c 6c 6f 63 28 0a 20 20 50  WindowAlloc(.  P
8160: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
8170: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
8180: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79  ext */.  int eTy
8190: 70 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 46 72  pe,        /* Fr
81a0: 61 6d 65 20 74 79 70 65 2e 20 54 4b 5f 52 41 4e  ame type. TK_RAN
81b0: 47 45 20 6f 72 20 54 4b 5f 52 4f 57 53 20 2a 2f  GE or TK_ROWS */
81c0: 0a 20 20 69 6e 74 20 65 53 74 61 72 74 2c 20 20  .  int eStart,  
81d0: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 74 79       /* Start ty
81e0: 70 65 3a 20 43 55 52 52 45 4e 54 2c 20 50 52 45  pe: CURRENT, PRE
81f0: 43 45 44 49 4e 47 2c 20 46 4f 4c 4c 4f 57 49 4e  CEDING, FOLLOWIN
8200: 47 2c 20 55 4e 42 4f 55 4e 44 45 44 20 2a 2f 0a  G, UNBOUNDED */.
8210: 20 20 45 78 70 72 20 2a 70 53 74 61 72 74 2c 20    Expr *pStart, 
8220: 20 20 20 20 2f 2a 20 53 74 61 72 74 20 77 69 6e      /* Start win
8230: 64 6f 77 20 73 69 7a 65 20 69 66 20 54 4b 5f 50  dow size if TK_P
8240: 52 45 43 45 44 49 4e 47 20 6f 72 20 46 4f 4c 4c  RECEDING or FOLL
8250: 4f 57 49 4e 47 20 2a 2f 0a 20 20 69 6e 74 20 65  OWING */.  int e
8260: 45 6e 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  End,         /* 
8270: 45 6e 64 20 74 79 70 65 3a 20 43 55 52 52 45 4e  End type: CURREN
8280: 54 2c 20 46 4f 4c 4c 4f 57 49 4e 47 2c 20 54 4b  T, FOLLOWING, TK
8290: 5f 55 4e 42 4f 55 4e 44 45 44 2c 20 50 52 45 43  _UNBOUNDED, PREC
82a0: 45 44 49 4e 47 20 2a 2f 0a 20 20 45 78 70 72 20  EDING */.  Expr 
82b0: 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 2f 2a 20  *pEnd,       /* 
82c0: 45 6e 64 20 77 69 6e 64 6f 77 20 73 69 7a 65 20  End window size 
82d0: 69 66 20 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  if TK_FOLLOWING 
82e0: 6f 72 20 50 52 45 43 45 44 49 4e 47 20 2a 2f 0a  or PRECEDING */.
82f0: 20 20 75 38 20 65 45 78 63 6c 75 64 65 20 20 20    u8 eExclude   
8300: 20 20 20 20 2f 2a 20 45 58 43 4c 55 44 45 20 63      /* EXCLUDE c
8310: 6c 61 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 57 69  lause */.){.  Wi
8320: 6e 64 6f 77 20 2a 70 57 69 6e 20 3d 20 30 3b 0a  ndow *pWin = 0;.
8330: 20 20 69 6e 74 20 62 49 6d 70 6c 69 63 69 74 46    int bImplicitF
8340: 72 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  rame = 0;..  /* 
8350: 50 61 72 73 65 72 20 61 73 73 75 72 65 73 20 74  Parser assures t
8360: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20 2a 2f  he following: */
8370: 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65  .  assert( eType
8380: 3d 3d 30 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b  ==0 || eType==TK
8390: 5f 52 41 4e 47 45 20 7c 7c 20 65 54 79 70 65 3d  _RANGE || eType=
83a0: 3d 54 4b 5f 52 4f 57 53 20 7c 7c 20 65 54 79 70  =TK_ROWS || eTyp
83b0: 65 3d 3d 54 4b 5f 47 52 4f 55 50 53 20 29 3b 0a  e==TK_GROUPS );.
83c0: 20 20 61 73 73 65 72 74 28 20 65 53 74 61 72 74    assert( eStart
83d0: 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 7c 7c 20  ==TK_CURRENT || 
83e0: 65 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45  eStart==TK_PRECE
83f0: 44 49 4e 47 0a 20 20 20 20 20 20 20 20 20 20 20  DING.           
8400: 7c 7c 20 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e  || eStart==TK_UN
8410: 42 4f 55 4e 44 45 44 20 7c 7c 20 65 53 74 61 72  BOUNDED || eStar
8420: 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  t==TK_FOLLOWING 
8430: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 45 6e  );.  assert( eEn
8440: 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 7c 7c  d==TK_CURRENT ||
8450: 20 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57   eEnd==TK_FOLLOW
8460: 49 4e 47 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ING.           |
8470: 7c 20 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55  | eEnd==TK_UNBOU
8480: 4e 44 45 44 20 7c 7c 20 65 45 6e 64 3d 3d 54 4b  NDED || eEnd==TK
8490: 5f 50 52 45 43 45 44 49 4e 47 20 29 3b 0a 20 20  _PRECEDING );.  
84a0: 61 73 73 65 72 74 28 20 28 65 53 74 61 72 74 3d  assert( (eStart=
84b0: 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 7c 7c  =TK_PRECEDING ||
84c0: 20 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c   eStart==TK_FOLL
84d0: 4f 57 49 4e 47 29 3d 3d 28 70 53 74 61 72 74 21  OWING)==(pStart!
84e0: 3d 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  =0) );.  assert(
84f0: 20 28 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f   (eEnd==TK_FOLLO
8500: 57 49 4e 47 20 7c 7c 20 65 45 6e 64 3d 3d 54 4b  WING || eEnd==TK
8510: 5f 50 52 45 43 45 44 49 4e 47 29 3d 3d 28 70 45  _PRECEDING)==(pE
8520: 6e 64 21 3d 30 29 20 29 3b 0a 0a 20 20 69 66 28  nd!=0) );..  if(
8530: 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20   eType==0 ){.   
8540: 20 62 49 6d 70 6c 69 63 69 74 46 72 61 6d 65 20   bImplicitFrame 
8550: 3d 20 31 3b 0a 20 20 20 20 65 54 79 70 65 20 3d  = 1;.    eType =
8560: 20 54 4b 5f 52 41 4e 47 45 3b 0a 20 20 7d 0a 0a   TK_RANGE;.  }..
8570: 20 20 2f 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c    /* Additionall
8580: 79 2c 20 74 68 65 0a 20 20 2a 2a 20 73 74 61 72  y, the.  ** star
8590: 74 69 6e 67 20 62 6f 75 6e 64 61 72 79 20 74 79  ting boundary ty
85a0: 70 65 20 6d 61 79 20 6e 6f 74 20 6f 63 63 75 72  pe may not occur
85b0: 20 65 61 72 6c 69 65 72 20 69 6e 20 74 68 65 20   earlier in the 
85c0: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 69 73 74 20 74  following list t
85d0: 68 61 6e 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64  han.  ** the end
85e0: 69 6e 67 20 62 6f 75 6e 64 61 72 79 20 74 79 70  ing boundary typ
85f0: 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 55  e:.  **.  **   U
8600: 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49  NBOUNDED PRECEDI
8610: 4e 47 0a 20 20 2a 2a 20 20 20 3c 65 78 70 72 3e  NG.  **   <expr>
8620: 20 50 52 45 43 45 44 49 4e 47 0a 20 20 2a 2a 20   PRECEDING.  ** 
8630: 20 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 20 20    CURRENT ROW.  
8640: 2a 2a 20 20 20 3c 65 78 70 72 3e 20 46 4f 4c 4c  **   <expr> FOLL
8650: 4f 57 49 4e 47 0a 20 20 2a 2a 20 20 20 55 4e 42  OWING.  **   UNB
8660: 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47  OUNDED FOLLOWING
8670: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 70  .  **.  ** The p
8680: 61 72 73 65 72 20 65 6e 73 75 72 65 73 20 74 68  arser ensures th
8690: 61 74 20 22 55 4e 42 4f 55 4e 44 45 44 20 50 52  at "UNBOUNDED PR
86a0: 45 43 45 44 49 4e 47 22 20 63 61 6e 6e 6f 74 20  ECEDING" cannot 
86b0: 62 65 20 75 73 65 64 20 61 73 20 61 6e 20 65 6e  be used as an en
86c0: 64 69 6e 67 0a 20 20 2a 2a 20 62 6f 75 6e 64 61  ding.  ** bounda
86d0: 72 79 2c 20 61 6e 64 20 74 68 61 6e 20 22 55 4e  ry, and than "UN
86e0: 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e  BOUNDED FOLLOWIN
86f0: 47 22 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  G" cannot be use
8700: 64 20 61 73 20 61 20 73 74 61 72 74 69 6e 67 0a  d as a starting.
8710: 20 20 2a 2a 20 66 72 61 6d 65 20 62 6f 75 6e 64    ** frame bound
8720: 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ary..  */.  if( 
8730: 28 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52  (eStart==TK_CURR
8740: 45 4e 54 20 26 26 20 65 45 6e 64 3d 3d 54 4b 5f  ENT && eEnd==TK_
8750: 50 52 45 43 45 44 49 4e 47 29 0a 20 20 20 7c 7c  PRECEDING).   ||
8760: 20 28 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c   (eStart==TK_FOL
8770: 4c 4f 57 49 4e 47 20 26 26 20 28 65 45 6e 64 3d  LOWING && (eEnd=
8780: 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 7c 7c  =TK_PRECEDING ||
8790: 20 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e   eEnd==TK_CURREN
87a0: 54 29 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c  T)).  ){.    sql
87b0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
87c0: 72 73 65 2c 20 22 75 6e 73 75 70 70 6f 72 74 65  rse, "unsupporte
87d0: 64 20 66 72 61 6d 65 20 73 70 65 63 69 66 69 63  d frame specific
87e0: 61 74 69 6f 6e 22 29 3b 0a 20 20 20 20 67 6f 74  ation");.    got
87f0: 6f 20 77 69 6e 64 6f 77 41 6c 6c 6f 63 45 72 72  o windowAllocErr
8800: 3b 0a 20 20 7d 0a 0a 20 20 70 57 69 6e 20 3d 20  ;.  }..  pWin = 
8810: 28 57 69 6e 64 6f 77 2a 29 73 71 6c 69 74 65 33  (Window*)sqlite3
8820: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61  DbMallocZero(pPa
8830: 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28  rse->db, sizeof(
8840: 57 69 6e 64 6f 77 29 29 3b 0a 20 20 69 66 28 20  Window));.  if( 
8850: 70 57 69 6e 3d 3d 30 20 29 20 67 6f 74 6f 20 77  pWin==0 ) goto w
8860: 69 6e 64 6f 77 41 6c 6c 6f 63 45 72 72 3b 0a 20  indowAllocErr;. 
8870: 20 70 57 69 6e 2d 3e 65 54 79 70 65 20 3d 20 65   pWin->eType = e
8880: 54 79 70 65 3b 0a 20 20 70 57 69 6e 2d 3e 65 53  Type;.  pWin->eS
8890: 74 61 72 74 20 3d 20 65 53 74 61 72 74 3b 0a 20  tart = eStart;. 
88a0: 20 70 57 69 6e 2d 3e 65 45 6e 64 20 3d 20 65 45   pWin->eEnd = eE
88b0: 6e 64 3b 0a 20 20 69 66 28 20 65 45 78 63 6c 75  nd;.  if( eExclu
88c0: 64 65 3d 3d 30 20 26 26 20 4f 70 74 69 6d 69 7a  de==0 && Optimiz
88d0: 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 70 50  ationDisabled(pP
88e0: 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45  arse->db, SQLITE
88f0: 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72 29  _QueryFlattener)
8900: 20 29 7b 0a 20 20 20 20 65 45 78 63 6c 75 64 65   ){.    eExclude
8910: 20 3d 20 54 4b 5f 4e 4f 3b 0a 20 20 7d 0a 20 20   = TK_NO;.  }.  
8920: 70 57 69 6e 2d 3e 65 45 78 63 6c 75 64 65 20 3d  pWin->eExclude =
8930: 20 65 45 78 63 6c 75 64 65 3b 0a 20 20 70 57 69   eExclude;.  pWi
8940: 6e 2d 3e 62 49 6d 70 6c 69 63 69 74 46 72 61 6d  n->bImplicitFram
8950: 65 20 3d 20 62 49 6d 70 6c 69 63 69 74 46 72 61  e = bImplicitFra
8960: 6d 65 3b 0a 20 20 70 57 69 6e 2d 3e 70 45 6e 64  me;.  pWin->pEnd
8970: 20 3d 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77   = sqlite3Window
8980: 4f 66 66 73 65 74 45 78 70 72 28 70 50 61 72 73  OffsetExpr(pPars
8990: 65 2c 20 70 45 6e 64 29 3b 0a 20 20 70 57 69 6e  e, pEnd);.  pWin
89a0: 2d 3e 70 53 74 61 72 74 20 3d 20 73 71 6c 69 74  ->pStart = sqlit
89b0: 65 33 57 69 6e 64 6f 77 4f 66 66 73 65 74 45 78  e3WindowOffsetEx
89c0: 70 72 28 70 50 61 72 73 65 2c 20 70 53 74 61 72  pr(pParse, pStar
89d0: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 69  t);.  return pWi
89e0: 6e 3b 0a 0a 77 69 6e 64 6f 77 41 6c 6c 6f 63 45  n;..windowAllocE
89f0: 72 72 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70  rr:.  sqlite3Exp
8a00: 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
8a10: 64 62 2c 20 70 45 6e 64 29 3b 0a 20 20 73 71 6c  db, pEnd);.  sql
8a20: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
8a30: 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 74 61 72  Parse->db, pStar
8a40: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  t);.  return 0;.
8a50: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20  }../*.** Attach 
8a60: 50 41 52 54 49 54 49 4f 4e 20 61 6e 64 20 4f 52  PARTITION and OR
8a70: 44 45 52 20 42 59 20 63 6c 61 75 73 65 73 20 70  DER BY clauses p
8a80: 50 61 72 74 69 74 69 6f 6e 20 61 6e 64 20 70 4f  Partition and pO
8a90: 72 64 65 72 42 79 20 74 6f 20 77 69 6e 64 6f 77  rderBy to window
8aa0: 0a 2a 2a 20 70 57 69 6e 2e 20 41 6c 73 6f 2c 20  .** pWin. Also, 
8ab0: 69 66 20 70 61 72 61 6d 65 74 65 72 20 70 42 61  if parameter pBa
8ac0: 73 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  se is not NULL, 
8ad0: 73 65 74 20 70 57 69 6e 2d 3e 7a 42 61 73 65 20  set pWin->zBase 
8ae0: 74 6f 20 74 68 65 0a 2a 2a 20 65 71 75 69 76 61  to the.** equiva
8af0: 6c 65 6e 74 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  lent nul-termina
8b00: 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 57  ted string..*/.W
8b10: 69 6e 64 6f 77 20 2a 73 71 6c 69 74 65 33 57 69  indow *sqlite3Wi
8b20: 6e 64 6f 77 41 73 73 65 6d 62 6c 65 28 0a 20 20  ndowAssemble(.  
8b30: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a  Parse *pParse, .
8b40: 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 2c 20    Window *pWin, 
8b50: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 50 61  .  ExprList *pPa
8b60: 72 74 69 74 69 6f 6e 2c 20 0a 20 20 45 78 70 72  rtition, .  Expr
8b70: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
8b80: 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 61 73 65 0a  .  Token *pBase.
8b90: 29 7b 0a 20 20 69 66 28 20 70 57 69 6e 20 29 7b  ){.  if( pWin ){
8ba0: 0a 20 20 20 20 70 57 69 6e 2d 3e 70 50 61 72 74  .    pWin->pPart
8bb0: 69 74 69 6f 6e 20 3d 20 70 50 61 72 74 69 74 69  ition = pPartiti
8bc0: 6f 6e 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70 4f  on;.    pWin->pO
8bd0: 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
8be0: 79 3b 0a 20 20 20 20 69 66 28 20 70 42 61 73 65  y;.    if( pBase
8bf0: 20 29 7b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e   ){.      pWin->
8c00: 7a 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 44  zBase = sqlite3D
8c10: 62 53 74 72 4e 44 75 70 28 70 50 61 72 73 65 2d  bStrNDup(pParse-
8c20: 3e 64 62 2c 20 70 42 61 73 65 2d 3e 7a 2c 20 70  >db, pBase->z, p
8c30: 42 61 73 65 2d 3e 6e 29 3b 0a 20 20 20 20 7d 0a  Base->n);.    }.
8c40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
8c50: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
8c60: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
8c70: 50 61 72 74 69 74 69 6f 6e 29 3b 0a 20 20 20 20  Partition);.    
8c80: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
8c90: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
8ca0: 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d  , pOrderBy);.  }
8cb0: 0a 20 20 72 65 74 75 72 6e 20 70 57 69 6e 3b 0a  .  return pWin;.
8cc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e 64 6f 77 20  }../*.** Window 
8cd0: 2a 70 57 69 6e 20 68 61 73 20 6a 75 73 74 20 62  *pWin has just b
8ce0: 65 65 6e 20 63 72 65 61 74 65 64 20 66 72 6f 6d  een created from
8cf0: 20 61 20 57 49 4e 44 4f 57 20 63 6c 61 75 73 65   a WINDOW clause
8d00: 2e 20 54 6f 6b 6e 65 20 70 42 61 73 65 0a 2a 2a  . Tokne pBase.**
8d10: 20 69 73 20 74 68 65 20 62 61 73 65 20 77 69 6e   is the base win
8d20: 64 6f 77 2e 20 45 61 72 6c 69 65 72 20 77 69 6e  dow. Earlier win
8d30: 64 6f 77 73 20 66 72 6f 6d 20 74 68 65 20 73 61  dows from the sa
8d40: 6d 65 20 57 49 4e 44 4f 57 20 63 6c 61 75 73 65  me WINDOW clause
8d50: 20 61 72 65 0a 2a 2a 20 73 74 6f 72 65 64 20 69   are.** stored i
8d60: 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  n the linked lis
8d70: 74 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 57  t starting at pW
8d80: 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 2e 20 54 68  in->pNextWin. Th
8d90: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 65  is function.** e
8da0: 69 74 68 65 72 20 75 70 64 61 74 65 73 20 2a 70  ither updates *p
8db0: 57 69 6e 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  Win according to
8dc0: 20 74 68 65 20 62 61 73 65 20 73 70 65 63 69 66   the base specif
8dd0: 69 63 61 74 69 6f 6e 2c 20 6f 72 20 65 6c 73 65  ication, or else
8de0: 0a 2a 2a 20 6c 65 61 76 65 73 20 61 6e 20 65 72  .** leaves an er
8df0: 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  ror in pParse..*
8e00: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69  /.void sqlite3Wi
8e10: 6e 64 6f 77 43 68 61 69 6e 28 50 61 72 73 65 20  ndowChain(Parse 
8e20: 2a 70 50 61 72 73 65 2c 20 57 69 6e 64 6f 77 20  *pParse, Window 
8e30: 2a 70 57 69 6e 2c 20 57 69 6e 64 6f 77 20 2a 70  *pWin, Window *p
8e40: 4c 69 73 74 29 7b 0a 20 20 69 66 28 20 70 57 69  List){.  if( pWi
8e50: 6e 2d 3e 7a 42 61 73 65 20 29 7b 0a 20 20 20 20  n->zBase ){.    
8e60: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
8e70: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 57 69  arse->db;.    Wi
8e80: 6e 64 6f 77 20 2a 70 45 78 69 73 74 20 3d 20 77  ndow *pExist = w
8e90: 69 6e 64 6f 77 46 69 6e 64 28 70 50 61 72 73 65  indowFind(pParse
8ea0: 2c 20 70 4c 69 73 74 2c 20 70 57 69 6e 2d 3e 7a  , pList, pWin->z
8eb0: 42 61 73 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Base);.    if( p
8ec0: 45 78 69 73 74 20 29 7b 0a 20 20 20 20 20 20 63  Exist ){.      c
8ed0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20  onst char *zErr 
8ee0: 3d 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68  = 0;.      /* Ch
8ef0: 65 63 6b 20 66 6f 72 20 65 72 72 6f 72 73 20 2a  eck for errors *
8f00: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 57 69 6e  /.      if( pWin
8f10: 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 29 7b 0a  ->pPartition ){.
8f20: 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 22          zErr = "
8f30: 50 41 52 54 49 54 49 4f 4e 20 63 6c 61 75 73 65  PARTITION clause
8f40: 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ";.      }else i
8f50: 66 28 20 70 45 78 69 73 74 2d 3e 70 4f 72 64 65  f( pExist->pOrde
8f60: 72 42 79 20 26 26 20 70 57 69 6e 2d 3e 70 4f 72  rBy && pWin->pOr
8f70: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
8f80: 20 7a 45 72 72 20 3d 20 22 4f 52 44 45 52 20 42   zErr = "ORDER B
8f90: 59 20 63 6c 61 75 73 65 22 3b 0a 20 20 20 20 20  Y clause";.     
8fa0: 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 69 73   }else if( pExis
8fb0: 74 2d 3e 62 49 6d 70 6c 69 63 69 74 46 72 61 6d  t->bImplicitFram
8fc0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
8fd0: 7a 45 72 72 20 3d 20 22 66 72 61 6d 65 20 73 70  zErr = "frame sp
8fe0: 65 63 69 66 69 63 61 74 69 6f 6e 22 3b 0a 20 20  ecification";.  
8ff0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
9000: 7a 45 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20  zErr ){.        
9010: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
9020: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
9030: 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 6f 76 65       "cannot ove
9040: 72 72 69 64 65 20 25 73 20 6f 66 20 77 69 6e 64  rride %s of wind
9050: 6f 77 3a 20 25 73 22 2c 20 7a 45 72 72 2c 20 70  ow: %s", zErr, p
9060: 57 69 6e 2d 3e 7a 42 61 73 65 0a 20 20 20 20 20  Win->zBase.     
9070: 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73     );.      }els
9080: 65 7b 0a 20 20 20 20 20 20 20 20 70 57 69 6e 2d  e{.        pWin-
9090: 3e 70 50 61 72 74 69 74 69 6f 6e 20 3d 20 73 71  >pPartition = sq
90a0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
90b0: 28 64 62 2c 20 70 45 78 69 73 74 2d 3e 70 50 61  (db, pExist->pPa
90c0: 72 74 69 74 69 6f 6e 2c 20 30 29 3b 0a 20 20 20  rtition, 0);.   
90d0: 20 20 20 20 20 69 66 28 20 70 45 78 69 73 74 2d       if( pExist-
90e0: 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
90f0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
9100: 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  Win->pOrderBy==0
9110: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 57   );.          pW
9120: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73  in->pOrderBy = s
9130: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
9140: 70 28 64 62 2c 20 70 45 78 69 73 74 2d 3e 70 4f  p(db, pExist->pO
9150: 72 64 65 72 42 79 2c 20 30 29 3b 0a 20 20 20 20  rderBy, 0);.    
9160: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
9170: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
9180: 70 57 69 6e 2d 3e 7a 42 61 73 65 29 3b 0a 20 20  pWin->zBase);.  
9190: 20 20 20 20 20 20 70 57 69 6e 2d 3e 7a 42 61 73        pWin->zBas
91a0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
91b0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
91c0: 2a 20 41 74 74 61 63 68 20 77 69 6e 64 6f 77 20  * Attach window 
91d0: 6f 62 6a 65 63 74 20 70 57 69 6e 20 74 6f 20 65  object pWin to e
91e0: 78 70 72 65 73 73 69 6f 6e 20 70 2e 0a 2a 2f 0a  xpression p..*/.
91f0: 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64  void sqlite3Wind
9200: 6f 77 41 74 74 61 63 68 28 50 61 72 73 65 20 2a  owAttach(Parse *
9210: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 2c  pParse, Expr *p,
9220: 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 29 7b 0a   Window *pWin){.
9230: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61    if( p ){.    a
9240: 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b  ssert( p->op==TK
9250: 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20  _FUNCTION );.   
9260: 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
9270: 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
9280: 66 6f 72 20 74 68 65 20 70 61 72 73 65 72 2e 20  for the parser. 
9290: 20 49 66 20 70 57 69 6e 20 77 61 73 20 6e 6f 74   If pWin was not
92a0: 0a 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  .    ** allocate
92b0: 64 20 64 75 65 20 74 6f 20 61 6e 20 4f 4f 4d 2c  d due to an OOM,
92c0: 20 74 68 65 6e 20 74 68 65 20 70 61 72 73 65 72   then the parser
92d0: 20 77 6f 75 6c 64 20 66 61 69 6c 20 62 65 66 6f   would fail befo
92e0: 72 65 20 65 76 65 72 0a 20 20 20 20 2a 2a 20 69  re ever.    ** i
92f0: 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75  nvoking this rou
9300: 74 69 6e 65 20 2a 2f 0a 20 20 20 20 69 66 28 20  tine */.    if( 
9310: 41 4c 57 41 59 53 28 70 57 69 6e 29 20 29 7b 0a  ALWAYS(pWin) ){.
9320: 20 20 20 20 20 20 70 2d 3e 79 2e 70 57 69 6e 20        p->y.pWin 
9330: 3d 20 70 57 69 6e 3b 0a 20 20 20 20 20 20 45 78  = pWin;.      Ex
9340: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c  prSetProperty(p,
9350: 20 45 50 5f 57 69 6e 46 75 6e 63 29 3b 0a 20 20   EP_WinFunc);.  
9360: 20 20 20 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72      pWin->pOwner
9370: 20 3d 20 70 3b 0a 20 20 20 20 20 20 69 66 28 20   = p;.      if( 
9380: 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69  p->flags & EP_Di
9390: 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20  stinct ){.      
93a0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
93b0: 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
93c0: 20 20 20 20 20 22 44 49 53 54 49 4e 43 54 20 69       "DISTINCT i
93d0: 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20  s not supported 
93e0: 66 6f 72 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  for window funct
93f0: 69 6f 6e 73 22 29 3b 0a 20 20 20 20 20 20 7d 0a  ions");.      }.
9400: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
9410: 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77     sqlite3Window
9420: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
9430: 62 2c 20 70 57 69 6e 29 3b 0a 20 20 7d 0a 7d 0a  b, pWin);.  }.}.
9440: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  ./*.** Return 0 
9450: 69 66 20 74 68 65 20 74 77 6f 20 77 69 6e 64 6f  if the two windo
9460: 77 20 6f 62 6a 65 63 74 73 20 61 72 65 20 69 64  w objects are id
9470: 65 6e 74 69 63 61 6c 2c 20 6f 72 20 6e 6f 6e 2d  entical, or non-
9480: 7a 65 72 6f 20 6f 74 68 65 72 77 69 73 65 2e 0a  zero otherwise..
9490: 2a 2a 20 49 64 65 6e 74 69 63 61 6c 20 77 69 6e  ** Identical win
94a0: 64 6f 77 20 6f 62 6a 65 63 74 73 20 63 61 6e 20  dow objects can 
94b0: 62 65 20 70 72 6f 63 65 73 73 65 64 20 69 6e 20  be processed in 
94c0: 61 20 73 69 6e 67 6c 65 20 73 63 61 6e 2e 0a 2a  a single scan..*
94d0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 69 6e  /.int sqlite3Win
94e0: 64 6f 77 43 6f 6d 70 61 72 65 28 50 61 72 73 65  dowCompare(Parse
94f0: 20 2a 70 50 61 72 73 65 2c 20 57 69 6e 64 6f 77   *pParse, Window
9500: 20 2a 70 31 2c 20 57 69 6e 64 6f 77 20 2a 70 32   *p1, Window *p2
9510: 29 7b 0a 20 20 69 66 28 20 70 31 2d 3e 65 54 79  ){.  if( p1->eTy
9520: 70 65 21 3d 70 32 2d 3e 65 54 79 70 65 20 29 20  pe!=p2->eType ) 
9530: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
9540: 70 31 2d 3e 65 53 74 61 72 74 21 3d 70 32 2d 3e  p1->eStart!=p2->
9550: 65 53 74 61 72 74 20 29 20 72 65 74 75 72 6e 20  eStart ) return 
9560: 31 3b 0a 20 20 69 66 28 20 70 31 2d 3e 65 45 6e  1;.  if( p1->eEn
9570: 64 21 3d 70 32 2d 3e 65 45 6e 64 20 29 20 72 65  d!=p2->eEnd ) re
9580: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 31  turn 1;.  if( p1
9590: 2d 3e 65 45 78 63 6c 75 64 65 21 3d 70 32 2d 3e  ->eExclude!=p2->
95a0: 65 45 78 63 6c 75 64 65 20 29 20 72 65 74 75 72  eExclude ) retur
95b0: 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
95c0: 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50  e3ExprCompare(pP
95d0: 61 72 73 65 2c 20 70 31 2d 3e 70 53 74 61 72 74  arse, p1->pStart
95e0: 2c 20 70 32 2d 3e 70 53 74 61 72 74 2c 20 2d 31  , p2->pStart, -1
95f0: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
9600: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
9610: 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
9620: 31 2d 3e 70 45 6e 64 2c 20 70 32 2d 3e 70 45 6e  1->pEnd, p2->pEn
9630: 64 2c 20 2d 31 29 20 29 20 72 65 74 75 72 6e 20  d, -1) ) return 
9640: 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
9650: 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
9660: 70 31 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20  p1->pPartition, 
9670: 70 32 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20  p2->pPartition, 
9680: 2d 31 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  -1) ) return 1;.
9690: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
96a0: 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 31 2d  rListCompare(p1-
96b0: 3e 70 4f 72 64 65 72 42 79 2c 20 70 32 2d 3e 70  >pOrderBy, p2->p
96c0: 4f 72 64 65 72 42 79 2c 20 2d 31 29 20 29 20 72  OrderBy, -1) ) r
96d0: 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
96e0: 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  n 0;.}.../*.** T
96f0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 62 79  his is called by
9700: 20 63 6f 64 65 20 69 6e 20 73 65 6c 65 63 74 2e   code in select.
9710: 63 20 62 65 66 6f 72 65 20 69 74 20 63 61 6c 6c  c before it call
9720: 73 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  s sqlite3WhereBe
9730: 67 69 6e 28 29 0a 2a 2a 20 74 6f 20 62 65 67 69  gin().** to begi
9740: 6e 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  n iterating thro
9750: 75 67 68 20 74 68 65 20 73 75 62 2d 71 75 65 72  ugh the sub-quer
9760: 79 20 72 65 73 75 6c 74 73 2e 20 49 74 20 69 73  y results. It is
9770: 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74   used to allocat
9780: 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c  e.** and initial
9790: 69 7a 65 20 72 65 67 69 73 74 65 72 73 20 61 6e  ize registers an
97a0: 64 20 63 75 72 73 6f 72 73 20 75 73 65 64 20 62  d cursors used b
97b0: 79 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43  y sqlite3WindowC
97c0: 6f 64 65 53 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f  odeStep()..*/.vo
97d0: 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  id sqlite3Window
97e0: 43 6f 64 65 49 6e 69 74 28 50 61 72 73 65 20 2a  CodeInit(Parse *
97f0: 70 50 61 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a  pParse, Window *
9800: 70 4d 57 69 6e 29 7b 0a 20 20 57 69 6e 64 6f 77  pMWin){.  Window
9810: 20 2a 70 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a   *pWin;.  Vdbe *
9820: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
9830: 62 65 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f  be(pParse);..  /
9840: 2a 20 41 6c 6c 6f 63 61 74 65 20 72 65 67 69 73  * Allocate regis
9850: 74 65 72 73 20 74 6f 20 75 73 65 20 66 6f 72 20  ters to use for 
9860: 50 41 52 54 49 54 49 4f 4e 20 42 59 20 76 61 6c  PARTITION BY val
9870: 75 65 73 2c 20 69 66 20 61 6e 79 2e 20 49 6e 69  ues, if any. Ini
9880: 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 73 61 69  tialize.  ** sai
9890: 64 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 4e  d registers to N
98a0: 55 4c 4c 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ULL.  */.  if( p
98b0: 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e  MWin->pPartition
98c0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70   ){.    int nExp
98d0: 72 20 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74  r = pMWin->pPart
98e0: 69 74 69 6f 6e 2d 3e 6e 45 78 70 72 3b 0a 20 20  ition->nExpr;.  
98f0: 20 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74    pMWin->regPart
9900: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
9910: 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
9920: 4d 65 6d 20 2b 3d 20 6e 45 78 70 72 3b 0a 20 20  Mem += nExpr;.  
9930: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9940: 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op3(v, OP_Null, 
9950: 30 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72  0, pMWin->regPar
9960: 74 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72  t, pMWin->regPar
9970: 74 2b 6e 45 78 70 72 2d 31 29 3b 0a 20 20 7d 0a  t+nExpr-1);.  }.
9980: 0a 20 20 70 4d 57 69 6e 2d 3e 72 65 67 4f 6e 65  .  pMWin->regOne
9990: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
99a0: 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  m;.  sqlite3Vdbe
99b0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
99c0: 65 67 65 72 2c 20 31 2c 20 70 4d 57 69 6e 2d 3e  eger, 1, pMWin->
99d0: 72 65 67 4f 6e 65 29 3b 0a 0a 20 20 69 66 28 20  regOne);..  if( 
99e0: 70 4d 57 69 6e 2d 3e 65 45 78 63 6c 75 64 65 20  pMWin->eExclude 
99f0: 29 7b 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 72 65  ){.    pMWin->re
9a00: 67 53 74 61 72 74 52 6f 77 69 64 20 3d 20 2b 2b  gStartRowid = ++
9a10: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
9a20: 20 20 70 4d 57 69 6e 2d 3e 72 65 67 45 6e 64 52    pMWin->regEndR
9a30: 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d  owid = ++pParse-
9a40: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 70 4d 57 69 6e  >nMem;.    pMWin
9a50: 2d 3e 63 73 72 41 70 70 20 3d 20 70 50 61 72 73  ->csrApp = pPars
9a60: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73  e->nTab++;.    s
9a70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
9a80: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
9a90: 31 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61  1, pMWin->regSta
9aa0: 72 74 52 6f 77 69 64 29 3b 0a 20 20 20 20 73 71  rtRowid);.    sq
9ab0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
9ac0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
9ad0: 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 45 6e 64 52  , pMWin->regEndR
9ae0: 6f 77 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  owid);.    sqlit
9af0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
9b00: 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70 4d 57 69  OP_OpenDup, pMWi
9b10: 6e 2d 3e 63 73 72 41 70 70 2c 20 70 4d 57 69 6e  n->csrApp, pMWin
9b20: 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 20 20  ->iEphCsr);.    
9b30: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66  return;.  }..  f
9b40: 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70  or(pWin=pMWin; p
9b50: 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e  Win; pWin=pWin->
9b60: 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 46  pNextWin){.    F
9b70: 75 6e 63 44 65 66 20 2a 70 20 3d 20 70 57 69 6e  uncDef *p = pWin
9b80: 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 69 66 28  ->pFunc;.    if(
9b90: 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26   (p->funcFlags &
9ba0: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e   SQLITE_FUNC_MIN
9bb0: 4d 41 58 29 20 26 26 20 70 57 69 6e 2d 3e 65 53  MAX) && pWin->eS
9bc0: 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44  tart!=TK_UNBOUND
9bd0: 45 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  ED ){.      /* T
9be0: 68 65 20 69 6e 6c 69 6e 65 20 76 65 72 73 69 6f  he inline versio
9bf0: 6e 73 20 6f 66 20 6d 69 6e 28 29 20 61 6e 64 20  ns of min() and 
9c00: 6d 61 78 28 29 20 72 65 71 75 69 72 65 20 61 20  max() require a 
9c10: 73 69 6e 67 6c 65 20 65 70 68 65 6d 65 72 61 6c  single ephemeral
9c20: 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20  .      ** table 
9c30: 61 6e 64 20 33 20 72 65 67 69 73 74 65 72 73 2e  and 3 registers.
9c40: 20 54 68 65 20 72 65 67 69 73 74 65 72 73 20 61   The registers a
9c50: 72 65 20 75 73 65 64 20 61 73 20 66 6f 6c 6c 6f  re used as follo
9c60: 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ws:.      **.   
9c70: 20 20 20 2a 2a 20 20 20 72 65 67 41 70 70 2b 30     **   regApp+0
9c80: 3a 20 73 6c 6f 74 20 74 6f 20 63 6f 70 79 20 6d  : slot to copy m
9c90: 69 6e 28 29 2f 6d 61 78 28 29 20 61 72 67 75 6d  in()/max() argum
9ca0: 65 6e 74 20 74 6f 20 66 6f 72 20 4d 61 6b 65 52  ent to for MakeR
9cb0: 65 63 6f 72 64 0a 20 20 20 20 20 20 2a 2a 20 20  ecord.      **  
9cc0: 20 72 65 67 41 70 70 2b 31 3a 20 69 6e 74 65 67   regApp+1: integ
9cd0: 65 72 20 76 61 6c 75 65 20 75 73 65 64 20 74 6f  er value used to
9ce0: 20 65 6e 73 75 72 65 20 6b 65 79 73 20 61 72 65   ensure keys are
9cf0: 20 75 6e 69 71 75 65 0a 20 20 20 20 20 20 2a 2a   unique.      **
9d00: 20 20 20 72 65 67 41 70 70 2b 32 3a 20 6f 75 74     regApp+2: out
9d10: 70 75 74 20 6f 66 20 4d 61 6b 65 52 65 63 6f 72  put of MakeRecor
9d20: 64 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  d.      */.     
9d30: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
9d40: 20 3d 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d   = pWin->pOwner-
9d50: 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  >x.pList;.      
9d60: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
9d70: 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
9d80: 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
9d90: 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 30 2c  Parse, pList, 0,
9da0: 20 30 29 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d   0);.      pWin-
9db0: 3e 63 73 72 41 70 70 20 3d 20 70 50 61 72 73 65  >csrApp = pParse
9dc0: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
9dd0: 70 57 69 6e 2d 3e 72 65 67 41 70 70 20 3d 20 70  pWin->regApp = p
9de0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
9df0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
9e00: 6d 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20 69 66  m += 3;.      if
9e10: 28 20 70 4b 65 79 49 6e 66 6f 20 26 26 20 70 57  ( pKeyInfo && pW
9e20: 69 6e 2d 3e 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65  in->pFunc->zName
9e30: 5b 31 5d 3d 3d 27 69 27 20 29 7b 0a 20 20 20 20  [1]=='i' ){.    
9e40: 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79      assert( pKey
9e50: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
9e60: 5b 30 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  [0]==0 );.      
9e70: 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72    pKeyInfo->aSor
9e80: 74 4f 72 64 65 72 5b 30 5d 20 3d 20 31 3b 0a 20  tOrder[0] = 1;. 
9e90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
9ea0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
9eb0: 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
9ec0: 61 6c 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70  al, pWin->csrApp
9ed0: 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 2);.      sqli
9ee0: 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
9ef0: 76 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  v, pKeyInfo, P4_
9f00: 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
9f10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9f20: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
9f30: 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70   0, pWin->regApp
9f40: 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65  +1);.    }.    e
9f50: 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4e 61 6d 65  lse if( p->zName
9f60: 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 20  ==nth_valueName 
9f70: 7c 7c 20 70 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72  || p->zName==fir
9f80: 73 74 5f 76 61 6c 75 65 4e 61 6d 65 20 29 7b 0a  st_valueName ){.
9f90: 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
9fa0: 65 20 74 77 6f 20 72 65 67 69 73 74 65 72 73 20  e two registers 
9fb0: 61 74 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2e  at pWin->regApp.
9fc0: 20 54 68 65 73 65 20 77 69 6c 6c 20 62 65 20 75   These will be u
9fd0: 73 65 64 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  sed to.      ** 
9fe0: 73 74 6f 72 65 20 74 68 65 20 73 74 61 72 74 20  store the start 
9ff0: 61 6e 64 20 65 6e 64 20 69 6e 64 65 78 20 6f 66  and end index of
a000: 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 61   the current fra
a010: 6d 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 61 73  me.  */.      as
a020: 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 69 45 70  sert( pMWin->iEp
a030: 68 43 73 72 20 29 3b 0a 20 20 20 20 20 20 70 57  hCsr );.      pW
a040: 69 6e 2d 3e 72 65 67 41 70 70 20 3d 20 70 50 61  in->regApp = pPa
a050: 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
a060: 20 20 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 20     pWin->csrApp 
a070: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
a080: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
a090: 6e 4d 65 6d 20 2b 3d 20 32 3b 0a 20 20 20 20 20  nMem += 2;.     
a0a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a0b0: 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70  p2(v, OP_OpenDup
a0c0: 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20  , pWin->csrApp, 
a0d0: 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b  pMWin->iEphCsr);
a0e0: 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20  .    }.    else 
a0f0: 69 66 28 20 70 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65  if( p->zName==le
a100: 61 64 4e 61 6d 65 20 7c 7c 20 70 2d 3e 7a 4e 61  adName || p->zNa
a110: 6d 65 3d 3d 6c 61 67 4e 61 6d 65 20 29 7b 0a 20  me==lagName ){. 
a120: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 57       assert( pMW
a130: 69 6e 2d 3e 69 45 70 68 43 73 72 20 29 3b 0a 20  in->iEphCsr );. 
a140: 20 20 20 20 20 70 57 69 6e 2d 3e 63 73 72 41 70       pWin->csrAp
a150: 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  p = pParse->nTab
a160: 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
a170: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a180: 50 5f 4f 70 65 6e 44 75 70 2c 20 70 57 69 6e 2d  P_OpenDup, pWin-
a190: 3e 63 73 72 41 70 70 2c 20 70 4d 57 69 6e 2d 3e  >csrApp, pMWin->
a1a0: 69 45 70 68 43 73 72 29 3b 0a 20 20 20 20 7d 0a  iEphCsr);.    }.
a1b0: 20 20 7d 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 57    }.}..#define W
a1c0: 49 4e 44 4f 57 5f 53 54 41 52 54 49 4e 47 5f 49  INDOW_STARTING_I
a1d0: 4e 54 20 20 30 0a 23 64 65 66 69 6e 65 20 57 49  NT  0.#define WI
a1e0: 4e 44 4f 57 5f 45 4e 44 49 4e 47 5f 49 4e 54 20  NDOW_ENDING_INT 
a1f0: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 57 49 4e     1.#define WIN
a200: 44 4f 57 5f 4e 54 48 5f 56 41 4c 55 45 5f 49 4e  DOW_NTH_VALUE_IN
a210: 54 20 32 0a 23 64 65 66 69 6e 65 20 57 49 4e 44  T 2.#define WIND
a220: 4f 57 5f 53 54 41 52 54 49 4e 47 5f 4e 55 4d 20  OW_STARTING_NUM 
a230: 20 33 0a 23 64 65 66 69 6e 65 20 57 49 4e 44 4f   3.#define WINDO
a240: 57 5f 45 4e 44 49 4e 47 5f 4e 55 4d 20 20 20 20  W_ENDING_NUM    
a250: 34 0a 0a 2f 2a 0a 2a 2a 20 41 20 22 50 52 45 43  4../*.** A "PREC
a260: 45 44 49 4e 47 20 3c 65 78 70 72 3e 22 20 28 65  EDING <expr>" (e
a270: 43 6f 6e 64 3d 3d 30 29 20 6f 72 20 22 46 4f 4c  Cond==0) or "FOL
a280: 4c 4f 57 49 4e 47 20 3c 65 78 70 72 3e 22 20 28  LOWING <expr>" (
a290: 65 43 6f 6e 64 3d 3d 31 29 20 6f 72 20 74 68 65  eCond==1) or the
a2a0: 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65  .** value of the
a2b0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
a2c0: 20 74 6f 20 6e 74 68 5f 76 61 6c 75 65 28 29 20   to nth_value() 
a2d0: 28 65 43 6f 6e 64 3d 3d 32 29 20 68 61 73 20 6a  (eCond==2) has j
a2e0: 75 73 74 20 62 65 65 6e 0a 2a 2a 20 65 76 61 6c  ust been.** eval
a2f0: 75 61 74 65 64 20 61 6e 64 20 74 68 65 20 72 65  uated and the re
a300: 73 75 6c 74 20 6c 65 66 74 20 69 6e 20 72 65 67  sult left in reg
a310: 69 73 74 65 72 20 72 65 67 2e 20 54 68 69 73 20  ister reg. This 
a320: 66 75 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61 74  function generat
a330: 65 73 20 56 4d 0a 2a 2a 20 63 6f 64 65 20 74 6f  es VM.** code to
a340: 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   check that the 
a350: 76 61 6c 75 65 20 69 73 20 61 20 6e 6f 6e 2d 6e  value is a non-n
a360: 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72 20  egative integer 
a370: 61 6e 64 20 74 68 72 6f 77 73 20 61 6e 0a 2a 2a  and throws an.**
a380: 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20 69 74   exception if it
a390: 20 69 73 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74   is not..*/.stat
a3a0: 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 43 68  ic void windowCh
a3b0: 65 63 6b 56 61 6c 75 65 28 50 61 72 73 65 20 2a  eckValue(Parse *
a3c0: 70 50 61 72 73 65 2c 20 69 6e 74 20 72 65 67 2c  pParse, int reg,
a3d0: 20 69 6e 74 20 65 43 6f 6e 64 29 7b 0a 20 20 73   int eCond){.  s
a3e0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
a3f0: 20 2a 61 7a 45 72 72 5b 5d 20 3d 20 7b 0a 20 20   *azErr[] = {.  
a400: 20 20 22 66 72 61 6d 65 20 73 74 61 72 74 69 6e    "frame startin
a410: 67 20 6f 66 66 73 65 74 20 6d 75 73 74 20 62 65  g offset must be
a420: 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20   a non-negative 
a430: 69 6e 74 65 67 65 72 22 2c 0a 20 20 20 20 22 66  integer",.    "f
a440: 72 61 6d 65 20 65 6e 64 69 6e 67 20 6f 66 66 73  rame ending offs
a450: 65 74 20 6d 75 73 74 20 62 65 20 61 20 6e 6f 6e  et must be a non
a460: 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67 65  -negative intege
a470: 72 22 2c 0a 20 20 20 20 22 73 65 63 6f 6e 64 20  r",.    "second 
a480: 61 72 67 75 6d 65 6e 74 20 74 6f 20 6e 74 68 5f  argument to nth_
a490: 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20 61 20  value must be a 
a4a0: 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72  positive integer
a4b0: 22 2c 0a 20 20 20 20 22 66 72 61 6d 65 20 73 74  ",.    "frame st
a4c0: 61 72 74 69 6e 67 20 6f 66 66 73 65 74 20 6d 75  arting offset mu
a4d0: 73 74 20 62 65 20 61 20 6e 6f 6e 2d 6e 65 67 61  st be a non-nega
a4e0: 74 69 76 65 20 6e 75 6d 62 65 72 22 2c 0a 20 20  tive number",.  
a4f0: 20 20 22 66 72 61 6d 65 20 65 6e 64 69 6e 67 20    "frame ending 
a500: 6f 66 66 73 65 74 20 6d 75 73 74 20 62 65 20 61  offset must be a
a510: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 6e 75   non-negative nu
a520: 6d 62 65 72 22 2c 0a 20 20 7d 3b 0a 20 20 73 74  mber",.  };.  st
a530: 61 74 69 63 20 69 6e 74 20 61 4f 70 5b 5d 20 3d  atic int aOp[] =
a540: 20 7b 20 4f 50 5f 47 65 2c 20 4f 50 5f 47 65 2c   { OP_Ge, OP_Ge,
a550: 20 4f 50 5f 47 74 2c 20 4f 50 5f 47 65 2c 20 4f   OP_Gt, OP_Ge, O
a560: 50 5f 47 65 20 7d 3b 0a 20 20 56 64 62 65 20 2a  P_Ge };.  Vdbe *
a570: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
a580: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e  be(pParse);.  in
a590: 74 20 72 65 67 5a 65 72 6f 20 3d 20 73 71 6c 69  t regZero = sqli
a5a0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
a5b0: 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
a5c0: 20 65 43 6f 6e 64 3e 3d 30 20 26 26 20 65 43 6f   eCond>=0 && eCo
a5d0: 6e 64 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 45  nd<ArraySize(azE
a5e0: 72 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  rr) );.  sqlite3
a5f0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
a600: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
a610: 5a 65 72 6f 29 3b 0a 20 20 69 66 28 20 65 43 6f  Zero);.  if( eCo
a620: 6e 64 3e 3d 57 49 4e 44 4f 57 5f 53 54 41 52 54  nd>=WINDOW_START
a630: 49 4e 47 5f 4e 55 4d 20 29 7b 0a 20 20 20 20 69  ING_NUM ){.    i
a640: 6e 74 20 72 65 67 53 74 72 69 6e 67 20 3d 20 73  nt regString = s
a650: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
a660: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 73 71  (pParse);.    sq
a670: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
a680: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
a690: 2c 20 72 65 67 53 74 72 69 6e 67 2c 20 30 2c 20  , regString, 0, 
a6a0: 22 22 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  "", P4_STATIC);.
a6b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a6c0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 47 65 2c 20  ddOp3(v, OP_Ge, 
a6d0: 72 65 67 53 74 72 69 6e 67 2c 20 73 71 6c 69 74  regString, sqlit
a6e0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
a6f0: 72 28 76 29 2b 32 2c 20 72 65 67 29 3b 0a 20 20  r(v)+2, reg);.  
a700: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
a710: 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f  ngeP5(v, SQLITE_
a720: 41 46 46 5f 4e 55 4d 45 52 49 43 29 3b 0a 20 20  AFF_NUMERIC);.  
a730: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
a740: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
a750: 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 65  OP_MustBeInt, re
a760: 67 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  g, sqlite3VdbeCu
a770: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b  rrentAddr(v)+2);
a780: 0a 20 20 7d 0a 20 20 56 64 62 65 43 6f 76 65 72  .  }.  VdbeCover
a790: 61 67 65 49 66 28 76 2c 20 65 43 6f 6e 64 3d 3d  ageIf(v, eCond==
a7a0: 30 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61  0);.  VdbeCovera
a7b0: 67 65 49 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 31  geIf(v, eCond==1
a7c0: 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67  );.  VdbeCoverag
a7d0: 65 49 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 32 29  eIf(v, eCond==2)
a7e0: 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  ;.  VdbeCoverage
a7f0: 49 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 33 29 3b  If(v, eCond==3);
a800: 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  .  VdbeCoverageI
a810: 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 34 29 3b 0a  f(v, eCond==4);.
a820: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a830: 4f 70 33 28 76 2c 20 61 4f 70 5b 65 43 6f 6e 64  Op3(v, aOp[eCond
a840: 5d 2c 20 72 65 67 5a 65 72 6f 2c 20 73 71 6c 69  ], regZero, sqli
a850: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
a860: 64 72 28 76 29 2b 32 2c 20 72 65 67 29 3b 0a 20  dr(v)+2, reg);. 
a870: 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76   VdbeCoverageNev
a880: 65 72 4e 75 6c 6c 49 66 28 76 2c 20 65 43 6f 6e  erNullIf(v, eCon
a890: 64 3d 3d 30 29 3b 0a 20 20 56 64 62 65 43 6f 76  d==0);.  VdbeCov
a8a0: 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c 49 66  erageNeverNullIf
a8b0: 28 76 2c 20 65 43 6f 6e 64 3d 3d 31 29 3b 0a 20  (v, eCond==1);. 
a8c0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76   VdbeCoverageNev
a8d0: 65 72 4e 75 6c 6c 49 66 28 76 2c 20 65 43 6f 6e  erNullIf(v, eCon
a8e0: 64 3d 3d 32 29 3b 0a 20 20 56 64 62 65 43 6f 76  d==2);.  VdbeCov
a8f0: 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c 49 66  erageNeverNullIf
a900: 28 76 2c 20 65 43 6f 6e 64 3d 3d 33 29 3b 0a 20  (v, eCond==3);. 
a910: 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76   VdbeCoverageNev
a920: 65 72 4e 75 6c 6c 49 66 28 76 2c 20 65 43 6f 6e  erNullIf(v, eCon
a930: 64 3d 3d 34 29 3b 0a 20 20 73 71 6c 69 74 65 33  d==4);.  sqlite3
a940: 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29  MayAbort(pParse)
a950: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
a960: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 48 61 6c 74  ddOp2(v, OP_Halt
a970: 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20  , SQLITE_ERROR, 
a980: 4f 45 5f 41 62 6f 72 74 29 3b 0a 20 20 73 71 6c  OE_Abort);.  sql
a990: 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
a9a0: 28 76 2c 20 28 76 6f 69 64 2a 29 61 7a 45 72 72  (v, (void*)azErr
a9b0: 5b 65 43 6f 6e 64 5d 2c 20 50 34 5f 53 54 41 54  [eCond], P4_STAT
a9c0: 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  IC);.  sqlite3Re
a9d0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
a9e0: 72 73 65 2c 20 72 65 67 5a 65 72 6f 29 3b 0a 7d  rse, regZero);.}
a9f0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
aa00: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  he number of arg
aa10: 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f  uments passed to
aa20: 20 74 68 65 20 77 69 6e 64 6f 77 2d 66 75 6e 63   the window-func
aa30: 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 0a  tion associated.
aa40: 2a 2a 20 77 69 74 68 20 74 68 65 20 6f 62 6a 65  ** with the obje
aa50: 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
aa60: 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 74   only argument t
aa70: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  o this function.
aa80: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
aa90: 69 6e 64 6f 77 41 72 67 43 6f 75 6e 74 28 57 69  indowArgCount(Wi
aaa0: 6e 64 6f 77 20 2a 70 57 69 6e 29 7b 0a 20 20 45  ndow *pWin){.  E
aab0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
aac0: 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78   pWin->pOwner->x
aad0: 2e 70 4c 69 73 74 3b 0a 20 20 72 65 74 75 72 6e  .pList;.  return
aae0: 20 28 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d   (pList ? pList-
aaf0: 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 7d 0a 0a  >nExpr : 0);.}..
ab00: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56  /*.** Generate V
ab10: 4d 20 63 6f 64 65 20 74 6f 20 69 6e 76 6f 6b 65  M code to invoke
ab20: 20 65 69 74 68 65 72 20 78 53 74 65 70 28 29 20   either xStep() 
ab30: 28 69 66 20 62 49 6e 76 65 72 73 65 20 69 73 20  (if bInverse is 
ab40: 30 29 20 6f 72 20 0a 2a 2a 20 78 49 6e 76 65 72  0) or .** xInver
ab50: 73 65 20 28 69 66 20 62 49 6e 76 65 72 73 65 20  se (if bInverse 
ab60: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 29 20 66 6f 72  is non-zero) for
ab70: 20 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e   each window fun
ab80: 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 0a 2a 2a  ction in the .**
ab90: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61   linked list sta
aba0: 72 74 69 6e 67 20 61 74 20 70 4d 57 69 6e 2e 20  rting at pMWin. 
abb0: 4f 72 2c 20 66 6f 72 20 62 75 69 6c 74 2d 69 6e  Or, for built-in
abc0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
abd0: 73 0a 2a 2a 20 74 68 61 74 20 64 6f 20 6e 6f 74  s.** that do not
abe0: 20 75 73 65 20 74 68 65 20 73 74 61 6e 64 61 72   use the standar
abf0: 64 20 66 75 6e 63 74 69 6f 6e 20 41 50 49 2c 20  d function API, 
ac00: 67 65 6e 65 72 61 74 65 20 74 68 65 20 72 65 71  generate the req
ac10: 75 69 72 65 64 0a 2a 2a 20 69 6e 6c 69 6e 65 20  uired.** inline 
ac20: 56 4d 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49  VM code..**.** I
ac30: 66 20 61 72 67 75 6d 65 6e 74 20 63 73 72 20 69  f argument csr i
ac40: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
ac50: 72 20 65 71 75 61 6c 20 74 6f 20 30 2c 20 74 68  r equal to 0, th
ac60: 65 6e 20 61 72 67 75 6d 65 6e 74 20 72 65 67 20  en argument reg 
ac70: 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  is.** the first 
ac80: 72 65 67 69 73 74 65 72 20 69 6e 20 61 6e 20 61  register in an a
ac90: 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
aca0: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
acb0: 62 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75  be large.** enou
acc0: 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 61  gh to hold the a
acd0: 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74  rray of argument
ace0: 73 20 66 6f 72 20 65 61 63 68 20 66 75 6e 63 74  s for each funct
acf0: 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ion. In this cas
ad00: 65 0a 2a 2a 20 74 68 65 20 61 72 67 75 6d 65 6e  e.** the argumen
ad10: 74 73 20 61 72 65 20 65 78 74 72 61 63 74 65 64  ts are extracted
ad20: 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
ad30: 74 20 72 6f 77 20 6f 66 20 63 73 72 20 69 6e 74  t row of csr int
ad40: 6f 20 74 68 65 0a 2a 2a 20 61 72 72 61 79 20 6f  o the.** array o
ad50: 66 20 72 65 67 69 73 74 65 72 73 20 62 65 66 6f  f registers befo
ad60: 72 65 20 69 6e 76 6f 6b 69 6e 67 20 4f 50 5f 41  re invoking OP_A
ad70: 67 67 53 74 65 70 20 6f 72 20 4f 50 5f 41 67 67  ggStep or OP_Agg
ad80: 49 6e 76 65 72 73 65 0a 2a 2a 0a 2a 2a 20 4f 72  Inverse.**.** Or
ad90: 2c 20 69 66 20 63 73 72 20 69 73 20 6c 65 73 73  , if csr is less
ada0: 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
adb0: 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 72 65   the array of re
adc0: 67 69 73 74 65 72 73 20 61 74 20 72 65 67 20 69  gisters at reg i
add0: 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 70 6f 70  s.** already pop
ade0: 75 6c 61 74 65 64 20 77 69 74 68 20 61 6c 6c 20  ulated with all 
adf0: 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65  columns from the
ae00: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
ae10: 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a  the sub-query..*
ae20: 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  *.** If argument
ae30: 20 72 65 67 50 61 72 74 53 69 7a 65 20 69 73 20   regPartSize is 
ae40: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69  non-zero, then i
ae50: 74 20 69 73 20 61 20 72 65 67 69 73 74 65 72 20  t is a register 
ae60: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 0a 2a  containing the.*
ae70: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * number of rows
ae80: 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
ae90: 70 61 72 74 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  partition..*/.st
aea0: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77  atic void window
aeb0: 41 67 67 53 74 65 70 28 0a 20 20 50 61 72 73 65  AggStep(.  Parse
aec0: 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 57 69 6e   *pParse, .  Win
aed0: 64 6f 77 20 2a 70 4d 57 69 6e 2c 20 20 20 20 20  dow *pMWin,     
aee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
aef0: 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 77  Linked list of w
af00: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
af10: 2a 2f 0a 20 20 69 6e 74 20 63 73 72 2c 20 20 20  */.  int csr,   
af20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af30: 20 20 20 20 20 2f 2a 20 52 65 61 64 20 61 72 67       /* Read arg
af40: 75 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 69 73  uments from this
af50: 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 69 6e 74   cursor */.  int
af60: 20 62 49 6e 76 65 72 73 65 2c 20 20 20 20 20 20   bInverse,      
af70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
af80: 54 72 75 65 20 74 6f 20 69 6e 76 6f 6b 65 20 78  True to invoke x
af90: 49 6e 76 65 72 73 65 20 69 6e 73 74 65 61 64 20  Inverse instead 
afa0: 6f 66 20 78 53 74 65 70 20 2a 2f 0a 20 20 69 6e  of xStep */.  in
afb0: 74 20 72 65 67 20 20 20 20 20 20 20 20 20 20 20  t reg           
afc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
afd0: 20 41 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   Array of regist
afe0: 65 72 73 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  ers */.){.  Vdbe
aff0: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
b000: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
b010: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20  Window *pWin;.  
b020: 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20  for(pWin=pMWin; 
b030: 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d  pWin; pWin=pWin-
b040: 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20  >pNextWin){.    
b050: 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20 3d  FuncDef *pFunc =
b060: 20 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20   pWin->pFunc;.  
b070: 20 20 69 6e 74 20 72 65 67 41 72 67 3b 0a 20 20    int regArg;.  
b080: 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 77 69 6e    int nArg = win
b090: 64 6f 77 41 72 67 43 6f 75 6e 74 28 70 57 69 6e  dowArgCount(pWin
b0a0: 29 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20  );.    int i;.. 
b0b0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
b0c0: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
b0d0: 69 66 28 20 69 21 3d 31 20 7c 7c 20 70 46 75 6e  if( i!=1 || pFun
b0e0: 63 2d 3e 7a 4e 61 6d 65 21 3d 6e 74 68 5f 76 61  c->zName!=nth_va
b0f0: 6c 75 65 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  lueName ){.     
b100: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b110: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
b120: 6e 2c 20 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41  n, csr, pWin->iA
b130: 72 67 43 6f 6c 2b 69 2c 20 72 65 67 2b 69 29 3b  rgCol+i, reg+i);
b140: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
b150: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b160: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
b170: 6c 75 6d 6e 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  lumn, pMWin->iEp
b180: 68 43 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67  hCsr, pWin->iArg
b190: 43 6f 6c 2b 69 2c 20 72 65 67 2b 69 29 3b 0a 20  Col+i, reg+i);. 
b1a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
b1b0: 20 72 65 67 41 72 67 20 3d 20 72 65 67 3b 0a 0a   regArg = reg;..
b1c0: 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 72      if( pMWin->r
b1d0: 65 67 53 74 61 72 74 52 6f 77 69 64 3d 3d 30 0a  egStartRowid==0.
b1e0: 20 20 20 20 20 26 26 20 28 70 46 75 6e 63 2d 3e       && (pFunc->
b1f0: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
b200: 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 20  TE_FUNC_MINMAX) 
b210: 0a 20 20 20 20 20 26 26 20 28 70 57 69 6e 2d 3e  .     && (pWin->
b220: 65 53 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55  eStart!=TK_UNBOU
b230: 4e 44 45 44 29 0a 20 20 20 20 29 7b 0a 20 20 20  NDED).    ){.   
b240: 20 20 20 69 6e 74 20 61 64 64 72 49 73 4e 75 6c     int addrIsNul
b250: 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  l = sqlite3VdbeA
b260: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp1(v, OP_IsNu
b270: 6c 6c 2c 20 72 65 67 41 72 67 29 3b 0a 20 20 20  ll, regArg);.   
b280: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
b290: 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 49  v);.      if( bI
b2a0: 6e 76 65 72 73 65 3d 3d 30 20 29 7b 0a 20 20 20  nverse==0 ){.   
b2b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b2c0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
b2d0: 49 6d 6d 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70  Imm, pWin->regAp
b2e0: 70 2b 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  p+1, 1);.       
b2f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b300: 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  p2(v, OP_SCopy, 
b310: 72 65 67 41 72 67 2c 20 70 57 69 6e 2d 3e 72 65  regArg, pWin->re
b320: 67 41 70 70 29 3b 0a 20 20 20 20 20 20 20 20 73  gApp);.        s
b330: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
b340: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
b350: 64 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2c  d, pWin->regApp,
b360: 20 32 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70   2, pWin->regApp
b370: 2b 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  +2);.        sql
b380: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b390: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
b3a0: 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20 70 57  pWin->csrApp, pW
b3b0: 69 6e 2d 3e 72 65 67 41 70 70 2b 32 29 3b 0a 20  in->regApp+2);. 
b3c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b3d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b3e0: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 53  ddOp4Int(v, OP_S
b3f0: 65 65 6b 47 45 2c 20 70 57 69 6e 2d 3e 63 73 72  eekGE, pWin->csr
b400: 41 70 70 2c 20 30 2c 20 72 65 67 41 72 67 2c 20  App, 0, regArg, 
b410: 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  1);.        Vdbe
b420: 43 6f 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b  CoverageNeverTak
b430: 65 6e 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  en(v);.        s
b440: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
b450: 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 70  (v, OP_Delete, p
b460: 57 69 6e 2d 3e 63 73 72 41 70 70 29 3b 0a 20 20  Win->csrApp);.  
b470: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b480: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 73 71 6c  eJumpHere(v, sql
b490: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
b4a0: 64 64 72 28 76 29 2d 32 29 3b 0a 20 20 20 20 20  ddr(v)-2);.     
b4b0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
b4c0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
b4d0: 61 64 64 72 49 73 4e 75 6c 6c 29 3b 0a 20 20 20  addrIsNull);.   
b4e0: 20 7d 65 6c 73 65 20 69 66 28 20 70 57 69 6e 2d   }else if( pWin-
b4f0: 3e 72 65 67 41 70 70 20 29 7b 0a 20 20 20 20 20  >regApp ){.     
b500: 20 61 73 73 65 72 74 28 20 70 46 75 6e 63 2d 3e   assert( pFunc->
b510: 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65  zName==nth_value
b520: 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 20  Name.           
b530: 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d  || pFunc->zName=
b540: 3d 66 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65  =first_valueName
b550: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
b560: 61 73 73 65 72 74 28 20 62 49 6e 76 65 72 73 65  assert( bInverse
b570: 3d 3d 30 20 7c 7c 20 62 49 6e 76 65 72 73 65 3d  ==0 || bInverse=
b580: 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
b590: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
b5a0: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 57 69 6e   OP_AddImm, pWin
b5b0: 2d 3e 72 65 67 41 70 70 2b 31 2d 62 49 6e 76 65  ->regApp+1-bInve
b5c0: 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c  rse, 1);.    }el
b5d0: 73 65 20 69 66 28 20 70 46 75 6e 63 2d 3e 78 53  se if( pFunc->xS
b5e0: 46 75 6e 63 21 3d 6e 6f 6f 70 53 74 65 70 46 75  Func!=noopStepFu
b5f0: 6e 63 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  nc ){.      int 
b600: 61 64 64 72 49 66 20 3d 20 30 3b 0a 20 20 20 20  addrIf = 0;.    
b610: 20 20 69 66 28 20 70 57 69 6e 2d 3e 70 46 69 6c    if( pWin->pFil
b620: 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ter ){.        i
b630: 6e 74 20 72 65 67 54 6d 70 3b 0a 20 20 20 20 20  nt regTmp;.     
b640: 20 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d     assert( nArg=
b650: 3d 30 20 7c 7c 20 6e 41 72 67 3d 3d 70 57 69 6e  =0 || nArg==pWin
b660: 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73  ->pOwner->x.pLis
b670: 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
b680: 20 20 20 20 61 73 73 65 72 74 28 20 6e 41 72 67      assert( nArg
b690: 20 7c 7c 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72   || pWin->pOwner
b6a0: 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a  ->x.pList==0 );.
b6b0: 20 20 20 20 20 20 20 20 72 65 67 54 6d 70 20 3d          regTmp =
b6c0: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
b6d0: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
b6e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b6f0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
b700: 6d 6e 2c 20 63 73 72 2c 20 70 57 69 6e 2d 3e 69  mn, csr, pWin->i
b710: 41 72 67 43 6f 6c 2b 6e 41 72 67 2c 72 65 67 54  ArgCol+nArg,regT
b720: 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64  mp);.        add
b730: 72 49 66 20 3d 20 73 71 6c 69 74 65 33 56 64 62  rIf = sqlite3Vdb
b740: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
b750: 4e 6f 74 2c 20 72 65 67 54 6d 70 2c 20 30 2c 20  Not, regTmp, 0, 
b760: 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  1);.        Vdbe
b770: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
b780: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
b790: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
b7a0: 65 2c 20 72 65 67 54 6d 70 29 3b 0a 20 20 20 20  e, regTmp);.    
b7b0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 46    }.      if( pF
b7c0: 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  unc->funcFlags &
b7d0: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45   SQLITE_FUNC_NEE
b7e0: 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  DCOLL ){.       
b7f0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
b800: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
b810: 20 6e 41 72 67 3e 30 20 29 3b 0a 20 20 20 20 20   nArg>0 );.     
b820: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
b830: 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28  e3ExprNNCollSeq(
b840: 70 50 61 72 73 65 2c 20 70 57 69 6e 2d 3e 70 4f  pParse, pWin->pO
b850: 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  wner->x.pList->a
b860: 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [0].pExpr);.    
b870: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b880: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c  ddOp4(v, OP_Coll
b890: 53 65 71 2c 20 30 2c 30 2c 30 2c 20 28 63 6f 6e  Seq, 0,0,0, (con
b8a0: 73 74 20 63 68 61 72 2a 29 70 43 6f 6c 6c 2c 20  st char*)pColl, 
b8b0: 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
b8c0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
b8d0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
b8e0: 62 49 6e 76 65 72 73 65 3f 20 4f 50 5f 41 67 67  bInverse? OP_Agg
b8f0: 49 6e 76 65 72 73 65 20 3a 20 4f 50 5f 41 67 67  Inverse : OP_Agg
b900: 53 74 65 70 2c 20 0a 20 20 20 20 20 20 20 20 20  Step, .         
b910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
b920: 49 6e 76 65 72 73 65 2c 20 72 65 67 41 72 67 2c  Inverse, regArg,
b930: 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 29   pWin->regAccum)
b940: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b950: 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70  dbeAppendP4(v, p
b960: 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46  Func, P4_FUNCDEF
b970: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b980: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
b990: 28 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20 20  (u8)nArg);.     
b9a0: 20 69 66 28 20 61 64 64 72 49 66 20 29 20 73 71   if( addrIf ) sq
b9b0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
b9c0: 65 28 76 2c 20 61 64 64 72 49 66 29 3b 0a 20 20  e(v, addrIf);.  
b9d0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 74 79 70 65 64    }.  }.}..typed
b9e0: 65 66 20 73 74 72 75 63 74 20 57 69 6e 64 6f 77  ef struct Window
b9f0: 43 6f 64 65 41 72 67 20 57 69 6e 64 6f 77 43 6f  CodeArg WindowCo
ba00: 64 65 41 72 67 3b 0a 74 79 70 65 64 65 66 20 73  deArg;.typedef s
ba10: 74 72 75 63 74 20 57 69 6e 64 6f 77 43 73 72 41  truct WindowCsrA
ba20: 6e 64 52 65 67 20 57 69 6e 64 6f 77 43 73 72 41  ndReg WindowCsrA
ba30: 6e 64 52 65 67 3b 0a 73 74 72 75 63 74 20 57 69  ndReg;.struct Wi
ba40: 6e 64 6f 77 43 73 72 41 6e 64 52 65 67 20 7b 0a  ndowCsrAndReg {.
ba50: 20 20 69 6e 74 20 63 73 72 3b 0a 20 20 69 6e 74    int csr;.  int
ba60: 20 72 65 67 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74   reg;.};..struct
ba70: 20 57 69 6e 64 6f 77 43 6f 64 65 41 72 67 20 7b   WindowCodeArg {
ba80: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
ba90: 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69  ;.  Window *pMWi
baa0: 6e 3b 0a 20 20 56 64 62 65 20 2a 70 56 64 62 65  n;.  Vdbe *pVdbe
bab0: 3b 0a 20 20 69 6e 74 20 72 65 67 47 6f 73 75 62  ;.  int regGosub
bac0: 3b 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75  ;.  int addrGosu
bad0: 62 3b 0a 20 20 69 6e 74 20 72 65 67 41 72 67 3b  b;.  int regArg;
bae0: 0a 20 20 69 6e 74 20 65 44 65 6c 65 74 65 3b 0a  .  int eDelete;.
baf0: 0a 20 20 57 69 6e 64 6f 77 43 73 72 41 6e 64 52  .  WindowCsrAndR
bb00: 65 67 20 73 74 61 72 74 3b 0a 20 20 57 69 6e 64  eg start;.  Wind
bb10: 6f 77 43 73 72 41 6e 64 52 65 67 20 63 75 72 72  owCsrAndReg curr
bb20: 65 6e 74 3b 0a 20 20 57 69 6e 64 6f 77 43 73 72  ent;.  WindowCsr
bb30: 41 6e 64 52 65 67 20 65 6e 64 3b 0a 7d 3b 0a 0a  AndReg end;.};..
bb40: 2f 2a 0a 2a 2a 20 56 61 6c 75 65 73 20 74 68 61  /*.** Values tha
bb50: 74 20 6d 61 79 20 62 65 20 70 61 73 73 65 64 20  t may be passed 
bb60: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
bb70: 67 75 6d 65 6e 74 20 74 6f 20 77 69 6e 64 6f 77  gument to window
bb80: 43 6f 64 65 4f 70 28 29 2e 0a 2a 2f 0a 23 64 65  CodeOp()..*/.#de
bb90: 66 69 6e 65 20 57 49 4e 44 4f 57 5f 52 45 54 55  fine WINDOW_RETU
bba0: 52 4e 5f 52 4f 57 20 31 0a 23 64 65 66 69 6e 65  RN_ROW 1.#define
bbb0: 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52   WINDOW_AGGINVER
bbc0: 53 45 20 32 0a 23 64 65 66 69 6e 65 20 57 49 4e  SE 2.#define WIN
bbd0: 44 4f 57 5f 41 47 47 53 54 45 50 20 20 20 20 33  DOW_AGGSTEP    3
bbe0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
bbf0: 20 56 4d 20 63 6f 64 65 20 74 6f 20 72 65 61 64   VM code to read
bc00: 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61 6d   the window fram
bc10: 65 73 20 70 65 65 72 20 76 61 6c 75 65 73 20 66  es peer values f
bc20: 72 6f 6d 20 63 75 72 73 6f 72 20 63 73 72 20 69  rom cursor csr i
bc30: 6e 74 6f 0a 2a 2a 20 61 6e 20 61 72 72 61 79 20  nto.** an array 
bc40: 6f 66 20 72 65 67 69 73 74 65 72 73 20 73 74 61  of registers sta
bc50: 72 74 69 6e 67 20 61 74 20 72 65 67 2e 0a 2a 2f  rting at reg..*/
bc60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
bc70: 64 6f 77 52 65 61 64 50 65 65 72 56 61 6c 75 65  dowReadPeerValue
bc80: 73 28 0a 20 20 57 69 6e 64 6f 77 43 6f 64 65 41  s(.  WindowCodeA
bc90: 72 67 20 2a 70 2c 0a 20 20 69 6e 74 20 63 73 72  rg *p,.  int csr
bca0: 2c 0a 20 20 69 6e 74 20 72 65 67 0a 29 7b 0a 20  ,.  int reg.){. 
bcb0: 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d   Window *pMWin =
bcc0: 20 70 2d 3e 70 4d 57 69 6e 3b 0a 20 20 45 78 70   p->pMWin;.  Exp
bcd0: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
bce0: 3d 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42  = pMWin->pOrderB
bcf0: 79 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  y;.  if( pOrderB
bd00: 79 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76  y ){.    Vdbe *v
bd10: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
bd20: 65 28 70 2d 3e 70 50 61 72 73 65 29 3b 0a 20 20  e(p->pParse);.  
bd30: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 50 61 72    ExprList *pPar
bd40: 74 20 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74  t = pMWin->pPart
bd50: 69 74 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 69  ition;.    int i
bd60: 43 6f 6c 4f 66 66 20 3d 20 70 4d 57 69 6e 2d 3e  ColOff = pMWin->
bd70: 6e 42 75 66 66 65 72 43 6f 6c 20 2b 20 28 70 50  nBufferCol + (pP
bd80: 61 72 74 20 3f 20 70 50 61 72 74 2d 3e 6e 45 78  art ? pPart->nEx
bd90: 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74  pr : 0);.    int
bda0: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
bdb0: 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
bdc0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
bdd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
bde0: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
bdf0: 63 73 72 2c 20 69 43 6f 6c 4f 66 66 2b 69 2c 20  csr, iColOff+i, 
be00: 72 65 67 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20  reg+i);.    }.  
be10: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
be20: 61 74 65 20 56 4d 20 63 6f 64 65 20 74 6f 20 69  ate VM code to i
be30: 6e 76 6f 6b 65 20 65 69 74 68 65 72 20 78 56 61  nvoke either xVa
be40: 6c 75 65 28 29 20 28 62 46 69 6e 3d 3d 30 29 20  lue() (bFin==0) 
be50: 6f 72 20 78 46 69 6e 61 6c 69 7a 65 28 29 0a 2a  or xFinalize().*
be60: 2a 20 28 62 46 69 6e 3d 3d 31 29 20 66 6f 72 20  * (bFin==1) for 
be70: 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63  each window func
be80: 74 69 6f 6e 20 69 6e 20 74 68 65 20 6c 69 6e 6b  tion in the link
be90: 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67  ed list starting
bea0: 20 61 74 0a 2a 2a 20 70 4d 57 69 6e 2e 20 4f 72   at.** pMWin. Or
beb0: 2c 20 66 6f 72 20 62 75 69 6c 74 2d 69 6e 20 77  , for built-in w
bec0: 69 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e 73 20  indow-functions 
bed0: 74 68 61 74 20 64 6f 20 6e 6f 74 20 75 73 65 20  that do not use 
bee0: 74 68 65 20 73 74 61 6e 64 61 72 64 0a 2a 2a 20  the standard.** 
bef0: 41 50 49 2c 20 67 65 6e 65 72 61 74 65 20 74 68  API, generate th
bf00: 65 20 65 71 75 69 76 61 6c 65 6e 74 20 56 4d 20  e equivalent VM 
bf10: 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
bf20: 76 6f 69 64 20 77 69 6e 64 6f 77 41 67 67 46 69  void windowAggFi
bf30: 6e 61 6c 28 57 69 6e 64 6f 77 43 6f 64 65 41 72  nal(WindowCodeAr
bf40: 67 20 2a 70 2c 20 69 6e 74 20 62 46 69 6e 29 7b  g *p, int bFin){
bf50: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
bf60: 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20   = p->pParse;.  
bf70: 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20  Window *pMWin = 
bf80: 70 2d 3e 70 4d 57 69 6e 3b 0a 20 20 56 64 62 65  p->pMWin;.  Vdbe
bf90: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
bfa0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
bfb0: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 0a 20  Window *pWin;.. 
bfc0: 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b   for(pWin=pMWin;
bfd0: 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e   pWin; pWin=pWin
bfe0: 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20  ->pNextWin){.   
bff0: 20 69 66 28 20 70 4d 57 69 6e 2d 3e 72 65 67 53   if( pMWin->regS
c000: 74 61 72 74 52 6f 77 69 64 3d 3d 30 0a 20 20 20  tartRowid==0.   
c010: 20 20 26 26 20 28 70 57 69 6e 2d 3e 70 46 75 6e    && (pWin->pFun
c020: 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  c->funcFlags & S
c030: 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41  QLITE_FUNC_MINMA
c040: 58 29 20 0a 20 20 20 20 20 26 26 20 28 70 57 69  X) .     && (pWi
c050: 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b 5f 55 4e  n->eStart!=TK_UN
c060: 42 4f 55 4e 44 45 44 29 0a 20 20 20 20 29 7b 0a  BOUNDED).    ){.
c070: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c080: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
c090: 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67  ll, 0, pWin->reg
c0a0: 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 73  Result);.      s
c0b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
c0c0: 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 57 69  (v, OP_Last, pWi
c0d0: 6e 2d 3e 63 73 72 41 70 70 29 3b 0a 20 20 20 20  n->csrApp);.    
c0e0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
c0f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c100: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
c110: 5f 43 6f 6c 75 6d 6e 2c 20 70 57 69 6e 2d 3e 63  _Column, pWin->c
c120: 73 72 41 70 70 2c 20 30 2c 20 70 57 69 6e 2d 3e  srApp, 0, pWin->
c130: 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  regResult);.    
c140: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
c150: 70 48 65 72 65 28 76 2c 20 73 71 6c 69 74 65 33  pHere(v, sqlite3
c160: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
c170: 76 29 2d 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65  v)-2);.    }else
c180: 20 69 66 28 20 70 57 69 6e 2d 3e 72 65 67 41 70   if( pWin->regAp
c190: 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  p ){.      asser
c1a0: 74 28 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61  t( pMWin->regSta
c1b0: 72 74 52 6f 77 69 64 3d 3d 30 20 29 3b 0a 20 20  rtRowid==0 );.  
c1c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
c1d0: 6e 74 20 6e 41 72 67 20 3d 20 77 69 6e 64 6f 77  nt nArg = window
c1e0: 41 72 67 43 6f 75 6e 74 28 70 57 69 6e 29 3b 0a  ArgCount(pWin);.
c1f0: 20 20 20 20 20 20 69 66 28 20 62 46 69 6e 20 29        if( bFin )
c200: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
c210: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
c220: 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 57 69 6e  P_AggFinal, pWin
c230: 2d 3e 72 65 67 41 63 63 75 6d 2c 20 6e 41 72 67  ->regAccum, nArg
c240: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
c250: 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76  e3VdbeAppendP4(v
c260: 2c 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2c 20 50  , pWin->pFunc, P
c270: 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20  4_FUNCDEF);.    
c280: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c290: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp2(v, OP_Copy
c2a0: 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d  , pWin->regAccum
c2b0: 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c  , pWin->regResul
c2c0: 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
c2d0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
c2e0: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69   OP_Null, 0, pWi
c2f0: 6e 2d 3e 72 65 67 41 63 63 75 6d 29 3b 0a 20 20  n->regAccum);.  
c300: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c310: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c320: 64 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67 56 61  dOp3(v, OP_AggVa
c330: 6c 75 65 2c 70 57 69 6e 2d 3e 72 65 67 41 63 63  lue,pWin->regAcc
c340: 75 6d 2c 6e 41 72 67 2c 70 57 69 6e 2d 3e 72 65  um,nArg,pWin->re
c350: 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20  gResult);.      
c360: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70    sqlite3VdbeApp
c370: 65 6e 64 50 34 28 76 2c 20 70 57 69 6e 2d 3e 70  endP4(v, pWin->p
c380: 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46  Func, P4_FUNCDEF
c390: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
c3a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
c3b0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63  nerate code to c
c3c0: 61 6c 63 75 6c 61 74 65 20 74 68 65 20 63 75 72  alculate the cur
c3d0: 72 65 6e 74 20 76 61 6c 75 65 73 20 6f 66 20 61  rent values of a
c3e0: 6c 6c 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  ll window functi
c3f0: 6f 6e 73 20 69 6e 20 74 68 65 0a 2a 2a 20 70 2d  ons in the.** p-
c400: 3e 70 4d 57 69 6e 20 6c 69 73 74 20 62 79 20 64  >pMWin list by d
c410: 6f 69 6e 67 20 61 20 66 75 6c 6c 20 73 63 61 6e  oing a full scan
c420: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
c430: 77 69 6e 64 6f 77 20 66 72 61 6d 65 2e 20 53 74  window frame. St
c440: 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  ore the.** resul
c450: 74 73 20 69 6e 20 74 68 65 20 57 69 6e 64 6f 77  ts in the Window
c460: 2e 72 65 67 52 65 73 75 6c 74 20 72 65 67 69 73  .regResult regis
c470: 74 65 72 73 2c 20 72 65 61 64 79 20 74 6f 20 72  ters, ready to r
c480: 65 74 75 72 6e 20 74 68 65 20 75 70 70 65 72 0a  eturn the upper.
c490: 2a 2a 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61  ** layer..*/.sta
c4a0: 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 46  tic void windowF
c4b0: 75 6c 6c 53 63 61 6e 28 57 69 6e 64 6f 77 43 6f  ullScan(WindowCo
c4c0: 64 65 41 72 67 20 2a 70 29 7b 0a 20 20 57 69 6e  deArg *p){.  Win
c4d0: 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 50 61 72  dow *pWin;.  Par
c4e0: 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e  se *pParse = p->
c4f0: 70 50 61 72 73 65 3b 0a 20 20 57 69 6e 64 6f 77  pParse;.  Window
c500: 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 4d 57   *pMWin = p->pMW
c510: 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  in;.  Vdbe *v = 
c520: 70 2d 3e 70 56 64 62 65 3b 0a 0a 20 20 69 6e 74  p->pVdbe;..  int
c530: 20 72 65 67 43 52 6f 77 69 64 20 3d 20 30 3b 20   regCRowid = 0; 
c540: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c550: 43 75 72 72 65 6e 74 20 72 6f 77 69 64 20 76 61  Current rowid va
c560: 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  lue */.  int reg
c570: 43 50 65 65 72 20 3d 20 30 3b 20 20 20 20 20 20  CPeer = 0;      
c580: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
c590: 65 6e 74 20 70 65 65 72 20 76 61 6c 75 65 73 20  ent peer values 
c5a0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69  */.  int regRowi
c5b0: 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
c5c0: 20 20 20 20 20 2f 2a 20 41 67 67 53 74 65 70 20       /* AggStep 
c5d0: 72 6f 77 69 64 20 76 61 6c 75 65 20 2a 2f 0a 20  rowid value */. 
c5e0: 20 69 6e 74 20 72 65 67 50 65 65 72 20 3d 20 30   int regPeer = 0
c5f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c600: 20 2f 2a 20 41 67 67 53 74 65 70 20 70 65 65 72   /* AggStep peer
c610: 20 76 61 6c 75 65 73 20 2a 2f 0a 0a 20 20 69 6e   values */..  in
c620: 74 20 6e 50 65 65 72 3b 0a 20 20 69 6e 74 20 6c  t nPeer;.  int l
c630: 62 6c 4e 65 78 74 3b 0a 20 20 69 6e 74 20 6c 62  blNext;.  int lb
c640: 6c 42 72 6b 3b 0a 20 20 69 6e 74 20 61 64 64 72  lBrk;.  int addr
c650: 4e 65 78 74 3b 0a 20 20 69 6e 74 20 63 73 72 20  Next;.  int csr 
c660: 3d 20 70 4d 57 69 6e 2d 3e 63 73 72 41 70 70 3b  = pMWin->csrApp;
c670: 0a 0a 20 20 6e 50 65 65 72 20 3d 20 28 70 4d 57  ..  nPeer = (pMW
c680: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20 3f 20 70  in->pOrderBy ? p
c690: 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  MWin->pOrderBy->
c6a0: 6e 45 78 70 72 20 3a 20 30 29 3b 0a 0a 20 20 6c  nExpr : 0);..  l
c6b0: 62 6c 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33  blNext = sqlite3
c6c0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
c6d0: 61 72 73 65 29 3b 0a 20 20 6c 62 6c 42 72 6b 20  arse);.  lblBrk 
c6e0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
c6f0: 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
c700: 0a 20 20 72 65 67 43 52 6f 77 69 64 20 3d 20 73  .  regCRowid = s
c710: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
c720: 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65 67 52  (pParse);.  regR
c730: 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65  owid = sqlite3Ge
c740: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
c750: 3b 0a 20 20 69 66 28 20 6e 50 65 65 72 20 29 7b  ;.  if( nPeer ){
c760: 0a 20 20 20 20 72 65 67 43 50 65 65 72 20 3d 20  .    regCPeer = 
c770: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
c780: 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 50 65 65  nge(pParse, nPee
c790: 72 29 3b 0a 20 20 20 20 72 65 67 50 65 65 72 20  r);.    regPeer 
c7a0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
c7b0: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 50  Range(pParse, nP
c7c0: 65 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  eer);.  }..  sql
c7d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
c7e0: 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 70 4d 57 69  , OP_Rowid, pMWi
c7f0: 6e 2d 3e 69 45 70 68 43 73 72 2c 20 72 65 67 43  n->iEphCsr, regC
c800: 52 6f 77 69 64 29 3b 0a 20 20 77 69 6e 64 6f 77  Rowid);.  window
c810: 52 65 61 64 50 65 65 72 56 61 6c 75 65 73 28 70  ReadPeerValues(p
c820: 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
c830: 2c 20 72 65 67 43 50 65 65 72 29 3b 0a 0a 20 20  , regCPeer);..  
c840: 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20  for(pWin=pMWin; 
c850: 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d  pWin; pWin=pWin-
c860: 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20  >pNextWin){.    
c870: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c880: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
c890: 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 29   pWin->regAccum)
c8a0: 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
c8b0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
c8c0: 5f 53 65 65 6b 47 45 2c 20 63 73 72 2c 20 6c 62  _SeekGE, csr, lb
c8d0: 6c 42 72 6b 2c 20 70 4d 57 69 6e 2d 3e 72 65 67  lBrk, pMWin->reg
c8e0: 53 74 61 72 74 52 6f 77 69 64 29 3b 0a 20 20 56  StartRowid);.  V
c8f0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
c900: 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c    addrNext = sql
c910: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
c920: 64 64 72 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  ddr(v);.  sqlite
c930: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
c940: 50 5f 52 6f 77 69 64 2c 20 63 73 72 2c 20 72 65  P_Rowid, csr, re
c950: 67 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74  gRowid);.  sqlit
c960: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
c970: 4f 50 5f 47 74 2c 20 70 4d 57 69 6e 2d 3e 72 65  OP_Gt, pMWin->re
c980: 67 45 6e 64 52 6f 77 69 64 2c 20 6c 62 6c 42 72  gEndRowid, lblBr
c990: 6b 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  k, regRowid);.  
c9a0: 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65  VdbeCoverageNeve
c9b0: 72 4e 75 6c 6c 28 76 29 3b 0a 0a 20 20 69 66 28  rNull(v);..  if(
c9c0: 20 70 4d 57 69 6e 2d 3e 65 45 78 63 6c 75 64 65   pMWin->eExclude
c9d0: 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 29 7b 0a  ==TK_CURRENT ){.
c9e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c9f0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20  ddOp3(v, OP_Eq, 
ca00: 72 65 67 43 52 6f 77 69 64 2c 20 6c 62 6c 4e 65  regCRowid, lblNe
ca10: 78 74 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  xt, regRowid);. 
ca20: 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 57 69 6e   }else if( pMWin
ca30: 2d 3e 65 45 78 63 6c 75 64 65 21 3d 54 4b 5f 4e  ->eExclude!=TK_N
ca40: 4f 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  O ){.    int add
ca50: 72 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45  r;.    int addrE
ca60: 71 20 3d 20 30 3b 0a 20 20 20 20 4b 65 79 49 6e  q = 0;.    KeyIn
ca70: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30  fo *pKeyInfo = 0
ca80: 3b 0a 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e  ;..    if( pMWin
ca90: 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
caa0: 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73      pKeyInfo = s
cab0: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f  qlite3KeyInfoFro
cac0: 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
cad0: 2c 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42  , pMWin->pOrderB
cae0: 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  y, 0, 0);.    }.
caf0: 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65      if( pMWin->e
cb00: 45 78 63 6c 75 64 65 3d 3d 54 4b 5f 54 49 45 53  Exclude==TK_TIES
cb10: 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 45 71   ){.      addrEq
cb20: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
cb30: 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20 72  dOp3(v, OP_Eq, r
cb40: 65 67 43 52 6f 77 69 64 2c 20 30 2c 20 72 65 67  egCRowid, 0, reg
cb50: 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20  Rowid);.    }.  
cb60: 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29    if( pKeyInfo )
cb70: 7b 0a 20 20 20 20 20 20 77 69 6e 64 6f 77 52 65  {.      windowRe
cb80: 61 64 50 65 65 72 56 61 6c 75 65 73 28 70 2c 20  adPeerValues(p, 
cb90: 63 73 72 2c 20 72 65 67 50 65 65 72 29 3b 0a 20  csr, regPeer);. 
cba0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cbb0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d  AddOp3(v, OP_Com
cbc0: 70 61 72 65 2c 20 72 65 67 50 65 65 72 2c 20 72  pare, regPeer, r
cbd0: 65 67 43 50 65 65 72 2c 20 6e 50 65 65 72 29 3b  egCPeer, nPeer);
cbe0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
cbf0: 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28 76  beAppendP4(v, (v
cc00: 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  oid*)pKeyInfo, P
cc10: 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
cc20: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
cc30: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
cc40: 76 29 2b 31 3b 0a 20 20 20 20 20 20 73 71 6c 69  v)+1;.      sqli
cc50: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
cc60: 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 2c 20   OP_Jump, addr, 
cc70: 6c 62 6c 4e 65 78 74 2c 20 61 64 64 72 29 3b 0a  lblNext, addr);.
cc80: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
cc90: 67 65 45 71 4e 65 28 76 29 3b 0a 20 20 20 20 7d  geEqNe(v);.    }
cca0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
ccb0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
ccc0: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 62 6c   OP_Goto, 0, lbl
ccd0: 4e 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Next);.    }.   
cce0: 20 69 66 28 20 61 64 64 72 45 71 20 29 20 73 71   if( addrEq ) sq
ccf0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
cd00: 65 28 76 2c 20 61 64 64 72 45 71 29 3b 0a 20 20  e(v, addrEq);.  
cd10: 7d 0a 0a 20 20 77 69 6e 64 6f 77 41 67 67 53 74  }..  windowAggSt
cd20: 65 70 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  ep(pParse, pMWin
cd30: 2c 20 63 73 72 2c 20 30 2c 20 70 2d 3e 72 65 67  , csr, 0, p->reg
cd40: 41 72 67 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  Arg);..  sqlite3
cd50: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
cd60: 28 76 2c 20 6c 62 6c 4e 65 78 74 29 3b 0a 20 20  (v, lblNext);.  
cd70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cd80: 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 63 73  2(v, OP_Next, cs
cd90: 72 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20  r, addrNext);.  
cda0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
cdb0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
cdc0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4e 65  mpHere(v, addrNe
cdd0: 78 74 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  xt-1);.  sqlite3
cde0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
cdf0: 61 64 64 72 4e 65 78 74 2b 31 29 3b 0a 20 20 73  addrNext+1);.  s
ce00: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
ce10: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
ce20: 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65  Rowid);.  sqlite
ce30: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
ce40: 70 50 61 72 73 65 2c 20 72 65 67 43 52 6f 77 69  pParse, regCRowi
ce50: 64 29 3b 0a 20 20 69 66 28 20 6e 50 65 65 72 20  d);.  if( nPeer 
ce60: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
ce70: 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
ce80: 50 61 72 73 65 2c 20 72 65 67 50 65 65 72 2c 20  Parse, regPeer, 
ce90: 6e 50 65 65 72 29 3b 0a 20 20 20 20 73 71 6c 69  nPeer);.    sqli
cea0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
ceb0: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 43  nge(pParse, regC
cec0: 50 65 65 72 2c 20 6e 50 65 65 72 29 3b 0a 20 20  Peer, nPeer);.  
ced0: 7d 0a 0a 20 20 77 69 6e 64 6f 77 41 67 67 46 69  }..  windowAggFi
cee0: 6e 61 6c 28 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a  nal(p, 1);.}../*
cef0: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73  .** Invoke the s
cf00: 75 62 2d 72 6f 75 74 69 6e 65 20 61 74 20 72 65  ub-routine at re
cf10: 67 47 6f 73 75 62 20 28 67 65 6e 65 72 61 74 65  gGosub (generate
cf20: 64 20 62 79 20 63 6f 64 65 20 69 6e 20 73 65 6c  d by code in sel
cf30: 65 63 74 2e 63 29 20 74 6f 0a 2a 2a 20 72 65 74  ect.c) to.** ret
cf40: 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  urn the current 
cf50: 72 6f 77 20 6f 66 20 57 69 6e 64 6f 77 2e 69 45  row of Window.iE
cf60: 70 68 43 73 72 2e 20 49 66 20 61 6c 6c 20 77 69  phCsr. If all wi
cf70: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 61  ndow functions a
cf80: 72 65 0a 2a 2a 20 61 67 67 72 65 67 61 74 65 20  re.** aggregate 
cf90: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73  window functions
cfa0: 20 74 68 61 74 20 75 73 65 20 74 68 65 20 73 74   that use the st
cfb0: 61 6e 64 61 72 64 20 41 50 49 2c 20 61 20 73 69  andard API, a si
cfc0: 6e 67 6c 65 0a 2a 2a 20 4f 50 5f 47 6f 73 75 62  ngle.** OP_Gosub
cfd0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
cfe0: 61 6c 6c 20 74 68 61 74 20 74 68 69 73 20 72 6f  all that this ro
cff0: 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 2e  utine generates.
d000: 20 45 78 74 72 61 20 56 4d 20 63 6f 64 65 0a 2a   Extra VM code.*
d010: 2a 20 66 6f 72 20 70 65 72 2d 72 6f 77 20 70 72  * for per-row pr
d020: 6f 63 65 73 73 69 6e 67 20 69 73 20 6f 6e 6c 79  ocessing is only
d030: 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74   generated for t
d040: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 75 69  he following bui
d050: 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 0a 2a 2a 20  lt-in window.** 
d060: 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  functions:.**.**
d070: 20 20 20 6e 74 68 5f 76 61 6c 75 65 28 29 0a 2a     nth_value().*
d080: 2a 20 20 20 66 69 72 73 74 5f 76 61 6c 75 65 28  *   first_value(
d090: 29 0a 2a 2a 20 20 20 6c 61 67 28 29 0a 2a 2a 20  ).**   lag().** 
d0a0: 20 20 6c 65 61 64 28 29 0a 2a 2f 0a 73 74 61 74    lead().*/.stat
d0b0: 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 52 65  ic void windowRe
d0c0: 74 75 72 6e 4f 6e 65 52 6f 77 28 57 69 6e 64 6f  turnOneRow(Windo
d0d0: 77 43 6f 64 65 41 72 67 20 2a 70 29 7b 0a 20 20  wCodeArg *p){.  
d0e0: 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20  Window *pMWin = 
d0f0: 70 2d 3e 70 4d 57 69 6e 3b 0a 20 20 56 64 62 65  p->pMWin;.  Vdbe
d100: 20 2a 76 20 3d 20 70 2d 3e 70 56 64 62 65 3b 0a   *v = p->pVdbe;.
d110: 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 72 65  .  if( pMWin->re
d120: 67 53 74 61 72 74 52 6f 77 69 64 20 29 7b 0a 20  gStartRowid ){. 
d130: 20 20 20 77 69 6e 64 6f 77 46 75 6c 6c 53 63 61     windowFullSca
d140: 6e 28 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  n(p);.  }else{. 
d150: 20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65     Parse *pParse
d160: 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20   = p->pParse;.  
d170: 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a    Window *pWin;.
d180: 0a 20 20 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d  .    for(pWin=pM
d190: 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d  Win; pWin; pWin=
d1a0: 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b  pWin->pNextWin){
d1b0: 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
d1c0: 70 46 75 6e 63 20 3d 20 70 57 69 6e 2d 3e 70 46  pFunc = pWin->pF
d1d0: 75 6e 63 3b 0a 20 20 20 20 20 20 69 66 28 20 70  unc;.      if( p
d1e0: 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68  Func->zName==nth
d1f0: 5f 76 61 6c 75 65 4e 61 6d 65 0a 20 20 20 20 20  _valueName.     
d200: 20 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d    || pFunc->zNam
d210: 65 3d 3d 66 69 72 73 74 5f 76 61 6c 75 65 4e 61  e==first_valueNa
d220: 6d 65 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  me.      ){.    
d230: 20 20 20 20 69 6e 74 20 63 73 72 20 3d 20 70 57      int csr = pW
d240: 69 6e 2d 3e 63 73 72 41 70 70 3b 0a 20 20 20 20  in->csrApp;.    
d250: 20 20 20 20 69 6e 74 20 6c 62 6c 20 3d 20 73 71      int lbl = sq
d260: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
d270: 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  el(pParse);.    
d280: 20 20 20 20 69 6e 74 20 74 6d 70 52 65 67 20 3d      int tmpReg =
d290: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
d2a0: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
d2b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d2c0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
d2d0: 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65  , 0, pWin->regRe
d2e0: 73 75 6c 74 29 3b 0a 20 20 0a 20 20 20 20 20 20  sult);.  .      
d2f0: 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 7a 4e 61    if( pFunc->zNa
d300: 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d  me==nth_valueNam
d310: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  e ){.          s
d320: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
d330: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 70 4d  (v, OP_Column,pM
d340: 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 70 57 69  Win->iEphCsr,pWi
d350: 6e 2d 3e 69 41 72 67 43 6f 6c 2b 31 2c 74 6d 70  n->iArgCol+1,tmp
d360: 52 65 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Reg);.          
d370: 77 69 6e 64 6f 77 43 68 65 63 6b 56 61 6c 75 65  windowCheckValue
d380: 28 70 50 61 72 73 65 2c 20 74 6d 70 52 65 67 2c  (pParse, tmpReg,
d390: 20 32 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   2);.        }el
d3a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
d3b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
d3c0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
d3d0: 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20  , tmpReg);.     
d3e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
d3f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
d400: 2c 20 4f 50 5f 41 64 64 2c 20 74 6d 70 52 65 67  , OP_Add, tmpReg
d410: 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2c 20  , pWin->regApp, 
d420: 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20 20 20  tmpReg);.       
d430: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d440: 70 33 28 76 2c 20 4f 50 5f 47 74 2c 20 70 57 69  p3(v, OP_Gt, pWi
d450: 6e 2d 3e 72 65 67 41 70 70 2b 31 2c 20 6c 62 6c  n->regApp+1, lbl
d460: 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20  , tmpReg);.     
d470: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e     VdbeCoverageN
d480: 65 76 65 72 4e 75 6c 6c 28 76 29 3b 0a 20 20 20  everNull(v);.   
d490: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d4a0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65  AddOp3(v, OP_See
d4b0: 6b 52 6f 77 69 64 2c 20 63 73 72 2c 20 30 2c 20  kRowid, csr, 0, 
d4c0: 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20 20 20  tmpReg);.       
d4d0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76   VdbeCoverageNev
d4e0: 65 72 54 61 6b 65 6e 28 76 29 3b 0a 20 20 20 20  erTaken(v);.    
d4f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d500: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
d510: 6d 6e 2c 20 63 73 72 2c 20 70 57 69 6e 2d 3e 69  mn, csr, pWin->i
d520: 41 72 67 43 6f 6c 2c 20 70 57 69 6e 2d 3e 72 65  ArgCol, pWin->re
d530: 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20  gResult);.      
d540: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
d550: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c  olveLabel(v, lbl
d560: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
d570: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
d580: 28 70 50 61 72 73 65 2c 20 74 6d 70 52 65 67 29  (pParse, tmpReg)
d590: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d5a0: 65 6c 73 65 20 69 66 28 20 70 46 75 6e 63 2d 3e  else if( pFunc->
d5b0: 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65 20  zName==leadName 
d5c0: 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d  || pFunc->zName=
d5d0: 3d 6c 61 67 4e 61 6d 65 20 29 7b 0a 20 20 20 20  =lagName ){.    
d5e0: 20 20 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 70      int nArg = p
d5f0: 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70  Win->pOwner->x.p
d600: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
d610: 20 20 20 20 20 69 6e 74 20 63 73 72 20 3d 20 70       int csr = p
d620: 57 69 6e 2d 3e 63 73 72 41 70 70 3b 0a 20 20 20  Win->csrApp;.   
d630: 20 20 20 20 20 69 6e 74 20 6c 62 6c 20 3d 20 73       int lbl = s
d640: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
d650: 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20  bel(pParse);.   
d660: 20 20 20 20 20 69 6e 74 20 74 6d 70 52 65 67 20       int tmpReg 
d670: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
d680: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
d690: 20 20 20 20 20 69 6e 74 20 69 45 70 68 20 3d 20       int iEph = 
d6a0: 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 3b 0a  pMWin->iEphCsr;.
d6b0: 20 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e    .        if( n
d6c0: 41 72 67 3c 33 20 29 7b 0a 20 20 20 20 20 20 20  Arg<3 ){.       
d6d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d6e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
d6f0: 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73   0, pWin->regRes
d700: 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ult);.        }e
d710: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
d720: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
d730: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
d740: 45 70 68 2c 70 57 69 6e 2d 3e 69 41 72 67 43 6f  Eph,pWin->iArgCo
d750: 6c 2b 32 2c 70 57 69 6e 2d 3e 72 65 67 52 65 73  l+2,pWin->regRes
d760: 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ult);.        }.
d770: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d780: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
d790: 52 6f 77 69 64 2c 20 69 45 70 68 2c 20 74 6d 70  Rowid, iEph, tmp
d7a0: 52 65 67 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Reg);.        if
d7b0: 28 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20 20  ( nArg<2 ){.    
d7c0: 20 20 20 20 20 20 69 6e 74 20 76 61 6c 20 3d 20        int val = 
d7d0: 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c  (pFunc->zName==l
d7e0: 65 61 64 4e 61 6d 65 20 3f 20 31 20 3a 20 2d 31  eadName ? 1 : -1
d7f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
d800: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
d810: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 6d 70  , OP_AddImm, tmp
d820: 52 65 67 2c 20 76 61 6c 29 3b 0a 20 20 20 20 20  Reg, val);.     
d830: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d840: 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 28 70 46      int op = (pF
d850: 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64  unc->zName==lead
d860: 4e 61 6d 65 20 3f 20 4f 50 5f 41 64 64 20 3a 20  Name ? OP_Add : 
d870: 4f 50 5f 53 75 62 74 72 61 63 74 29 3b 0a 20 20  OP_Subtract);.  
d880: 20 20 20 20 20 20 20 20 69 6e 74 20 74 6d 70 52          int tmpR
d890: 65 67 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74  eg2 = sqlite3Get
d8a0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
d8b0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
d8c0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
d8d0: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 45 70 68 2c  OP_Column, iEph,
d8e0: 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 31   pWin->iArgCol+1
d8f0: 2c 20 74 6d 70 52 65 67 32 29 3b 0a 20 20 20 20  , tmpReg2);.    
d900: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d910: 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 74  eAddOp3(v, op, t
d920: 6d 70 52 65 67 32 2c 20 74 6d 70 52 65 67 2c 20  mpReg2, tmpReg, 
d930: 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20 20 20  tmpReg);.       
d940: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
d950: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
d960: 20 74 6d 70 52 65 67 32 29 3b 0a 20 20 20 20 20   tmpReg2);.     
d970: 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20     }.  .        
d980: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d990: 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69  3(v, OP_SeekRowi
d9a0: 64 2c 20 63 73 72 2c 20 6c 62 6c 2c 20 74 6d 70  d, csr, lbl, tmp
d9b0: 52 65 67 29 3b 0a 20 20 20 20 20 20 20 20 56 64  Reg);.        Vd
d9c0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
d9d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d9e0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
d9f0: 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20 70 57 69 6e  olumn, csr, pWin
da00: 2d 3e 69 41 72 67 43 6f 6c 2c 20 70 57 69 6e 2d  ->iArgCol, pWin-
da10: 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20  >regResult);.   
da20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
da30: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
da40: 6c 62 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  lbl);.        sq
da50: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
da60: 52 65 67 28 70 50 61 72 73 65 2c 20 74 6d 70 52  Reg(pParse, tmpR
da70: 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eg);.      }.   
da80: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
da90: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
daa0: 5f 47 6f 73 75 62 2c 20 70 2d 3e 72 65 67 47 6f  _Gosub, p->regGo
dab0: 73 75 62 2c 20 70 2d 3e 61 64 64 72 47 6f 73 75  sub, p->addrGosu
dac0: 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  b);.}../*.** Gen
dad0: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 65  erate code to se
dae0: 74 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  t the accumulato
daf0: 72 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 65  r register for e
db00: 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  ach window funct
db10: 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 6c 69  ion.** in the li
db20: 6e 6b 65 64 20 6c 69 73 74 20 70 61 73 73 65 64  nked list passed
db30: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
db40: 72 67 75 6d 65 6e 74 20 74 6f 20 4e 55 4c 4c 2e  rgument to NULL.
db50: 20 41 6e 64 20 70 65 72 66 6f 72 6d 0a 2a 2a 20   And perform.** 
db60: 61 6e 79 20 65 71 75 69 76 61 6c 65 6e 74 20 69  any equivalent i
db70: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 72 65  nitialization re
db80: 71 75 69 72 65 64 20 62 79 20 61 6e 79 20 62 75  quired by any bu
db90: 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75  ilt-in window fu
dba0: 6e 63 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 74 68  nctions.** in th
dbb0: 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
dbc0: 63 20 69 6e 74 20 77 69 6e 64 6f 77 49 6e 69 74  c int windowInit
dbd0: 41 63 63 75 6d 28 50 61 72 73 65 20 2a 70 50 61  Accum(Parse *pPa
dbe0: 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70 4d 57  rse, Window *pMW
dbf0: 69 6e 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  in){.  Vdbe *v =
dc00: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
dc10: 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72  pParse);.  int r
dc20: 65 67 41 72 67 3b 0a 20 20 69 6e 74 20 6e 41 72  egArg;.  int nAr
dc30: 67 20 3d 20 30 3b 0a 20 20 57 69 6e 64 6f 77 20  g = 0;.  Window 
dc40: 2a 70 57 69 6e 3b 0a 20 20 66 6f 72 28 70 57 69  *pWin;.  for(pWi
dc50: 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70  n=pMWin; pWin; p
dc60: 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57  Win=pWin->pNextW
dc70: 69 6e 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66  in){.    FuncDef
dc80: 20 2a 70 46 75 6e 63 20 3d 20 70 57 69 6e 2d 3e   *pFunc = pWin->
dc90: 70 46 75 6e 63 3b 0a 20 20 20 20 73 71 6c 69 74  pFunc;.    sqlit
dca0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
dcb0: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e  OP_Null, 0, pWin
dcc0: 2d 3e 72 65 67 41 63 63 75 6d 29 3b 0a 20 20 20  ->regAccum);.   
dcd0: 20 6e 41 72 67 20 3d 20 4d 41 58 28 6e 41 72 67   nArg = MAX(nArg
dce0: 2c 20 77 69 6e 64 6f 77 41 72 67 43 6f 75 6e 74  , windowArgCount
dcf0: 28 70 57 69 6e 29 29 3b 0a 20 20 20 20 69 66 28  (pWin));.    if(
dd00: 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72 74   pMWin->regStart
dd10: 52 6f 77 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20  Rowid==0 ){.    
dd20: 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 7a 4e 61    if( pFunc->zNa
dd30: 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d  me==nth_valueNam
dd40: 65 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d  e || pFunc->zNam
dd50: 65 3d 3d 66 69 72 73 74 5f 76 61 6c 75 65 4e 61  e==first_valueNa
dd60: 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  me ){.        sq
dd70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
dd80: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
dd90: 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 29 3b  , pWin->regApp);
dda0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ddb0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
ddc0: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 57 69  _Integer, 0, pWi
ddd0: 6e 2d 3e 72 65 67 41 70 70 2b 31 29 3b 0a 20 20  n->regApp+1);.  
dde0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
ddf0: 20 28 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61   (pFunc->funcFla
de00: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
de10: 5f 4d 49 4e 4d 41 58 29 20 26 26 20 70 57 69 6e  _MINMAX) && pWin
de20: 2d 3e 63 73 72 41 70 70 20 29 7b 0a 20 20 20 20  ->csrApp ){.    
de30: 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69 6e      assert( pWin
de40: 2d 3e 65 53 74 61 72 74 21 3d 54 4b 5f 55 4e 42  ->eStart!=TK_UNB
de50: 4f 55 4e 44 45 44 20 29 3b 0a 20 20 20 20 20 20  OUNDED );.      
de60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
de70: 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53  Op1(v, OP_ResetS
de80: 6f 72 74 65 72 2c 20 70 57 69 6e 2d 3e 63 73 72  orter, pWin->csr
de90: 41 70 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71  App);.        sq
dea0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
deb0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
dec0: 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31  , pWin->regApp+1
ded0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
dee0: 0a 20 20 7d 0a 20 20 72 65 67 41 72 67 20 3d 20  .  }.  regArg = 
def0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
df00: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
df10: 3d 20 6e 41 72 67 3b 0a 20 20 72 65 74 75 72 6e  = nArg;.  return
df20: 20 72 65 67 41 72 67 3b 0a 7d 0a 0a 2f 2a 20 0a   regArg;.}../* .
df30: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
df40: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72  f the current fr
df50: 61 6d 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61  ame should be ca
df60: 63 68 65 64 20 69 6e 20 74 68 65 20 65 70 68 65  ched in the ephe
df70: 6d 65 72 61 6c 20 74 61 62 6c 65 2c 0a 2a 2a 20  meral table,.** 
df80: 65 76 65 6e 20 69 66 20 74 68 65 72 65 20 61 72  even if there ar
df90: 65 20 6e 6f 20 78 49 6e 76 65 72 73 65 28 29 20  e no xInverse() 
dfa0: 63 61 6c 6c 73 20 72 65 71 75 69 72 65 64 2e 0a  calls required..
dfb0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
dfc0: 6e 64 6f 77 43 61 63 68 65 46 72 61 6d 65 28 57  ndowCacheFrame(W
dfd0: 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 29 7b 0a 20  indow *pMWin){. 
dfe0: 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20   Window *pWin;. 
dff0: 20 69 66 28 20 70 4d 57 69 6e 2d 3e 72 65 67 53   if( pMWin->regS
e000: 74 61 72 74 52 6f 77 69 64 20 29 20 72 65 74 75  tartRowid ) retu
e010: 72 6e 20 31 3b 0a 20 20 66 6f 72 28 70 57 69 6e  rn 1;.  for(pWin
e020: 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57  =pMWin; pWin; pW
e030: 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69  in=pWin->pNextWi
e040: 6e 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 20  n){.    FuncDef 
e050: 2a 70 46 75 6e 63 20 3d 20 70 57 69 6e 2d 3e 70  *pFunc = pWin->p
e060: 46 75 6e 63 3b 0a 20 20 20 20 69 66 28 20 28 70  Func;.    if( (p
e070: 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68  Func->zName==nth
e080: 5f 76 61 6c 75 65 4e 61 6d 65 29 0a 20 20 20 20  _valueName).    
e090: 20 7c 7c 20 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d   || (pFunc->zNam
e0a0: 65 3d 3d 66 69 72 73 74 5f 76 61 6c 75 65 4e 61  e==first_valueNa
e0b0: 6d 65 29 0a 20 20 20 20 20 7c 7c 20 28 70 46 75  me).     || (pFu
e0c0: 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e  nc->zName==leadN
e0d0: 61 6d 65 29 0a 20 20 20 20 20 7c 7c 20 28 70 46  ame).     || (pF
e0e0: 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 61 67 4e  unc->zName==lagN
e0f0: 61 6d 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ame).    ){.    
e100: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
e110: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
e120: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 72 65 67 4f 6c  ;.}../*.** regOl
e130: 64 20 61 6e 64 20 72 65 67 4e 65 77 20 61 72 65  d and regNew are
e140: 20 65 61 63 68 20 74 68 65 20 66 69 72 73 74 20   each the first 
e150: 72 65 67 69 73 74 65 72 20 69 6e 20 61 6e 20 61  register in an a
e160: 72 72 61 79 20 6f 66 20 73 69 7a 65 0a 2a 2a 20  rray of size.** 
e170: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2e  pOrderBy->nExpr.
e180: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 67   This function g
e190: 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f  enerates code to
e1a0: 20 63 6f 6d 70 61 72 65 20 74 68 65 20 74 77 6f   compare the two
e1b0: 0a 2a 2a 20 61 72 72 61 79 73 20 6f 66 20 72 65  .** arrays of re
e1c0: 67 69 73 74 65 72 73 20 75 73 69 6e 67 20 74 68  gisters using th
e1d0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
e1e0: 65 6e 63 65 73 20 61 6e 64 20 6f 74 68 65 72 20  ences and other 
e1f0: 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 70 61  comparison.** pa
e200: 72 61 6d 65 74 65 72 73 20 73 70 65 63 69 66 69  rameters specifi
e210: 65 64 20 62 79 20 70 4f 72 64 65 72 42 79 2e 20  ed by pOrderBy. 
e220: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 77  .**.** If the tw
e230: 6f 20 61 72 72 61 79 73 20 61 72 65 20 6e 6f 74  o arrays are not
e240: 20 65 71 75 61 6c 2c 20 74 68 65 20 63 6f 6e 74   equal, the cont
e250: 65 6e 74 73 20 6f 66 20 72 65 67 4e 65 77 20 69  ents of regNew i
e260: 73 20 63 6f 70 69 65 64 20 74 6f 20 0a 2a 2a 20  s copied to .** 
e270: 72 65 67 4f 6c 64 20 61 6e 64 20 63 6f 6e 74 72  regOld and contr
e280: 6f 6c 20 66 61 6c 6c 73 20 74 68 72 6f 75 67 68  ol falls through
e290: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
e2a0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
e2b0: 74 68 65 20 61 72 72 61 79 73 0a 2a 2a 20 61 72  the arrays.** ar
e2c0: 65 20 65 71 75 61 6c 2c 20 61 6e 20 4f 50 5f 47  e equal, an OP_G
e2d0: 6f 74 6f 20 69 73 20 65 78 65 63 75 74 65 64 2e  oto is executed.
e2e0: 20 54 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   The address of 
e2f0: 74 68 65 20 4f 50 5f 47 6f 74 6f 20 69 73 20 72  the OP_Goto is r
e300: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
e310: 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 49 66  ic void windowIf
e320: 4e 65 77 50 65 65 72 28 0a 20 20 50 61 72 73 65  NewPeer(.  Parse
e330: 20 2a 70 50 61 72 73 65 2c 0a 20 20 45 78 70 72   *pParse,.  Expr
e340: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 0a  List *pOrderBy,.
e350: 20 20 69 6e 74 20 72 65 67 4e 65 77 2c 20 20 20    int regNew,   
e360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e370: 20 20 2f 2a 20 46 69 72 73 74 20 69 6e 20 61 72    /* First in ar
e380: 72 61 79 20 6f 66 20 6e 65 77 20 76 61 6c 75 65  ray of new value
e390: 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 6c  s */.  int regOl
e3a0: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
e3b0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
e3c0: 69 6e 20 61 72 72 61 79 20 6f 66 20 6f 6c 64 20  in array of old 
e3d0: 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20  values */.  int 
e3e0: 61 64 64 72 20 20 20 20 20 20 20 20 20 20 20 20  addr            
e3f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
e400: 75 6d 70 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ump here */.){. 
e410: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
e420: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
e430: 29 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  );.  if( pOrderB
e440: 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 56 61  y ){.    int nVa
e450: 6c 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  l = pOrderBy->nE
e460: 78 70 72 3b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  xpr;.    KeyInfo
e470: 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c   *pKeyInfo = sql
e480: 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45  ite3KeyInfoFromE
e490: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
e4a0: 70 4f 72 64 65 72 42 79 2c 20 30 2c 20 30 29 3b  pOrderBy, 0, 0);
e4b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
e4c0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d  AddOp3(v, OP_Com
e4d0: 70 61 72 65 2c 20 72 65 67 4f 6c 64 2c 20 72 65  pare, regOld, re
e4e0: 67 4e 65 77 2c 20 6e 56 61 6c 29 3b 0a 20 20 20  gNew, nVal);.   
e4f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65   sqlite3VdbeAppe
e500: 6e 64 50 34 28 76 2c 20 28 76 6f 69 64 2a 29 70  ndP4(v, (void*)p
e510: 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
e520: 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  NFO);.    sqlite
e530: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
e540: 50 5f 4a 75 6d 70 2c 20 0a 20 20 20 20 20 20 73  P_Jump, .      s
e550: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
e560: 74 41 64 64 72 28 76 29 2b 31 2c 20 61 64 64 72  tAddr(v)+1, addr
e570: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
e580: 72 65 6e 74 41 64 64 72 28 76 29 2b 31 0a 20 20  rentAddr(v)+1.  
e590: 20 20 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76    );.    VdbeCov
e5a0: 65 72 61 67 65 45 71 4e 65 28 76 29 3b 0a 20 20  erageEqNe(v);.  
e5b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e5c0: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op3(v, OP_Copy, 
e5d0: 72 65 67 4e 65 77 2c 20 72 65 67 4f 6c 64 2c 20  regNew, regOld, 
e5e0: 6e 56 61 6c 2d 31 29 3b 0a 20 20 7d 65 6c 73 65  nVal-1);.  }else
e5f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
e600: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
e610: 74 6f 2c 20 30 2c 20 61 64 64 72 29 3b 0a 20 20  to, 0, addr);.  
e620: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
e630: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
e640: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 67 65  ed as part of ge
e650: 6e 65 72 61 74 69 6e 67 20 56 4d 20 70 72 6f 67  nerating VM prog
e660: 72 61 6d 73 20 66 6f 72 20 52 41 4e 47 45 0a 2a  rams for RANGE.*
e670: 2a 20 6f 66 66 73 65 74 20 50 52 45 43 45 44 49  * offset PRECEDI
e680: 4e 47 2f 46 4f 4c 4c 4f 57 49 4e 47 20 66 72 61  NG/FOLLOWING fra
e690: 6d 65 20 62 6f 75 6e 64 61 72 69 65 73 2e 20 41  me boundaries. A
e6a0: 73 73 75 6d 69 6e 67 20 22 41 53 43 22 20 6f 72  ssuming "ASC" or
e6b0: 64 65 72 20 66 6f 72 0a 2a 2a 20 74 68 65 20 4f  der for.** the O
e6c0: 52 44 45 52 20 42 59 20 74 65 72 6d 20 69 6e 20  RDER BY term in 
e6d0: 74 68 65 20 77 69 6e 64 6f 77 2c 20 69 74 20 67  the window, it g
e6e0: 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 65 71  enerates code eq
e6f0: 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 2a 2a 0a  uivalent to:.**.
e700: 2a 2a 20 20 20 69 66 28 20 63 73 72 31 2e 70 65  **   if( csr1.pe
e710: 65 72 56 61 6c 20 2b 20 72 65 67 56 61 6c 20 3e  erVal + regVal >
e720: 3d 20 63 73 72 32 2e 70 65 65 72 56 61 6c 20 29  = csr2.peerVal )
e730: 20 67 6f 74 6f 20 6c 62 6c 3b 0a 2a 2a 0a 2a 2a   goto lbl;.**.**
e740: 20 41 20 73 70 65 63 69 61 6c 20 74 79 70 65 20   A special type 
e750: 6f 66 20 61 72 69 74 68 6d 65 74 69 63 20 69 73  of arithmetic is
e760: 20 75 73 65 64 20 73 75 63 68 20 74 68 61 74 20   used such that 
e770: 69 66 20 63 73 72 2e 70 65 65 72 56 61 6c 20 69  if csr.peerVal i
e780: 73 20 6e 6f 74 0a 2a 2a 20 61 20 6e 75 6d 65 72  s not.** a numer
e790: 69 63 20 74 79 70 65 20 28 72 65 61 6c 20 6f 72  ic type (real or
e7a0: 20 69 6e 74 65 67 65 72 29 2c 20 74 68 65 6e 20   integer), then 
e7b0: 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
e7c0: 65 20 61 64 64 69 74 69 6f 6e 20 69 73 0a 2a 2a  e addition is.**
e7d0: 20 61 20 63 6f 70 79 20 6f 66 20 63 73 72 31 2e   a copy of csr1.
e7e0: 70 65 65 72 56 61 6c 2e 0a 2a 2f 0a 73 74 61 74  peerVal..*/.stat
e7f0: 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 43 6f  ic void windowCo
e800: 64 65 52 61 6e 67 65 54 65 73 74 28 0a 20 20 57  deRangeTest(.  W
e810: 69 6e 64 6f 77 43 6f 64 65 41 72 67 20 2a 70 2c  indowCodeArg *p,
e820: 20 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20   .  int op,     
e830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e840: 20 20 20 20 20 2f 2a 20 4f 50 5f 47 65 20 6f 72       /* OP_Ge or
e850: 20 4f 50 5f 47 74 20 2a 2f 0a 20 20 69 6e 74 20   OP_Gt */.  int 
e860: 63 73 72 31 2c 20 0a 20 20 69 6e 74 20 72 65 67  csr1, .  int reg
e870: 56 61 6c 2c 20 0a 20 20 69 6e 74 20 63 73 72 32  Val, .  int csr2
e880: 2c 0a 20 20 69 6e 74 20 6c 62 6c 0a 29 7b 0a 20  ,.  int lbl.){. 
e890: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
e8a0: 20 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 56 64   p->pParse;.  Vd
e8b0: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
e8c0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
e8d0: 20 20 69 6e 74 20 72 65 67 31 20 3d 20 73 71 6c    int reg1 = sql
e8e0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
e8f0: 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 65  Parse);.  int re
e900: 67 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  g2 = sqlite3GetT
e910: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
e920: 20 20 69 6e 74 20 61 72 69 74 68 20 3d 20 4f 50    int arith = OP
e930: 5f 41 64 64 3b 0a 20 20 69 6e 74 20 61 64 64 72  _Add;.  int addr
e940: 47 65 3b 0a 0a 20 20 69 6e 74 20 72 65 67 53 74  Ge;..  int regSt
e950: 72 69 6e 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d  ring = ++pParse-
e960: 3e 6e 4d 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74  >nMem;..  assert
e970: 28 20 6f 70 3d 3d 4f 50 5f 47 65 20 7c 7c 20 6f  ( op==OP_Ge || o
e980: 70 3d 3d 4f 50 5f 47 74 20 7c 7c 20 6f 70 3d 3d  p==OP_Gt || op==
e990: 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Le );.  asser
e9a0: 74 28 20 70 2d 3e 70 4d 57 69 6e 2d 3e 70 4f 72  t( p->pMWin->pOr
e9b0: 64 65 72 42 79 20 26 26 20 70 2d 3e 70 4d 57 69  derBy && p->pMWi
e9c0: 6e 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  n->pOrderBy->nEx
e9d0: 70 72 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70  pr==1 );.  if( p
e9e0: 2d 3e 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42  ->pMWin->pOrderB
e9f0: 79 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65  y->a[0].sortOrde
ea00: 72 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28  r ){.    switch(
ea10: 20 6f 70 20 29 7b 0a 20 20 20 20 20 20 63 61 73   op ){.      cas
ea20: 65 20 4f 50 5f 47 65 3a 20 6f 70 20 3d 20 4f 50  e OP_Ge: op = OP
ea30: 5f 4c 65 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  _Le; break;.    
ea40: 20 20 63 61 73 65 20 4f 50 5f 47 74 3a 20 6f 70    case OP_Gt: op
ea50: 20 3d 20 4f 50 5f 4c 74 3b 20 62 72 65 61 6b 3b   = OP_Lt; break;
ea60: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20  .      default: 
ea70: 61 73 73 65 72 74 28 20 6f 70 3d 3d 4f 50 5f 4c  assert( op==OP_L
ea80: 65 20 29 3b 20 6f 70 20 3d 20 4f 50 5f 47 65 3b  e ); op = OP_Ge;
ea90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
eaa0: 20 20 61 72 69 74 68 20 3d 20 4f 50 5f 53 75 62    arith = OP_Sub
eab0: 74 72 61 63 74 3b 0a 20 20 7d 0a 0a 20 20 77 69  tract;.  }..  wi
eac0: 6e 64 6f 77 52 65 61 64 50 65 65 72 56 61 6c 75  ndowReadPeerValu
ead0: 65 73 28 70 2c 20 63 73 72 31 2c 20 72 65 67 31  es(p, csr1, reg1
eae0: 29 3b 0a 20 20 77 69 6e 64 6f 77 52 65 61 64 50  );.  windowReadP
eaf0: 65 65 72 56 61 6c 75 65 73 28 70 2c 20 63 73 72  eerValues(p, csr
eb00: 32 2c 20 72 65 67 32 29 3b 0a 0a 20 20 2f 2a 20  2, reg2);..  /* 
eb10: 43 68 65 63 6b 20 69 66 20 74 68 65 20 70 65 65  Check if the pee
eb20: 72 20 76 61 6c 75 65 20 66 6f 72 20 63 73 72 31  r value for csr1
eb30: 20 76 61 6c 75 65 20 69 73 20 61 20 74 65 78 74   value is a text
eb40: 20 6f 72 20 62 6c 6f 62 20 62 79 20 63 6f 6d 70   or blob by comp
eb50: 61 72 69 6e 67 0a 20 20 2a 2a 20 69 74 20 74 6f  aring.  ** it to
eb60: 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 70 6f   the smallest po
eb70: 73 73 69 62 6c 65 20 73 74 72 69 6e 67 20 2d 20  ssible string - 
eb80: 27 27 2e 20 49 66 20 69 74 20 69 73 2c 20 6a 75  ''. If it is, ju
eb90: 6d 70 20 6f 76 65 72 20 74 68 65 0a 20 20 2a 2a  mp over the.  **
eba0: 20 4f 50 5f 41 64 64 20 6f 72 20 4f 50 5f 53 75   OP_Add or OP_Su
ebb0: 62 74 72 61 63 74 20 6f 70 65 72 61 74 69 6f 6e  btract operation
ebc0: 20 61 6e 64 20 70 72 6f 63 65 65 64 20 64 69 72   and proceed dir
ebd0: 65 63 74 6c 79 20 74 6f 20 74 68 65 20 63 6f 6d  ectly to the com
ebe0: 70 61 72 69 73 6f 6e 2e 20 2a 2f 0a 20 20 73 71  parison. */.  sq
ebf0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
ec00: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
ec10: 2c 20 72 65 67 53 74 72 69 6e 67 2c 20 30 2c 20  , regString, 0, 
ec20: 22 22 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  "", P4_STATIC);.
ec30: 20 20 61 64 64 72 47 65 20 3d 20 73 71 6c 69 74    addrGe = sqlit
ec40: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
ec50: 4f 50 5f 47 65 2c 20 72 65 67 53 74 72 69 6e 67  OP_Ge, regString
ec60: 2c 20 30 2c 20 72 65 67 31 29 3b 0a 20 20 56 64  , 0, reg1);.  Vd
ec70: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
ec80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ec90: 70 33 28 76 2c 20 61 72 69 74 68 2c 20 72 65 67  p3(v, arith, reg
eca0: 56 61 6c 2c 20 72 65 67 31 2c 20 72 65 67 31 29  Val, reg1, reg1)
ecb0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  ;.  sqlite3VdbeJ
ecc0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 47  umpHere(v, addrG
ecd0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e);.  sqlite3Vdb
ece0: 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72  eAddOp3(v, op, r
ecf0: 65 67 32 2c 20 6c 62 6c 2c 20 72 65 67 31 29 3b  eg2, lbl, reg1);
ed00: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
ed10: 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45  angeP5(v, SQLITE
ed20: 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 56 64 62 65  _NULLEQ);.  Vdbe
ed30: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
ed40: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
ed50: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
ed60: 67 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  g1);.  sqlite3Re
ed70: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
ed80: 72 73 65 2c 20 72 65 67 32 29 3b 0a 7d 0a 0a 2f  rse, reg2);.}../
ed90: 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
eda0: 74 69 6f 6e 20 66 6f 72 20 73 71 6c 69 74 65 33  tion for sqlite3
edb0: 57 69 6e 64 6f 77 43 6f 64 65 53 74 65 70 28 29  WindowCodeStep()
edc0: 2e 20 45 61 63 68 20 63 61 6c 6c 20 74 6f 20 74  . Each call to t
edd0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
ede0: 67 65 6e 65 72 61 74 65 73 20 56 4d 20 63 6f 64  generates VM cod
edf0: 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 52  e for a single R
ee00: 45 54 55 52 4e 5f 52 4f 57 2c 20 41 47 47 53 54  ETURN_ROW, AGGST
ee10: 45 50 20 6f 72 20 41 47 47 49 4e 56 45 52 53 45  EP or AGGINVERSE
ee20: 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20   .** operation. 
ee30: 52 65 66 65 72 20 74 6f 20 74 68 65 20 68 65 61  Refer to the hea
ee40: 64 65 72 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 20  der comment for 
ee50: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64  sqlite3WindowCod
ee60: 65 53 74 65 70 28 29 20 66 6f 72 0a 2a 2a 20 64  eStep() for.** d
ee70: 65 74 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69  etails..*/.stati
ee80: 63 20 69 6e 74 20 77 69 6e 64 6f 77 43 6f 64 65  c int windowCode
ee90: 4f 70 28 0a 20 57 69 6e 64 6f 77 43 6f 64 65 41  Op(. WindowCodeA
eea0: 72 67 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  rg *p,          
eeb0: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74        /* Context
eec0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 69 6e 74 20   object */. int 
eed0: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
eee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
eef0: 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f  WINDOW_RETURN_RO
ef00: 57 2c 20 41 47 47 53 54 45 50 20 6f 72 20 41 47  W, AGGSTEP or AG
ef10: 47 49 4e 56 45 52 53 45 20 2a 2f 0a 20 69 6e 74  GINVERSE */. int
ef20: 20 72 65 67 43 6f 75 6e 74 64 6f 77 6e 2c 20 20   regCountdown,  
ef30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ef40: 20 52 65 67 69 73 74 65 72 20 66 6f 72 20 4f 50   Register for OP
ef50: 5f 49 66 50 6f 73 20 63 6f 75 6e 74 64 6f 77 6e  _IfPos countdown
ef60: 20 2a 2f 0a 20 69 6e 74 20 6a 75 6d 70 4f 6e 45   */. int jumpOnE
ef70: 6f 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20  of              
ef80: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
ef90: 72 65 20 69 66 20 73 74 65 70 70 65 64 20 63 75  re if stepped cu
efa0: 72 73 6f 72 20 72 65 61 63 68 65 73 20 45 4f 46  rsor reaches EOF
efb0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 63 73 72   */.){.  int csr
efc0: 2c 20 72 65 67 3b 0a 20 20 50 61 72 73 65 20 2a  , reg;.  Parse *
efd0: 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72  pParse = p->pPar
efe0: 73 65 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d  se;.  Window *pM
eff0: 57 69 6e 20 3d 20 70 2d 3e 70 4d 57 69 6e 3b 0a  Win = p->pMWin;.
f000: 20 20 69 6e 74 20 72 65 74 20 3d 20 30 3b 0a 20    int ret = 0;. 
f010: 20 56 64 62 65 20 2a 76 20 3d 20 70 2d 3e 70 56   Vdbe *v = p->pV
f020: 64 62 65 3b 0a 20 20 69 6e 74 20 61 64 64 72 49  dbe;.  int addrI
f030: 66 20 3d 20 30 3b 20 0a 20 20 69 6e 74 20 61 64  f = 0; .  int ad
f040: 64 72 43 6f 6e 74 69 6e 75 65 20 3d 20 30 3b 0a  drContinue = 0;.
f050: 20 20 69 6e 74 20 61 64 64 72 47 6f 74 6f 20 3d    int addrGoto =
f060: 20 30 3b 0a 20 20 69 6e 74 20 62 50 65 65 72 20   0;.  int bPeer 
f070: 3d 20 28 70 4d 57 69 6e 2d 3e 65 54 79 70 65 21  = (pMWin->eType!
f080: 3d 54 4b 5f 52 4f 57 53 29 3b 0a 0a 20 20 69 6e  =TK_ROWS);..  in
f090: 74 20 6c 62 6c 44 6f 6e 65 20 3d 20 73 71 6c 69  t lblDone = sqli
f0a0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
f0b0: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
f0c0: 61 64 64 72 4e 65 78 74 52 61 6e 67 65 20 3d 20  addrNextRange = 
f0d0: 30 3b 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c  0;..  /* Special
f0e0: 20 63 61 73 65 20 2d 20 57 49 4e 44 4f 57 5f 41   case - WINDOW_A
f0f0: 47 47 49 4e 56 45 52 53 45 20 69 73 20 61 6c 77  GGINVERSE is alw
f100: 61 79 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74  ays a no-op if t
f110: 68 65 20 66 72 61 6d 65 0a 20 20 2a 2a 20 73 74  he frame.  ** st
f120: 61 72 74 73 20 77 69 74 68 20 55 4e 42 4f 55 4e  arts with UNBOUN
f130: 44 45 44 20 50 52 45 43 45 44 49 4e 47 2e 20 2a  DED PRECEDING. *
f140: 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 57 49 4e 44  /.  if( op==WIND
f150: 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 20 26 26  OW_AGGINVERSE &&
f160: 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d   pMWin->eStart==
f170: 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a  TK_UNBOUNDED ){.
f180: 20 20 20 20 61 73 73 65 72 74 28 20 72 65 67 43      assert( regC
f190: 6f 75 6e 74 64 6f 77 6e 3d 3d 30 20 26 26 20 6a  ountdown==0 && j
f1a0: 75 6d 70 4f 6e 45 6f 66 3d 3d 30 20 29 3b 0a 20  umpOnEof==0 );. 
f1b0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
f1c0: 0a 0a 20 20 69 66 28 20 72 65 67 43 6f 75 6e 74  ..  if( regCount
f1d0: 64 6f 77 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66  down>0 ){.    if
f1e0: 28 20 70 4d 57 69 6e 2d 3e 65 54 79 70 65 3d 3d  ( pMWin->eType==
f1f0: 54 4b 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20  TK_RANGE ){.    
f200: 20 20 61 64 64 72 4e 65 78 74 52 61 6e 67 65 20    addrNextRange 
f210: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
f220: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
f230: 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 57     assert( op==W
f240: 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45  INDOW_AGGINVERSE
f250: 20 7c 7c 20 6f 70 3d 3d 57 49 4e 44 4f 57 5f 41   || op==WINDOW_A
f260: 47 47 53 54 45 50 20 29 3b 0a 20 20 20 20 20 20  GGSTEP );.      
f270: 69 66 28 20 6f 70 3d 3d 57 49 4e 44 4f 57 5f 41  if( op==WINDOW_A
f280: 47 47 49 4e 56 45 52 53 45 20 29 7b 0a 20 20 20  GGINVERSE ){.   
f290: 20 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e       if( pMWin->
f2a0: 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f  eStart==TK_FOLLO
f2b0: 57 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 20 20  WING ){.        
f2c0: 20 20 77 69 6e 64 6f 77 43 6f 64 65 52 61 6e 67    windowCodeRang
f2d0: 65 54 65 73 74 28 0a 20 20 20 20 20 20 20 20 20  eTest(.         
f2e0: 20 20 20 20 20 70 2c 20 4f 50 5f 4c 65 2c 20 70       p, OP_Le, p
f2f0: 2d 3e 63 75 72 72 65 6e 74 2e 63 73 72 2c 20 72  ->current.csr, r
f300: 65 67 43 6f 75 6e 74 64 6f 77 6e 2c 20 70 2d 3e  egCountdown, p->
f310: 73 74 61 72 74 2e 63 73 72 2c 20 6c 62 6c 44 6f  start.csr, lblDo
f320: 6e 65 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  ne.          );.
f330: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
f340: 20 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43           windowC
f350: 6f 64 65 52 61 6e 67 65 54 65 73 74 28 0a 20 20  odeRangeTest(.  
f360: 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 4f              p, O
f370: 50 5f 47 65 2c 20 70 2d 3e 73 74 61 72 74 2e 63  P_Ge, p->start.c
f380: 73 72 2c 20 72 65 67 43 6f 75 6e 74 64 6f 77 6e  sr, regCountdown
f390: 2c 20 70 2d 3e 63 75 72 72 65 6e 74 2e 63 73 72  , p->current.csr
f3a0: 2c 20 6c 62 6c 44 6f 6e 65 0a 20 20 20 20 20 20  , lblDone.      
f3b0: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d      );.        }
f3c0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
f3d0: 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65        windowCode
f3e0: 52 61 6e 67 65 54 65 73 74 28 0a 20 20 20 20 20  RangeTest(.     
f3f0: 20 20 20 20 20 20 20 70 2c 20 4f 50 5f 47 74 2c         p, OP_Gt,
f400: 20 70 2d 3e 65 6e 64 2e 63 73 72 2c 20 72 65 67   p->end.csr, reg
f410: 43 6f 75 6e 74 64 6f 77 6e 2c 20 70 2d 3e 63 75  Countdown, p->cu
f420: 72 72 65 6e 74 2e 63 73 72 2c 20 6c 62 6c 44 6f  rrent.csr, lblDo
f430: 6e 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  ne.        );.  
f440: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
f450: 0a 20 20 20 20 20 20 61 64 64 72 49 66 20 3d 20  .      addrIf = 
f460: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f470: 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 72  3(v, OP_IfPos, r
f480: 65 67 43 6f 75 6e 74 64 6f 77 6e 2c 20 30 2c 20  egCountdown, 0, 
f490: 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  1);.      VdbeCo
f4a0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d  verage(v);.    }
f4b0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f 70 3d 3d  .  }..  if( op==
f4c0: 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f  WINDOW_RETURN_RO
f4d0: 57 20 26 26 20 70 4d 57 69 6e 2d 3e 72 65 67 53  W && pMWin->regS
f4e0: 74 61 72 74 52 6f 77 69 64 3d 3d 30 20 29 7b 0a  tartRowid==0 ){.
f4f0: 20 20 20 20 77 69 6e 64 6f 77 41 67 67 46 69 6e      windowAggFin
f500: 61 6c 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  al(p, 0);.  }.  
f510: 61 64 64 72 43 6f 6e 74 69 6e 75 65 20 3d 20 73  addrContinue = s
f520: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
f530: 74 41 64 64 72 28 76 29 3b 0a 20 20 73 77 69 74  tAddr(v);.  swit
f540: 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
f550: 73 65 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e  se WINDOW_RETURN
f560: 5f 52 4f 57 3a 0a 20 20 20 20 20 20 63 73 72 20  _ROW:.      csr 
f570: 3d 20 70 2d 3e 63 75 72 72 65 6e 74 2e 63 73 72  = p->current.csr
f580: 3b 0a 20 20 20 20 20 20 72 65 67 20 3d 20 70 2d  ;.      reg = p-
f590: 3e 63 75 72 72 65 6e 74 2e 72 65 67 3b 0a 20 20  >current.reg;.  
f5a0: 20 20 20 20 77 69 6e 64 6f 77 52 65 74 75 72 6e      windowReturn
f5b0: 4f 6e 65 52 6f 77 28 70 29 3b 0a 20 20 20 20 20  OneRow(p);.     
f5c0: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
f5d0: 65 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45  e WINDOW_AGGINVE
f5e0: 52 53 45 3a 0a 20 20 20 20 20 20 63 73 72 20 3d  RSE:.      csr =
f5f0: 20 70 2d 3e 73 74 61 72 74 2e 63 73 72 3b 0a 20   p->start.csr;. 
f600: 20 20 20 20 20 72 65 67 20 3d 20 70 2d 3e 73 74       reg = p->st
f610: 61 72 74 2e 72 65 67 3b 0a 20 20 20 20 20 20 69  art.reg;.      i
f620: 66 28 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61  f( pMWin->regSta
f630: 72 74 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  rtRowid ){.     
f640: 20 20 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e     assert( pMWin
f650: 2d 3e 72 65 67 45 6e 64 52 6f 77 69 64 20 29 3b  ->regEndRowid );
f660: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f670: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
f680: 5f 41 64 64 49 6d 6d 2c 20 70 4d 57 69 6e 2d 3e  _AddImm, pMWin->
f690: 72 65 67 53 74 61 72 74 52 6f 77 69 64 2c 20 31  regStartRowid, 1
f6a0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
f6b0: 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 41 67          windowAg
f6c0: 67 53 74 65 70 28 70 50 61 72 73 65 2c 20 70 4d  gStep(pParse, pM
f6d0: 57 69 6e 2c 20 63 73 72 2c 20 31 2c 20 70 2d 3e  Win, csr, 1, p->
f6e0: 72 65 67 41 72 67 29 3b 0a 20 20 20 20 20 20 7d  regArg);.      }
f6f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
f700: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
f710: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 57 49    assert( op==WI
f720: 4e 44 4f 57 5f 41 47 47 53 54 45 50 20 29 3b 0a  NDOW_AGGSTEP );.
f730: 20 20 20 20 20 20 63 73 72 20 3d 20 70 2d 3e 65        csr = p->e
f740: 6e 64 2e 63 73 72 3b 0a 20 20 20 20 20 20 72 65  nd.csr;.      re
f750: 67 20 3d 20 70 2d 3e 65 6e 64 2e 72 65 67 3b 0a  g = p->end.reg;.
f760: 20 20 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d        if( pMWin-
f770: 3e 72 65 67 53 74 61 72 74 52 6f 77 69 64 20 29  >regStartRowid )
f780: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
f790: 28 20 70 4d 57 69 6e 2d 3e 72 65 67 45 6e 64 52  ( pMWin->regEndR
f7a0: 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20  owid );.        
f7b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f7c0: 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
f7d0: 70 4d 57 69 6e 2d 3e 72 65 67 45 6e 64 52 6f 77  pMWin->regEndRow
f7e0: 69 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65  id, 1);.      }e
f7f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 77 69 6e  lse{.        win
f800: 64 6f 77 41 67 67 53 74 65 70 28 70 50 61 72 73  dowAggStep(pPars
f810: 65 2c 20 70 4d 57 69 6e 2c 20 63 73 72 2c 20 30  e, pMWin, csr, 0
f820: 2c 20 70 2d 3e 72 65 67 41 72 67 29 3b 0a 20 20  , p->regArg);.  
f830: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
f840: 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f 70  k;.  }..  if( op
f850: 3d 3d 70 2d 3e 65 44 65 6c 65 74 65 20 29 7b 0a  ==p->eDelete ){.
f860: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f870: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65  ddOp1(v, OP_Dele
f880: 74 65 2c 20 63 73 72 29 3b 0a 20 20 20 20 73 71  te, csr);.    sq
f890: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
f8a0: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 53 41 56 45  5(v, OPFLAG_SAVE
f8b0: 50 4f 53 49 54 49 4f 4e 29 3b 0a 20 20 7d 0a 0a  POSITION);.  }..
f8c0: 20 20 69 66 28 20 6a 75 6d 70 4f 6e 45 6f 66 20    if( jumpOnEof 
f8d0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
f8e0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
f8f0: 65 78 74 2c 20 63 73 72 2c 20 73 71 6c 69 74 65  ext, csr, sqlite
f900: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
f910: 28 76 29 2b 32 29 3b 0a 20 20 20 20 56 64 62 65  (v)+2);.    Vdbe
f920: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
f930: 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64   ret = sqlite3Vd
f940: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47  beAddOp0(v, OP_G
f950: 6f 74 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  oto);.  }else{. 
f960: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f970: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
f980: 20 63 73 72 2c 20 73 71 6c 69 74 65 33 56 64 62   csr, sqlite3Vdb
f990: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
f9a0: 31 2b 62 50 65 65 72 29 3b 0a 20 20 20 20 56 64  1+bPeer);.    Vd
f9b0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
f9c0: 20 20 20 69 66 28 20 62 50 65 65 72 20 29 7b 0a     if( bPeer ){.
f9d0: 20 20 20 20 20 20 61 64 64 72 47 6f 74 6f 20 3d        addrGoto =
f9e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f9f0: 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a  p0(v, OP_Goto);.
fa00: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
fa10: 20 62 50 65 65 72 20 29 7b 0a 20 20 20 20 69 6e   bPeer ){.    in
fa20: 74 20 6e 52 65 67 20 3d 20 28 70 4d 57 69 6e 2d  t nReg = (pMWin-
fa30: 3e 70 4f 72 64 65 72 42 79 20 3f 20 70 4d 57 69  >pOrderBy ? pMWi
fa40: 6e 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  n->pOrderBy->nEx
fa50: 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74  pr : 0);.    int
fa60: 20 72 65 67 54 6d 70 20 3d 20 28 6e 52 65 67 20   regTmp = (nReg 
fa70: 3f 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  ? sqlite3GetTemp
fa80: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 52  Range(pParse, nR
fa90: 65 67 29 20 3a 20 30 29 3b 0a 20 20 20 20 77 69  eg) : 0);.    wi
faa0: 6e 64 6f 77 52 65 61 64 50 65 65 72 56 61 6c 75  ndowReadPeerValu
fab0: 65 73 28 70 2c 20 63 73 72 2c 20 72 65 67 54 6d  es(p, csr, regTm
fac0: 70 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 49 66  p);.    windowIf
fad0: 4e 65 77 50 65 65 72 28 70 50 61 72 73 65 2c 20  NewPeer(pParse, 
fae0: 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 2c  pMWin->pOrderBy,
faf0: 20 72 65 67 54 6d 70 2c 20 72 65 67 2c 20 61 64   regTmp, reg, ad
fb00: 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20  drContinue);.   
fb10: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
fb20: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
fb30: 20 72 65 67 54 6d 70 2c 20 6e 52 65 67 29 3b 0a   regTmp, nReg);.
fb40: 20 20 7d 0a 0a 20 20 69 66 28 20 61 64 64 72 4e    }..  if( addrN
fb50: 65 78 74 52 61 6e 67 65 20 29 7b 0a 20 20 20 20  extRange ){.    
fb60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fb70: 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
fb80: 20 61 64 64 72 4e 65 78 74 52 61 6e 67 65 29 3b   addrNextRange);
fb90: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
fba0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
fbb0: 2c 20 6c 62 6c 44 6f 6e 65 29 3b 0a 20 20 69 66  , lblDone);.  if
fbc0: 28 20 61 64 64 72 47 6f 74 6f 20 29 20 73 71 6c  ( addrGoto ) sql
fbd0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
fbe0: 28 76 2c 20 61 64 64 72 47 6f 74 6f 29 3b 0a 20  (v, addrGoto);. 
fbf0: 20 69 66 28 20 61 64 64 72 49 66 20 29 20 73 71   if( addrIf ) sq
fc00: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
fc10: 65 28 76 2c 20 61 64 64 72 49 66 29 3b 0a 20 20  e(v, addrIf);.  
fc20: 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 0a  return ret;.}...
fc30: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
fc40: 6e 64 20 72 65 74 75 72 6e 20 61 20 64 75 70 6c  nd return a dupl
fc50: 69 63 61 74 65 20 6f 66 20 74 68 65 20 57 69 6e  icate of the Win
fc60: 64 6f 77 20 6f 62 6a 65 63 74 20 69 6e 64 69 63  dow object indic
fc70: 61 74 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 74  ated by the.** t
fc80: 68 69 72 64 20 61 72 67 75 6d 65 6e 74 2e 20 53  hird argument. S
fc90: 65 74 20 74 68 65 20 57 69 6e 64 6f 77 2e 70 4f  et the Window.pO
fca0: 77 6e 65 72 20 66 69 65 6c 64 20 6f 66 20 74 68  wner field of th
fcb0: 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 74 6f 0a  e new object to.
fcc0: 2a 2a 20 70 4f 77 6e 65 72 2e 0a 2a 2f 0a 57 69  ** pOwner..*/.Wi
fcd0: 6e 64 6f 77 20 2a 73 71 6c 69 74 65 33 57 69 6e  ndow *sqlite3Win
fce0: 64 6f 77 44 75 70 28 73 71 6c 69 74 65 33 20 2a  dowDup(sqlite3 *
fcf0: 64 62 2c 20 45 78 70 72 20 2a 70 4f 77 6e 65 72  db, Expr *pOwner
fd00: 2c 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20 20  , Window *p){.  
fd10: 57 69 6e 64 6f 77 20 2a 70 4e 65 77 20 3d 20 30  Window *pNew = 0
fd20: 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
fd30: 29 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20  ) ){.    pNew = 
fd40: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
fd50: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 57  ero(db, sizeof(W
fd60: 69 6e 64 6f 77 29 29 3b 0a 20 20 20 20 69 66 28  indow));.    if(
fd70: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70   pNew ){.      p
fd80: 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  New->zName = sql
fd90: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
fda0: 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20   p->zName);.    
fdb0: 20 20 70 4e 65 77 2d 3e 70 46 69 6c 74 65 72 20    pNew->pFilter 
fdc0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
fdd0: 28 64 62 2c 20 70 2d 3e 70 46 69 6c 74 65 72 2c  (db, p->pFilter,
fde0: 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d   0);.      pNew-
fdf0: 3e 70 46 75 6e 63 20 3d 20 70 2d 3e 70 46 75 6e  >pFunc = p->pFun
fe00: 63 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  c;.      pNew->p
fe10: 50 61 72 74 69 74 69 6f 6e 20 3d 20 73 71 6c 69  Partition = sqli
fe20: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
fe30: 62 2c 20 70 2d 3e 70 50 61 72 74 69 74 69 6f 6e  b, p->pPartition
fe40: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  , 0);.      pNew
fe50: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c  ->pOrderBy = sql
fe60: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
fe70: 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  db, p->pOrderBy,
fe80: 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d   0);.      pNew-
fe90: 3e 65 54 79 70 65 20 3d 20 70 2d 3e 65 54 79 70  >eType = p->eTyp
fea0: 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 65  e;.      pNew->e
feb0: 45 6e 64 20 3d 20 70 2d 3e 65 45 6e 64 3b 0a 20  End = p->eEnd;. 
fec0: 20 20 20 20 20 70 4e 65 77 2d 3e 65 53 74 61 72       pNew->eStar
fed0: 74 20 3d 20 70 2d 3e 65 53 74 61 72 74 3b 0a 20  t = p->eStart;. 
fee0: 20 20 20 20 20 70 4e 65 77 2d 3e 65 45 78 63 6c       pNew->eExcl
fef0: 75 64 65 20 3d 20 70 2d 3e 65 45 78 63 6c 75 64  ude = p->eExclud
ff00: 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  e;.      pNew->p
ff10: 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 45  Start = sqlite3E
ff20: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 53  xprDup(db, p->pS
ff30: 74 61 72 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  tart, 0);.      
ff40: 70 4e 65 77 2d 3e 70 45 6e 64 20 3d 20 73 71 6c  pNew->pEnd = sql
ff50: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
ff60: 70 2d 3e 70 45 6e 64 2c 20 30 29 3b 0a 20 20 20  p->pEnd, 0);.   
ff70: 20 20 20 70 4e 65 77 2d 3e 70 4f 77 6e 65 72 20     pNew->pOwner 
ff80: 3d 20 70 4f 77 6e 65 72 3b 0a 20 20 20 20 7d 0a  = pOwner;.    }.
ff90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
ffa0: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  w;.}../*.** Retu
ffb0: 72 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  rn a copy of the
ffc0: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
ffd0: 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 73 20 70  Window objects p
ffe0: 61 73 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20  assed as the.** 
fff0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
10000 0a 2a 2f 0a 57 69 6e 64 6f 77 20 2a 73 71 6c 69  .*/.Window *sqli
10010 74 65 33 57 69 6e 64 6f 77 4c 69 73 74 44 75 70  te3WindowListDup
10020 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69  (sqlite3 *db, Wi
10030 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 57 69 6e 64  ndow *p){.  Wind
10040 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 57 69 6e 64  ow *pWin;.  Wind
10050 6f 77 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20  ow *pRet = 0;.  
10060 57 69 6e 64 6f 77 20 2a 2a 70 70 20 3d 20 26 70  Window **pp = &p
10070 52 65 74 3b 0a 0a 20 20 66 6f 72 28 70 57 69 6e  Ret;..  for(pWin
10080 3d 70 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70  =p; pWin; pWin=p
10090 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a  Win->pNextWin){.
100a0 20 20 20 20 2a 70 70 20 3d 20 73 71 6c 69 74 65      *pp = sqlite
100b0 33 57 69 6e 64 6f 77 44 75 70 28 64 62 2c 20 30  3WindowDup(db, 0
100c0 2c 20 70 57 69 6e 29 3b 0a 20 20 20 20 69 66 28  , pWin);.    if(
100d0 20 2a 70 70 3d 3d 30 20 29 20 62 72 65 61 6b 3b   *pp==0 ) break;
100e0 0a 20 20 20 20 70 70 20 3d 20 26 28 28 2a 70 70  .    pp = &((*pp
100f0 29 2d 3e 70 4e 65 78 74 57 69 6e 29 3b 0a 20 20  )->pNextWin);.  
10100 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  }..  return pRet
10110 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74  ;.}../*.** sqlit
10120 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 68  e3WhereBegin() h
10130 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
10140 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 53  called for the S
10150 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
10160 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74 68  .** passed as th
10170 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
10180 74 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  t when this func
10190 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 2e  tion is invoked.
101a0 20 49 74 20 67 65 6e 65 72 61 74 65 73 0a 2a 2a   It generates.**
101b0 20 63 6f 64 65 20 74 6f 20 70 6f 70 75 6c 61 74   code to populat
101c0 65 20 74 68 65 20 57 69 6e 64 6f 77 2e 72 65 67  e the Window.reg
101d0 52 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 20  Result register 
101e0 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77 20  for each window 
101f0 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 6e 64  function .** and
10200 20 69 6e 76 6f 6b 65 20 74 68 65 20 73 75 62 2d   invoke the sub-
10210 72 6f 75 74 69 6e 65 20 61 74 20 69 6e 73 74 72  routine at instr
10220 75 63 74 69 6f 6e 20 61 64 64 72 47 6f 73 75 62  uction addrGosub
10230 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 72   once for each r
10240 6f 77 2e 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68  ow..** sqlite3Wh
10250 65 72 65 45 6e 64 28 29 20 69 73 20 61 6c 77 61  ereEnd() is alwa
10260 79 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  ys called before
10270 20 72 65 74 75 72 6e 69 6e 67 2e 20 0a 2a 2a 0a   returning. .**.
10280 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
10290 20 68 61 6e 64 6c 65 73 20 73 65 76 65 72 61 6c   handles several
102a0 20 64 69 66 66 65 72 65 6e 74 20 74 79 70 65 73   different types
102b0 20 6f 66 20 77 69 6e 64 6f 77 20 66 72 61 6d 65   of window frame
102c0 73 2c 20 77 68 69 63 68 0a 2a 2a 20 72 65 71 75  s, which.** requ
102d0 69 72 65 20 73 6c 69 67 68 74 6c 79 20 64 69 66  ire slightly dif
102e0 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 69 6e  ferent processin
102f0 67 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  g. The following
10300 20 70 73 65 75 64 6f 20 63 6f 64 65 20 69 73 0a   pseudo code is.
10310 2a 2a 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  ** used to imple
10320 6d 65 6e 74 20 77 69 6e 64 6f 77 20 66 72 61 6d  ment window fram
10330 65 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  es of the form:.
10340 2a 2a 0a 2a 2a 20 20 20 52 4f 57 53 20 42 45 54  **.**   ROWS BET
10350 57 45 45 4e 20 3c 65 78 70 72 31 3e 20 50 52 45  WEEN <expr1> PRE
10360 43 45 44 49 4e 47 20 41 4e 44 20 3c 65 78 70 72  CEDING AND <expr
10370 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a  2> FOLLOWING.**.
10380 2a 2a 20 4f 74 68 65 72 20 77 69 6e 64 6f 77 20  ** Other window 
10390 66 72 61 6d 65 20 74 79 70 65 73 20 75 73 65 20  frame types use 
103a0 76 61 72 69 61 6e 74 73 20 6f 66 20 74 68 65 20  variants of the 
103b0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
103c0 20 20 20 20 20 2e 2e 2e 20 6c 6f 6f 70 20 73 74       ... loop st
103d0 61 72 74 65 64 20 62 79 20 73 71 6c 69 74 65 33  arted by sqlite3
103e0 57 68 65 72 65 42 65 67 69 6e 28 29 20 2e 2e 2e  WhereBegin() ...
103f0 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 6e 65  .**       if( ne
10400 77 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a  w partition ){.*
10410 2a 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20  *         Gosub 
10420 66 6c 75 73 68 0a 2a 2a 20 20 20 20 20 20 20 7d  flush.**       }
10430 0a 2a 2a 20 20 20 20 20 20 20 49 6e 73 65 72 74  .**       Insert
10440 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20 65 70   new row into ep
10450 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20  h table..**     
10460 20 20 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20    .**       if( 
10470 66 69 72 73 74 20 72 6f 77 20 6f 66 20 70 61 72  first row of par
10480 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20  tition ){.**    
10490 20 20 20 20 20 2f 2f 20 52 65 77 69 6e 64 20 74       // Rewind t
104a0 68 72 65 65 20 63 75 72 73 6f 72 73 2c 20 61 6c  hree cursors, al
104b0 6c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 65 70  l open on the ep
104c0 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20  h table..**     
104d0 20 20 20 20 52 65 77 69 6e 64 28 63 73 72 45 6e      Rewind(csrEn
104e0 64 29 3b 0a 2a 2a 20 20 20 20 20 20 20 20 20 52  d);.**         R
104f0 65 77 69 6e 64 28 63 73 72 53 74 61 72 74 29 3b  ewind(csrStart);
10500 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 65 77 69  .**         Rewi
10510 6e 64 28 63 73 72 43 75 72 72 65 6e 74 29 3b 0a  nd(csrCurrent);.
10520 2a 2a 20 20 20 20 20 20 20 0a 2a 2a 20 20 20 20  **       .**    
10530 20 20 20 20 20 72 65 67 45 6e 64 20 3d 20 3c 65       regEnd = <e
10540 78 70 72 32 3e 20 20 20 20 20 20 20 20 20 20 2f  xpr2>          /
10550 2f 20 46 4f 4c 4c 4f 57 49 4e 47 20 65 78 70 72  / FOLLOWING expr
10560 65 73 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20  ession.**       
10570 20 20 72 65 67 53 74 61 72 74 20 3d 20 3c 65 78    regStart = <ex
10580 70 72 31 3e 20 20 20 20 20 20 20 20 2f 2f 20 50  pr1>        // P
10590 52 45 43 45 44 49 4e 47 20 65 78 70 72 65 73 73  RECEDING express
105a0 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 7d 65 6c  ion.**       }el
105b0 73 65 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 2f  se{.**         /
105c0 2f 20 46 69 72 73 74 20 74 69 6d 65 20 74 68 69  / First time thi
105d0 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
105e0 6e 2c 20 74 68 65 20 65 70 68 20 74 61 62 6c 65  n, the eph table
105f0 20 63 6f 6e 74 61 69 6e 73 20 74 77 6f 20 0a 2a   contains two .*
10600 2a 20 20 20 20 20 20 20 20 20 2f 2f 20 72 6f 77  *         // row
10610 73 2e 20 54 68 65 20 66 69 72 73 74 20 72 6f 77  s. The first row
10620 20 69 6e 20 74 68 65 20 70 61 72 74 69 74 69 6f   in the partitio
10630 6e 2c 20 77 68 69 63 68 20 61 6c 6c 20 74 68 72  n, which all thr
10640 65 65 20 63 75 72 73 6f 72 73 0a 2a 2a 20 20 20  ee cursors.**   
10650 20 20 20 20 20 20 2f 2f 20 63 75 72 72 65 6e 74        // current
10660 6c 79 20 70 6f 69 6e 74 20 74 6f 2c 20 61 6e 64  ly point to, and
10670 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   the following r
10680 6f 77 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 41  ow..**         A
10690 47 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 20 20  GGSTEP.**       
106a0 20 20 69 66 28 20 28 72 65 67 45 6e 64 2d 2d 29    if( (regEnd--)
106b0 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  <=0 ){.**       
106c0 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a      RETURN_ROW.*
106d0 2a 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20  *           if( 
106e0 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20  (regStart--)<=0 
106f0 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ){.**           
10700 20 20 41 47 47 49 4e 56 45 52 53 45 0a 2a 2a 20    AGGINVERSE.** 
10710 20 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20            }.**  
10720 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
10730 20 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20    }.**     }.** 
10740 20 20 20 20 66 6c 75 73 68 3a 0a 2a 2a 20 20 20      flush:.**   
10750 20 20 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20      AGGSTEP.**  
10760 20 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b       while( 1 ){
10770 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 45 54 55  .**         RETU
10780 52 4e 20 52 4f 57 0a 2a 2a 20 20 20 20 20 20 20  RN ROW.**       
10790 20 20 69 66 28 20 63 73 72 43 75 72 72 65 6e 74    if( csrCurrent
107a0 20 69 73 20 45 4f 46 20 29 20 62 72 65 61 6b 3b   is EOF ) break;
107b0 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 66 28 20  .**         if( 
107c0 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20  (regStart--)<=0 
107d0 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ){.**           
107e0 41 67 67 49 6e 76 65 72 73 65 28 63 73 72 53 74  AggInverse(csrSt
107f0 61 72 74 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  art).**         
10800 20 20 4e 65 78 74 28 63 73 72 53 74 61 72 74 29    Next(csrStart)
10810 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a  .**         }.**
10820 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 54         }.**.** T
10830 68 65 20 70 73 65 75 64 6f 2d 63 6f 64 65 20 61  he pseudo-code a
10840 62 6f 76 65 20 75 73 65 73 20 74 68 65 20 66 6f  bove uses the fo
10850 6c 6c 6f 77 69 6e 67 20 73 68 6f 72 74 68 61 6e  llowing shorthan
10860 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 41 47 47 53 54  d:.**.**   AGGST
10870 45 50 3a 20 20 20 20 69 6e 76 6f 6b 65 20 74 68  EP:    invoke th
10880 65 20 61 67 67 72 65 67 61 74 65 20 78 53 74 65  e aggregate xSte
10890 70 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  p() function for
108a0 20 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e   each window fun
108b0 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20  ction.**        
108c0 20 20 20 20 20 20 20 77 69 74 68 20 61 72 67 75         with argu
108d0 6d 65 6e 74 73 20 72 65 61 64 20 66 72 6f 6d 20  ments read from 
108e0 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
108f0 6f 66 20 63 75 72 73 6f 72 20 63 73 72 45 6e 64  of cursor csrEnd
10900 2c 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20  , then.**       
10910 20 20 20 20 20 20 20 20 73 74 65 70 20 63 75 72          step cur
10920 73 6f 72 20 63 73 72 45 6e 64 20 66 6f 72 77 61  sor csrEnd forwa
10930 72 64 20 6f 6e 65 20 72 6f 77 20 28 69 2e 65 2e  rd one row (i.e.
10940 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
10950 74 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 52 45  t())..**.**   RE
10960 54 55 52 4e 5f 52 4f 57 3a 20 72 65 74 75 72 6e  TURN_ROW: return
10970 20 61 20 72 6f 77 20 74 6f 20 74 68 65 20 63 61   a row to the ca
10980 6c 6c 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68  ller based on th
10990 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
109a0 65 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  e .**           
109b0 20 20 20 20 63 75 72 72 65 6e 74 20 72 6f 77 20      current row 
109c0 6f 66 20 63 73 72 43 75 72 72 65 6e 74 20 61 6e  of csrCurrent an
109d0 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  d the current st
109e0 61 74 65 20 6f 66 20 61 6c 6c 20 0a 2a 2a 20 20  ate of all .**  
109f0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 67 67               agg
10a00 72 65 67 61 74 65 73 2e 20 54 68 65 6e 20 73 74  regates. Then st
10a10 65 70 20 63 75 72 73 6f 72 20 63 73 72 43 75 72  ep cursor csrCur
10a20 72 65 6e 74 20 66 6f 72 77 61 72 64 20 6f 6e 65  rent forward one
10a30 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 41 47   row..**.**   AG
10a40 47 49 4e 56 45 52 53 45 3a 20 69 6e 76 6f 6b 65  GINVERSE: invoke
10a50 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 78   the aggregate x
10a60 49 6e 76 65 72 73 65 28 29 20 66 75 6e 63 74 69  Inverse() functi
10a70 6f 6e 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64  on for each wind
10a80 6f 77 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ow .**          
10a90 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 73 20 77       functions w
10aa0 69 74 68 20 61 72 67 75 6d 65 6e 74 73 20 72 65  ith arguments re
10ab0 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72  ad from the curr
10ac0 65 6e 74 20 72 6f 77 20 6f 66 20 63 75 72 73 6f  ent row of curso
10ad0 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
10ae0 20 20 20 63 73 72 53 74 61 72 74 2e 20 54 68 65     csrStart. The
10af0 6e 20 73 74 65 70 20 63 73 72 53 74 61 72 74 20  n step csrStart 
10b00 66 6f 72 77 61 72 64 20 6f 6e 65 20 72 6f 77 2e  forward one row.
10b10 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65  .**.** There are
10b20 20 74 77 6f 20 6f 74 68 65 72 20 52 4f 57 53 20   two other ROWS 
10b30 77 69 6e 64 6f 77 20 66 72 61 6d 65 73 20 74 68  window frames th
10b40 61 74 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73  at are handled s
10b50 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 2a 2a 20  ignificantly.** 
10b60 64 69 66 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d  differently from
10b70 20 74 68 65 20 61 62 6f 76 65 20 2d 20 22 42 45   the above - "BE
10b80 54 57 45 45 4e 20 3c 65 78 70 72 3e 20 50 52 45  TWEEN <expr> PRE
10b90 43 45 44 49 4e 47 20 41 4e 44 20 3c 65 78 70 72  CEDING AND <expr
10ba0 3e 20 50 52 45 43 45 44 49 4e 47 22 0a 2a 2a 20  > PRECEDING".** 
10bb0 61 6e 64 20 22 42 45 54 57 45 45 4e 20 3c 65 78  and "BETWEEN <ex
10bc0 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e  pr> FOLLOWING AN
10bd0 44 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49  D <expr> FOLLOWI
10be0 4e 47 22 2e 20 54 68 65 73 65 20 61 72 65 20 73  NG". These are s
10bf0 70 65 63 69 61 6c 20 0a 2a 2a 20 63 61 73 65 73  pecial .** cases
10c00 20 62 65 63 61 75 73 65 20 74 68 65 79 20 63 68   because they ch
10c10 61 6e 67 65 20 74 68 65 20 6f 72 64 65 72 20 69  ange the order i
10c20 6e 20 77 68 69 63 68 20 74 68 65 20 74 68 72 65  n which the thre
10c30 65 20 63 75 72 73 6f 72 73 20 28 63 73 72 53 74  e cursors (csrSt
10c40 61 72 74 2c 0a 2a 2a 20 63 73 72 43 75 72 72 65  art,.** csrCurre
10c50 6e 74 20 61 6e 64 20 63 73 72 45 6e 64 29 20 69  nt and csrEnd) i
10c60 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
10c70 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  he ephemeral tab
10c80 6c 65 2e 20 43 61 73 65 73 20 74 68 61 74 0a 2a  le. Cases that.*
10c90 2a 20 75 73 65 20 55 4e 42 4f 55 4e 44 45 44 20  * use UNBOUNDED 
10ca0 6f 72 20 43 55 52 52 45 4e 54 20 52 4f 57 20 61  or CURRENT ROW a
10cb0 72 65 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20  re much simpler 
10cc0 76 61 72 69 61 74 69 6f 6e 73 20 6f 6e 20 6f 6e  variations on on
10cd0 65 20 6f 66 20 74 68 65 73 65 0a 2a 2a 20 74 68  e of these.** th
10ce0 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57  ree..**.**   ROW
10cf0 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31  S BETWEEN <expr1
10d00 3e 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20  > PRECEDING AND 
10d10 3c 65 78 70 72 32 3e 20 50 52 45 43 45 44 49 4e  <expr2> PRECEDIN
10d20 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20  G.**.**     ... 
10d30 6c 6f 6f 70 20 73 74 61 72 74 65 64 20 62 79 20  loop started by 
10d40 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
10d50 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20  n() ....**      
10d60 20 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69   if( new partiti
10d70 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  on ){.**        
10d80 20 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20   Gosub flush.** 
10d90 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20        }.**      
10da0 20 49 6e 73 65 72 74 20 6e 65 77 20 72 6f 77 20   Insert new row 
10db0 69 6e 74 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a  into eph table..
10dc0 2a 2a 20 20 20 20 20 20 20 69 66 28 20 66 69 72  **       if( fir
10dd0 73 74 20 72 6f 77 20 6f 66 20 70 61 72 74 69 74  st row of partit
10de0 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  ion ){.**       
10df0 20 20 52 65 77 69 6e 64 28 63 73 72 45 6e 64 29    Rewind(csrEnd)
10e00 20 3b 20 52 65 77 69 6e 64 28 63 73 72 53 74 61   ; Rewind(csrSta
10e10 72 74 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72  rt) ; Rewind(csr
10e20 43 75 72 72 65 6e 74 29 0a 2a 2a 20 20 20 20 20  Current).**     
10e30 20 20 20 20 72 65 67 45 6e 64 20 3d 20 3c 65 78      regEnd = <ex
10e40 70 72 32 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20  pr2>.**         
10e50 72 65 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72  regStart = <expr
10e60 31 3e 0a 2a 2a 20 20 20 20 20 20 20 7d 65 6c 73  1>.**       }els
10e70 65 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 66  e{.**         if
10e80 28 20 28 72 65 67 45 6e 64 2d 2d 29 3c 3d 30 20  ( (regEnd--)<=0 
10e90 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ){.**           
10ea0 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 20  AGGSTEP.**      
10eb0 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20     }.**         
10ec0 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20  RETURN_ROW.**   
10ed0 20 20 20 20 20 20 69 66 28 20 28 72 65 67 53 74        if( (regSt
10ee0 61 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20  art--)<=0 ){.** 
10ef0 20 20 20 20 20 20 20 20 20 20 41 47 47 49 4e 56            AGGINV
10f00 45 52 53 45 0a 2a 2a 20 20 20 20 20 20 20 20 20  ERSE.**         
10f10 7d 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20  }.**       }.** 
10f20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 66 6c 75      }.**     flu
10f30 73 68 3a 0a 2a 2a 20 20 20 20 20 20 20 69 66 28  sh:.**       if(
10f40 20 28 72 65 67 45 6e 64 2d 2d 29 3c 3d 30 20 29   (regEnd--)<=0 )
10f50 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 47 47  {.**         AGG
10f60 53 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 7d 0a  STEP.**       }.
10f70 2a 2a 20 20 20 20 20 20 20 52 45 54 55 52 4e 5f  **       RETURN_
10f80 52 4f 57 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 52  ROW.**.**.**   R
10f90 4f 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70  OWS BETWEEN <exp
10fa0 72 31 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e  r1> FOLLOWING AN
10fb0 44 20 3c 65 78 70 72 32 3e 20 46 4f 4c 4c 4f 57  D <expr2> FOLLOW
10fc0 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e  ING.**.**     ..
10fd0 2e 20 6c 6f 6f 70 20 73 74 61 72 74 65 64 20 62  . loop started b
10fe0 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
10ff0 67 69 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20  gin() ....**    
11000 20 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69   if( new partiti
11010 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 47  on ){.**       G
11020 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20 20  osub flush.**   
11030 20 20 7d 0a 2a 2a 20 20 20 20 20 49 6e 73 65 72    }.**     Inser
11040 74 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20 65  t new row into e
11050 70 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20  ph table..**    
11060 20 69 66 28 20 66 69 72 73 74 20 72 6f 77 20 6f   if( first row o
11070 66 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a  f partition ){.*
11080 2a 20 20 20 20 20 20 20 52 65 77 69 6e 64 28 63  *       Rewind(c
11090 73 72 45 6e 64 29 20 3b 20 52 65 77 69 6e 64 28  srEnd) ; Rewind(
110a0 63 73 72 53 74 61 72 74 29 20 3b 20 52 65 77 69  csrStart) ; Rewi
110b0 6e 64 28 63 73 72 43 75 72 72 65 6e 74 29 0a 2a  nd(csrCurrent).*
110c0 2a 20 20 20 20 20 20 20 72 65 67 45 6e 64 20 3d  *       regEnd =
110d0 20 3c 65 78 70 72 32 3e 0a 2a 2a 20 20 20 20 20   <expr2>.**     
110e0 20 20 72 65 67 53 74 61 72 74 20 3d 20 72 65 67    regStart = reg
110f0 45 6e 64 20 2d 20 3c 65 78 70 72 31 3e 0a 2a 2a  End - <expr1>.**
11100 20 20 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20       }else{.**  
11110 20 20 20 20 20 41 47 47 53 54 45 50 0a 2a 2a 20       AGGSTEP.** 
11120 20 20 20 20 20 20 69 66 28 20 28 72 65 67 45 6e        if( (regEn
11130 64 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20  d--)<=0 ){.**   
11140 20 20 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57        RETURN_ROW
11150 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  .**       }.**  
11160 20 20 20 20 20 69 66 28 20 28 72 65 67 53 74 61       if( (regSta
11170 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20  rt--)<=0 ){.**  
11180 20 20 20 20 20 20 20 41 47 47 49 4e 56 45 52 53         AGGINVERS
11190 45 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20  E.**       }.** 
111a0 20 20 20 20 7d 0a 2a 2a 20 20 20 7d 0a 2a 2a 20      }.**   }.** 
111b0 20 20 66 6c 75 73 68 3a 0a 2a 2a 20 20 20 20 20    flush:.**     
111c0 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 77  AGGSTEP.**     w
111d0 68 69 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20  hile( 1 ){.**   
111e0 20 20 20 20 69 66 28 20 28 72 65 67 45 6e 64 2d      if( (regEnd-
111f0 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20  -)<=0 ){.**     
11200 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a      RETURN_ROW.*
11210 2a 20 20 20 20 20 20 20 20 20 69 66 28 20 65 6f  *         if( eo
11220 66 20 29 20 62 72 65 61 6b 3b 0a 2a 2a 20 20 20  f ) break;.**   
11230 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 69      }.**       i
11240 66 28 20 28 72 65 67 53 74 61 72 74 2d 2d 29 3c  f( (regStart--)<
11250 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  =0 ){.**        
11260 20 41 47 47 49 4e 56 45 52 53 45 0a 2a 2a 20 20   AGGINVERSE.**  
11270 20 20 20 20 20 20 20 69 66 28 20 65 6f 66 20 29         if( eof )
11280 20 62 72 65 61 6b 0a 2a 2a 20 20 20 20 20 20 20   break.**       
11290 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20  }.**     }.**   
112a0 20 20 77 68 69 6c 65 28 20 21 65 6f 66 20 63 73    while( !eof cs
112b0 72 43 75 72 72 65 6e 74 20 29 7b 0a 2a 2a 20 20  rCurrent ){.**  
112c0 20 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a       RETURN_ROW.
112d0 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 46  **     }.**.** F
112e0 6f 72 20 74 68 65 20 6d 6f 73 74 20 70 61 72 74  or the most part
112f0 2c 20 74 68 65 20 70 61 74 74 65 72 6e 73 20 61  , the patterns a
11300 62 6f 76 65 20 61 72 65 20 61 64 61 70 74 65 64  bove are adapted
11310 20 74 6f 20 73 75 70 70 6f 72 74 20 55 4e 42 4f   to support UNBO
11320 55 4e 44 45 44 20 62 79 0a 2a 2a 20 61 73 73 75  UNDED by.** assu
11330 6d 69 6e 67 20 74 68 61 74 20 69 74 20 69 73 20  ming that it is 
11340 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 22 69  equivalent to "i
11350 6e 66 69 6e 69 74 79 20 50 52 45 43 45 44 49 4e  nfinity PRECEDIN
11360 47 2f 46 4f 4c 4c 4f 57 49 4e 47 22 20 61 6e 64  G/FOLLOWING" and
11370 0a 2a 2a 20 43 55 52 52 45 4e 54 20 52 4f 57 20  .** CURRENT ROW 
11380 62 79 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  by assuming that
11390 20 69 74 20 69 73 20 65 71 75 69 76 69 6c 65 6e   it is equivilen
113a0 74 20 74 6f 20 22 30 20 50 52 45 43 45 44 49 4e  t to "0 PRECEDIN
113b0 47 2f 46 4f 4c 4c 4f 57 49 4e 47 22 2e 0a 2a 2a  G/FOLLOWING"..**
113c0 20 54 68 69 73 20 69 73 20 6f 70 74 69 6d 69 7a   This is optimiz
113d0 65 64 20 6f 66 20 63 6f 75 72 73 65 20 2d 20 62  ed of course - b
113e0 72 61 6e 63 68 65 73 20 74 68 61 74 20 77 69 6c  ranches that wil
113f0 6c 20 6e 65 76 65 72 20 62 65 20 74 61 6b 65 6e  l never be taken
11400 20 61 6e 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f   and.** conditio
11410 6e 73 20 74 68 61 74 20 61 72 65 20 61 6c 77 61  ns that are alwa
11420 79 73 20 74 72 75 65 20 61 72 65 20 6f 6d 69 74  ys true are omit
11430 74 65 64 20 66 72 6f 6d 20 74 68 65 20 56 4d 20  ted from the VM 
11440 63 6f 64 65 2e 20 54 68 65 20 6f 6e 6c 79 0a 2a  code. The only.*
11450 2a 20 65 78 63 65 70 74 69 6f 6e 61 6c 20 63 61  * exceptional ca
11460 73 65 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 52  se is:.**.**   R
11470 4f 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70  OWS BETWEEN <exp
11480 72 31 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e  r1> FOLLOWING AN
11490 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c  D UNBOUNDED FOLL
114a0 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20  OWING.**.**     
114b0 2e 2e 2e 20 6c 6f 6f 70 20 73 74 61 72 74 65 64  ... loop started
114c0 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
114d0 42 65 67 69 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20  Begin() ....**  
114e0 20 20 20 69 66 28 20 6e 65 77 20 70 61 72 74 69     if( new parti
114f0 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20  tion ){.**      
11500 20 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20   Gosub flush.** 
11510 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 49 6e 73      }.**     Ins
11520 65 72 74 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f  ert new row into
11530 20 65 70 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20   eph table..**  
11540 20 20 20 69 66 28 20 66 69 72 73 74 20 72 6f 77     if( first row
11550 20 6f 66 20 70 61 72 74 69 74 69 6f 6e 20 29 7b   of partition ){
11560 0a 2a 2a 20 20 20 20 20 20 20 52 65 77 69 6e 64  .**       Rewind
11570 28 63 73 72 45 6e 64 29 20 3b 20 52 65 77 69 6e  (csrEnd) ; Rewin
11580 64 28 63 73 72 53 74 61 72 74 29 20 3b 20 52 65  d(csrStart) ; Re
11590 77 69 6e 64 28 63 73 72 43 75 72 72 65 6e 74 29  wind(csrCurrent)
115a0 0a 2a 2a 20 20 20 20 20 20 20 72 65 67 53 74 61  .**       regSta
115b0 72 74 20 3d 20 3c 65 78 70 72 31 3e 0a 2a 2a 20  rt = <expr1>.** 
115c0 20 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20      }else{.**   
115d0 20 20 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20      AGGSTEP.**  
115e0 20 20 20 7d 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20     }.**   }.**  
115f0 20 66 6c 75 73 68 3a 0a 2a 2a 20 20 20 20 20 41   flush:.**     A
11600 47 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 77 68  GGSTEP.**     wh
11610 69 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20  ile( 1 ){.**    
11620 20 20 20 69 66 28 20 28 72 65 67 53 74 61 72 74     if( (regStart
11630 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20  --)<=0 ){.**    
11640 20 20 20 20 20 41 47 47 49 4e 56 45 52 53 45 0a       AGGINVERSE.
11650 2a 2a 20 20 20 20 20 20 20 20 20 69 66 28 20 65  **         if( e
11660 6f 66 20 29 20 62 72 65 61 6b 0a 2a 2a 20 20 20  of ) break.**   
11670 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 52      }.**       R
11680 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20  ETURN_ROW.**    
11690 20 7d 0a 2a 2a 20 20 20 20 20 77 68 69 6c 65 28   }.**     while(
116a0 20 21 65 6f 66 20 63 73 72 43 75 72 72 65 6e 74   !eof csrCurrent
116b0 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 52 45 54   ){.**       RET
116c0 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 7d  URN_ROW.**     }
116d0 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 71 75  .**.** Also requ
116e0 69 72 69 6e 67 20 73 70 65 63 69 61 6c 20 68 61  iring special ha
116f0 6e 64 6c 69 6e 67 20 61 72 65 20 74 68 65 20 63  ndling are the c
11700 61 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 4f  ases:.**.**   RO
11710 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72  WS BETWEEN <expr
11720 31 3e 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44  1> PRECEDING AND
11730 20 3c 65 78 70 72 32 3e 20 50 52 45 43 45 44 49   <expr2> PRECEDI
11740 4e 47 0a 2a 2a 20 20 20 52 4f 57 53 20 42 45 54  NG.**   ROWS BET
11750 57 45 45 4e 20 3c 65 78 70 72 31 3e 20 46 4f 4c  WEEN <expr1> FOL
11760 4c 4f 57 49 4e 47 20 41 4e 44 20 3c 65 78 70 72  LOWING AND <expr
11770 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a  2> FOLLOWING.**.
11780 2a 2a 20 77 68 65 6e 20 28 65 78 70 72 31 20 3c  ** when (expr1 <
11790 20 65 78 70 72 32 29 2e 20 54 68 69 73 20 69 73   expr2). This is
117a0 20 64 65 74 65 63 74 65 64 20 61 74 20 72 75 6e   detected at run
117b0 74 69 6d 65 2c 20 6e 6f 74 20 62 79 20 74 68 69  time, not by thi
117c0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 54  s function..** T
117d0 6f 20 68 61 6e 64 6c 65 20 74 68 69 73 20 63 61  o handle this ca
117e0 73 65 2c 20 74 68 65 20 70 73 65 75 64 6f 2d 63  se, the pseudo-c
117f0 6f 64 65 20 70 72 6f 67 72 61 6d 73 20 64 65 70  ode programs dep
11800 69 63 74 65 64 20 61 62 6f 76 65 20 61 72 65 20  icted above are 
11810 6d 6f 64 69 66 69 65 64 0a 2a 2a 20 73 6c 69 67  modified.** slig
11820 68 74 6c 79 20 74 6f 20 62 65 3a 0a 2a 2a 0a 2a  htly to be:.**.*
11830 2a 20 20 20 20 20 2e 2e 2e 20 6c 6f 6f 70 20 73  *     ... loop s
11840 74 61 72 74 65 64 20 62 79 20 73 71 6c 69 74 65  tarted by sqlite
11850 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2e 2e  3WhereBegin() ..
11860 2e 0a 2a 2a 20 20 20 20 20 69 66 28 20 6e 65 77  ..**     if( new
11870 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a   partition ){.**
11880 20 20 20 20 20 20 20 47 6f 73 75 62 20 66 6c 75         Gosub flu
11890 73 68 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20  sh.**     }.**  
118a0 20 20 20 49 6e 73 65 72 74 20 6e 65 77 20 72 6f     Insert new ro
118b0 77 20 69 6e 74 6f 20 65 70 68 20 74 61 62 6c 65  w into eph table
118c0 2e 0a 2a 2a 20 20 20 20 20 69 66 28 20 66 69 72  ..**     if( fir
118d0 73 74 20 72 6f 77 20 6f 66 20 70 61 72 74 69 74  st row of partit
118e0 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  ion ){.**       
118f0 52 65 77 69 6e 64 28 63 73 72 45 6e 64 29 20 3b  Rewind(csrEnd) ;
11900 20 52 65 77 69 6e 64 28 63 73 72 53 74 61 72 74   Rewind(csrStart
11910 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72 43 75  ) ; Rewind(csrCu
11920 72 72 65 6e 74 29 0a 2a 2a 20 20 20 20 20 20 20  rrent).**       
11930 72 65 67 45 6e 64 20 3d 20 3c 65 78 70 72 32 3e  regEnd = <expr2>
11940 0a 2a 2a 20 20 20 20 20 20 20 72 65 67 53 74 61  .**       regSta
11950 72 74 20 3d 20 3c 65 78 70 72 31 3e 0a 2a 2a 20  rt = <expr1>.** 
11960 20 20 20 20 20 20 69 66 28 20 72 65 67 45 6e 64        if( regEnd
11970 20 3c 20 72 65 67 53 74 61 72 74 20 29 7b 0a 2a   < regStart ){.*
11980 2a 20 20 20 20 20 20 20 20 20 52 45 54 55 52 4e  *         RETURN
11990 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 20 20 20 20  _ROW.**         
119a0 64 65 6c 65 74 65 20 65 70 68 20 74 61 62 6c 65  delete eph table
119b0 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 20 20 20   contents.**    
119c0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a       continue.**
119d0 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
119e0 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  ....**.** The ne
119f0 77 20 22 63 6f 6e 74 69 6e 75 65 22 20 73 74 61  w "continue" sta
11a00 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 61 62  tement in the ab
11a10 6f 76 65 20 6a 75 6d 70 73 20 74 6f 20 74 68 65  ove jumps to the
11a20 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 0a   next iteration.
11a30 2a 2a 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  ** of the outer 
11a40 6c 6f 6f 70 20 2d 20 74 68 65 20 6f 6e 65 20 73  loop - the one s
11a50 74 61 72 74 65 64 20 62 79 20 73 71 6c 69 74 65  tarted by sqlite
11a60 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e 0a 2a  3WhereBegin()..*
11a70 2a 0a 2a 2a 20 54 68 65 20 76 61 72 69 6f 75 73  *.** The various
11a80 20 47 52 4f 55 50 53 20 63 61 73 65 73 20 61 72   GROUPS cases ar
11a90 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73  e implemented us
11aa0 69 6e 67 20 74 68 65 20 73 61 6d 65 20 70 61 74  ing the same pat
11ab0 74 65 72 6e 73 20 61 73 0a 2a 2a 20 52 4f 57 53  terns as.** ROWS
11ac0 2e 20 54 68 65 20 56 4d 20 63 6f 64 65 20 69 73  . The VM code is
11ad0 20 6d 6f 64 69 66 69 65 64 20 73 6c 69 67 68 74   modified slight
11ae0 6c 79 20 73 6f 20 74 68 61 74 3a 0a 2a 2a 0a 2a  ly so that:.**.*
11af0 2a 20 20 20 31 2e 20 54 68 65 20 65 6c 73 65 20  *   1. The else 
11b00 62 72 61 6e 63 68 20 69 6e 20 74 68 65 20 6d 61  branch in the ma
11b10 69 6e 20 6c 6f 6f 70 20 69 73 20 6f 6e 6c 79 20  in loop is only 
11b20 74 61 6b 65 6e 20 69 66 20 74 68 65 20 72 6f 77  taken if the row
11b30 20 6a 75 73 74 0a 2a 2a 20 20 20 20 20 20 61 64   just.**      ad
11b40 64 65 64 20 74 6f 20 74 68 65 20 65 70 68 65 6d  ded to the ephem
11b50 65 72 61 6c 20 74 61 62 6c 65 20 69 73 20 74 68  eral table is th
11b60 65 20 73 74 61 72 74 20 6f 66 20 61 20 6e 65 77  e start of a new
11b70 20 67 72 6f 75 70 2e 20 49 6e 0a 2a 2a 20 20 20   group. In.**   
11b80 20 20 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20     other words, 
11b90 69 74 20 62 65 63 6f 6d 65 73 3a 0a 2a 2a 0a 2a  it becomes:.**.*
11ba0 2a 20 20 20 20 20 20 20 20 20 2e 2e 2e 20 6c 6f  *         ... lo
11bb0 6f 70 20 73 74 61 72 74 65 64 20 62 79 20 73 71  op started by sq
11bc0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
11bd0 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20  ) ....**        
11be0 20 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69   if( new partiti
11bf0 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  on ){.**        
11c00 20 20 20 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a     Gosub flush.*
11c10 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  *         }.**  
11c20 20 20 20 20 20 20 20 49 6e 73 65 72 74 20 6e 65         Insert ne
11c30 77 20 72 6f 77 20 69 6e 74 6f 20 65 70 68 20 74  w row into eph t
11c40 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20  able..**        
11c50 20 69 66 28 20 66 69 72 73 74 20 72 6f 77 20 6f   if( first row o
11c60 66 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a  f partition ){.*
11c70 2a 20 20 20 20 20 20 20 20 20 20 20 52 65 77 69  *           Rewi
11c80 6e 64 28 63 73 72 45 6e 64 29 20 3b 20 52 65 77  nd(csrEnd) ; Rew
11c90 69 6e 64 28 63 73 72 53 74 61 72 74 29 20 3b 20  ind(csrStart) ; 
11ca0 52 65 77 69 6e 64 28 63 73 72 43 75 72 72 65 6e  Rewind(csrCurren
11cb0 74 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  t).**           
11cc0 72 65 67 45 6e 64 20 3d 20 3c 65 78 70 72 32 3e  regEnd = <expr2>
11cd0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 72 65  .**           re
11ce0 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72 31 3e  gStart = <expr1>
11cf0 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 65 6c 73  .**         }els
11d00 65 20 69 66 28 20 6e 65 77 20 67 72 6f 75 70 20  e if( new group 
11d10 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ){.**           
11d20 2e 2e 2e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ... .**         
11d30 7d 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 0a  }.**       }.**.
11d40 2a 2a 20 20 20 32 2e 20 49 6e 73 74 65 61 64 20  **   2. Instead 
11d50 6f 66 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20  of processing a 
11d60 73 69 6e 67 6c 65 20 72 6f 77 2c 20 65 61 63 68  single row, each
11d70 20 52 45 54 55 52 4e 5f 52 4f 57 2c 20 41 47 47   RETURN_ROW, AGG
11d80 53 54 45 50 20 6f 72 20 0a 2a 2a 20 20 20 20 20  STEP or .**     
11d90 20 41 47 47 49 4e 56 45 52 53 45 20 73 74 65 70   AGGINVERSE step
11da0 20 70 72 6f 63 65 73 73 65 73 20 74 68 65 20 63   processes the c
11db0 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68  urrent row of th
11dc0 65 20 72 65 6c 65 76 61 6e 74 20 63 75 72 73 6f  e relevant curso
11dd0 72 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 61 6c  r and.**      al
11de0 6c 20 73 75 62 73 65 71 75 65 6e 74 20 72 6f 77  l subsequent row
11df0 73 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74  s belonging to t
11e00 68 65 20 73 61 6d 65 20 67 72 6f 75 70 2e 0a 2a  he same group..*
11e10 2a 0a 2a 2a 20 52 41 4e 47 45 20 77 69 6e 64 6f  *.** RANGE windo
11e20 77 20 66 72 61 6d 65 73 20 61 72 65 20 61 20 6c  w frames are a l
11e30 69 74 74 6c 65 20 64 69 66 66 65 72 65 6e 74 20  ittle different 
11e40 61 67 61 69 6e 2e 20 41 73 20 66 6f 72 20 47 52  again. As for GR
11e50 4f 55 50 53 2c 20 74 68 65 20 0a 2a 2a 20 6d 61  OUPS, the .** ma
11e60 69 6e 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63  in loop runs onc
11e70 65 20 70 65 72 20 67 72 6f 75 70 20 6f 6e 6c 79  e per group only
11e80 2e 20 41 6e 64 20 52 45 54 55 52 4e 5f 52 4f 57  . And RETURN_ROW
11e90 2c 20 41 47 47 53 54 45 50 20 61 6e 64 20 41 47  , AGGSTEP and AG
11ea0 47 49 4e 56 45 52 53 45 0a 2a 2a 20 64 65 61 6c  GINVERSE.** deal
11eb0 20 69 6e 20 67 72 6f 75 70 73 20 69 6e 73 74 65   in groups inste
11ec0 61 64 20 6f 66 20 72 6f 77 73 2e 20 41 73 20 66  ad of rows. As f
11ed0 6f 72 20 52 4f 57 53 20 61 6e 64 20 47 52 4f 55  or ROWS and GROU
11ee0 50 53 2c 20 74 68 65 72 65 20 61 72 65 20 74 68  PS, there are th
11ef0 72 65 65 0a 2a 2a 20 62 61 73 69 63 20 63 61 73  ree.** basic cas
11f00 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e 47  es:.**.**   RANG
11f10 45 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31  E BETWEEN <expr1
11f20 3e 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20  > PRECEDING AND 
11f30 3c 65 78 70 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e  <expr2> FOLLOWIN
11f40 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20  G.**.**     ... 
11f50 6c 6f 6f 70 20 73 74 61 72 74 65 64 20 62 79 20  loop started by 
11f60 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
11f70 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20  n() ....**      
11f80 20 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69   if( new partiti
11f90 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  on ){.**        
11fa0 20 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20   Gosub flush.** 
11fb0 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20        }.**      
11fc0 20 49 6e 73 65 72 74 20 6e 65 77 20 72 6f 77 20   Insert new row 
11fd0 69 6e 74 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a  into eph table..
11fe0 2a 2a 20 20 20 20 20 20 20 69 66 28 20 66 69 72  **       if( fir
11ff0 73 74 20 72 6f 77 20 6f 66 20 70 61 72 74 69 74  st row of partit
12000 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  ion ){.**       
12010 20 20 52 65 77 69 6e 64 28 63 73 72 45 6e 64 29    Rewind(csrEnd)
12020 20 3b 20 52 65 77 69 6e 64 28 63 73 72 53 74 61   ; Rewind(csrSta
12030 72 74 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72  rt) ; Rewind(csr
12040 43 75 72 72 65 6e 74 29 0a 2a 2a 20 20 20 20 20  Current).**     
12050 20 20 20 20 72 65 67 45 6e 64 20 3d 20 3c 65 78      regEnd = <ex
12060 70 72 32 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20  pr2>.**         
12070 72 65 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72  regStart = <expr
12080 31 3e 0a 2a 2a 20 20 20 20 20 20 20 7d 65 6c 73  1>.**       }els
12090 65 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 47  e{.**         AG
120a0 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 20  GSTEP.**        
120b0 20 77 68 69 6c 65 28 20 28 63 73 72 43 75 72 72   while( (csrCurr
120c0 65 6e 74 2e 6b 65 79 20 2b 20 72 65 67 45 6e 64  ent.key + regEnd
120d0 29 20 3c 20 63 73 72 45 6e 64 2e 6b 65 79 20 29  ) < csrEnd.key )
120e0 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 52  {.**           R
120f0 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20  ETURN_ROW.**    
12100 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 63 73         while( cs
12110 72 53 74 61 72 74 2e 6b 65 79 20 2b 20 72 65 67  rStart.key + reg
12120 53 74 61 72 74 29 20 3c 20 63 73 72 43 75 72 72  Start) < csrCurr
12130 65 6e 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20  ent.key ){.**   
12140 20 20 20 20 20 20 20 20 20 20 41 47 47 49 4e 56            AGGINV
12150 45 52 53 45 0a 2a 2a 20 20 20 20 20 20 20 20 20  ERSE.**         
12160 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d    }.**         }
12170 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  .**       }.**  
12180 20 20 20 7d 0a 2a 2a 20 20 20 20 20 66 6c 75 73     }.**     flus
12190 68 3a 0a 2a 2a 20 20 20 20 20 20 20 41 47 47 53  h:.**       AGGS
121a0 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 77 68 69  TEP.**       whi
121b0 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20  le( 1 ){.**     
121c0 20 20 20 20 52 45 54 55 52 4e 20 52 4f 57 0a 2a      RETURN ROW.*
121d0 2a 20 20 20 20 20 20 20 20 20 69 66 28 20 63 73  *         if( cs
121e0 72 43 75 72 72 65 6e 74 20 69 73 20 45 4f 46 20  rCurrent is EOF 
121f0 29 20 62 72 65 61 6b 3b 0a 2a 2a 20 20 20 20 20  ) break;.**     
12200 20 20 20 20 20 20 77 68 69 6c 65 28 20 63 73 72        while( csr
12210 53 74 61 72 74 2e 6b 65 79 20 2b 20 72 65 67 53  Start.key + regS
12220 74 61 72 74 29 20 3c 20 63 73 72 43 75 72 72 65  tart) < csrCurre
12230 6e 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20  nt.key ){.**    
12240 20 20 20 20 20 20 20 20 20 41 47 47 49 4e 56 45           AGGINVE
12250 52 53 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  RSE.**          
12260 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a   }.**         }.
12270 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a  **       }.**.**
12280 20 49 6e 20 74 68 65 20 61 62 6f 76 65 20 6e 6f   In the above no
12290 74 61 74 69 6f 6e 2c 20 22 63 73 72 2e 6b 65 79  tation, "csr.key
122a0 22 20 6d 65 61 6e 73 20 74 68 65 20 63 75 72 72  " means the curr
122b0 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65  ent value of the
122c0 20 4f 52 44 45 52 20 42 59 20 0a 2a 2a 20 65 78   ORDER BY .** ex
122d0 70 72 65 73 73 69 6f 6e 20 28 74 68 65 72 65 20  pression (there 
122e0 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 31 20 66  is only ever 1 f
122f0 6f 72 20 61 20 52 41 4e 47 45 20 74 68 61 74 20  or a RANGE that 
12300 75 73 65 73 20 61 6e 20 3c 65 78 70 72 3e 20 46  uses an <expr> F
12310 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 20 6f 72 20 3c  OLLOWING.** or <
12320 65 78 70 72 20 50 52 45 43 45 44 49 4e 47 29 20  expr PRECEDING) 
12330 72 65 61 64 20 66 72 6f 6d 20 63 75 72 73 6f 72  read from cursor
12340 20 63 73 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 52 41   csr..**.**   RA
12350 4e 47 45 20 42 45 54 57 45 45 4e 20 3c 65 78 70  NGE BETWEEN <exp
12360 72 31 3e 20 50 52 45 43 45 44 49 4e 47 20 41 4e  r1> PRECEDING AN
12370 44 20 3c 65 78 70 72 32 3e 20 50 52 45 43 45 44  D <expr2> PRECED
12380 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e  ING.**.**     ..
12390 2e 20 6c 6f 6f 70 20 73 74 61 72 74 65 64 20 62  . loop started b
123a0 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
123b0 67 69 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20  gin() ....**    
123c0 20 20 20 69 66 28 20 6e 65 77 20 70 61 72 74 69     if( new parti
123d0 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20  tion ){.**      
123e0 20 20 20 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a     Gosub flush.*
123f0 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  *       }.**    
12400 20 20 20 49 6e 73 65 72 74 20 6e 65 77 20 72 6f     Insert new ro
12410 77 20 69 6e 74 6f 20 65 70 68 20 74 61 62 6c 65  w into eph table
12420 2e 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 66  ..**       if( f
12430 69 72 73 74 20 72 6f 77 20 6f 66 20 70 61 72 74  irst row of part
12440 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20  ition ){.**     
12450 20 20 20 20 52 65 77 69 6e 64 28 63 73 72 45 6e      Rewind(csrEn
12460 64 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72 53  d) ; Rewind(csrS
12470 74 61 72 74 29 20 3b 20 52 65 77 69 6e 64 28 63  tart) ; Rewind(c
12480 73 72 43 75 72 72 65 6e 74 29 0a 2a 2a 20 20 20  srCurrent).**   
12490 20 20 20 20 20 20 72 65 67 45 6e 64 20 3d 20 3c        regEnd = <
124a0 65 78 70 72 32 3e 0a 2a 2a 20 20 20 20 20 20 20  expr2>.**       
124b0 20 20 72 65 67 53 74 61 72 74 20 3d 20 3c 65 78    regStart = <ex
124c0 70 72 31 3e 0a 2a 2a 20 20 20 20 20 20 20 7d 65  pr1>.**       }e
124d0 6c 73 65 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  lse{.**         
124e0 77 68 69 6c 65 28 20 28 63 73 72 45 6e 64 2e 6b  while( (csrEnd.k
124f0 65 79 20 2b 20 72 65 67 45 6e 64 29 20 3c 3d 20  ey + regEnd) <= 
12500 63 73 72 43 75 72 72 65 6e 74 2e 6b 65 79 20 29  csrCurrent.key )
12510 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41  {.**           A
12520 47 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 20 20  GGSTEP.**       
12530 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 52    }.**         R
12540 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20  ETURN_ROW.**    
12550 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 73 72       while( (csr
12560 53 74 61 72 74 2e 6b 65 79 20 2b 20 72 65 67 53  Start.key + regS
12570 74 61 72 74 29 20 3c 20 63 73 72 43 75 72 72 65  tart) < csrCurre
12580 6e 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20  nt.key ){.**    
12590 20 20 20 20 20 20 20 41 47 47 49 4e 56 45 52 53         AGGINVERS
125a0 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a  E.**         }.*
125b0 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  *       }.**    
125c0 20 7d 0a 2a 2a 20 20 20 20 20 66 6c 75 73 68 3a   }.**     flush:
125d0 0a 2a 2a 20 20 20 20 20 20 20 77 68 69 6c 65 28  .**       while(
125e0 20 28 63 73 72 45 6e 64 2e 6b 65 79 20 2b 20 72   (csrEnd.key + r
125f0 65 67 45 6e 64 29 20 3c 3d 20 63 73 72 43 75 72  egEnd) <= csrCur
12600 72 65 6e 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20  rent.key ){.**  
12610 20 20 20 20 20 20 20 41 47 47 53 54 45 50 0a 2a         AGGSTEP.*
12620 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  *       }.**    
12630 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a     RETURN_ROW.**
12640 0a 2a 2a 20 20 20 52 41 4e 47 45 20 42 45 54 57  .**   RANGE BETW
12650 45 45 4e 20 3c 65 78 70 72 31 3e 20 46 4f 4c 4c  EEN <expr1> FOLL
12660 4f 57 49 4e 47 20 41 4e 44 20 3c 65 78 70 72 32  OWING AND <expr2
12670 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a  > FOLLOWING.**.*
12680 2a 20 20 20 20 20 2e 2e 2e 20 6c 6f 6f 70 20 73  *     ... loop s
12690 74 61 72 74 65 64 20 62 79 20 73 71 6c 69 74 65  tarted by sqlite
126a0 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2e 2e  3WhereBegin() ..
126b0 2e 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 6e  ..**       if( n
126c0 65 77 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a  ew partition ){.
126d0 2a 2a 20 20 20 20 20 20 20 20 20 47 6f 73 75 62  **         Gosub
126e0 20 66 6c 75 73 68 0a 2a 2a 20 20 20 20 20 20 20   flush.**       
126f0 7d 0a 2a 2a 20 20 20 20 20 20 20 49 6e 73 65 72  }.**       Inser
12700 74 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20 65  t new row into e
12710 70 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20  ph table..**    
12720 20 20 20 69 66 28 20 66 69 72 73 74 20 72 6f 77     if( first row
12730 20 6f 66 20 70 61 72 74 69 74 69 6f 6e 20 29 7b   of partition ){
12740 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 65 77 69  .**         Rewi
12750 6e 64 28 63 73 72 45 6e 64 29 20 3b 20 52 65 77  nd(csrEnd) ; Rew
12760 69 6e 64 28 63 73 72 53 74 61 72 74 29 20 3b 20  ind(csrStart) ; 
12770 52 65 77 69 6e 64 28 63 73 72 43 75 72 72 65 6e  Rewind(csrCurren
12780 74 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 72 65  t).**         re
12790 67 45 6e 64 20 3d 20 3c 65 78 70 72 32 3e 0a 2a  gEnd = <expr2>.*
127a0 2a 20 20 20 20 20 20 20 20 20 72 65 67 53 74 61  *         regSta
127b0 72 74 20 3d 20 3c 65 78 70 72 31 3e 0a 2a 2a 20  rt = <expr1>.** 
127c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20        }else{.** 
127d0 20 20 20 20 20 20 20 20 41 47 47 53 54 45 50 0a          AGGSTEP.
127e0 2a 2a 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  **         while
127f0 28 20 28 63 73 72 43 75 72 72 65 6e 74 2e 6b 65  ( (csrCurrent.ke
12800 79 20 2b 20 72 65 67 45 6e 64 29 20 3c 20 63 73  y + regEnd) < cs
12810 72 45 6e 64 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20  rEnd.key ){.**  
12820 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
12830 28 63 73 72 43 75 72 72 65 6e 74 2e 6b 65 79 20  (csrCurrent.key 
12840 2b 20 72 65 67 53 74 61 72 74 29 20 3e 20 63 73  + regStart) > cs
12850 72 53 74 61 72 74 2e 6b 65 79 20 29 7b 0a 2a 2a  rStart.key ){.**
12860 20 20 20 20 20 20 20 20 20 20 20 20 20 41 47 47               AGG
12870 49 4e 56 45 52 53 45 0a 2a 2a 20 20 20 20 20 20  INVERSE.**      
12880 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20       }.**       
12890 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a      RETURN_ROW.*
128a0 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  *         }.**  
128b0 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a       }.**     }.
128c0 2a 2a 20 20 20 20 20 66 6c 75 73 68 3a 0a 2a 2a  **     flush:.**
128d0 20 20 20 20 20 20 20 41 47 47 53 54 45 50 0a 2a         AGGSTEP.*
128e0 2a 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 31  *       while( 1
128f0 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 77   ){.**         w
12900 68 69 6c 65 28 20 28 63 73 72 43 75 72 72 65 6e  hile( (csrCurren
12910 74 2e 6b 65 79 20 2b 20 72 65 67 53 74 61 72 74  t.key + regStart
12920 29 20 3e 20 63 73 72 53 74 61 72 74 2e 6b 65 79  ) > csrStart.key
12930 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   ){.**          
12940 20 41 47 47 49 4e 56 45 52 53 45 0a 2a 2a 20 20   AGGINVERSE.**  
12950 20 20 20 20 20 20 20 20 20 69 66 28 20 65 6f 66           if( eof
12960 20 29 20 62 72 65 61 6b 20 22 77 68 69 6c 65 28   ) break "while(
12970 20 31 20 29 22 20 6c 6f 6f 70 2e 0a 2a 2a 20 20   1 )" loop..**  
12980 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
12990 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a      RETURN_ROW.*
129a0 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  *       }.**    
129b0 20 20 20 77 68 69 6c 65 28 20 21 65 6f 66 20 63     while( !eof c
129c0 73 72 43 75 72 72 65 6e 74 20 29 7b 0a 2a 2a 20  srCurrent ){.** 
129d0 20 20 20 20 20 20 20 20 52 45 54 55 52 4e 5f 52          RETURN_R
129e0 4f 57 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a  OW.**       }.**
129f0 0a 2a 2a 20 54 68 65 20 74 65 78 74 20 61 62 6f  .** The text abo
12a00 76 65 20 6c 65 61 76 65 73 20 6f 75 74 20 6d 61  ve leaves out ma
12a10 6e 79 20 64 65 74 61 69 6c 73 2e 20 52 65 66 65  ny details. Refe
12a20 72 20 74 6f 20 74 68 65 20 63 6f 64 65 20 61 6e  r to the code an
12a30 64 20 63 6f 6d 6d 65 6e 74 73 0a 2a 2a 20 62 65  d comments.** be
12a40 6c 6f 77 20 66 6f 72 20 61 20 6d 6f 72 65 20 63  low for a more c
12a50 6f 6d 70 6c 65 74 65 20 70 69 63 74 75 72 65 2e  omplete picture.
12a60 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
12a70 57 69 6e 64 6f 77 43 6f 64 65 53 74 65 70 28 0a  WindowCodeStep(.
12a80 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
12a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12aa0 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
12ab0 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
12ac0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
12ad0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 77 72 69          /* Rewri
12ae0 74 74 65 6e 20 53 45 4c 45 43 54 20 73 74 61 74  tten SELECT stat
12af0 65 6d 65 6e 74 20 2a 2f 0a 20 20 57 68 65 72 65  ement */.  Where
12b00 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20  Info *pWInfo,   
12b10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
12b20 6e 74 65 78 74 20 72 65 74 75 72 6e 65 64 20 62  ntext returned b
12b30 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
12b40 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 72  gin() */.  int r
12b50 65 67 47 6f 73 75 62 2c 20 20 20 20 20 20 20 20  egGosub,        
12b60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
12b70 67 69 73 74 65 72 20 66 6f 72 20 4f 50 5f 47 6f  gister for OP_Go
12b80 73 75 62 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  sub */.  int add
12b90 72 47 6f 73 75 62 20 20 20 20 20 20 20 20 20 20  rGosub          
12ba0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 50 5f 47           /* OP_G
12bb0 6f 73 75 62 20 68 65 72 65 20 74 6f 20 72 65 74  osub here to ret
12bc0 75 72 6e 20 65 61 63 68 20 72 6f 77 20 2a 2f 0a  urn each row */.
12bd0 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57  ){.  Window *pMW
12be0 69 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b 0a 20 20  in = p->pWin;.  
12bf0 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
12c00 42 79 20 3d 20 70 4d 57 69 6e 2d 3e 70 4f 72 64  By = pMWin->pOrd
12c10 65 72 42 79 3b 0a 20 20 56 64 62 65 20 2a 76 20  erBy;.  Vdbe *v 
12c20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
12c30 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
12c40 63 73 72 57 72 69 74 65 3b 20 20 20 20 20 20 20  csrWrite;       
12c50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
12c60 75 72 73 6f 72 20 75 73 65 64 20 74 6f 20 77 72  ursor used to wr
12c70 69 74 65 20 74 6f 20 65 70 68 2e 20 74 61 62 6c  ite to eph. tabl
12c80 65 20 2a 2f 0a 20 20 69 6e 74 20 63 73 72 49 6e  e */.  int csrIn
12c90 70 75 74 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  put = p->pSrc->a
12ca0 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 20 20 20 20  [0].iCursor;    
12cb0 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20 73 75   /* Cursor of su
12cc0 62 2d 73 65 6c 65 63 74 20 2a 2f 0a 20 20 69 6e  b-select */.  in
12cd0 74 20 6e 49 6e 70 75 74 20 3d 20 70 2d 3e 70 53  t nInput = p->pS
12ce0 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 2d 3e 6e  rc->a[0].pTab->n
12cf0 43 6f 6c 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65  Col;    /* Numbe
12d00 72 20 6f 66 20 63 6f 6c 73 20 72 65 74 75 72 6e  r of cols return
12d10 65 64 20 62 79 20 73 75 62 20 2a 2f 0a 20 20 69  ed by sub */.  i
12d20 6e 74 20 69 49 6e 70 75 74 3b 20 20 20 20 20 20  nt iInput;      
12d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 20 69           /* To i
12d50 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 73  terate through s
12d60 75 62 20 63 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74  ub cols */.  int
12d70 20 61 64 64 72 4e 65 3b 20 20 20 20 20 20 20 20   addrNe;        
12d80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12d90 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4e 65  Address of OP_Ne
12da0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 47 6f   */.  int addrGo
12db0 73 75 62 46 6c 75 73 68 3b 20 20 20 20 20 20 20  subFlush;       
12dc0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
12dd0 20 6f 66 20 4f 50 5f 47 6f 73 75 62 20 74 6f 20   of OP_Gosub to 
12de0 66 6c 75 73 68 3a 20 2a 2f 0a 20 20 69 6e 74 20  flush: */.  int 
12df0 61 64 64 72 49 6e 74 65 67 65 72 3b 20 20 20 20  addrInteger;    
12e00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
12e10 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 49 6e 74  ddress of OP_Int
12e20 65 67 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 64  eger */.  int ad
12e30 64 72 45 6d 70 74 79 3b 20 20 20 20 20 20 20 20  drEmpty;        
12e40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
12e50 72 65 73 73 20 6f 66 20 4f 50 5f 52 65 77 69 6e  ress of OP_Rewin
12e60 64 20 69 6e 20 66 6c 75 73 68 3a 20 2a 2f 0a 20  d in flush: */. 
12e70 20 69 6e 74 20 72 65 67 53 74 61 72 74 20 3d 20   int regStart = 
12e80 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
12e90 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 3c 65 78   /* Value of <ex
12ea0 70 72 3e 20 50 52 45 43 45 44 49 4e 47 20 2a 2f  pr> PRECEDING */
12eb0 0a 20 20 69 6e 74 20 72 65 67 45 6e 64 20 3d 20  .  int regEnd = 
12ec0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
12ed0 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 3c     /* Value of <
12ee0 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20  expr> FOLLOWING 
12ef0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4e 65 77 3b  */.  int regNew;
12f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f10 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
12f20 20 72 65 67 69 73 74 65 72 73 20 68 6f 6c 64 69   registers holdi
12f30 6e 67 20 6e 65 77 20 69 6e 70 75 74 20 72 6f 77  ng new input row
12f40 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63   */.  int regRec
12f50 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ord;            
12f60 20 20 20 20 20 20 2f 2a 20 72 65 67 4e 65 77 20        /* regNew 
12f70 61 72 72 61 79 20 69 6e 20 72 65 63 6f 72 64 20  array in record 
12f80 66 6f 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 72 65  form */.  int re
12f90 67 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20  gRowid;         
12fa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77            /* Row
12fb0 69 64 20 66 6f 72 20 72 65 67 52 65 63 6f 72 64  id for regRecord
12fc0 20 69 6e 20 65 70 68 20 74 61 62 6c 65 20 2a 2f   in eph table */
12fd0 0a 20 20 69 6e 74 20 72 65 67 4e 65 77 50 65 65  .  int regNewPee
12fe0 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
12ff0 20 20 20 2f 2a 20 50 65 65 72 20 76 61 6c 75 65     /* Peer value
13000 73 20 66 6f 72 20 6e 65 77 20 72 6f 77 20 28 70  s for new row (p
13010 61 72 74 20 6f 66 20 72 65 67 4e 65 77 29 20 2a  art of regNew) *
13020 2f 0a 20 20 69 6e 74 20 72 65 67 50 65 65 72 20  /.  int regPeer 
13030 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
13040 20 20 20 20 2f 2a 20 50 65 65 72 20 76 61 6c 75      /* Peer valu
13050 65 73 20 66 6f 72 20 63 75 72 72 65 6e 74 20 72  es for current r
13060 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46  ow */.  int regF
13070 6c 75 73 68 50 61 72 74 20 3d 20 30 3b 20 20 20  lushPart = 0;   
13080 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
13090 74 65 72 20 66 6f 72 20 22 47 6f 73 75 62 20 66  ter for "Gosub f
130a0 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 20  lush_partition" 
130b0 2a 2f 0a 20 20 57 69 6e 64 6f 77 43 6f 64 65 41  */.  WindowCodeA
130c0 72 67 20 73 3b 20 20 20 20 20 20 20 20 20 20 20  rg s;           
130d0 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20       /* Context 
130e0 6f 62 6a 65 63 74 20 66 6f 72 20 73 75 62 2d 72  object for sub-r
130f0 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20 69 6e 74  outines */.  int
13100 20 6c 62 6c 57 68 65 72 65 45 6e 64 3b 20 20 20   lblWhereEnd;   
13110 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13120 4c 61 62 65 6c 20 6a 75 73 74 20 62 65 66 6f 72  Label just befor
13130 65 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  e sqlite3WhereEn
13140 64 28 29 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61  d() code */..  a
13150 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 53  ssert( pMWin->eS
13160 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49  tart==TK_PRECEDI
13170 4e 47 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74  NG || pMWin->eSt
13180 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20  art==TK_CURRENT 
13190 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e  .       || pMWin
131a0 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c  ->eStart==TK_FOL
131b0 4c 4f 57 49 4e 47 20 7c 7c 20 70 4d 57 69 6e 2d  LOWING || pMWin-
131c0 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f  >eStart==TK_UNBO
131d0 55 4e 44 45 44 20 0a 20 20 29 3b 0a 20 20 61 73  UNDED .  );.  as
131e0 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 45 6e  sert( pMWin->eEn
131f0 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  d==TK_FOLLOWING 
13200 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  || pMWin->eEnd==
13210 54 4b 5f 43 55 52 52 45 4e 54 20 0a 20 20 20 20  TK_CURRENT .    
13220 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e     || pMWin->eEn
13230 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20  d==TK_UNBOUNDED 
13240 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  || pMWin->eEnd==
13250 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 0a 20 20  TK_PRECEDING .  
13260 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 57  );.  assert( pMW
13270 69 6e 2d 3e 65 45 78 63 6c 75 64 65 3d 3d 30 20  in->eExclude==0 
13280 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 78 63 6c 75  || pMWin->eExclu
13290 64 65 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 0a 20  de==TK_CURRENT. 
132a0 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e        || pMWin->
132b0 65 45 78 63 6c 75 64 65 3d 3d 54 4b 5f 47 52 4f  eExclude==TK_GRO
132c0 55 50 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 78  UP || pMWin->eEx
132d0 63 6c 75 64 65 3d 3d 54 4b 5f 54 49 45 53 0a 20  clude==TK_TIES. 
132e0 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e        || pMWin->
132f0 65 45 78 63 6c 75 64 65 3d 3d 54 4b 5f 4e 4f 0a  eExclude==TK_NO.
13300 20 20 29 3b 0a 0a 20 20 6c 62 6c 57 68 65 72 65    );..  lblWhere
13310 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
13320 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
13330 65 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69  e);..  /* Fill i
13340 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 62  n the context ob
13350 6a 65 63 74 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  ject */.  memset
13360 28 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57  (&s, 0, sizeof(W
13370 69 6e 64 6f 77 43 6f 64 65 41 72 67 29 29 3b 0a  indowCodeArg));.
13380 20 20 73 2e 70 50 61 72 73 65 20 3d 20 70 50 61    s.pParse = pPa
13390 72 73 65 3b 0a 20 20 73 2e 70 4d 57 69 6e 20 3d  rse;.  s.pMWin =
133a0 20 70 4d 57 69 6e 3b 0a 20 20 73 2e 70 56 64 62   pMWin;.  s.pVdb
133b0 65 20 3d 20 76 3b 0a 20 20 73 2e 72 65 67 47 6f  e = v;.  s.regGo
133c0 73 75 62 20 3d 20 72 65 67 47 6f 73 75 62 3b 0a  sub = regGosub;.
133d0 20 20 73 2e 61 64 64 72 47 6f 73 75 62 20 3d 20    s.addrGosub = 
133e0 61 64 64 72 47 6f 73 75 62 3b 0a 20 20 73 2e 63  addrGosub;.  s.c
133f0 75 72 72 65 6e 74 2e 63 73 72 20 3d 20 70 4d 57  urrent.csr = pMW
13400 69 6e 2d 3e 69 45 70 68 43 73 72 3b 0a 20 20 63  in->iEphCsr;.  c
13410 73 72 57 72 69 74 65 20 3d 20 73 2e 63 75 72 72  srWrite = s.curr
13420 65 6e 74 2e 63 73 72 2b 31 3b 0a 20 20 73 2e 73  ent.csr+1;.  s.s
13430 74 61 72 74 2e 63 73 72 20 3d 20 73 2e 63 75 72  tart.csr = s.cur
13440 72 65 6e 74 2e 63 73 72 2b 32 3b 0a 20 20 73 2e  rent.csr+2;.  s.
13450 65 6e 64 2e 63 73 72 20 3d 20 73 2e 63 75 72 72  end.csr = s.curr
13460 65 6e 74 2e 63 73 72 2b 33 3b 0a 0a 20 20 2f 2a  ent.csr+3;..  /*
13470 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 6e   Figure out when
13480 20 72 6f 77 73 20 6d 61 79 20 62 65 20 64 65 6c   rows may be del
13490 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20 65 70  eted from the ep
134a0 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20 54  hemeral table. T
134b0 68 65 72 65 0a 20 20 2a 2a 20 61 72 65 20 66 6f  here.  ** are fo
134c0 75 72 20 6f 70 74 69 6f 6e 73 20 2d 20 74 68 65  ur options - the
134d0 79 20 6d 61 79 20 6e 65 76 65 72 20 62 65 20 64  y may never be d
134e0 65 6c 65 74 65 64 20 28 65 44 65 6c 65 74 65 3d  eleted (eDelete=
134f0 3d 30 29 2c 20 74 68 65 79 20 6d 61 79 20 0a 20  =0), they may . 
13500 20 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 61   ** be deleted a
13510 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 79 20 61  s soon as they a
13520 72 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 70 61 72  re no longer par
13530 74 20 6f 66 20 74 68 65 20 77 69 6e 64 6f 77 20  t of the window 
13540 66 72 61 6d 65 0a 20 20 2a 2a 20 28 65 44 65 6c  frame.  ** (eDel
13550 65 74 65 3d 3d 57 49 4e 44 4f 57 5f 41 47 47 49  ete==WINDOW_AGGI
13560 4e 56 45 52 53 45 29 2c 20 74 68 65 79 20 6d 61  NVERSE), they ma
13570 79 20 62 65 20 64 65 6c 65 74 65 64 20 61 73 20  y be deleted as 
13580 61 66 74 65 72 20 74 68 65 20 72 6f 77 20 0a 20  after the row . 
13590 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 65 74   ** has been ret
135a0 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
135b0 6c 65 72 20 28 57 49 4e 44 4f 57 5f 52 45 54 55  ler (WINDOW_RETU
135c0 52 4e 5f 52 4f 57 29 2c 20 6f 72 20 74 68 65 79  RN_ROW), or they
135d0 20 6d 61 79 0a 20 20 2a 2a 20 62 65 20 64 65 6c   may.  ** be del
135e0 65 74 65 64 20 61 66 74 65 72 20 74 68 65 79 20  eted after they 
135f0 65 6e 74 65 72 20 74 68 65 20 66 72 61 6d 65 20  enter the frame 
13600 28 57 49 4e 44 4f 57 5f 41 47 47 53 54 45 50 29  (WINDOW_AGGSTEP)
13610 2e 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70  . */.  switch( p
13620 4d 57 69 6e 2d 3e 65 53 74 61 72 74 20 29 7b 0a  MWin->eStart ){.
13630 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4f 4c 4c      case TK_FOLL
13640 4f 57 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 69  OWING: {.      i
13650 66 28 20 70 4d 57 69 6e 2d 3e 65 54 79 70 65 21  f( pMWin->eType!
13660 3d 54 4b 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20  =TK_RANGE ){.   
13670 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
13680 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
13690 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76         sqlite3_v
136a0 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 0a  alue *pVal = 0;.
136b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
136c0 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 64 62 2c  alueFromExpr(db,
136d0 70 4d 57 69 6e 2d 3e 70 53 74 61 72 74 2c 64 62  pMWin->pStart,db
136e0 2d 3e 65 6e 63 2c 53 51 4c 49 54 45 5f 41 46 46  ->enc,SQLITE_AFF
136f0 5f 4e 55 4d 45 52 49 43 2c 26 70 56 61 6c 29 3b  _NUMERIC,&pVal);
13700 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 56 61  .        if( pVa
13710 6c 20 26 26 20 73 71 6c 69 74 65 33 5f 76 61 6c  l && sqlite3_val
13720 75 65 5f 69 6e 74 28 70 56 61 6c 29 3e 30 20 29  ue_int(pVal)>0 )
13730 7b 0a 20 20 20 20 20 20 20 20 20 20 73 2e 65 44  {.          s.eD
13740 65 6c 65 74 65 20 3d 20 57 49 4e 44 4f 57 5f 52  elete = WINDOW_R
13750 45 54 55 52 4e 5f 52 4f 57 3b 0a 20 20 20 20 20  ETURN_ROW;.     
13760 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
13770 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56  ite3ValueFree(pV
13780 61 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  al);.      }.   
13790 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
137a0 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 42 4f      case TK_UNBO
137b0 55 4e 44 45 44 3a 0a 20 20 20 20 20 20 69 66 28  UNDED:.      if(
137c0 20 77 69 6e 64 6f 77 43 61 63 68 65 46 72 61 6d   windowCacheFram
137d0 65 28 70 4d 57 69 6e 29 3d 3d 30 20 29 7b 0a 20  e(pMWin)==0 ){. 
137e0 20 20 20 20 20 20 20 69 66 28 20 70 4d 57 69 6e         if( pMWin
137f0 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45  ->eEnd==TK_PRECE
13800 44 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 20 20  DING ){.        
13810 20 20 73 2e 65 44 65 6c 65 74 65 20 3d 20 57 49    s.eDelete = WI
13820 4e 44 4f 57 5f 41 47 47 53 54 45 50 3b 0a 20 20  NDOW_AGGSTEP;.  
13830 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13840 20 20 20 20 20 20 20 73 2e 65 44 65 6c 65 74 65         s.eDelete
13850 20 3d 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e   = WINDOW_RETURN
13860 5f 52 4f 57 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _ROW;.        }.
13870 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
13880 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
13890 3a 0a 20 20 20 20 20 20 73 2e 65 44 65 6c 65 74  :.      s.eDelet
138a0 65 20 3d 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e  e = WINDOW_AGGIN
138b0 56 45 52 53 45 3b 0a 20 20 20 20 20 20 62 72 65  VERSE;.      bre
138c0 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c  ak;.  }..  /* Al
138d0 6c 6f 63 61 74 65 20 72 65 67 69 73 74 65 72 73  locate registers
138e0 20 66 6f 72 20 74 68 65 20 61 72 72 61 79 20 6f   for the array o
138f0 66 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 74 68  f values from th
13900 65 20 73 75 62 2d 71 75 65 72 79 2c 20 74 68 65  e sub-query, the
13910 0a 20 20 2a 2a 20 73 61 6d 76 65 20 76 61 6c 75  .  ** samve valu
13920 65 73 20 69 6e 20 72 65 63 6f 72 64 20 66 6f 72  es in record for
13930 6d 2c 20 61 6e 64 20 74 68 65 20 72 6f 77 69 64  m, and the rowid
13940 20 75 73 65 64 20 74 6f 20 69 6e 73 65 72 74 20   used to insert 
13950 73 61 69 64 20 72 65 63 6f 72 64 0a 20 20 2a 2a  said record.  **
13960 20 69 6e 74 6f 20 74 68 65 20 65 70 68 65 6d 65   into the epheme
13970 72 61 6c 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20  ral table.  */. 
13980 20 72 65 67 4e 65 77 20 3d 20 70 50 61 72 73 65   regNew = pParse
13990 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 70 50 61 72  ->nMem+1;.  pPar
139a0 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 49 6e 70  se->nMem += nInp
139b0 75 74 3b 0a 20 20 72 65 67 52 65 63 6f 72 64 20  ut;.  regRecord 
139c0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
139d0 3b 0a 20 20 72 65 67 52 6f 77 69 64 20 3d 20 2b  ;.  regRowid = +
139e0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a  +pParse->nMem;..
139f0 20 20 2f 2a 20 49 66 20 74 68 65 20 77 69 6e 64    /* If the wind
13a00 6f 77 20 66 72 61 6d 65 20 63 6f 6e 74 61 69 6e  ow frame contain
13a10 73 20 61 6e 20 22 3c 65 78 70 72 3e 20 50 52 45  s an "<expr> PRE
13a20 43 45 44 49 4e 47 22 20 6f 72 20 22 3c 65 78 70  CEDING" or "<exp
13a30 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 22 0a 20 20  r> FOLLOWING".  
13a40 2a 2a 20 63 6c 61 75 73 65 2c 20 61 6c 6c 6f 63  ** clause, alloc
13a50 61 74 65 20 72 65 67 69 73 74 65 72 73 20 74 6f  ate registers to
13a60 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
13a70 74 73 20 6f 66 20 65 76 61 6c 75 61 74 69 6e 67  ts of evaluating
13a80 20 65 61 63 68 0a 20 20 2a 2a 20 3c 65 78 70 72   each.  ** <expr
13a90 3e 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57  >.  */.  if( pMW
13aa0 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 50  in->eStart==TK_P
13ab0 52 45 43 45 44 49 4e 47 20 7c 7c 20 70 4d 57 69  RECEDING || pMWi
13ac0 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f  n->eStart==TK_FO
13ad0 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 72  LLOWING ){.    r
13ae0 65 67 53 74 61 72 74 20 3d 20 2b 2b 70 50 61 72  egStart = ++pPar
13af0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20  se->nMem;.  }.  
13b00 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d  if( pMWin->eEnd=
13b10 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 7c 7c  =TK_PRECEDING ||
13b20 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b   pMWin->eEnd==TK
13b30 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20  _FOLLOWING ){.  
13b40 20 20 72 65 67 45 6e 64 20 3d 20 2b 2b 70 50 61    regEnd = ++pPa
13b50 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 0a  rse->nMem;.  }..
13b60 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
13b70 6e 6f 74 20 61 20 22 52 4f 57 53 20 42 45 54 57  not a "ROWS BETW
13b80 45 45 4e 20 2e 2e 2e 22 20 66 72 61 6d 65 2c 20  EEN ..." frame, 
13b90 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 72  then allocate ar
13ba0 72 61 79 73 20 6f 66 0a 20 20 2a 2a 20 72 65 67  rays of.  ** reg
13bb0 69 73 74 65 72 73 20 74 6f 20 73 74 6f 72 65 20  isters to store 
13bc0 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 4f 52  copies of the OR
13bd0 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69 6f  DER BY expressio
13be0 6e 73 20 28 70 65 65 72 20 76 61 6c 75 65 73 29  ns (peer values)
13bf0 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6d   .  ** for the m
13c00 61 69 6e 20 6c 6f 6f 70 2c 20 61 6e 64 20 66 6f  ain loop, and fo
13c10 72 20 65 61 63 68 20 63 75 72 73 6f 72 20 28 73  r each cursor (s
13c20 74 61 72 74 2c 20 63 75 72 72 65 6e 74 20 61 6e  tart, current an
13c30 64 20 65 6e 64 29 2e 20 2a 2f 0a 20 20 69 66 28  d end). */.  if(
13c40 20 70 4d 57 69 6e 2d 3e 65 54 79 70 65 21 3d 54   pMWin->eType!=T
13c50 4b 5f 52 4f 57 53 20 29 7b 0a 20 20 20 20 69 6e  K_ROWS ){.    in
13c60 74 20 6e 50 65 65 72 20 3d 20 28 70 4f 72 64 65  t nPeer = (pOrde
13c70 72 42 79 20 3f 20 70 4f 72 64 65 72 42 79 2d 3e  rBy ? pOrderBy->
13c80 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20  nExpr : 0);.    
13c90 72 65 67 4e 65 77 50 65 65 72 20 3d 20 72 65 67  regNewPeer = reg
13ca0 4e 65 77 20 2b 20 70 4d 57 69 6e 2d 3e 6e 42 75  New + pMWin->nBu
13cb0 66 66 65 72 43 6f 6c 3b 0a 20 20 20 20 69 66 28  fferCol;.    if(
13cc0 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69   pMWin->pPartiti
13cd0 6f 6e 20 29 20 72 65 67 4e 65 77 50 65 65 72 20  on ) regNewPeer 
13ce0 2b 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69  += pMWin->pParti
13cf0 74 69 6f 6e 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  tion->nExpr;.   
13d00 20 72 65 67 50 65 65 72 20 3d 20 70 50 61 72 73   regPeer = pPars
13d10 65 2d 3e 6e 4d 65 6d 2b 31 3b 20 20 20 20 20 20  e->nMem+1;      
13d20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
13d30 20 6e 50 65 65 72 3b 0a 20 20 20 20 73 2e 73 74   nPeer;.    s.st
13d40 61 72 74 2e 72 65 67 20 3d 20 70 50 61 72 73 65  art.reg = pParse
13d50 2d 3e 6e 4d 65 6d 2b 31 3b 20 20 20 70 50 61 72  ->nMem+1;   pPar
13d60 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 65 65  se->nMem += nPee
13d70 72 3b 0a 20 20 20 20 73 2e 63 75 72 72 65 6e 74  r;.    s.current
13d80 2e 72 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e  .reg = pParse->n
13d90 4d 65 6d 2b 31 3b 20 70 50 61 72 73 65 2d 3e 6e  Mem+1; pParse->n
13da0 4d 65 6d 20 2b 3d 20 6e 50 65 65 72 3b 0a 20 20  Mem += nPeer;.  
13db0 20 20 73 2e 65 6e 64 2e 72 65 67 20 3d 20 70 50    s.end.reg = pP
13dc0 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 20 20 20  arse->nMem+1;   
13dd0 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
13de0 3d 20 6e 50 65 65 72 3b 0a 20 20 7d 0a 0a 20 20  = nPeer;.  }..  
13df0 2f 2a 20 4c 6f 61 64 20 74 68 65 20 63 6f 6c 75  /* Load the colu
13e00 6d 6e 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68  mn values for th
13e10 65 20 72 6f 77 20 72 65 74 75 72 6e 65 64 20 62  e row returned b
13e20 79 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74  y the sub-select
13e30 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 61 72  .  ** into an ar
13e40 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
13e50 20 73 74 61 72 74 69 6e 67 20 61 74 20 72 65 67   starting at reg
13e60 4e 65 77 2e 20 41 73 73 65 6d 62 6c 65 20 74 68  New. Assemble th
13e70 65 6d 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 72  em into.  ** a r
13e80 65 63 6f 72 64 20 69 6e 20 72 65 67 69 73 74 65  ecord in registe
13e90 72 20 72 65 67 52 65 63 6f 72 64 2e 20 2a 2f 0a  r regRecord. */.
13ea0 20 20 66 6f 72 28 69 49 6e 70 75 74 3d 30 3b 20    for(iInput=0; 
13eb0 69 49 6e 70 75 74 3c 6e 49 6e 70 75 74 3b 20 69  iInput<nInput; i
13ec0 49 6e 70 75 74 2b 2b 29 7b 0a 20 20 20 20 73 71  Input++){.    sq
13ed0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
13ee0 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73  v, OP_Column, cs
13ef0 72 49 6e 70 75 74 2c 20 69 49 6e 70 75 74 2c 20  rInput, iInput, 
13f00 72 65 67 4e 65 77 2b 69 49 6e 70 75 74 29 3b 0a  regNew+iInput);.
13f10 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
13f20 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
13f30 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 4e 65 77  keRecord, regNew
13f40 2c 20 6e 49 6e 70 75 74 2c 20 72 65 67 52 65 63  , nInput, regRec
13f50 6f 72 64 29 3b 0a 0a 20 20 2f 2a 20 41 6e 20 69  ord);..  /* An i
13f60 6e 70 75 74 20 72 6f 77 20 68 61 73 20 6a 75 73  nput row has jus
13f70 74 20 62 65 65 6e 20 72 65 61 64 20 69 6e 74 6f  t been read into
13f80 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67   an array of reg
13f90 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 0a  isters starting.
13fa0 20 20 2a 2a 20 61 74 20 72 65 67 4e 65 77 2e 20    ** at regNew. 
13fb0 49 66 20 74 68 65 20 77 69 6e 64 6f 77 20 68 61  If the window ha
13fc0 73 20 61 20 50 41 52 54 49 54 49 4f 4e 20 63 6c  s a PARTITION cl
13fd0 61 75 73 65 2c 20 74 68 69 73 20 62 6c 6f 63 6b  ause, this block
13fe0 20 67 65 6e 65 72 61 74 65 73 20 0a 20 20 2a 2a   generates .  **
13ff0 20 56 4d 20 63 6f 64 65 20 74 6f 20 63 68 65 63   VM code to chec
14000 6b 20 69 66 20 74 68 65 20 69 6e 70 75 74 20 72  k if the input r
14010 6f 77 20 69 73 20 74 68 65 20 73 74 61 72 74 20  ow is the start 
14020 6f 66 20 61 20 6e 65 77 20 70 61 72 74 69 74 69  of a new partiti
14030 6f 6e 2e 0a 20 20 2a 2a 20 49 66 20 73 6f 2c 20  on..  ** If so, 
14040 69 74 20 64 6f 65 73 20 61 6e 20 4f 50 5f 47 6f  it does an OP_Go
14050 73 75 62 20 74 6f 20 61 6e 20 61 64 64 72 65 73  sub to an addres
14060 73 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 69  s to be filled i
14070 6e 20 6c 61 74 65 72 2e 20 54 68 65 0a 20 20 2a  n later. The.  *
14080 2a 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  * address of the
14090 20 4f 50 5f 47 6f 73 75 62 20 69 73 20 73 74 6f   OP_Gosub is sto
140a0 72 65 64 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72  red in local var
140b0 69 61 62 6c 65 20 61 64 64 72 47 6f 73 75 62 46  iable addrGosubF
140c0 6c 75 73 68 2e 20 2a 2f 0a 20 20 69 66 28 20 70  lush. */.  if( p
140d0 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e  MWin->pPartition
140e0 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
140f0 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
14100 70 50 61 72 74 20 3d 20 70 4d 57 69 6e 2d 3e 70  pPart = pMWin->p
14110 50 61 72 74 69 74 69 6f 6e 3b 0a 20 20 20 20 69  Partition;.    i
14120 6e 74 20 6e 50 61 72 74 20 3d 20 70 50 61 72 74  nt nPart = pPart
14130 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69 6e 74  ->nExpr;.    int
14140 20 72 65 67 4e 65 77 50 61 72 74 20 3d 20 72 65   regNewPart = re
14150 67 4e 65 77 20 2b 20 70 4d 57 69 6e 2d 3e 6e 42  gNew + pMWin->nB
14160 75 66 66 65 72 43 6f 6c 3b 0a 20 20 20 20 4b 65  ufferCol;.    Ke
14170 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
14180 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
14190 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
141a0 72 73 65 2c 20 70 50 61 72 74 2c 20 30 2c 20 30  rse, pPart, 0, 0
141b0 29 3b 0a 0a 20 20 20 20 72 65 67 46 6c 75 73 68  );..    regFlush
141c0 50 61 72 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Part = ++pParse-
141d0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 61 64 64 72 20  >nMem;.    addr 
141e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
141f0 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72  Op3(v, OP_Compar
14200 65 2c 20 72 65 67 4e 65 77 50 61 72 74 2c 20 70  e, regNewPart, p
14210 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c 20 6e  MWin->regPart, n
14220 50 61 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Part);.    sqlit
14230 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76  e3VdbeAppendP4(v
14240 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66  , (void*)pKeyInf
14250 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
14260 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14270 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
14280 2c 20 61 64 64 72 2b 32 2c 20 61 64 64 72 2b 34  , addr+2, addr+4
14290 2c 20 61 64 64 72 2b 32 29 3b 0a 20 20 20 20 56  , addr+2);.    V
142a0 64 62 65 43 6f 76 65 72 61 67 65 45 71 4e 65 28  dbeCoverageEqNe(
142b0 76 29 3b 0a 20 20 20 20 61 64 64 72 47 6f 73 75  v);.    addrGosu
142c0 62 46 6c 75 73 68 20 3d 20 73 71 6c 69 74 65 33  bFlush = sqlite3
142d0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
142e0 5f 47 6f 73 75 62 2c 20 72 65 67 46 6c 75 73 68  _Gosub, regFlush
142f0 50 61 72 74 29 3b 0a 20 20 20 20 56 64 62 65 43  Part);.    VdbeC
14300 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 61 6c 6c  omment((v, "call
14310 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e   flush_partition
14320 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
14330 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
14340 5f 43 6f 70 79 2c 20 72 65 67 4e 65 77 50 61 72  _Copy, regNewPar
14350 74 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72  t, pMWin->regPar
14360 74 2c 20 6e 50 61 72 74 2d 31 29 3b 0a 20 20 7d  t, nPart-1);.  }
14370 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68  ..  /* Insert th
14380 65 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20 74  e new row into t
14390 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  he ephemeral tab
143a0 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  le */.  sqlite3V
143b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
143c0 4e 65 77 52 6f 77 69 64 2c 20 63 73 72 57 72 69  NewRowid, csrWri
143d0 74 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  te, regRowid);. 
143e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
143f0 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
14400 20 63 73 72 57 72 69 74 65 2c 20 72 65 67 52 65   csrWrite, regRe
14410 63 6f 72 64 2c 20 72 65 67 52 6f 77 69 64 29 3b  cord, regRowid);
14420 0a 20 20 61 64 64 72 4e 65 20 3d 20 73 71 6c 69  .  addrNe = sqli
14430 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
14440 20 4f 50 5f 4e 65 2c 20 70 4d 57 69 6e 2d 3e 72   OP_Ne, pMWin->r
14450 65 67 4f 6e 65 2c 20 30 2c 20 72 65 67 52 6f 77  egOne, 0, regRow
14460 69 64 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72  id);.  VdbeCover
14470 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 54 68  age(v);..  /* Th
14480 69 73 20 62 6c 6f 63 6b 20 69 73 20 72 75 6e 20  is block is run 
14490 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 6f  for the first ro
144a0 77 20 6f 66 20 65 61 63 68 20 70 61 72 74 69 74  w of each partit
144b0 69 6f 6e 20 2a 2f 0a 20 20 73 2e 72 65 67 41 72  ion */.  s.regAr
144c0 67 20 3d 20 77 69 6e 64 6f 77 49 6e 69 74 41 63  g = windowInitAc
144d0 63 75 6d 28 70 50 61 72 73 65 2c 20 70 4d 57 69  cum(pParse, pMWi
144e0 6e 29 3b 0a 0a 20 20 69 66 28 20 72 65 67 53 74  n);..  if( regSt
144f0 61 72 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  art ){.    sqlit
14500 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
14510 65 2c 20 70 4d 57 69 6e 2d 3e 70 53 74 61 72 74  e, pMWin->pStart
14520 2c 20 72 65 67 53 74 61 72 74 29 3b 0a 20 20 20  , regStart);.   
14530 20 77 69 6e 64 6f 77 43 68 65 63 6b 56 61 6c 75   windowCheckValu
14540 65 28 70 50 61 72 73 65 2c 20 72 65 67 53 74 61  e(pParse, regSta
14550 72 74 2c 20 30 20 2b 20 28 70 4d 57 69 6e 2d 3e  rt, 0 + (pMWin->
14560 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 20  eType==TK_RANGE 
14570 3f 20 33 20 3a 20 30 29 29 3b 0a 20 20 7d 0a 20  ? 3 : 0));.  }. 
14580 20 69 66 28 20 72 65 67 45 6e 64 20 29 7b 0a 20   if( regEnd ){. 
14590 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
145a0 64 65 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  de(pParse, pMWin
145b0 2d 3e 70 45 6e 64 2c 20 72 65 67 45 6e 64 29 3b  ->pEnd, regEnd);
145c0 0a 20 20 20 20 77 69 6e 64 6f 77 43 68 65 63 6b  .    windowCheck
145d0 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 72 65  Value(pParse, re
145e0 67 45 6e 64 2c 20 31 20 2b 20 28 70 4d 57 69 6e  gEnd, 1 + (pMWin
145f0 2d 3e 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47  ->eType==TK_RANG
14600 45 20 3f 20 33 20 3a 20 30 29 29 3b 0a 20 20 7d  E ? 3 : 0));.  }
14610 0a 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65  ..  if( pMWin->e
14620 53 74 61 72 74 3d 3d 70 4d 57 69 6e 2d 3e 65 45  Start==pMWin->eE
14630 6e 64 20 26 26 20 72 65 67 53 74 61 72 74 20 29  nd && regStart )
14640 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 28  {.    int op = (
14650 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d  (pMWin->eStart==
14660 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 29 20 3f 20  TK_FOLLOWING) ? 
14670 4f 50 5f 47 65 20 3a 20 4f 50 5f 4c 65 29 3b 0a  OP_Ge : OP_Le);.
14680 20 20 20 20 69 6e 74 20 61 64 64 72 47 65 20 3d      int addrGe =
14690 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
146a0 70 33 28 76 2c 20 6f 70 2c 20 72 65 67 53 74 61  p3(v, op, regSta
146b0 72 74 2c 20 30 2c 20 72 65 67 45 6e 64 29 3b 0a  rt, 0, regEnd);.
146c0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
146d0 28 76 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 41  (v);.    windowA
146e0 67 67 46 69 6e 61 6c 28 26 73 2c 20 30 29 3b 0a  ggFinal(&s, 0);.
146f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14700 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
14710 6e 64 2c 20 73 2e 63 75 72 72 65 6e 74 2e 63 73  nd, s.current.cs
14720 72 2c 20 31 29 3b 0a 20 20 20 20 56 64 62 65 43  r, 1);.    VdbeC
14730 6f 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b 65  overageNeverTake
14740 6e 28 76 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77  n(v);.    window
14750 52 65 74 75 72 6e 4f 6e 65 52 6f 77 28 26 73 29  ReturnOneRow(&s)
14760 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
14770 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
14780 73 65 74 53 6f 72 74 65 72 2c 20 73 2e 63 75 72  setSorter, s.cur
14790 72 65 6e 74 2e 63 73 72 29 3b 0a 20 20 20 20 73  rent.csr);.    s
147a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
147b0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
147c0 6c 62 6c 57 68 65 72 65 45 6e 64 29 3b 0a 20 20  lblWhereEnd);.  
147d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
147e0 70 48 65 72 65 28 76 2c 20 61 64 64 72 47 65 29  pHere(v, addrGe)
147f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d 57 69  ;.  }.  if( pMWi
14800 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f  n->eStart==TK_FO
14810 4c 4c 4f 57 49 4e 47 20 26 26 20 70 4d 57 69 6e  LLOWING && pMWin
14820 2d 3e 65 54 79 70 65 21 3d 54 4b 5f 52 41 4e 47  ->eType!=TK_RANG
14830 45 20 26 26 20 72 65 67 45 6e 64 20 29 7b 0a 20  E && regEnd ){. 
14840 20 20 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e     assert( pMWin
14850 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f  ->eEnd==TK_FOLLO
14860 57 49 4e 47 20 29 3b 0a 20 20 20 20 73 71 6c 69  WING );.    sqli
14870 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
14880 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72 65   OP_Subtract, re
14890 67 53 74 61 72 74 2c 20 72 65 67 45 6e 64 2c 20  gStart, regEnd, 
148a0 72 65 67 53 74 61 72 74 29 3b 0a 20 20 7d 0a 0a  regStart);.  }..
148b0 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74    if( pMWin->eSt
148c0 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  art!=TK_UNBOUNDE
148d0 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  D ){.    sqlite3
148e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
148f0 5f 52 65 77 69 6e 64 2c 20 73 2e 73 74 61 72 74  _Rewind, s.start
14900 2e 63 73 72 2c 20 31 29 3b 0a 20 20 20 20 56 64  .csr, 1);.    Vd
14910 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72 54  beCoverageNeverT
14920 61 6b 65 6e 28 76 29 3b 0a 20 20 7d 0a 20 20 73  aken(v);.  }.  s
14930 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14940 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 73  (v, OP_Rewind, s
14950 2e 63 75 72 72 65 6e 74 2e 63 73 72 2c 20 31 29  .current.csr, 1)
14960 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  ;.  VdbeCoverage
14970 4e 65 76 65 72 54 61 6b 65 6e 28 76 29 3b 0a 20  NeverTaken(v);. 
14980 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14990 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
149a0 20 73 2e 65 6e 64 2e 63 73 72 2c 20 31 29 3b 0a   s.end.csr, 1);.
149b0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65    VdbeCoverageNe
149c0 76 65 72 54 61 6b 65 6e 28 76 29 3b 0a 20 20 69  verTaken(v);.  i
149d0 66 28 20 72 65 67 50 65 65 72 20 26 26 20 70 4f  f( regPeer && pO
149e0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71  rderBy ){.    sq
149f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
14a00 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4e  v, OP_Copy, regN
14a10 65 77 50 65 65 72 2c 20 72 65 67 50 65 65 72 2c  ewPeer, regPeer,
14a20 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
14a30 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  -1);.    sqlite3
14a40 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
14a50 5f 43 6f 70 79 2c 20 72 65 67 50 65 65 72 2c 20  _Copy, regPeer, 
14a60 73 2e 73 74 61 72 74 2e 72 65 67 2c 20 70 4f 72  s.start.reg, pOr
14a70 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b  derBy->nExpr-1);
14a80 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14a90 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70  AddOp3(v, OP_Cop
14aa0 79 2c 20 72 65 67 50 65 65 72 2c 20 73 2e 63 75  y, regPeer, s.cu
14ab0 72 72 65 6e 74 2e 72 65 67 2c 20 70 4f 72 64 65  rrent.reg, pOrde
14ac0 72 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20  rBy->nExpr-1);. 
14ad0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14ae0 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp3(v, OP_Copy,
14af0 20 72 65 67 50 65 65 72 2c 20 73 2e 65 6e 64 2e   regPeer, s.end.
14b00 72 65 67 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  reg, pOrderBy->n
14b10 45 78 70 72 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20  Expr-1);.  }..  
14b20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14b30 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
14b40 20 6c 62 6c 57 68 65 72 65 45 6e 64 29 3b 0a 0a   lblWhereEnd);..
14b50 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
14b60 70 48 65 72 65 28 76 2c 20 61 64 64 72 4e 65 29  pHere(v, addrNe)
14b70 3b 0a 20 20 69 66 28 20 72 65 67 50 65 65 72 20  ;.  if( regPeer 
14b80 29 7b 0a 20 20 20 20 77 69 6e 64 6f 77 49 66 4e  ){.    windowIfN
14b90 65 77 50 65 65 72 28 70 50 61 72 73 65 2c 20 70  ewPeer(pParse, p
14ba0 4f 72 64 65 72 42 79 2c 20 72 65 67 4e 65 77 50  OrderBy, regNewP
14bb0 65 65 72 2c 20 72 65 67 50 65 65 72 2c 20 6c 62  eer, regPeer, lb
14bc0 6c 57 68 65 72 65 45 6e 64 29 3b 0a 20 20 7d 0a  lWhereEnd);.  }.
14bd0 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74    if( pMWin->eSt
14be0 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e  art==TK_FOLLOWIN
14bf0 47 20 29 7b 0a 20 20 20 20 77 69 6e 64 6f 77 43  G ){.    windowC
14c00 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57  odeOp(&s, WINDOW
14c10 5f 41 47 47 53 54 45 50 2c 20 30 2c 20 30 29 3b  _AGGSTEP, 0, 0);
14c20 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  .    if( pMWin->
14c30 65 45 6e 64 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44  eEnd!=TK_UNBOUND
14c40 45 44 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ED ){.      if( 
14c50 70 4d 57 69 6e 2d 3e 65 54 79 70 65 3d 3d 54 4b  pMWin->eType==TK
14c60 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20  _RANGE ){.      
14c70 20 20 69 6e 74 20 6c 62 6c 20 3d 20 73 71 6c 69    int lbl = sqli
14c80 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
14c90 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
14ca0 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 20 3d    int addrNext =
14cb0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
14cc0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
14cd0 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 52 61      windowCodeRa
14ce0 6e 67 65 54 65 73 74 28 26 73 2c 20 4f 50 5f 47  ngeTest(&s, OP_G
14cf0 65 2c 20 73 2e 63 75 72 72 65 6e 74 2e 63 73 72  e, s.current.csr
14d00 2c 20 72 65 67 45 6e 64 2c 20 73 2e 65 6e 64 2e  , regEnd, s.end.
14d10 63 73 72 2c 20 6c 62 6c 29 3b 0a 20 20 20 20 20  csr, lbl);.     
14d20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28     windowCodeOp(
14d30 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e  &s, WINDOW_AGGIN
14d40 56 45 52 53 45 2c 20 72 65 67 53 74 61 72 74 2c  VERSE, regStart,
14d50 20 30 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e   0);.        win
14d60 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49  dowCodeOp(&s, WI
14d70 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c  NDOW_RETURN_ROW,
14d80 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
14d90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14da0 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
14db0 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20   addrNext);.    
14dc0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
14dd0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
14de0 62 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  bl);.      }else
14df0 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77  {.        window
14e00 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f  CodeOp(&s, WINDO
14e10 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 72 65  W_RETURN_ROW, re
14e20 67 45 6e 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  gEnd, 0);.      
14e30 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26    windowCodeOp(&
14e40 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56  s, WINDOW_AGGINV
14e50 45 52 53 45 2c 20 72 65 67 53 74 61 72 74 2c 20  ERSE, regStart, 
14e60 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
14e70 7d 0a 20 20 7d 65 6c 73 65 0a 20 20 69 66 28 20  }.  }else.  if( 
14e80 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f  pMWin->eEnd==TK_
14e90 50 52 45 43 45 44 49 4e 47 20 29 7b 0a 20 20 20  PRECEDING ){.   
14ea0 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73   windowCodeOp(&s
14eb0 2c 20 57 49 4e 44 4f 57 5f 41 47 47 53 54 45 50  , WINDOW_AGGSTEP
14ec0 2c 20 72 65 67 45 6e 64 2c 20 30 29 3b 0a 20 20  , regEnd, 0);.  
14ed0 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26    windowCodeOp(&
14ee0 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e  s, WINDOW_RETURN
14ef0 5f 52 4f 57 2c 20 30 2c 20 30 29 3b 0a 20 20 20  _ROW, 0, 0);.   
14f00 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73   windowCodeOp(&s
14f10 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45  , WINDOW_AGGINVE
14f20 52 53 45 2c 20 72 65 67 53 74 61 72 74 2c 20 30  RSE, regStart, 0
14f30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
14f40 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 77 69  int addr;.    wi
14f50 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57  ndowCodeOp(&s, W
14f60 49 4e 44 4f 57 5f 41 47 47 53 54 45 50 2c 20 30  INDOW_AGGSTEP, 0
14f70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 4d  , 0);.    if( pM
14f80 57 69 6e 2d 3e 65 45 6e 64 21 3d 54 4b 5f 55 4e  Win->eEnd!=TK_UN
14f90 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20 20 20  BOUNDED ){.     
14fa0 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 54 79 70   if( pMWin->eTyp
14fb0 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 29 7b 0a 20  e==TK_RANGE ){. 
14fc0 20 20 20 20 20 20 20 69 6e 74 20 6c 62 6c 3b 0a         int lbl;.
14fd0 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73          addr = s
14fe0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
14ff0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
15000 20 20 69 66 28 20 72 65 67 45 6e 64 20 29 7b 0a    if( regEnd ){.
15010 20 20 20 20 20 20 20 20 20 20 6c 62 6c 20 3d 20            lbl = 
15020 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
15030 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  abel(pParse);.  
15040 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f          windowCo
15050 64 65 52 61 6e 67 65 54 65 73 74 28 26 73 2c 20  deRangeTest(&s, 
15060 4f 50 5f 47 65 2c 20 73 2e 63 75 72 72 65 6e 74  OP_Ge, s.current
15070 2e 63 73 72 2c 20 72 65 67 45 6e 64 2c 20 73 2e  .csr, regEnd, s.
15080 65 6e 64 2e 63 73 72 2c 20 6c 62 6c 29 3b 0a 20  end.csr, lbl);. 
15090 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
150a0 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73   windowCodeOp(&s
150b0 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f  , WINDOW_RETURN_
150c0 52 4f 57 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ROW, 0, 0);.    
150d0 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70      windowCodeOp
150e0 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49  (&s, WINDOW_AGGI
150f0 4e 56 45 52 53 45 2c 20 72 65 67 53 74 61 72 74  NVERSE, regStart
15100 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
15110 28 20 72 65 67 45 6e 64 20 29 7b 0a 20 20 20 20  ( regEnd ){.    
15120 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15130 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
15140 74 6f 2c 20 30 2c 20 61 64 64 72 29 3b 0a 20 20  to, 0, addr);.  
15150 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15160 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
15170 76 2c 20 6c 62 6c 29 3b 0a 20 20 20 20 20 20 20  v, lbl);.       
15180 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
15190 20 20 20 20 20 20 20 20 69 66 28 20 72 65 67 45          if( regE
151a0 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nd ){.          
151b0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
151c0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
151d0 66 50 6f 73 2c 20 72 65 67 45 6e 64 2c 20 30 2c  fPos, regEnd, 0,
151e0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56   1);.          V
151f0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
15200 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15210 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26    windowCodeOp(&
15220 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e  s, WINDOW_RETURN
15230 5f 52 4f 57 2c 20 30 2c 20 30 29 3b 0a 20 20 20  _ROW, 0, 0);.   
15240 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f       windowCodeO
15250 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47  p(&s, WINDOW_AGG
15260 49 4e 56 45 52 53 45 2c 20 72 65 67 53 74 61 72  INVERSE, regStar
15270 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  t, 0);.        i
15280 66 28 20 72 65 67 45 6e 64 20 29 20 73 71 6c 69  f( regEnd ) sqli
15290 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
152a0 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20  v, addr);.      
152b0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
152c0 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6d 61 69  * End of the mai
152d0 6e 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a  n input loop */.
152e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
152f0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c  olveLabel(v, lbl
15300 57 68 65 72 65 45 6e 64 29 3b 0a 20 20 73 71 6c  WhereEnd);.  sql
15310 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
15320 6e 66 6f 29 3b 0a 0a 20 20 2f 2a 20 46 61 6c 6c  nfo);..  /* Fall
15330 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 69 66   through */.  if
15340 28 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74  ( pMWin->pPartit
15350 69 6f 6e 20 29 7b 0a 20 20 20 20 61 64 64 72 49  ion ){.    addrI
15360 6e 74 65 67 65 72 20 3d 20 73 71 6c 69 74 65 33  nteger = sqlite3
15370 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15380 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
15390 46 6c 75 73 68 50 61 72 74 29 3b 0a 20 20 20 20  FlushPart);.    
153a0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
153b0 65 72 65 28 76 2c 20 61 64 64 72 47 6f 73 75 62  ere(v, addrGosub
153c0 46 6c 75 73 68 29 3b 0a 20 20 7d 0a 0a 20 20 61  Flush);.  }..  a
153d0 64 64 72 45 6d 70 74 79 20 3d 20 73 71 6c 69 74  ddrEmpty = sqlit
153e0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
153f0 4f 50 5f 52 65 77 69 6e 64 2c 20 63 73 72 57 72  OP_Rewind, csrWr
15400 69 74 65 29 3b 0a 20 20 56 64 62 65 43 6f 76 65  ite);.  VdbeCove
15410 72 61 67 65 28 76 29 3b 0a 20 20 69 66 28 20 70  rage(v);.  if( p
15420 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50  MWin->eEnd==TK_P
15430 52 45 43 45 44 49 4e 47 20 29 7b 0a 20 20 20 20  RECEDING ){.    
15440 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c  windowCodeOp(&s,
15450 20 57 49 4e 44 4f 57 5f 41 47 47 53 54 45 50 2c   WINDOW_AGGSTEP,
15460 20 72 65 67 45 6e 64 2c 20 30 29 3b 0a 20 20 20   regEnd, 0);.   
15470 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73   windowCodeOp(&s
15480 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f  , WINDOW_RETURN_
15490 52 4f 57 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 65  ROW, 0, 0);.  }e
154a0 6c 73 65 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65  lse if( pMWin->e
154b0 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57  Start==TK_FOLLOW
154c0 49 4e 47 20 29 7b 0a 20 20 20 20 69 6e 74 20 61  ING ){.    int a
154d0 64 64 72 53 74 61 72 74 3b 0a 20 20 20 20 69 6e  ddrStart;.    in
154e0 74 20 61 64 64 72 42 72 65 61 6b 31 3b 0a 20 20  t addrBreak1;.  
154f0 20 20 69 6e 74 20 61 64 64 72 42 72 65 61 6b 32    int addrBreak2
15500 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 42 72  ;.    int addrBr
15510 65 61 6b 33 3b 0a 20 20 20 20 77 69 6e 64 6f 77  eak3;.    window
15520 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f  CodeOp(&s, WINDO
15530 57 5f 41 47 47 53 54 45 50 2c 20 30 2c 20 30 29  W_AGGSTEP, 0, 0)
15540 3b 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d  ;.    if( pMWin-
15550 3e 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45  >eType==TK_RANGE
15560 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 53 74   ){.      addrSt
15570 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
15580 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
15590 0a 20 20 20 20 20 20 61 64 64 72 42 72 65 61 6b  .      addrBreak
155a0 32 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70  2 = windowCodeOp
155b0 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49  (&s, WINDOW_AGGI
155c0 4e 56 45 52 53 45 2c 20 72 65 67 53 74 61 72 74  NVERSE, regStart
155d0 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 64 64 72  , 1);.      addr
155e0 42 72 65 61 6b 31 20 3d 20 77 69 6e 64 6f 77 43  Break1 = windowC
155f0 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57  odeOp(&s, WINDOW
15600 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 30 2c 20  _RETURN_ROW, 0, 
15610 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 20 20  1);.    }else.  
15620 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e    if( pMWin->eEn
15630 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20  d==TK_UNBOUNDED 
15640 29 7b 0a 20 20 20 20 20 20 61 64 64 72 53 74 61  ){.      addrSta
15650 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
15660 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
15670 20 20 20 20 20 20 61 64 64 72 42 72 65 61 6b 31        addrBreak1
15680 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28   = windowCodeOp(
15690 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55 52  &s, WINDOW_RETUR
156a0 4e 5f 52 4f 57 2c 20 72 65 67 53 74 61 72 74 2c  N_ROW, regStart,
156b0 20 31 29 3b 0a 20 20 20 20 20 20 61 64 64 72 42   1);.      addrB
156c0 72 65 61 6b 32 20 3d 20 77 69 6e 64 6f 77 43 6f  reak2 = windowCo
156d0 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f  deOp(&s, WINDOW_
156e0 41 47 47 49 4e 56 45 52 53 45 2c 20 30 2c 20 31  AGGINVERSE, 0, 1
156f0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
15700 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 57 69      assert( pMWi
15710 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c  n->eEnd==TK_FOLL
15720 4f 57 49 4e 47 20 29 3b 0a 20 20 20 20 20 20 61  OWING );.      a
15730 64 64 72 53 74 61 72 74 20 3d 20 73 71 6c 69 74  ddrStart = sqlit
15740 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
15750 72 28 76 29 3b 0a 20 20 20 20 20 20 61 64 64 72  r(v);.      addr
15760 42 72 65 61 6b 31 20 3d 20 77 69 6e 64 6f 77 43  Break1 = windowC
15770 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57  odeOp(&s, WINDOW
15780 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 72 65 67  _RETURN_ROW, reg
15790 45 6e 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 61  End, 1);.      a
157a0 64 64 72 42 72 65 61 6b 32 20 3d 20 77 69 6e 64  ddrBreak2 = wind
157b0 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e  owCodeOp(&s, WIN
157c0 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 2c 20  DOW_AGGINVERSE, 
157d0 72 65 67 53 74 61 72 74 2c 20 31 29 3b 0a 20 20  regStart, 1);.  
157e0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
157f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15800 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 53 74 61  Goto, 0, addrSta
15810 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rt);.    sqlite3
15820 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
15830 61 64 64 72 42 72 65 61 6b 32 29 3b 0a 20 20 20  addrBreak2);.   
15840 20 61 64 64 72 53 74 61 72 74 20 3d 20 73 71 6c   addrStart = sql
15850 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
15860 64 64 72 28 76 29 3b 0a 20 20 20 20 61 64 64 72  ddr(v);.    addr
15870 42 72 65 61 6b 33 20 3d 20 77 69 6e 64 6f 77 43  Break3 = windowC
15880 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57  odeOp(&s, WINDOW
15890 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 30 2c 20  _RETURN_ROW, 0, 
158a0 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
158b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
158c0 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 53 74 61  Goto, 0, addrSta
158d0 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rt);.    sqlite3
158e0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
158f0 61 64 64 72 42 72 65 61 6b 31 29 3b 0a 20 20 20  addrBreak1);.   
15900 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
15910 48 65 72 65 28 76 2c 20 61 64 64 72 42 72 65 61  Here(v, addrBrea
15920 6b 33 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  k3);.  }else{.  
15930 20 20 69 6e 74 20 61 64 64 72 42 72 65 61 6b 3b    int addrBreak;
15940 0a 20 20 20 20 69 6e 74 20 61 64 64 72 53 74 61  .    int addrSta
15950 72 74 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f  rt;.    windowCo
15960 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f  deOp(&s, WINDOW_
15970 41 47 47 53 54 45 50 2c 20 30 2c 20 30 29 3b 0a  AGGSTEP, 0, 0);.
15980 20 20 20 20 61 64 64 72 53 74 61 72 74 20 3d 20      addrStart = 
15990 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
159a0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 61  ntAddr(v);.    a
159b0 64 64 72 42 72 65 61 6b 20 3d 20 77 69 6e 64 6f  ddrBreak = windo
159c0 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44  wCodeOp(&s, WIND
159d0 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 30  OW_RETURN_ROW, 0
159e0 2c 20 31 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77  , 1);.    window
159f0 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f  CodeOp(&s, WINDO
15a00 57 5f 41 47 47 49 4e 56 45 52 53 45 2c 20 72 65  W_AGGINVERSE, re
15a10 67 53 74 61 72 74 2c 20 30 29 3b 0a 20 20 20 20  gStart, 0);.    
15a20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15a30 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
15a40 20 61 64 64 72 53 74 61 72 74 29 3b 0a 20 20 20   addrStart);.   
15a50 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
15a60 48 65 72 65 28 76 2c 20 61 64 64 72 42 72 65 61  Here(v, addrBrea
15a70 6b 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  k);.  }.  sqlite
15a80 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
15a90 20 61 64 64 72 45 6d 70 74 79 29 3b 0a 0a 20 20   addrEmpty);..  
15aa0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15ab0 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72  1(v, OP_ResetSor
15ac0 74 65 72 2c 20 73 2e 63 75 72 72 65 6e 74 2e 63  ter, s.current.c
15ad0 73 72 29 3b 0a 20 20 69 66 28 20 70 4d 57 69 6e  sr);.  if( pMWin
15ae0 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 29 7b 0a  ->pPartition ){.
15af0 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 72      if( pMWin->r
15b00 65 67 53 74 61 72 74 52 6f 77 69 64 20 29 7b 0a  egStartRowid ){.
15b10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15b20 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
15b30 74 65 67 65 72 2c 20 31 2c 20 70 4d 57 69 6e 2d  teger, 1, pMWin-
15b40 3e 72 65 67 53 74 61 72 74 52 6f 77 69 64 29 3b  >regStartRowid);
15b50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15b60 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
15b70 6e 74 65 67 65 72 2c 20 30 2c 20 70 4d 57 69 6e  nteger, 0, pMWin
15b80 2d 3e 72 65 67 45 6e 64 52 6f 77 69 64 29 3b 0a  ->regEndRowid);.
15b90 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
15ba0 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c  3VdbeChangeP1(v,
15bb0 20 61 64 64 72 49 6e 74 65 67 65 72 2c 20 73 71   addrInteger, sq
15bc0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
15bd0 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20 73 71  Addr(v));.    sq
15be0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
15bf0 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
15c00 67 46 6c 75 73 68 50 61 72 74 29 3b 0a 20 20 7d  gFlushPart);.  }
15c10 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .}..#endif /* SQ
15c20 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
15c30 46 55 4e 43 20 2a 2f 0a                          FUNC */.