/ Hex Artifact Content
Login

Artifact 8b3081e3fe6c9f5837332e027090dd5e5e9949fc9f1997f186198c18d348e79d:


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 20 3d 20 73 71 6c 69 74 65 33  4 iVal = sqlite3
1d00: 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 70 41  _value_int64(apA
1d10: 72 67 5b 31 5d 29 3b 0a 20 20 20 20 70 2d 3e 6e  rg[1]);.    p->n
1d20: 53 74 65 70 2b 2b 3b 0a 20 20 20 20 69 66 28 20  Step++;.    if( 
1d30: 69 56 61 6c 3d 3d 70 2d 3e 6e 53 74 65 70 20 29  iVal==p->nStep )
1d40: 7b 0a 20 20 20 20 20 20 70 2d 3e 70 56 61 6c 75  {.      p->pValu
1d50: 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  e = sqlite3_valu
1d60: 65 5f 64 75 70 28 61 70 41 72 67 5b 30 5d 29 3b  e_dup(apArg[0]);
1d70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 55 4e 55  .    }.  }.  UNU
1d80: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 41  SED_PARAMETER(nA
1d90: 72 67 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  rg);.  UNUSED_PA
1da0: 52 41 4d 45 54 45 52 28 61 70 41 72 67 29 3b 0a  RAMETER(apArg);.
1db0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e 74  }.static void nt
1dc0: 68 5f 76 61 6c 75 65 56 61 6c 75 65 46 75 6e 63  h_valueValueFunc
1dd0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
1de0: 20 2a 70 43 74 78 29 7b 0a 20 20 73 74 72 75 63   *pCtx){.  struc
1df0: 74 20 4e 74 68 56 61 6c 75 65 43 74 78 20 2a 70  t NthValueCtx *p
1e00: 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74 20  ;.  p = (struct 
1e10: 4e 74 68 56 61 6c 75 65 43 74 78 2a 29 73 71 6c  NthValueCtx*)sql
1e20: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
1e30: 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a  ontext(pCtx, siz
1e40: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20  eof(*p));.  if( 
1e50: 70 20 26 26 20 70 2d 3e 70 56 61 6c 75 65 20 29  p && p->pValue )
1e60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
1e70: 73 75 6c 74 5f 76 61 6c 75 65 28 70 43 74 78 2c  sult_value(pCtx,
1e80: 20 70 2d 3e 70 56 61 6c 75 65 29 3b 0a 20 20 7d   p->pValue);.  }
1e90: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e  .}.static void n
1ea0: 74 68 5f 76 61 6c 75 65 46 69 6e 61 6c 69 7a 65  th_valueFinalize
1eb0: 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Func(sqlite3_con
1ec0: 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20 20 73  text *pCtx){.  s
1ed0: 74 72 75 63 74 20 4e 74 68 56 61 6c 75 65 43 74  truct NthValueCt
1ee0: 78 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72  x *p;.  p = (str
1ef0: 75 63 74 20 4e 74 68 56 61 6c 75 65 43 74 78 2a  uct NthValueCtx*
1f00: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
1f10: 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c  te_context(pCtx,
1f20: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
1f30: 69 66 28 20 70 20 26 26 20 70 2d 3e 70 56 61 6c  if( p && p->pVal
1f40: 75 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ue ){.    sqlite
1f50: 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 70  3_result_value(p
1f60: 43 74 78 2c 20 70 2d 3e 70 56 61 6c 75 65 29 3b  Ctx, p->pValue);
1f70: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  .    sqlite3_val
1f80: 75 65 5f 66 72 65 65 28 70 2d 3e 70 56 61 6c 75  ue_free(p->pValu
1f90: 65 29 3b 0a 20 20 20 20 70 2d 3e 70 56 61 6c 75  e);.    p->pValu
1fa0: 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 64 65  e = 0;.  }.}.#de
1fb0: 66 69 6e 65 20 6e 74 68 5f 76 61 6c 75 65 49 6e  fine nth_valueIn
1fc0: 76 46 75 6e 63 20 6e 6f 6f 70 53 74 65 70 46 75  vFunc noopStepFu
1fd0: 6e 63 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  nc../*.** Implem
1fe0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c  entation of buil
1ff0: 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63  t-in window func
2000: 74 69 6f 6e 20 72 61 6e 6b 28 29 2e 20 41 73 73  tion rank(). Ass
2010: 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 74 68 65  umes that.** the
2020: 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 20 68 61   window frame ha
2030: 73 20 62 65 65 6e 20 73 65 74 20 74 6f 3a 0a 2a  s been set to:.*
2040: 2a 0a 2a 2a 20 20 20 52 41 4e 47 45 20 42 45 54  *.**   RANGE BET
2050: 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50  WEEN UNBOUNDED P
2060: 52 45 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52  RECEDING AND CUR
2070: 52 45 4e 54 20 52 4f 57 20 0a 2a 2f 0a 73 74 61  RENT ROW .*/.sta
2080: 74 69 63 20 76 6f 69 64 20 72 61 6e 6b 53 74 65  tic void rankSte
2090: 70 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  pFunc(.  sqlite3
20a0: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20  _context *pCtx, 
20b0: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73  .  int nArg,.  s
20c0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
20d0: 70 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74  pArg.){.  struct
20e0: 20 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20   CallCount *p;. 
20f0: 20 70 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c   p = (struct Cal
2100: 6c 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f  lCount*)sqlite3_
2110: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
2120: 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a  t(pCtx, sizeof(*
2130: 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  p));.  if( p ){.
2140: 20 20 20 20 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a      p->nStep++;.
2150: 20 20 20 20 69 66 28 20 70 2d 3e 6e 56 61 6c 75      if( p->nValu
2160: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  e==0 ){.      p-
2170: 3e 6e 56 61 6c 75 65 20 3d 20 70 2d 3e 6e 53 74  >nValue = p->nSt
2180: 65 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ep;.    }.  }.  
2190: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
21a0: 28 6e 41 72 67 29 3b 0a 20 20 55 4e 55 53 45 44  (nArg);.  UNUSED
21b0: 5f 50 41 52 41 4d 45 54 45 52 28 61 70 41 72 67  _PARAMETER(apArg
21c0: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
21d0: 20 72 61 6e 6b 56 61 6c 75 65 46 75 6e 63 28 73   rankValueFunc(s
21e0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
21f0: 70 43 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20  pCtx){.  struct 
2200: 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20  CallCount *p;.  
2210: 70 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c  p = (struct Call
2220: 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61  Count*)sqlite3_a
2230: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
2240: 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70  (pCtx, sizeof(*p
2250: 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ));.  if( p ){. 
2260: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
2270: 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 70 2d  t_int64(pCtx, p-
2280: 3e 6e 56 61 6c 75 65 29 3b 0a 20 20 20 20 70 2d  >nValue);.    p-
2290: 3e 6e 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 7d  >nValue = 0;.  }
22a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
22b0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c  entation of buil
22c0: 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63  t-in window func
22d0: 74 69 6f 6e 20 70 65 72 63 65 6e 74 5f 72 61 6e  tion percent_ran
22e0: 6b 28 29 2e 20 41 73 73 75 6d 65 73 20 74 68 61  k(). Assumes tha
22f0: 74 0a 2a 2a 20 74 68 65 20 77 69 6e 64 6f 77 20  t.** the window 
2300: 66 72 61 6d 65 20 68 61 73 20 62 65 65 6e 20 73  frame has been s
2310: 65 74 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 47  et to:.**.**   G
2320: 52 4f 55 50 53 20 42 45 54 57 45 45 4e 20 43 55  ROUPS BETWEEN CU
2330: 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 55 4e  RRENT ROW AND UN
2340: 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e  BOUNDED FOLLOWIN
2350: 47 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  G.*/.static void
2360: 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b 53 74 65   percent_rankSte
2370: 70 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  pFunc(.  sqlite3
2380: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20  _context *pCtx, 
2390: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73  .  int nArg,.  s
23a0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
23b0: 70 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74  pArg.){.  struct
23c0: 20 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20   CallCount *p;. 
23d0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
23e0: 52 28 6e 41 72 67 29 3b 20 61 73 73 65 72 74 28  R(nArg); assert(
23f0: 20 6e 41 72 67 3d 3d 30 20 29 3b 0a 20 20 70 20   nArg==0 );.  p 
2400: 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  = (struct CallCo
2410: 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67  unt*)sqlite3_agg
2420: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70  regate_context(p
2430: 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  Ctx, sizeof(*p))
2440: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
2450: 20 70 2d 3e 6e 54 6f 74 61 6c 2b 2b 3b 0a 20 20   p->nTotal++;.  
2460: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
2470: 70 65 72 63 65 6e 74 5f 72 61 6e 6b 49 6e 76 46  percent_rankInvF
2480: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
2490: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
24a0: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
24b0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41  ite3_value **apA
24c0: 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 43  rg.){.  struct C
24d0: 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 55  allCount *p;.  U
24e0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
24f0: 6e 41 72 67 29 3b 20 61 73 73 65 72 74 28 20 6e  nArg); assert( n
2500: 41 72 67 3d 3d 30 20 29 3b 0a 20 20 70 20 3d 20  Arg==0 );.  p = 
2510: 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e  (struct CallCoun
2520: 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65  t*)sqlite3_aggre
2530: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74  gate_context(pCt
2540: 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  x, sizeof(*p));.
2550: 20 20 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 7d 0a    p->nStep++;.}.
2560: 73 74 61 74 69 63 20 76 6f 69 64 20 70 65 72 63  static void perc
2570: 65 6e 74 5f 72 61 6e 6b 56 61 6c 75 65 46 75 6e  ent_rankValueFun
2580: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
2590: 74 20 2a 70 43 74 78 29 7b 0a 20 20 73 74 72 75  t *pCtx){.  stru
25a0: 63 74 20 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b  ct CallCount *p;
25b0: 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74 20 43  .  p = (struct C
25c0: 61 6c 6c 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65  allCount*)sqlite
25d0: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
25e0: 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66  ext(pCtx, sizeof
25f0: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29  (*p));.  if( p )
2600: 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 6c 75 65 20  {.    p->nValue 
2610: 3d 20 70 2d 3e 6e 53 74 65 70 3b 0a 20 20 20 20  = p->nStep;.    
2620: 69 66 28 20 70 2d 3e 6e 54 6f 74 61 6c 3e 31 20  if( p->nTotal>1 
2630: 29 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20  ){.      double 
2640: 72 20 3d 20 28 64 6f 75 62 6c 65 29 70 2d 3e 6e  r = (double)p->n
2650: 56 61 6c 75 65 20 2f 20 28 64 6f 75 62 6c 65 29  Value / (double)
2660: 28 70 2d 3e 6e 54 6f 74 61 6c 2d 31 29 3b 0a 20  (p->nTotal-1);. 
2670: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
2680: 75 6c 74 5f 64 6f 75 62 6c 65 28 70 43 74 78 2c  ult_double(pCtx,
2690: 20 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   r);.    }else{.
26a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
26b0: 73 75 6c 74 5f 64 6f 75 62 6c 65 28 70 43 74 78  sult_double(pCtx
26c0: 2c 20 30 2e 30 29 3b 0a 20 20 20 20 7d 0a 20 20  , 0.0);.    }.  
26d0: 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 70 65 72 63  }.}.#define perc
26e0: 65 6e 74 5f 72 61 6e 6b 46 69 6e 61 6c 69 7a 65  ent_rankFinalize
26f0: 46 75 6e 63 20 70 65 72 63 65 6e 74 5f 72 61 6e  Func percent_ran
2700: 6b 56 61 6c 75 65 46 75 6e 63 0a 0a 2f 2a 0a 2a  kValueFunc../*.*
2710: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
2720: 20 6f 66 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e   of built-in win
2730: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 63 75 6d  dow function cum
2740: 65 5f 64 69 73 74 28 29 2e 20 41 73 73 75 6d 65  e_dist(). Assume
2750: 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 77 69  s that.** the wi
2760: 6e 64 6f 77 20 66 72 61 6d 65 20 68 61 73 20 62  ndow frame has b
2770: 65 65 6e 20 73 65 74 20 74 6f 3a 0a 2a 2a 0a 2a  een set to:.**.*
2780: 2a 20 20 20 47 52 4f 55 50 53 20 42 45 54 57 45  *   GROUPS BETWE
2790: 45 4e 20 31 20 46 4f 4c 4c 4f 57 49 4e 47 20 41  EN 1 FOLLOWING A
27a0: 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c  ND UNBOUNDED FOL
27b0: 4c 4f 57 49 4e 47 0a 2a 2f 0a 73 74 61 74 69 63  LOWING.*/.static
27c0: 20 76 6f 69 64 20 63 75 6d 65 5f 64 69 73 74 53   void cume_distS
27d0: 74 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  tepFunc(.  sqlit
27e0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
27f0: 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  , .  int nArg,. 
2800: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
2810: 2a 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72 75  *apArg.){.  stru
2820: 63 74 20 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b  ct CallCount *p;
2830: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2840: 54 45 52 28 6e 41 72 67 29 3b 20 61 73 73 65 72  TER(nArg); asser
2850: 74 28 20 6e 41 72 67 3d 3d 30 20 29 3b 0a 20 20  t( nArg==0 );.  
2860: 70 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c  p = (struct Call
2870: 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61  Count*)sqlite3_a
2880: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
2890: 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70  (pCtx, sizeof(*p
28a0: 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ));.  if( p ){. 
28b0: 20 20 20 70 2d 3e 6e 54 6f 74 61 6c 2b 2b 3b 0a     p->nTotal++;.
28c0: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
28d0: 64 20 63 75 6d 65 5f 64 69 73 74 49 6e 76 46 75  d cume_distInvFu
28e0: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
28f0: 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20  ntext *pCtx, .  
2900: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69  int nArg,.  sqli
2910: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72  te3_value **apAr
2920: 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61  g.){.  struct Ca
2930: 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 55 4e  llCount *p;.  UN
2940: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
2950: 41 72 67 29 3b 20 61 73 73 65 72 74 28 20 6e 41  Arg); assert( nA
2960: 72 67 3d 3d 30 20 29 3b 0a 20 20 70 20 3d 20 28  rg==0 );.  p = (
2970: 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74  struct CallCount
2980: 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  *)sqlite3_aggreg
2990: 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78  ate_context(pCtx
29a0: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
29b0: 20 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 7d 0a 73   p->nStep++;.}.s
29c0: 74 61 74 69 63 20 76 6f 69 64 20 63 75 6d 65 5f  tatic void cume_
29d0: 64 69 73 74 56 61 6c 75 65 46 75 6e 63 28 73 71  distValueFunc(sq
29e0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
29f0: 43 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20 43  Ctx){.  struct C
2a00: 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70  allCount *p;.  p
2a10: 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43   = (struct CallC
2a20: 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67  ount*)sqlite3_ag
2a30: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
2a40: 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29  pCtx, sizeof(*p)
2a50: 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  );.  if( p && p-
2a60: 3e 6e 54 6f 74 61 6c 20 29 7b 0a 20 20 20 20 64  >nTotal ){.    d
2a70: 6f 75 62 6c 65 20 72 20 3d 20 28 64 6f 75 62 6c  ouble r = (doubl
2a80: 65 29 28 70 2d 3e 6e 53 74 65 70 29 20 2f 20 28  e)(p->nStep) / (
2a90: 64 6f 75 62 6c 65 29 28 70 2d 3e 6e 54 6f 74 61  double)(p->nTota
2aa0: 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  l);.    sqlite3_
2ab0: 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 70 43  result_double(pC
2ac0: 74 78 2c 20 72 29 3b 0a 20 20 7d 0a 7d 0a 23 64  tx, r);.  }.}.#d
2ad0: 65 66 69 6e 65 20 63 75 6d 65 5f 64 69 73 74 46  efine cume_distF
2ae0: 69 6e 61 6c 69 7a 65 46 75 6e 63 20 63 75 6d 65  inalizeFunc cume
2af0: 5f 64 69 73 74 56 61 6c 75 65 46 75 6e 63 0a 0a  _distValueFunc..
2b00: 2f 2a 0a 2a 2a 20 43 6f 6e 74 65 78 74 20 6f 62  /*.** Context ob
2b10: 6a 65 63 74 20 66 6f 72 20 6e 74 69 6c 65 28 29  ject for ntile()
2b20: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
2b30: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 4e 74 69 6c  ..*/.struct Ntil
2b40: 65 43 74 78 20 7b 0a 20 20 69 36 34 20 6e 54 6f  eCtx {.  i64 nTo
2b50: 74 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  tal;            
2b60: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
2b70: 6c 20 72 6f 77 73 20 69 6e 20 70 61 72 74 69 74  l rows in partit
2b80: 69 6f 6e 20 2a 2f 0a 20 20 69 36 34 20 6e 50 61  ion */.  i64 nPa
2b90: 72 61 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  ram;            
2ba0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 61           /* Para
2bb0: 6d 65 74 65 72 20 70 61 73 73 65 64 20 74 6f 20  meter passed to 
2bc0: 6e 74 69 6c 65 28 4e 29 20 2a 2f 0a 20 20 69 36  ntile(N) */.  i6
2bd0: 34 20 69 52 6f 77 3b 20 20 20 20 20 20 20 20 20  4 iRow;         
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bf0: 20 43 75 72 72 65 6e 74 20 72 6f 77 20 2a 2f 0a   Current row */.
2c00: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  };../*.** Implem
2c10: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6e 74 69 6c  entation of ntil
2c20: 65 28 29 2e 20 54 68 69 73 20 61 73 73 75 6d 65  e(). This assume
2c30: 73 20 74 68 61 74 20 74 68 65 20 77 69 6e 64 6f  s that the windo
2c40: 77 20 66 72 61 6d 65 20 68 61 73 0a 2a 2a 20 62  w frame has.** b
2c50: 65 65 6e 20 63 6f 65 72 63 65 64 20 74 6f 3a 0a  een coerced to:.
2c60: 2a 2a 0a 2a 2a 20 20 20 52 4f 57 53 20 43 55 52  **.**   ROWS CUR
2c70: 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 55 4e 42  RENT ROW AND UNB
2c80: 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47  OUNDED FOLLOWING
2c90: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2ca0: 6e 74 69 6c 65 53 74 65 70 46 75 6e 63 28 0a 20  ntileStepFunc(. 
2cb0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
2cc0: 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
2cd0: 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
2ce0: 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a  alue **apArg.){.
2cf0: 20 20 73 74 72 75 63 74 20 4e 74 69 6c 65 43 74    struct NtileCt
2d00: 78 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20  x *p;.  assert( 
2d10: 6e 41 72 67 3d 3d 31 20 29 3b 20 55 4e 55 53 45  nArg==1 ); UNUSE
2d20: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72 67  D_PARAMETER(nArg
2d30: 29 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74  );.  p = (struct
2d40: 20 4e 74 69 6c 65 43 74 78 2a 29 73 71 6c 69 74   NtileCtx*)sqlit
2d50: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
2d60: 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f  text(pCtx, sizeo
2d70: 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20  f(*p));.  if( p 
2d80: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 54  ){.    if( p->nT
2d90: 6f 74 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  otal==0 ){.     
2da0: 20 70 2d 3e 6e 50 61 72 61 6d 20 3d 20 73 71 6c   p->nParam = sql
2db0: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
2dc0: 28 61 70 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20  (apArg[0]);.    
2dd0: 20 20 69 66 28 20 70 2d 3e 6e 50 61 72 61 6d 3c    if( p->nParam<
2de0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
2df0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
2e00: 6f 72 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  or(.            
2e10: 70 43 74 78 2c 20 22 61 72 67 75 6d 65 6e 74 20  pCtx, "argument 
2e20: 6f 66 20 6e 74 69 6c 65 20 6d 75 73 74 20 62 65  of ntile must be
2e30: 20 61 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65   a positive inte
2e40: 67 65 72 22 2c 20 2d 31 0a 20 20 20 20 20 20 20  ger", -1.       
2e50: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
2e60: 7d 0a 20 20 20 20 70 2d 3e 6e 54 6f 74 61 6c 2b  }.    p->nTotal+
2e70: 2b 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  +;.  }.}.static 
2e80: 76 6f 69 64 20 6e 74 69 6c 65 49 6e 76 46 75 6e  void ntileInvFun
2e90: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
2ea0: 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69  text *pCtx, .  i
2eb0: 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74  nt nArg,.  sqlit
2ec0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72 67  e3_value **apArg
2ed0: 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 4e 74 69  .){.  struct Nti
2ee0: 6c 65 43 74 78 20 2a 70 3b 0a 20 20 61 73 73 65  leCtx *p;.  asse
2ef0: 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 20 55  rt( nArg==1 ); U
2f00: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2f10: 6e 41 72 67 29 3b 0a 20 20 70 20 3d 20 28 73 74  nArg);.  p = (st
2f20: 72 75 63 74 20 4e 74 69 6c 65 43 74 78 2a 29 73  ruct NtileCtx*)s
2f30: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
2f40: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
2f50: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 70 2d  izeof(*p));.  p-
2f60: 3e 69 52 6f 77 2b 2b 3b 0a 7d 0a 73 74 61 74 69  >iRow++;.}.stati
2f70: 63 20 76 6f 69 64 20 6e 74 69 6c 65 56 61 6c 75  c void ntileValu
2f80: 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  eFunc(sqlite3_co
2f90: 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20 20  ntext *pCtx){.  
2fa0: 73 74 72 75 63 74 20 4e 74 69 6c 65 43 74 78 20  struct NtileCtx 
2fb0: 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63  *p;.  p = (struc
2fc0: 74 20 4e 74 69 6c 65 43 74 78 2a 29 73 71 6c 69  t NtileCtx*)sqli
2fd0: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
2fe0: 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65  ntext(pCtx, size
2ff0: 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70  of(*p));.  if( p
3000: 20 26 26 20 70 2d 3e 6e 50 61 72 61 6d 3e 30 20   && p->nParam>0 
3010: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 69 7a 65  ){.    int nSize
3020: 20 3d 20 28 70 2d 3e 6e 54 6f 74 61 6c 20 2f 20   = (p->nTotal / 
3030: 70 2d 3e 6e 50 61 72 61 6d 29 3b 0a 20 20 20 20  p->nParam);.    
3040: 69 66 28 20 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a  if( nSize==0 ){.
3050: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
3060: 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c  sult_int64(pCtx,
3070: 20 70 2d 3e 69 52 6f 77 2b 31 29 3b 0a 20 20 20   p->iRow+1);.   
3080: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 36   }else{.      i6
3090: 34 20 6e 4c 61 72 67 65 20 3d 20 70 2d 3e 6e 54  4 nLarge = p->nT
30a0: 6f 74 61 6c 20 2d 20 70 2d 3e 6e 50 61 72 61 6d  otal - p->nParam
30b0: 2a 6e 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 36  *nSize;.      i6
30c0: 34 20 69 53 6d 61 6c 6c 20 3d 20 6e 4c 61 72 67  4 iSmall = nLarg
30d0: 65 2a 28 6e 53 69 7a 65 2b 31 29 3b 0a 20 20 20  e*(nSize+1);.   
30e0: 20 20 20 69 36 34 20 69 52 6f 77 20 3d 20 70 2d     i64 iRow = p-
30f0: 3e 69 52 6f 77 3b 0a 0a 20 20 20 20 20 20 61 73  >iRow;..      as
3100: 73 65 72 74 28 20 28 6e 4c 61 72 67 65 2a 28 6e  sert( (nLarge*(n
3110: 53 69 7a 65 2b 31 29 20 2b 20 28 70 2d 3e 6e 50  Size+1) + (p->nP
3120: 61 72 61 6d 2d 6e 4c 61 72 67 65 29 2a 6e 53 69  aram-nLarge)*nSi
3130: 7a 65 29 3d 3d 70 2d 3e 6e 54 6f 74 61 6c 20 29  ze)==p->nTotal )
3140: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 69 52 6f  ;..      if( iRo
3150: 77 3c 69 53 6d 61 6c 6c 20 29 7b 0a 20 20 20 20  w<iSmall ){.    
3160: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
3170: 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 31  lt_int64(pCtx, 1
3180: 20 2b 20 69 52 6f 77 2f 28 6e 53 69 7a 65 2b 31   + iRow/(nSize+1
3190: 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
31a0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
31b0: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43  _result_int64(pC
31c0: 74 78 2c 20 31 20 2b 20 6e 4c 61 72 67 65 20 2b  tx, 1 + nLarge +
31d0: 20 28 69 52 6f 77 2d 69 53 6d 61 6c 6c 29 2f 6e   (iRow-iSmall)/n
31e0: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Size);.      }. 
31f0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 64 65 66 69     }.  }.}.#defi
3200: 6e 65 20 6e 74 69 6c 65 46 69 6e 61 6c 69 7a 65  ne ntileFinalize
3210: 46 75 6e 63 20 6e 74 69 6c 65 56 61 6c 75 65 46  Func ntileValueF
3220: 75 6e 63 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65  unc../*.** Conte
3230: 78 74 20 6f 62 6a 65 63 74 20 66 6f 72 20 6c 61  xt object for la
3240: 73 74 5f 76 61 6c 75 65 28 29 20 77 69 6e 64 6f  st_value() windo
3250: 77 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  w function..*/.s
3260: 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75 65 43  truct LastValueC
3270: 74 78 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  tx {.  sqlite3_v
3280: 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e  alue *pVal;.  in
3290: 74 20 6e 56 61 6c 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a  t nVal;.};../*.*
32a0: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
32b0: 20 6f 66 20 6c 61 73 74 5f 76 61 6c 75 65 28 29   of last_value()
32c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
32d0: 20 6c 61 73 74 5f 76 61 6c 75 65 53 74 65 70 46   last_valueStepF
32e0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
32f0: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
3300: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
3310: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41  ite3_value **apA
3320: 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 4c  rg.){.  struct L
3330: 61 73 74 56 61 6c 75 65 43 74 78 20 2a 70 3b 0a  astValueCtx *p;.
3340: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
3350: 45 52 28 6e 41 72 67 29 3b 0a 20 20 70 20 3d 20  ER(nArg);.  p = 
3360: 28 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75  (struct LastValu
3370: 65 43 74 78 2a 29 73 71 6c 69 74 65 33 5f 61 67  eCtx*)sqlite3_ag
3380: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
3390: 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29  pCtx, sizeof(*p)
33a0: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
33b0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f    sqlite3_value_
33c0: 66 72 65 65 28 70 2d 3e 70 56 61 6c 29 3b 0a 20  free(p->pVal);. 
33d0: 20 20 20 70 2d 3e 70 56 61 6c 20 3d 20 73 71 6c     p->pVal = sql
33e0: 69 74 65 33 5f 76 61 6c 75 65 5f 64 75 70 28 61  ite3_value_dup(a
33f0: 70 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 69 66  pArg[0]);.    if
3400: 28 20 70 2d 3e 70 56 61 6c 3d 3d 30 20 29 7b 0a  ( p->pVal==0 ){.
3410: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
3420: 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d  sult_error_nomem
3430: 28 70 43 74 78 29 3b 0a 20 20 20 20 7d 65 6c 73  (pCtx);.    }els
3440: 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61 6c  e{.      p->nVal
3450: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ++;.    }.  }.}.
3460: 73 74 61 74 69 63 20 76 6f 69 64 20 6c 61 73 74  static void last
3470: 5f 76 61 6c 75 65 49 6e 76 46 75 6e 63 28 0a 20  _valueInvFunc(. 
3480: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
3490: 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
34a0: 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
34b0: 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a  alue **apArg.){.
34c0: 20 20 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c    struct LastVal
34d0: 75 65 43 74 78 20 2a 70 3b 0a 20 20 55 4e 55 53  ueCtx *p;.  UNUS
34e0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72  ED_PARAMETER(nAr
34f0: 67 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  g);.  UNUSED_PAR
3500: 41 4d 45 54 45 52 28 61 70 41 72 67 29 3b 0a 20  AMETER(apArg);. 
3510: 20 70 20 3d 20 28 73 74 72 75 63 74 20 4c 61 73   p = (struct Las
3520: 74 56 61 6c 75 65 43 74 78 2a 29 73 71 6c 69 74  tValueCtx*)sqlit
3530: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
3540: 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f  text(pCtx, sizeo
3550: 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 41 4c  f(*p));.  if( AL
3560: 57 41 59 53 28 70 29 20 29 7b 0a 20 20 20 20 70  WAYS(p) ){.    p
3570: 2d 3e 6e 56 61 6c 2d 2d 3b 0a 20 20 20 20 69 66  ->nVal--;.    if
3580: 28 20 70 2d 3e 6e 56 61 6c 3d 3d 30 20 29 7b 0a  ( p->nVal==0 ){.
3590: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
35a0: 6c 75 65 5f 66 72 65 65 28 70 2d 3e 70 56 61 6c  lue_free(p->pVal
35b0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 56 61 6c  );.      p->pVal
35c0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
35d0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 61  }.static void la
35e0: 73 74 5f 76 61 6c 75 65 56 61 6c 75 65 46 75 6e  st_valueValueFun
35f0: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
3600: 74 20 2a 70 43 74 78 29 7b 0a 20 20 73 74 72 75  t *pCtx){.  stru
3610: 63 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 20  ct LastValueCtx 
3620: 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63  *p;.  p = (struc
3630: 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 2a 29  t LastValueCtx*)
3640: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
3650: 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20  e_context(pCtx, 
3660: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69  sizeof(*p));.  i
3670: 66 28 20 70 20 26 26 20 70 2d 3e 70 56 61 6c 20  f( p && p->pVal 
3680: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
3690: 65 73 75 6c 74 5f 76 61 6c 75 65 28 70 43 74 78  esult_value(pCtx
36a0: 2c 20 70 2d 3e 70 56 61 6c 29 3b 0a 20 20 7d 0a  , p->pVal);.  }.
36b0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 61  }.static void la
36c0: 73 74 5f 76 61 6c 75 65 46 69 6e 61 6c 69 7a 65  st_valueFinalize
36d0: 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Func(sqlite3_con
36e0: 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20 20 73  text *pCtx){.  s
36f0: 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75 65 43  truct LastValueC
3700: 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74  tx *p;.  p = (st
3710: 72 75 63 74 20 4c 61 73 74 56 61 6c 75 65 43 74  ruct LastValueCt
3720: 78 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65  x*)sqlite3_aggre
3730: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74  gate_context(pCt
3740: 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  x, sizeof(*p));.
3750: 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 70 56    if( p && p->pV
3760: 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  al ){.    sqlite
3770: 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 70  3_result_value(p
3780: 43 74 78 2c 20 70 2d 3e 70 56 61 6c 29 3b 0a 20  Ctx, p->pVal);. 
3790: 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
37a0: 5f 66 72 65 65 28 70 2d 3e 70 56 61 6c 29 3b 0a  _free(p->pVal);.
37b0: 20 20 20 20 70 2d 3e 70 56 61 6c 20 3d 20 30 3b      p->pVal = 0;
37c0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74  .  }.}../*.** St
37d0: 61 74 69 63 20 6e 61 6d 65 73 20 66 6f 72 20 74  atic names for t
37e0: 68 65 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64  he built-in wind
37f0: 6f 77 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  ow function name
3800: 73 2e 20 20 54 68 65 73 65 20 73 74 61 74 69 63  s.  These static
3810: 0a 2a 2a 20 6e 61 6d 65 73 20 61 72 65 20 75 73  .** names are us
3820: 65 64 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20  ed, rather than 
3830: 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 73 2c  string literals,
3840: 20 73 6f 20 74 68 61 74 20 46 75 6e 63 44 65 66   so that FuncDef
3850: 20 6f 62 6a 65 63 74 73 0a 2a 2a 20 63 61 6e 20   objects.** can 
3860: 62 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  be associated wi
3870: 74 68 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  th a particular 
3880: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
3890: 62 79 20 64 69 72 65 63 74 0a 2a 2a 20 63 6f 6d  by direct.** com
38a0: 70 61 72 69 73 6f 6e 20 6f 66 20 74 68 65 20 7a  parison of the z
38b0: 4e 61 6d 65 20 70 6f 69 6e 74 65 72 2e 20 20 45  Name pointer.  E
38c0: 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
38d0: 20 20 20 20 69 66 28 20 70 46 75 6e 63 44 65 66      if( pFuncDef
38e0: 2d 3e 7a 4e 61 6d 65 3d 3d 72 6f 77 5f 76 61 6c  ->zName==row_val
38f0: 75 65 4e 61 6d 65 20 29 7b 20 2e 2e 2e 20 7d 0a  ueName ){ ... }.
3900: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
3910: 63 68 61 72 20 72 6f 77 5f 6e 75 6d 62 65 72 4e  char row_numberN
3920: 61 6d 65 5b 5d 20 3d 20 20 20 22 72 6f 77 5f 6e  ame[] =   "row_n
3930: 75 6d 62 65 72 22 3b 0a 73 74 61 74 69 63 20 63  umber";.static c
3940: 6f 6e 73 74 20 63 68 61 72 20 64 65 6e 73 65 5f  onst char dense_
3950: 72 61 6e 6b 4e 61 6d 65 5b 5d 20 3d 20 20 20 22  rankName[] =   "
3960: 64 65 6e 73 65 5f 72 61 6e 6b 22 3b 0a 73 74 61  dense_rank";.sta
3970: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 72  tic const char r
3980: 61 6e 6b 4e 61 6d 65 5b 5d 20 3d 20 20 20 20 20  ankName[] =     
3990: 20 20 20 20 22 72 61 6e 6b 22 3b 0a 73 74 61 74      "rank";.stat
39a0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 70 65  ic const char pe
39b0: 72 63 65 6e 74 5f 72 61 6e 6b 4e 61 6d 65 5b 5d  rcent_rankName[]
39c0: 20 3d 20 22 70 65 72 63 65 6e 74 5f 72 61 6e 6b   = "percent_rank
39d0: 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  ";.static const 
39e0: 63 68 61 72 20 63 75 6d 65 5f 64 69 73 74 4e 61  char cume_distNa
39f0: 6d 65 5b 5d 20 3d 20 20 20 20 22 63 75 6d 65 5f  me[] =    "cume_
3a00: 64 69 73 74 22 3b 0a 73 74 61 74 69 63 20 63 6f  dist";.static co
3a10: 6e 73 74 20 63 68 61 72 20 6e 74 69 6c 65 4e 61  nst char ntileNa
3a20: 6d 65 5b 5d 20 3d 20 20 20 20 20 20 20 20 22 6e  me[] =        "n
3a30: 74 69 6c 65 22 3b 0a 73 74 61 74 69 63 20 63 6f  tile";.static co
3a40: 6e 73 74 20 63 68 61 72 20 6c 61 73 74 5f 76 61  nst char last_va
3a50: 6c 75 65 4e 61 6d 65 5b 5d 20 3d 20 20 20 22 6c  lueName[] =   "l
3a60: 61 73 74 5f 76 61 6c 75 65 22 3b 0a 73 74 61 74  ast_value";.stat
3a70: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6e 74  ic const char nt
3a80: 68 5f 76 61 6c 75 65 4e 61 6d 65 5b 5d 20 3d 20  h_valueName[] = 
3a90: 20 20 20 22 6e 74 68 5f 76 61 6c 75 65 22 3b 0a     "nth_value";.
3aa0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
3ab0: 72 20 66 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d  r first_valueNam
3ac0: 65 5b 5d 20 3d 20 20 22 66 69 72 73 74 5f 76 61  e[] =  "first_va
3ad0: 6c 75 65 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e  lue";.static con
3ae0: 73 74 20 63 68 61 72 20 6c 65 61 64 4e 61 6d 65  st char leadName
3af0: 5b 5d 20 3d 20 20 20 20 20 20 20 20 20 22 6c 65  [] =         "le
3b00: 61 64 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73  ad";.static cons
3b10: 74 20 63 68 61 72 20 6c 61 67 4e 61 6d 65 5b 5d  t char lagName[]
3b20: 20 3d 20 20 20 20 20 20 20 20 20 20 22 6c 61 67   =          "lag
3b30: 22 3b 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20  ";../*.** No-op 
3b40: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
3b50: 6f 66 20 78 53 74 65 70 28 29 20 61 6e 64 20 78  of xStep() and x
3b60: 46 69 6e 61 6c 69 7a 65 28 29 2e 20 20 55 73 65  Finalize().  Use
3b70: 64 20 61 73 20 70 6c 61 63 65 2d 68 6f 6c 64 65  d as place-holde
3b80: 72 73 0a 2a 2a 20 66 6f 72 20 62 75 69 6c 74 2d  rs.** for built-
3b90: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
3ba0: 6f 6e 73 20 74 68 61 74 20 6e 65 76 65 72 20 63  ons that never c
3bb0: 61 6c 6c 20 74 68 6f 73 65 20 69 6e 74 65 72 66  all those interf
3bc0: 61 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  aces..**.** The 
3bd0: 6e 6f 6f 70 56 61 6c 75 65 46 75 6e 63 28 29 20  noopValueFunc() 
3be0: 69 73 20 63 61 6c 6c 65 64 20 62 75 74 20 69 73  is called but is
3bf0: 20 65 78 70 65 63 74 65 64 20 74 6f 20 64 6f 20   expected to do 
3c00: 6e 6f 74 68 69 6e 67 2e 20 20 54 68 65 0a 2a 2a  nothing.  The.**
3c10: 20 6e 6f 6f 70 53 74 65 70 46 75 6e 63 28 29 20   noopStepFunc() 
3c20: 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2c  is never called,
3c30: 20 61 6e 64 20 73 6f 20 69 74 20 69 73 20 6d 61   and so it is ma
3c40: 72 6b 65 64 20 77 69 74 68 20 4e 4f 5f 54 45 53  rked with NO_TES
3c50: 54 20 74 6f 0a 2a 2a 20 6c 65 74 20 74 68 65 20  T to.** let the 
3c60: 74 65 73 74 20 63 6f 76 65 72 61 67 65 20 72 6f  test coverage ro
3c70: 75 74 69 6e 65 20 6b 6e 6f 77 20 6e 6f 74 20 74  utine know not t
3c80: 6f 20 65 78 70 65 63 74 20 74 68 69 73 20 66 75  o expect this fu
3c90: 6e 63 74 69 6f 6e 20 74 6f 20 62 65 0a 2a 2a 20  nction to be.** 
3ca0: 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74  invoked..*/.stat
3cb0: 69 63 20 76 6f 69 64 20 6e 6f 6f 70 53 74 65 70  ic void noopStep
3cc0: 46 75 6e 63 28 20 20 20 20 2f 2a 4e 4f 5f 54 45  Func(    /*NO_TE
3cd0: 53 54 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 63  ST*/.  sqlite3_c
3ce0: 6f 6e 74 65 78 74 20 2a 70 2c 20 20 20 20 20 20  ontext *p,      
3cf0: 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20    /*NO_TEST*/.  
3d00: 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20  int n,          
3d10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f             /*NO_
3d20: 54 45 53 54 2a 2f 0a 20 20 73 71 6c 69 74 65 33  TEST*/.  sqlite3
3d30: 5f 76 61 6c 75 65 20 2a 2a 61 20 20 20 20 20 20  _value **a      
3d40: 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a      /*NO_TEST*/.
3d50: 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ){              
3d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4e               /*N
3d70: 4f 5f 54 45 53 54 2a 2f 0a 20 20 55 4e 55 53 45  O_TEST*/.  UNUSE
3d80: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 20  D_PARAMETER(p); 
3d90: 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a        /*NO_TEST*
3da0: 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  /.  UNUSED_PARAM
3db0: 45 54 45 52 28 6e 29 3b 20 20 20 20 20 20 20 2f  ETER(n);       /
3dc0: 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 55 4e 55  *NO_TEST*/.  UNU
3dd0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 29  SED_PARAMETER(a)
3de0: 3b 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53  ;       /*NO_TES
3df0: 54 2a 2f 0a 20 20 61 73 73 65 72 74 28 30 29 3b  T*/.  assert(0);
3e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e10: 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 7d 20 20   /*NO_TEST*/.}  
3e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e30: 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54            /*NO_T
3e40: 45 53 54 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  EST*/.static voi
3e50: 64 20 6e 6f 6f 70 56 61 6c 75 65 46 75 6e 63 28  d noopValueFunc(
3e60: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
3e70: 2a 70 29 7b 20 55 4e 55 53 45 44 5f 50 41 52 41  *p){ UNUSED_PARA
3e80: 4d 45 54 45 52 28 70 29 3b 20 2f 2a 6e 6f 2d 6f  METER(p); /*no-o
3e90: 70 2a 2f 20 7d 0a 0a 2f 2a 20 57 69 6e 64 6f 77  p*/ }../* Window
3ea0: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
3eb0: 75 73 65 20 61 6c 6c 20 77 69 6e 64 6f 77 20 69  use all window i
3ec0: 6e 74 65 72 66 61 63 65 73 3a 20 78 53 74 65 70  nterfaces: xStep
3ed0: 2c 20 78 46 69 6e 61 6c 2c 0a 2a 2a 20 78 56 61  , xFinal,.** xVa
3ee0: 6c 75 65 2c 20 61 6e 64 20 78 49 6e 76 65 72 73  lue, and xInvers
3ef0: 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e  e */.#define WIN
3f00: 44 4f 57 46 55 4e 43 41 4c 4c 28 6e 61 6d 65 2c  DOWFUNCALL(name,
3f10: 6e 41 72 67 2c 65 78 74 72 61 29 20 7b 20 20 20  nArg,extra) {   
3f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f40: 5c 0a 20 20 6e 41 72 67 2c 20 28 53 51 4c 49 54  \.  nArg, (SQLIT
3f50: 45 5f 55 54 46 38 7c 53 51 4c 49 54 45 5f 46 55  E_UTF8|SQLITE_FU
3f60: 4e 43 5f 57 49 4e 44 4f 57 7c 65 78 74 72 61 29  NC_WINDOW|extra)
3f70: 2c 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 20  , 0, 0,         
3f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
3f90: 20 6e 61 6d 65 20 23 23 20 53 74 65 70 46 75 6e   name ## StepFun
3fa0: 63 2c 20 6e 61 6d 65 20 23 23 20 46 69 6e 61 6c  c, name ## Final
3fb0: 69 7a 65 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23  izeFunc, name ##
3fc0: 20 56 61 6c 75 65 46 75 6e 63 2c 20 20 20 20 20   ValueFunc,     
3fd0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6e 61            \.  na
3fe0: 6d 65 20 23 23 20 49 6e 76 46 75 6e 63 2c 20 6e  me ## InvFunc, n
3ff0: 61 6d 65 20 23 23 20 4e 61 6d 65 2c 20 7b 30 7d  ame ## Name, {0}
4000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4020: 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 20 57         \.}../* W
4030: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
4040: 74 68 61 74 20 61 72 65 20 69 6d 70 6c 65 6d 65  that are impleme
4050: 6e 74 65 64 20 75 73 69 6e 67 20 62 79 74 65 63  nted using bytec
4060: 6f 64 65 20 61 6e 64 20 74 68 75 73 20 68 61 76  ode and thus hav
4070: 65 0a 2a 2a 20 6e 6f 2d 6f 70 20 72 6f 75 74 69  e.** no-op routi
4080: 6e 65 73 20 66 6f 72 20 74 68 65 69 72 20 6d 65  nes for their me
4090: 74 68 6f 64 73 20 2a 2f 0a 23 64 65 66 69 6e 65  thods */.#define
40a0: 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f 4f 50 28   WINDOWFUNCNOOP(
40b0: 6e 61 6d 65 2c 6e 41 72 67 2c 65 78 74 72 61 29  name,nArg,extra)
40c0: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
40d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40e0: 20 20 20 20 5c 0a 20 20 6e 41 72 67 2c 20 28 53      \.  nArg, (S
40f0: 51 4c 49 54 45 5f 55 54 46 38 7c 53 51 4c 49 54  QLITE_UTF8|SQLIT
4100: 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 7c 65 78  E_FUNC_WINDOW|ex
4110: 74 72 61 29 2c 20 30 2c 20 30 2c 20 20 20 20 20  tra), 0, 0,     
4120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4130: 20 5c 0a 20 20 6e 6f 6f 70 53 74 65 70 46 75 6e   \.  noopStepFun
4140: 63 2c 20 6e 6f 6f 70 56 61 6c 75 65 46 75 6e 63  c, noopValueFunc
4150: 2c 20 6e 6f 6f 70 56 61 6c 75 65 46 75 6e 63 2c  , noopValueFunc,
4160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
4180: 20 20 6e 6f 6f 70 53 74 65 70 46 75 6e 63 2c 20    noopStepFunc, 
4190: 6e 61 6d 65 20 23 23 20 4e 61 6d 65 2c 20 7b 30  name ## Name, {0
41a0: 7d 20 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 20 20 20                  
41c0: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a             \.}..
41d0: 2f 2a 20 57 69 6e 64 6f 77 20 66 75 6e 63 74 69  /* Window functi
41e0: 6f 6e 73 20 74 68 61 74 20 75 73 65 20 61 6c 6c  ons that use all
41f0: 20 77 69 6e 64 6f 77 20 69 6e 74 65 72 66 61 63   window interfac
4200: 65 73 3a 20 78 53 74 65 70 2c 20 74 68 65 0a 2a  es: xStep, the.*
4210: 2a 20 73 61 6d 65 20 72 6f 75 74 69 6e 65 20 66  * same routine f
4220: 6f 72 20 78 46 69 6e 61 6c 69 7a 65 20 61 6e 64  or xFinalize and
4230: 20 78 56 61 6c 75 65 20 61 6e 64 20 77 68 69 63   xValue and whic
4240: 68 20 6e 65 76 65 72 20 63 61 6c 6c 0a 2a 2a 20  h never call.** 
4250: 78 49 6e 76 65 72 73 65 2e 20 2a 2f 0a 23 64 65  xInverse. */.#de
4260: 66 69 6e 65 20 57 49 4e 44 4f 57 46 55 4e 43 58  fine WINDOWFUNCX
4270: 28 6e 61 6d 65 2c 6e 41 72 67 2c 65 78 74 72 61  (name,nArg,extra
4280: 29 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  ) {             
4290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42a0: 20 20 20 20 20 20 20 20 5c 0a 20 20 6e 41 72 67          \.  nArg
42b0: 2c 20 28 53 51 4c 49 54 45 5f 55 54 46 38 7c 53  , (SQLITE_UTF8|S
42c0: 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f  QLITE_FUNC_WINDO
42d0: 57 7c 65 78 74 72 61 29 2c 20 30 2c 20 30 2c 20  W|extra), 0, 0, 
42e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42f0: 20 20 20 20 20 5c 0a 20 20 6e 61 6d 65 20 23 23       \.  name ##
4300: 20 53 74 65 70 46 75 6e 63 2c 20 6e 61 6d 65 20   StepFunc, name 
4310: 23 23 20 56 61 6c 75 65 46 75 6e 63 2c 20 6e 61  ## ValueFunc, na
4320: 6d 65 20 23 23 20 56 61 6c 75 65 46 75 6e 63 2c  me ## ValueFunc,
4330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4340: 20 20 5c 0a 20 20 6e 6f 6f 70 53 74 65 70 46 75    \.  noopStepFu
4350: 6e 63 2c 20 6e 61 6d 65 20 23 23 20 4e 61 6d 65  nc, name ## Name
4360: 2c 20 7b 30 7d 20 20 20 20 20 20 20 20 20 20 20  , {0}           
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 5c                 \
4390: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  .}.../*.** Regis
43a0: 74 65 72 20 74 68 6f 73 65 20 62 75 69 6c 74 2d  ter those built-
43b0: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
43c0: 6f 6e 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74  ons that are not
43d0: 20 61 6c 73 6f 20 61 67 67 72 65 67 61 74 65 73   also aggregates
43e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
43f0: 33 57 69 6e 64 6f 77 46 75 6e 63 74 69 6f 6e 73  3WindowFunctions
4400: 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
4410: 20 46 75 6e 63 44 65 66 20 61 57 69 6e 64 6f 77   FuncDef aWindow
4420: 46 75 6e 63 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  Funcs[] = {.    
4430: 57 49 4e 44 4f 57 46 55 4e 43 58 28 72 6f 77 5f  WINDOWFUNCX(row_
4440: 6e 75 6d 62 65 72 2c 20 30 2c 20 30 29 2c 0a 20  number, 0, 0),. 
4450: 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 58 28 64     WINDOWFUNCX(d
4460: 65 6e 73 65 5f 72 61 6e 6b 2c 20 30 2c 20 30 29  ense_rank, 0, 0)
4470: 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43  ,.    WINDOWFUNC
4480: 58 28 72 61 6e 6b 2c 20 30 2c 20 30 29 2c 0a 20  X(rank, 0, 0),. 
4490: 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 41 4c 4c     WINDOWFUNCALL
44a0: 28 70 65 72 63 65 6e 74 5f 72 61 6e 6b 2c 20 30  (percent_rank, 0
44b0: 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57  , 0),.    WINDOW
44c0: 46 55 4e 43 41 4c 4c 28 63 75 6d 65 5f 64 69 73  FUNCALL(cume_dis
44d0: 74 2c 20 30 2c 20 30 29 2c 0a 20 20 20 20 57 49  t, 0, 0),.    WI
44e0: 4e 44 4f 57 46 55 4e 43 41 4c 4c 28 6e 74 69 6c  NDOWFUNCALL(ntil
44f0: 65 2c 20 31 2c 20 30 29 2c 0a 20 20 20 20 57 49  e, 1, 0),.    WI
4500: 4e 44 4f 57 46 55 4e 43 41 4c 4c 28 6c 61 73 74  NDOWFUNCALL(last
4510: 5f 76 61 6c 75 65 2c 20 31 2c 20 30 29 2c 0a 20  _value, 1, 0),. 
4520: 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 41 4c 4c     WINDOWFUNCALL
4530: 28 6e 74 68 5f 76 61 6c 75 65 2c 20 32 2c 20 30  (nth_value, 2, 0
4540: 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e  ),.    WINDOWFUN
4550: 43 4e 4f 4f 50 28 66 69 72 73 74 5f 76 61 6c 75  CNOOP(first_valu
4560: 65 2c 20 31 2c 20 30 29 2c 0a 20 20 20 20 57 49  e, 1, 0),.    WI
4570: 4e 44 4f 57 46 55 4e 43 4e 4f 4f 50 28 6c 65 61  NDOWFUNCNOOP(lea
4580: 64 2c 20 31 2c 20 30 29 2c 0a 20 20 20 20 57 49  d, 1, 0),.    WI
4590: 4e 44 4f 57 46 55 4e 43 4e 4f 4f 50 28 6c 65 61  NDOWFUNCNOOP(lea
45a0: 64 2c 20 32 2c 20 30 29 2c 0a 20 20 20 20 57 49  d, 2, 0),.    WI
45b0: 4e 44 4f 57 46 55 4e 43 4e 4f 4f 50 28 6c 65 61  NDOWFUNCNOOP(lea
45c0: 64 2c 20 33 2c 20 30 29 2c 0a 20 20 20 20 57 49  d, 3, 0),.    WI
45d0: 4e 44 4f 57 46 55 4e 43 4e 4f 4f 50 28 6c 61 67  NDOWFUNCNOOP(lag
45e0: 2c 20 31 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e  , 1, 0),.    WIN
45f0: 44 4f 57 46 55 4e 43 4e 4f 4f 50 28 6c 61 67 2c  DOWFUNCNOOP(lag,
4600: 20 32 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44   2, 0),.    WIND
4610: 4f 57 46 55 4e 43 4e 4f 4f 50 28 6c 61 67 2c 20  OWFUNCNOOP(lag, 
4620: 33 2c 20 30 29 2c 0a 20 20 7d 3b 0a 20 20 73 71  3, 0),.  };.  sq
4630: 6c 69 74 65 33 49 6e 73 65 72 74 42 75 69 6c 74  lite3InsertBuilt
4640: 69 6e 46 75 6e 63 73 28 61 57 69 6e 64 6f 77 46  inFuncs(aWindowF
4650: 75 6e 63 73 2c 20 41 72 72 61 79 53 69 7a 65 28  uncs, ArraySize(
4660: 61 57 69 6e 64 6f 77 46 75 6e 63 73 29 29 3b 0a  aWindowFuncs));.
4670: 7d 0a 0a 73 74 61 74 69 63 20 57 69 6e 64 6f 77  }..static Window
4680: 20 2a 77 69 6e 64 6f 77 46 69 6e 64 28 50 61 72   *windowFind(Par
4690: 73 65 20 2a 70 50 61 72 73 65 2c 20 57 69 6e 64  se *pParse, Wind
46a0: 6f 77 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74  ow *pList, const
46b0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
46c0: 20 57 69 6e 64 6f 77 20 2a 70 3b 0a 20 20 66 6f   Window *p;.  fo
46d0: 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d  r(p=pList; p; p=
46e0: 70 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20  p->pNextWin){.  
46f0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
4700: 49 43 6d 70 28 70 2d 3e 7a 4e 61 6d 65 2c 20 7a  ICmp(p->zName, z
4710: 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b  Name)==0 ) break
4720: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 3d 3d 30  ;.  }.  if( p==0
4730: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
4740: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
4750: 22 6e 6f 20 73 75 63 68 20 77 69 6e 64 6f 77 3a  "no such window:
4760: 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
4770: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
4780: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
4790: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 69  tion is called i
47a0: 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
47b0: 20 72 65 73 6f 6c 76 69 6e 67 20 74 68 65 20 66   resolving the f
47c0: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 0a 2a 2a 20  unction name.** 
47d0: 66 6f 72 20 61 20 77 69 6e 64 6f 77 20 66 75 6e  for a window fun
47e0: 63 74 69 6f 6e 20 77 69 74 68 69 6e 20 61 20 53  ction within a S
47f0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
4800: 20 41 72 67 75 6d 65 6e 74 20 70 4c 69 73 74 20   Argument pList 
4810: 69 73 20 61 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c  is a.** linked l
4820: 69 73 74 20 6f 66 20 57 49 4e 44 4f 57 20 64 65  ist of WINDOW de
4830: 66 69 6e 69 74 69 6f 6e 73 20 66 6f 72 20 74 68  finitions for th
4840: 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  e current SELECT
4850: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 41   statement..** A
4860: 72 67 75 6d 65 6e 74 20 70 46 75 6e 63 20 69 73  rgument pFunc is
4870: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 65   the function de
4880: 66 69 6e 69 74 69 6f 6e 20 6a 75 73 74 20 72 65  finition just re
4890: 73 6f 6c 76 65 64 20 61 6e 64 20 70 57 69 6e 0a  solved and pWin.
48a0: 2a 2a 20 69 73 20 74 68 65 20 57 69 6e 64 6f 77  ** is the Window
48b0: 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e   object represen
48c0: 74 69 6e 67 20 74 68 65 20 61 73 73 6f 63 69 61  ting the associa
48d0: 74 65 64 20 4f 56 45 52 20 63 6c 61 75 73 65 2e  ted OVER clause.
48e0: 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
48f0: 6e 20 75 70 64 61 74 65 73 20 74 68 65 20 63 6f  n updates the co
4900: 6e 74 65 6e 74 73 20 6f 66 20 70 57 69 6e 20 61  ntents of pWin a
4910: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
4920: 20 20 20 2a 20 49 66 20 74 68 65 20 4f 56 45 52     * If the OVER
4930: 20 63 6c 61 75 73 65 20 72 65 66 65 72 65 64 20   clause refered 
4940: 74 6f 20 61 20 6e 61 6d 65 64 20 77 69 6e 64 6f  to a named windo
4950: 77 20 28 61 73 20 69 6e 20 22 6d 61 78 28 78 29  w (as in "max(x)
4960: 20 4f 56 45 52 20 77 69 6e 22 29 2c 0a 2a 2a 20   OVER win"),.** 
4970: 20 20 20 20 73 65 61 72 63 68 20 6c 69 73 74 20      search list 
4980: 70 4c 69 73 74 20 66 6f 72 20 61 20 6d 61 74 63  pList for a matc
4990: 68 69 6e 67 20 57 49 4e 44 4f 57 20 64 65 66 69  hing WINDOW defi
49a0: 6e 69 74 69 6f 6e 2c 20 61 6e 64 20 75 70 64 61  nition, and upda
49b0: 74 65 20 70 57 69 6e 0a 2a 2a 20 20 20 20 20 61  te pWin.**     a
49c0: 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20 6e  ccordingly. If n
49d0: 6f 20 73 75 63 68 20 57 49 4e 44 4f 57 20 63 6c  o such WINDOW cl
49e0: 61 75 73 65 20 63 61 6e 20 62 65 20 66 6f 75 6e  ause can be foun
49f0: 64 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  d, leave an erro
4a00: 72 0a 2a 2a 20 20 20 20 20 69 6e 20 70 50 61 72  r.**     in pPar
4a10: 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66  se..**.**   * If
4a20: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73   the function is
4a30: 20 61 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64   a built-in wind
4a40: 6f 77 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  ow function that
4a50: 20 72 65 71 75 69 72 65 73 20 74 68 65 0a 2a 2a   requires the.**
4a60: 20 20 20 20 20 77 69 6e 64 6f 77 20 74 6f 20 62       window to b
4a70: 65 20 63 6f 65 72 63 65 64 20 28 73 65 65 20 22  e coerced (see "
4a80: 42 55 49 4c 54 2d 49 4e 20 57 49 4e 44 4f 57 20  BUILT-IN WINDOW 
4a90: 46 55 4e 43 54 49 4f 4e 53 22 20 61 74 20 74 68  FUNCTIONS" at th
4aa0: 65 20 74 6f 70 0a 2a 2a 20 20 20 20 20 6f 66 20  e top.**     of 
4ab0: 74 68 69 73 20 66 69 6c 65 29 2c 20 70 57 69 6e  this file), pWin
4ac0: 20 69 73 20 75 70 64 61 74 65 64 20 68 65 72 65   is updated here
4ad0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4ae0: 33 57 69 6e 64 6f 77 55 70 64 61 74 65 28 0a 20  3WindowUpdate(. 
4af0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
4b00: 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4c 69 73 74  .  Window *pList
4b10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4b20: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6e 61     /* List of na
4b30: 6d 65 64 20 77 69 6e 64 6f 77 73 20 66 6f 72 20  med windows for 
4b40: 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20  this SELECT */. 
4b50: 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 2c 20 20   Window *pWin,  
4b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b70: 20 2f 2a 20 57 69 6e 64 6f 77 20 66 72 61 6d 65   /* Window frame
4b80: 20 74 6f 20 75 70 64 61 74 65 20 2a 2f 0a 20 20   to update */.  
4b90: 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20 20  FuncDef *pFunc  
4ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4bb0: 2f 2a 20 57 69 6e 64 6f 77 20 66 75 6e 63 74 69  /* Window functi
4bc0: 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 2a 2f  on definition */
4bd0: 0a 29 7b 0a 20 20 69 66 28 20 70 57 69 6e 2d 3e  .){.  if( pWin->
4be0: 7a 4e 61 6d 65 20 26 26 20 70 57 69 6e 2d 3e 65  zName && pWin->e
4bf0: 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 57  Type==0 ){.    W
4c00: 69 6e 64 6f 77 20 2a 70 20 3d 20 77 69 6e 64 6f  indow *p = windo
4c10: 77 46 69 6e 64 28 70 50 61 72 73 65 2c 20 70 4c  wFind(pParse, pL
4c20: 69 73 74 2c 20 70 57 69 6e 2d 3e 7a 4e 61 6d 65  ist, pWin->zName
4c30: 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20  );.    if( p==0 
4c40: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 57  ) return;.    pW
4c50: 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 3d  in->pPartition =
4c60: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
4c70: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
4c80: 70 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20 30  p->pPartition, 0
4c90: 29 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70 4f 72  );.    pWin->pOr
4ca0: 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45  derBy = sqlite3E
4cb0: 78 70 72 4c 69 73 74 44 75 70 28 70 50 61 72 73  xprListDup(pPars
4cc0: 65 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  e->db, p->pOrder
4cd0: 42 79 2c 20 30 29 3b 0a 20 20 20 20 70 57 69 6e  By, 0);.    pWin
4ce0: 2d 3e 70 53 74 61 72 74 20 3d 20 73 71 6c 69 74  ->pStart = sqlit
4cf0: 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65  e3ExprDup(pParse
4d00: 2d 3e 64 62 2c 20 70 2d 3e 70 53 74 61 72 74 2c  ->db, p->pStart,
4d10: 20 30 29 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70   0);.    pWin->p
4d20: 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 45 78 70  End = sqlite3Exp
4d30: 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
4d40: 20 70 2d 3e 70 45 6e 64 2c 20 30 29 3b 0a 20 20   p->pEnd, 0);.  
4d50: 20 20 70 57 69 6e 2d 3e 65 53 74 61 72 74 20 3d    pWin->eStart =
4d60: 20 70 2d 3e 65 53 74 61 72 74 3b 0a 20 20 20 20   p->eStart;.    
4d70: 70 57 69 6e 2d 3e 65 45 6e 64 20 3d 20 70 2d 3e  pWin->eEnd = p->
4d80: 65 45 6e 64 3b 0a 20 20 20 20 70 57 69 6e 2d 3e  eEnd;.    pWin->
4d90: 65 54 79 70 65 20 3d 20 70 2d 3e 65 54 79 70 65  eType = p->eType
4da0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
4db0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 68 61 69  qlite3WindowChai
4dc0: 6e 28 70 50 61 72 73 65 2c 20 70 57 69 6e 2c 20  n(pParse, pWin, 
4dd0: 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66  pList);.  }.  if
4de0: 28 20 28 70 57 69 6e 2d 3e 65 54 79 70 65 3d 3d  ( (pWin->eType==
4df0: 54 4b 5f 52 41 4e 47 45 29 0a 20 20 20 26 26 20  TK_RANGE).   && 
4e00: 28 70 57 69 6e 2d 3e 70 53 74 61 72 74 20 7c 7c  (pWin->pStart ||
4e10: 20 70 57 69 6e 2d 3e 70 45 6e 64 29 20 0a 20 20   pWin->pEnd) .  
4e20: 20 26 26 20 28 70 57 69 6e 2d 3e 70 4f 72 64 65   && (pWin->pOrde
4e30: 72 42 79 3d 3d 30 20 7c 7c 20 70 57 69 6e 2d 3e  rBy==0 || pWin->
4e40: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 21  pOrderBy->nExpr!
4e50: 3d 31 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c  =1).  ){.    sql
4e60: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
4e70: 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52 41 4e  rse, .      "RAN
4e80: 47 45 20 77 69 74 68 20 6f 66 66 73 65 74 20 50  GE with offset P
4e90: 52 45 43 45 44 49 4e 47 2f 46 4f 4c 4c 4f 57 49  RECEDING/FOLLOWI
4ea0: 4e 47 20 72 65 71 75 69 72 65 73 20 6f 6e 65 20  NG requires one 
4eb0: 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73  ORDER BY express
4ec0: 69 6f 6e 22 0a 20 20 20 20 29 3b 0a 20 20 7d 65  ion".    );.  }e
4ed0: 6c 73 65 0a 20 20 69 66 28 20 70 46 75 6e 63 2d  lse.  if( pFunc-
4ee0: 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
4ef0: 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 20  ITE_FUNC_WINDOW 
4f00: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  ){.    sqlite3 *
4f10: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
4f20: 0a 20 20 20 20 69 66 28 20 70 57 69 6e 2d 3e 70  .    if( pWin->p
4f30: 46 69 6c 74 65 72 20 29 7b 0a 20 20 20 20 20 20  Filter ){.      
4f40: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
4f50: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
4f60: 20 20 20 22 46 49 4c 54 45 52 20 63 6c 61 75 73     "FILTER claus
4f70: 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73  e may only be us
4f80: 65 64 20 77 69 74 68 20 61 67 67 72 65 67 61 74  ed with aggregat
4f90: 65 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  e window functio
4fa0: 6e 73 22 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ns".      );.   
4fb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74   }else{.      st
4fc0: 72 75 63 74 20 57 69 6e 64 6f 77 55 70 64 61 74  ruct WindowUpdat
4fd0: 65 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  e {.        cons
4fe0: 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 3b 0a 20  t char *zFunc;. 
4ff0: 20 20 20 20 20 20 20 69 6e 74 20 65 54 79 70 65         int eType
5000: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65 53  ;.        int eS
5010: 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 69 6e  tart;.        in
5020: 74 20 65 45 6e 64 3b 0a 20 20 20 20 20 20 7d 20  t eEnd;.      } 
5030: 61 55 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  aUp[] = {.      
5040: 20 20 7b 20 72 6f 77 5f 6e 75 6d 62 65 72 4e 61    { row_numberNa
5050: 6d 65 2c 20 20 20 54 4b 5f 52 4f 57 53 2c 20 20  me,   TK_ROWS,  
5060: 20 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 2c 20 54   TK_UNBOUNDED, T
5070: 4b 5f 43 55 52 52 45 4e 54 20 7d 2c 20 0a 20 20  K_CURRENT }, .  
5080: 20 20 20 20 20 20 7b 20 64 65 6e 73 65 5f 72 61        { dense_ra
5090: 6e 6b 4e 61 6d 65 2c 20 20 20 54 4b 5f 52 41 4e  nkName,   TK_RAN
50a0: 47 45 2c 20 20 54 4b 5f 55 4e 42 4f 55 4e 44 45  GE,  TK_UNBOUNDE
50b0: 44 2c 20 54 4b 5f 43 55 52 52 45 4e 54 20 7d 2c  D, TK_CURRENT },
50c0: 20 0a 20 20 20 20 20 20 20 20 7b 20 72 61 6e 6b   .        { rank
50d0: 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 54 4b  Name,         TK
50e0: 5f 52 41 4e 47 45 2c 20 20 54 4b 5f 55 4e 42 4f  _RANGE,  TK_UNBO
50f0: 55 4e 44 45 44 2c 20 54 4b 5f 43 55 52 52 45 4e  UNDED, TK_CURREN
5100: 54 20 7d 2c 20 0a 20 20 20 20 20 20 20 20 7b 20  T }, .        { 
5110: 70 65 72 63 65 6e 74 5f 72 61 6e 6b 4e 61 6d 65  percent_rankName
5120: 2c 20 54 4b 5f 47 52 4f 55 50 53 2c 20 54 4b 5f  , TK_GROUPS, TK_
5130: 43 55 52 52 45 4e 54 2c 20 20 20 54 4b 5f 55 4e  CURRENT,   TK_UN
5140: 42 4f 55 4e 44 45 44 20 7d 2c 20 0a 20 20 20 20  BOUNDED }, .    
5150: 20 20 20 20 7b 20 63 75 6d 65 5f 64 69 73 74 4e      { cume_distN
5160: 61 6d 65 2c 20 20 20 20 54 4b 5f 47 52 4f 55 50  ame,    TK_GROUP
5170: 53 2c 20 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 2c  S, TK_FOLLOWING,
5180: 20 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 7d 2c   TK_UNBOUNDED },
5190: 20 0a 20 20 20 20 20 20 20 20 7b 20 6e 74 69 6c   .        { ntil
51a0: 65 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 54 4b  eName,        TK
51b0: 5f 52 4f 57 53 2c 20 20 20 54 4b 5f 43 55 52 52  _ROWS,   TK_CURR
51c0: 45 4e 54 2c 20 20 20 54 4b 5f 55 4e 42 4f 55 4e  ENT,   TK_UNBOUN
51d0: 44 45 44 20 7d 2c 20 0a 20 20 20 20 20 20 20 20  DED }, .        
51e0: 7b 20 6c 65 61 64 4e 61 6d 65 2c 20 20 20 20 20  { leadName,     
51f0: 20 20 20 20 54 4b 5f 52 4f 57 53 2c 20 20 20 54      TK_ROWS,   T
5200: 4b 5f 55 4e 42 4f 55 4e 44 45 44 2c 20 54 4b 5f  K_UNBOUNDED, TK_
5210: 55 4e 42 4f 55 4e 44 45 44 20 7d 2c 20 0a 20 20  UNBOUNDED }, .  
5220: 20 20 20 20 20 20 7b 20 6c 61 67 4e 61 6d 65 2c        { lagName,
5230: 20 20 20 20 20 20 20 20 20 20 54 4b 5f 52 4f 57            TK_ROW
5240: 53 2c 20 20 20 54 4b 5f 55 4e 42 4f 55 4e 44 45  S,   TK_UNBOUNDE
5250: 44 2c 20 54 4b 5f 43 55 52 52 45 4e 54 20 7d 2c  D, TK_CURRENT },
5260: 20 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20   .      };.     
5270: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f   int i;.      fo
5280: 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
5290: 7a 65 28 61 55 70 29 3b 20 69 2b 2b 29 7b 0a 20  ze(aUp); i++){. 
52a0: 20 20 20 20 20 20 20 69 66 28 20 70 46 75 6e 63         if( pFunc
52b0: 2d 3e 7a 4e 61 6d 65 3d 3d 61 55 70 5b 69 5d 2e  ->zName==aUp[i].
52c0: 7a 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  zFunc ){.       
52d0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
52e0: 6c 65 74 65 28 64 62 2c 20 70 57 69 6e 2d 3e 70  lete(db, pWin->p
52f0: 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20  Start);.        
5300: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
5310: 65 74 65 28 64 62 2c 20 70 57 69 6e 2d 3e 70 45  ete(db, pWin->pE
5320: 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  nd);.          p
5330: 57 69 6e 2d 3e 70 45 6e 64 20 3d 20 70 57 69 6e  Win->pEnd = pWin
5340: 2d 3e 70 53 74 61 72 74 20 3d 20 30 3b 0a 20 20  ->pStart = 0;.  
5350: 20 20 20 20 20 20 20 20 70 57 69 6e 2d 3e 65 54          pWin->eT
5360: 79 70 65 20 3d 20 61 55 70 5b 69 5d 2e 65 54 79  ype = aUp[i].eTy
5370: 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 57  pe;.          pW
5380: 69 6e 2d 3e 65 53 74 61 72 74 20 3d 20 61 55 70  in->eStart = aUp
5390: 5b 69 5d 2e 65 53 74 61 72 74 3b 0a 20 20 20 20  [i].eStart;.    
53a0: 20 20 20 20 20 20 70 57 69 6e 2d 3e 65 45 6e 64        pWin->eEnd
53b0: 20 3d 20 61 55 70 5b 69 5d 2e 65 45 6e 64 3b 0a   = aUp[i].eEnd;.
53c0: 20 20 20 20 20 20 20 20 20 20 70 57 69 6e 2d 3e            pWin->
53d0: 65 45 78 63 6c 75 64 65 20 3d 20 30 3b 0a 20 20  eExclude = 0;.  
53e0: 20 20 20 20 20 20 20 20 69 66 28 20 70 57 69 6e          if( pWin
53f0: 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c  ->eStart==TK_FOL
5400: 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 20 20  LOWING ){.      
5410: 20 20 20 20 20 20 70 57 69 6e 2d 3e 70 53 74 61        pWin->pSta
5420: 72 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  rt = sqlite3Expr
5430: 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c  (db, TK_INTEGER,
5440: 20 22 31 22 29 3b 0a 20 20 20 20 20 20 20 20 20   "1");.         
5450: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65   }.          bre
5460: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
5470: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
5480: 20 20 70 57 69 6e 2d 3e 70 46 75 6e 63 20 3d 20    pWin->pFunc = 
5490: 70 46 75 6e 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pFunc;.}../*.** 
54a0: 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 70  Context object p
54b0: 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 73 71  assed through sq
54c0: 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73  lite3WalkExprLis
54d0: 74 28 29 20 74 6f 0a 2a 2a 20 73 65 6c 65 63 74  t() to.** select
54e0: 57 69 6e 64 6f 77 52 65 77 72 69 74 65 45 78 70  WindowRewriteExp
54f0: 72 43 62 28 29 20 62 79 20 73 65 6c 65 63 74 57  rCb() by selectW
5500: 69 6e 64 6f 77 52 65 77 72 69 74 65 45 4c 69 73  indowRewriteELis
5510: 74 28 29 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  t()..*/.typedef 
5520: 73 74 72 75 63 74 20 57 69 6e 64 6f 77 52 65 77  struct WindowRew
5530: 72 69 74 65 20 57 69 6e 64 6f 77 52 65 77 72 69  rite WindowRewri
5540: 74 65 3b 0a 73 74 72 75 63 74 20 57 69 6e 64 6f  te;.struct Windo
5550: 77 52 65 77 72 69 74 65 20 7b 0a 20 20 57 69 6e  wRewrite {.  Win
5560: 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 53 72 63  dow *pWin;.  Src
5570: 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 45 78  List *pSrc;.  Ex
5580: 70 72 4c 69 73 74 20 2a 70 53 75 62 3b 0a 20 20  prList *pSub;.  
5590: 53 65 6c 65 63 74 20 2a 70 53 75 62 53 65 6c 65  Select *pSubSele
55a0: 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ct;             
55b0: 2f 2a 20 43 75 72 72 65 6e 74 20 73 75 62 2d 73  /* Current sub-s
55c0: 65 6c 65 63 74 2c 20 69 66 20 61 6e 79 20 2a 2f  elect, if any */
55d0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 62  .};../*.** Callb
55e0: 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 75 73 65  ack function use
55f0: 64 20 62 79 20 73 65 6c 65 63 74 57 69 6e 64 6f  d by selectWindo
5600: 77 52 65 77 72 69 74 65 45 4c 69 73 74 28 29 2e  wRewriteEList().
5610: 20 49 66 20 6e 65 63 65 73 73 61 72 79 2c 0a 2a   If necessary,.*
5620: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
5630: 61 70 70 65 6e 64 73 20 74 6f 20 74 68 65 20 6f  appends to the o
5640: 75 74 70 75 74 20 65 78 70 72 65 73 73 69 6f 6e  utput expression
5650: 2d 6c 69 73 74 20 61 6e 64 20 75 70 64 61 74 65  -list and update
5660: 73 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  s .** expression
5670: 20 28 2a 70 70 45 78 70 72 29 20 69 6e 20 70 6c   (*ppExpr) in pl
5680: 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ace..*/.static i
5690: 6e 74 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52  nt selectWindowR
56a0: 65 77 72 69 74 65 45 78 70 72 43 62 28 57 61 6c  ewriteExprCb(Wal
56b0: 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78  ker *pWalker, Ex
56c0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 73 74  pr *pExpr){.  st
56d0: 72 75 63 74 20 57 69 6e 64 6f 77 52 65 77 72 69  ruct WindowRewri
56e0: 74 65 20 2a 70 20 3d 20 70 57 61 6c 6b 65 72 2d  te *p = pWalker-
56f0: 3e 75 2e 70 52 65 77 72 69 74 65 3b 0a 20 20 50  >u.pRewrite;.  P
5700: 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
5710: 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
5720: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 66 75  .  /* If this fu
5730: 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  nction is being 
5740: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68  called from with
5750: 69 6e 20 61 20 73 63 61 6c 61 72 20 73 75 62 2d  in a scalar sub-
5760: 73 65 6c 65 63 74 0a 20 20 2a 2a 20 74 68 61 74  select.  ** that
5770: 20 75 73 65 64 20 62 79 20 74 68 65 20 53 45 4c   used by the SEL
5780: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ECT statement be
5790: 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2c 20 6f  ing processed, o
57a0: 6e 6c 79 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a  nly process.  **
57b0: 20 54 4b 5f 43 4f 4c 55 4d 4e 20 65 78 70 72 65   TK_COLUMN expre
57c0: 73 73 69 6f 6e 73 20 74 68 61 74 20 72 65 66 65  ssions that refe
57d0: 72 20 74 6f 20 69 74 20 28 74 68 65 20 6f 75 74  r to it (the out
57e0: 65 72 20 53 45 4c 45 43 54 29 2e 20 44 6f 0a 20  er SELECT). Do. 
57f0: 20 2a 2a 20 6e 6f 74 20 70 72 6f 63 65 73 73 20   ** not process 
5800: 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 77 69  aggregates or wi
5810: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 61  ndow functions a
5820: 74 20 61 6c 6c 2c 20 61 73 20 74 68 65 79 20 62  t all, as they b
5830: 65 6c 6f 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68  elong.  ** to th
5840: 65 20 73 63 61 6c 61 72 20 73 75 62 2d 73 65 6c  e scalar sub-sel
5850: 65 63 74 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ect.  */.  if( p
5860: 2d 3e 70 53 75 62 53 65 6c 65 63 74 20 29 7b 0a  ->pSubSelect ){.
5870: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
5880: 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p!=TK_COLUMN ){.
5890: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
58a0: 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d  _Continue;.    }
58b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
58c0: 6e 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 2d 3e  nSrc = p->pSrc->
58d0: 6e 53 72 63 3b 0a 20 20 20 20 20 20 69 6e 74 20  nSrc;.      int 
58e0: 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  i;.      for(i=0
58f0: 3b 20 69 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  ; i<nSrc; i++){.
5900: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
5910: 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 2d 3e 70 53  r->iTable==p->pS
5920: 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  rc->a[i].iCursor
5930: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
5940: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 6e  }.      if( i==n
5950: 53 72 63 20 29 20 72 65 74 75 72 6e 20 57 52 43  Src ) return WRC
5960: 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d  _Continue;.    }
5970: 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20  .  }..  switch( 
5980: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 0a 20 20  pExpr->op ){..  
5990: 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
59a0: 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 21 45  ON:.      if( !E
59b0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
59c0: 45 78 70 72 2c 20 45 50 5f 57 69 6e 46 75 6e 63  Expr, EP_WinFunc
59d0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  ) ){.        bre
59e0: 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ak;.      }else{
59f0: 0a 20 20 20 20 20 20 20 20 57 69 6e 64 6f 77 20  .        Window 
5a00: 2a 70 57 69 6e 3b 0a 20 20 20 20 20 20 20 20 66  *pWin;.        f
5a10: 6f 72 28 70 57 69 6e 3d 70 2d 3e 70 57 69 6e 3b  or(pWin=p->pWin;
5a20: 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e   pWin; pWin=pWin
5a30: 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20  ->pNextWin){.   
5a40: 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
5a50: 2d 3e 79 2e 70 57 69 6e 3d 3d 70 57 69 6e 20 29  ->y.pWin==pWin )
5a60: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
5a70: 73 65 72 74 28 20 70 57 69 6e 2d 3e 70 4f 77 6e  sert( pWin->pOwn
5a80: 65 72 3d 3d 70 45 78 70 72 20 29 3b 0a 20 20 20  er==pExpr );.   
5a90: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
5aa0: 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20  WRC_Prune;.     
5ab0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
5ac0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
5ad0: 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 2e 20  * Fall through. 
5ae0: 20 2a 2f 0a 0a 20 20 20 20 63 61 73 65 20 54 4b   */..    case TK
5af0: 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20  _AGG_FUNCTION:. 
5b00: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
5b10: 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20  N: {.      Expr 
5b20: 2a 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45  *pDup = sqlite3E
5b30: 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64  xprDup(pParse->d
5b40: 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  b, pExpr, 0);.  
5b50: 20 20 20 20 70 2d 3e 70 53 75 62 20 3d 20 73 71      p->pSub = sq
5b60: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
5b70: 65 6e 64 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  end(pParse, p->p
5b80: 53 75 62 2c 20 70 44 75 70 29 3b 0a 20 20 20 20  Sub, pDup);.    
5b90: 20 20 69 66 28 20 70 2d 3e 70 53 75 62 20 29 7b    if( p->pSub ){
5ba0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
5bb0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
5bc0: 28 70 45 78 70 72 2c 20 45 50 5f 53 74 61 74 69  (pExpr, EP_Stati
5bd0: 63 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  c)==0 );.       
5be0: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
5bf0: 28 70 45 78 70 72 2c 20 45 50 5f 53 74 61 74 69  (pExpr, EP_Stati
5c00: 63 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  c);.        sqli
5c10: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50  te3ExprDelete(pP
5c20: 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 29  arse->db, pExpr)
5c30: 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 43 6c  ;.        ExprCl
5c40: 65 61 72 50 72 6f 70 65 72 74 79 28 70 45 78 70  earProperty(pExp
5c50: 72 2c 20 45 50 5f 53 74 61 74 69 63 29 3b 0a 20  r, EP_Static);. 
5c60: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 45         memset(pE
5c70: 78 70 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45  xpr, 0, sizeof(E
5c80: 78 70 72 29 29 3b 0a 0a 20 20 20 20 20 20 20 20  xpr));..        
5c90: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43  pExpr->op = TK_C
5ca0: 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 70  OLUMN;.        p
5cb0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
5cc0: 70 2d 3e 70 53 75 62 2d 3e 6e 45 78 70 72 2d 31  p->pSub->nExpr-1
5cd0: 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
5ce0: 3e 69 54 61 62 6c 65 20 3d 20 70 2d 3e 70 57 69  >iTable = p->pWi
5cf0: 6e 2d 3e 69 45 70 68 43 73 72 3b 0a 20 20 20 20  n->iEphCsr;.    
5d00: 20 20 7d 0a 0a 20 20 20 20 20 20 62 72 65 61 6b    }..      break
5d10: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 65 66  ;.    }..    def
5d20: 61 75 6c 74 3a 20 2f 2a 20 6e 6f 2d 6f 70 20 2a  ault: /* no-op *
5d30: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
5d40: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 57 52 43   }..  return WRC
5d50: 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61  _Continue;.}.sta
5d60: 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 57 69  tic int selectWi
5d70: 6e 64 6f 77 52 65 77 72 69 74 65 53 65 6c 65 63  ndowRewriteSelec
5d80: 74 43 62 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  tCb(Walker *pWal
5d90: 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  ker, Select *pSe
5da0: 6c 65 63 74 29 7b 0a 20 20 73 74 72 75 63 74 20  lect){.  struct 
5db0: 57 69 6e 64 6f 77 52 65 77 72 69 74 65 20 2a 70  WindowRewrite *p
5dc0: 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 52   = pWalker->u.pR
5dd0: 65 77 72 69 74 65 3b 0a 20 20 53 65 6c 65 63 74  ewrite;.  Select
5de0: 20 2a 70 53 61 76 65 20 3d 20 70 2d 3e 70 53 75   *pSave = p->pSu
5df0: 62 53 65 6c 65 63 74 3b 0a 20 20 69 66 28 20 70  bSelect;.  if( p
5e00: 53 61 76 65 3d 3d 70 53 65 6c 65 63 74 20 29 7b  Save==pSelect ){
5e10: 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
5e20: 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 65 6c 73  Continue;.  }els
5e30: 65 7b 0a 20 20 20 20 70 2d 3e 70 53 75 62 53 65  e{.    p->pSubSe
5e40: 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a  lect = pSelect;.
5e50: 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
5e60: 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70  elect(pWalker, p
5e70: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 70 2d 3e  Select);.    p->
5e80: 70 53 75 62 53 65 6c 65 63 74 20 3d 20 70 53 61  pSubSelect = pSa
5e90: 76 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ve;.  }.  return
5ea0: 20 57 52 43 5f 50 72 75 6e 65 3b 0a 7d 0a 0a 0a   WRC_Prune;.}...
5eb0: 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 65 20 74 68  /*.** Iterate th
5ec0: 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65  rough each expre
5ed0: 73 73 69 6f 6e 20 69 6e 20 65 78 70 72 65 73 73  ssion in express
5ee0: 69 6f 6e 2d 6c 69 73 74 20 70 45 4c 69 73 74 2e  ion-list pEList.
5ef0: 20 46 6f 72 20 65 61 63 68 3a 0a 2a 2a 0a 2a 2a   For each:.**.**
5f00: 20 20 20 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 2c 0a     * TK_COLUMN,.
5f10: 2a 2a 20 20 20 2a 20 61 67 67 72 65 67 61 74 65  **   * aggregate
5f20: 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 72 0a 2a 2a   function, or.**
5f30: 20 20 20 2a 20 77 69 6e 64 6f 77 20 66 75 6e 63     * window func
5f40: 74 69 6f 6e 20 77 69 74 68 20 61 20 57 69 6e 64  tion with a Wind
5f50: 6f 77 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69  ow object that i
5f60: 73 20 6e 6f 74 20 61 20 6d 65 6d 62 65 72 20 6f  s not a member o
5f70: 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 57 69  f the .**     Wi
5f80: 6e 64 6f 77 20 6c 69 73 74 20 70 61 73 73 65 64  ndow list passed
5f90: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
5fa0: 72 67 75 6d 65 6e 74 20 28 70 57 69 6e 29 2e 0a  rgument (pWin)..
5fb0: 2a 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74 68 65  **.** Append the
5fc0: 20 6e 6f 64 65 20 74 6f 20 6f 75 74 70 75 74 20   node to output 
5fd0: 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20  expression-list 
5fe0: 28 2a 70 70 53 75 62 29 2e 20 41 6e 64 20 72 65  (*ppSub). And re
5ff0: 70 6c 61 63 65 20 69 74 0a 2a 2a 20 77 69 74 68  place it.** with
6000: 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 74 68 61   a TK_COLUMN tha
6010: 74 20 72 65 61 64 73 20 74 68 65 20 28 4e 2d 31  t reads the (N-1
6020: 29 74 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  )th element of t
6030: 61 62 6c 65 20 0a 2a 2a 20 70 57 69 6e 2d 3e 69  able .** pWin->i
6040: 45 70 68 43 73 72 2c 20 77 68 65 72 65 20 4e 20  EphCsr, where N 
6050: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
6060: 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 28 2a 70   elements in (*p
6070: 70 53 75 62 29 20 61 66 74 65 72 0a 2a 2a 20 61  pSub) after.** a
6080: 70 70 65 6e 64 69 6e 67 20 74 68 65 20 6e 65 77  ppending the new
6090: 20 6f 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   one..*/.static 
60a0: 76 6f 69 64 20 73 65 6c 65 63 74 57 69 6e 64 6f  void selectWindo
60b0: 77 52 65 77 72 69 74 65 45 4c 69 73 74 28 0a 20  wRewriteEList(. 
60c0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
60d0: 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 2c  .  Window *pWin,
60e0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
60f0: 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ,.  ExprList *pE
6100: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  List,           
6110: 20 20 20 20 2f 2a 20 52 65 77 72 69 74 65 20 65      /* Rewrite e
6120: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
6130: 69 73 20 6c 69 73 74 20 2a 2f 0a 20 20 45 78 70  is list */.  Exp
6140: 72 4c 69 73 74 20 2a 2a 70 70 53 75 62 20 20 20  rList **ppSub   
6150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6160: 49 4e 2f 4f 55 54 3a 20 53 75 62 2d 73 65 6c 65  IN/OUT: Sub-sele
6170: 63 74 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69  ct expression-li
6180: 73 74 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65  st */.){.  Walke
6190: 72 20 73 57 61 6c 6b 65 72 3b 0a 20 20 57 69 6e  r sWalker;.  Win
61a0: 64 6f 77 52 65 77 72 69 74 65 20 73 52 65 77 72  dowRewrite sRewr
61b0: 69 74 65 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26  ite;..  memset(&
61c0: 73 57 61 6c 6b 65 72 2c 20 30 2c 20 73 69 7a 65  sWalker, 0, size
61d0: 6f 66 28 57 61 6c 6b 65 72 29 29 3b 0a 20 20 6d  of(Walker));.  m
61e0: 65 6d 73 65 74 28 26 73 52 65 77 72 69 74 65 2c  emset(&sRewrite,
61f0: 20 30 2c 20 73 69 7a 65 6f 66 28 57 69 6e 64 6f   0, sizeof(Windo
6200: 77 52 65 77 72 69 74 65 29 29 3b 0a 0a 20 20 73  wRewrite));..  s
6210: 52 65 77 72 69 74 65 2e 70 53 75 62 20 3d 20 2a  Rewrite.pSub = *
6220: 70 70 53 75 62 3b 0a 20 20 73 52 65 77 72 69 74  ppSub;.  sRewrit
6230: 65 2e 70 57 69 6e 20 3d 20 70 57 69 6e 3b 0a 20  e.pWin = pWin;. 
6240: 20 73 52 65 77 72 69 74 65 2e 70 53 72 63 20 3d   sRewrite.pSrc =
6250: 20 70 53 72 63 3b 0a 0a 20 20 73 57 61 6c 6b 65   pSrc;..  sWalke
6260: 72 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  r.pParse = pPars
6270: 65 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 78 45 78  e;.  sWalker.xEx
6280: 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c  prCallback = sel
6290: 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65  ectWindowRewrite
62a0: 45 78 70 72 43 62 3b 0a 20 20 73 57 61 6c 6b 65  ExprCb;.  sWalke
62b0: 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  r.xSelectCallbac
62c0: 6b 20 3d 20 73 65 6c 65 63 74 57 69 6e 64 6f 77  k = selectWindow
62d0: 52 65 77 72 69 74 65 53 65 6c 65 63 74 43 62 3b  RewriteSelectCb;
62e0: 0a 20 20 73 57 61 6c 6b 65 72 2e 75 2e 70 52 65  .  sWalker.u.pRe
62f0: 77 72 69 74 65 20 3d 20 26 73 52 65 77 72 69 74  write = &sRewrit
6300: 65 3b 0a 0a 20 20 28 76 6f 69 64 29 73 71 6c 69  e;..  (void)sqli
6310: 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28  te3WalkExprList(
6320: 26 73 57 61 6c 6b 65 72 2c 20 70 45 4c 69 73 74  &sWalker, pEList
6330: 29 3b 0a 0a 20 20 2a 70 70 53 75 62 20 3d 20 73  );..  *ppSub = s
6340: 52 65 77 72 69 74 65 2e 70 53 75 62 3b 0a 7d 0a  Rewrite.pSub;.}.
6350: 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
6360: 63 6f 70 79 20 6f 66 20 65 61 63 68 20 65 78 70  copy of each exp
6370: 72 65 73 73 69 6f 6e 20 69 6e 20 65 78 70 72 65  ression in expre
6380: 73 73 69 6f 6e 2d 6c 69 73 74 20 70 41 70 70 65  ssion-list pAppe
6390: 6e 64 20 74 6f 0a 2a 2a 20 65 78 70 72 65 73 73  nd to.** express
63a0: 69 6f 6e 20 6c 69 73 74 20 70 4c 69 73 74 2e 20  ion list pList. 
63b0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
63c0: 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20 6c   to the result l
63d0: 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45  ist..*/.static E
63e0: 78 70 72 4c 69 73 74 20 2a 65 78 70 72 4c 69 73  xprList *exprLis
63f0: 74 41 70 70 65 6e 64 4c 69 73 74 28 0a 20 20 50  tAppendList(.  P
6400: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
6410: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
6420: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
6430: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
6440: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
6450: 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70 65 6e  o which to appen
6460: 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  d. Might be NULL
6470: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
6480: 70 41 70 70 65 6e 64 20 20 20 20 20 20 20 2f 2a  pAppend       /*
6490: 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20   List of values 
64a0: 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74  to append. Might
64b0: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   be NULL */.){. 
64c0: 20 69 66 28 20 70 41 70 70 65 6e 64 20 29 7b 0a   if( pAppend ){.
64d0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
64e0: 6e 74 20 6e 49 6e 69 74 20 3d 20 70 4c 69 73 74  nt nInit = pList
64f0: 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20   ? pList->nExpr 
6500: 3a 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  : 0;.    for(i=0
6510: 3b 20 69 3c 70 41 70 70 65 6e 64 2d 3e 6e 45 78  ; i<pAppend->nEx
6520: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
6530: 45 78 70 72 20 2a 70 44 75 70 20 3d 20 73 71 6c  Expr *pDup = sql
6540: 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72  ite3ExprDup(pPar
6550: 73 65 2d 3e 64 62 2c 20 70 41 70 70 65 6e 64 2d  se->db, pAppend-
6560: 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 30 29 3b  >a[i].pExpr, 0);
6570: 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 73  .      pList = s
6580: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
6590: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4c 69  pend(pParse, pLi
65a0: 73 74 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20  st, pDup);.     
65b0: 20 69 66 28 20 70 4c 69 73 74 20 29 20 70 4c 69   if( pList ) pLi
65c0: 73 74 2d 3e 61 5b 6e 49 6e 69 74 2b 69 5d 2e 73  st->a[nInit+i].s
65d0: 6f 72 74 4f 72 64 65 72 20 3d 20 70 41 70 70 65  ortOrder = pAppe
65e0: 6e 64 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  nd->a[i].sortOrd
65f0: 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  er;.    }.  }.  
6600: 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
6610: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 45  ./*.** If the SE
6620: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70  LECT statement p
6630: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
6640: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 64 6f 65  ond argument doe
6650: 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 0a 2a 2a 20  s not invoke.** 
6660: 61 6e 79 20 53 51 4c 20 77 69 6e 64 6f 77 20 66  any SQL window f
6670: 75 6e 63 74 69 6f 6e 73 2c 20 74 68 69 73 20 66  unctions, this f
6680: 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
6690: 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  op. Otherwise, i
66a0: 74 20 0a 2a 2a 20 72 65 77 72 69 74 65 73 20 74  t .** rewrites t
66b0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
66c0: 65 6e 74 20 73 6f 20 74 68 61 74 20 77 69 6e 64  ent so that wind
66d0: 6f 77 20 66 75 6e 63 74 69 6f 6e 20 78 53 74 65  ow function xSte
66e0: 70 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 61  p functions.** a
66f0: 72 65 20 69 6e 76 6f 6b 65 64 20 69 6e 20 74 68  re invoked in th
6700: 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72 20  e correct order 
6710: 61 73 20 64 65 73 63 72 69 62 65 64 20 75 6e 64  as described und
6720: 65 72 20 22 53 45 4c 45 43 54 20 52 45 57 52 49  er "SELECT REWRI
6730: 54 49 4e 47 22 0a 2a 2a 20 61 74 20 74 68 65 20  TING".** at the 
6740: 74 6f 70 20 6f 66 20 74 68 69 73 20 66 69 6c 65  top of this file
6750: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
6760: 57 69 6e 64 6f 77 52 65 77 72 69 74 65 28 50 61  WindowRewrite(Pa
6770: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
6780: 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ect *p){.  int r
6790: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
67a0: 20 69 66 28 20 70 2d 3e 70 57 69 6e 20 26 26 20   if( p->pWin && 
67b0: 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a  p->pPrior==0 ){.
67c0: 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71      Vdbe *v = sq
67d0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
67e0: 72 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rse);.    sqlite
67f0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
6800: 64 62 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  db;.    Select *
6810: 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20  pSub = 0;       
6820: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62        /* The sub
6830: 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 53 72 63  query */.    Src
6840: 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e  List *pSrc = p->
6850: 70 53 72 63 3b 0a 20 20 20 20 45 78 70 72 20 2a  pSrc;.    Expr *
6860: 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65  pWhere = p->pWhe
6870: 72 65 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  re;.    ExprList
6880: 20 2a 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e   *pGroupBy = p->
6890: 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 45 78  pGroupBy;.    Ex
68a0: 70 72 20 2a 70 48 61 76 69 6e 67 20 3d 20 70 2d  pr *pHaving = p-
68b0: 3e 70 48 61 76 69 6e 67 3b 0a 20 20 20 20 45 78  >pHaving;.    Ex
68c0: 70 72 4c 69 73 74 20 2a 70 53 6f 72 74 20 3d 20  prList *pSort = 
68d0: 30 3b 0a 0a 20 20 20 20 45 78 70 72 4c 69 73 74  0;..    ExprList
68e0: 20 2a 70 53 75 62 6c 69 73 74 20 3d 20 30 3b 20   *pSublist = 0; 
68f0: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
6900: 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20 73 75 62  ion list for sub
6910: 2d 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 57 69  -query */.    Wi
6920: 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d  ndow *pMWin = p-
6930: 3e 70 57 69 6e 3b 20 20 20 20 20 20 2f 2a 20 4d  >pWin;      /* M
6940: 61 73 74 65 72 20 77 69 6e 64 6f 77 20 6f 62 6a  aster window obj
6950: 65 63 74 20 2a 2f 0a 20 20 20 20 57 69 6e 64 6f  ect */.    Windo
6960: 77 20 2a 70 57 69 6e 3b 20 20 20 20 20 20 20 20  w *pWin;        
6970: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6e 64           /* Wind
6980: 6f 77 20 6f 62 6a 65 63 74 20 69 74 65 72 61 74  ow object iterat
6990: 6f 72 20 2a 2f 0a 0a 20 20 20 20 70 2d 3e 70 53  or */..    p->pS
69a0: 72 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  rc = 0;.    p->p
69b0: 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 20 20 70  Where = 0;.    p
69c0: 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 30 3b 0a  ->pGroupBy = 0;.
69d0: 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d      p->pHaving =
69e0: 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61   0;..    /* Crea
69f0: 74 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  te the ORDER BY 
6a00: 63 6c 61 75 73 65 20 66 6f 72 20 74 68 65 20 73  clause for the s
6a10: 75 62 2d 73 65 6c 65 63 74 2e 20 54 68 69 73 20  ub-select. This 
6a20: 69 73 20 74 68 65 20 63 6f 6e 63 61 74 65 6e 61  is the concatena
6a30: 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6f 66 20 74  tion.    ** of t
6a40: 68 65 20 77 69 6e 64 6f 77 20 50 41 52 54 49 54  he window PARTIT
6a50: 49 4f 4e 20 61 6e 64 20 4f 52 44 45 52 20 42 59  ION and ORDER BY
6a60: 20 63 6c 61 75 73 65 73 2e 20 54 68 65 6e 2c 20   clauses. Then, 
6a70: 69 66 20 74 68 69 73 20 6d 61 6b 65 73 20 69 74  if this makes it
6a80: 0a 20 20 20 20 2a 2a 20 72 65 64 75 6e 64 61 6e  .    ** redundan
6a90: 74 2c 20 72 65 6d 6f 76 65 20 74 68 65 20 4f 52  t, remove the OR
6aa0: 44 45 52 20 42 59 20 66 72 6f 6d 20 74 68 65 20  DER BY from the 
6ab0: 70 61 72 65 6e 74 20 53 45 4c 45 43 54 2e 20 20  parent SELECT.  
6ac0: 2a 2f 0a 20 20 20 20 70 53 6f 72 74 20 3d 20 73  */.    pSort = s
6ad0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
6ae0: 70 28 64 62 2c 20 70 4d 57 69 6e 2d 3e 70 50 61  p(db, pMWin->pPa
6af0: 72 74 69 74 69 6f 6e 2c 20 30 29 3b 0a 20 20 20  rtition, 0);.   
6b00: 20 70 53 6f 72 74 20 3d 20 65 78 70 72 4c 69 73   pSort = exprLis
6b10: 74 41 70 70 65 6e 64 4c 69 73 74 28 70 50 61 72  tAppendList(pPar
6b20: 73 65 2c 20 70 53 6f 72 74 2c 20 70 4d 57 69 6e  se, pSort, pMWin
6b30: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
6b40: 20 69 66 28 20 70 53 6f 72 74 20 26 26 20 70 2d   if( pSort && p-
6b50: 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
6b60: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
6b70: 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 53  prListCompare(pS
6b80: 6f 72 74 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  ort, p->pOrderBy
6b90: 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , -1)==0 ){.    
6ba0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
6bb0: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
6bc0: 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
6bd0: 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
6be0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
6bf0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 73 73 69 67   }..    /* Assig
6c00: 6e 20 61 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  n a cursor numbe
6c10: 72 20 66 6f 72 20 74 68 65 20 65 70 68 65 6d 65  r for the epheme
6c20: 72 61 6c 20 74 61 62 6c 65 20 75 73 65 64 20 74  ral table used t
6c30: 6f 20 62 75 66 66 65 72 20 72 6f 77 73 2e 0a 20  o buffer rows.. 
6c40: 20 20 20 2a 2a 20 54 68 65 20 4f 70 65 6e 45 70     ** The OpenEp
6c50: 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74  hemeral instruct
6c60: 69 6f 6e 20 69 73 20 63 6f 64 65 64 20 6c 61 74  ion is coded lat
6c70: 65 72 2c 20 61 66 74 65 72 20 69 74 20 69 73 20  er, after it is 
6c80: 6b 6e 6f 77 6e 20 68 6f 77 0a 20 20 20 20 2a 2a  known how.    **
6c90: 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 74 68   many columns th
6ca0: 65 20 74 61 62 6c 65 20 77 69 6c 6c 20 68 61 76  e table will hav
6cb0: 65 2e 20 20 2a 2f 0a 20 20 20 20 70 4d 57 69 6e  e.  */.    pMWin
6cc0: 2d 3e 69 45 70 68 43 73 72 20 3d 20 70 50 61 72  ->iEphCsr = pPar
6cd0: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
6ce0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 2b 3d 20  pParse->nTab += 
6cf0: 33 3b 0a 0a 20 20 20 20 73 65 6c 65 63 74 57 69  3;..    selectWi
6d00: 6e 64 6f 77 52 65 77 72 69 74 65 45 4c 69 73 74  ndowRewriteEList
6d10: 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20  (pParse, pMWin, 
6d20: 70 53 72 63 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  pSrc, p->pEList,
6d30: 20 26 70 53 75 62 6c 69 73 74 29 3b 0a 20 20 20   &pSublist);.   
6d40: 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77   selectWindowRew
6d50: 72 69 74 65 45 4c 69 73 74 28 70 50 61 72 73 65  riteEList(pParse
6d60: 2c 20 70 4d 57 69 6e 2c 20 70 53 72 63 2c 20 70  , pMWin, pSrc, p
6d70: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 26 70 53 75  ->pOrderBy, &pSu
6d80: 62 6c 69 73 74 29 3b 0a 20 20 20 20 70 4d 57 69  blist);.    pMWi
6d90: 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 20 3d 20  n->nBufferCol = 
6da0: 28 70 53 75 62 6c 69 73 74 20 3f 20 70 53 75 62  (pSublist ? pSub
6db0: 6c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29  list->nExpr : 0)
6dc0: 3b 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64  ;..    /* Append
6dd0: 20 74 68 65 20 50 41 52 54 49 54 49 4f 4e 20 42   the PARTITION B
6de0: 59 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 65  Y and ORDER BY e
6df0: 78 70 72 65 73 73 69 6f 6e 73 20 74 6f 20 74 68  xpressions to th
6e00: 65 20 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a  e to the .    **
6e10: 20 73 75 62 2d 73 65 6c 65 63 74 20 65 78 70 72   sub-select expr
6e20: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 54 68 65  ession list. The
6e30: 79 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74  y are required t
6e40: 6f 20 66 69 67 75 72 65 20 6f 75 74 20 77 68 65  o figure out whe
6e50: 72 65 20 0a 20 20 20 20 2a 2a 20 62 6f 75 6e 64  re .    ** bound
6e60: 61 72 69 65 73 20 66 6f 72 20 70 61 72 74 69 74  aries for partit
6e70: 69 6f 6e 73 20 61 6e 64 20 73 65 74 73 20 6f 66  ions and sets of
6e80: 20 70 65 65 72 20 72 6f 77 73 20 6c 69 65 2e 20   peer rows lie. 
6e90: 20 2a 2f 0a 20 20 20 20 70 53 75 62 6c 69 73 74   */.    pSublist
6ea0: 20 3d 20 65 78 70 72 4c 69 73 74 41 70 70 65 6e   = exprListAppen
6eb0: 64 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53  dList(pParse, pS
6ec0: 75 62 6c 69 73 74 2c 20 70 4d 57 69 6e 2d 3e 70  ublist, pMWin->p
6ed0: 50 61 72 74 69 74 69 6f 6e 29 3b 0a 20 20 20 20  Partition);.    
6ee0: 70 53 75 62 6c 69 73 74 20 3d 20 65 78 70 72 4c  pSublist = exprL
6ef0: 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28 70 50  istAppendList(pP
6f00: 61 72 73 65 2c 20 70 53 75 62 6c 69 73 74 2c 20  arse, pSublist, 
6f10: 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 29  pMWin->pOrderBy)
6f20: 3b 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64  ;..    /* Append
6f30: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 70   the arguments p
6f40: 61 73 73 65 64 20 74 6f 20 65 61 63 68 20 77 69  assed to each wi
6f50: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 74 6f  ndow function to
6f60: 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 75 62 2d   the.    ** sub-
6f70: 73 65 6c 65 63 74 20 65 78 70 72 65 73 73 69 6f  select expressio
6f80: 6e 20 6c 69 73 74 2e 20 41 6c 73 6f 20 61 6c 6c  n list. Also all
6f90: 6f 63 61 74 65 20 74 77 6f 20 72 65 67 69 73 74  ocate two regist
6fa0: 65 72 73 20 66 6f 72 20 65 61 63 68 0a 20 20 20  ers for each.   
6fb0: 20 2a 2a 20 77 69 6e 64 6f 77 20 66 75 6e 63 74   ** window funct
6fc0: 69 6f 6e 20 2d 20 6f 6e 65 20 66 6f 72 20 74 68  ion - one for th
6fd0: 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2c 20 61  e accumulator, a
6fe0: 6e 6f 74 68 65 72 20 66 6f 72 20 69 6e 74 65 72  nother for inter
6ff0: 69 6d 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74  im.    ** result
7000: 73 2e 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70  s.  */.    for(p
7010: 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b  Win=pMWin; pWin;
7020: 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78   pWin=pWin->pNex
7030: 74 57 69 6e 29 7b 0a 20 20 20 20 20 20 70 57 69  tWin){.      pWi
7040: 6e 2d 3e 69 41 72 67 43 6f 6c 20 3d 20 28 70 53  n->iArgCol = (pS
7050: 75 62 6c 69 73 74 20 3f 20 70 53 75 62 6c 69 73  ublist ? pSublis
7060: 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20  t->nExpr : 0);. 
7070: 20 20 20 20 20 70 53 75 62 6c 69 73 74 20 3d 20       pSublist = 
7080: 65 78 70 72 4c 69 73 74 41 70 70 65 6e 64 4c 69  exprListAppendLi
7090: 73 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 6c  st(pParse, pSubl
70a0: 69 73 74 2c 20 70 57 69 6e 2d 3e 70 4f 77 6e 65  ist, pWin->pOwne
70b0: 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20  r->x.pList);.   
70c0: 20 20 20 69 66 28 20 70 57 69 6e 2d 3e 70 46 69     if( pWin->pFi
70d0: 6c 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  lter ){.        
70e0: 45 78 70 72 20 2a 70 46 69 6c 74 65 72 20 3d 20  Expr *pFilter = 
70f0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
7100: 62 2c 20 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72  b, pWin->pFilter
7110: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 53  , 0);.        pS
7120: 75 62 6c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  ublist = sqlite3
7130: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
7140: 50 61 72 73 65 2c 20 70 53 75 62 6c 69 73 74 2c  Parse, pSublist,
7150: 20 70 46 69 6c 74 65 72 29 3b 0a 20 20 20 20 20   pFilter);.     
7160: 20 7d 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 72   }.      pWin->r
7170: 65 67 41 63 63 75 6d 20 3d 20 2b 2b 70 50 61 72  egAccum = ++pPar
7180: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
7190: 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 20  pWin->regResult 
71a0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
71b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
71c0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
71d0: 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72  Null, 0, pWin->r
71e0: 65 67 41 63 63 75 6d 29 3b 0a 20 20 20 20 7d 0a  egAccum);.    }.
71f0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
7200: 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
7210: 6f 72 20 50 41 52 54 49 54 49 4f 4e 20 42 59 20  or PARTITION BY 
7220: 63 6c 61 75 73 65 2c 20 61 6e 64 20 74 68 65 20  clause, and the 
7230: 77 69 6e 64 6f 77 0a 20 20 20 20 2a 2a 20 66 75  window.    ** fu
7240: 6e 63 74 69 6f 6e 20 61 63 63 65 70 74 73 20 7a  nction accepts z
7250: 65 72 6f 20 61 72 67 75 6d 65 6e 74 73 2c 20 61  ero arguments, a
7260: 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  nd there are no 
7270: 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 73 0a 20 20  other columns.  
7280: 20 20 2a 2a 20 73 65 6c 65 63 74 65 64 20 28 65    ** selected (e
7290: 2e 67 2e 20 22 53 45 4c 45 43 54 20 72 6f 77 5f  .g. "SELECT row_
72a0: 6e 75 6d 62 65 72 28 29 20 4f 56 45 52 20 28 29  number() OVER ()
72b0: 20 46 52 4f 4d 20 74 31 22 29 2c 20 69 74 20 69   FROM t1"), it i
72c0: 73 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 2a  s possible.    *
72d0: 2a 20 74 68 61 74 20 70 53 75 62 6c 69 73 74 20  * that pSublist 
72e0: 69 73 20 73 74 69 6c 6c 20 4e 55 4c 4c 20 68 65  is still NULL he
72f0: 72 65 2e 20 41 64 64 20 61 20 63 6f 6e 73 74 61  re. Add a consta
7300: 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 68 65  nt expression he
7310: 72 65 20 74 6f 20 0a 20 20 20 20 2a 2a 20 6b 65  re to .    ** ke
7320: 65 70 20 65 76 65 72 79 74 68 69 6e 67 20 6c 65  ep everything le
7330: 67 61 6c 20 69 6e 20 74 68 69 73 20 63 61 73 65  gal in this case
7340: 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  . .    */.    if
7350: 28 20 70 53 75 62 6c 69 73 74 3d 3d 30 20 29 7b  ( pSublist==0 ){
7360: 0a 20 20 20 20 20 20 70 53 75 62 6c 69 73 74 20  .      pSublist 
7370: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
7380: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
7390: 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71  0, .          sq
73a0: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
73b0: 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26  b, TK_INTEGER, &
73c0: 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73  sqlite3IntTokens
73d0: 5b 30 5d 2c 20 30 29 0a 20 20 20 20 20 20 29 3b  [0], 0).      );
73e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 53 75 62  .    }..    pSub
73f0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
7400: 4e 65 77 28 0a 20 20 20 20 20 20 20 20 70 50 61  New(.        pPa
7410: 72 73 65 2c 20 70 53 75 62 6c 69 73 74 2c 20 70  rse, pSublist, p
7420: 53 72 63 2c 20 70 57 68 65 72 65 2c 20 70 47 72  Src, pWhere, pGr
7430: 6f 75 70 42 79 2c 20 70 48 61 76 69 6e 67 2c 20  oupBy, pHaving, 
7440: 70 53 6f 72 74 2c 20 30 2c 20 30 0a 20 20 20 20  pSort, 0, 0.    
7450: 29 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d  );.    p->pSrc =
7460: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
7470: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
7480: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
7490: 70 2d 3e 70 53 72 63 20 29 7b 0a 20 20 20 20 20  p->pSrc ){.     
74a0: 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
74b0: 53 65 6c 65 63 74 20 3d 20 70 53 75 62 3b 0a 20  Select = pSub;. 
74c0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
74d0: 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
74e0: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 53 72 63  (pParse, p->pSrc
74f0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  );.      if( sql
7500: 69 74 65 33 45 78 70 61 6e 64 53 75 62 71 75 65  ite3ExpandSubque
7510: 72 79 28 70 50 61 72 73 65 2c 20 26 70 2d 3e 70  ry(pParse, &p->p
7520: 53 72 63 2d 3e 61 5b 30 5d 29 20 29 7b 0a 20 20  Src->a[0]) ){.  
7530: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
7540: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
7550: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 53  else{.        pS
7560: 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20  ub->selFlags |= 
7570: 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20 20  SF_Expanded;.   
7580: 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73       p->selFlags
7590: 20 26 3d 20 7e 53 46 5f 41 67 67 72 65 67 61 74   &= ~SF_Aggregat
75a0: 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e;.        sqlit
75b0: 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61  e3SelectPrep(pPa
75c0: 72 73 65 2c 20 70 53 75 62 2c 20 30 29 3b 0a 20  rse, pSub, 0);. 
75d0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 71       }..      sq
75e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
75f0: 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
7600: 72 61 6c 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  ral, pMWin->iEph
7610: 43 73 72 2c 20 70 53 75 62 6c 69 73 74 2d 3e 6e  Csr, pSublist->n
7620: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  Expr);.      sql
7630: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
7640: 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70 4d  , OP_OpenDup, pM
7650: 57 69 6e 2d 3e 69 45 70 68 43 73 72 2b 31 2c 20  Win->iEphCsr+1, 
7660: 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b  pMWin->iEphCsr);
7670: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
7680: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
7690: 70 65 6e 44 75 70 2c 20 70 4d 57 69 6e 2d 3e 69  penDup, pMWin->i
76a0: 45 70 68 43 73 72 2b 32 2c 20 70 4d 57 69 6e 2d  EphCsr+2, pMWin-
76b0: 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 20 20 20  >iEphCsr);.     
76c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
76d0: 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70  p2(v, OP_OpenDup
76e0: 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
76f0: 2b 33 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43  +3, pMWin->iEphC
7700: 73 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  sr);.    }else{.
7710: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
7720: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
7730: 75 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ub);.    }.    i
7740: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
7750: 6c 65 64 20 29 20 72 63 20 3d 20 53 51 4c 49 54  led ) rc = SQLIT
7760: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
7770: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
7780: 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 57 69 6e  .** Free the Win
7790: 64 6f 77 20 6f 62 6a 65 63 74 20 70 61 73 73 65  dow object passe
77a0: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
77b0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  argument..*/.voi
77c0: 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 44  d sqlite3WindowD
77d0: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
77e0: 62 2c 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20  b, Window *p){. 
77f0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71   if( p ){.    sq
7800: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
7810: 64 62 2c 20 70 2d 3e 70 46 69 6c 74 65 72 29 3b  db, p->pFilter);
7820: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
7830: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
7840: 2d 3e 70 50 61 72 74 69 74 69 6f 6e 29 3b 0a 20  ->pPartition);. 
7850: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
7860: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
7870: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 73  pOrderBy);.    s
7880: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
7890: 28 64 62 2c 20 70 2d 3e 70 45 6e 64 29 3b 0a 20  (db, p->pEnd);. 
78a0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
78b0: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 53 74 61  lete(db, p->pSta
78c0: 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rt);.    sqlite3
78d0: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4e  DbFree(db, p->zN
78e0: 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
78f0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
7900: 42 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Base);.    sqlit
7910: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
7920: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
7930: 65 65 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  ee the linked li
7940: 73 74 20 6f 66 20 57 69 6e 64 6f 77 20 6f 62 6a  st of Window obj
7950: 65 63 74 73 20 73 74 61 72 74 69 6e 67 20 61 74  ects starting at
7960: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
7970: 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
7980: 6c 69 74 65 33 57 69 6e 64 6f 77 4c 69 73 74 44  lite3WindowListD
7990: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
79a0: 62 2c 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20  b, Window *p){. 
79b0: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
79c0: 20 57 69 6e 64 6f 77 20 2a 70 4e 65 78 74 20 3d   Window *pNext =
79d0: 20 70 2d 3e 70 4e 65 78 74 57 69 6e 3b 0a 20 20   p->pNextWin;.  
79e0: 20 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 44    sqlite3WindowD
79f0: 65 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20  elete(db, p);.  
7a00: 20 20 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d    p = pNext;.  }
7a10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72  .}../*.** The ar
7a20: 67 75 6d 65 6e 74 20 65 78 70 72 65 73 73 69 6f  gument expressio
7a30: 6e 20 69 73 20 61 6e 20 50 52 45 43 45 44 49 4e  n is an PRECEDIN
7a40: 47 20 6f 72 20 46 4f 4c 4c 4f 57 49 4e 47 20 6f  G or FOLLOWING o
7a50: 66 66 73 65 74 2e 20 20 54 68 65 0a 2a 2a 20 76  ffset.  The.** v
7a60: 61 6c 75 65 20 73 68 6f 75 6c 64 20 62 65 20 61  alue should be a
7a70: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e   non-negative in
7a80: 74 65 67 65 72 2e 20 20 49 66 20 74 68 65 20 76  teger.  If the v
7a90: 61 6c 75 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a  alue is not a.**
7aa0: 20 63 6f 6e 73 74 61 6e 74 2c 20 63 68 61 6e 67   constant, chang
7ab0: 65 20 69 74 20 74 6f 20 4e 55 4c 4c 2e 20 20 54  e it to NULL.  T
7ac0: 68 65 20 66 61 63 74 20 74 68 61 74 20 69 74 20  he fact that it 
7ad0: 69 73 20 74 68 65 6e 20 61 20 6e 6f 6e 2d 6e 65  is then a non-ne
7ae0: 67 61 74 69 76 65 0a 2a 2a 20 69 6e 74 65 67 65  gative.** intege
7af0: 72 20 77 69 6c 6c 20 62 65 20 63 61 75 67 68 74  r will be caught
7b00: 20 6c 61 74 65 72 2e 20 20 42 75 74 20 69 74 20   later.  But it 
7b10: 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 6e 6f 74  is important not
7b20: 20 74 6f 20 6c 65 61 76 65 0a 2a 2a 20 76 61 72   to leave.** var
7b30: 69 61 62 6c 65 20 76 61 6c 75 65 73 20 69 6e 20  iable values in 
7b40: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
7b50: 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45  ree..*/.static E
7b60: 78 70 72 20 2a 73 71 6c 69 74 65 33 57 69 6e 64  xpr *sqlite3Wind
7b70: 6f 77 4f 66 66 73 65 74 45 78 70 72 28 50 61 72  owOffsetExpr(Par
7b80: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
7b90: 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20   *pExpr){.  if( 
7ba0: 30 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49 73  0==sqlite3ExprIs
7bb0: 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72 29 20  Constant(pExpr) 
7bc0: 29 7b 0a 20 20 20 20 69 66 28 20 49 4e 5f 52 45  ){.    if( IN_RE
7bd0: 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 20 73 71  NAME_OBJECT ) sq
7be0: 6c 69 74 65 33 52 65 6e 61 6d 65 45 78 70 72 55  lite3RenameExprU
7bf0: 6e 6d 61 70 28 70 50 61 72 73 65 2c 20 70 45 78  nmap(pParse, pEx
7c00: 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pr);.    sqlite3
7c10: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
7c20: 65 2d 3e 64 62 2c 20 70 45 78 70 72 29 3b 0a 20  e->db, pExpr);. 
7c30: 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74     pExpr = sqlit
7c40: 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72  e3ExprAlloc(pPar
7c50: 73 65 2d 3e 64 62 2c 20 54 4b 5f 4e 55 4c 4c 2c  se->db, TK_NULL,
7c60: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65   0, 0);.  }.  re
7c70: 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f  turn pExpr;.}../
7c80: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
7c90: 64 20 72 65 74 75 72 6e 20 61 20 6e 65 77 20 57  d return a new W
7ca0: 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 64 65 73  indow object des
7cb0: 63 72 69 62 69 6e 67 20 61 20 57 69 6e 64 6f 77  cribing a Window
7cc0: 20 44 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a   Definition..*/.
7cd0: 57 69 6e 64 6f 77 20 2a 73 71 6c 69 74 65 33 57  Window *sqlite3W
7ce0: 69 6e 64 6f 77 41 6c 6c 6f 63 28 0a 20 20 50 61  indowAlloc(.  Pa
7cf0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
7d00: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
7d10: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70  xt */.  int eTyp
7d20: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 46 72 61  e,        /* Fra
7d30: 6d 65 20 74 79 70 65 2e 20 54 4b 5f 52 41 4e 47  me type. TK_RANG
7d40: 45 20 6f 72 20 54 4b 5f 52 4f 57 53 20 2a 2f 0a  E or TK_ROWS */.
7d50: 20 20 69 6e 74 20 65 53 74 61 72 74 2c 20 20 20    int eStart,   
7d60: 20 20 20 20 2f 2a 20 53 74 61 72 74 20 74 79 70      /* Start typ
7d70: 65 3a 20 43 55 52 52 45 4e 54 2c 20 50 52 45 43  e: CURRENT, PREC
7d80: 45 44 49 4e 47 2c 20 46 4f 4c 4c 4f 57 49 4e 47  EDING, FOLLOWING
7d90: 2c 20 55 4e 42 4f 55 4e 44 45 44 20 2a 2f 0a 20  , UNBOUNDED */. 
7da0: 20 45 78 70 72 20 2a 70 53 74 61 72 74 2c 20 20   Expr *pStart,  
7db0: 20 20 20 2f 2a 20 53 74 61 72 74 20 77 69 6e 64     /* Start wind
7dc0: 6f 77 20 73 69 7a 65 20 69 66 20 54 4b 5f 50 52  ow size if TK_PR
7dd0: 45 43 45 44 49 4e 47 20 6f 72 20 46 4f 4c 4c 4f  ECEDING or FOLLO
7de0: 57 49 4e 47 20 2a 2f 0a 20 20 69 6e 74 20 65 45  WING */.  int eE
7df0: 6e 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 45  nd,         /* E
7e00: 6e 64 20 74 79 70 65 3a 20 43 55 52 52 45 4e 54  nd type: CURRENT
7e10: 2c 20 46 4f 4c 4c 4f 57 49 4e 47 2c 20 54 4b 5f  , FOLLOWING, TK_
7e20: 55 4e 42 4f 55 4e 44 45 44 2c 20 50 52 45 43 45  UNBOUNDED, PRECE
7e30: 44 49 4e 47 20 2a 2f 0a 20 20 45 78 70 72 20 2a  DING */.  Expr *
7e40: 70 45 6e 64 20 20 20 20 20 20 20 20 2f 2a 20 45  pEnd        /* E
7e50: 6e 64 20 77 69 6e 64 6f 77 20 73 69 7a 65 20 69  nd window size i
7e60: 66 20 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 6f  f TK_FOLLOWING o
7e70: 72 20 50 52 45 43 45 44 49 4e 47 20 2a 2f 0a 29  r PRECEDING */.)
7e80: 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e  {.  Window *pWin
7e90: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 62 49 6d 70   = 0;.  int bImp
7ea0: 6c 69 63 69 74 46 72 61 6d 65 20 3d 20 30 3b 0a  licitFrame = 0;.
7eb0: 0a 20 20 2f 2a 20 50 61 72 73 65 72 20 61 73 73  .  /* Parser ass
7ec0: 75 72 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ures the followi
7ed0: 6e 67 3a 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ng: */.  assert(
7ee0: 20 65 54 79 70 65 3d 3d 30 20 7c 7c 20 65 54 79   eType==0 || eTy
7ef0: 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 7c 7c 20  pe==TK_RANGE || 
7f00: 65 54 79 70 65 3d 3d 54 4b 5f 52 4f 57 53 20 7c  eType==TK_ROWS |
7f10: 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 47 52 4f 55  | eType==TK_GROU
7f20: 50 53 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  PS );.  assert( 
7f30: 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45  eStart==TK_CURRE
7f40: 4e 54 20 7c 7c 20 65 53 74 61 72 74 3d 3d 54 4b  NT || eStart==TK
7f50: 5f 50 52 45 43 45 44 49 4e 47 0a 20 20 20 20 20  _PRECEDING.     
7f60: 20 20 20 20 20 20 7c 7c 20 65 53 74 61 72 74 3d        || eStart=
7f70: 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 7c 7c  =TK_UNBOUNDED ||
7f80: 20 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c   eStart==TK_FOLL
7f90: 4f 57 49 4e 47 20 29 3b 0a 20 20 61 73 73 65 72  OWING );.  asser
7fa0: 74 28 20 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52  t( eEnd==TK_CURR
7fb0: 45 4e 54 20 7c 7c 20 65 45 6e 64 3d 3d 54 4b 5f  ENT || eEnd==TK_
7fc0: 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20 20 20 20 20  FOLLOWING.      
7fd0: 20 20 20 20 20 7c 7c 20 65 45 6e 64 3d 3d 54 4b       || eEnd==TK
7fe0: 5f 55 4e 42 4f 55 4e 44 45 44 20 7c 7c 20 65 45  _UNBOUNDED || eE
7ff0: 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47  nd==TK_PRECEDING
8000: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 65   );.  assert( (e
8010: 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44  Start==TK_PRECED
8020: 49 4e 47 20 7c 7c 20 65 53 74 61 72 74 3d 3d 54  ING || eStart==T
8030: 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 29 3d 3d 28 70  K_FOLLOWING)==(p
8040: 53 74 61 72 74 21 3d 30 29 20 29 3b 0a 20 20 61  Start!=0) );.  a
8050: 73 73 65 72 74 28 20 28 65 45 6e 64 3d 3d 54 4b  ssert( (eEnd==TK
8060: 5f 46 4f 4c 4c 4f 57 49 4e 47 20 7c 7c 20 65 45  _FOLLOWING || eE
8070: 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47  nd==TK_PRECEDING
8080: 29 3d 3d 28 70 45 6e 64 21 3d 30 29 20 29 3b 0a  )==(pEnd!=0) );.
8090: 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30 20  .  if( eType==0 
80a0: 29 7b 0a 20 20 20 20 62 49 6d 70 6c 69 63 69 74  ){.    bImplicit
80b0: 46 72 61 6d 65 20 3d 20 31 3b 0a 20 20 20 20 65  Frame = 1;.    e
80c0: 54 79 70 65 20 3d 20 54 4b 5f 52 41 4e 47 45 3b  Type = TK_RANGE;
80d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 69 74  .  }..  /* Addit
80e0: 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 0a 20 20 2a  ionally, the.  *
80f0: 2a 20 73 74 61 72 74 69 6e 67 20 62 6f 75 6e 64  * starting bound
8100: 61 72 79 20 74 79 70 65 20 6d 61 79 20 6e 6f 74  ary type may not
8110: 20 6f 63 63 75 72 20 65 61 72 6c 69 65 72 20 69   occur earlier i
8120: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
8130: 6c 69 73 74 20 74 68 61 6e 0a 20 20 2a 2a 20 74  list than.  ** t
8140: 68 65 20 65 6e 64 69 6e 67 20 62 6f 75 6e 64 61  he ending bounda
8150: 72 79 20 74 79 70 65 3a 0a 20 20 2a 2a 0a 20 20  ry type:.  **.  
8160: 2a 2a 20 20 20 55 4e 42 4f 55 4e 44 45 44 20 50  **   UNBOUNDED P
8170: 52 45 43 45 44 49 4e 47 0a 20 20 2a 2a 20 20 20  RECEDING.  **   
8180: 3c 65 78 70 72 3e 20 50 52 45 43 45 44 49 4e 47  <expr> PRECEDING
8190: 0a 20 20 2a 2a 20 20 20 43 55 52 52 45 4e 54 20  .  **   CURRENT 
81a0: 52 4f 57 0a 20 20 2a 2a 20 20 20 3c 65 78 70 72  ROW.  **   <expr
81b0: 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20 2a 2a  > FOLLOWING.  **
81c0: 20 20 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c     UNBOUNDED FOL
81d0: 4c 4f 57 49 4e 47 0a 20 20 2a 2a 0a 20 20 2a 2a  LOWING.  **.  **
81e0: 20 54 68 65 20 70 61 72 73 65 72 20 65 6e 73 75   The parser ensu
81f0: 72 65 73 20 74 68 61 74 20 22 55 4e 42 4f 55 4e  res that "UNBOUN
8200: 44 45 44 20 50 52 45 43 45 44 49 4e 47 22 20 63  DED PRECEDING" c
8210: 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 61 73  annot be used as
8220: 20 61 6e 20 65 6e 64 69 6e 67 0a 20 20 2a 2a 20   an ending.  ** 
8230: 62 6f 75 6e 64 61 72 79 2c 20 61 6e 64 20 74 68  boundary, and th
8240: 61 6e 20 22 55 4e 42 4f 55 4e 44 45 44 20 46 4f  an "UNBOUNDED FO
8250: 4c 4c 4f 57 49 4e 47 22 20 63 61 6e 6e 6f 74 20  LLOWING" cannot 
8260: 62 65 20 75 73 65 64 20 61 73 20 61 20 73 74 61  be used as a sta
8270: 72 74 69 6e 67 0a 20 20 2a 2a 20 66 72 61 6d 65  rting.  ** frame
8280: 20 62 6f 75 6e 64 61 72 79 2e 0a 20 20 2a 2f 0a   boundary..  */.
8290: 20 20 69 66 28 20 28 65 53 74 61 72 74 3d 3d 54    if( (eStart==T
82a0: 4b 5f 43 55 52 52 45 4e 54 20 26 26 20 65 45 6e  K_CURRENT && eEn
82b0: 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 29  d==TK_PRECEDING)
82c0: 0a 20 20 20 7c 7c 20 28 65 53 74 61 72 74 3d 3d  .   || (eStart==
82d0: 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 26 26 20  TK_FOLLOWING && 
82e0: 28 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44  (eEnd==TK_PRECED
82f0: 49 4e 47 20 7c 7c 20 65 45 6e 64 3d 3d 54 4b 5f  ING || eEnd==TK_
8300: 43 55 52 52 45 4e 54 29 29 0a 20 20 29 7b 0a 20  CURRENT)).  ){. 
8310: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
8320: 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 73 75  sg(pParse, "unsu
8330: 70 70 6f 72 74 65 64 20 66 72 61 6d 65 20 73 70  pported frame sp
8340: 65 63 69 66 69 63 61 74 69 6f 6e 22 29 3b 0a 20  ecification");. 
8350: 20 20 20 67 6f 74 6f 20 77 69 6e 64 6f 77 41 6c     goto windowAl
8360: 6c 6f 63 45 72 72 3b 0a 20 20 7d 0a 0a 20 20 70  locErr;.  }..  p
8370: 57 69 6e 20 3d 20 28 57 69 6e 64 6f 77 2a 29 73  Win = (Window*)s
8380: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
8390: 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73  ro(pParse->db, s
83a0: 69 7a 65 6f 66 28 57 69 6e 64 6f 77 29 29 3b 0a  izeof(Window));.
83b0: 20 20 69 66 28 20 70 57 69 6e 3d 3d 30 20 29 20    if( pWin==0 ) 
83c0: 67 6f 74 6f 20 77 69 6e 64 6f 77 41 6c 6c 6f 63  goto windowAlloc
83d0: 45 72 72 3b 0a 20 20 70 57 69 6e 2d 3e 65 54 79  Err;.  pWin->eTy
83e0: 70 65 20 3d 20 65 54 79 70 65 3b 0a 20 20 70 57  pe = eType;.  pW
83f0: 69 6e 2d 3e 65 53 74 61 72 74 20 3d 20 65 53 74  in->eStart = eSt
8400: 61 72 74 3b 0a 20 20 70 57 69 6e 2d 3e 65 45 6e  art;.  pWin->eEn
8410: 64 20 3d 20 65 45 6e 64 3b 0a 20 20 70 57 69 6e  d = eEnd;.  pWin
8420: 2d 3e 62 49 6d 70 6c 69 63 69 74 46 72 61 6d 65  ->bImplicitFrame
8430: 20 3d 20 62 49 6d 70 6c 69 63 69 74 46 72 61 6d   = bImplicitFram
8440: 65 3b 0a 20 20 70 57 69 6e 2d 3e 70 45 6e 64 20  e;.  pWin->pEnd 
8450: 3d 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4f  = sqlite3WindowO
8460: 66 66 73 65 74 45 78 70 72 28 70 50 61 72 73 65  ffsetExpr(pParse
8470: 2c 20 70 45 6e 64 29 3b 0a 20 20 70 57 69 6e 2d  , pEnd);.  pWin-
8480: 3e 70 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65  >pStart = sqlite
8490: 33 57 69 6e 64 6f 77 4f 66 66 73 65 74 45 78 70  3WindowOffsetExp
84a0: 72 28 70 50 61 72 73 65 2c 20 70 53 74 61 72 74  r(pParse, pStart
84b0: 29 3b 0a 20 20 2f 2a 20 70 57 69 6e 2d 3e 65 45  );.  /* pWin->eE
84c0: 78 63 6c 75 64 65 20 3d 20 31 3b 20 2a 2f 0a 20  xclude = 1; */. 
84d0: 20 72 65 74 75 72 6e 20 70 57 69 6e 3b 0a 0a 77   return pWin;..w
84e0: 69 6e 64 6f 77 41 6c 6c 6f 63 45 72 72 3a 0a 20  indowAllocErr:. 
84f0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
8500: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
8510: 45 6e 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  End);.  sqlite3E
8520: 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65  xprDelete(pParse
8530: 2d 3e 64 62 2c 20 70 53 74 61 72 74 29 3b 0a 20  ->db, pStart);. 
8540: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
8550: 0a 2a 2a 20 41 74 74 61 63 68 20 50 41 52 54 49  .** Attach PARTI
8560: 54 49 4f 4e 20 61 6e 64 20 4f 52 44 45 52 20 42  TION and ORDER B
8570: 59 20 63 6c 61 75 73 65 73 20 70 50 61 72 74 69  Y clauses pParti
8580: 74 69 6f 6e 20 61 6e 64 20 70 4f 72 64 65 72 42  tion and pOrderB
8590: 79 20 74 6f 20 77 69 6e 64 6f 77 0a 2a 2a 20 70  y to window.** p
85a0: 57 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 70 61  Win. Also, if pa
85b0: 72 61 6d 65 74 65 72 20 70 42 61 73 65 20 69 73  rameter pBase is
85c0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 65 74 20 70   not NULL, set p
85d0: 57 69 6e 2d 3e 7a 42 61 73 65 20 74 6f 20 74 68  Win->zBase to th
85e0: 65 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20  e.** equivalent 
85f0: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  nul-terminated s
8600: 74 72 69 6e 67 2e 0a 2a 2f 0a 57 69 6e 64 6f 77  tring..*/.Window
8610: 20 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 41   *sqlite3WindowA
8620: 73 73 65 6d 62 6c 65 28 0a 20 20 50 61 72 73 65  ssemble(.  Parse
8630: 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 57 69 6e   *pParse, .  Win
8640: 64 6f 77 20 2a 70 57 69 6e 2c 20 0a 20 20 45 78  dow *pWin, .  Ex
8650: 70 72 4c 69 73 74 20 2a 70 50 61 72 74 69 74 69  prList *pPartiti
8660: 6f 6e 2c 20 0a 20 20 45 78 70 72 4c 69 73 74 20  on, .  ExprList 
8670: 2a 70 4f 72 64 65 72 42 79 2c 20 0a 20 20 54 6f  *pOrderBy, .  To
8680: 6b 65 6e 20 2a 70 42 61 73 65 0a 29 7b 0a 20 20  ken *pBase.){.  
8690: 69 66 28 20 70 57 69 6e 20 29 7b 0a 20 20 20 20  if( pWin ){.    
86a0: 70 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e  pWin->pPartition
86b0: 20 3d 20 70 50 61 72 74 69 74 69 6f 6e 3b 0a 20   = pPartition;. 
86c0: 20 20 20 70 57 69 6e 2d 3e 70 4f 72 64 65 72 42     pWin->pOrderB
86d0: 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
86e0: 20 20 69 66 28 20 70 42 61 73 65 20 29 7b 0a 20    if( pBase ){. 
86f0: 20 20 20 20 20 70 57 69 6e 2d 3e 7a 42 61 73 65       pWin->zBase
8700: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
8710: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
8720: 70 42 61 73 65 2d 3e 7a 2c 20 70 42 61 73 65 2d  pBase->z, pBase-
8730: 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  >n);.    }.  }el
8740: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
8750: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50  xprListDelete(pP
8760: 61 72 73 65 2d 3e 64 62 2c 20 70 50 61 72 74 69  arse->db, pParti
8770: 74 69 6f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  tion);.    sqlit
8780: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
8790: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72  (pParse->db, pOr
87a0: 64 65 72 42 79 29 3b 0a 20 20 7d 0a 20 20 72 65  derBy);.  }.  re
87b0: 74 75 72 6e 20 70 57 69 6e 3b 0a 7d 0a 0a 2f 2a  turn pWin;.}../*
87c0: 0a 2a 2a 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e  .** Window *pWin
87d0: 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 63   has just been c
87e0: 72 65 61 74 65 64 20 66 72 6f 6d 20 61 20 57 49  reated from a WI
87f0: 4e 44 4f 57 20 63 6c 61 75 73 65 2e 20 54 6f 6b  NDOW clause. Tok
8800: 6e 65 20 70 42 61 73 65 0a 2a 2a 20 69 73 20 74  ne pBase.** is t
8810: 68 65 20 62 61 73 65 20 77 69 6e 64 6f 77 2e 20  he base window. 
8820: 45 61 72 6c 69 65 72 20 77 69 6e 64 6f 77 73 20  Earlier windows 
8830: 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 20 57 49  from the same WI
8840: 4e 44 4f 57 20 63 6c 61 75 73 65 20 61 72 65 0a  NDOW clause are.
8850: 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ** stored in the
8860: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61   linked list sta
8870: 72 74 69 6e 67 20 61 74 20 70 57 69 6e 2d 3e 70  rting at pWin->p
8880: 4e 65 78 74 57 69 6e 2e 20 54 68 69 73 20 66 75  NextWin. This fu
8890: 6e 63 74 69 6f 6e 0a 2a 2a 20 65 69 74 68 65 72  nction.** either
88a0: 20 75 70 64 61 74 65 73 20 2a 70 57 69 6e 20 61   updates *pWin a
88b0: 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
88c0: 62 61 73 65 20 73 70 65 63 69 66 69 63 61 74 69  base specificati
88d0: 6f 6e 2c 20 6f 72 20 65 6c 73 65 0a 2a 2a 20 6c  on, or else.** l
88e0: 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72 20 69  eaves an error i
88f0: 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69  n pParse..*/.voi
8900: 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43  d sqlite3WindowC
8910: 68 61 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72  hain(Parse *pPar
8920: 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e  se, Window *pWin
8930: 2c 20 57 69 6e 64 6f 77 20 2a 70 4c 69 73 74 29  , Window *pList)
8940: 7b 0a 20 20 69 66 28 20 70 57 69 6e 2d 3e 7a 42  {.  if( pWin->zB
8950: 61 73 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ase ){.    sqlit
8960: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
8970: 3e 64 62 3b 0a 20 20 20 20 57 69 6e 64 6f 77 20  >db;.    Window 
8980: 2a 70 45 78 69 73 74 20 3d 20 77 69 6e 64 6f 77  *pExist = window
8990: 46 69 6e 64 28 70 50 61 72 73 65 2c 20 70 4c 69  Find(pParse, pLi
89a0: 73 74 2c 20 70 57 69 6e 2d 3e 7a 42 61 73 65 29  st, pWin->zBase)
89b0: 3b 0a 20 20 20 20 69 66 28 20 70 45 78 69 73 74  ;.    if( pExist
89c0: 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
89d0: 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a  char *zErr = 0;.
89e0: 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66        /* Check f
89f0: 6f 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20  or errors */.   
8a00: 20 20 20 69 66 28 20 70 57 69 6e 2d 3e 70 50 61     if( pWin->pPa
8a10: 72 74 69 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  rtition ){.     
8a20: 20 20 20 7a 45 72 72 20 3d 20 22 50 41 52 54 49     zErr = "PARTI
8a30: 54 49 4f 4e 20 63 6c 61 75 73 65 22 3b 0a 20 20  TION clause";.  
8a40: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45      }else if( pE
8a50: 78 69 73 74 2d 3e 70 4f 72 64 65 72 42 79 20 26  xist->pOrderBy &
8a60: 26 20 70 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79  & pWin->pOrderBy
8a70: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 72 72   ){.        zErr
8a80: 20 3d 20 22 4f 52 44 45 52 20 42 59 20 63 6c 61   = "ORDER BY cla
8a90: 75 73 65 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73  use";.      }els
8aa0: 65 20 69 66 28 20 70 45 78 69 73 74 2d 3e 62 49  e if( pExist->bI
8ab0: 6d 70 6c 69 63 69 74 46 72 61 6d 65 3d 3d 30 20  mplicitFrame==0 
8ac0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20  ){.        zErr 
8ad0: 3d 20 22 66 72 61 6d 65 20 73 70 65 63 69 66 69  = "frame specifi
8ae0: 63 61 74 69 6f 6e 22 3b 0a 20 20 20 20 20 20 7d  cation";.      }
8af0: 0a 20 20 20 20 20 20 69 66 28 20 7a 45 72 72 20  .      if( zErr 
8b00: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
8b10: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
8b20: 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
8b30: 22 63 61 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65  "cannot override
8b40: 20 25 73 20 6f 66 20 77 69 6e 64 6f 77 3a 20 25   %s of window: %
8b50: 73 22 2c 20 7a 45 72 72 2c 20 70 57 69 6e 2d 3e  s", zErr, pWin->
8b60: 7a 42 61 73 65 0a 20 20 20 20 20 20 20 20 29 3b  zBase.        );
8b70: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8b80: 20 20 20 20 20 20 70 57 69 6e 2d 3e 70 50 61 72        pWin->pPar
8b90: 74 69 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33  tition = sqlite3
8ba0: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
8bb0: 70 45 78 69 73 74 2d 3e 70 50 61 72 74 69 74 69  pExist->pPartiti
8bc0: 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  on, 0);.        
8bd0: 69 66 28 20 70 45 78 69 73 74 2d 3e 70 4f 72 64  if( pExist->pOrd
8be0: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
8bf0: 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 2d 3e    assert( pWin->
8c00: 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20  pOrderBy==0 );. 
8c10: 20 20 20 20 20 20 20 20 20 70 57 69 6e 2d 3e 70           pWin->p
8c20: 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
8c30: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
8c40: 20 70 45 78 69 73 74 2d 3e 70 4f 72 64 65 72 42   pExist->pOrderB
8c50: 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  y, 0);.        }
8c60: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8c70: 44 62 46 72 65 65 28 64 62 2c 20 70 57 69 6e 2d  DbFree(db, pWin-
8c80: 3e 7a 42 61 73 65 29 3b 0a 20 20 20 20 20 20 20  >zBase);.       
8c90: 20 70 57 69 6e 2d 3e 7a 42 61 73 65 20 3d 20 30   pWin->zBase = 0
8ca0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8cb0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74    }.}../*.** Att
8cc0: 61 63 68 20 77 69 6e 64 6f 77 20 6f 62 6a 65 63  ach window objec
8cd0: 74 20 70 57 69 6e 20 74 6f 20 65 78 70 72 65 73  t pWin to expres
8ce0: 73 69 6f 6e 20 70 2e 0a 2a 2f 0a 76 6f 69 64 20  sion p..*/.void 
8cf0: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 41 74 74  sqlite3WindowAtt
8d00: 61 63 68 28 50 61 72 73 65 20 2a 70 50 61 72 73  ach(Parse *pPars
8d10: 65 2c 20 45 78 70 72 20 2a 70 2c 20 57 69 6e 64  e, Expr *p, Wind
8d20: 6f 77 20 2a 70 57 69 6e 29 7b 0a 20 20 69 66 28  ow *pWin){.  if(
8d30: 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74   p ){.    assert
8d40: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43  ( p->op==TK_FUNC
8d50: 54 49 4f 4e 20 29 3b 0a 20 20 20 20 2f 2a 20 54  TION );.    /* T
8d60: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  his routine is o
8d70: 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 74  nly called for t
8d80: 68 65 20 70 61 72 73 65 72 2e 20 20 49 66 20 70  he parser.  If p
8d90: 57 69 6e 20 77 61 73 20 6e 6f 74 0a 20 20 20 20  Win was not.    
8da0: 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 64 75 65  ** allocated due
8db0: 20 74 6f 20 61 6e 20 4f 4f 4d 2c 20 74 68 65 6e   to an OOM, then
8dc0: 20 74 68 65 20 70 61 72 73 65 72 20 77 6f 75 6c   the parser woul
8dd0: 64 20 66 61 69 6c 20 62 65 66 6f 72 65 20 65 76  d fail before ev
8de0: 65 72 0a 20 20 20 20 2a 2a 20 69 6e 76 6f 6b 69  er.    ** invoki
8df0: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
8e00: 2a 2f 0a 20 20 20 20 69 66 28 20 41 4c 57 41 59  */.    if( ALWAY
8e10: 53 28 70 57 69 6e 29 20 29 7b 0a 20 20 20 20 20  S(pWin) ){.     
8e20: 20 70 2d 3e 79 2e 70 57 69 6e 20 3d 20 70 57 69   p->y.pWin = pWi
8e30: 6e 3b 0a 20 20 20 20 20 20 45 78 70 72 53 65 74  n;.      ExprSet
8e40: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 57  Property(p, EP_W
8e50: 69 6e 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 70  inFunc);.      p
8e60: 57 69 6e 2d 3e 70 4f 77 6e 65 72 20 3d 20 70 3b  Win->pOwner = p;
8e70: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66 6c  .      if( p->fl
8e80: 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63  ags & EP_Distinc
8e90: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
8ea0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
8eb0: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
8ec0: 22 44 49 53 54 49 4e 43 54 20 69 73 20 6e 6f 74  "DISTINCT is not
8ed0: 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20 77   supported for w
8ee0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 22  indow functions"
8ef0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
8f00: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
8f10: 6c 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65 74  lite3WindowDelet
8f20: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 57  e(pParse->db, pW
8f30: 69 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  in);.  }.}../*.*
8f40: 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68  * Return 0 if th
8f50: 65 20 74 77 6f 20 77 69 6e 64 6f 77 20 6f 62 6a  e two window obj
8f60: 65 63 74 73 20 61 72 65 20 69 64 65 6e 74 69 63  ects are identic
8f70: 61 6c 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20  al, or non-zero 
8f80: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 20 49 64  otherwise..** Id
8f90: 65 6e 74 69 63 61 6c 20 77 69 6e 64 6f 77 20 6f  entical window o
8fa0: 62 6a 65 63 74 73 20 63 61 6e 20 62 65 20 70 72  bjects can be pr
8fb0: 6f 63 65 73 73 65 64 20 69 6e 20 61 20 73 69 6e  ocessed in a sin
8fc0: 67 6c 65 20 73 63 61 6e 2e 0a 2a 2f 0a 69 6e 74  gle scan..*/.int
8fd0: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f   sqlite3WindowCo
8fe0: 6d 70 61 72 65 28 50 61 72 73 65 20 2a 70 50 61  mpare(Parse *pPa
8ff0: 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70 31 2c  rse, Window *p1,
9000: 20 57 69 6e 64 6f 77 20 2a 70 32 29 7b 0a 20 20   Window *p2){.  
9010: 69 66 28 20 70 31 2d 3e 65 54 79 70 65 21 3d 70  if( p1->eType!=p
9020: 32 2d 3e 65 54 79 70 65 20 29 20 72 65 74 75 72  2->eType ) retur
9030: 6e 20 31 3b 0a 20 20 69 66 28 20 70 31 2d 3e 65  n 1;.  if( p1->e
9040: 53 74 61 72 74 21 3d 70 32 2d 3e 65 53 74 61 72  Start!=p2->eStar
9050: 74 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  t ) return 1;.  
9060: 69 66 28 20 70 31 2d 3e 65 45 6e 64 21 3d 70 32  if( p1->eEnd!=p2
9070: 2d 3e 65 45 6e 64 20 29 20 72 65 74 75 72 6e 20  ->eEnd ) return 
9080: 31 3b 0a 20 20 69 66 28 20 70 31 2d 3e 65 45 78  1;.  if( p1->eEx
9090: 63 6c 75 64 65 21 3d 70 32 2d 3e 65 45 78 63 6c  clude!=p2->eExcl
90a0: 75 64 65 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ude ) return 1;.
90b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
90c0: 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  rCompare(pParse,
90d0: 20 70 31 2d 3e 70 53 74 61 72 74 2c 20 70 32 2d   p1->pStart, p2-
90e0: 3e 70 53 74 61 72 74 2c 20 2d 31 29 20 29 20 72  >pStart, -1) ) r
90f0: 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73  eturn 1;.  if( s
9100: 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
9110: 65 28 70 50 61 72 73 65 2c 20 70 31 2d 3e 70 45  e(pParse, p1->pE
9120: 6e 64 2c 20 70 32 2d 3e 70 45 6e 64 2c 20 2d 31  nd, p2->pEnd, -1
9130: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
9140: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c  if( sqlite3ExprL
9150: 69 73 74 43 6f 6d 70 61 72 65 28 70 31 2d 3e 70  istCompare(p1->p
9160: 50 61 72 74 69 74 69 6f 6e 2c 20 70 32 2d 3e 70  Partition, p2->p
9170: 50 61 72 74 69 74 69 6f 6e 2c 20 2d 31 29 20 29  Partition, -1) )
9180: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
9190: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
91a0: 43 6f 6d 70 61 72 65 28 70 31 2d 3e 70 4f 72 64  Compare(p1->pOrd
91b0: 65 72 42 79 2c 20 70 32 2d 3e 70 4f 72 64 65 72  erBy, p2->pOrder
91c0: 42 79 2c 20 2d 31 29 20 29 20 72 65 74 75 72 6e  By, -1) ) return
91d0: 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   1;.  return 0;.
91e0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  }.../*.** This i
91f0: 73 20 63 61 6c 6c 65 64 20 62 79 20 63 6f 64 65  s called by code
9200: 20 69 6e 20 73 65 6c 65 63 74 2e 63 20 62 65 66   in select.c bef
9210: 6f 72 65 20 69 74 20 63 61 6c 6c 73 20 73 71 6c  ore it calls sql
9220: 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
9230: 0a 2a 2a 20 74 6f 20 62 65 67 69 6e 20 69 74 65  .** to begin ite
9240: 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 74  rating through t
9250: 68 65 20 73 75 62 2d 71 75 65 72 79 20 72 65 73  he sub-query res
9260: 75 6c 74 73 2e 20 49 74 20 69 73 20 75 73 65 64  ults. It is used
9270: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20   to allocate.** 
9280: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 72  and initialize r
9290: 65 67 69 73 74 65 72 73 20 61 6e 64 20 63 75 72  egisters and cur
92a0: 73 6f 72 73 20 75 73 65 64 20 62 79 20 73 71 6c  sors used by sql
92b0: 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 53 74  ite3WindowCodeSt
92c0: 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ep()..*/.void sq
92d0: 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 49  lite3WindowCodeI
92e0: 6e 69 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  nit(Parse *pPars
92f0: 65 2c 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e  e, Window *pMWin
9300: 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69  ){.  Window *pWi
9310: 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  n;.  Vdbe *v = s
9320: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
9330: 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  arse);..  /* All
9340: 6f 63 61 74 65 20 72 65 67 69 73 74 65 72 73 20  ocate registers 
9350: 74 6f 20 75 73 65 20 66 6f 72 20 50 41 52 54 49  to use for PARTI
9360: 54 49 4f 4e 20 42 59 20 76 61 6c 75 65 73 2c 20  TION BY values, 
9370: 69 66 20 61 6e 79 2e 20 49 6e 69 74 69 61 6c 69  if any. Initiali
9380: 7a 65 0a 20 20 2a 2a 20 73 61 69 64 20 72 65 67  ze.  ** said reg
9390: 69 73 74 65 72 73 20 74 6f 20 4e 55 4c 4c 2e 20  isters to NULL. 
93a0: 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d   */.  if( pMWin-
93b0: 3e 70 50 61 72 74 69 74 69 6f 6e 20 29 7b 0a 20  >pPartition ){. 
93c0: 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70     int nExpr = p
93d0: 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e  MWin->pPartition
93e0: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70 4d 57  ->nExpr;.    pMW
93f0: 69 6e 2d 3e 72 65 67 50 61 72 74 20 3d 20 70 50  in->regPart = pP
9400: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
9410: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
9420: 3d 20 6e 45 78 70 72 3b 0a 20 20 20 20 73 71 6c  = nExpr;.    sql
9430: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
9440: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 4d  , OP_Null, 0, pM
9450: 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c 20 70 4d  Win->regPart, pM
9460: 57 69 6e 2d 3e 72 65 67 50 61 72 74 2b 6e 45 78  Win->regPart+nEx
9470: 70 72 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 70 4d  pr-1);.  }..  pM
9480: 57 69 6e 2d 3e 72 65 67 46 69 72 73 74 20 3d 20  Win->regFirst = 
9490: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
94a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
94b0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
94c0: 72 2c 20 31 2c 20 70 4d 57 69 6e 2d 3e 72 65 67  r, 1, pMWin->reg
94d0: 46 69 72 73 74 29 3b 0a 0a 20 20 69 66 28 20 70  First);..  if( p
94e0: 4d 57 69 6e 2d 3e 65 45 78 63 6c 75 64 65 20 29  MWin->eExclude )
94f0: 7b 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 72 65 67  {.    pMWin->reg
9500: 53 74 61 72 74 52 6f 77 69 64 20 3d 20 2b 2b 70  StartRowid = ++p
9510: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
9520: 20 70 4d 57 69 6e 2d 3e 72 65 67 45 6e 64 52 6f   pMWin->regEndRo
9530: 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  wid = ++pParse->
9540: 6e 4d 65 6d 3b 0a 20 20 20 20 70 4d 57 69 6e 2d  nMem;.    pMWin-
9550: 3e 63 73 72 41 70 70 20 3d 20 70 50 61 72 73 65  >csrApp = pParse
9560: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71  ->nTab++;.    sq
9570: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
9580: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
9590: 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72  , pMWin->regStar
95a0: 74 52 6f 77 69 64 29 3b 0a 20 20 20 20 73 71 6c  tRowid);.    sql
95b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
95c0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
95d0: 20 70 4d 57 69 6e 2d 3e 72 65 67 45 6e 64 52 6f   pMWin->regEndRo
95e0: 77 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  wid);.    sqlite
95f0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
9600: 50 5f 4f 70 65 6e 44 75 70 2c 20 70 4d 57 69 6e  P_OpenDup, pMWin
9610: 2d 3e 63 73 72 41 70 70 2c 20 70 4d 57 69 6e 2d  ->csrApp, pMWin-
9620: 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 20 20 72  >iEphCsr);.    r
9630: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66 6f  eturn;.  }..  fo
9640: 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57  r(pWin=pMWin; pW
9650: 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70  in; pWin=pWin->p
9660: 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 46 75  NextWin){.    Fu
9670: 6e 63 44 65 66 20 2a 70 20 3d 20 70 57 69 6e 2d  ncDef *p = pWin-
9680: 3e 70 46 75 6e 63 3b 0a 20 20 20 20 69 66 28 20  >pFunc;.    if( 
9690: 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  (p->funcFlags & 
96a0: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d  SQLITE_FUNC_MINM
96b0: 41 58 29 20 26 26 20 70 57 69 6e 2d 3e 65 53 74  AX) && pWin->eSt
96c0: 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  art!=TK_UNBOUNDE
96d0: 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  D ){.      /* Th
96e0: 65 20 69 6e 6c 69 6e 65 20 76 65 72 73 69 6f 6e  e inline version
96f0: 73 20 6f 66 20 6d 69 6e 28 29 20 61 6e 64 20 6d  s of min() and m
9700: 61 78 28 29 20 72 65 71 75 69 72 65 20 61 20 73  ax() require a s
9710: 69 6e 67 6c 65 20 65 70 68 65 6d 65 72 61 6c 0a  ingle ephemeral.
9720: 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61        ** table a
9730: 6e 64 20 33 20 72 65 67 69 73 74 65 72 73 2e 20  nd 3 registers. 
9740: 54 68 65 20 72 65 67 69 73 74 65 72 73 20 61 72  The registers ar
9750: 65 20 75 73 65 64 20 61 73 20 66 6f 6c 6c 6f 77  e used as follow
9760: 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s:.      **.    
9770: 20 20 2a 2a 20 20 20 72 65 67 41 70 70 2b 30 3a    **   regApp+0:
9780: 20 73 6c 6f 74 20 74 6f 20 63 6f 70 79 20 6d 69   slot to copy mi
9790: 6e 28 29 2f 6d 61 78 28 29 20 61 72 67 75 6d 65  n()/max() argume
97a0: 6e 74 20 74 6f 20 66 6f 72 20 4d 61 6b 65 52 65  nt to for MakeRe
97b0: 63 6f 72 64 0a 20 20 20 20 20 20 2a 2a 20 20 20  cord.      **   
97c0: 72 65 67 41 70 70 2b 31 3a 20 69 6e 74 65 67 65  regApp+1: intege
97d0: 72 20 76 61 6c 75 65 20 75 73 65 64 20 74 6f 20  r value used to 
97e0: 65 6e 73 75 72 65 20 6b 65 79 73 20 61 72 65 20  ensure keys are 
97f0: 75 6e 69 71 75 65 0a 20 20 20 20 20 20 2a 2a 20  unique.      ** 
9800: 20 20 72 65 67 41 70 70 2b 32 3a 20 6f 75 74 70    regApp+2: outp
9810: 75 74 20 6f 66 20 4d 61 6b 65 52 65 63 6f 72 64  ut of MakeRecord
9820: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
9830: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
9840: 3d 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e  = pWin->pOwner->
9850: 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 4b  x.pList;.      K
9860: 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
9870: 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
9880: 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
9890: 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 30 2c 20  arse, pList, 0, 
98a0: 30 29 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e  0);.      pWin->
98b0: 63 73 72 41 70 70 20 3d 20 70 50 61 72 73 65 2d  csrApp = pParse-
98c0: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70  >nTab++;.      p
98d0: 57 69 6e 2d 3e 72 65 67 41 70 70 20 3d 20 70 50  Win->regApp = pP
98e0: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
98f0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
9900: 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20 69 66 28   += 3;.      if(
9910: 20 70 4b 65 79 49 6e 66 6f 20 26 26 20 70 57 69   pKeyInfo && pWi
9920: 6e 2d 3e 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 5b  n->pFunc->zName[
9930: 31 5d 3d 3d 27 69 27 20 29 7b 0a 20 20 20 20 20  1]=='i' ){.     
9940: 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49     assert( pKeyI
9950: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
9960: 30 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  0]==0 );.       
9970: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
9980: 4f 72 64 65 72 5b 30 5d 20 3d 20 31 3b 0a 20 20  Order[0] = 1;.  
9990: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
99a0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
99b0: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
99c0: 6c 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c  l, pWin->csrApp,
99d0: 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   2);.      sqlit
99e0: 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76  e3VdbeAppendP4(v
99f0: 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  , pKeyInfo, P4_K
9a00: 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 73  EYINFO);.      s
9a10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
9a20: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
9a30: 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b  0, pWin->regApp+
9a40: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c  1);.    }.    el
9a50: 73 65 20 69 66 28 20 70 2d 3e 7a 4e 61 6d 65 3d  se if( p->zName=
9a60: 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 20 7c  =nth_valueName |
9a70: 7c 20 70 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72 73  | p->zName==firs
9a80: 74 5f 76 61 6c 75 65 4e 61 6d 65 20 29 7b 0a 20  t_valueName ){. 
9a90: 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
9aa0: 20 74 77 6f 20 72 65 67 69 73 74 65 72 73 20 61   two registers a
9ab0: 74 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2e 20  t pWin->regApp. 
9ac0: 54 68 65 73 65 20 77 69 6c 6c 20 62 65 20 75 73  These will be us
9ad0: 65 64 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73  ed to.      ** s
9ae0: 74 6f 72 65 20 74 68 65 20 73 74 61 72 74 20 61  tore the start a
9af0: 6e 64 20 65 6e 64 20 69 6e 64 65 78 20 6f 66 20  nd end index of 
9b00: 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 61 6d  the current fram
9b10: 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  e.  */.      ass
9b20: 65 72 74 28 20 70 4d 57 69 6e 2d 3e 69 45 70 68  ert( pMWin->iEph
9b30: 43 73 72 20 29 3b 0a 20 20 20 20 20 20 70 57 69  Csr );.      pWi
9b40: 6e 2d 3e 72 65 67 41 70 70 20 3d 20 70 50 61 72  n->regApp = pPar
9b50: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
9b60: 20 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 20 3d    pWin->csrApp =
9b70: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
9b80: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
9b90: 4d 65 6d 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20  Mem += 2;.      
9ba0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9bb0: 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c  2(v, OP_OpenDup,
9bc0: 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20 70   pWin->csrApp, p
9bd0: 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a  MWin->iEphCsr);.
9be0: 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69      }.    else i
9bf0: 66 28 20 70 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61  f( p->zName==lea
9c00: 64 4e 61 6d 65 20 7c 7c 20 70 2d 3e 7a 4e 61 6d  dName || p->zNam
9c10: 65 3d 3d 6c 61 67 4e 61 6d 65 20 29 7b 0a 20 20  e==lagName ){.  
9c20: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 57 69      assert( pMWi
9c30: 6e 2d 3e 69 45 70 68 43 73 72 20 29 3b 0a 20 20  n->iEphCsr );.  
9c40: 20 20 20 20 70 57 69 6e 2d 3e 63 73 72 41 70 70      pWin->csrApp
9c50: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
9c60: 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  +;.      sqlite3
9c70: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
9c80: 5f 4f 70 65 6e 44 75 70 2c 20 70 57 69 6e 2d 3e  _OpenDup, pWin->
9c90: 63 73 72 41 70 70 2c 20 70 4d 57 69 6e 2d 3e 69  csrApp, pMWin->i
9ca0: 45 70 68 43 73 72 29 3b 0a 20 20 20 20 7d 0a 20  EphCsr);.    }. 
9cb0: 20 7d 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 57 49   }.}..#define WI
9cc0: 4e 44 4f 57 5f 53 54 41 52 54 49 4e 47 5f 49 4e  NDOW_STARTING_IN
9cd0: 54 20 20 30 0a 23 64 65 66 69 6e 65 20 57 49 4e  T  0.#define WIN
9ce0: 44 4f 57 5f 45 4e 44 49 4e 47 5f 49 4e 54 20 20  DOW_ENDING_INT  
9cf0: 20 20 31 0a 23 64 65 66 69 6e 65 20 57 49 4e 44    1.#define WIND
9d00: 4f 57 5f 4e 54 48 5f 56 41 4c 55 45 5f 49 4e 54  OW_NTH_VALUE_INT
9d10: 20 32 0a 23 64 65 66 69 6e 65 20 57 49 4e 44 4f   2.#define WINDO
9d20: 57 5f 53 54 41 52 54 49 4e 47 5f 4e 55 4d 20 20  W_STARTING_NUM  
9d30: 33 0a 23 64 65 66 69 6e 65 20 57 49 4e 44 4f 57  3.#define WINDOW
9d40: 5f 45 4e 44 49 4e 47 5f 4e 55 4d 20 20 20 20 34  _ENDING_NUM    4
9d50: 0a 0a 2f 2a 0a 2a 2a 20 41 20 22 50 52 45 43 45  ../*.** A "PRECE
9d60: 44 49 4e 47 20 3c 65 78 70 72 3e 22 20 28 65 43  DING <expr>" (eC
9d70: 6f 6e 64 3d 3d 30 29 20 6f 72 20 22 46 4f 4c 4c  ond==0) or "FOLL
9d80: 4f 57 49 4e 47 20 3c 65 78 70 72 3e 22 20 28 65  OWING <expr>" (e
9d90: 43 6f 6e 64 3d 3d 31 29 20 6f 72 20 74 68 65 0a  Cond==1) or the.
9da0: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ** value of the 
9db0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
9dc0: 74 6f 20 6e 74 68 5f 76 61 6c 75 65 28 29 20 28  to nth_value() (
9dd0: 65 43 6f 6e 64 3d 3d 32 29 20 68 61 73 20 6a 75  eCond==2) has ju
9de0: 73 74 20 62 65 65 6e 0a 2a 2a 20 65 76 61 6c 75  st been.** evalu
9df0: 61 74 65 64 20 61 6e 64 20 74 68 65 20 72 65 73  ated and the res
9e00: 75 6c 74 20 6c 65 66 74 20 69 6e 20 72 65 67 69  ult left in regi
9e10: 73 74 65 72 20 72 65 67 2e 20 54 68 69 73 20 66  ster reg. This f
9e20: 75 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61 74 65  unction generate
9e30: 73 20 56 4d 0a 2a 2a 20 63 6f 64 65 20 74 6f 20  s VM.** code to 
9e40: 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76  check that the v
9e50: 61 6c 75 65 20 69 73 20 61 20 6e 6f 6e 2d 6e 65  alue is a non-ne
9e60: 67 61 74 69 76 65 20 69 6e 74 65 67 65 72 20 61  gative integer a
9e70: 6e 64 20 74 68 72 6f 77 73 20 61 6e 0a 2a 2a 20  nd throws an.** 
9e80: 65 78 63 65 70 74 69 6f 6e 20 69 66 20 69 74 20  exception if it 
9e90: 69 73 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69  is not..*/.stati
9ea0: 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 43 68 65  c void windowChe
9eb0: 63 6b 56 61 6c 75 65 28 50 61 72 73 65 20 2a 70  ckValue(Parse *p
9ec0: 50 61 72 73 65 2c 20 69 6e 74 20 72 65 67 2c 20  Parse, int reg, 
9ed0: 69 6e 74 20 65 43 6f 6e 64 29 7b 0a 20 20 73 74  int eCond){.  st
9ee0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
9ef0: 2a 61 7a 45 72 72 5b 5d 20 3d 20 7b 0a 20 20 20  *azErr[] = {.   
9f00: 20 22 66 72 61 6d 65 20 73 74 61 72 74 69 6e 67   "frame starting
9f10: 20 6f 66 66 73 65 74 20 6d 75 73 74 20 62 65 20   offset must be 
9f20: 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69  a non-negative i
9f30: 6e 74 65 67 65 72 22 2c 0a 20 20 20 20 22 66 72  nteger",.    "fr
9f40: 61 6d 65 20 65 6e 64 69 6e 67 20 6f 66 66 73 65  ame ending offse
9f50: 74 20 6d 75 73 74 20 62 65 20 61 20 6e 6f 6e 2d  t must be a non-
9f60: 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72  negative integer
9f70: 22 2c 0a 20 20 20 20 22 73 65 63 6f 6e 64 20 61  ",.    "second a
9f80: 72 67 75 6d 65 6e 74 20 74 6f 20 6e 74 68 5f 76  rgument to nth_v
9f90: 61 6c 75 65 20 6d 75 73 74 20 62 65 20 61 20 70  alue must be a p
9fa0: 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 22  ositive integer"
9fb0: 2c 0a 20 20 20 20 22 66 72 61 6d 65 20 73 74 61  ,.    "frame sta
9fc0: 72 74 69 6e 67 20 6f 66 66 73 65 74 20 6d 75 73  rting offset mus
9fd0: 74 20 62 65 20 61 20 6e 6f 6e 2d 6e 65 67 61 74  t be a non-negat
9fe0: 69 76 65 20 6e 75 6d 62 65 72 22 2c 0a 20 20 20  ive number",.   
9ff0: 20 22 66 72 61 6d 65 20 65 6e 64 69 6e 67 20 6f   "frame ending o
a000: 66 66 73 65 74 20 6d 75 73 74 20 62 65 20 61 20  ffset must be a 
a010: 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 6e 75 6d  non-negative num
a020: 62 65 72 22 2c 0a 20 20 7d 3b 0a 20 20 73 74 61  ber",.  };.  sta
a030: 74 69 63 20 69 6e 74 20 61 4f 70 5b 5d 20 3d 20  tic int aOp[] = 
a040: 7b 20 4f 50 5f 47 65 2c 20 4f 50 5f 47 65 2c 20  { OP_Ge, OP_Ge, 
a050: 4f 50 5f 47 74 2c 20 4f 50 5f 47 65 2c 20 4f 50  OP_Gt, OP_Ge, OP
a060: 5f 47 65 20 7d 3b 0a 20 20 56 64 62 65 20 2a 76  _Ge };.  Vdbe *v
a070: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
a080: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  e(pParse);.  int
a090: 20 72 65 67 5a 65 72 6f 20 3d 20 73 71 6c 69 74   regZero = sqlit
a0a0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
a0b0: 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
a0c0: 65 43 6f 6e 64 3e 3d 30 20 26 26 20 65 43 6f 6e  eCond>=0 && eCon
a0d0: 64 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 45 72  d<ArraySize(azEr
a0e0: 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  r) );.  sqlite3V
a0f0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
a100: 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 5a  Integer, 0, regZ
a110: 65 72 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ero);.  sqlite3V
a120: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
a130: 4d 75 73 74 42 65 49 6e 74 2c 20 72 65 67 2c 20  MustBeInt, reg, 
a140: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
a150: 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20  ntAddr(v)+2);.  
a160: 69 66 28 20 65 43 6f 6e 64 3e 3d 57 49 4e 44 4f  if( eCond>=WINDO
a170: 57 5f 53 54 41 52 54 49 4e 47 5f 4e 55 4d 20 29  W_STARTING_NUM )
a180: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
a190: 67 65 50 35 28 76 2c 20 31 29 3b 0a 20 20 56 64  geP5(v, 1);.  Vd
a1a0: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
a1b0: 65 43 6f 6e 64 3d 3d 30 29 3b 0a 20 20 56 64 62  eCond==0);.  Vdb
a1c0: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 65  eCoverageIf(v, e
a1d0: 43 6f 6e 64 3d 3d 31 29 3b 0a 20 20 56 64 62 65  Cond==1);.  Vdbe
a1e0: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 65 43  CoverageIf(v, eC
a1f0: 6f 6e 64 3d 3d 32 29 3b 0a 20 20 73 71 6c 69 74  ond==2);.  sqlit
a200: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
a210: 61 4f 70 5b 65 43 6f 6e 64 5d 2c 20 72 65 67 5a  aOp[eCond], regZ
a220: 65 72 6f 2c 20 73 71 6c 69 74 65 33 56 64 62 65  ero, sqlite3Vdbe
a230: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32  CurrentAddr(v)+2
a240: 2c 20 72 65 67 29 3b 0a 20 20 56 64 62 65 43 6f  , reg);.  VdbeCo
a250: 76 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c 49  verageNeverNullI
a260: 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 30 29 3b 0a  f(v, eCond==0);.
a270: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65    VdbeCoverageNe
a280: 76 65 72 4e 75 6c 6c 49 66 28 76 2c 20 65 43 6f  verNullIf(v, eCo
a290: 6e 64 3d 3d 31 29 3b 0a 20 20 56 64 62 65 43 6f  nd==1);.  VdbeCo
a2a0: 76 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c 49  verageNeverNullI
a2b0: 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 32 29 3b 0a  f(v, eCond==2);.
a2c0: 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72    sqlite3MayAbor
a2d0: 74 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  t(pParse);.  sql
a2e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
a2f0: 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54  , OP_Halt, SQLIT
a300: 45 5f 45 52 52 4f 52 2c 20 4f 45 5f 41 62 6f 72  E_ERROR, OE_Abor
a310: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  t);.  sqlite3Vdb
a320: 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28 76 6f  eAppendP4(v, (vo
a330: 69 64 2a 29 61 7a 45 72 72 5b 65 43 6f 6e 64 5d  id*)azErr[eCond]
a340: 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P4_STATIC);.  
a350: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
a360: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
a370: 67 5a 65 72 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  gZero);.}../*.**
a380: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
a390: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
a3a0: 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 77 69  passed to the wi
a3b0: 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e 20 61 73  ndow-function as
a3c0: 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
a3d0: 20 74 68 65 20 6f 62 6a 65 63 74 20 70 61 73 73   the object pass
a3e0: 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ed as the only a
a3f0: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
a400: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
a410: 74 69 63 20 69 6e 74 20 77 69 6e 64 6f 77 41 72  tic int windowAr
a420: 67 43 6f 75 6e 74 28 57 69 6e 64 6f 77 20 2a 70  gCount(Window *p
a430: 57 69 6e 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  Win){.  ExprList
a440: 20 2a 70 4c 69 73 74 20 3d 20 70 57 69 6e 2d 3e   *pList = pWin->
a450: 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 3b  pOwner->x.pList;
a460: 0a 20 20 72 65 74 75 72 6e 20 28 70 4c 69 73 74  .  return (pList
a470: 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20   ? pList->nExpr 
a480: 3a 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  : 0);.}../*.** G
a490: 65 6e 65 72 61 74 65 20 56 4d 20 63 6f 64 65 20  enerate VM code 
a4a0: 74 6f 20 69 6e 76 6f 6b 65 20 65 69 74 68 65 72  to invoke either
a4b0: 20 78 53 74 65 70 28 29 20 28 69 66 20 62 49 6e   xStep() (if bIn
a4c0: 76 65 72 73 65 20 69 73 20 30 29 20 6f 72 20 0a  verse is 0) or .
a4d0: 2a 2a 20 78 49 6e 76 65 72 73 65 20 28 69 66 20  ** xInverse (if 
a4e0: 62 49 6e 76 65 72 73 65 20 69 73 20 6e 6f 6e 2d  bInverse is non-
a4f0: 7a 65 72 6f 29 20 66 6f 72 20 65 61 63 68 20 77  zero) for each w
a500: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 69  indow function i
a510: 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64  n the .** linked
a520: 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67 20 61   list starting a
a530: 74 20 70 4d 57 69 6e 2e 20 4f 72 2c 20 66 6f 72  t pMWin. Or, for
a540: 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77   built-in window
a550: 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 74 68   functions.** th
a560: 61 74 20 64 6f 20 6e 6f 74 20 75 73 65 20 74 68  at do not use th
a570: 65 20 73 74 61 6e 64 61 72 64 20 66 75 6e 63 74  e standard funct
a580: 69 6f 6e 20 41 50 49 2c 20 67 65 6e 65 72 61 74  ion API, generat
a590: 65 20 74 68 65 20 72 65 71 75 69 72 65 64 0a 2a  e the required.*
a5a0: 2a 20 69 6e 6c 69 6e 65 20 56 4d 20 63 6f 64 65  * inline VM code
a5b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ..**.** If argum
a5c0: 65 6e 74 20 63 73 72 20 69 73 20 67 72 65 61 74  ent csr is great
a5d0: 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
a5e0: 20 74 6f 20 30 2c 20 74 68 65 6e 20 61 72 67 75   to 0, then argu
a5f0: 6d 65 6e 74 20 72 65 67 20 69 73 0a 2a 2a 20 74  ment reg is.** t
a600: 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
a610: 72 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  r in an array of
a620: 20 72 65 67 69 73 74 65 72 73 20 67 75 61 72 61   registers guara
a630: 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 61 72 67  nteed to be larg
a640: 65 0a 2a 2a 20 65 6e 6f 75 67 68 20 74 6f 20 68  e.** enough to h
a650: 6f 6c 64 20 74 68 65 20 61 72 72 61 79 20 6f 66  old the array of
a660: 20 61 72 67 75 6d 65 6e 74 73 20 66 6f 72 20 65   arguments for e
a670: 61 63 68 20 66 75 6e 63 74 69 6f 6e 2e 20 49 6e  ach function. In
a680: 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20 74 68   this case.** th
a690: 65 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20  e arguments are 
a6a0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
a6b0: 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f  he current row o
a6c0: 66 20 63 73 72 20 69 6e 74 6f 20 74 68 65 0a 2a  f csr into the.*
a6d0: 2a 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73  * array of regis
a6e0: 74 65 72 73 20 62 65 66 6f 72 65 20 69 6e 76 6f  ters before invo
a6f0: 6b 69 6e 67 20 4f 50 5f 41 67 67 53 74 65 70 20  king OP_AggStep 
a700: 6f 72 20 4f 50 5f 41 67 67 49 6e 76 65 72 73 65  or OP_AggInverse
a710: 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 63 73  .**.** Or, if cs
a720: 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  r is less than z
a730: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 61 72  ero, then the ar
a740: 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
a750: 20 61 74 20 72 65 67 20 69 73 0a 2a 2a 20 61 6c   at reg is.** al
a760: 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64 20  ready populated 
a770: 77 69 74 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  with all columns
a780: 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
a790: 74 20 72 6f 77 20 6f 66 20 74 68 65 20 73 75 62  t row of the sub
a7a0: 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  -query..**.** If
a7b0: 20 61 72 67 75 6d 65 6e 74 20 72 65 67 50 61 72   argument regPar
a7c0: 74 53 69 7a 65 20 69 73 20 6e 6f 6e 2d 7a 65 72  tSize is non-zer
a7d0: 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61 20  o, then it is a 
a7e0: 72 65 67 69 73 74 65 72 20 63 6f 6e 74 61 69 6e  register contain
a7f0: 69 6e 67 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65  ing the.** numbe
a800: 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
a810: 20 63 75 72 72 65 6e 74 20 70 61 72 74 69 74 69   current partiti
a820: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
a830: 69 64 20 77 69 6e 64 6f 77 41 67 67 53 74 65 70  id windowAggStep
a840: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
a850: 65 2c 20 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d  e, .  Window *pM
a860: 57 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  Win,            
a870: 20 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20        /* Linked 
a880: 6c 69 73 74 20 6f 66 20 77 69 6e 64 6f 77 20 66  list of window f
a890: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  unctions */.  in
a8a0: 74 20 63 73 72 2c 20 20 20 20 20 20 20 20 20 20  t csr,          
a8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a8c0: 20 52 65 61 64 20 61 72 67 75 6d 65 6e 74 73 20   Read arguments 
a8d0: 66 72 6f 6d 20 74 68 69 73 20 63 75 72 73 6f 72  from this cursor
a8e0: 20 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 76 65 72   */.  int bInver
a8f0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
a900: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
a910: 20 69 6e 76 6f 6b 65 20 78 49 6e 76 65 72 73 65   invoke xInverse
a920: 20 69 6e 73 74 65 61 64 20 6f 66 20 78 53 74 65   instead of xSte
a930: 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 20 20  p */.  int reg  
a940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a950: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
a960: 6f 66 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a  of registers */.
a970: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
a980: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
a990: 61 72 73 65 29 3b 0a 20 20 57 69 6e 64 6f 77 20  arse);.  Window 
a9a0: 2a 70 57 69 6e 3b 0a 20 20 66 6f 72 28 70 57 69  *pWin;.  for(pWi
a9b0: 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70  n=pMWin; pWin; p
a9c0: 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57  Win=pWin->pNextW
a9d0: 69 6e 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66  in){.    FuncDef
a9e0: 20 2a 70 46 75 6e 63 20 3d 20 70 57 69 6e 2d 3e   *pFunc = pWin->
a9f0: 70 46 75 6e 63 3b 0a 20 20 20 20 69 6e 74 20 72  pFunc;.    int r
aa00: 65 67 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 6e  egArg;.    int n
aa10: 41 72 67 20 3d 20 77 69 6e 64 6f 77 41 72 67 43  Arg = windowArgC
aa20: 6f 75 6e 74 28 70 57 69 6e 29 3b 0a 20 20 20 20  ount(pWin);.    
aa30: 69 6e 74 20 69 3b 0a 0a 20 20 20 20 66 6f 72 28  int i;..    for(
aa40: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
aa50: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
aa60: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
aa70: 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20 70 57  _Column, csr, pW
aa80: 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 69 2c 20 72  in->iArgCol+i, r
aa90: 65 67 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20  eg+i);.    }.   
aaa0: 20 72 65 67 41 72 67 20 3d 20 72 65 67 3b 0a 0a   regArg = reg;..
aab0: 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 72      if( pMWin->r
aac0: 65 67 53 74 61 72 74 52 6f 77 69 64 3d 3d 30 0a  egStartRowid==0.
aad0: 20 20 20 20 20 26 26 20 28 70 46 75 6e 63 2d 3e       && (pFunc->
aae0: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
aaf0: 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 20  TE_FUNC_MINMAX) 
ab00: 0a 20 20 20 20 20 26 26 20 28 70 57 69 6e 2d 3e  .     && (pWin->
ab10: 65 53 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55  eStart!=TK_UNBOU
ab20: 4e 44 45 44 29 0a 20 20 20 20 29 7b 0a 20 20 20  NDED).    ){.   
ab30: 20 20 20 69 6e 74 20 61 64 64 72 49 73 4e 75 6c     int addrIsNul
ab40: 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  l = sqlite3VdbeA
ab50: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp1(v, OP_IsNu
ab60: 6c 6c 2c 20 72 65 67 41 72 67 29 3b 0a 20 20 20  ll, regArg);.   
ab70: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
ab80: 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 49  v);.      if( bI
ab90: 6e 76 65 72 73 65 3d 3d 30 20 29 7b 0a 20 20 20  nverse==0 ){.   
aba0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
abb0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
abc0: 49 6d 6d 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70  Imm, pWin->regAp
abd0: 70 2b 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  p+1, 1);.       
abe0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
abf0: 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  p2(v, OP_SCopy, 
ac00: 72 65 67 41 72 67 2c 20 70 57 69 6e 2d 3e 72 65  regArg, pWin->re
ac10: 67 41 70 70 29 3b 0a 20 20 20 20 20 20 20 20 73  gApp);.        s
ac20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
ac30: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
ac40: 64 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2c  d, pWin->regApp,
ac50: 20 32 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70   2, pWin->regApp
ac60: 2b 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  +2);.        sql
ac70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
ac80: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
ac90: 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20 70 57  pWin->csrApp, pW
aca0: 69 6e 2d 3e 72 65 67 41 70 70 2b 32 29 3b 0a 20  in->regApp+2);. 
acb0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
acc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
acd0: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 53  ddOp4Int(v, OP_S
ace0: 65 65 6b 47 45 2c 20 70 57 69 6e 2d 3e 63 73 72  eekGE, pWin->csr
acf0: 41 70 70 2c 20 30 2c 20 72 65 67 41 72 67 2c 20  App, 0, regArg, 
ad00: 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  1);.        Vdbe
ad10: 43 6f 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b  CoverageNeverTak
ad20: 65 6e 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  en(v);.        s
ad30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
ad40: 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 70  (v, OP_Delete, p
ad50: 57 69 6e 2d 3e 63 73 72 41 70 70 29 3b 0a 20 20  Win->csrApp);.  
ad60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ad70: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 73 71 6c  eJumpHere(v, sql
ad80: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
ad90: 64 64 72 28 76 29 2d 32 29 3b 0a 20 20 20 20 20  ddr(v)-2);.     
ada0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
adb0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
adc0: 61 64 64 72 49 73 4e 75 6c 6c 29 3b 0a 20 20 20  addrIsNull);.   
add0: 20 7d 65 6c 73 65 20 69 66 28 20 70 57 69 6e 2d   }else if( pWin-
ade0: 3e 72 65 67 41 70 70 20 29 7b 0a 20 20 20 20 20  >regApp ){.     
adf0: 20 61 73 73 65 72 74 28 20 70 46 75 6e 63 2d 3e   assert( pFunc->
ae00: 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65  zName==nth_value
ae10: 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 20  Name.           
ae20: 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d  || pFunc->zName=
ae30: 3d 66 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65  =first_valueName
ae40: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
ae50: 61 73 73 65 72 74 28 20 62 49 6e 76 65 72 73 65  assert( bInverse
ae60: 3d 3d 30 20 7c 7c 20 62 49 6e 76 65 72 73 65 3d  ==0 || bInverse=
ae70: 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
ae80: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
ae90: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 57 69 6e   OP_AddImm, pWin
aea0: 2d 3e 72 65 67 41 70 70 2b 31 2d 62 49 6e 76 65  ->regApp+1-bInve
aeb0: 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c  rse, 1);.    }el
aec0: 73 65 20 69 66 28 20 70 46 75 6e 63 2d 3e 7a 4e  se if( pFunc->zN
aed0: 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65 20 7c 7c  ame==leadName ||
aee0: 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c   pFunc->zName==l
aef0: 61 67 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  agName ){.      
af00: 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20  /* no-op */.    
af10: 7d 65 6c 73 65 20 69 66 28 20 70 46 75 6e 63 2d  }else if( pFunc-
af20: 3e 78 53 46 75 6e 63 21 3d 6e 6f 6f 70 53 74 65  >xSFunc!=noopSte
af30: 70 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 69  pFunc ){.      i
af40: 6e 74 20 61 64 64 72 49 66 20 3d 20 30 3b 0a 20  nt addrIf = 0;. 
af50: 20 20 20 20 20 69 66 28 20 70 57 69 6e 2d 3e 70       if( pWin->p
af60: 46 69 6c 74 65 72 20 29 7b 0a 20 20 20 20 20 20  Filter ){.      
af70: 20 20 69 6e 74 20 72 65 67 54 6d 70 3b 0a 20 20    int regTmp;.  
af80: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 41        assert( nA
af90: 72 67 3d 3d 30 20 7c 7c 20 6e 41 72 67 3d 3d 70  rg==0 || nArg==p
afa0: 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70  Win->pOwner->x.p
afb0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
afc0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
afd0: 41 72 67 20 7c 7c 20 70 57 69 6e 2d 3e 70 4f 77  Arg || pWin->pOw
afe0: 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20  ner->x.pList==0 
aff0: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 67 54 6d  );.        regTm
b000: 70 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  p = sqlite3GetTe
b010: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
b020: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b030: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
b040: 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20 70 57 69 6e  olumn, csr, pWin
b050: 2d 3e 69 41 72 67 43 6f 6c 2b 6e 41 72 67 2c 72  ->iArgCol+nArg,r
b060: 65 67 54 6d 70 29 3b 0a 20 20 20 20 20 20 20 20  egTmp);.        
b070: 61 64 64 72 49 66 20 3d 20 73 71 6c 69 74 65 33  addrIf = sqlite3
b080: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
b090: 5f 49 66 4e 6f 74 2c 20 72 65 67 54 6d 70 2c 20  _IfNot, regTmp, 
b0a0: 30 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 56  0, 1);.        V
b0b0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
b0c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
b0d0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
b0e0: 61 72 73 65 2c 20 72 65 67 54 6d 70 29 3b 0a 20  arse, regTmp);. 
b0f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
b100: 20 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67   pFunc->funcFlag
b110: 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
b120: 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20  NEEDCOLL ){.    
b130: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
b140: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ll;.        asse
b150: 72 74 28 20 6e 41 72 67 3e 30 20 29 3b 0a 20 20  rt( nArg>0 );.  
b160: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
b170: 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53  lite3ExprNNCollS
b180: 65 71 28 70 50 61 72 73 65 2c 20 70 57 69 6e 2d  eq(pParse, pWin-
b190: 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74  >pOwner->x.pList
b1a0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
b1b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b1c0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
b1d0: 6f 6c 6c 53 65 71 2c 20 30 2c 30 2c 30 2c 20 28  ollSeq, 0,0,0, (
b1e0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 43 6f 6c  const char*)pCol
b1f0: 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
b200: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
b210: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
b220: 76 2c 20 62 49 6e 76 65 72 73 65 3f 20 4f 50 5f  v, bInverse? OP_
b230: 41 67 67 49 6e 76 65 72 73 65 20 3a 20 4f 50 5f  AggInverse : OP_
b240: 41 67 67 53 74 65 70 2c 20 0a 20 20 20 20 20 20  AggStep, .      
b250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b260: 20 20 62 49 6e 76 65 72 73 65 2c 20 72 65 67 41    bInverse, regA
b270: 72 67 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63  rg, pWin->regAcc
b280: 75 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  um);.      sqlit
b290: 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76  e3VdbeAppendP4(v
b2a0: 2c 20 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43  , pFunc, P4_FUNC
b2b0: 44 45 46 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  DEF);.      sqli
b2c0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
b2d0: 76 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a 20 20  v, (u8)nArg);.  
b2e0: 20 20 20 20 69 66 28 20 61 64 64 72 49 66 20 29      if( addrIf )
b2f0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
b300: 48 65 72 65 28 76 2c 20 61 64 64 72 49 66 29 3b  Here(v, addrIf);
b310: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
b320: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 4d 20  .** Generate VM 
b330: 63 6f 64 65 20 74 6f 20 69 6e 76 6f 6b 65 20 65  code to invoke e
b340: 69 74 68 65 72 20 78 56 61 6c 75 65 28 29 20 28  ither xValue() (
b350: 62 46 69 6e 3d 3d 30 29 20 6f 72 20 78 46 69 6e  bFin==0) or xFin
b360: 61 6c 69 7a 65 28 29 0a 2a 2a 20 28 62 46 69 6e  alize().** (bFin
b370: 3d 3d 31 29 20 66 6f 72 20 65 61 63 68 20 77 69  ==1) for each wi
b380: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 69 6e  ndow function in
b390: 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
b3a0: 20 73 74 61 72 74 69 6e 67 20 61 74 0a 2a 2a 20   starting at.** 
b3b0: 70 4d 57 69 6e 2e 20 4f 72 2c 20 66 6f 72 20 62  pMWin. Or, for b
b3c0: 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 2d 66  uilt-in window-f
b3d0: 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 64 6f  unctions that do
b3e0: 20 6e 6f 74 20 75 73 65 20 74 68 65 20 73 74 61   not use the sta
b3f0: 6e 64 61 72 64 0a 2a 2a 20 41 50 49 2c 20 67 65  ndard.** API, ge
b400: 6e 65 72 61 74 65 20 74 68 65 20 65 71 75 69 76  nerate the equiv
b410: 61 6c 65 6e 74 20 56 4d 20 63 6f 64 65 2e 0a 2a  alent VM code..*
b420: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
b430: 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 50 61 72  ndowAggFinal(Par
b440: 73 65 20 2a 70 50 61 72 73 65 2c 20 57 69 6e 64  se *pParse, Wind
b450: 6f 77 20 2a 70 4d 57 69 6e 2c 20 69 6e 74 20 72  ow *pMWin, int r
b460: 65 67 41 72 67 2c 20 69 6e 74 20 62 46 69 6e 29  egArg, int bFin)
b470: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
b480: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
b490: 72 73 65 29 3b 0a 20 20 57 69 6e 64 6f 77 20 2a  rse);.  Window *
b4a0: 70 57 69 6e 3b 0a 0a 20 20 69 66 28 20 70 4d 57  pWin;..  if( pMW
b4b0: 69 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f 77 69  in->regStartRowi
b4c0: 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  d ){.    int add
b4d0: 72 4e 65 78 74 3b 0a 20 20 20 20 69 6e 74 20 72  rNext;.    int r
b4e0: 65 67 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65  egRowid = sqlite
b4f0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
b500: 73 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  se);.    assert(
b510: 20 70 4d 57 69 6e 2d 3e 63 73 72 41 70 70 20 29   pMWin->csrApp )
b520: 3b 0a 20 20 20 20 66 6f 72 28 70 57 69 6e 3d 70  ;.    for(pWin=p
b530: 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e  MWin; pWin; pWin
b540: 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29  =pWin->pNextWin)
b550: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
b560: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b570: 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72  Null, 0, pWin->r
b580: 65 67 41 63 63 75 6d 29 3b 0a 20 20 20 20 7d 0a  egAccum);.    }.
b590: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b5a0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b  ddOp3(v, OP_Seek
b5b0: 47 45 2c 20 70 4d 57 69 6e 2d 3e 63 73 72 41 70  GE, pMWin->csrAp
b5c0: 70 2c 20 30 2c 20 70 4d 57 69 6e 2d 3e 72 65 67  p, 0, pMWin->reg
b5d0: 53 74 61 72 74 52 6f 77 69 64 29 3b 0a 20 20 20  StartRowid);.   
b5e0: 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69   addrNext = sqli
b5f0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
b600: 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  dr(v);.    sqlit
b610: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b620: 4f 50 5f 52 6f 77 69 64 2c 20 70 4d 57 69 6e 2d  OP_Rowid, pMWin-
b630: 3e 63 73 72 41 70 70 2c 20 72 65 67 52 6f 77 69  >csrApp, regRowi
b640: 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  d);.    sqlite3V
b650: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
b660: 47 74 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 45 6e  Gt, pMWin->regEn
b670: 64 52 6f 77 69 64 2c 20 30 2c 20 72 65 67 52 6f  dRowid, 0, regRo
b680: 77 69 64 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77  wid);.    window
b690: 41 67 67 53 74 65 70 28 70 50 61 72 73 65 2c 20  AggStep(pParse, 
b6a0: 70 4d 57 69 6e 2c 20 70 4d 57 69 6e 2d 3e 63 73  pMWin, pMWin->cs
b6b0: 72 41 70 70 2c 20 30 2c 20 72 65 67 41 72 67 29  rApp, 0, regArg)
b6c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
b6d0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
b6e0: 78 74 2c 20 70 4d 57 69 6e 2d 3e 63 73 72 41 70  xt, pMWin->csrAp
b6f0: 70 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20  p, addrNext);.  
b700: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
b710: 70 48 65 72 65 28 76 2c 20 61 64 64 72 4e 65 78  pHere(v, addrNex
b720: 74 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  t-1);.    sqlite
b730: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
b740: 20 61 64 64 72 4e 65 78 74 2b 31 29 3b 0a 20 20   addrNext+1);.  
b750: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
b760: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
b770: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 0a  regRowid);.  }..
b780: 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e    for(pWin=pMWin
b790: 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69  ; pWin; pWin=pWi
b7a0: 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20  n->pNextWin){.  
b7b0: 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 72 65 67    if( pMWin->reg
b7c0: 53 74 61 72 74 52 6f 77 69 64 3d 3d 30 0a 20 20  StartRowid==0.  
b7d0: 20 20 20 26 26 20 28 70 57 69 6e 2d 3e 70 46 75     && (pWin->pFu
b7e0: 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  nc->funcFlags & 
b7f0: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d  SQLITE_FUNC_MINM
b800: 41 58 29 20 0a 20 20 20 20 20 26 26 20 28 70 57  AX) .     && (pW
b810: 69 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b 5f 55  in->eStart!=TK_U
b820: 4e 42 4f 55 4e 44 45 44 29 0a 20 20 20 20 29 7b  NBOUNDED).    ){
b830: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b840: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
b850: 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65  ull, 0, pWin->re
b860: 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20  gResult);.      
b870: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b880: 31 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 57  1(v, OP_Last, pW
b890: 69 6e 2d 3e 63 73 72 41 70 70 29 3b 0a 20 20 20  in->csrApp);.   
b8a0: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
b8b0: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
b8c0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
b8d0: 50 5f 43 6f 6c 75 6d 6e 2c 20 70 57 69 6e 2d 3e  P_Column, pWin->
b8e0: 63 73 72 41 70 70 2c 20 30 2c 20 70 57 69 6e 2d  csrApp, 0, pWin-
b8f0: 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20  >regResult);.   
b900: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
b910: 6d 70 48 65 72 65 28 76 2c 20 73 71 6c 69 74 65  mpHere(v, sqlite
b920: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
b930: 28 76 29 2d 32 29 3b 0a 20 20 20 20 20 20 69 66  (v)-2);.      if
b940: 28 20 62 46 69 6e 20 29 7b 0a 20 20 20 20 20 20  ( bFin ){.      
b950: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b960: 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53  Op1(v, OP_ResetS
b970: 6f 72 74 65 72 2c 20 70 57 69 6e 2d 3e 63 73 72  orter, pWin->csr
b980: 41 70 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  App);.      }.  
b990: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57 69 6e    }else if( pWin
b9a0: 2d 3e 72 65 67 41 70 70 20 29 7b 0a 20 20 20 20  ->regApp ){.    
b9b0: 20 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d    assert( pMWin-
b9c0: 3e 72 65 67 53 74 61 72 74 52 6f 77 69 64 3d 3d  >regStartRowid==
b9d0: 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  0 );.    }else{.
b9e0: 20 20 20 20 20 20 69 6e 74 20 6e 41 72 67 20 3d        int nArg =
b9f0: 20 77 69 6e 64 6f 77 41 72 67 43 6f 75 6e 74 28   windowArgCount(
ba00: 70 57 69 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  pWin);.      if(
ba10: 20 62 46 69 6e 20 29 7b 0a 20 20 20 20 20 20 20   bFin ){.       
ba20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ba30: 70 32 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61  p2(v, OP_AggFina
ba40: 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75  l, pWin->regAccu
ba50: 6d 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 20 20  m, nArg);.      
ba60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70    sqlite3VdbeApp
ba70: 65 6e 64 50 34 28 76 2c 20 70 57 69 6e 2d 3e 70  endP4(v, pWin->p
ba80: 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46  Func, P4_FUNCDEF
ba90: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
baa0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
bab0: 4f 50 5f 43 6f 70 79 2c 20 70 57 69 6e 2d 3e 72  OP_Copy, pWin->r
bac0: 65 67 41 63 63 75 6d 2c 20 70 57 69 6e 2d 3e 72  egAccum, pWin->r
bad0: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
bae0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
baf0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
bb00: 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63   0, pWin->regAcc
bb10: 75 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  um);.      }else
bb20: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
bb30: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
bb40: 50 5f 41 67 67 56 61 6c 75 65 2c 70 57 69 6e 2d  P_AggValue,pWin-
bb50: 3e 72 65 67 41 63 63 75 6d 2c 6e 41 72 67 2c 70  >regAccum,nArg,p
bb60: 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b  Win->regResult);
bb70: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
bb80: 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20  VdbeAppendP4(v, 
bb90: 70 57 69 6e 2d 3e 70 46 75 6e 63 2c 20 50 34 5f  pWin->pFunc, P4_
bba0: 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20  FUNCDEF);.      
bbb0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
bbc0: 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
bbd0: 73 75 62 2d 72 6f 75 74 69 6e 65 20 61 74 20 72  sub-routine at r
bbe0: 65 67 47 6f 73 75 62 20 28 67 65 6e 65 72 61 74  egGosub (generat
bbf0: 65 64 20 62 79 20 63 6f 64 65 20 69 6e 20 73 65  ed by code in se
bc00: 6c 65 63 74 2e 63 29 20 74 6f 0a 2a 2a 20 72 65  lect.c) to.** re
bc10: 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
bc20: 20 72 6f 77 20 6f 66 20 57 69 6e 64 6f 77 2e 69   row of Window.i
bc30: 45 70 68 43 73 72 2e 20 49 66 20 61 6c 6c 20 77  EphCsr. If all w
bc40: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
bc50: 61 72 65 0a 2a 2a 20 61 67 67 72 65 67 61 74 65  are.** aggregate
bc60: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
bc70: 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20 73  s that use the s
bc80: 74 61 6e 64 61 72 64 20 41 50 49 2c 20 61 20 73  tandard API, a s
bc90: 69 6e 67 6c 65 0a 2a 2a 20 4f 50 5f 47 6f 73 75  ingle.** OP_Gosu
bca0: 62 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73  b instruction is
bcb0: 20 61 6c 6c 20 74 68 61 74 20 74 68 69 73 20 72   all that this r
bcc0: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
bcd0: 2e 20 45 78 74 72 61 20 56 4d 20 63 6f 64 65 0a  . Extra VM code.
bce0: 2a 2a 20 66 6f 72 20 70 65 72 2d 72 6f 77 20 70  ** for per-row p
bcf0: 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6f 6e 6c  rocessing is onl
bd00: 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  y generated for 
bd10: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 75  the following bu
bd20: 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 0a 2a 2a  ilt-in window.**
bd30: 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a   functions:.**.*
bd40: 2a 20 20 20 6e 74 68 5f 76 61 6c 75 65 28 29 0a  *   nth_value().
bd50: 2a 2a 20 20 20 66 69 72 73 74 5f 76 61 6c 75 65  **   first_value
bd60: 28 29 0a 2a 2a 20 20 20 6c 61 67 28 29 0a 2a 2a  ().**   lag().**
bd70: 20 20 20 6c 65 61 64 28 29 0a 2a 2f 0a 73 74 61     lead().*/.sta
bd80: 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 52  tic void windowR
bd90: 65 74 75 72 6e 4f 6e 65 52 6f 77 28 0a 20 20 50  eturnOneRow(.  P
bda0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20  arse *pParse,.  
bdb0: 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 2c 0a 20  Window *pMWin,. 
bdc0: 20 69 6e 74 20 72 65 67 47 6f 73 75 62 2c 0a 20   int regGosub,. 
bdd0: 20 69 6e 74 20 61 64 64 72 47 6f 73 75 62 0a 29   int addrGosub.)
bde0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
bdf0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
be00: 72 73 65 29 3b 0a 20 20 57 69 6e 64 6f 77 20 2a  rse);.  Window *
be10: 70 57 69 6e 3b 0a 20 20 66 6f 72 28 70 57 69 6e  pWin;.  for(pWin
be20: 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57  =pMWin; pWin; pW
be30: 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69  in=pWin->pNextWi
be40: 6e 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 20  n){.    FuncDef 
be50: 2a 70 46 75 6e 63 20 3d 20 70 57 69 6e 2d 3e 70  *pFunc = pWin->p
be60: 46 75 6e 63 3b 0a 20 20 20 20 69 66 28 20 70 46  Func;.    if( pF
be70: 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f  unc->zName==nth_
be80: 76 61 6c 75 65 4e 61 6d 65 0a 20 20 20 20 20 7c  valueName.     |
be90: 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d  | pFunc->zName==
bea0: 66 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65 0a  first_valueName.
beb0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74      ){.      int
bec0: 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33 56 64   lbl = sqlite3Vd
bed0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
bee0: 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 74  se);.      int t
bef0: 6d 70 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47  mpReg = sqlite3G
bf00: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
bf10: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
bf20: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
bf30: 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e  _Null, 0, pWin->
bf40: 72 65 67 52 65 73 75 6c 74 29 3b 0a 0a 20 20 20  regResult);..   
bf50: 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 7a 4e     if( pFunc->zN
bf60: 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e 61  ame==nth_valueNa
bf70: 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  me ){.        sq
bf80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
bf90: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 70 4d 57  v, OP_Column,pMW
bfa0: 69 6e 2d 3e 69 45 70 68 43 73 72 2c 70 57 69 6e  in->iEphCsr,pWin
bfb0: 2d 3e 69 41 72 67 43 6f 6c 2b 31 2c 74 6d 70 52  ->iArgCol+1,tmpR
bfc0: 65 67 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e  eg);.        win
bfd0: 64 6f 77 43 68 65 63 6b 56 61 6c 75 65 28 70 50  dowCheckValue(pP
bfe0: 61 72 73 65 2c 20 74 6d 70 52 65 67 2c 20 32 29  arse, tmpReg, 2)
bff0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
c000: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
c010: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
c020: 6e 74 65 67 65 72 2c 20 31 2c 20 74 6d 70 52 65  nteger, 1, tmpRe
c030: 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
c040: 20 20 69 66 28 20 70 57 69 6e 2d 3e 65 45 78 63    if( pWin->eExc
c050: 6c 75 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lude==0 ){.     
c060: 20 20 20 69 6e 74 20 63 73 72 20 3d 20 70 57 69     int csr = pWi
c070: 6e 2d 3e 63 73 72 41 70 70 3b 0a 20 20 20 20 20  n->csrApp;.     
c080: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c090: 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20  dOp3(v, OP_Add, 
c0a0: 74 6d 70 52 65 67 2c 20 70 57 69 6e 2d 3e 72 65  tmpReg, pWin->re
c0b0: 67 41 70 70 2c 20 74 6d 70 52 65 67 29 3b 0a 20  gApp, tmpReg);. 
c0c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
c0d0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 47  beAddOp3(v, OP_G
c0e0: 74 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b  t, pWin->regApp+
c0f0: 31 2c 20 6c 62 6c 2c 20 74 6d 70 52 65 67 29 3b  1, lbl, tmpReg);
c100: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
c110: 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c 28 76  erageNeverNull(v
c120: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
c130: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
c140: 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 63 73  OP_SeekRowid, cs
c150: 72 2c 20 30 2c 20 74 6d 70 52 65 67 29 3b 0a 20  r, 0, tmpReg);. 
c160: 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
c170: 61 67 65 4e 65 76 65 72 54 61 6b 65 6e 28 76 29  ageNeverTaken(v)
c180: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
c190: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
c1a0: 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20 70  P_Column, csr, p
c1b0: 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2c 20 70 57  Win->iArgCol, pW
c1c0: 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a  in->regResult);.
c1d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
c1e0: 20 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 69       int regRowi
c1f0: 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
c200: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
c210: 20 20 20 20 20 20 20 69 6e 74 20 63 73 72 20 3d         int csr =
c220: 20 70 4d 57 69 6e 2d 3e 63 73 72 41 70 70 3b 0a   pMWin->csrApp;.
c230: 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
c240: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 73 71  Next;.        sq
c250: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
c260: 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 74 6d 70  v, OP_IfPos, tmp
c270: 52 65 67 2c 20 73 71 6c 69 74 65 33 56 64 62 65  Reg, sqlite3Vdbe
c280: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31  CurrentAddr(v)+1
c290: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 1);.        sq
c2a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
c2b0: 76 2c 20 4f 50 5f 53 65 65 6b 47 45 2c 20 63 73  v, OP_SeekGE, cs
c2c0: 72 2c 20 6c 62 6c 2c 20 70 4d 57 69 6e 2d 3e 72  r, lbl, pMWin->r
c2d0: 65 67 53 74 61 72 74 52 6f 77 69 64 29 3b 0a 20  egStartRowid);. 
c2e0: 20 20 20 20 20 20 20 61 64 64 72 4e 65 78 74 20         addrNext 
c2f0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
c300: 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c  Op2(v, OP_Rowid,
c310: 20 63 73 72 2c 20 72 65 67 52 6f 77 69 64 29 3b   csr, regRowid);
c320: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
c330: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
c340: 5f 47 74 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 45  _Gt, pMWin->regE
c350: 6e 64 52 6f 77 69 64 2c 20 6c 62 6c 2c 20 72 65  ndRowid, lbl, re
c360: 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  gRowid);.       
c370: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c380: 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p3(v, OP_IfPos, 
c390: 74 6d 70 52 65 67 2c 20 73 71 6c 69 74 65 33 56  tmpReg, sqlite3V
c3a0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
c3b0: 29 2b 33 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  )+3, 1);.       
c3c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c3d0: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
c3e0: 20 63 73 72 2c 20 70 4d 57 69 6e 2d 3e 69 41 72   csr, pMWin->iAr
c3f0: 67 43 6f 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 52  gCol, pWin->regR
c400: 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20  esult);.        
c410: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c420: 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
c430: 20 6c 62 6c 29 3b 0a 20 20 20 20 20 20 20 20 73   lbl);.        s
c440: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
c450: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 63 73 72  (v, OP_Next, csr
c460: 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20  , addrNext);.   
c470: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
c480: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
c490: 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  e, regRowid);.  
c4a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
c4b0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
c4c0: 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20 20 20  bel(v, lbl);.   
c4d0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
c4e0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
c4f0: 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 7d 0a   tmpReg);.    }.
c500: 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 46 75      else if( pFu
c510: 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e  nc->zName==leadN
c520: 61 6d 65 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e  ame || pFunc->zN
c530: 61 6d 65 3d 3d 6c 61 67 4e 61 6d 65 20 29 7b 0a  ame==lagName ){.
c540: 20 20 20 20 20 20 69 6e 74 20 6e 41 72 67 20 3d        int nArg =
c550: 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78   pWin->pOwner->x
c560: 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  .pList->nExpr;. 
c570: 20 20 20 20 20 69 6e 74 20 63 73 72 20 3d 20 70       int csr = p
c580: 57 69 6e 2d 3e 63 73 72 41 70 70 3b 0a 20 20 20  Win->csrApp;.   
c590: 20 20 20 69 6e 74 20 6c 62 6c 20 3d 20 73 71 6c     int lbl = sql
c5a0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
c5b0: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
c5c0: 20 69 6e 74 20 74 6d 70 52 65 67 20 3d 20 73 71   int tmpReg = sq
c5d0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
c5e0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
c5f0: 6e 74 20 69 45 70 68 20 3d 20 70 4d 57 69 6e 2d  nt iEph = pMWin-
c600: 3e 69 45 70 68 43 73 72 3b 0a 0a 20 20 20 20 20  >iEphCsr;..     
c610: 20 69 66 28 20 6e 41 72 67 3c 33 20 29 7b 0a 20   if( nArg<3 ){. 
c620: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
c630: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
c640: 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65  ull, 0, pWin->re
c650: 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20  gResult);.      
c660: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
c670: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
c680: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
c690: 45 70 68 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43  Eph, pWin->iArgC
c6a0: 6f 6c 2b 32 2c 20 70 57 69 6e 2d 3e 72 65 67 52  ol+2, pWin->regR
c6b0: 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 0a  esult);.      }.
c6c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c6d0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
c6e0: 77 69 64 2c 20 69 45 70 68 2c 20 74 6d 70 52 65  wid, iEph, tmpRe
c6f0: 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 41  g);.      if( nA
c700: 72 67 3c 32 20 29 7b 0a 20 20 20 20 20 20 20 20  rg<2 ){.        
c710: 69 6e 74 20 76 61 6c 20 3d 20 28 70 46 75 6e 63  int val = (pFunc
c720: 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d  ->zName==leadNam
c730: 65 20 3f 20 31 20 3a 20 2d 31 29 3b 0a 20 20 20  e ? 1 : -1);.   
c740: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c750: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
c760: 49 6d 6d 2c 20 74 6d 70 52 65 67 2c 20 76 61 6c  Imm, tmpReg, val
c770: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
c780: 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d          int op =
c790: 20 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d   (pFunc->zName==
c7a0: 6c 65 61 64 4e 61 6d 65 20 3f 20 4f 50 5f 41 64  leadName ? OP_Ad
c7b0: 64 20 3a 20 4f 50 5f 53 75 62 74 72 61 63 74 29  d : OP_Subtract)
c7c0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 6d  ;.        int tm
c7d0: 70 52 65 67 32 20 3d 20 73 71 6c 69 74 65 33 47  pReg2 = sqlite3G
c7e0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
c7f0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
c800: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
c810: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 45 70 68 2c  OP_Column, iEph,
c820: 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 31   pWin->iArgCol+1
c830: 2c 20 74 6d 70 52 65 67 32 29 3b 0a 20 20 20 20  , tmpReg2);.    
c840: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c850: 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 74 6d 70  ddOp3(v, op, tmp
c860: 52 65 67 32 2c 20 74 6d 70 52 65 67 2c 20 74 6d  Reg2, tmpReg, tm
c870: 70 52 65 67 29 3b 0a 20 20 20 20 20 20 20 20 73  pReg);.        s
c880: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
c890: 70 52 65 67 28 70 50 61 72 73 65 2c 20 74 6d 70  pReg(pParse, tmp
c8a0: 52 65 67 32 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  Reg2);.      }..
c8b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c8c0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65  eAddOp3(v, OP_Se
c8d0: 65 6b 52 6f 77 69 64 2c 20 63 73 72 2c 20 6c 62  ekRowid, csr, lb
c8e0: 6c 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20  l, tmpReg);.    
c8f0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
c900: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c910: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
c920: 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20 70 57  _Column, csr, pW
c930: 69 6e 2d 3e 69 41 72 67 43 6f 6c 2c 20 70 57 69  in->iArgCol, pWi
c940: 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20  n->regResult);. 
c950: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c960: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
c970: 6c 62 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lbl);.      sqli
c980: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
c990: 67 28 70 50 61 72 73 65 2c 20 74 6d 70 52 65 67  g(pParse, tmpReg
c9a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
c9b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
c9c0: 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
c9d0: 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75  gGosub, addrGosu
c9e0: 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  b);.}../*.** Gen
c9f0: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 65  erate code to se
ca00: 74 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  t the accumulato
ca10: 72 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 65  r register for e
ca20: 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  ach window funct
ca30: 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 6c 69  ion.** in the li
ca40: 6e 6b 65 64 20 6c 69 73 74 20 70 61 73 73 65 64  nked list passed
ca50: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
ca60: 72 67 75 6d 65 6e 74 20 74 6f 20 4e 55 4c 4c 2e  rgument to NULL.
ca70: 20 41 6e 64 20 70 65 72 66 6f 72 6d 0a 2a 2a 20   And perform.** 
ca80: 61 6e 79 20 65 71 75 69 76 61 6c 65 6e 74 20 69  any equivalent i
ca90: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 72 65  nitialization re
caa0: 71 75 69 72 65 64 20 62 79 20 61 6e 79 20 62 75  quired by any bu
cab0: 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75  ilt-in window fu
cac0: 6e 63 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 74 68  nctions.** in th
cad0: 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
cae0: 63 20 69 6e 74 20 77 69 6e 64 6f 77 49 6e 69 74  c int windowInit
caf0: 41 63 63 75 6d 28 50 61 72 73 65 20 2a 70 50 61  Accum(Parse *pPa
cb00: 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70 4d 57  rse, Window *pMW
cb10: 69 6e 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  in){.  Vdbe *v =
cb20: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
cb30: 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72  pParse);.  int r
cb40: 65 67 41 72 67 3b 0a 20 20 69 6e 74 20 6e 41 72  egArg;.  int nAr
cb50: 67 20 3d 20 30 3b 0a 20 20 57 69 6e 64 6f 77 20  g = 0;.  Window 
cb60: 2a 70 57 69 6e 3b 0a 20 20 66 6f 72 28 70 57 69  *pWin;.  for(pWi
cb70: 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70  n=pMWin; pWin; p
cb80: 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57  Win=pWin->pNextW
cb90: 69 6e 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66  in){.    FuncDef
cba0: 20 2a 70 46 75 6e 63 20 3d 20 70 57 69 6e 2d 3e   *pFunc = pWin->
cbb0: 70 46 75 6e 63 3b 0a 20 20 20 20 73 71 6c 69 74  pFunc;.    sqlit
cbc0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
cbd0: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e  OP_Null, 0, pWin
cbe0: 2d 3e 72 65 67 41 63 63 75 6d 29 3b 0a 20 20 20  ->regAccum);.   
cbf0: 20 6e 41 72 67 20 3d 20 4d 41 58 28 6e 41 72 67   nArg = MAX(nArg
cc00: 2c 20 77 69 6e 64 6f 77 41 72 67 43 6f 75 6e 74  , windowArgCount
cc10: 28 70 57 69 6e 29 29 3b 0a 20 20 20 20 69 66 28  (pWin));.    if(
cc20: 20 70 57 69 6e 2d 3e 65 45 78 63 6c 75 64 65 3d   pWin->eExclude=
cc30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
cc40: 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74  pFunc->zName==nt
cc50: 68 5f 76 61 6c 75 65 4e 61 6d 65 20 7c 7c 20 70  h_valueName || p
cc60: 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72  Func->zName==fir
cc70: 73 74 5f 76 61 6c 75 65 4e 61 6d 65 20 29 7b 0a  st_valueName ){.
cc80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
cc90: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
cca0: 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 57 69 6e  Integer, 0, pWin
ccb0: 2d 3e 72 65 67 41 70 70 29 3b 0a 20 20 20 20 20  ->regApp);.     
ccc0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ccd0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
cce0: 65 72 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67  er, 0, pWin->reg
ccf0: 41 70 70 2b 31 29 3b 0a 20 20 20 20 20 20 7d 0a  App+1);.      }.
cd00: 0a 20 20 20 20 20 20 69 66 28 20 28 70 46 75 6e  .      if( (pFun
cd10: 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  c->funcFlags & S
cd20: 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41  QLITE_FUNC_MINMA
cd30: 58 29 20 26 26 20 70 57 69 6e 2d 3e 63 73 72 41  X) && pWin->csrA
cd40: 70 70 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  pp ){.        as
cd50: 73 65 72 74 28 20 70 57 69 6e 2d 3e 65 53 74 61  sert( pWin->eSta
cd60: 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  rt!=TK_UNBOUNDED
cd70: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
cd80: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
cd90: 20 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c   OP_ResetSorter,
cda0: 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 29 3b 0a   pWin->csrApp);.
cdb0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
cdc0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
cdd0: 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 57 69 6e  Integer, 0, pWin
cde0: 2d 3e 72 65 67 41 70 70 2b 31 29 3b 0a 20 20 20  ->regApp+1);.   
cdf0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
ce00: 20 72 65 67 41 72 67 20 3d 20 70 50 61 72 73 65   regArg = pParse
ce10: 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 70 50 61 72  ->nMem+1;.  pPar
ce20: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 41 72 67  se->nMem += nArg
ce30: 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 67 41 72  ;.  return regAr
ce40: 67 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 74  g;.}../* .** Ret
ce50: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
ce60: 63 75 72 72 65 6e 74 20 66 72 61 6d 65 20 73 68  current frame sh
ce70: 6f 75 6c 64 20 62 65 20 63 61 63 68 65 64 20 69  ould be cached i
ce80: 6e 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20  n the ephemeral 
ce90: 74 61 62 6c 65 2c 0a 2a 2a 20 65 76 65 6e 20 69  table,.** even i
cea0: 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 78  f there are no x
ceb0: 49 6e 76 65 72 73 65 28 29 20 63 61 6c 6c 73 20  Inverse() calls 
cec0: 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61  required..*/.sta
ced0: 74 69 63 20 69 6e 74 20 77 69 6e 64 6f 77 43 61  tic int windowCa
cee0: 63 68 65 46 72 61 6d 65 28 57 69 6e 64 6f 77 20  cheFrame(Window 
cef0: 2a 70 4d 57 69 6e 29 7b 0a 20 20 57 69 6e 64 6f  *pMWin){.  Windo
cf00: 77 20 2a 70 57 69 6e 3b 0a 20 20 69 66 28 20 70  w *pWin;.  if( p
cf10: 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f  MWin->regStartRo
cf20: 77 69 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  wid ) return 1;.
cf30: 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e    for(pWin=pMWin
cf40: 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69  ; pWin; pWin=pWi
cf50: 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20  n->pNextWin){.  
cf60: 20 20 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63    FuncDef *pFunc
cf70: 20 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a   = pWin->pFunc;.
cf80: 20 20 20 20 69 66 28 20 28 70 46 75 6e 63 2d 3e      if( (pFunc->
cf90: 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65  zName==nth_value
cfa0: 4e 61 6d 65 29 0a 20 20 20 20 20 7c 7c 20 28 70  Name).     || (p
cfb0: 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72  Func->zName==fir
cfc0: 73 74 5f 76 61 6c 75 65 4e 61 6d 65 29 0a 20 20  st_valueName).  
cfd0: 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d 3e 7a 4e     || (pFunc->zN
cfe0: 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65 29 0a 20  ame==leadName). 
cff0: 20 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d 3e 7a      || (pFunc->z
d000: 4e 61 6d 65 3d 3d 6c 61 67 4e 61 6d 65 29 0a 20  Name==lagName). 
d010: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
d020: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
d030: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
d040: 2a 0a 2a 2a 20 72 65 67 4f 6c 64 20 61 6e 64 20  *.** regOld and 
d050: 72 65 67 4e 65 77 20 61 72 65 20 65 61 63 68 20  regNew are each 
d060: 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74  the first regist
d070: 65 72 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f  er in an array o
d080: 66 20 73 69 7a 65 0a 2a 2a 20 70 4f 72 64 65 72  f size.** pOrder
d090: 42 79 2d 3e 6e 45 78 70 72 2e 20 54 68 69 73 20  By->nExpr. This 
d0a0: 66 75 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61 74  function generat
d0b0: 65 73 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70 61  es code to compa
d0c0: 72 65 20 74 68 65 20 74 77 6f 0a 2a 2a 20 61 72  re the two.** ar
d0d0: 72 61 79 73 20 6f 66 20 72 65 67 69 73 74 65 72  rays of register
d0e0: 73 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c  s using the coll
d0f0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20  ation sequences 
d100: 61 6e 64 20 6f 74 68 65 72 20 63 6f 6d 70 61 72  and other compar
d110: 69 73 6f 6e 0a 2a 2a 20 70 61 72 61 6d 65 74 65  ison.** paramete
d120: 72 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20  rs specified by 
d130: 70 4f 72 64 65 72 42 79 2e 20 0a 2a 2a 0a 2a 2a  pOrderBy. .**.**
d140: 20 49 66 20 74 68 65 20 74 77 6f 20 61 72 72 61   If the two arra
d150: 79 73 20 61 72 65 20 6e 6f 74 20 65 71 75 61 6c  ys are not equal
d160: 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
d170: 66 20 72 65 67 4e 65 77 20 69 73 20 63 6f 70 69  f regNew is copi
d180: 65 64 20 74 6f 20 0a 2a 2a 20 72 65 67 4f 6c 64  ed to .** regOld
d190: 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 66 61 6c   and control fal
d1a0: 6c 73 20 74 68 72 6f 75 67 68 2e 20 4f 74 68 65  ls through. Othe
d1b0: 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 63 6f  rwise, if the co
d1c0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 61 72  ntents of the ar
d1d0: 72 61 79 73 0a 2a 2a 20 61 72 65 20 65 71 75 61  rays.** are equa
d1e0: 6c 2c 20 61 6e 20 4f 50 5f 47 6f 74 6f 20 69 73  l, an OP_Goto is
d1f0: 20 65 78 65 63 75 74 65 64 2e 20 54 68 65 20 61   executed. The a
d200: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50  ddress of the OP
d210: 5f 47 6f 74 6f 20 69 73 20 72 65 74 75 72 6e 65  _Goto is returne
d220: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
d230: 64 20 77 69 6e 64 6f 77 49 66 4e 65 77 50 65 65  d windowIfNewPee
d240: 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
d250: 73 65 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  se,.  ExprList *
d260: 70 4f 72 64 65 72 42 79 2c 0a 20 20 69 6e 74 20  pOrderBy,.  int 
d270: 72 65 67 4e 65 77 2c 20 20 20 20 20 20 20 20 20  regNew,         
d280: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
d290: 69 72 73 74 20 69 6e 20 61 72 72 61 79 20 6f 66  irst in array of
d2a0: 20 6e 65 77 20 76 61 6c 75 65 73 20 2a 2f 0a 20   new values */. 
d2b0: 20 69 6e 74 20 72 65 67 4f 6c 64 2c 20 20 20 20   int regOld,    
d2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2d0: 20 2f 2a 20 46 69 72 73 74 20 69 6e 20 61 72 72   /* First in arr
d2e0: 61 79 20 6f 66 20 6f 6c 64 20 76 61 6c 75 65 73  ay of old values
d2f0: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 20 20   */.  int addr  
d300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d310: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
d320: 72 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  re */.){.  Vdbe 
d330: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
d340: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
d350: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
d360: 20 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 70 4f     int nVal = pO
d370: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
d380: 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
d390: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65  Info = sqlite3Ke
d3a0: 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
d3b0: 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  t(pParse, pOrder
d3c0: 42 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  By, 0, 0);.    s
d3d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
d3e0: 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
d3f0: 72 65 67 4f 6c 64 2c 20 72 65 67 4e 65 77 2c 20  regOld, regNew, 
d400: 6e 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  nVal);.    sqlit
d410: 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76  e3VdbeAppendP4(v
d420: 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66  , (void*)pKeyInf
d430: 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
d440: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d450: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
d460: 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  , .      sqlite3
d470: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
d480: 76 29 2b 31 2c 20 61 64 64 72 2c 20 73 71 6c 69  v)+1, addr, sqli
d490: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
d4a0: 64 72 28 76 29 2b 31 0a 20 20 20 20 29 3b 0a 20  dr(v)+1.    );. 
d4b0: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 45     VdbeCoverageE
d4c0: 71 4e 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  qNe(v);.    sqli
d4d0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
d4e0: 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4e 65 77   OP_Copy, regNew
d4f0: 2c 20 72 65 67 4f 6c 64 2c 20 6e 56 61 6c 2d 31  , regOld, nVal-1
d500: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
d510: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d520: 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
d530: 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 74   addr);.  }.}..t
d540: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57 69  ypedef struct Wi
d550: 6e 64 6f 77 43 6f 64 65 41 72 67 20 57 69 6e 64  ndowCodeArg Wind
d560: 6f 77 43 6f 64 65 41 72 67 3b 0a 74 79 70 65 64  owCodeArg;.typed
d570: 65 66 20 73 74 72 75 63 74 20 57 69 6e 64 6f 77  ef struct Window
d580: 43 73 72 41 6e 64 52 65 67 20 57 69 6e 64 6f 77  CsrAndReg Window
d590: 43 73 72 41 6e 64 52 65 67 3b 0a 73 74 72 75 63  CsrAndReg;.struc
d5a0: 74 20 57 69 6e 64 6f 77 43 73 72 41 6e 64 52 65  t WindowCsrAndRe
d5b0: 67 20 7b 0a 20 20 69 6e 74 20 63 73 72 3b 0a 20  g {.  int csr;. 
d5c0: 20 69 6e 74 20 72 65 67 3b 0a 7d 3b 0a 0a 73 74   int reg;.};..st
d5d0: 72 75 63 74 20 57 69 6e 64 6f 77 43 6f 64 65 41  ruct WindowCodeA
d5e0: 72 67 20 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  rg {.  Parse *pP
d5f0: 61 72 73 65 3b 0a 20 20 57 69 6e 64 6f 77 20 2a  arse;.  Window *
d600: 70 4d 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 70  pMWin;.  Vdbe *p
d610: 56 64 62 65 3b 0a 20 20 69 6e 74 20 72 65 67 47  Vdbe;.  int regG
d620: 6f 73 75 62 3b 0a 20 20 69 6e 74 20 61 64 64 72  osub;.  int addr
d630: 47 6f 73 75 62 3b 0a 20 20 69 6e 74 20 72 65 67  Gosub;.  int reg
d640: 41 72 67 3b 0a 20 20 69 6e 74 20 65 44 65 6c 65  Arg;.  int eDele
d650: 74 65 3b 0a 0a 20 20 57 69 6e 64 6f 77 43 73 72  te;..  WindowCsr
d660: 41 6e 64 52 65 67 20 73 74 61 72 74 3b 0a 20 20  AndReg start;.  
d670: 57 69 6e 64 6f 77 43 73 72 41 6e 64 52 65 67 20  WindowCsrAndReg 
d680: 63 75 72 72 65 6e 74 3b 0a 20 20 57 69 6e 64 6f  current;.  Windo
d690: 77 43 73 72 41 6e 64 52 65 67 20 65 6e 64 3b 0a  wCsrAndReg end;.
d6a0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 75 65 73  };../*.** Values
d6b0: 20 74 68 61 74 20 6d 61 79 20 62 65 20 70 61 73   that may be pas
d6c0: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
d6d0: 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 77 69  d argument to wi
d6e0: 6e 64 6f 77 43 6f 64 65 4f 70 28 29 2e 0a 2a 2f  ndowCodeOp()..*/
d6f0: 0a 23 64 65 66 69 6e 65 20 57 49 4e 44 4f 57 5f  .#define WINDOW_
d700: 52 45 54 55 52 4e 5f 52 4f 57 20 31 0a 23 64 65  RETURN_ROW 1.#de
d710: 66 69 6e 65 20 57 49 4e 44 4f 57 5f 41 47 47 49  fine WINDOW_AGGI
d720: 4e 56 45 52 53 45 20 32 0a 23 64 65 66 69 6e 65  NVERSE 2.#define
d730: 20 57 49 4e 44 4f 57 5f 41 47 47 53 54 45 50 20   WINDOW_AGGSTEP 
d740: 20 20 20 33 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65     3../*.** Gene
d750: 72 61 74 65 20 56 4d 20 63 6f 64 65 20 74 6f 20  rate VM code to 
d760: 72 65 61 64 20 74 68 65 20 77 69 6e 64 6f 77 20  read the window 
d770: 66 72 61 6d 65 73 20 70 65 65 72 20 76 61 6c 75  frames peer valu
d780: 65 73 20 66 72 6f 6d 20 63 75 72 73 6f 72 20 63  es from cursor c
d790: 73 72 20 69 6e 74 6f 0a 2a 2a 20 61 6e 20 61 72  sr into.** an ar
d7a0: 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
d7b0: 20 73 74 61 72 74 69 6e 67 20 61 74 20 72 65 67   starting at reg
d7c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d7d0: 20 77 69 6e 64 6f 77 52 65 61 64 50 65 65 72 56   windowReadPeerV
d7e0: 61 6c 75 65 73 28 0a 20 20 57 69 6e 64 6f 77 43  alues(.  WindowC
d7f0: 6f 64 65 41 72 67 20 2a 70 2c 0a 20 20 69 6e 74  odeArg *p,.  int
d800: 20 63 73 72 2c 0a 20 20 69 6e 74 20 72 65 67 0a   csr,.  int reg.
d810: 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57  ){.  Window *pMW
d820: 69 6e 20 3d 20 70 2d 3e 70 4d 57 69 6e 3b 0a 20  in = p->pMWin;. 
d830: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
d840: 72 42 79 20 3d 20 70 4d 57 69 6e 2d 3e 70 4f 72  rBy = pMWin->pOr
d850: 64 65 72 42 79 3b 0a 20 20 69 66 28 20 70 4f 72  derBy;.  if( pOr
d860: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 56 64 62  derBy ){.    Vdb
d870: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
d880: 74 56 64 62 65 28 70 2d 3e 70 50 61 72 73 65 29  tVdbe(p->pParse)
d890: 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
d8a0: 70 50 61 72 74 20 3d 20 70 4d 57 69 6e 2d 3e 70  pPart = pMWin->p
d8b0: 50 61 72 74 69 74 69 6f 6e 3b 0a 20 20 20 20 69  Partition;.    i
d8c0: 6e 74 20 69 43 6f 6c 4f 66 66 20 3d 20 70 4d 57  nt iColOff = pMW
d8d0: 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 20 2b  in->nBufferCol +
d8e0: 20 28 70 50 61 72 74 20 3f 20 70 50 61 72 74 2d   (pPart ? pPart-
d8f0: 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20  >nExpr : 0);.   
d900: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
d910: 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
d920: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
d930: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d940: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
d950: 6d 6e 2c 20 63 73 72 2c 20 69 43 6f 6c 4f 66 66  mn, csr, iColOff
d960: 2b 69 2c 20 72 65 67 2b 69 29 3b 0a 20 20 20 20  +i, reg+i);.    
d970: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  }.  }.}../*.** T
d980: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
d990: 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f  called as part o
d9a0: 66 20 67 65 6e 65 72 61 74 69 6e 67 20 56 4d 20  f generating VM 
d9b0: 70 72 6f 67 72 61 6d 73 20 66 6f 72 20 52 41 4e  programs for RAN
d9c0: 47 45 0a 2a 2a 20 6f 66 66 73 65 74 20 50 52 45  GE.** offset PRE
d9d0: 43 45 44 49 4e 47 2f 46 4f 4c 4c 4f 57 49 4e 47  CEDING/FOLLOWING
d9e0: 20 66 72 61 6d 65 20 62 6f 75 6e 64 61 72 69 65   frame boundarie
d9f0: 73 2e 20 49 74 20 67 65 6e 65 72 61 74 65 73 20  s. It generates 
da00: 63 6f 64 65 20 65 71 75 69 76 61 6c 65 6e 74 0a  code equivalent.
da10: 2a 2a 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 69  ** to:.**.**   i
da20: 66 28 20 63 73 72 31 2e 70 65 65 72 56 61 6c 20  f( csr1.peerVal 
da30: 2b 20 72 65 67 56 61 6c 20 3e 3d 20 63 73 72 32  + regVal >= csr2
da40: 2e 70 65 65 72 56 61 6c 20 29 20 67 6f 74 6f 20  .peerVal ) goto 
da50: 6c 62 6c 3b 0a 2a 2a 20 20 20 69 66 28 20 63 73  lbl;.**   if( cs
da60: 72 31 2e 72 6f 77 69 64 20 3e 3d 20 63 73 72 32  r1.rowid >= csr2
da70: 2e 72 6f 77 69 64 20 29 20 67 6f 74 6f 20 6c 62  .rowid ) goto lb
da80: 6c 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l;.*/.static voi
da90: 64 20 77 69 6e 64 6f 77 43 6f 64 65 52 61 6e 67  d windowCodeRang
daa0: 65 54 65 73 74 28 0a 20 20 57 69 6e 64 6f 77 43  eTest(.  WindowC
dab0: 6f 64 65 41 72 67 20 2a 70 2c 20 0a 20 20 69 6e  odeArg *p, .  in
dac0: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
dad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dae0: 2a 20 4f 50 5f 47 65 20 6f 72 20 4f 50 5f 47 74  * OP_Ge or OP_Gt
daf0: 20 2a 2f 0a 20 20 69 6e 74 20 63 73 72 31 2c 20   */.  int csr1, 
db00: 0a 20 20 69 6e 74 20 72 65 67 56 61 6c 2c 20 0a  .  int regVal, .
db10: 20 20 69 6e 74 20 63 73 72 32 2c 0a 20 20 69 6e    int csr2,.  in
db20: 74 20 6c 62 6c 0a 29 7b 0a 20 20 50 61 72 73 65  t lbl.){.  Parse
db30: 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50   *pParse = p->pP
db40: 61 72 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 20  arse;.  Vdbe *v 
db50: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
db60: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
db70: 72 65 67 31 20 3d 20 73 71 6c 69 74 65 33 47 65  reg1 = sqlite3Ge
db80: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
db90: 3b 0a 20 20 69 6e 74 20 72 65 67 32 20 3d 20 73  ;.  int reg2 = s
dba0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
dbb0: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
dbc0: 61 72 69 74 68 20 3d 20 4f 50 5f 41 64 64 3b 0a  arith = OP_Add;.
dbd0: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 4f  .  assert( op==O
dbe0: 50 5f 47 65 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47  P_Ge || op==OP_G
dbf0: 74 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29  t || op==OP_Le )
dc00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
dc10: 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20 26  MWin->pOrderBy &
dc20: 26 20 70 2d 3e 70 4d 57 69 6e 2d 3e 70 4f 72 64  & p->pMWin->pOrd
dc30: 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 31 20 29  erBy->nExpr==1 )
dc40: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4d 57 69 6e  ;.  if( p->pMWin
dc50: 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d  ->pOrderBy->a[0]
dc60: 2e 73 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20 20  .sortOrder ){.  
dc70: 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
dc80: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 47 65        case OP_Ge
dc90: 3a 20 6f 70 20 3d 20 4f 50 5f 4c 65 3b 20 62 72  : op = OP_Le; br
dca0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
dcb0: 4f 50 5f 47 74 3a 20 6f 70 20 3d 20 4f 50 5f 4c  OP_Gt: op = OP_L
dcc0: 74 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  t; break;.      
dcd0: 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28  default: assert(
dce0: 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 20 6f 70   op==OP_Le ); op
dcf0: 20 3d 20 4f 50 5f 47 65 3b 20 62 72 65 61 6b 3b   = OP_Ge; break;
dd00: 0a 20 20 20 20 7d 0a 20 20 20 20 61 72 69 74 68  .    }.    arith
dd10: 20 3d 20 4f 50 5f 53 75 62 74 72 61 63 74 3b 0a   = OP_Subtract;.
dd20: 20 20 7d 0a 0a 20 20 77 69 6e 64 6f 77 52 65 61    }..  windowRea
dd30: 64 50 65 65 72 56 61 6c 75 65 73 28 70 2c 20 63  dPeerValues(p, c
dd40: 73 72 31 2c 20 72 65 67 31 29 3b 0a 20 20 77 69  sr1, reg1);.  wi
dd50: 6e 64 6f 77 52 65 61 64 50 65 65 72 56 61 6c 75  ndowReadPeerValu
dd60: 65 73 28 70 2c 20 63 73 72 32 2c 20 72 65 67 32  es(p, csr2, reg2
dd70: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
dd80: 41 64 64 4f 70 33 28 76 2c 20 61 72 69 74 68 2c  AddOp3(v, arith,
dd90: 20 72 65 67 56 61 6c 2c 20 72 65 67 31 2c 20 72   regVal, reg1, r
dda0: 65 67 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  eg1);.  sqlite3V
ddb0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c  dbeAddOp3(v, op,
ddc0: 20 72 65 67 32 2c 20 6c 62 6c 2c 20 72 65 67 31   reg2, lbl, reg1
ddd0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
dde0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
ddf0: 69 64 2c 20 63 73 72 31 2c 20 72 65 67 31 29 3b  id, csr1, reg1);
de00: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
de10: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64  dOp2(v, OP_Rowid
de20: 2c 20 63 73 72 32 2c 20 72 65 67 32 29 3b 0a 20  , csr2, reg2);. 
de30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
de40: 70 33 28 76 2c 20 4f 50 5f 47 74 2c 20 72 65 67  p3(v, OP_Gt, reg
de50: 32 2c 20 6c 62 6c 2c 20 72 65 67 31 29 3b 0a 20  2, lbl, reg1);. 
de60: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
de70: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
de80: 65 67 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  eg1);.  sqlite3R
de90: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
dea0: 61 72 73 65 2c 20 72 65 67 32 29 3b 0a 7d 0a 0a  arse, reg2);.}..
deb0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 64 6f  static int windo
dec0: 77 43 6f 64 65 4f 70 28 0a 20 57 69 6e 64 6f 77  wCodeOp(. Window
ded0: 43 6f 64 65 41 72 67 20 2a 70 2c 0a 20 69 6e 74  CodeArg *p,. int
dee0: 20 6f 70 2c 0a 20 69 6e 74 20 72 65 67 43 6f 75   op,. int regCou
def0: 6e 74 64 6f 77 6e 2c 0a 20 69 6e 74 20 6a 75 6d  ntdown,. int jum
df00: 70 4f 6e 45 6f 66 0a 29 7b 0a 20 20 69 6e 74 20  pOnEof.){.  int 
df10: 63 73 72 2c 20 72 65 67 3b 0a 20 20 50 61 72 73  csr, reg;.  Pars
df20: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70  e *pParse = p->p
df30: 50 61 72 73 65 3b 0a 20 20 57 69 6e 64 6f 77 20  Parse;.  Window 
df40: 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 4d 57 69  *pMWin = p->pMWi
df50: 6e 3b 0a 20 20 69 6e 74 20 72 65 74 20 3d 20 30  n;.  int ret = 0
df60: 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 2d  ;.  Vdbe *v = p-
df70: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 61 64  >pVdbe;.  int ad
df80: 64 72 49 66 20 3d 20 30 3b 20 0a 20 20 69 6e 74  drIf = 0; .  int
df90: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 20 3d 20   addrContinue = 
dfa0: 30 3b 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 74  0;.  int addrGot
dfb0: 6f 20 3d 20 30 3b 0a 20 20 69 6e 74 20 62 50 65  o = 0;.  int bPe
dfc0: 65 72 20 3d 20 28 70 4d 57 69 6e 2d 3e 65 54 79  er = (pMWin->eTy
dfd0: 70 65 21 3d 54 4b 5f 52 4f 57 53 29 3b 0a 0a 20  pe!=TK_ROWS);.. 
dfe0: 20 69 6e 74 20 6c 62 6c 44 6f 6e 65 20 3d 20 73   int lblDone = s
dff0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
e000: 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 69  bel(pParse);.  i
e010: 6e 74 20 61 64 64 72 4e 65 78 74 52 61 6e 67 65  nt addrNextRange
e020: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 70 65 63   = 0;..  /* Spec
e030: 69 61 6c 20 63 61 73 65 20 2d 20 57 49 4e 44 4f  ial case - WINDO
e040: 57 5f 41 47 47 49 4e 56 45 52 53 45 20 69 73 20  W_AGGINVERSE is 
e050: 61 6c 77 61 79 73 20 61 20 6e 6f 2d 6f 70 20 69  always a no-op i
e060: 66 20 74 68 65 20 66 72 61 6d 65 0a 20 20 2a 2a  f the frame.  **
e070: 20 73 74 61 72 74 73 20 77 69 74 68 20 55 4e 42   starts with UNB
e080: 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47  OUNDED PRECEDING
e090: 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 57  . */.  if( op==W
e0a0: 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45  INDOW_AGGINVERSE
e0b0: 20 26 26 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72   && pMWin->eStar
e0c0: 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20  t==TK_UNBOUNDED 
e0d0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  ){.    assert( r
e0e0: 65 67 43 6f 75 6e 74 64 6f 77 6e 3d 3d 30 20 26  egCountdown==0 &
e0f0: 26 20 6a 75 6d 70 4f 6e 45 6f 66 3d 3d 30 20 29  & jumpOnEof==0 )
e100: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
e110: 20 20 7d 0a 0a 20 20 69 66 28 20 72 65 67 43 6f    }..  if( regCo
e120: 75 6e 74 64 6f 77 6e 3e 30 20 29 7b 0a 20 20 20  untdown>0 ){.   
e130: 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 54 79 70   if( pMWin->eTyp
e140: 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 29 7b 0a 20  e==TK_RANGE ){. 
e150: 20 20 20 20 20 61 64 64 72 4e 65 78 74 52 61 6e       addrNextRan
e160: 67 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ge = sqlite3Vdbe
e170: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
e180: 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20 6f  .      switch( o
e190: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73  p ){.        cas
e1a0: 65 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f  e WINDOW_RETURN_
e1b0: 52 4f 57 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  ROW: {.         
e1c0: 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20   assert( 0 );.  
e1d0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
e1e0: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
e1f0: 20 20 63 61 73 65 20 57 49 4e 44 4f 57 5f 41 47    case WINDOW_AG
e200: 47 49 4e 56 45 52 53 45 3a 20 7b 0a 20 20 20 20  GINVERSE: {.    
e210: 20 20 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d        if( pMWin-
e220: 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c  >eStart==TK_FOLL
e230: 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 20  OWING ){.       
e240: 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 52       windowCodeR
e250: 61 6e 67 65 54 65 73 74 28 0a 20 20 20 20 20 20  angeTest(.      
e260: 20 20 20 20 20 20 20 20 20 20 70 2c 20 4f 50 5f            p, OP_
e270: 4c 65 2c 20 70 2d 3e 63 75 72 72 65 6e 74 2e 63  Le, p->current.c
e280: 73 72 2c 20 72 65 67 43 6f 75 6e 74 64 6f 77 6e  sr, regCountdown
e290: 2c 20 70 2d 3e 73 74 61 72 74 2e 63 73 72 2c 20  , p->start.csr, 
e2a0: 6c 62 6c 44 6f 6e 65 0a 20 20 20 20 20 20 20 20  lblDone.        
e2b0: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20      );.         
e2c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e2d0: 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 52 61      windowCodeRa
e2e0: 6e 67 65 54 65 73 74 28 0a 20 20 20 20 20 20 20  ngeTest(.       
e2f0: 20 20 20 20 20 20 20 20 20 70 2c 20 4f 50 5f 47           p, OP_G
e300: 65 2c 20 70 2d 3e 73 74 61 72 74 2e 63 73 72 2c  e, p->start.csr,
e310: 20 72 65 67 43 6f 75 6e 74 64 6f 77 6e 2c 20 70   regCountdown, p
e320: 2d 3e 63 75 72 72 65 6e 74 2e 63 73 72 2c 20 6c  ->current.csr, l
e330: 62 6c 44 6f 6e 65 0a 20 20 20 20 20 20 20 20 20  blDone.         
e340: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
e350: 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  }.          brea
e360: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  k;.        }..  
e370: 20 20 20 20 20 20 63 61 73 65 20 57 49 4e 44 4f        case WINDO
e380: 57 5f 41 47 47 53 54 45 50 3a 20 7b 0a 20 20 20  W_AGGSTEP: {.   
e390: 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64         windowCod
e3a0: 65 52 61 6e 67 65 54 65 73 74 28 0a 20 20 20 20  eRangeTest(.    
e3b0: 20 20 20 20 20 20 20 20 70 2c 20 4f 50 5f 47 74          p, OP_Gt
e3c0: 2c 20 70 2d 3e 65 6e 64 2e 63 73 72 2c 20 72 65  , p->end.csr, re
e3d0: 67 43 6f 75 6e 74 64 6f 77 6e 2c 20 70 2d 3e 63  gCountdown, p->c
e3e0: 75 72 72 65 6e 74 2e 63 73 72 2c 20 6c 62 6c 44  urrent.csr, lblD
e3f0: 6f 6e 65 0a 20 20 20 20 20 20 20 20 20 20 29 3b  one.          );
e400: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
e410: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e420: 20 20 7d 0a 0a 20 20 20 20 7d 65 6c 73 65 7b 0a    }..    }else{.
e430: 20 20 20 20 20 20 61 64 64 72 49 66 20 3d 20 73        addrIf = s
e440: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
e450: 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 72 65  (v, OP_IfPos, re
e460: 67 43 6f 75 6e 74 64 6f 77 6e 2c 20 30 2c 20 31  gCountdown, 0, 1
e470: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
e480: 69 66 28 20 6f 70 3d 3d 57 49 4e 44 4f 57 5f 52  if( op==WINDOW_R
e490: 45 54 55 52 4e 5f 52 4f 57 20 29 7b 0a 20 20 20  ETURN_ROW ){.   
e4a0: 20 77 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28   windowAggFinal(
e4b0: 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 70  pParse, pMWin, p
e4c0: 2d 3e 72 65 67 41 72 67 2c 20 30 29 3b 0a 20 20  ->regArg, 0);.  
e4d0: 7d 0a 20 20 61 64 64 72 43 6f 6e 74 69 6e 75 65  }.  addrContinue
e4e0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
e4f0: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
e500: 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
e510: 20 20 63 61 73 65 20 57 49 4e 44 4f 57 5f 52 45    case WINDOW_RE
e520: 54 55 52 4e 5f 52 4f 57 3a 0a 20 20 20 20 20 20  TURN_ROW:.      
e530: 63 73 72 20 3d 20 70 2d 3e 63 75 72 72 65 6e 74  csr = p->current
e540: 2e 63 73 72 3b 0a 20 20 20 20 20 20 72 65 67 20  .csr;.      reg 
e550: 3d 20 70 2d 3e 63 75 72 72 65 6e 74 2e 72 65 67  = p->current.reg
e560: 3b 0a 20 20 20 20 20 20 77 69 6e 64 6f 77 52 65  ;.      windowRe
e570: 74 75 72 6e 4f 6e 65 52 6f 77 28 70 50 61 72 73  turnOneRow(pPars
e580: 65 2c 20 70 4d 57 69 6e 2c 20 70 2d 3e 72 65 67  e, pMWin, p->reg
e590: 47 6f 73 75 62 2c 20 70 2d 3e 61 64 64 72 47 6f  Gosub, p->addrGo
e5a0: 73 75 62 29 3b 0a 20 20 20 20 20 20 62 72 65 61  sub);.      brea
e5b0: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 57 49 4e  k;..    case WIN
e5c0: 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 3a 0a  DOW_AGGINVERSE:.
e5d0: 20 20 20 20 20 20 63 73 72 20 3d 20 70 2d 3e 73        csr = p->s
e5e0: 74 61 72 74 2e 63 73 72 3b 0a 20 20 20 20 20 20  tart.csr;.      
e5f0: 72 65 67 20 3d 20 70 2d 3e 73 74 61 72 74 2e 72  reg = p->start.r
e600: 65 67 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d  eg;.      if( pM
e610: 57 69 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f 77  Win->regStartRow
e620: 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  id ){.        as
e630: 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 72 65 67  sert( pMWin->reg
e640: 45 6e 64 52 6f 77 69 64 20 29 3b 0a 20 20 20 20  EndRowid );.    
e650: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e660: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
e670: 6d 6d 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74  mm, pMWin->regSt
e680: 61 72 74 52 6f 77 69 64 2c 20 31 29 3b 0a 20 20  artRowid, 1);.  
e690: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e6a0: 20 20 20 77 69 6e 64 6f 77 41 67 67 53 74 65 70     windowAggStep
e6b0: 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20  (pParse, pMWin, 
e6c0: 63 73 72 2c 20 31 2c 20 70 2d 3e 72 65 67 41 72  csr, 1, p->regAr
e6d0: 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
e6e0: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
e6f0: 73 65 20 57 49 4e 44 4f 57 5f 41 47 47 53 54 45  se WINDOW_AGGSTE
e700: 50 3a 0a 20 20 20 20 20 20 63 73 72 20 3d 20 70  P:.      csr = p
e710: 2d 3e 65 6e 64 2e 63 73 72 3b 0a 20 20 20 20 20  ->end.csr;.     
e720: 20 72 65 67 20 3d 20 70 2d 3e 65 6e 64 2e 72 65   reg = p->end.re
e730: 67 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 57  g;.      if( pMW
e740: 69 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f 77 69  in->regStartRowi
e750: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  d ){.        ass
e760: 65 72 74 28 20 70 4d 57 69 6e 2d 3e 72 65 67 45  ert( pMWin->regE
e770: 6e 64 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20  ndRowid );.     
e780: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e790: 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
e7a0: 6d 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 45 6e 64  m, pMWin->regEnd
e7b0: 52 6f 77 69 64 2c 20 31 29 3b 0a 20 20 20 20 20  Rowid, 1);.     
e7c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e7d0: 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28 70 50  windowAggStep(pP
e7e0: 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 63 73 72  arse, pMWin, csr
e7f0: 2c 20 30 2c 20 70 2d 3e 72 65 67 41 72 67 29 3b  , 0, p->regArg);
e800: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
e810: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  reak;.  }..  if(
e820: 20 6f 70 3d 3d 70 2d 3e 65 44 65 6c 65 74 65 20   op==p->eDelete 
e830: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
e840: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44  beAddOp1(v, OP_D
e850: 65 6c 65 74 65 2c 20 63 73 72 29 3b 0a 20 20 20  elete, csr);.   
e860: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
e870: 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 53  geP5(v, OPFLAG_S
e880: 41 56 45 50 4f 53 49 54 49 4f 4e 29 3b 0a 20 20  AVEPOSITION);.  
e890: 7d 0a 0a 20 20 69 66 28 20 6a 75 6d 70 4f 6e 45  }..  if( jumpOnE
e8a0: 6f 66 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  of ){.    sqlite
e8b0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
e8c0: 50 5f 4e 65 78 74 2c 20 63 73 72 2c 20 73 71 6c  P_Next, csr, sql
e8d0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
e8e0: 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 72  ddr(v)+2);.    r
e8f0: 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  et = sqlite3Vdbe
e900: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74  AddOp0(v, OP_Got
e910: 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
e920: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e930: 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 63  p2(v, OP_Next, c
e940: 73 72 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  sr, sqlite3VdbeC
e950: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31 2b  urrentAddr(v)+1+
e960: 62 50 65 65 72 29 3b 0a 20 20 20 20 69 66 28 20  bPeer);.    if( 
e970: 62 50 65 65 72 20 29 7b 0a 20 20 20 20 20 20 61  bPeer ){.      a
e980: 64 64 72 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65  ddrGoto = sqlite
e990: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
e9a0: 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a 20  P_Goto);.    }. 
e9b0: 20 7d 0a 0a 20 20 69 66 28 20 62 50 65 65 72 20   }..  if( bPeer 
e9c0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 52 65 67 20  ){.    int nReg 
e9d0: 3d 20 28 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72  = (pMWin->pOrder
e9e0: 42 79 20 3f 20 70 4d 57 69 6e 2d 3e 70 4f 72 64  By ? pMWin->pOrd
e9f0: 65 72 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30 29  erBy->nExpr : 0)
ea00: 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 54 6d 70  ;.    int regTmp
ea10: 20 3d 20 28 6e 52 65 67 20 3f 20 73 71 6c 69 74   = (nReg ? sqlit
ea20: 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
ea30: 50 61 72 73 65 2c 20 6e 52 65 67 29 20 3a 20 30  Parse, nReg) : 0
ea40: 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 52 65 61  );.    windowRea
ea50: 64 50 65 65 72 56 61 6c 75 65 73 28 70 2c 20 63  dPeerValues(p, c
ea60: 73 72 2c 20 72 65 67 54 6d 70 29 3b 0a 20 20 20  sr, regTmp);.   
ea70: 20 77 69 6e 64 6f 77 49 66 4e 65 77 50 65 65 72   windowIfNewPeer
ea80: 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2d 3e  (pParse, pMWin->
ea90: 70 4f 72 64 65 72 42 79 2c 20 72 65 67 54 6d 70  pOrderBy, regTmp
eaa0: 2c 20 72 65 67 2c 20 61 64 64 72 43 6f 6e 74 69  , reg, addrConti
eab0: 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nue);.    sqlite
eac0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
ead0: 65 28 70 50 61 72 73 65 2c 20 72 65 67 54 6d 70  e(pParse, regTmp
eae0: 2c 20 6e 52 65 67 29 3b 0a 20 20 7d 0a 0a 20 20  , nReg);.  }..  
eaf0: 69 66 28 20 61 64 64 72 4e 65 78 74 52 61 6e 67  if( addrNextRang
eb00: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
eb10: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
eb20: 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 4e 65  _Goto, 0, addrNe
eb30: 78 74 52 61 6e 67 65 29 3b 0a 20 20 7d 0a 20 20  xtRange);.  }.  
eb40: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
eb50: 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 44 6f  veLabel(v, lblDo
eb60: 6e 65 29 3b 0a 20 20 69 66 28 20 61 64 64 72 47  ne);.  if( addrG
eb70: 6f 74 6f 20 29 20 73 71 6c 69 74 65 33 56 64 62  oto ) sqlite3Vdb
eb80: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
eb90: 72 47 6f 74 6f 29 3b 0a 20 20 69 66 28 20 61 64  rGoto);.  if( ad
eba0: 64 72 49 66 20 29 20 73 71 6c 69 74 65 33 56 64  drIf ) sqlite3Vd
ebb0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
ebc0: 64 72 49 66 29 3b 0a 20 20 72 65 74 75 72 6e 20  drIf);.  return 
ebd0: 72 65 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  ret;.}.../*.** A
ebe0: 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75  llocate and retu
ebf0: 72 6e 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f  rn a duplicate o
ec00: 66 20 74 68 65 20 57 69 6e 64 6f 77 20 6f 62 6a  f the Window obj
ec10: 65 63 74 20 69 6e 64 69 63 61 74 65 64 20 62 79  ect indicated by
ec20: 20 74 68 65 0a 2a 2a 20 74 68 69 72 64 20 61 72   the.** third ar
ec30: 67 75 6d 65 6e 74 2e 20 53 65 74 20 74 68 65 20  gument. Set the 
ec40: 57 69 6e 64 6f 77 2e 70 4f 77 6e 65 72 20 66 69  Window.pOwner fi
ec50: 65 6c 64 20 6f 66 20 74 68 65 20 6e 65 77 20 6f  eld of the new o
ec60: 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 70 4f 77 6e  bject to.** pOwn
ec70: 65 72 2e 0a 2a 2f 0a 57 69 6e 64 6f 77 20 2a 73  er..*/.Window *s
ec80: 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 75 70 28  qlite3WindowDup(
ec90: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
eca0: 72 20 2a 70 4f 77 6e 65 72 2c 20 57 69 6e 64 6f  r *pOwner, Windo
ecb0: 77 20 2a 70 29 7b 0a 20 20 57 69 6e 64 6f 77 20  w *p){.  Window 
ecc0: 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 69 66 28  *pNew = 0;.  if(
ecd0: 20 41 4c 57 41 59 53 28 70 29 20 29 7b 0a 20 20   ALWAYS(p) ){.  
ece0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
ecf0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
ed00: 20 73 69 7a 65 6f 66 28 57 69 6e 64 6f 77 29 29   sizeof(Window))
ed10: 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20 29  ;.    if( pNew )
ed20: 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a 4e  {.      pNew->zN
ed30: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
ed40: 74 72 44 75 70 28 64 62 2c 20 70 2d 3e 7a 4e 61  trDup(db, p->zNa
ed50: 6d 65 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  me);.      pNew-
ed60: 3e 70 46 69 6c 74 65 72 20 3d 20 73 71 6c 69 74  >pFilter = sqlit
ed70: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
ed80: 3e 70 46 69 6c 74 65 72 2c 20 30 29 3b 0a 20 20  >pFilter, 0);.  
ed90: 20 20 20 20 70 4e 65 77 2d 3e 70 46 75 6e 63 20      pNew->pFunc 
eda0: 3d 20 70 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20  = p->pFunc;.    
edb0: 20 20 70 4e 65 77 2d 3e 70 50 61 72 74 69 74 69    pNew->pPartiti
edc0: 6f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  on = sqlite3Expr
edd0: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
ede0: 50 61 72 74 69 74 69 6f 6e 2c 20 30 29 3b 0a 20  Partition, 0);. 
edf0: 20 20 20 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65       pNew->pOrde
ee00: 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
ee10: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
ee20: 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 20 20  pOrderBy, 0);.  
ee30: 20 20 20 20 70 4e 65 77 2d 3e 65 54 79 70 65 20      pNew->eType 
ee40: 3d 20 70 2d 3e 65 54 79 70 65 3b 0a 20 20 20 20  = p->eType;.    
ee50: 20 20 70 4e 65 77 2d 3e 65 45 6e 64 20 3d 20 70    pNew->eEnd = p
ee60: 2d 3e 65 45 6e 64 3b 0a 20 20 20 20 20 20 70 4e  ->eEnd;.      pN
ee70: 65 77 2d 3e 65 53 74 61 72 74 20 3d 20 70 2d 3e  ew->eStart = p->
ee80: 65 53 74 61 72 74 3b 0a 20 20 20 20 20 20 70 4e  eStart;.      pN
ee90: 65 77 2d 3e 70 53 74 61 72 74 20 3d 20 73 71 6c  ew->pStart = sql
eea0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
eeb0: 70 2d 3e 70 53 74 61 72 74 2c 20 30 29 3b 0a 20  p->pStart, 0);. 
eec0: 20 20 20 20 20 70 4e 65 77 2d 3e 70 45 6e 64 20       pNew->pEnd 
eed0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
eee0: 28 64 62 2c 20 70 2d 3e 70 45 6e 64 2c 20 30 29  (db, p->pEnd, 0)
eef0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4f  ;.      pNew->pO
ef00: 77 6e 65 72 20 3d 20 70 4f 77 6e 65 72 3b 0a 20  wner = pOwner;. 
ef10: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
ef20: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
ef30: 20 52 65 74 75 72 6e 20 61 20 63 6f 70 79 20 6f   Return a copy o
ef40: 66 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  f the linked lis
ef50: 74 20 6f 66 20 57 69 6e 64 6f 77 20 6f 62 6a 65  t of Window obje
ef60: 63 74 73 20 70 61 73 73 65 64 20 61 73 20 74 68  cts passed as th
ef70: 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75  e.** second argu
ef80: 6d 65 6e 74 2e 0a 2a 2f 0a 57 69 6e 64 6f 77 20  ment..*/.Window 
ef90: 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4c 69  *sqlite3WindowLi
efa0: 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  stDup(sqlite3 *d
efb0: 62 2c 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20  b, Window *p){. 
efc0: 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20   Window *pWin;. 
efd0: 20 57 69 6e 64 6f 77 20 2a 70 52 65 74 20 3d 20   Window *pRet = 
efe0: 30 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 2a 70 70  0;.  Window **pp
eff0: 20 3d 20 26 70 52 65 74 3b 0a 0a 20 20 66 6f 72   = &pRet;..  for
f000: 28 70 57 69 6e 3d 70 3b 20 70 57 69 6e 3b 20 70  (pWin=p; pWin; p
f010: 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57  Win=pWin->pNextW
f020: 69 6e 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20 73  in){.    *pp = s
f030: 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 75 70 28  qlite3WindowDup(
f040: 64 62 2c 20 30 2c 20 70 57 69 6e 29 3b 0a 20 20  db, 0, pWin);.  
f050: 20 20 69 66 28 20 2a 70 70 3d 3d 30 20 29 20 62    if( *pp==0 ) b
f060: 72 65 61 6b 3b 0a 20 20 20 20 70 70 20 3d 20 26  reak;.    pp = &
f070: 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 57 69 6e  ((*pp)->pNextWin
f080: 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
f090: 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pRet;.}../*.** 
f0a0: 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
f0b0: 6e 28 29 20 68 61 73 20 61 6c 72 65 61 64 79 20  n() has already 
f0c0: 62 65 65 6e 20 63 61 6c 6c 65 64 20 66 6f 72 20  been called for 
f0d0: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
f0e0: 6d 65 6e 74 20 0a 2a 2a 20 70 61 73 73 65 64 20  ment .** passed 
f0f0: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
f100: 67 75 6d 65 6e 74 20 77 68 65 6e 20 74 68 69 73  gument when this
f110: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76   function is inv
f120: 6f 6b 65 64 2e 20 49 74 20 67 65 6e 65 72 61 74  oked. It generat
f130: 65 73 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 70 6f  es.** code to po
f140: 70 75 6c 61 74 65 20 74 68 65 20 57 69 6e 64 6f  pulate the Windo
f150: 77 2e 72 65 67 52 65 73 75 6c 74 20 72 65 67 69  w.regResult regi
f160: 73 74 65 72 20 66 6f 72 20 65 61 63 68 20 77 69  ster for each wi
f170: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 0a 2a  ndow function .*
f180: 2a 20 61 6e 64 20 69 6e 76 6f 6b 65 20 74 68 65  * and invoke the
f190: 20 73 75 62 2d 72 6f 75 74 69 6e 65 20 61 74 20   sub-routine at 
f1a0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72  instruction addr
f1b0: 47 6f 73 75 62 20 6f 6e 63 65 20 66 6f 72 20 65  Gosub once for e
f1c0: 61 63 68 20 72 6f 77 2e 0a 2a 2a 20 73 71 6c 69  ach row..** sqli
f1d0: 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 69 73  te3WhereEnd() is
f1e0: 20 61 6c 77 61 79 73 20 63 61 6c 6c 65 64 20 62   always called b
f1f0: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
f200: 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e   .**.** This fun
f210: 63 74 69 6f 6e 20 68 61 6e 64 6c 65 73 20 73 65  ction handles se
f220: 76 65 72 61 6c 20 64 69 66 66 65 72 65 6e 74 20  veral different 
f230: 74 79 70 65 73 20 6f 66 20 77 69 6e 64 6f 77 20  types of window 
f240: 66 72 61 6d 65 73 2c 20 77 68 69 63 68 0a 2a 2a  frames, which.**
f250: 20 72 65 71 75 69 72 65 20 73 6c 69 67 68 74 6c   require slightl
f260: 79 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f 63  y different proc
f270: 65 73 73 69 6e 67 2e 20 54 68 65 20 66 6f 6c 6c  essing. The foll
f280: 6f 77 69 6e 67 20 70 73 65 75 64 6f 20 63 6f 64  owing pseudo cod
f290: 65 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20  e is.** used to 
f2a0: 69 6d 70 6c 65 6d 65 6e 74 20 77 69 6e 64 6f 77  implement window
f2b0: 20 66 72 61 6d 65 73 20 6f 66 20 74 68 65 20 66   frames of the f
f2c0: 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57  orm:.**.**   ROW
f2d0: 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31  S BETWEEN <expr1
f2e0: 3e 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20  > PRECEDING AND 
f2f0: 3c 65 78 70 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e  <expr2> FOLLOWIN
f300: 47 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 20 77 69  G.**.** Other wi
f310: 6e 64 6f 77 20 66 72 61 6d 65 20 74 79 70 65 73  ndow frame types
f320: 20 75 73 65 20 76 61 72 69 61 6e 74 73 20 6f 66   use variants of
f330: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
f340: 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 6c 6f  **.**     ... lo
f350: 6f 70 20 73 74 61 72 74 65 64 20 62 79 20 73 71  op started by sq
f360: 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
f370: 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 69  ) ....**       i
f380: 66 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e  f( new partition
f390: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 47   ){.**         G
f3a0: 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20 20  osub flush.**   
f3b0: 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 49      }.**       I
f3c0: 6e 73 65 72 74 20 6e 65 77 20 72 6f 77 20 69 6e  nsert new row in
f3d0: 74 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a 2a 2a  to eph table..**
f3e0: 20 20 20 20 20 20 20 0a 2a 2a 20 20 20 20 20 20         .**      
f3f0: 20 69 66 28 20 66 69 72 73 74 20 72 6f 77 20 6f   if( first row o
f400: 66 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a  f partition ){.*
f410: 2a 20 20 20 20 20 20 20 20 20 2f 2f 20 52 65 77  *         // Rew
f420: 69 6e 64 20 74 68 72 65 65 20 63 75 72 73 6f 72  ind three cursor
f430: 73 2c 20 61 6c 6c 20 6f 70 65 6e 20 6f 6e 20 74  s, all open on t
f440: 68 65 20 65 70 68 20 74 61 62 6c 65 2e 0a 2a 2a  he eph table..**
f450: 20 20 20 20 20 20 20 20 20 52 65 77 69 6e 64 28           Rewind(
f460: 63 73 72 45 6e 64 29 3b 0a 2a 2a 20 20 20 20 20  csrEnd);.**     
f470: 20 20 20 20 52 65 77 69 6e 64 28 63 73 72 53 74      Rewind(csrSt
f480: 61 72 74 29 3b 0a 2a 2a 20 20 20 20 20 20 20 20  art);.**        
f490: 20 52 65 77 69 6e 64 28 63 73 72 43 75 72 72 65   Rewind(csrCurre
f4a0: 6e 74 29 3b 0a 2a 2a 20 20 20 20 20 20 20 0a 2a  nt);.**       .*
f4b0: 2a 20 20 20 20 20 20 20 20 20 72 65 67 45 6e 64  *         regEnd
f4c0: 20 3d 20 3c 65 78 70 72 32 3e 20 20 20 20 20 20   = <expr2>      
f4d0: 20 20 20 20 2f 2f 20 46 4f 4c 4c 4f 57 49 4e 47      // FOLLOWING
f4e0: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 20   expression.**  
f4f0: 20 20 20 20 20 20 20 72 65 67 53 74 61 72 74 20         regStart 
f500: 3d 20 3c 65 78 70 72 31 3e 20 20 20 20 20 20 20  = <expr1>       
f510: 20 2f 2f 20 50 52 45 43 45 44 49 4e 47 20 65 78   // PRECEDING ex
f520: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 20 20 20 20  pression.**     
f530: 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20 20 20    }else{.**     
f540: 20 20 20 20 2f 2f 20 46 69 72 73 74 20 74 69 6d      // First tim
f550: 65 20 74 68 69 73 20 62 72 61 6e 63 68 20 69 73  e this branch is
f560: 20 74 61 6b 65 6e 2c 20 74 68 65 20 65 70 68 20   taken, the eph 
f570: 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74  table contains t
f580: 77 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 2f  wo .**         /
f590: 2f 20 72 6f 77 73 2e 20 54 68 65 20 66 69 72 73  / rows. The firs
f5a0: 74 20 72 6f 77 20 69 6e 20 74 68 65 20 70 61 72  t row in the par
f5b0: 74 69 74 69 6f 6e 2c 20 77 68 69 63 68 20 61 6c  tition, which al
f5c0: 6c 20 74 68 72 65 65 20 63 75 72 73 6f 72 73 0a  l three cursors.
f5d0: 2a 2a 20 20 20 20 20 20 20 20 20 2f 2f 20 63 75  **         // cu
f5e0: 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 20 74 6f  rrently point to
f5f0: 2c 20 61 6e 64 20 74 68 65 20 66 6f 6c 6c 6f 77  , and the follow
f600: 69 6e 67 20 72 6f 77 2e 0a 2a 2a 20 20 20 20 20  ing row..**     
f610: 20 20 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20      AGGSTEP.**  
f620: 20 20 20 20 20 20 20 69 66 28 20 28 72 65 67 45         if( (regE
f630: 6e 64 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20  nd--)<=0 ){.**  
f640: 20 20 20 20 20 20 20 20 20 52 45 54 55 52 4e 5f           RETURN_
f650: 52 4f 57 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ROW.**          
f660: 20 69 66 28 20 28 72 65 67 53 74 61 72 74 2d 2d   if( (regStart--
f670: 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20  )<=0 ){.**      
f680: 20 20 20 20 20 20 20 41 47 47 49 4e 56 45 52 53         AGGINVERS
f690: 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 7d  E.**           }
f6a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a  .**         }.**
f6b0: 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
f6c0: 7d 0a 2a 2a 20 20 20 20 20 66 6c 75 73 68 3a 0a  }.**     flush:.
f6d0: 2a 2a 20 20 20 20 20 20 20 41 47 47 53 54 45 50  **       AGGSTEP
f6e0: 0a 2a 2a 20 20 20 20 20 20 20 77 68 69 6c 65 28  .**       while(
f6f0: 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20   1 ){.**        
f700: 20 52 45 54 55 52 4e 20 52 4f 57 0a 2a 2a 20 20   RETURN ROW.**  
f710: 20 20 20 20 20 20 20 69 66 28 20 63 73 72 43 75         if( csrCu
f720: 72 72 65 6e 74 20 69 73 20 45 4f 46 20 29 20 62  rrent is EOF ) b
f730: 72 65 61 6b 3b 0a 2a 2a 20 20 20 20 20 20 20 20  reak;.**        
f740: 20 69 66 28 20 28 72 65 67 53 74 61 72 74 2d 2d   if( (regStart--
f750: 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20  )<=0 ){.**      
f760: 20 20 20 20 20 41 67 67 49 6e 76 65 72 73 65 28       AggInverse(
f770: 63 73 72 53 74 61 72 74 29 0a 2a 2a 20 20 20 20  csrStart).**    
f780: 20 20 20 20 20 20 20 4e 65 78 74 28 63 73 72 53         Next(csrS
f790: 74 61 72 74 29 0a 2a 2a 20 20 20 20 20 20 20 20  tart).**        
f7a0: 20 7d 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a   }.**       }.**
f7b0: 0a 2a 2a 20 54 68 65 20 70 73 65 75 64 6f 2d 63  .** The pseudo-c
f7c0: 6f 64 65 20 61 62 6f 76 65 20 75 73 65 73 20 74  ode above uses t
f7d0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 68 6f  he following sho
f7e0: 72 74 68 61 6e 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  rthand:.**.**   
f7f0: 41 47 47 53 54 45 50 3a 20 20 20 20 69 6e 76 6f  AGGSTEP:    invo
f800: 6b 65 20 74 68 65 20 61 67 67 72 65 67 61 74 65  ke the aggregate
f810: 20 78 53 74 65 70 28 29 20 66 75 6e 63 74 69 6f   xStep() functio
f820: 6e 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f  n for each windo
f830: 77 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 20 20  w function.**   
f840: 20 20 20 20 20 20 20 20 20 20 20 20 77 69 74 68              with
f850: 20 61 72 67 75 6d 65 6e 74 73 20 72 65 61 64 20   arguments read 
f860: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
f870: 20 72 6f 77 20 6f 66 20 63 75 72 73 6f 72 20 63   row of cursor c
f880: 73 72 45 6e 64 2c 20 74 68 65 6e 0a 2a 2a 20 20  srEnd, then.**  
f890: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 65               ste
f8a0: 70 20 63 75 72 73 6f 72 20 63 73 72 45 6e 64 20  p cursor csrEnd 
f8b0: 66 6f 72 77 61 72 64 20 6f 6e 65 20 72 6f 77 20  forward one row 
f8c0: 28 69 2e 65 2e 20 73 71 6c 69 74 65 33 42 74 72  (i.e. sqlite3Btr
f8d0: 65 65 4e 65 78 74 28 29 29 2e 0a 2a 2a 0a 2a 2a  eeNext())..**.**
f8e0: 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 3a 20 72     RETURN_ROW: r
f8f0: 65 74 75 72 6e 20 61 20 72 6f 77 20 74 6f 20 74  eturn a row to t
f900: 68 65 20 63 61 6c 6c 65 72 20 62 61 73 65 64 20  he caller based 
f910: 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  on the contents 
f920: 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20  of the .**      
f930: 20 20 20 20 20 20 20 20 20 63 75 72 72 65 6e 74           current
f940: 20 72 6f 77 20 6f 66 20 63 73 72 43 75 72 72 65   row of csrCurre
f950: 6e 74 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  nt and the curre
f960: 6e 74 20 73 74 61 74 65 20 6f 66 20 61 6c 6c 20  nt state of all 
f970: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
f980: 20 20 61 67 67 72 65 67 61 74 65 73 2e 20 54 68    aggregates. Th
f990: 65 6e 20 73 74 65 70 20 63 75 72 73 6f 72 20 63  en step cursor c
f9a0: 73 72 43 75 72 72 65 6e 74 20 66 6f 72 77 61 72  srCurrent forwar
f9b0: 64 20 6f 6e 65 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a  d one row..**.**
f9c0: 20 20 20 41 47 47 49 4e 56 45 52 53 45 3a 20 69     AGGINVERSE: i
f9d0: 6e 76 6f 6b 65 20 74 68 65 20 61 67 67 72 65 67  nvoke the aggreg
f9e0: 61 74 65 20 78 49 6e 76 65 72 73 65 28 29 20 66  ate xInverse() f
f9f0: 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68  unction for each
fa00: 20 77 69 6e 64 6f 77 20 0a 2a 2a 20 20 20 20 20   window .**     
fa10: 20 20 20 20 20 20 20 20 20 20 66 75 6e 63 74 69            functi
fa20: 6f 6e 73 20 77 69 74 68 20 61 72 67 75 6d 65 6e  ons with argumen
fa30: 74 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ts read from the
fa40: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
fa50: 63 75 72 73 6f 72 0a 2a 2a 20 20 20 20 20 20 20  cursor.**       
fa60: 20 20 20 20 20 20 20 20 63 73 72 53 74 61 72 74          csrStart
fa70: 2e 20 54 68 65 6e 20 73 74 65 70 20 63 73 72 53  . Then step csrS
fa80: 74 61 72 74 20 66 6f 72 77 61 72 64 20 6f 6e 65  tart forward one
fa90: 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72   row..**.** Ther
faa0: 65 20 61 72 65 20 74 77 6f 20 6f 74 68 65 72 20  e are two other 
fab0: 52 4f 57 53 20 77 69 6e 64 6f 77 20 66 72 61 6d  ROWS window fram
fac0: 65 73 20 74 68 61 74 20 61 72 65 20 68 61 6e 64  es that are hand
fad0: 6c 65 64 20 73 69 67 6e 69 66 69 63 61 6e 74 6c  led significantl
fae0: 79 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74 6c 79  y.** differently
faf0: 20 66 72 6f 6d 20 74 68 65 20 61 62 6f 76 65 20   from the above 
fb00: 2d 20 22 42 45 54 57 45 45 4e 20 3c 65 78 70 72  - "BETWEEN <expr
fb10: 3e 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20  > PRECEDING AND 
fb20: 3c 65 78 70 72 3e 20 50 52 45 43 45 44 49 4e 47  <expr> PRECEDING
fb30: 22 0a 2a 2a 20 61 6e 64 20 22 42 45 54 57 45 45  ".** and "BETWEE
fb40: 4e 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49  N <expr> FOLLOWI
fb50: 4e 47 20 41 4e 44 20 3c 65 78 70 72 3e 20 46 4f  NG AND <expr> FO
fb60: 4c 4c 4f 57 49 4e 47 22 2e 20 54 68 65 73 65 20  LLOWING". These 
fb70: 61 72 65 20 73 70 65 63 69 61 6c 20 0a 2a 2a 20  are special .** 
fb80: 63 61 73 65 73 20 62 65 63 61 75 73 65 20 74 68  cases because th
fb90: 65 79 20 63 68 61 6e 67 65 20 74 68 65 20 6f 72  ey change the or
fba0: 64 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 65  der in which the
fbb0: 20 74 68 72 65 65 20 63 75 72 73 6f 72 73 20 28   three cursors (
fbc0: 63 73 72 53 74 61 72 74 2c 0a 2a 2a 20 63 73 72  csrStart,.** csr
fbd0: 43 75 72 72 65 6e 74 20 61 6e 64 20 63 73 72 45  Current and csrE
fbe0: 6e 64 29 20 69 74 65 72 61 74 65 20 74 68 72 6f  nd) iterate thro
fbf0: 75 67 68 20 74 68 65 20 65 70 68 65 6d 65 72 61  ugh the ephemera
fc00: 6c 20 74 61 62 6c 65 2e 20 43 61 73 65 73 20 74  l table. Cases t
fc10: 68 61 74 0a 2a 2a 20 75 73 65 20 55 4e 42 4f 55  hat.** use UNBOU
fc20: 4e 44 45 44 20 6f 72 20 43 55 52 52 45 4e 54 20  NDED or CURRENT 
fc30: 52 4f 57 20 61 72 65 20 6d 75 63 68 20 73 69 6d  ROW are much sim
fc40: 70 6c 65 72 20 76 61 72 69 61 74 69 6f 6e 73 20  pler variations 
fc50: 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 73 65 0a  on one of these.
fc60: 2a 2a 20 74 68 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  ** three..**.** 
fc70: 20 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20 3c    ROWS BETWEEN <
fc80: 65 78 70 72 31 3e 20 50 52 45 43 45 44 49 4e 47  expr1> PRECEDING
fc90: 20 41 4e 44 20 3c 65 78 70 72 32 3e 20 50 52 45   AND <expr2> PRE
fca0: 43 45 44 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20  CEDING.**.**    
fcb0: 20 2e 2e 2e 20 6c 6f 6f 70 20 73 74 61 72 74 65   ... loop starte
fcc0: 64 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72  d by sqlite3Wher
fcd0: 65 42 65 67 69 6e 28 29 20 2e 2e 2e 0a 2a 2a 20  eBegin() ....** 
fce0: 20 20 20 20 20 20 69 66 28 20 6e 65 77 20 70 61        if( new pa
fcf0: 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20  rtition ){.**   
fd00: 20 20 20 20 20 20 47 6f 73 75 62 20 66 6c 75 73        Gosub flus
fd10: 68 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20  h.**       }.** 
fd20: 20 20 20 20 20 20 49 6e 73 65 72 74 20 6e 65 77        Insert new
fd30: 20 72 6f 77 20 69 6e 74 6f 20 65 70 68 20 74 61   row into eph ta
fd40: 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 20 20 69 66  ble..**       if
fd50: 28 20 66 69 72 73 74 20 72 6f 77 20 6f 66 20 70  ( first row of p
fd60: 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20  artition ){.**  
fd70: 20 20 20 20 20 20 20 52 65 77 69 6e 64 28 63 73         Rewind(cs
fd80: 72 45 6e 64 29 20 3b 20 52 65 77 69 6e 64 28 63  rEnd) ; Rewind(c
fd90: 73 72 53 74 61 72 74 29 20 3b 20 52 65 77 69 6e  srStart) ; Rewin
fda0: 64 28 63 73 72 43 75 72 72 65 6e 74 29 0a 2a 2a  d(csrCurrent).**
fdb0: 20 20 20 20 20 20 20 20 20 72 65 67 45 6e 64 20           regEnd 
fdc0: 3d 20 3c 65 78 70 72 32 3e 0a 2a 2a 20 20 20 20  = <expr2>.**    
fdd0: 20 20 20 20 20 72 65 67 53 74 61 72 74 20 3d 20       regStart = 
fde0: 3c 65 78 70 72 31 3e 0a 2a 2a 20 20 20 20 20 20  <expr1>.**      
fdf0: 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20 20 20 20   }else{.**      
fe00: 20 20 20 69 66 28 20 28 72 65 67 45 6e 64 2d 2d     if( (regEnd--
fe10: 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20  )<=0 ){.**      
fe20: 20 20 20 20 20 41 47 47 53 54 45 50 0a 2a 2a 20       AGGSTEP.** 
fe30: 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20          }.**    
fe40: 20 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a       RETURN_ROW.
fe50: 2a 2a 20 20 20 20 20 20 20 20 20 69 66 28 20 28  **         if( (
fe60: 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20 29  regStart--)<=0 )
fe70: 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41  {.**           A
fe80: 47 47 49 4e 56 45 52 53 45 0a 2a 2a 20 20 20 20  GGINVERSE.**    
fe90: 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20       }.**       
fea0: 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20  }.**     }.**   
feb0: 20 20 66 6c 75 73 68 3a 0a 2a 2a 20 20 20 20 20    flush:.**     
fec0: 20 20 69 66 28 20 28 72 65 67 45 6e 64 2d 2d 29    if( (regEnd--)
fed0: 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  <=0 ){.**       
fee0: 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20    AGGSTEP.**    
fef0: 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 52 45     }.**       RE
ff00: 54 55 52 4e 5f 52 4f 57 0a 2a 2a 0a 2a 2a 0a 2a  TURN_ROW.**.**.*
ff10: 2a 20 20 20 52 4f 57 53 20 42 45 54 57 45 45 4e  *   ROWS BETWEEN
ff20: 20 3c 65 78 70 72 31 3e 20 46 4f 4c 4c 4f 57 49   <expr1> FOLLOWI
ff30: 4e 47 20 41 4e 44 20 3c 65 78 70 72 32 3e 20 46  NG AND <expr2> F
ff40: 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20  OLLOWING.**.**  
ff50: 20 20 20 2e 2e 2e 20 6c 6f 6f 70 20 73 74 61 72     ... loop star
ff60: 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 68  ted by sqlite3Wh
ff70: 65 72 65 42 65 67 69 6e 28 29 20 2e 2e 2e 0a 2a  ereBegin() ....*
ff80: 2a 20 20 20 20 20 69 66 28 20 6e 65 77 20 70 61  *     if( new pa
ff90: 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20  rtition ){.**   
ffa0: 20 20 20 20 47 6f 73 75 62 20 66 6c 75 73 68 0a      Gosub flush.
ffb0: 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20  **     }.**     
ffc0: 49 6e 73 65 72 74 20 6e 65 77 20 72 6f 77 20 69  Insert new row i
ffd0: 6e 74 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a 2a  nto eph table..*
ffe0: 2a 20 20 20 20 20 69 66 28 20 66 69 72 73 74 20  *     if( first 
fff0: 72 6f 77 20 6f 66 20 70 61 72 74 69 74 69 6f 6e  row of partition
10000 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 52 65 77   ){.**       Rew
10010 69 6e 64 28 63 73 72 45 6e 64 29 20 3b 20 52 65  ind(csrEnd) ; Re
10020 77 69 6e 64 28 63 73 72 53 74 61 72 74 29 20 3b  wind(csrStart) ;
10030 20 52 65 77 69 6e 64 28 63 73 72 43 75 72 72 65   Rewind(csrCurre
10040 6e 74 29 0a 2a 2a 20 20 20 20 20 20 20 72 65 67  nt).**       reg
10050 45 6e 64 20 3d 20 3c 65 78 70 72 32 3e 0a 2a 2a  End = <expr2>.**
10060 20 20 20 20 20 20 20 72 65 67 53 74 61 72 74 20         regStart 
10070 3d 20 72 65 67 45 6e 64 20 2d 20 3c 65 78 70 72  = regEnd - <expr
10080 31 3e 0a 2a 2a 20 20 20 20 20 7d 65 6c 73 65 7b  1>.**     }else{
10090 0a 2a 2a 20 20 20 20 20 20 20 41 47 47 53 54 45  .**       AGGSTE
100a0 50 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 28  P.**       if( (
100b0 72 65 67 45 6e 64 2d 2d 29 3c 3d 30 20 29 7b 0a  regEnd--)<=0 ){.
100c0 2a 2a 20 20 20 20 20 20 20 20 20 52 45 54 55 52  **         RETUR
100d0 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 20 20 7d  N_ROW.**       }
100e0 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 28 72  .**       if( (r
100f0 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20 29 7b  egStart--)<=0 ){
10100 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 47 47 49  .**         AGGI
10110 4e 56 45 52 53 45 0a 2a 2a 20 20 20 20 20 20 20  NVERSE.**       
10120 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20  }.**     }.**   
10130 7d 0a 2a 2a 20 20 20 66 6c 75 73 68 3a 0a 2a 2a  }.**   flush:.**
10140 20 20 20 20 20 41 47 47 53 54 45 50 0a 2a 2a 20       AGGSTEP.** 
10150 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a      while( 1 ){.
10160 2a 2a 20 20 20 20 20 20 20 69 66 28 20 28 72 65  **       if( (re
10170 67 45 6e 64 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a  gEnd--)<=0 ){.**
10180 20 20 20 20 20 20 20 20 20 52 45 54 55 52 4e 5f           RETURN_
10190 52 4f 57 0a 2a 2a 20 20 20 20 20 20 20 20 20 69  ROW.**         i
101a0 66 28 20 65 6f 66 20 29 20 62 72 65 61 6b 3b 0a  f( eof ) break;.
101b0 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20  **       }.**   
101c0 20 20 20 20 69 66 28 20 28 72 65 67 53 74 61 72      if( (regStar
101d0 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20  t--)<=0 ){.**   
101e0 20 20 20 20 20 20 41 47 47 49 4e 56 45 52 53 45        AGGINVERSE
101f0 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 66 28 20  .**         if( 
10200 65 6f 66 20 29 20 62 72 65 61 6b 0a 2a 2a 20 20  eof ) break.**  
10210 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a       }.**     }.
10220 2a 2a 20 20 20 20 20 77 68 69 6c 65 28 20 21 65  **     while( !e
10230 6f 66 20 63 73 72 43 75 72 72 65 6e 74 20 29 7b  of csrCurrent ){
10240 0a 2a 2a 20 20 20 20 20 20 20 52 45 54 55 52 4e  .**       RETURN
10250 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a  _ROW.**     }.**
10260 0a 2a 2a 20 46 6f 72 20 74 68 65 20 6d 6f 73 74  .** For the most
10270 20 70 61 72 74 2c 20 74 68 65 20 70 61 74 74 65   part, the patte
10280 72 6e 73 20 61 62 6f 76 65 20 61 72 65 20 61 64  rns above are ad
10290 61 70 74 65 64 20 74 6f 20 73 75 70 70 6f 72 74  apted to support
102a0 20 55 4e 42 4f 55 4e 44 45 44 20 62 79 0a 2a 2a   UNBOUNDED by.**
102b0 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 69   assuming that i
102c0 74 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  t is equivalent 
102d0 74 6f 20 22 69 6e 66 69 6e 69 74 79 20 50 52 45  to "infinity PRE
102e0 43 45 44 49 4e 47 2f 46 4f 4c 4c 4f 57 49 4e 47  CEDING/FOLLOWING
102f0 22 20 61 6e 64 0a 2a 2a 20 43 55 52 52 45 4e 54  " and.** CURRENT
10300 20 52 4f 57 20 62 79 20 61 73 73 75 6d 69 6e 67   ROW by assuming
10310 20 74 68 61 74 20 69 74 20 69 73 20 65 71 75 69   that it is equi
10320 76 69 6c 65 6e 74 20 74 6f 20 22 30 20 50 52 45  vilent to "0 PRE
10330 43 45 44 49 4e 47 2f 46 4f 4c 4c 4f 57 49 4e 47  CEDING/FOLLOWING
10340 22 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 6f 70  "..** This is op
10350 74 69 6d 69 7a 65 64 20 6f 66 20 63 6f 75 72 73  timized of cours
10360 65 20 2d 20 62 72 61 6e 63 68 65 73 20 74 68 61  e - branches tha
10370 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  t will never be 
10380 74 61 6b 65 6e 20 61 6e 64 0a 2a 2a 20 63 6f 6e  taken and.** con
10390 64 69 74 69 6f 6e 73 20 74 68 61 74 20 61 72 65  ditions that are
103a0 20 61 6c 77 61 79 73 20 74 72 75 65 20 61 72 65   always true are
103b0 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68   omitted from th
103c0 65 20 56 4d 20 63 6f 64 65 2e 20 54 68 65 20 6f  e VM code. The o
103d0 6e 6c 79 0a 2a 2a 20 65 78 63 65 70 74 69 6f 6e  nly.** exception
103e0 61 6c 20 63 61 73 65 20 69 73 3a 0a 2a 2a 0a 2a  al case is:.**.*
103f0 2a 20 20 20 52 4f 57 53 20 42 45 54 57 45 45 4e  *   ROWS BETWEEN
10400 20 3c 65 78 70 72 31 3e 20 46 4f 4c 4c 4f 57 49   <expr1> FOLLOWI
10410 4e 47 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44  NG AND UNBOUNDED
10420 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a   FOLLOWING.**.**
10430 20 20 20 20 20 2e 2e 2e 20 6c 6f 6f 70 20 73 74       ... loop st
10440 61 72 74 65 64 20 62 79 20 73 71 6c 69 74 65 33  arted by sqlite3
10450 57 68 65 72 65 42 65 67 69 6e 28 29 20 2e 2e 2e  WhereBegin() ...
10460 0a 2a 2a 20 20 20 20 20 69 66 28 20 6e 65 77 20  .**     if( new 
10470 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20  partition ){.** 
10480 20 20 20 20 20 20 47 6f 73 75 62 20 66 6c 75 73        Gosub flus
10490 68 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20  h.**     }.**   
104a0 20 20 49 6e 73 65 72 74 20 6e 65 77 20 72 6f 77    Insert new row
104b0 20 69 6e 74 6f 20 65 70 68 20 74 61 62 6c 65 2e   into eph table.
104c0 0a 2a 2a 20 20 20 20 20 69 66 28 20 66 69 72 73  .**     if( firs
104d0 74 20 72 6f 77 20 6f 66 20 70 61 72 74 69 74 69  t row of partiti
104e0 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 52  on ){.**       R
104f0 65 77 69 6e 64 28 63 73 72 45 6e 64 29 20 3b 20  ewind(csrEnd) ; 
10500 52 65 77 69 6e 64 28 63 73 72 53 74 61 72 74 29  Rewind(csrStart)
10510 20 3b 20 52 65 77 69 6e 64 28 63 73 72 43 75 72   ; Rewind(csrCur
10520 72 65 6e 74 29 0a 2a 2a 20 20 20 20 20 20 20 72  rent).**       r
10530 65 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72 31  egStart = <expr1
10540 3e 0a 2a 2a 20 20 20 20 20 7d 65 6c 73 65 7b 0a  >.**     }else{.
10550 2a 2a 20 20 20 20 20 20 20 41 47 47 53 54 45 50  **       AGGSTEP
10560 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 7d  .**     }.**   }
10570 0a 2a 2a 20 20 20 66 6c 75 73 68 3a 0a 2a 2a 20  .**   flush:.** 
10580 20 20 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20      AGGSTEP.**  
10590 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 2a     while( 1 ){.*
105a0 2a 20 20 20 20 20 20 20 69 66 28 20 28 72 65 67  *       if( (reg
105b0 53 74 61 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a  Start--)<=0 ){.*
105c0 2a 20 20 20 20 20 20 20 20 20 41 47 47 49 4e 56  *         AGGINV
105d0 45 52 53 45 0a 2a 2a 20 20 20 20 20 20 20 20 20  ERSE.**         
105e0 69 66 28 20 65 6f 66 20 29 20 62 72 65 61 6b 0a  if( eof ) break.
105f0 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20  **       }.**   
10600 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a      RETURN_ROW.*
10610 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 77  *     }.**     w
10620 68 69 6c 65 28 20 21 65 6f 66 20 63 73 72 43 75  hile( !eof csrCu
10630 72 72 65 6e 74 20 29 7b 0a 2a 2a 20 20 20 20 20  rrent ){.**     
10640 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20    RETURN_ROW.** 
10650 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f      }.**.** Also
10660 20 72 65 71 75 69 72 69 6e 67 20 73 70 65 63 69   requiring speci
10670 61 6c 20 68 61 6e 64 6c 69 6e 67 20 61 72 65 20  al handling are 
10680 74 68 65 20 63 61 73 65 73 3a 0a 2a 2a 0a 2a 2a  the cases:.**.**
10690 20 20 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20     ROWS BETWEEN 
106a0 3c 65 78 70 72 31 3e 20 50 52 45 43 45 44 49 4e  <expr1> PRECEDIN
106b0 47 20 41 4e 44 20 3c 65 78 70 72 32 3e 20 50 52  G AND <expr2> PR
106c0 45 43 45 44 49 4e 47 0a 2a 2a 20 20 20 52 4f 57  ECEDING.**   ROW
106d0 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31  S BETWEEN <expr1
106e0 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e 44 20  > FOLLOWING AND 
106f0 3c 65 78 70 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e  <expr2> FOLLOWIN
10700 47 0a 2a 2a 0a 2a 2a 20 77 68 65 6e 20 28 65 78  G.**.** when (ex
10710 70 72 31 20 3c 20 65 78 70 72 32 29 2e 20 54 68  pr1 < expr2). Th
10720 69 73 20 69 73 20 64 65 74 65 63 74 65 64 20 61  is is detected a
10730 74 20 72 75 6e 74 69 6d 65 2c 20 6e 6f 74 20 62  t runtime, not b
10740 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
10750 0a 2a 2a 20 54 6f 20 68 61 6e 64 6c 65 20 74 68  .** To handle th
10760 69 73 20 63 61 73 65 2c 20 74 68 65 20 70 73 65  is case, the pse
10770 75 64 6f 2d 63 6f 64 65 20 70 72 6f 67 72 61 6d  udo-code program
10780 73 20 64 65 70 69 63 74 65 64 20 61 62 6f 76 65  s depicted above
10790 20 61 72 65 20 6d 6f 64 69 66 69 65 64 0a 2a 2a   are modified.**
107a0 20 73 6c 69 67 68 74 6c 79 20 74 6f 20 62 65 3a   slightly to be:
107b0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 6c  .**.**     ... l
107c0 6f 6f 70 20 73 74 61 72 74 65 64 20 62 79 20 73  oop started by s
107d0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
107e0 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 69 66  () ....**     if
107f0 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 20  ( new partition 
10800 29 7b 0a 2a 2a 20 20 20 20 20 20 20 47 6f 73 75  ){.**       Gosu
10810 62 20 66 6c 75 73 68 0a 2a 2a 20 20 20 20 20 7d  b flush.**     }
10820 0a 2a 2a 20 20 20 20 20 49 6e 73 65 72 74 20 6e  .**     Insert n
10830 65 77 20 72 6f 77 20 69 6e 74 6f 20 65 70 68 20  ew row into eph 
10840 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 69 66  table..**     if
10850 28 20 66 69 72 73 74 20 72 6f 77 20 6f 66 20 70  ( first row of p
10860 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20  artition ){.**  
10870 20 20 20 20 20 52 65 77 69 6e 64 28 63 73 72 45       Rewind(csrE
10880 6e 64 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72  nd) ; Rewind(csr
10890 53 74 61 72 74 29 20 3b 20 52 65 77 69 6e 64 28  Start) ; Rewind(
108a0 63 73 72 43 75 72 72 65 6e 74 29 0a 2a 2a 20 20  csrCurrent).**  
108b0 20 20 20 20 20 72 65 67 45 6e 64 20 3d 20 3c 65       regEnd = <e
108c0 78 70 72 32 3e 0a 2a 2a 20 20 20 20 20 20 20 72  xpr2>.**       r
108d0 65 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72 31  egStart = <expr1
108e0 3e 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 72  >.**       if( r
108f0 65 67 45 6e 64 20 3c 20 72 65 67 53 74 61 72 74  egEnd < regStart
10900 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 52   ){.**         R
10910 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20  ETURN_ROW.**    
10920 20 20 20 20 20 64 65 6c 65 74 65 20 65 70 68 20       delete eph 
10930 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73 0a 2a  table contents.*
10940 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  *         contin
10950 75 65 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a  ue.**       }.**
10960 20 20 20 20 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54       ....**.** T
10970 68 65 20 6e 65 77 20 22 63 6f 6e 74 69 6e 75 65  he new "continue
10980 22 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74  " statement in t
10990 68 65 20 61 62 6f 76 65 20 6a 75 6d 70 73 20 74  he above jumps t
109a0 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61  o the next itera
109b0 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 6f  tion.** of the o
109c0 75 74 65 72 20 6c 6f 6f 70 20 2d 20 74 68 65 20  uter loop - the 
109d0 6f 6e 65 20 73 74 61 72 74 65 64 20 62 79 20 73  one started by s
109e0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
109f0 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61  ()..**.** The va
10a00 72 69 6f 75 73 20 47 52 4f 55 50 53 20 63 61 73  rious GROUPS cas
10a10 65 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74  es are implement
10a20 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d  ed using the sam
10a30 65 20 70 61 74 74 65 72 6e 73 20 61 73 0a 2a 2a  e patterns as.**
10a40 20 52 4f 57 53 2e 20 54 68 65 20 56 4d 20 63 6f   ROWS. The VM co
10a50 64 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20 73  de is modified s
10a60 6c 69 67 68 74 6c 79 20 73 6f 20 74 68 61 74 3a  lightly so that:
10a70 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 54 68 65 20  .**.**   1. The 
10a80 65 6c 73 65 20 62 72 61 6e 63 68 20 69 6e 20 74  else branch in t
10a90 68 65 20 6d 61 69 6e 20 6c 6f 6f 70 20 69 73 20  he main loop is 
10aa0 6f 6e 6c 79 20 74 61 6b 65 6e 20 69 66 20 74 68  only taken if th
10ab0 65 20 72 6f 77 20 6a 75 73 74 0a 2a 2a 20 20 20  e row just.**   
10ac0 20 20 20 61 64 64 65 64 20 74 6f 20 74 68 65 20     added to the 
10ad0 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
10ae0 69 73 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  is the start of 
10af0 61 20 6e 65 77 20 67 72 6f 75 70 2e 20 49 6e 0a  a new group. In.
10b00 2a 2a 20 20 20 20 20 20 6f 74 68 65 72 20 77 6f  **      other wo
10b10 72 64 73 2c 20 69 74 20 62 65 63 6f 6d 65 73 3a  rds, it becomes:
10b20 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 2e  .**.**         .
10b30 2e 2e 20 6c 6f 6f 70 20 73 74 61 72 74 65 64 20  .. loop started 
10b40 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  by sqlite3WhereB
10b50 65 67 69 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20  egin() ....**   
10b60 20 20 20 20 20 20 69 66 28 20 6e 65 77 20 70 61        if( new pa
10b70 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20  rtition ){.**   
10b80 20 20 20 20 20 20 20 20 47 6f 73 75 62 20 66 6c          Gosub fl
10b90 75 73 68 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d  ush.**         }
10ba0 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 6e 73 65  .**         Inse
10bb0 72 74 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20  rt new row into 
10bc0 65 70 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20  eph table..**   
10bd0 20 20 20 20 20 20 69 66 28 20 66 69 72 73 74 20        if( first 
10be0 72 6f 77 20 6f 66 20 70 61 72 74 69 74 69 6f 6e  row of partition
10bf0 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   ){.**          
10c00 20 52 65 77 69 6e 64 28 63 73 72 45 6e 64 29 20   Rewind(csrEnd) 
10c10 3b 20 52 65 77 69 6e 64 28 63 73 72 53 74 61 72  ; Rewind(csrStar
10c20 74 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72 43  t) ; Rewind(csrC
10c30 75 72 72 65 6e 74 29 0a 2a 2a 20 20 20 20 20 20  urrent).**      
10c40 20 20 20 20 20 72 65 67 45 6e 64 20 3d 20 3c 65       regEnd = <e
10c50 78 70 72 32 3e 0a 2a 2a 20 20 20 20 20 20 20 20  xpr2>.**        
10c60 20 20 20 72 65 67 53 74 61 72 74 20 3d 20 3c 65     regStart = <e
10c70 78 70 72 31 3e 0a 2a 2a 20 20 20 20 20 20 20 20  xpr1>.**        
10c80 20 7d 65 6c 73 65 20 69 66 28 20 6e 65 77 20 67   }else if( new g
10c90 72 6f 75 70 20 29 7b 0a 2a 2a 20 20 20 20 20 20  roup ){.**      
10ca0 20 20 20 20 20 2e 2e 2e 20 0a 2a 2a 20 20 20 20       ... .**    
10cb0 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20       }.**       
10cc0 7d 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 49 6e 73  }.**.**   2. Ins
10cd0 74 65 61 64 20 6f 66 20 70 72 6f 63 65 73 73 69  tead of processi
10ce0 6e 67 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2c  ng a single row,
10cf0 20 65 61 63 68 20 52 45 54 55 52 4e 5f 52 4f 57   each RETURN_ROW
10d00 2c 20 41 47 47 53 54 45 50 20 6f 72 20 0a 2a 2a  , AGGSTEP or .**
10d10 20 20 20 20 20 20 41 47 47 49 4e 56 45 52 53 45        AGGINVERSE
10d20 20 73 74 65 70 20 70 72 6f 63 65 73 73 65 73 20   step processes 
10d30 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
10d40 6f 66 20 74 68 65 20 72 65 6c 65 76 61 6e 74 20  of the relevant 
10d50 63 75 72 73 6f 72 20 61 6e 64 0a 2a 2a 20 20 20  cursor and.**   
10d60 20 20 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e     all subsequen
10d70 74 20 72 6f 77 73 20 62 65 6c 6f 6e 67 69 6e 67  t rows belonging
10d80 20 74 6f 20 74 68 65 20 73 61 6d 65 20 67 72 6f   to the same gro
10d90 75 70 2e 0a 2a 2a 0a 2a 2a 20 52 41 4e 47 45 20  up..**.** RANGE 
10da0 77 69 6e 64 6f 77 20 66 72 61 6d 65 73 20 61 72  window frames ar
10db0 65 20 61 20 6c 69 74 74 6c 65 20 64 69 66 66 65  e a little diffe
10dc0 72 65 6e 74 20 61 67 61 69 6e 2e 20 41 73 20 66  rent again. As f
10dd0 6f 72 20 47 52 4f 55 50 53 2c 20 74 68 65 20 0a  or GROUPS, the .
10de0 2a 2a 20 6d 61 69 6e 20 6c 6f 6f 70 20 72 75 6e  ** main loop run
10df0 73 20 6f 6e 63 65 20 70 65 72 20 67 72 6f 75 70  s once per group
10e00 20 6f 6e 6c 79 2e 20 41 6e 64 20 52 45 54 55 52   only. And RETUR
10e10 4e 5f 52 4f 57 2c 20 41 47 47 53 54 45 50 20 61  N_ROW, AGGSTEP a
10e20 6e 64 20 41 47 47 49 4e 56 45 52 53 45 0a 2a 2a  nd AGGINVERSE.**
10e30 20 64 65 61 6c 20 69 6e 20 67 72 6f 75 70 73 20   deal in groups 
10e40 69 6e 73 74 65 61 64 20 6f 66 20 72 6f 77 73 2e  instead of rows.
10e50 20 41 73 20 66 6f 72 20 52 4f 57 53 20 61 6e 64   As for ROWS and
10e60 20 47 52 4f 55 50 53 2c 20 74 68 65 72 65 20 61   GROUPS, there a
10e70 72 65 20 74 68 72 65 65 0a 2a 2a 20 62 61 73 69  re three.** basi
10e80 63 20 63 61 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  c cases:.**.**  
10e90 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 3c   RANGE BETWEEN <
10ea0 65 78 70 72 31 3e 20 50 52 45 43 45 44 49 4e 47  expr1> PRECEDING
10eb0 20 41 4e 44 20 3c 65 78 70 72 32 3e 20 46 4f 4c   AND <expr2> FOL
10ec0 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20  LOWING.**.**    
10ed0 20 2e 2e 2e 20 6c 6f 6f 70 20 73 74 61 72 74 65   ... loop starte
10ee0 64 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72  d by sqlite3Wher
10ef0 65 42 65 67 69 6e 28 29 20 2e 2e 2e 0a 2a 2a 20  eBegin() ....** 
10f00 20 20 20 20 20 20 69 66 28 20 6e 65 77 20 70 61        if( new pa
10f10 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20  rtition ){.**   
10f20 20 20 20 20 20 20 47 6f 73 75 62 20 66 6c 75 73        Gosub flus
10f30 68 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20  h.**       }.** 
10f40 20 20 20 20 20 20 49 6e 73 65 72 74 20 6e 65 77        Insert new
10f50 20 72 6f 77 20 69 6e 74 6f 20 65 70 68 20 74 61   row into eph ta
10f60 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 20 20 69 66  ble..**       if
10f70 28 20 66 69 72 73 74 20 72 6f 77 20 6f 66 20 70  ( first row of p
10f80 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20  artition ){.**  
10f90 20 20 20 20 20 20 20 52 65 77 69 6e 64 28 63 73         Rewind(cs
10fa0 72 45 6e 64 29 20 3b 20 52 65 77 69 6e 64 28 63  rEnd) ; Rewind(c
10fb0 73 72 53 74 61 72 74 29 20 3b 20 52 65 77 69 6e  srStart) ; Rewin
10fc0 64 28 63 73 72 43 75 72 72 65 6e 74 29 0a 2a 2a  d(csrCurrent).**
10fd0 20 20 20 20 20 20 20 20 20 72 65 67 45 6e 64 20           regEnd 
10fe0 3d 20 3c 65 78 70 72 32 3e 0a 2a 2a 20 20 20 20  = <expr2>.**    
10ff0 20 20 20 20 20 72 65 67 53 74 61 72 74 20 3d 20       regStart = 
11000 3c 65 78 70 72 31 3e 0a 2a 2a 20 20 20 20 20 20  <expr1>.**      
11010 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20 20 20 20   }else{.**      
11020 20 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20 20     AGGSTEP.**   
11030 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 73        while( (cs
11040 72 43 75 72 72 65 6e 74 2e 6b 65 79 20 2b 20 72  rCurrent.key + r
11050 65 67 45 6e 64 29 20 3c 20 63 73 72 45 6e 64 2e  egEnd) < csrEnd.
11060 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  key ){.**       
11070 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a      RETURN_ROW.*
11080 2a 20 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  *           whil
11090 65 28 20 63 73 72 53 74 61 72 74 2e 6b 65 79 20  e( csrStart.key 
110a0 2b 20 72 65 67 53 74 61 72 74 29 20 3c 20 63 73  + regStart) < cs
110b0 72 43 75 72 72 65 6e 74 2e 6b 65 79 20 29 7b 0a  rCurrent.key ){.
110c0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 41  **             A
110d0 47 47 49 4e 56 45 52 53 45 0a 2a 2a 20 20 20 20  GGINVERSE.**    
110e0 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
110f0 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 7d      }.**       }
11100 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  .**     }.**    
11110 20 66 6c 75 73 68 3a 0a 2a 2a 20 20 20 20 20 20   flush:.**      
11120 20 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20 20   AGGSTEP.**     
11130 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 2a 2a    while( 1 ){.**
11140 20 20 20 20 20 20 20 20 20 52 45 54 55 52 4e 20           RETURN 
11150 52 4f 57 0a 2a 2a 20 20 20 20 20 20 20 20 20 69  ROW.**         i
11160 66 28 20 63 73 72 43 75 72 72 65 6e 74 20 69 73  f( csrCurrent is
11170 20 45 4f 46 20 29 20 62 72 65 61 6b 3b 0a 2a 2a   EOF ) break;.**
11180 20 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65             while
11190 28 20 63 73 72 53 74 61 72 74 2e 6b 65 79 20 2b  ( csrStart.key +
111a0 20 72 65 67 53 74 61 72 74 29 20 3c 20 63 73 72   regStart) < csr
111b0 43 75 72 72 65 6e 74 2e 6b 65 79 20 29 7b 0a 2a  Current.key ){.*
111c0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 41 47  *             AG
111d0 47 49 4e 56 45 52 53 45 0a 2a 2a 20 20 20 20 20  GINVERSE.**     
111e0 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20        }.**      
111f0 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 7d 0a     }.**       }.
11200 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62 6f  **.** In the abo
11210 76 65 20 6e 6f 74 61 74 69 6f 6e 2c 20 22 63 73  ve notation, "cs
11220 72 2e 6b 65 79 22 20 6d 65 61 6e 73 20 74 68 65  r.key" means the
11230 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
11240 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 0a  f the ORDER BY .
11250 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 28 74  ** expression (t
11260 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76 65  here is only eve
11270 72 20 31 20 66 6f 72 20 61 20 52 41 4e 47 45 20  r 1 for a RANGE 
11280 74 68 61 74 20 75 73 65 73 20 61 6e 20 3c 65 78  that uses an <ex
11290 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a  pr> FOLLOWING.**
112a0 20 6f 72 20 3c 65 78 70 72 20 50 52 45 43 45 44   or <expr PRECED
112b0 49 4e 47 29 20 72 65 61 64 20 66 72 6f 6d 20 63  ING) read from c
112c0 75 72 73 6f 72 20 63 73 72 2e 0a 2a 2a 0a 2a 2a  ursor csr..**.**
112d0 20 20 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e     RANGE BETWEEN
112e0 20 3c 65 78 70 72 31 3e 20 50 52 45 43 45 44 49   <expr1> PRECEDI
112f0 4e 47 20 41 4e 44 20 3c 65 78 70 72 32 3e 20 50  NG AND <expr2> P
11300 52 45 43 45 44 49 4e 47 0a 2a 2a 0a 2a 2a 20 20  RECEDING.**.**  
11310 20 20 20 2e 2e 2e 20 6c 6f 6f 70 20 73 74 61 72     ... loop star
11320 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 68  ted by sqlite3Wh
11330 65 72 65 42 65 67 69 6e 28 29 20 2e 2e 2e 0a 2a  ereBegin() ....*
11340 2a 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 20  *       if( new 
11350 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20  partition ){.** 
11360 20 20 20 20 20 20 20 20 47 6f 73 75 62 20 66 6c          Gosub fl
11370 75 73 68 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a  ush.**       }.*
11380 2a 20 20 20 20 20 20 20 49 6e 73 65 72 74 20 6e  *       Insert n
11390 65 77 20 72 6f 77 20 69 6e 74 6f 20 65 70 68 20  ew row into eph 
113a0 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 20 20  table..**       
113b0 69 66 28 20 66 69 72 73 74 20 72 6f 77 20 6f 66  if( first row of
113c0 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a   partition ){.**
113d0 20 20 20 20 20 20 20 20 20 52 65 77 69 6e 64 28           Rewind(
113e0 63 73 72 45 6e 64 29 20 3b 20 52 65 77 69 6e 64  csrEnd) ; Rewind
113f0 28 63 73 72 53 74 61 72 74 29 20 3b 20 52 65 77  (csrStart) ; Rew
11400 69 6e 64 28 63 73 72 43 75 72 72 65 6e 74 29 0a  ind(csrCurrent).
11410 2a 2a 20 20 20 20 20 20 20 20 20 72 65 67 45 6e  **         regEn
11420 64 20 3d 20 3c 65 78 70 72 32 3e 0a 2a 2a 20 20  d = <expr2>.**  
11430 20 20 20 20 20 20 20 72 65 67 53 74 61 72 74 20         regStart 
11440 3d 20 3c 65 78 70 72 31 3e 0a 2a 2a 20 20 20 20  = <expr1>.**    
11450 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20 20     }else{.**    
11460 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 73 72       while( (csr
11470 45 6e 64 2e 6b 65 79 20 2b 20 72 65 67 45 6e 64  End.key + regEnd
11480 29 20 3c 3d 20 63 73 72 43 75 72 72 65 6e 74 2e  ) <= csrCurrent.
11490 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  key ){.**       
114a0 20 20 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20      AGGSTEP.**  
114b0 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
114c0 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a      RETURN_ROW.*
114d0 2a 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  *         while(
114e0 20 28 63 73 72 53 74 61 72 74 2e 6b 65 79 20 2b   (csrStart.key +
114f0 20 72 65 67 53 74 61 72 74 29 20 3c 20 63 73 72   regStart) < csr
11500 43 75 72 72 65 6e 74 2e 6b 65 79 20 29 7b 0a 2a  Current.key ){.*
11510 2a 20 20 20 20 20 20 20 20 20 20 20 41 47 47 49  *           AGGI
11520 4e 56 45 52 53 45 0a 2a 2a 20 20 20 20 20 20 20  NVERSE.**       
11530 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a    }.**       }.*
11540 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 66  *     }.**     f
11550 6c 75 73 68 3a 0a 2a 2a 20 20 20 20 20 20 20 77  lush:.**       w
11560 68 69 6c 65 28 20 28 63 73 72 45 6e 64 2e 6b 65  hile( (csrEnd.ke
11570 79 20 2b 20 72 65 67 45 6e 64 29 20 3c 3d 20 63  y + regEnd) <= c
11580 73 72 43 75 72 72 65 6e 74 2e 6b 65 79 20 29 7b  srCurrent.key ){
11590 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 47 47 53  .**         AGGS
115a0 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a  TEP.**       }.*
115b0 2a 20 20 20 20 20 20 20 52 45 54 55 52 4e 5f 52  *       RETURN_R
115c0 4f 57 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e 47 45  OW.**.**   RANGE
115d0 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31 3e   BETWEEN <expr1>
115e0 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e 44 20 3c   FOLLOWING AND <
115f0 65 78 70 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47  expr2> FOLLOWING
11600 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 6c  .**.**     ... l
11610 6f 6f 70 20 73 74 61 72 74 65 64 20 62 79 20 73  oop started by s
11620 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
11630 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20  () ....**       
11640 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f  if( new partitio
11650 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  n ){.**         
11660 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20  Gosub flush.**  
11670 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20       }.**       
11680 49 6e 73 65 72 74 20 6e 65 77 20 72 6f 77 20 69  Insert new row i
11690 6e 74 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a 2a  nto eph table..*
116a0 2a 20 20 20 20 20 20 20 69 66 28 20 66 69 72 73  *       if( firs
116b0 74 20 72 6f 77 20 6f 66 20 70 61 72 74 69 74 69  t row of partiti
116c0 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  on ){.**        
116d0 20 52 65 77 69 6e 64 28 63 73 72 45 6e 64 29 20   Rewind(csrEnd) 
116e0 3b 20 52 65 77 69 6e 64 28 63 73 72 53 74 61 72  ; Rewind(csrStar
116f0 74 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72 43  t) ; Rewind(csrC
11700 75 72 72 65 6e 74 29 0a 2a 2a 20 20 20 20 20 20  urrent).**      
11710 20 20 20 72 65 67 45 6e 64 20 3d 20 3c 65 78 70     regEnd = <exp
11720 72 32 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20 72  r2>.**         r
11730 65 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72 31  egStart = <expr1
11740 3e 0a 2a 2a 20 20 20 20 20 20 20 7d 65 6c 73 65  >.**       }else
11750 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 47 47  {.**         AGG
11760 53 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 20 20  STEP.**         
11770 77 68 69 6c 65 28 20 28 63 73 72 43 75 72 72 65  while( (csrCurre
11780 6e 74 2e 6b 65 79 20 2b 20 72 65 67 45 6e 64 29  nt.key + regEnd)
11790 20 3c 20 63 73 72 45 6e 64 2e 6b 65 79 20 29 7b   < csrEnd.key ){
117a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 77 68  .**           wh
117b0 69 6c 65 28 20 28 63 73 72 43 75 72 72 65 6e 74  ile( (csrCurrent
117c0 2e 6b 65 79 20 2b 20 72 65 67 53 74 61 72 74 29  .key + regStart)
117d0 20 3e 20 63 73 72 53 74 61 72 74 2e 6b 65 79 20   > csrStart.key 
117e0 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ){.**           
117f0 20 20 41 47 47 49 4e 56 45 52 53 45 0a 2a 2a 20    AGGINVERSE.** 
11800 20 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20            }.**  
11810 20 20 20 20 20 20 20 20 20 52 45 54 55 52 4e 5f           RETURN_
11820 52 4f 57 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d  ROW.**         }
11830 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  .**       }.**  
11840 20 20 20 7d 0a 2a 2a 20 20 20 20 20 66 6c 75 73     }.**     flus
11850 68 3a 0a 2a 2a 20 20 20 20 20 20 20 41 47 47 53  h:.**       AGGS
11860 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 77 68 69  TEP.**       whi
11870 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20  le( 1 ){.**     
11880 20 20 20 20 77 68 69 6c 65 28 20 28 63 73 72 43      while( (csrC
11890 75 72 72 65 6e 74 2e 6b 65 79 20 2b 20 72 65 67  urrent.key + reg
118a0 53 74 61 72 74 29 20 3e 20 63 73 72 53 74 61 72  Start) > csrStar
118b0 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20 20  t.key ){.**     
118c0 20 20 20 20 20 20 41 47 47 49 4e 56 45 52 53 45        AGGINVERSE
118d0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 69 66  .**           if
118e0 28 20 65 6f 66 20 29 20 62 72 65 61 6b 20 22 77  ( eof ) break "w
118f0 68 69 6c 65 28 20 31 20 29 22 20 6c 6f 6f 70 2e  hile( 1 )" loop.
11900 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a  .**         }.**
11910 20 20 20 20 20 20 20 20 20 52 45 54 55 52 4e 5f           RETURN_
11920 52 4f 57 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a  ROW.**       }.*
11930 2a 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 21  *       while( !
11940 65 6f 66 20 63 73 72 43 75 72 72 65 6e 74 20 29  eof csrCurrent )
11950 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 45 54  {.**         RET
11960 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 20  URN_ROW.**      
11970 20 7d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 78   }.**.** The tex
11980 74 20 61 62 6f 76 65 20 6c 65 61 76 65 73 20 6f  t above leaves o
11990 75 74 20 6d 61 6e 79 20 64 65 74 61 69 6c 73 2e  ut many details.
119a0 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 63 6f   Refer to the co
119b0 64 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73 0a  de and comments.
119c0 2a 2a 20 62 65 6c 6f 77 20 66 6f 72 20 61 20 6d  ** below for a m
119d0 6f 72 65 20 63 6f 6d 70 6c 65 74 65 20 70 69 63  ore complete pic
119e0 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ture..*/.void sq
119f0 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 53  lite3WindowCodeS
11a00 74 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50  tep(.  Parse *pP
11a10 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
11a20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
11a30 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
11a40 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
11a50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11a60 52 65 77 72 69 74 74 65 6e 20 53 45 4c 45 43 54  Rewritten SELECT
11a70 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
11a80 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
11a90 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
11aa0 2f 2a 20 43 6f 6e 74 65 78 74 20 72 65 74 75 72  /* Context retur
11ab0 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 68  ned by sqlite3Wh
11ac0 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20  ereBegin() */.  
11ad0 69 6e 74 20 72 65 67 47 6f 73 75 62 2c 20 20 20  int regGosub,   
11ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11af0 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20  /* Register for 
11b00 4f 50 5f 47 6f 73 75 62 20 2a 2f 0a 20 20 69 6e  OP_Gosub */.  in
11b10 74 20 61 64 64 72 47 6f 73 75 62 20 20 20 20 20  t addrGosub     
11b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11b30 20 4f 50 5f 47 6f 73 75 62 20 68 65 72 65 20 74   OP_Gosub here t
11b40 6f 20 72 65 74 75 72 6e 20 65 61 63 68 20 72 6f  o return each ro
11b50 77 20 2a 2f 0a 29 7b 0a 20 20 57 69 6e 64 6f 77  w */.){.  Window
11b60 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57 69   *pMWin = p->pWi
11b70 6e 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  n;.  ExprList *p
11b80 4f 72 64 65 72 42 79 20 3d 20 70 4d 57 69 6e 2d  OrderBy = pMWin-
11b90 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 56 64 62  >pOrderBy;.  Vdb
11ba0 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
11bb0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
11bc0 20 69 6e 74 20 63 73 72 57 72 69 74 65 3b 20 20   int csrWrite;  
11bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11be0 20 2f 2a 20 43 75 72 73 6f 72 20 75 73 65 64 20   /* Cursor used 
11bf0 74 6f 20 77 72 69 74 65 20 74 6f 20 65 70 68 2e  to write to eph.
11c00 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
11c10 63 73 72 49 6e 70 75 74 20 3d 20 70 2d 3e 70 53  csrInput = p->pS
11c20 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  rc->a[0].iCursor
11c30 3b 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  ;     /* Cursor 
11c40 6f 66 20 73 75 62 2d 73 65 6c 65 63 74 20 2a 2f  of sub-select */
11c50 0a 20 20 69 6e 74 20 6e 49 6e 70 75 74 20 3d 20  .  int nInput = 
11c60 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54  p->pSrc->a[0].pT
11c70 61 62 2d 3e 6e 43 6f 6c 3b 20 20 20 20 2f 2a 20  ab->nCol;    /* 
11c80 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 73 20 72  Number of cols r
11c90 65 74 75 72 6e 65 64 20 62 79 20 73 75 62 20 2a  eturned by sub *
11ca0 2f 0a 20 20 69 6e 74 20 69 49 6e 70 75 74 3b 20  /.  int iInput; 
11cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11cd0 20 54 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   To iterate thro
11ce0 75 67 68 20 73 75 62 20 63 6f 6c 73 20 2a 2f 0a  ugh sub cols */.
11cf0 20 20 69 6e 74 20 61 64 64 72 49 66 4e 6f 74 3b    int addrIfNot;
11d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d10 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
11d20 4f 50 5f 49 66 4e 6f 74 20 2a 2f 0a 20 20 69 6e  OP_IfNot */.  in
11d30 74 20 61 64 64 72 47 6f 73 75 62 46 6c 75 73 68  t addrGosubFlush
11d40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
11d50 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 47   Address of OP_G
11d60 6f 73 75 62 20 74 6f 20 66 6c 75 73 68 3a 20 2a  osub to flush: *
11d70 2f 0a 20 20 69 6e 74 20 61 64 64 72 49 6e 74 65  /.  int addrInte
11d80 67 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ger;            
11d90 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
11da0 66 20 4f 50 5f 49 6e 74 65 67 65 72 20 2a 2f 0a  f OP_Integer */.
11db0 20 20 69 6e 74 20 61 64 64 72 45 6d 70 74 79 3b    int addrEmpty;
11dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11dd0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
11de0 4f 50 5f 52 65 77 69 6e 64 20 69 6e 20 66 6c 75  OP_Rewind in flu
11df0 73 68 3a 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  sh: */.  int reg
11e00 53 74 61 72 74 20 3d 20 30 3b 20 20 20 20 20 20  Start = 0;      
11e10 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
11e20 65 20 6f 66 20 3c 65 78 70 72 3e 20 50 52 45 43  e of <expr> PREC
11e30 45 44 49 4e 47 20 2a 2f 0a 20 20 69 6e 74 20 72  EDING */.  int r
11e40 65 67 45 6e 64 20 3d 20 30 3b 20 20 20 20 20 20  egEnd = 0;      
11e50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
11e60 6c 75 65 20 6f 66 20 3c 65 78 70 72 3e 20 46 4f  lue of <expr> FO
11e70 4c 4c 4f 57 49 4e 47 20 2a 2f 0a 20 20 69 6e 74  LLOWING */.  int
11e80 20 72 65 67 4e 65 77 3b 20 20 20 20 20 20 20 20   regNew;        
11e90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11ea0 41 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  Array of registe
11eb0 72 73 20 68 6f 6c 64 69 6e 67 20 6e 65 77 20 69  rs holding new i
11ec0 6e 70 75 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e  nput row */.  in
11ed0 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20 20 20  t regRecord;    
11ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11ef0 20 72 65 67 4e 65 77 20 61 72 72 61 79 20 69 6e   regNew array in
11f00 20 72 65 63 6f 72 64 20 66 6f 72 6d 20 2a 2f 0a   record form */.
11f10 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 20    int regRowid; 
11f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f30 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 72    /* Rowid for r
11f40 65 67 52 65 63 6f 72 64 20 69 6e 20 65 70 68 20  egRecord in eph 
11f50 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72  table */.  int r
11f60 65 67 4e 65 77 50 65 65 72 20 3d 20 30 3b 20 20  egNewPeer = 0;  
11f70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 65             /* Pe
11f80 65 72 20 76 61 6c 75 65 73 20 66 6f 72 20 6e 65  er values for ne
11f90 77 20 72 6f 77 20 28 70 61 72 74 20 6f 66 20 72  w row (part of r
11fa0 65 67 4e 65 77 29 20 2a 2f 0a 20 20 69 6e 74 20  egNew) */.  int 
11fb0 72 65 67 50 65 65 72 20 3d 20 30 3b 20 20 20 20  regPeer = 0;    
11fc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
11fd0 65 65 72 20 76 61 6c 75 65 73 20 66 6f 72 20 63  eer values for c
11fe0 75 72 72 65 6e 74 20 72 6f 77 20 2a 2f 0a 20 20  urrent row */.  
11ff0 69 6e 74 20 72 65 67 46 6c 75 73 68 50 61 72 74  int regFlushPart
12000 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
12010 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20  /* Register for 
12020 22 47 6f 73 75 62 20 66 6c 75 73 68 5f 70 61 72  "Gosub flush_par
12030 74 69 74 69 6f 6e 22 20 2a 2f 0a 20 20 57 69 6e  tition" */.  Win
12040 64 6f 77 43 6f 64 65 41 72 67 20 73 3b 20 20 20  dowCodeArg s;   
12050 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12060 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 66  Context object f
12070 6f 72 20 73 75 62 2d 72 6f 75 74 69 6e 65 73 20  or sub-routines 
12080 2a 2f 0a 20 20 69 6e 74 20 6c 62 6c 57 68 65 72  */.  int lblWher
12090 65 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  eEnd;           
120a0 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 6a 75       /* Label ju
120b0 73 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65  st before sqlite
120c0 33 57 68 65 72 65 45 6e 64 28 29 20 63 6f 64 65  3WhereEnd() code
120d0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
120e0 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
120f0 5f 50 52 45 43 45 44 49 4e 47 20 7c 7c 20 70 4d  _PRECEDING || pM
12100 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
12110 43 55 52 52 45 4e 54 20 0a 20 20 20 20 20 20 20  CURRENT .       
12120 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  || pMWin->eStart
12130 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 7c  ==TK_FOLLOWING |
12140 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d  | pMWin->eStart=
12150 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 0a 20  =TK_UNBOUNDED . 
12160 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d   );.  assert( pM
12170 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f  Win->eEnd==TK_FO
12180 4c 4c 4f 57 49 4e 47 20 7c 7c 20 70 4d 57 69 6e  LLOWING || pMWin
12190 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45  ->eEnd==TK_CURRE
121a0 4e 54 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d  NT .       || pM
121b0 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e  Win->eEnd==TK_UN
121c0 42 4f 55 4e 44 45 44 20 7c 7c 20 70 4d 57 69 6e  BOUNDED || pMWin
121d0 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45  ->eEnd==TK_PRECE
121e0 44 49 4e 47 20 0a 20 20 29 3b 0a 0a 20 20 6c 62  DING .  );..  lb
121f0 6c 57 68 65 72 65 45 6e 64 20 3d 20 73 71 6c 69  lWhereEnd = sqli
12200 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
12210 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20  (pParse);..  /* 
12220 46 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74  Fill in the cont
12230 65 78 74 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ext object */.  
12240 6d 65 6d 73 65 74 28 26 73 2c 20 30 2c 20 73 69  memset(&s, 0, si
12250 7a 65 6f 66 28 57 69 6e 64 6f 77 43 6f 64 65 41  zeof(WindowCodeA
12260 72 67 29 29 3b 0a 20 20 73 2e 70 50 61 72 73 65  rg));.  s.pParse
12270 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 2e 70   = pParse;.  s.p
12280 4d 57 69 6e 20 3d 20 70 4d 57 69 6e 3b 0a 20 20  MWin = pMWin;.  
12290 73 2e 70 56 64 62 65 20 3d 20 76 3b 0a 20 20 73  s.pVdbe = v;.  s
122a0 2e 72 65 67 47 6f 73 75 62 20 3d 20 72 65 67 47  .regGosub = regG
122b0 6f 73 75 62 3b 0a 20 20 73 2e 61 64 64 72 47 6f  osub;.  s.addrGo
122c0 73 75 62 20 3d 20 61 64 64 72 47 6f 73 75 62 3b  sub = addrGosub;
122d0 0a 20 20 73 2e 63 75 72 72 65 6e 74 2e 63 73 72  .  s.current.csr
122e0 20 3d 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73   = pMWin->iEphCs
122f0 72 3b 0a 20 20 63 73 72 57 72 69 74 65 20 3d 20  r;.  csrWrite = 
12300 73 2e 63 75 72 72 65 6e 74 2e 63 73 72 2b 31 3b  s.current.csr+1;
12310 0a 20 20 73 2e 73 74 61 72 74 2e 63 73 72 20 3d  .  s.start.csr =
12320 20 73 2e 63 75 72 72 65 6e 74 2e 63 73 72 2b 32   s.current.csr+2
12330 3b 0a 20 20 73 2e 65 6e 64 2e 63 73 72 20 3d 20  ;.  s.end.csr = 
12340 73 2e 63 75 72 72 65 6e 74 2e 63 73 72 2b 33 3b  s.current.csr+3;
12350 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
12360 74 20 77 68 65 6e 20 72 6f 77 73 20 6d 61 79 20  t when rows may 
12370 62 65 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20  be deleted from 
12380 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61  the ephemeral ta
12390 62 6c 65 2e 20 54 68 65 72 65 0a 20 20 2a 2a 20  ble. There.  ** 
123a0 61 72 65 20 66 6f 75 72 20 6f 70 74 69 6f 6e 73  are four options
123b0 20 2d 20 74 68 65 79 20 6d 61 79 20 6e 65 76 65   - they may neve
123c0 72 20 62 65 20 64 65 6c 65 74 65 64 20 28 65 44  r be deleted (eD
123d0 65 6c 65 74 65 3d 3d 30 29 2c 20 74 68 65 79 20  elete==0), they 
123e0 6d 61 79 20 0a 20 20 2a 2a 20 62 65 20 64 65 6c  may .  ** be del
123f0 65 74 65 64 20 61 73 20 73 6f 6f 6e 20 61 73 20  eted as soon as 
12400 74 68 65 79 20 61 72 65 20 6e 6f 20 6c 6f 6e 67  they are no long
12410 65 72 20 70 61 72 74 20 6f 66 20 74 68 65 20 77  er part of the w
12420 69 6e 64 6f 77 20 66 72 61 6d 65 0a 20 20 2a 2a  indow frame.  **
12430 20 28 65 44 65 6c 65 74 65 3d 3d 57 49 4e 44 4f   (eDelete==WINDO
12440 57 5f 41 47 47 49 4e 56 45 52 53 45 29 2c 20 74  W_AGGINVERSE), t
12450 68 65 79 20 6d 61 79 20 62 65 20 64 65 6c 65 74  hey may be delet
12460 65 64 20 61 73 20 61 66 74 65 72 20 74 68 65 20  ed as after the 
12470 72 6f 77 20 0a 20 20 2a 2a 20 68 61 73 20 62 65  row .  ** has be
12480 65 6e 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  en returned to t
12490 68 65 20 63 61 6c 6c 65 72 20 28 57 49 4e 44 4f  he caller (WINDO
124a0 57 5f 52 45 54 55 52 4e 5f 52 4f 57 29 2c 20 6f  W_RETURN_ROW), o
124b0 72 20 74 68 65 79 20 6d 61 79 0a 20 20 2a 2a 20  r they may.  ** 
124c0 62 65 20 64 65 6c 65 74 65 64 20 61 66 74 65 72  be deleted after
124d0 20 74 68 65 79 20 65 6e 74 65 72 20 74 68 65 20   they enter the 
124e0 66 72 61 6d 65 20 28 57 49 4e 44 4f 57 5f 41 47  frame (WINDOW_AG
124f0 47 53 54 45 50 29 2e 20 2a 2f 0a 20 20 73 77 69  GSTEP). */.  swi
12500 74 63 68 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61  tch( pMWin->eSta
12510 72 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  rt ){.    case T
12520 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 3a 20 7b 0a 20  K_FOLLOWING: {. 
12530 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
12540 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
12550 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
12560 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20 20  ue *pVal = 0;.  
12570 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
12580 46 72 6f 6d 45 78 70 72 28 64 62 2c 20 70 4d 57  FromExpr(db, pMW
12590 69 6e 2d 3e 70 53 74 61 72 74 2c 20 64 62 2d 3e  in->pStart, db->
125a0 65 6e 63 2c 53 51 4c 49 54 45 5f 41 46 46 5f 4e  enc,SQLITE_AFF_N
125b0 55 4d 45 52 49 43 2c 26 70 56 61 6c 29 3b 0a 20  UMERIC,&pVal);. 
125c0 20 20 20 20 20 69 66 28 20 70 56 61 6c 20 26 26       if( pVal &&
125d0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
125e0 6e 74 28 70 56 61 6c 29 3e 30 20 29 7b 0a 20 20  nt(pVal)>0 ){.  
125f0 20 20 20 20 20 20 73 2e 65 44 65 6c 65 74 65 20        s.eDelete 
12600 3d 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f  = WINDOW_RETURN_
12610 52 4f 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROW;.      }.   
12620 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46     sqlite3ValueF
12630 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 20 20 20  ree(pVal);.     
12640 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
12650 20 20 63 61 73 65 20 54 4b 5f 55 4e 42 4f 55 4e    case TK_UNBOUN
12660 44 45 44 3a 0a 20 20 20 20 20 20 69 66 28 20 77  DED:.      if( w
12670 69 6e 64 6f 77 43 61 63 68 65 46 72 61 6d 65 28  indowCacheFrame(
12680 70 4d 57 69 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  pMWin)==0 ){.   
12690 20 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e       if( pMWin->
126a0 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49  eEnd==TK_PRECEDI
126b0 4e 47 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NG ){.          
126c0 73 2e 65 44 65 6c 65 74 65 20 3d 20 57 49 4e 44  s.eDelete = WIND
126d0 4f 57 5f 41 47 47 53 54 45 50 3b 0a 20 20 20 20  OW_AGGSTEP;.    
126e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
126f0 20 20 20 20 20 73 2e 65 44 65 6c 65 74 65 20 3d       s.eDelete =
12700 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52   WINDOW_RETURN_R
12710 4f 57 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OW;.        }.  
12720 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
12730 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  k;.    default:.
12740 20 20 20 20 20 20 73 2e 65 44 65 6c 65 74 65 20        s.eDelete 
12750 3d 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45  = WINDOW_AGGINVE
12760 52 53 45 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  RSE;.      break
12770 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  ;.  }..  /* Allo
12780 63 61 74 65 20 72 65 67 69 73 74 65 72 73 20 66  cate registers f
12790 6f 72 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  or the array of 
127a0 76 61 6c 75 65 73 20 66 72 6f 6d 20 74 68 65 20  values from the 
127b0 73 75 62 2d 71 75 65 72 79 2c 20 74 68 65 0a 20  sub-query, the. 
127c0 20 2a 2a 20 73 61 6d 76 65 20 76 61 6c 75 65 73   ** samve values
127d0 20 69 6e 20 72 65 63 6f 72 64 20 66 6f 72 6d 2c   in record form,
127e0 20 61 6e 64 20 74 68 65 20 72 6f 77 69 64 20 75   and the rowid u
127f0 73 65 64 20 74 6f 20 69 6e 73 65 72 74 20 73 61  sed to insert sa
12800 69 64 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 69  id record.  ** i
12810 6e 74 6f 20 74 68 65 20 65 70 68 65 6d 65 72 61  nto the ephemera
12820 6c 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 72  l table.  */.  r
12830 65 67 4e 65 77 20 3d 20 70 50 61 72 73 65 2d 3e  egNew = pParse->
12840 6e 4d 65 6d 2b 31 3b 0a 20 20 70 50 61 72 73 65  nMem+1;.  pParse
12850 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 49 6e 70 75 74  ->nMem += nInput
12860 3b 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20  ;.  regRecord = 
12870 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
12880 20 20 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70    regRowid = ++p
12890 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20  Parse->nMem;..  
128a0 2f 2a 20 49 66 20 74 68 65 20 77 69 6e 64 6f 77  /* If the window
128b0 20 66 72 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20   frame contains 
128c0 61 6e 20 22 3c 65 78 70 72 3e 20 50 52 45 43 45  an "<expr> PRECE
128d0 44 49 4e 47 22 20 6f 72 20 22 3c 65 78 70 72 3e  DING" or "<expr>
128e0 20 46 4f 4c 4c 4f 57 49 4e 47 22 0a 20 20 2a 2a   FOLLOWING".  **
128f0 20 63 6c 61 75 73 65 2c 20 61 6c 6c 6f 63 61 74   clause, allocat
12900 65 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 73  e registers to s
12910 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
12920 20 6f 66 20 65 76 61 6c 75 61 74 69 6e 67 20 65   of evaluating e
12930 61 63 68 0a 20 20 2a 2a 20 3c 65 78 70 72 3e 2e  ach.  ** <expr>.
12940 20 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e    */.  if( pMWin
12950 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45  ->eStart==TK_PRE
12960 43 45 44 49 4e 47 20 7c 7c 20 70 4d 57 69 6e 2d  CEDING || pMWin-
12970 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c  >eStart==TK_FOLL
12980 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 72 65 67  OWING ){.    reg
12990 53 74 61 72 74 20 3d 20 2b 2b 70 50 61 72 73 65  Start = ++pParse
129a0 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66  ->nMem;.  }.  if
129b0 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54  ( pMWin->eEnd==T
129c0 4b 5f 50 52 45 43 45 44 49 4e 47 20 7c 7c 20 70  K_PRECEDING || p
129d0 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46  MWin->eEnd==TK_F
129e0 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20  OLLOWING ){.    
129f0 72 65 67 45 6e 64 20 3d 20 2b 2b 70 50 61 72 73  regEnd = ++pPars
12a00 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 0a 20 20  e->nMem;.  }..  
12a10 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  /* If this is no
12a20 74 20 61 20 22 52 4f 57 53 20 42 45 54 57 45 45  t a "ROWS BETWEE
12a30 4e 20 2e 2e 2e 22 20 66 72 61 6d 65 2c 20 74 68  N ..." frame, th
12a40 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 72 72 61  en allocate arra
12a50 79 73 20 6f 66 0a 20 20 2a 2a 20 72 65 67 69 73  ys of.  ** regis
12a60 74 65 72 73 20 74 6f 20 73 74 6f 72 65 20 63 6f  ters to store co
12a70 70 69 65 73 20 6f 66 20 74 68 65 20 4f 52 44 45  pies of the ORDE
12a80 52 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 73  R BY expressions
12a90 20 28 70 65 65 72 20 76 61 6c 75 65 73 29 20 0a   (peer values) .
12aa0 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6d 61 69    ** for the mai
12ab0 6e 20 6c 6f 6f 70 2c 20 61 6e 64 20 66 6f 72 20  n loop, and for 
12ac0 65 61 63 68 20 63 75 72 73 6f 72 20 28 73 74 61  each cursor (sta
12ad0 72 74 2c 20 63 75 72 72 65 6e 74 20 61 6e 64 20  rt, current and 
12ae0 65 6e 64 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70  end). */.  if( p
12af0 4d 57 69 6e 2d 3e 65 54 79 70 65 21 3d 54 4b 5f  MWin->eType!=TK_
12b00 52 4f 57 53 20 29 7b 0a 20 20 20 20 69 6e 74 20  ROWS ){.    int 
12b10 6e 50 65 65 72 20 3d 20 28 70 4f 72 64 65 72 42  nPeer = (pOrderB
12b20 79 20 3f 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  y ? pOrderBy->nE
12b30 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 72 65  xpr : 0);.    re
12b40 67 4e 65 77 50 65 65 72 20 3d 20 72 65 67 4e 65  gNewPeer = regNe
12b50 77 20 2b 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66  w + pMWin->nBuff
12b60 65 72 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 70  erCol;.    if( p
12b70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e  MWin->pPartition
12b80 20 29 20 72 65 67 4e 65 77 50 65 65 72 20 2b 3d   ) regNewPeer +=
12b90 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69   pMWin->pPartiti
12ba0 6f 6e 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 72  on->nExpr;.    r
12bb0 65 67 50 65 65 72 20 3d 20 70 50 61 72 73 65 2d  egPeer = pParse-
12bc0 3e 6e 4d 65 6d 2b 31 3b 20 20 20 20 20 20 20 70  >nMem+1;       p
12bd0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
12be0 50 65 65 72 3b 0a 20 20 20 20 73 2e 73 74 61 72  Peer;.    s.star
12bf0 74 2e 72 65 67 20 3d 20 70 50 61 72 73 65 2d 3e  t.reg = pParse->
12c00 6e 4d 65 6d 2b 31 3b 20 20 20 70 50 61 72 73 65  nMem+1;   pParse
12c10 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 65 65 72 3b  ->nMem += nPeer;
12c20 0a 20 20 20 20 73 2e 63 75 72 72 65 6e 74 2e 72  .    s.current.r
12c30 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  eg = pParse->nMe
12c40 6d 2b 31 3b 20 70 50 61 72 73 65 2d 3e 6e 4d 65  m+1; pParse->nMe
12c50 6d 20 2b 3d 20 6e 50 65 65 72 3b 0a 20 20 20 20  m += nPeer;.    
12c60 73 2e 65 6e 64 2e 72 65 67 20 3d 20 70 50 61 72  s.end.reg = pPar
12c70 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 20 20 20 20 20  se->nMem+1;     
12c80 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
12c90 6e 50 65 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  nPeer;.  }..  /*
12ca0 20 4c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e   Load the column
12cb0 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20   values for the 
12cc0 72 6f 77 20 72 65 74 75 72 6e 65 64 20 62 79 20  row returned by 
12cd0 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 0a 20  the sub-select. 
12ce0 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 61 72 72 61   ** into an arra
12cf0 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 73  y of registers s
12d00 74 61 72 74 69 6e 67 20 61 74 20 72 65 67 4e 65  tarting at regNe
12d10 77 2e 20 41 73 73 65 6d 62 6c 65 20 74 68 65 6d  w. Assemble them
12d20 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 72 65 63   into.  ** a rec
12d30 6f 72 64 20 69 6e 20 72 65 67 69 73 74 65 72 20  ord in register 
12d40 72 65 67 52 65 63 6f 72 64 2e 20 2a 2f 0a 20 20  regRecord. */.  
12d50 66 6f 72 28 69 49 6e 70 75 74 3d 30 3b 20 69 49  for(iInput=0; iI
12d60 6e 70 75 74 3c 6e 49 6e 70 75 74 3b 20 69 49 6e  nput<nInput; iIn
12d70 70 75 74 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  put++){.    sqli
12d80 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
12d90 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 49   OP_Column, csrI
12da0 6e 70 75 74 2c 20 69 49 6e 70 75 74 2c 20 72 65  nput, iInput, re
12db0 67 4e 65 77 2b 69 49 6e 70 75 74 29 3b 0a 20 20  gNew+iInput);.  
12dc0 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
12dd0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
12de0 52 65 63 6f 72 64 2c 20 72 65 67 4e 65 77 2c 20  Record, regNew, 
12df0 6e 49 6e 70 75 74 2c 20 72 65 67 52 65 63 6f 72  nInput, regRecor
12e00 64 29 3b 0a 0a 20 20 2f 2a 20 41 6e 20 69 6e 70  d);..  /* An inp
12e10 75 74 20 72 6f 77 20 68 61 73 20 6a 75 73 74 20  ut row has just 
12e20 62 65 65 6e 20 72 65 61 64 20 69 6e 74 6f 20 61  been read into a
12e30 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73  n array of regis
12e40 74 65 72 73 20 73 74 61 72 74 69 6e 67 0a 20 20  ters starting.  
12e50 2a 2a 20 61 74 20 72 65 67 4e 65 77 2e 20 49 66  ** at regNew. If
12e60 20 74 68 65 20 77 69 6e 64 6f 77 20 68 61 73 20   the window has 
12e70 61 20 50 41 52 54 49 54 49 4f 4e 20 63 6c 61 75  a PARTITION clau
12e80 73 65 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20 67  se, this block g
12e90 65 6e 65 72 61 74 65 73 20 0a 20 20 2a 2a 20 56  enerates .  ** V
12ea0 4d 20 63 6f 64 65 20 74 6f 20 63 68 65 63 6b 20  M code to check 
12eb0 69 66 20 74 68 65 20 69 6e 70 75 74 20 72 6f 77  if the input row
12ec0 20 69 73 20 74 68 65 20 73 74 61 72 74 20 6f 66   is the start of
12ed0 20 61 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e   a new partition
12ee0 2e 0a 20 20 2a 2a 20 49 66 20 73 6f 2c 20 69 74  ..  ** If so, it
12ef0 20 64 6f 65 73 20 61 6e 20 4f 50 5f 47 6f 73 75   does an OP_Gosu
12f00 62 20 74 6f 20 61 6e 20 61 64 64 72 65 73 73 20  b to an address 
12f10 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 69 6e 20  to be filled in 
12f20 6c 61 74 65 72 2e 20 54 68 65 0a 20 20 2a 2a 20  later. The.  ** 
12f30 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f  address of the O
12f40 50 5f 47 6f 73 75 62 20 69 73 20 73 74 6f 72 65  P_Gosub is store
12f50 64 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61  d in local varia
12f60 62 6c 65 20 61 64 64 72 47 6f 73 75 62 46 6c 75  ble addrGosubFlu
12f70 73 68 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57  sh. */.  if( pMW
12f80 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 29  in->pPartition )
12f90 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a  {.    int addr;.
12fa0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 50      ExprList *pP
12fb0 61 72 74 20 3d 20 70 4d 57 69 6e 2d 3e 70 50 61  art = pMWin->pPa
12fc0 72 74 69 74 69 6f 6e 3b 0a 20 20 20 20 69 6e 74  rtition;.    int
12fd0 20 6e 50 61 72 74 20 3d 20 70 50 61 72 74 2d 3e   nPart = pPart->
12fe0 6e 45 78 70 72 3b 0a 20 20 20 20 69 6e 74 20 72  nExpr;.    int r
12ff0 65 67 4e 65 77 50 61 72 74 20 3d 20 72 65 67 4e  egNewPart = regN
13000 65 77 20 2b 20 70 4d 57 69 6e 2d 3e 6e 42 75 66  ew + pMWin->nBuf
13010 66 65 72 43 6f 6c 3b 0a 20 20 20 20 4b 65 79 49  ferCol;.    KeyI
13020 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
13030 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72  sqlite3KeyInfoFr
13040 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
13050 65 2c 20 70 50 61 72 74 2c 20 30 2c 20 30 29 3b  e, pPart, 0, 0);
13060 0a 0a 20 20 20 20 72 65 67 46 6c 75 73 68 50 61  ..    regFlushPa
13070 72 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rt = ++pParse->n
13080 4d 65 6d 3b 0a 20 20 20 20 61 64 64 72 20 3d 20  Mem;.    addr = 
13090 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
130a0 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  3(v, OP_Compare,
130b0 20 72 65 67 4e 65 77 50 61 72 74 2c 20 70 4d 57   regNewPart, pMW
130c0 69 6e 2d 3e 72 65 67 50 61 72 74 2c 20 6e 50 61  in->regPart, nPa
130d0 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rt);.    sqlite3
130e0 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20  VdbeAppendP4(v, 
130f0 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2c  (void*)pKeyInfo,
13100 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
13110 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13120 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
13130 61 64 64 72 2b 32 2c 20 61 64 64 72 2b 34 2c 20  addr+2, addr+4, 
13140 61 64 64 72 2b 32 29 3b 0a 20 20 20 20 56 64 62  addr+2);.    Vdb
13150 65 43 6f 76 65 72 61 67 65 45 71 4e 65 28 76 29  eCoverageEqNe(v)
13160 3b 0a 20 20 20 20 61 64 64 72 47 6f 73 75 62 46  ;.    addrGosubF
13170 6c 75 73 68 20 3d 20 73 71 6c 69 74 65 33 56 64  lush = sqlite3Vd
13180 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 47  beAddOp1(v, OP_G
13190 6f 73 75 62 2c 20 72 65 67 46 6c 75 73 68 50 61  osub, regFlushPa
131a0 72 74 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  rt);.    VdbeCom
131b0 6d 65 6e 74 28 28 76 2c 20 22 63 61 6c 6c 20 66  ment((v, "call f
131c0 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 29  lush_partition")
131d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
131e0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
131f0 6f 70 79 2c 20 72 65 67 4e 65 77 50 61 72 74 2c  opy, regNewPart,
13200 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c   pMWin->regPart,
13210 20 6e 50 61 72 74 2d 31 29 3b 0a 20 20 7d 0a 0a   nPart-1);.  }..
13220 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20    /* Insert the 
13230 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20 74 68 65  new row into the
13240 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
13250 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
13260 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
13270 77 52 6f 77 69 64 2c 20 63 73 72 57 72 69 74 65  wRowid, csrWrite
13280 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 73  , regRowid);.  s
13290 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
132a0 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 63  (v, OP_Insert, c
132b0 73 72 57 72 69 74 65 2c 20 72 65 67 52 65 63 6f  srWrite, regReco
132c0 72 64 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 0a  rd, regRowid);..
132d0 20 20 61 64 64 72 49 66 4e 6f 74 20 3d 20 73 71    addrIfNot = sq
132e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
132f0 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 70 4d 57  v, OP_IfNot, pMW
13300 69 6e 2d 3e 72 65 67 46 69 72 73 74 29 3b 0a 0a  in->regFirst);..
13310 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
13320 69 73 20 72 75 6e 20 66 6f 72 20 74 68 65 20 66  is run for the f
13330 69 72 73 74 20 72 6f 77 20 6f 66 20 65 61 63 68  irst row of each
13340 20 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 20 20   partition */.  
13350 73 2e 72 65 67 41 72 67 20 3d 20 77 69 6e 64 6f  s.regArg = windo
13360 77 49 6e 69 74 41 63 63 75 6d 28 70 50 61 72 73  wInitAccum(pPars
13370 65 2c 20 70 4d 57 69 6e 29 3b 0a 0a 20 20 69 66  e, pMWin);..  if
13380 28 20 72 65 67 53 74 61 72 74 20 29 7b 0a 20 20  ( regStart ){.  
13390 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
133a0 65 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2d  e(pParse, pMWin-
133b0 3e 70 53 74 61 72 74 2c 20 72 65 67 53 74 61 72  >pStart, regStar
133c0 74 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43 68  t);.    windowCh
133d0 65 63 6b 56 61 6c 75 65 28 70 50 61 72 73 65 2c  eckValue(pParse,
133e0 20 72 65 67 53 74 61 72 74 2c 20 30 20 2b 20 28   regStart, 0 + (
133f0 70 4d 57 69 6e 2d 3e 65 54 79 70 65 3d 3d 54 4b  pMWin->eType==TK
13400 5f 52 41 4e 47 45 20 3f 20 33 20 3a 20 30 29 29  _RANGE ? 3 : 0))
13410 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 67 45  ;.  }.  if( regE
13420 6e 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  nd ){.    sqlite
13430 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
13440 2c 20 70 4d 57 69 6e 2d 3e 70 45 6e 64 2c 20 72  , pMWin->pEnd, r
13450 65 67 45 6e 64 29 3b 0a 20 20 20 20 77 69 6e 64  egEnd);.    wind
13460 6f 77 43 68 65 63 6b 56 61 6c 75 65 28 70 50 61  owCheckValue(pPa
13470 72 73 65 2c 20 72 65 67 45 6e 64 2c 20 31 20 2b  rse, regEnd, 1 +
13480 20 28 70 4d 57 69 6e 2d 3e 65 54 79 70 65 3d 3d   (pMWin->eType==
13490 54 4b 5f 52 41 4e 47 45 20 3f 20 33 20 3a 20 30  TK_RANGE ? 3 : 0
134a0 29 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  ));.  }..  if( p
134b0 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 70 4d  MWin->eStart==pM
134c0 57 69 6e 2d 3e 65 45 6e 64 20 26 26 20 72 65 67  Win->eEnd && reg
134d0 53 74 61 72 74 20 26 26 20 72 65 67 45 6e 64 20  Start && regEnd 
134e0 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  ){.    int op = 
134f0 28 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d  ((pMWin->eStart=
13500 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 29 20 3f  =TK_FOLLOWING) ?
13510 20 4f 50 5f 47 65 20 3a 20 4f 50 5f 4c 65 29 3b   OP_Ge : OP_Le);
13520 0a 20 20 20 20 69 6e 74 20 61 64 64 72 47 65 20  .    int addrGe 
13530 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
13540 4f 70 33 28 76 2c 20 6f 70 2c 20 72 65 67 53 74  Op3(v, op, regSt
13550 61 72 74 2c 20 30 2c 20 72 65 67 45 6e 64 29 3b  art, 0, regEnd);
13560 0a 20 20 20 20 77 69 6e 64 6f 77 41 67 67 46 69  .    windowAggFi
13570 6e 61 6c 28 70 50 61 72 73 65 2c 20 70 4d 57 69  nal(pParse, pMWi
13580 6e 2c 20 73 2e 72 65 67 41 72 67 2c 20 30 29 3b  n, s.regArg, 0);
13590 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
135a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
135b0 69 6e 64 2c 20 73 2e 63 75 72 72 65 6e 74 2e 63  ind, s.current.c
135c0 73 72 2c 20 31 29 3b 0a 20 20 20 20 77 69 6e 64  sr, 1);.    wind
135d0 6f 77 52 65 74 75 72 6e 4f 6e 65 52 6f 77 28 70  owReturnOneRow(p
135e0 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 72 65  Parse, pMWin, re
135f0 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75  gGosub, addrGosu
13600 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
13610 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
13620 52 65 73 65 74 53 6f 72 74 65 72 2c 20 73 2e 63  ResetSorter, s.c
13630 75 72 72 65 6e 74 2e 63 73 72 29 3b 0a 20 20 20  urrent.csr);.   
13640 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13650 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
13660 2c 20 6c 62 6c 57 68 65 72 65 45 6e 64 29 3b 0a  , lblWhereEnd);.
13670 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
13680 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 47  umpHere(v, addrG
13690 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d  e);.  }.  if( pM
136a0 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
136b0 46 4f 4c 4c 4f 57 49 4e 47 20 26 26 20 70 4d 57  FOLLOWING && pMW
136c0 69 6e 2d 3e 65 54 79 70 65 21 3d 54 4b 5f 52 41  in->eType!=TK_RA
136d0 4e 47 45 20 26 26 20 72 65 67 45 6e 64 20 29 7b  NGE && regEnd ){
136e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 57  .    assert( pMW
136f0 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c  in->eEnd==TK_FOL
13700 4c 4f 57 49 4e 47 20 29 3b 0a 20 20 20 20 73 71  LOWING );.    sq
13710 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
13720 76 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20  v, OP_Subtract, 
13730 72 65 67 53 74 61 72 74 2c 20 72 65 67 45 6e 64  regStart, regEnd
13740 2c 20 72 65 67 53 74 61 72 74 29 3b 0a 20 20 7d  , regStart);.  }
13750 0a 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65  ..  if( pMWin->e
13760 53 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e  Start!=TK_UNBOUN
13770 44 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  DED ){.    sqlit
13780 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13790 4f 50 5f 52 65 77 69 6e 64 2c 20 73 2e 73 74 61  OP_Rewind, s.sta
137a0 72 74 2e 63 73 72 2c 20 31 29 3b 0a 20 20 7d 0a  rt.csr, 1);.  }.
137b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
137c0 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
137d0 2c 20 73 2e 63 75 72 72 65 6e 74 2e 63 73 72 2c  , s.current.csr,
137e0 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   1);.  sqlite3Vd
137f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
13800 65 77 69 6e 64 2c 20 73 2e 65 6e 64 2e 63 73 72  ewind, s.end.csr
13810 2c 20 31 29 3b 0a 20 20 69 66 28 20 72 65 67 50  , 1);.  if( regP
13820 65 65 72 20 26 26 20 70 4f 72 64 65 72 42 79 20  eer && pOrderBy 
13830 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
13840 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
13850 6f 70 79 2c 20 72 65 67 4e 65 77 50 65 65 72 2c  opy, regNewPeer,
13860 20 72 65 67 50 65 65 72 2c 20 70 4f 72 64 65 72   regPeer, pOrder
13870 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20  By->nExpr-1);.  
13880 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13890 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op3(v, OP_Copy, 
138a0 72 65 67 50 65 65 72 2c 20 73 2e 73 74 61 72 74  regPeer, s.start
138b0 2e 72 65 67 2c 20 70 4f 72 64 65 72 42 79 2d 3e  .reg, pOrderBy->
138c0 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 73 71  nExpr-1);.    sq
138d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
138e0 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 50  v, OP_Copy, regP
138f0 65 65 72 2c 20 73 2e 63 75 72 72 65 6e 74 2e 72  eer, s.current.r
13900 65 67 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  eg, pOrderBy->nE
13910 78 70 72 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69  xpr-1);.    sqli
13920 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
13930 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 50 65 65   OP_Copy, regPee
13940 72 2c 20 73 2e 65 6e 64 2e 72 65 67 2c 20 70 4f  r, s.end.reg, pO
13950 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31 29  rderBy->nExpr-1)
13960 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
13970 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13980 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 4d 57  _Integer, 0, pMW
13990 69 6e 2d 3e 72 65 67 46 69 72 73 74 29 3b 0a 20  in->regFirst);. 
139a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
139b0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
139c0 2c 20 6c 62 6c 57 68 65 72 65 45 6e 64 29 3b 0a  , lblWhereEnd);.
139d0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
139e0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 66  mpHere(v, addrIf
139f0 4e 6f 74 29 3b 0a 20 20 69 66 28 20 72 65 67 50  Not);.  if( regP
13a00 65 65 72 20 29 7b 0a 20 20 20 20 77 69 6e 64 6f  eer ){.    windo
13a10 77 49 66 4e 65 77 50 65 65 72 28 70 50 61 72 73  wIfNewPeer(pPars
13a20 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 72 65 67  e, pOrderBy, reg
13a30 4e 65 77 50 65 65 72 2c 20 72 65 67 50 65 65 72  NewPeer, regPeer
13a40 2c 20 6c 62 6c 57 68 65 72 65 45 6e 64 29 3b 0a  , lblWhereEnd);.
13a50 20 20 7d 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d    }.  if( pMWin-
13a60 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c  >eStart==TK_FOLL
13a70 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 77 69 6e  OWING ){.    win
13a80 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49  dowCodeOp(&s, WI
13a90 4e 44 4f 57 5f 41 47 47 53 54 45 50 2c 20 30 2c  NDOW_AGGSTEP, 0,
13aa0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 57   0);.    if( pMW
13ab0 69 6e 2d 3e 65 45 6e 64 21 3d 54 4b 5f 55 4e 42  in->eEnd!=TK_UNB
13ac0 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20 20 20 20  OUNDED ){.      
13ad0 69 66 28 20 70 4d 57 69 6e 2d 3e 65 54 79 70 65  if( pMWin->eType
13ae0 3d 3d 54 4b 5f 52 41 4e 47 45 20 29 7b 0a 20 20  ==TK_RANGE ){.  
13af0 20 20 20 20 20 20 69 6e 74 20 6c 62 6c 20 3d 20        int lbl = 
13b00 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
13b10 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  abel(pParse);.  
13b20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65        int addrNe
13b30 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  xt = sqlite3Vdbe
13b40 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
13b50 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f          windowCo
13b60 64 65 52 61 6e 67 65 54 65 73 74 28 26 73 2c 20  deRangeTest(&s, 
13b70 4f 50 5f 47 65 2c 20 73 2e 63 75 72 72 65 6e 74  OP_Ge, s.current
13b80 2e 63 73 72 2c 20 72 65 67 45 6e 64 2c 20 73 2e  .csr, regEnd, s.
13b90 65 6e 64 2e 63 73 72 2c 20 6c 62 6c 29 3b 0a 20  end.csr, lbl);. 
13ba0 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64         windowCod
13bb0 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41  eOp(&s, WINDOW_A
13bc0 47 47 49 4e 56 45 52 53 45 2c 20 72 65 67 53 74  GGINVERSE, regSt
13bd0 61 72 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  art, 0);.       
13be0 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73   windowCodeOp(&s
13bf0 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f  , WINDOW_RETURN_
13c00 52 4f 57 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ROW, 0, 0);.    
13c10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13c20 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
13c30 2c 20 30 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a  , 0, addrNext);.
13c40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
13c50 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
13c60 76 2c 20 6c 62 6c 29 3b 0a 20 20 20 20 20 20 7d  v, lbl);.      }
13c70 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 77 69  else{.        wi
13c80 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57  ndowCodeOp(&s, W
13c90 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57  INDOW_RETURN_ROW
13ca0 2c 20 72 65 67 45 6e 64 2c 20 30 29 3b 0a 20 20  , regEnd, 0);.  
13cb0 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65        windowCode
13cc0 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47  Op(&s, WINDOW_AG
13cd0 47 49 4e 56 45 52 53 45 2c 20 72 65 67 53 74 61  GINVERSE, regSta
13ce0 72 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  rt, 0);.      }.
13cf0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 20 20      }.  }else.  
13d00 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d  if( pMWin->eEnd=
13d10 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 29 7b  =TK_PRECEDING ){
13d20 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f  .    windowCodeO
13d30 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47  p(&s, WINDOW_AGG
13d40 53 54 45 50 2c 20 72 65 67 45 6e 64 2c 20 30 29  STEP, regEnd, 0)
13d50 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65  ;.    windowCode
13d60 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45  Op(&s, WINDOW_RE
13d70 54 55 52 4e 5f 52 4f 57 2c 20 30 2c 20 30 29 3b  TURN_ROW, 0, 0);
13d80 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f  .    windowCodeO
13d90 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47  p(&s, WINDOW_AGG
13da0 49 4e 56 45 52 53 45 2c 20 72 65 67 53 74 61 72  INVERSE, regStar
13db0 74 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t, 0);.  }else{.
13dc0 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
13dd0 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26    windowCodeOp(&
13de0 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 53 54 45  s, WINDOW_AGGSTE
13df0 50 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  P, 0, 0);.    if
13e00 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 21 3d 54  ( pMWin->eEnd!=T
13e10 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20  K_UNBOUNDED ){. 
13e20 20 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e       if( pMWin->
13e30 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 20  eType==TK_RANGE 
13e40 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c  ){.        int l
13e50 62 6c 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72  bl;.        addr
13e60 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
13e70 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
13e80 20 20 20 20 20 20 69 66 28 20 72 65 67 45 6e 64        if( regEnd
13e90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 62   ){.          lb
13ea0 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  l = sqlite3VdbeM
13eb0 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
13ec0 3b 0a 20 20 20 20 20 20 20 20 20 20 77 69 6e 64  ;.          wind
13ed0 6f 77 43 6f 64 65 52 61 6e 67 65 54 65 73 74 28  owCodeRangeTest(
13ee0 26 73 2c 20 4f 50 5f 47 65 2c 20 73 2e 63 75 72  &s, OP_Ge, s.cur
13ef0 72 65 6e 74 2e 63 73 72 2c 20 72 65 67 45 6e 64  rent.csr, regEnd
13f00 2c 20 73 2e 65 6e 64 2e 63 73 72 2c 20 6c 62 6c  , s.end.csr, lbl
13f10 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
13f20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f       windowCodeO
13f30 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54  p(&s, WINDOW_RET
13f40 55 52 4e 5f 52 4f 57 2c 20 30 2c 20 30 29 3b 0a  URN_ROW, 0, 0);.
13f50 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f          windowCo
13f60 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f  deOp(&s, WINDOW_
13f70 41 47 47 49 4e 56 45 52 53 45 2c 20 72 65 67 53  AGGINVERSE, regS
13f80 74 61 72 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  tart, 0);.      
13f90 20 20 69 66 28 20 72 65 67 45 6e 64 20 29 7b 0a    if( regEnd ){.
13fa0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
13fb0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13fc0 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 29  P_Goto, 0, addr)
13fd0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
13fe0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
13ff0 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20 20 20  bel(v, lbl);.   
14000 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
14010 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
14020 72 65 67 45 6e 64 20 29 20 61 64 64 72 20 3d 20  regEnd ) addr = 
14030 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14040 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 72  3(v, OP_IfPos, r
14050 65 67 45 6e 64 2c 20 30 2c 20 31 29 3b 0a 20 20  egEnd, 0, 1);.  
14060 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65        windowCode
14070 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45  Op(&s, WINDOW_RE
14080 54 55 52 4e 5f 52 4f 57 2c 20 30 2c 20 30 29 3b  TURN_ROW, 0, 0);
14090 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43  .        windowC
140a0 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57  odeOp(&s, WINDOW
140b0 5f 41 47 47 49 4e 56 45 52 53 45 2c 20 72 65 67  _AGGINVERSE, reg
140c0 53 74 61 72 74 2c 20 30 29 3b 0a 20 20 20 20 20  Start, 0);.     
140d0 20 20 20 69 66 28 20 72 65 67 45 6e 64 20 29 20     if( regEnd ) 
140e0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
140f0 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
14100 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
14110 0a 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65  .  /* End of the
14120 20 6d 61 69 6e 20 69 6e 70 75 74 20 6c 6f 6f 70   main input loop
14130 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
14140 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
14150 20 6c 62 6c 57 68 65 72 65 45 6e 64 29 3b 0a 20   lblWhereEnd);. 
14160 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
14170 28 70 57 49 6e 66 6f 29 3b 0a 0a 20 20 2f 2a 20  (pWInfo);..  /* 
14180 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a  Fall through */.
14190 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70 50 61    if( pMWin->pPa
141a0 72 74 69 74 69 6f 6e 20 29 7b 0a 20 20 20 20 61  rtition ){.    a
141b0 64 64 72 49 6e 74 65 67 65 72 20 3d 20 73 71 6c  ddrInteger = sql
141c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
141d0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
141e0 20 72 65 67 46 6c 75 73 68 50 61 72 74 29 3b 0a   regFlushPart);.
141f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
14200 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 47  umpHere(v, addrG
14210 6f 73 75 62 46 6c 75 73 68 29 3b 0a 20 20 7d 0a  osubFlush);.  }.
14220 0a 20 20 61 64 64 72 45 6d 70 74 79 20 3d 20 73  .  addrEmpty = s
14230 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
14240 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 63  (v, OP_Rewind, c
14250 73 72 57 72 69 74 65 29 3b 0a 20 20 69 66 28 20  srWrite);.  if( 
14260 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f  pMWin->eEnd==TK_
14270 50 52 45 43 45 44 49 4e 47 20 29 7b 0a 20 20 20  PRECEDING ){.   
14280 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73   windowCodeOp(&s
14290 2c 20 57 49 4e 44 4f 57 5f 41 47 47 53 54 45 50  , WINDOW_AGGSTEP
142a0 2c 20 72 65 67 45 6e 64 2c 20 30 29 3b 0a 20 20  , regEnd, 0);.  
142b0 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26    windowCodeOp(&
142c0 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e  s, WINDOW_RETURN
142d0 5f 52 4f 57 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  _ROW, 0, 0);.  }
142e0 65 6c 73 65 20 69 66 28 20 70 4d 57 69 6e 2d 3e  else if( pMWin->
142f0 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f  eStart==TK_FOLLO
14300 57 49 4e 47 20 29 7b 0a 20 20 20 20 69 6e 74 20  WING ){.    int 
14310 61 64 64 72 53 74 61 72 74 3b 0a 20 20 20 20 69  addrStart;.    i
14320 6e 74 20 61 64 64 72 42 72 65 61 6b 31 3b 0a 20  nt addrBreak1;. 
14330 20 20 20 69 6e 74 20 61 64 64 72 42 72 65 61 6b     int addrBreak
14340 32 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 42  2;.    int addrB
14350 72 65 61 6b 33 3b 0a 20 20 20 20 77 69 6e 64 6f  reak3;.    windo
14360 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44  wCodeOp(&s, WIND
14370 4f 57 5f 41 47 47 53 54 45 50 2c 20 30 2c 20 30  OW_AGGSTEP, 0, 0
14380 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e  );.    if( pMWin
14390 2d 3e 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47  ->eType==TK_RANG
143a0 45 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 53  E ){.      addrS
143b0 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
143c0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
143d0 3b 0a 20 20 20 20 20 20 61 64 64 72 42 72 65 61  ;.      addrBrea
143e0 6b 32 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f  k2 = windowCodeO
143f0 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47  p(&s, WINDOW_AGG
14400 49 4e 56 45 52 53 45 2c 20 72 65 67 53 74 61 72  INVERSE, regStar
14410 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 64 64  t, 1);.      add
14420 72 42 72 65 61 6b 31 20 3d 20 77 69 6e 64 6f 77  rBreak1 = window
14430 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f  CodeOp(&s, WINDO
14440 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 30 2c  W_RETURN_ROW, 0,
14450 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 20   1);.    }else. 
14460 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45     if( pMWin->eE
14470 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  nd==TK_UNBOUNDED
14480 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 53 74   ){.      addrSt
14490 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
144a0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
144b0 0a 20 20 20 20 20 20 61 64 64 72 42 72 65 61 6b  .      addrBreak
144c0 31 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70  1 = windowCodeOp
144d0 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55  (&s, WINDOW_RETU
144e0 52 4e 5f 52 4f 57 2c 20 72 65 67 53 74 61 72 74  RN_ROW, regStart
144f0 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 64 64 72  , 1);.      addr
14500 42 72 65 61 6b 32 20 3d 20 77 69 6e 64 6f 77 43  Break2 = windowC
14510 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57  odeOp(&s, WINDOW
14520 5f 41 47 47 49 4e 56 45 52 53 45 2c 20 30 2c 20  _AGGINVERSE, 0, 
14530 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  1);.    }else{. 
14540 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 57       assert( pMW
14550 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c  in->eEnd==TK_FOL
14560 4c 4f 57 49 4e 47 20 29 3b 0a 20 20 20 20 20 20  LOWING );.      
14570 61 64 64 72 53 74 61 72 74 20 3d 20 73 71 6c 69  addrStart = sqli
14580 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
14590 64 72 28 76 29 3b 0a 20 20 20 20 20 20 61 64 64  dr(v);.      add
145a0 72 42 72 65 61 6b 31 20 3d 20 77 69 6e 64 6f 77  rBreak1 = window
145b0 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f  CodeOp(&s, WINDO
145c0 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 72 65  W_RETURN_ROW, re
145d0 67 45 6e 64 2c 20 31 29 3b 0a 20 20 20 20 20 20  gEnd, 1);.      
145e0 61 64 64 72 42 72 65 61 6b 32 20 3d 20 77 69 6e  addrBreak2 = win
145f0 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49  dowCodeOp(&s, WI
14600 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 2c  NDOW_AGGINVERSE,
14610 20 72 65 67 53 74 61 72 74 2c 20 31 29 3b 0a 20   regStart, 1);. 
14620 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
14630 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14640 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 53 74  _Goto, 0, addrSt
14650 61 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  art);.    sqlite
14660 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
14670 20 61 64 64 72 42 72 65 61 6b 32 29 3b 0a 20 20   addrBreak2);.  
14680 20 20 61 64 64 72 53 74 61 72 74 20 3d 20 73 71    addrStart = sq
14690 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
146a0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 61 64 64  Addr(v);.    add
146b0 72 42 72 65 61 6b 33 20 3d 20 77 69 6e 64 6f 77  rBreak3 = window
146c0 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f  CodeOp(&s, WINDO
146d0 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 30 2c  W_RETURN_ROW, 0,
146e0 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
146f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14700 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 53 74  _Goto, 0, addrSt
14710 61 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  art);.    sqlite
14720 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
14730 20 61 64 64 72 42 72 65 61 6b 31 29 3b 0a 20 20   addrBreak1);.  
14740 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
14750 70 48 65 72 65 28 76 2c 20 61 64 64 72 42 72 65  pHere(v, addrBre
14760 61 6b 33 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ak3);.  }else{. 
14770 20 20 20 69 6e 74 20 61 64 64 72 42 72 65 61 6b     int addrBreak
14780 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 53 74  ;.    int addrSt
14790 61 72 74 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43  art;.    windowC
147a0 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57  odeOp(&s, WINDOW
147b0 5f 41 47 47 53 54 45 50 2c 20 30 2c 20 30 29 3b  _AGGSTEP, 0, 0);
147c0 0a 20 20 20 20 61 64 64 72 53 74 61 72 74 20 3d  .    addrStart =
147d0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
147e0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
147f0 61 64 64 72 42 72 65 61 6b 20 3d 20 77 69 6e 64  addrBreak = wind
14800 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e  owCodeOp(&s, WIN
14810 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20  DOW_RETURN_ROW, 
14820 30 2c 20 31 29 3b 0a 20 20 20 20 77 69 6e 64 6f  0, 1);.    windo
14830 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44  wCodeOp(&s, WIND
14840 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 2c 20 72  OW_AGGINVERSE, r
14850 65 67 53 74 61 72 74 2c 20 30 29 3b 0a 20 20 20  egStart, 0);.   
14860 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14870 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
14880 2c 20 61 64 64 72 53 74 61 72 74 29 3b 0a 20 20  , addrStart);.  
14890 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
148a0 70 48 65 72 65 28 76 2c 20 61 64 64 72 42 72 65  pHere(v, addrBre
148b0 61 6b 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ak);.  }.  sqlit
148c0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
148d0 2c 20 61 64 64 72 45 6d 70 74 79 29 3b 0a 0a 20  , addrEmpty);.. 
148e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
148f0 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f  p1(v, OP_ResetSo
14900 72 74 65 72 2c 20 73 2e 63 75 72 72 65 6e 74 2e  rter, s.current.
14910 63 73 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  csr);.  sqlite3V
14920 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14930 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4d 57 69  Integer, 1, pMWi
14940 6e 2d 3e 72 65 67 46 69 72 73 74 29 3b 0a 20 20  n->regFirst);.  
14950 69 66 28 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74  if( pMWin->pPart
14960 69 74 69 6f 6e 20 29 7b 0a 20 20 20 20 69 66 28  ition ){.    if(
14970 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72 74   pMWin->regStart
14980 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 73  Rowid ){.      s
14990 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
149a0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
149b0 31 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61  1, pMWin->regSta
149c0 72 74 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  rtRowid);.      
149d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
149e0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
149f0 20 30 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 45 6e   0, pMWin->regEn
14a00 64 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 20  dRowid);.    }. 
14a10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
14a20 61 6e 67 65 50 31 28 76 2c 20 61 64 64 72 49 6e  angeP1(v, addrIn
14a30 74 65 67 65 72 2c 20 73 71 6c 69 74 65 33 56 64  teger, sqlite3Vd
14a40 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
14a50 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
14a60 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
14a70 65 74 75 72 6e 2c 20 72 65 67 46 6c 75 73 68 50  eturn, regFlushP
14a80 61 72 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 65 6e  art);.  }.}..#en
14a90 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
14aa0 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f  IT_WINDOWFUNC */
14ab0 0a                                               .