/ Hex Artifact Content
Login

Artifact a63ef839f4987d789cb595a38cf5063a38ab47bb1d0357af65121363fae4734d:


0000: 2f 2a 0a 2a 2a 20 32 30 31 38 20 4d 61 79 20 30  /*.** 2018 May 0
0010: 38 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  8.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
0180: 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 6e  liteInt.h"..#ifn
0190: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
01a0: 57 49 4e 44 4f 57 46 55 4e 43 0a 0a 2f 2a 0a 2a  WINDOWFUNC../*.*
01b0: 2a 20 53 45 4c 45 43 54 20 52 45 57 52 49 54 49  * SELECT REWRITI
01c0: 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 41 6e 79 20 53  NG.**.**   Any S
01d0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
01e0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  that contains on
01f0: 65 20 6f 72 20 6d 6f 72 65 20 77 69 6e 64 6f 77  e or more window
0200: 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 0a 2a 2a   functions in.**
0210: 20 20 20 65 69 74 68 65 72 20 74 68 65 20 73 65     either the se
0220: 6c 65 63 74 20 6c 69 73 74 20 6f 72 20 4f 52 44  lect list or ORD
0230: 45 52 20 42 59 20 63 6c 61 75 73 65 20 28 74 68  ER BY clause (th
0240: 65 20 6f 6e 6c 79 20 74 77 6f 20 70 6c 61 63 65  e only two place
0250: 73 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20 66 75  s window.**   fu
0260: 6e 63 74 69 6f 6e 73 20 6d 61 79 20 62 65 20 75  nctions may be u
0270: 73 65 64 29 20 69 73 20 74 72 61 6e 73 66 6f 72  sed) is transfor
0280: 6d 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20  med by function 
0290: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 52 65 77  sqlite3WindowRew
02a0: 72 69 74 65 28 29 0a 2a 2a 20 20 20 69 6e 20 6f  rite().**   in o
02b0: 72 64 65 72 20 74 6f 20 73 75 70 70 6f 72 74 20  rder to support 
02c0: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
02d0: 70 72 6f 63 65 73 73 69 6e 67 2e 20 46 6f 72 20  processing. For 
02e0: 65 78 61 6d 70 6c 65 2c 20 77 69 74 68 20 74 68  example, with th
02f0: 65 0a 2a 2a 20 20 20 73 63 68 65 6d 61 3a 0a 2a  e.**   schema:.*
0300: 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20  *.**     CREATE 
0310: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63  TABLE t1(a, b, c
0320: 2c 20 64 2c 20 65 2c 20 66 2c 20 67 29 3b 0a 2a  , d, e, f, g);.*
0330: 2a 0a 2a 2a 20 20 20 74 68 65 20 73 74 61 74 65  *.**   the state
0340: 6d 65 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment:.**.**     
0350: 53 45 4c 45 43 54 20 61 2b 31 2c 20 6d 61 78 28  SELECT a+1, max(
0360: 62 29 20 4f 56 45 52 20 28 50 41 52 54 49 54 49  b) OVER (PARTITI
0370: 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20 42 59  ON BY c ORDER BY
0380: 20 64 29 20 46 52 4f 4d 20 74 31 20 4f 52 44 45   d) FROM t1 ORDE
0390: 52 20 42 59 20 65 3b 0a 2a 2a 0a 2a 2a 20 20 20  R BY e;.**.**   
03a0: 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74  is transformed t
03b0: 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  o:.**.**     SEL
03c0: 45 43 54 20 61 2b 31 2c 20 6d 61 78 28 62 29 20  ECT a+1, max(b) 
03d0: 4f 56 45 52 20 28 50 41 52 54 49 54 49 4f 4e 20  OVER (PARTITION 
03e0: 42 59 20 63 20 4f 52 44 45 52 20 42 59 20 64 29  BY c ORDER BY d)
03f0: 20 46 52 4f 4d 20 28 0a 2a 2a 20 20 20 20 20 20   FROM (.**      
0400: 20 20 20 53 45 4c 45 43 54 20 61 2c 20 65 2c 20     SELECT a, e, 
0410: 63 2c 20 64 2c 20 62 20 46 52 4f 4d 20 74 31 20  c, d, b FROM t1 
0420: 4f 52 44 45 52 20 42 59 20 63 2c 20 64 0a 2a 2a  ORDER BY c, d.**
0430: 20 20 20 20 20 29 20 4f 52 44 45 52 20 42 59 20       ) ORDER BY 
0440: 65 3b 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66  e;.**.**   The f
0450: 6c 61 74 74 65 6e 69 6e 67 20 6f 70 74 69 6d 69  lattening optimi
0460: 7a 61 74 69 6f 6e 20 69 73 20 64 69 73 61 62 6c  zation is disabl
0470: 65 64 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69  ed when processi
0480: 6e 67 20 74 68 69 73 20 74 72 61 6e 73 66 6f 72  ng this transfor
0490: 6d 65 64 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  med.**   SELECT 
04a0: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
04b0: 61 6c 6c 6f 77 73 20 74 68 65 20 69 6d 70 6c 65  allows the imple
04c0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
04d0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
04e0: 0a 2a 2a 20 20 20 28 69 6e 20 74 68 69 73 20 63  .**   (in this c
04f0: 61 73 65 20 6d 61 78 28 29 29 20 74 6f 20 70 72  ase max()) to pr
0500: 6f 63 65 73 73 20 72 6f 77 73 20 73 6f 72 74 65  ocess rows sorte
0510: 64 20 69 6e 20 6f 72 64 65 72 20 6f 66 20 28 63  d in order of (c
0520: 2c 20 64 29 2c 20 77 68 69 63 68 0a 2a 2a 20 20  , d), which.**  
0530: 20 6d 61 6b 65 73 20 74 68 69 6e 67 73 20 65 61   makes things ea
0540: 73 69 65 72 20 66 6f 72 20 6f 62 76 69 6f 75 73  sier for obvious
0550: 20 72 65 61 73 6f 6e 73 2e 20 4d 6f 72 65 20 67   reasons. More g
0560: 65 6e 65 72 61 6c 6c 79 3a 0a 2a 2a 0a 2a 2a 20  enerally:.**.** 
0570: 20 20 20 20 2a 20 46 52 4f 4d 2c 20 57 48 45 52      * FROM, WHER
0580: 45 2c 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20  E, GROUP BY and 
0590: 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73 20 61  HAVING clauses a
05a0: 72 65 20 61 6c 6c 20 6d 6f 76 65 64 20 74 6f 20  re all moved to 
05b0: 0a 2a 2a 20 20 20 20 20 20 20 74 68 65 20 73 75  .**       the su
05c0: 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  b-query..**.**  
05d0: 20 20 20 2a 20 4f 52 44 45 52 20 42 59 2c 20 4c     * ORDER BY, L
05e0: 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
05f0: 72 65 6d 61 69 6e 20 70 61 72 74 20 6f 66 20 74  remain part of t
0600: 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 2e  he parent query.
0610: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 65 72  .**.**     * Ter
0620: 6d 69 6e 61 6c 73 20 66 72 6f 6d 20 65 61 63 68  minals from each
0630: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
0640: 6f 6e 20 74 72 65 65 73 20 74 68 61 74 20 6d 61  on trees that ma
0650: 6b 65 20 75 70 20 74 68 65 20 0a 2a 2a 20 20 20  ke up the .**   
0660: 20 20 20 20 73 65 6c 65 63 74 2d 6c 69 73 74 20      select-list 
0670: 61 6e 64 20 4f 52 44 45 52 20 42 59 20 65 78 70  and ORDER BY exp
0680: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20  ressions in the 
0690: 70 61 72 65 6e 74 20 71 75 65 72 79 20 61 72 65  parent query are
06a0: 0a 2a 2a 20 20 20 20 20 20 20 73 65 6c 65 63 74  .**       select
06b0: 65 64 20 62 79 20 74 68 65 20 73 75 62 2d 71 75  ed by the sub-qu
06c0: 65 72 79 2e 20 46 6f 72 20 74 68 65 20 70 75 72  ery. For the pur
06d0: 70 6f 73 65 73 20 6f 66 20 74 68 65 20 74 72 61  poses of the tra
06e0: 6e 73 66 6f 72 6d 61 74 69 6f 6e 2c 0a 2a 2a 20  nsformation,.** 
06f0: 20 20 20 20 20 20 74 65 72 6d 69 6e 61 6c 73 20        terminals 
0700: 61 72 65 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72  are column refer
0710: 65 6e 63 65 73 20 61 6e 64 20 61 67 67 72 65 67  ences and aggreg
0720: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  ate functions..*
0730: 2a 0a 2a 2a 20 20 20 49 66 20 74 68 65 72 65 20  *.**   If there 
0740: 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  is more than one
0750: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
0760: 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 74   in the SELECT t
0770: 68 61 74 20 75 73 65 73 0a 2a 2a 20 20 20 74 68  hat uses.**   th
0780: 65 20 73 61 6d 65 20 77 69 6e 64 6f 77 20 64 65  e same window de
0790: 63 6c 61 72 61 74 69 6f 6e 20 28 74 68 65 20 4f  claration (the O
07a0: 56 45 52 20 62 69 74 29 2c 20 74 68 65 6e 20 61  VER bit), then a
07b0: 20 73 69 6e 67 6c 65 20 73 63 61 6e 20 6d 61 79   single scan may
07c0: 0a 2a 2a 20 20 20 62 65 20 75 73 65 64 20 74 6f  .**   be used to
07d0: 20 70 72 6f 63 65 73 73 20 6d 6f 72 65 20 74 68   process more th
07e0: 61 6e 20 6f 6e 65 20 77 69 6e 64 6f 77 20 66 75  an one window fu
07f0: 6e 63 74 69 6f 6e 2e 20 46 6f 72 20 65 78 61 6d  nction. For exam
0800: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ple:.**.**     S
0810: 45 4c 45 43 54 20 6d 61 78 28 62 29 20 4f 56 45  ELECT max(b) OVE
0820: 52 20 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20  R (PARTITION BY 
0830: 63 20 4f 52 44 45 52 20 42 59 20 64 29 2c 20 0a  c ORDER BY d), .
0840: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 6d 69  **            mi
0850: 6e 28 65 29 20 4f 56 45 52 20 28 50 41 52 54 49  n(e) OVER (PARTI
0860: 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20  TION BY c ORDER 
0870: 42 59 20 64 29 20 0a 2a 2a 20 20 20 20 20 46 52  BY d) .**     FR
0880: 4f 4d 20 74 31 3b 0a 2a 2a 0a 2a 2a 20 20 20 69  OM t1;.**.**   i
0890: 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  s transformed in
08a0: 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73   the same way as
08b0: 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f   the example abo
08c0: 76 65 2e 20 48 6f 77 65 76 65 72 3a 0a 2a 2a 0a  ve. However:.**.
08d0: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 6d 61  **     SELECT ma
08e0: 78 28 62 29 20 4f 56 45 52 20 28 50 41 52 54 49  x(b) OVER (PARTI
08f0: 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20  TION BY c ORDER 
0900: 42 59 20 64 29 2c 20 0a 2a 2a 20 20 20 20 20 20  BY d), .**      
0910: 20 20 20 20 20 20 6d 69 6e 28 65 29 20 4f 56 45        min(e) OVE
0920: 52 20 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20  R (PARTITION BY 
0930: 61 20 4f 52 44 45 52 20 42 59 20 62 29 20 0a 2a  a ORDER BY b) .*
0940: 2a 20 20 20 20 20 46 52 4f 4d 20 74 31 3b 0a 2a  *     FROM t1;.*
0950: 2a 0a 2a 2a 20 20 20 4d 75 73 74 20 62 65 20 74  *.**   Must be t
0960: 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 2a  ransformed to:.*
0970: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
0980: 6d 61 78 28 62 29 20 4f 56 45 52 20 28 50 41 52  max(b) OVER (PAR
0990: 54 49 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45  TITION BY c ORDE
09a0: 52 20 42 59 20 64 29 20 46 52 4f 4d 20 28 0a 2a  R BY d) FROM (.*
09b0: 2a 20 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  *         SELECT
09c0: 20 65 2c 20 6d 69 6e 28 65 29 20 4f 56 45 52 20   e, min(e) OVER 
09d0: 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20 61 20  (PARTITION BY a 
09e0: 4f 52 44 45 52 20 42 59 20 62 29 2c 20 63 2c 20  ORDER BY b), c, 
09f0: 64 2c 20 62 20 46 52 4f 4d 0a 2a 2a 20 20 20 20  d, b FROM.**    
0a00: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 2c         SELECT a,
0a10: 20 65 2c 20 63 2c 20 64 2c 20 62 20 46 52 4f 4d   e, c, d, b FROM
0a20: 20 74 31 20 4f 52 44 45 52 20 42 59 20 61 2c 20   t1 ORDER BY a, 
0a30: 62 0a 2a 2a 20 20 20 20 20 20 20 20 20 29 20 4f  b.**         ) O
0a40: 52 44 45 52 20 42 59 20 63 2c 20 64 0a 2a 2a 20  RDER BY c, d.** 
0a50: 20 20 20 20 29 20 4f 52 44 45 52 20 42 59 20 65      ) ORDER BY e
0a60: 3b 0a 2a 2a 0a 2a 2a 20 20 20 73 6f 20 74 68 61  ;.**.**   so tha
0a70: 74 20 62 6f 74 68 20 6d 69 6e 28 29 20 61 6e 64  t both min() and
0a80: 20 6d 61 78 28 29 20 6d 61 79 20 70 72 6f 63 65   max() may proce
0a90: 73 73 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6f  ss rows in the o
0aa0: 72 64 65 72 20 64 65 66 69 6e 65 64 20 62 79 0a  rder defined by.
0ab0: 2a 2a 20 20 20 74 68 65 69 72 20 72 65 73 70 65  **   their respe
0ac0: 63 74 69 76 65 20 77 69 6e 64 6f 77 20 64 65 63  ctive window dec
0ad0: 6c 61 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  larations..**.**
0ae0: 20 49 4e 54 45 52 46 41 43 45 20 57 49 54 48 20   INTERFACE WITH 
0af0: 53 45 4c 45 43 54 2e 43 0a 2a 2a 0a 2a 2a 20 20  SELECT.C.**.**  
0b00: 20 57 68 65 6e 20 70 72 6f 63 65 73 73 69 6e 67   When processing
0b10: 20 74 68 65 20 72 65 77 72 69 74 74 65 6e 20 53   the rewritten S
0b20: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
0b30: 20 63 6f 64 65 20 69 6e 20 73 65 6c 65 63 74 2e   code in select.
0b40: 63 20 63 61 6c 6c 73 0a 2a 2a 20 20 20 73 71 6c  c calls.**   sql
0b50: 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
0b60: 20 74 6f 20 62 65 67 69 6e 20 69 74 65 72 61 74   to begin iterat
0b70: 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68 65 20  ing through the 
0b80: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 0a 2a  results of the.*
0b90: 2a 20 20 20 73 75 62 2d 71 75 65 72 79 2c 20 77  *   sub-query, w
0ba0: 68 69 63 68 20 69 73 20 61 6c 77 61 79 73 20 69  hich is always i
0bb0: 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
0bc0: 63 6f 2d 72 6f 75 74 69 6e 65 2e 20 49 74 20 74  co-routine. It t
0bd0: 68 65 6e 20 63 61 6c 6c 73 0a 2a 2a 20 20 20 73  hen calls.**   s
0be0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65  qlite3WindowCode
0bf0: 53 74 65 70 28 29 20 74 6f 20 70 72 6f 63 65 73  Step() to proces
0c00: 73 20 72 6f 77 73 20 61 6e 64 20 66 69 6e 69 73  s rows and finis
0c10: 68 20 74 68 65 20 73 63 61 6e 20 62 79 20 63 61  h the scan by ca
0c20: 6c 6c 69 6e 67 0a 2a 2a 20 20 20 73 71 6c 69 74  lling.**   sqlit
0c30: 65 33 57 68 65 72 65 45 6e 64 28 29 2e 0a 2a 2a  e3WhereEnd()..**
0c40: 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 57 69 6e  .**   sqlite3Win
0c50: 64 6f 77 43 6f 64 65 53 74 65 70 28 29 20 67 65  dowCodeStep() ge
0c60: 6e 65 72 61 74 65 73 20 56 4d 20 63 6f 64 65 20  nerates VM code 
0c70: 73 6f 20 74 68 61 74 2c 20 66 6f 72 20 65 61 63  so that, for eac
0c80: 68 20 72 6f 77 20 72 65 74 75 72 6e 65 64 0a 2a  h row returned.*
0c90: 2a 20 20 20 62 79 20 74 68 65 20 73 75 62 2d 71  *   by the sub-q
0ca0: 75 65 72 79 20 61 20 73 75 62 2d 72 6f 75 74 69  uery a sub-routi
0cb0: 6e 65 20 28 4f 50 5f 47 6f 73 75 62 29 20 63 6f  ne (OP_Gosub) co
0cc0: 64 65 64 20 62 79 20 73 65 6c 65 63 74 2e 63 20  ded by select.c 
0cd0: 69 73 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2a 20 20  is invoked..**  
0ce0: 20 57 68 65 6e 20 74 68 65 20 73 75 62 2d 72 6f   When the sub-ro
0cf0: 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64  utine is invoked
0d00: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 68  :.**.**     * Th
0d10: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 61 6c 6c  e results of all
0d20: 20 77 69 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e   window-function
0d30: 73 20 66 6f 72 20 74 68 65 20 72 6f 77 20 61 72  s for the row ar
0d40: 65 20 73 74 6f 72 65 64 0a 2a 2a 20 20 20 20 20  e stored.**     
0d50: 20 20 69 6e 20 74 68 65 20 61 73 73 6f 63 69 61    in the associa
0d60: 74 65 64 20 57 69 6e 64 6f 77 2e 72 65 67 52 65  ted Window.regRe
0d70: 73 75 6c 74 20 72 65 67 69 73 74 65 72 73 2e 0a  sult registers..
0d80: 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 68 65 20  **.**     * The 
0d90: 72 65 71 75 69 72 65 64 20 74 65 72 6d 69 6e 61  required termina
0da0: 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f  l values are sto
0db0: 72 65 64 20 69 6e 20 74 68 65 20 63 75 72 72 65  red in the curre
0dc0: 6e 74 20 72 6f 77 20 6f 66 0a 2a 2a 20 20 20 20  nt row of.**    
0dd0: 20 20 20 74 65 6d 70 20 74 61 62 6c 65 20 57 69     temp table Wi
0de0: 6e 64 6f 77 2e 69 45 70 68 43 73 72 2e 0a 2a 2a  ndow.iEphCsr..**
0df0: 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 63 61  .**   In some ca
0e00: 73 65 73 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  ses, depending o
0e10: 6e 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61  n the window fra
0e20: 6d 65 20 61 6e 64 20 74 68 65 20 73 70 65 63 69  me and the speci
0e30: 66 69 63 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20  fic window.**   
0e40: 66 75 6e 63 74 69 6f 6e 73 20 69 6e 76 6f 6b 65  functions invoke
0e50: 64 2c 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  d, sqlite3Window
0e60: 43 6f 64 65 53 74 65 70 28 29 20 63 61 63 68 65  CodeStep() cache
0e70: 73 20 65 61 63 68 20 65 6e 74 69 72 65 20 70 61  s each entire pa
0e80: 72 74 69 74 69 6f 6e 0a 2a 2a 20 20 20 69 6e 20  rtition.**   in 
0e90: 61 20 74 65 6d 70 20 74 61 62 6c 65 20 62 65 66  a temp table bef
0ea0: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 61 6e  ore returning an
0eb0: 79 20 72 6f 77 73 2e 20 49 6e 20 6f 74 68 65 72  y rows. In other
0ec0: 20 63 61 73 65 73 20 69 74 20 64 6f 65 73 20 6e   cases it does n
0ed0: 6f 74 2e 0a 2a 2a 20 20 20 54 68 69 73 20 64 65  ot..**   This de
0ee0: 74 61 69 6c 20 69 73 20 65 6e 63 61 70 73 75 6c  tail is encapsul
0ef0: 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 69 73  ated within this
0f00: 20 66 69 6c 65 2c 20 74 68 65 20 63 6f 64 65 20   file, the code 
0f10: 67 65 6e 65 72 61 74 65 64 20 62 79 0a 2a 2a 20  generated by.** 
0f20: 20 20 73 65 6c 65 63 74 2e 63 20 69 73 20 74 68    select.c is th
0f30: 65 20 73 61 6d 65 20 69 6e 20 65 69 74 68 65 72  e same in either
0f40: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 55 49   case..**.** BUI
0f50: 4c 54 2d 49 4e 20 57 49 4e 44 4f 57 20 46 55 4e  LT-IN WINDOW FUN
0f60: 43 54 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 54  CTIONS.**.**   T
0f70: 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  his implementati
0f80: 6f 6e 20 66 65 61 74 75 72 65 73 20 74 68 65 20  on features the 
0f90: 66 6f 6c 6c 6f 77 69 6e 67 20 62 75 69 6c 74 2d  following built-
0fa0: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
0fb0: 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72  ons:.**.**     r
0fc0: 6f 77 5f 6e 75 6d 62 65 72 28 29 0a 2a 2a 20 20  ow_number().**  
0fd0: 20 20 20 72 61 6e 6b 28 29 0a 2a 2a 20 20 20 20     rank().**    
0fe0: 20 64 65 6e 73 65 5f 72 61 6e 6b 28 29 0a 2a 2a   dense_rank().**
0ff0: 20 20 20 20 20 70 65 72 63 65 6e 74 5f 72 61 6e       percent_ran
1000: 6b 28 29 0a 2a 2a 20 20 20 20 20 63 75 6d 65 5f  k().**     cume_
1010: 64 69 73 74 28 29 0a 2a 2a 20 20 20 20 20 6e 74  dist().**     nt
1020: 69 6c 65 28 4e 29 0a 2a 2a 20 20 20 20 20 6c 65  ile(N).**     le
1030: 61 64 28 65 78 70 72 20 5b 2c 20 6f 66 66 73 65  ad(expr [, offse
1040: 74 20 5b 2c 20 64 65 66 61 75 6c 74 5d 5d 29 0a  t [, default]]).
1050: 2a 2a 20 20 20 20 20 6c 61 67 28 65 78 70 72 20  **     lag(expr 
1060: 5b 2c 20 6f 66 66 73 65 74 20 5b 2c 20 64 65 66  [, offset [, def
1070: 61 75 6c 74 5d 5d 29 0a 2a 2a 20 20 20 20 20 66  ault]]).**     f
1080: 69 72 73 74 5f 76 61 6c 75 65 28 65 78 70 72 29  irst_value(expr)
1090: 0a 2a 2a 20 20 20 20 20 6c 61 73 74 5f 76 61 6c  .**     last_val
10a0: 75 65 28 65 78 70 72 29 0a 2a 2a 20 20 20 20 20  ue(expr).**     
10b0: 6e 74 68 5f 76 61 6c 75 65 28 65 78 70 72 2c 20  nth_value(expr, 
10c0: 4e 29 0a 2a 2a 20 20 20 0a 2a 2a 20 20 20 54 68  N).**   .**   Th
10d0: 65 73 65 20 61 72 65 20 74 68 65 20 73 61 6d 65  ese are the same
10e0: 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77   built-in window
10f0: 20 66 75 6e 63 74 69 6f 6e 73 20 73 75 70 70 6f   functions suppo
1100: 72 74 65 64 20 62 79 20 50 6f 73 74 67 72 65 73  rted by Postgres
1110: 2e 20 0a 2a 2a 20 20 20 41 6c 74 68 6f 75 67 68  . .**   Although
1120: 20 74 68 65 20 62 65 68 61 76 69 6f 75 72 20 6f   the behaviour o
1130: 66 20 61 67 67 72 65 67 61 74 65 20 77 69 6e 64  f aggregate wind
1140: 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 28 66 75  ow functions (fu
1150: 6e 63 74 69 6f 6e 73 20 74 68 61 74 0a 2a 2a 20  nctions that.** 
1160: 20 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 73    can be used as
1170: 20 65 69 74 68 65 72 20 61 67 67 72 65 67 61 74   either aggregat
1180: 65 73 20 6f 72 20 77 69 6e 64 6f 77 20 66 75 6e  es or window fun
1190: 74 69 6f 6e 73 29 20 61 6c 6c 6f 77 73 20 74 68  tions) allows th
11a0: 65 6d 20 74 6f 0a 2a 2a 20 20 20 62 65 20 69 6d  em to.**   be im
11b0: 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20  plemented using 
11c0: 61 6e 20 41 50 49 2c 20 62 75 69 6c 74 2d 69 6e  an API, built-in
11d0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
11e0: 73 20 61 72 65 20 6d 75 63 68 20 6d 6f 72 65 0a  s are much more.
11f0: 2a 2a 20 20 20 65 73 6f 74 65 72 69 63 2e 20 41  **   esoteric. A
1200: 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 73 6f 6d  dditionally, som
1210: 65 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  e window functio
1220: 6e 73 20 28 65 2e 67 2e 20 6e 74 68 5f 76 61 6c  ns (e.g. nth_val
1230: 75 65 28 29 29 20 0a 2a 2a 20 20 20 6d 61 79 20  ue()) .**   may 
1240: 6f 6e 6c 79 20 62 65 20 69 6d 70 6c 65 6d 65 6e  only be implemen
1250: 74 65 64 20 62 79 20 63 61 63 68 69 6e 67 20 74  ted by caching t
1260: 68 65 20 65 6e 74 69 72 65 20 70 61 72 74 69 74  he entire partit
1270: 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a  ion in memory..*
1280: 2a 20 20 20 41 73 20 73 75 63 68 2c 20 73 6f 6d  *   As such, som
1290: 65 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  e built-in windo
12a0: 77 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 20  w functions use 
12b0: 74 68 65 20 73 61 6d 65 20 41 50 49 20 61 73 20  the same API as 
12c0: 61 67 67 72 65 67 61 74 65 0a 2a 2a 20 20 20 77  aggregate.**   w
12d0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
12e0: 61 6e 64 20 73 6f 6d 65 20 61 72 65 20 69 6d 70  and some are imp
12f0: 6c 65 6d 65 6e 74 65 64 20 64 69 72 65 63 74 6c  lemented directl
1300: 79 20 75 73 69 6e 67 20 56 44 42 45 20 0a 2a 2a  y using VDBE .**
1310: 20 20 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e     instructions.
1320: 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 66   Additionally, f
1330: 6f 72 20 74 68 6f 73 65 20 66 75 6e 63 74 69 6f  or those functio
1340: 6e 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20  ns that use the 
1350: 41 50 49 2c 20 74 68 65 0a 2a 2a 20 20 20 77 69  API, the.**   wi
1360: 6e 64 6f 77 20 66 72 61 6d 65 20 69 73 20 73 6f  ndow frame is so
1370: 6d 65 74 69 6d 65 73 20 6d 6f 64 69 66 69 65 64  metimes modified
1380: 20 62 65 66 6f 72 65 20 74 68 65 20 53 45 4c 45   before the SELE
1390: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a  CT statement is.
13a0: 2a 2a 20 20 20 72 65 77 72 69 74 74 65 6e 2e 20  **   rewritten. 
13b0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 72 65 67  For example, reg
13c0: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 73  ardless of the s
13d0: 70 65 63 69 66 69 65 64 20 77 69 6e 64 6f 77 20  pecified window 
13e0: 66 72 61 6d 65 2c 20 74 68 65 0a 2a 2a 20 20 20  frame, the.**   
13f0: 72 6f 77 5f 6e 75 6d 62 65 72 28 29 20 66 75 6e  row_number() fun
1400: 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 75 73 65  ction always use
1410: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 4f 57  s:.**.**     ROW
1420: 53 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e  S BETWEEN UNBOUN
1430: 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e  DED PRECEDING AN
1440: 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a  D CURRENT ROW.**
1450: 0a 2a 2a 20 20 20 53 65 65 20 73 71 6c 69 74 65  .**   See sqlite
1460: 33 57 69 6e 64 6f 77 55 70 64 61 74 65 28 29 20  3WindowUpdate() 
1470: 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  for details..**.
1480: 2a 2a 20 20 20 41 73 20 77 65 6c 6c 20 61 73 20  **   As well as 
1490: 73 6f 6d 65 20 6f 66 20 74 68 65 20 62 75 69 6c  some of the buil
14a0: 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63  t-in window func
14b0: 74 69 6f 6e 73 2c 20 61 67 67 72 65 67 61 74 65  tions, aggregate
14c0: 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20 66 75 6e   window.**   fun
14d0: 63 74 69 6f 6e 73 20 6d 69 6e 28 29 20 61 6e 64  ctions min() and
14e0: 20 6d 61 78 28 29 20 61 72 65 20 69 6d 70 6c 65   max() are imple
14f0: 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 56 44 42  mented using VDB
1500: 45 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 69  E instructions i
1510: 66 0a 2a 2a 20 20 20 74 68 65 20 73 74 61 72 74  f.**   the start
1520: 20 6f 66 20 74 68 65 20 77 69 6e 64 6f 77 20 66   of the window f
1530: 72 61 6d 65 20 69 73 20 64 65 63 6c 61 72 65 64  rame is declared
1540: 20 61 73 20 61 6e 79 74 68 69 6e 67 20 6f 74 68   as anything oth
1550: 65 72 20 74 68 61 6e 20 0a 2a 2a 20 20 20 55 4e  er than .**   UN
1560: 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e  BOUNDED PRECEDIN
1570: 47 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  G..*/../*.** Imp
1580: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 62  lementation of b
1590: 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66  uilt-in window f
15a0: 75 6e 63 74 69 6f 6e 20 72 6f 77 5f 6e 75 6d 62  unction row_numb
15b0: 65 72 28 29 2e 20 41 73 73 75 6d 65 73 20 74 68  er(). Assumes th
15c0: 61 74 20 74 68 65 0a 2a 2a 20 77 69 6e 64 6f 77  at the.** window
15d0: 20 66 72 61 6d 65 20 68 61 73 20 62 65 65 6e 20   frame has been 
15e0: 63 6f 65 72 63 65 64 20 74 6f 3a 0a 2a 2a 0a 2a  coerced to:.**.*
15f0: 2a 20 20 20 52 4f 57 53 20 42 45 54 57 45 45 4e  *   ROWS BETWEEN
1600: 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45   UNBOUNDED PRECE
1610: 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54  DING AND CURRENT
1620: 20 52 4f 57 0a 2a 2f 0a 73 74 61 74 69 63 20 76   ROW.*/.static v
1630: 6f 69 64 20 72 6f 77 5f 6e 75 6d 62 65 72 53 74  oid row_numberSt
1640: 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  epFunc(.  sqlite
1650: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
1660: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
1670: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
1680: 61 70 41 72 67 0a 29 7b 0a 20 20 69 36 34 20 2a  apArg.){.  i64 *
1690: 70 20 3d 20 28 69 36 34 2a 29 73 71 6c 69 74 65  p = (i64*)sqlite
16a0: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
16b0: 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66  ext(pCtx, sizeof
16c0: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29  (*p));.  if( p )
16d0: 20 28 2a 70 29 2b 2b 3b 0a 20 20 55 4e 55 53 45   (*p)++;.  UNUSE
16e0: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72 67  D_PARAMETER(nArg
16f0: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1700: 4d 45 54 45 52 28 61 70 41 72 67 29 3b 0a 7d 0a  METER(apArg);.}.
1710: 73 74 61 74 69 63 20 76 6f 69 64 20 72 6f 77 5f  static void row_
1720: 6e 75 6d 62 65 72 56 61 6c 75 65 46 75 6e 63 28  numberValueFunc(
1730: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1740: 2a 70 43 74 78 29 7b 0a 20 20 69 36 34 20 2a 70  *pCtx){.  i64 *p
1750: 20 3d 20 28 69 36 34 2a 29 73 71 6c 69 74 65 33   = (i64*)sqlite3
1760: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
1770: 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28  xt(pCtx, sizeof(
1780: 2a 70 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  *p));.  sqlite3_
1790: 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74  result_int64(pCt
17a0: 78 2c 20 28 70 20 3f 20 2a 70 20 3a 20 30 29 29  x, (p ? *p : 0))
17b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65  ;.}../*.** Conte
17c0: 78 74 20 6f 62 6a 65 63 74 20 74 79 70 65 20 75  xt object type u
17d0: 73 65 64 20 62 79 20 72 61 6e 6b 28 29 2c 20 64  sed by rank(), d
17e0: 65 6e 73 65 5f 72 61 6e 6b 28 29 2c 20 70 65 72  ense_rank(), per
17f0: 63 65 6e 74 5f 72 61 6e 6b 28 29 20 61 6e 64 0a  cent_rank() and.
1800: 2a 2a 20 63 75 6d 65 5f 64 69 73 74 28 29 2e 0a  ** cume_dist()..
1810: 2a 2f 0a 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  */.struct CallCo
1820: 75 6e 74 20 7b 0a 20 20 69 36 34 20 6e 56 61 6c  unt {.  i64 nVal
1830: 75 65 3b 0a 20 20 69 36 34 20 6e 53 74 65 70 3b  ue;.  i64 nStep;
1840: 0a 20 20 69 36 34 20 6e 54 6f 74 61 6c 3b 0a 7d  .  i64 nTotal;.}
1850: 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  ;../*.** Impleme
1860: 6e 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74  ntation of built
1870: 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  -in window funct
1880: 69 6f 6e 20 64 65 6e 73 65 5f 72 61 6e 6b 28 29  ion dense_rank()
1890: 2e 20 41 73 73 75 6d 65 73 20 74 68 61 74 0a 2a  . Assumes that.*
18a0: 2a 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61  * the window fra
18b0: 6d 65 20 68 61 73 20 62 65 65 6e 20 73 65 74 20  me has been set 
18c0: 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e 47  to:.**.**   RANG
18d0: 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e  E BETWEEN UNBOUN
18e0: 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e  DED PRECEDING AN
18f0: 44 20 43 55 52 52 45 4e 54 20 52 4f 57 20 0a 2a  D CURRENT ROW .*
1900: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65  /.static void de
1910: 6e 73 65 5f 72 61 6e 6b 53 74 65 70 46 75 6e 63  nse_rankStepFunc
1920: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
1930: 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e  ext *pCtx, .  in
1940: 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65  t nArg,.  sqlite
1950: 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a  3_value **apArg.
1960: 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61 6c 6c  ){.  struct Call
1970: 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70 20 3d 20  Count *p;.  p = 
1980: 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e  (struct CallCoun
1990: 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65  t*)sqlite3_aggre
19a0: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74  gate_context(pCt
19b0: 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  x, sizeof(*p));.
19c0: 20 20 69 66 28 20 70 20 29 20 70 2d 3e 6e 53 74    if( p ) p->nSt
19d0: 65 70 20 3d 20 31 3b 0a 20 20 55 4e 55 53 45 44  ep = 1;.  UNUSED
19e0: 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72 67 29  _PARAMETER(nArg)
19f0: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1a00: 45 54 45 52 28 61 70 41 72 67 29 3b 0a 7d 0a 73  ETER(apArg);.}.s
1a10: 74 61 74 69 63 20 76 6f 69 64 20 64 65 6e 73 65  tatic void dense
1a20: 5f 72 61 6e 6b 56 61 6c 75 65 46 75 6e 63 28 73  _rankValueFunc(s
1a30: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1a40: 70 43 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20  pCtx){.  struct 
1a50: 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20  CallCount *p;.  
1a60: 70 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c  p = (struct Call
1a70: 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61  Count*)sqlite3_a
1a80: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
1a90: 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70  (pCtx, sizeof(*p
1aa0: 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ));.  if( p ){. 
1ab0: 20 20 20 69 66 28 20 70 2d 3e 6e 53 74 65 70 20     if( p->nStep 
1ac0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61 6c  ){.      p->nVal
1ad0: 75 65 2b 2b 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  ue++;.      p->n
1ae0: 53 74 65 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Step = 0;.    }.
1af0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
1b00: 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 70  lt_int64(pCtx, p
1b10: 2d 3e 6e 56 61 6c 75 65 29 3b 0a 20 20 7d 0a 7d  ->nValue);.  }.}
1b20: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
1b30: 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74 2d  tation of built-
1b40: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
1b50: 6f 6e 20 6e 74 68 5f 76 61 6c 75 65 28 29 2e 20  on nth_value(). 
1b60: 54 68 69 73 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  This.** implemen
1b70: 74 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 69  tation is used i
1b80: 6e 20 22 73 6c 6f 77 20 6d 6f 64 65 22 20 6f 6e  n "slow mode" on
1b90: 6c 79 20 2d 20 77 68 65 6e 20 74 68 65 20 45 58  ly - when the EX
1ba0: 43 4c 55 44 45 20 63 6c 61 75 73 65 0a 2a 2a 20  CLUDE clause.** 
1bb0: 69 73 20 6e 6f 74 20 73 65 74 20 74 6f 20 74 68  is not set to th
1bc0: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
1bd0: 22 4e 4f 20 4f 54 48 45 52 53 22 2e 0a 2a 2f 0a  "NO OTHERS"..*/.
1be0: 73 74 72 75 63 74 20 4e 74 68 56 61 6c 75 65 43  struct NthValueC
1bf0: 74 78 20 7b 0a 20 20 69 36 34 20 6e 53 74 65 70  tx {.  i64 nStep
1c00: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ;.  sqlite3_valu
1c10: 65 20 2a 70 56 61 6c 75 65 3b 0a 7d 3b 0a 73 74  e *pValue;.};.st
1c20: 61 74 69 63 20 76 6f 69 64 20 6e 74 68 5f 76 61  atic void nth_va
1c30: 6c 75 65 53 74 65 70 46 75 6e 63 28 0a 20 20 73  lueStepFunc(.  s
1c40: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1c50: 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72  pCtx, .  int nAr
1c60: 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  g,.  sqlite3_val
1c70: 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20  ue **apArg.){.  
1c80: 73 74 72 75 63 74 20 4e 74 68 56 61 6c 75 65 43  struct NthValueC
1c90: 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74  tx *p;.  p = (st
1ca0: 72 75 63 74 20 4e 74 68 56 61 6c 75 65 43 74 78  ruct NthValueCtx
1cb0: 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  *)sqlite3_aggreg
1cc0: 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78  ate_context(pCtx
1cd0: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
1ce0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 36   if( p ){.    i6
1cf0: 34 20 69 56 61 6c 3b 0a 20 20 20 20 73 77 69 74  4 iVal;.    swit
1d00: 63 68 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ch( sqlite3_valu
1d10: 65 5f 6e 75 6d 65 72 69 63 5f 74 79 70 65 28 61  e_numeric_type(a
1d20: 70 41 72 67 5b 31 5d 29 20 29 7b 0a 20 20 20 20  pArg[1]) ){.    
1d30: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
1d40: 54 45 47 45 52 3a 0a 20 20 20 20 20 20 20 20 69  TEGER:.        i
1d50: 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  Val = sqlite3_va
1d60: 6c 75 65 5f 69 6e 74 36 34 28 61 70 41 72 67 5b  lue_int64(apArg[
1d70: 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  1]);.        bre
1d80: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
1d90: 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20  QLITE_FLOAT: {. 
1da0: 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 66 56         double fV
1db0: 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  al = sqlite3_val
1dc0: 75 65 5f 64 6f 75 62 6c 65 28 61 70 41 72 67 5b  ue_double(apArg[
1dd0: 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  1]);.        if(
1de0: 20 28 28 69 36 34 29 66 56 61 6c 29 21 3d 66 56   ((i64)fVal)!=fV
1df0: 61 6c 20 29 20 67 6f 74 6f 20 65 72 72 6f 72 5f  al ) goto error_
1e00: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 69 56 61  out;.        iVa
1e10: 6c 20 3d 20 28 69 36 34 29 66 56 61 6c 3b 0a 20  l = (i64)fVal;. 
1e20: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1e30: 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66 61      }.      defa
1e40: 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 67 6f 74  ult:.        got
1e50: 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20  o error_out;.   
1e60: 20 7d 0a 20 20 20 20 69 66 28 20 69 56 61 6c 3c   }.    if( iVal<
1e70: 3d 30 20 29 20 67 6f 74 6f 20 65 72 72 6f 72 5f  =0 ) goto error_
1e80: 6f 75 74 3b 0a 0a 20 20 20 20 70 2d 3e 6e 53 74  out;..    p->nSt
1e90: 65 70 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69 56  ep++;.    if( iV
1ea0: 61 6c 3d 3d 70 2d 3e 6e 53 74 65 70 20 29 7b 0a  al==p->nStep ){.
1eb0: 20 20 20 20 20 20 70 2d 3e 70 56 61 6c 75 65 20        p->pValue 
1ec0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
1ed0: 64 75 70 28 61 70 41 72 67 5b 30 5d 29 3b 0a 20  dup(apArg[0]);. 
1ee0: 20 20 20 20 20 69 66 28 20 21 70 2d 3e 70 56 61       if( !p->pVa
1ef0: 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  lue ){.        s
1f00: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
1f10: 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29 3b  ror_nomem(pCtx);
1f20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1f30: 20 7d 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41   }.  UNUSED_PARA
1f40: 4d 45 54 45 52 28 6e 41 72 67 29 3b 0a 20 20 55  METER(nArg);.  U
1f50: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1f60: 61 70 41 72 67 29 3b 0a 20 20 72 65 74 75 72 6e  apArg);.  return
1f70: 3b 0a 0a 20 65 72 72 6f 72 5f 6f 75 74 3a 0a 20  ;.. error_out:. 
1f80: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1f90: 65 72 72 6f 72 28 0a 20 20 20 20 20 20 70 43 74  error(.      pCt
1fa0: 78 2c 20 22 73 65 63 6f 6e 64 20 61 72 67 75 6d  x, "second argum
1fb0: 65 6e 74 20 74 6f 20 6e 74 68 5f 76 61 6c 75 65  ent to nth_value
1fc0: 20 6d 75 73 74 20 62 65 20 61 20 70 6f 73 69 74   must be a posit
1fd0: 69 76 65 20 69 6e 74 65 67 65 72 22 2c 20 2d 31  ive integer", -1
1fe0: 0a 20 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  .  );.}.static v
1ff0: 6f 69 64 20 6e 74 68 5f 76 61 6c 75 65 46 69 6e  oid nth_valueFin
2000: 61 6c 69 7a 65 46 75 6e 63 28 73 71 6c 69 74 65  alizeFunc(sqlite
2010: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29  3_context *pCtx)
2020: 7b 0a 20 20 73 74 72 75 63 74 20 4e 74 68 56 61  {.  struct NthVa
2030: 6c 75 65 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d  lueCtx *p;.  p =
2040: 20 28 73 74 72 75 63 74 20 4e 74 68 56 61 6c 75   (struct NthValu
2050: 65 43 74 78 2a 29 73 71 6c 69 74 65 33 5f 61 67  eCtx*)sqlite3_ag
2060: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
2070: 70 43 74 78 2c 20 30 29 3b 0a 20 20 69 66 28 20  pCtx, 0);.  if( 
2080: 70 20 26 26 20 70 2d 3e 70 56 61 6c 75 65 20 29  p && p->pValue )
2090: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
20a0: 73 75 6c 74 5f 76 61 6c 75 65 28 70 43 74 78 2c  sult_value(pCtx,
20b0: 20 70 2d 3e 70 56 61 6c 75 65 29 3b 0a 20 20 20   p->pValue);.   
20c0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 66   sqlite3_value_f
20d0: 72 65 65 28 70 2d 3e 70 56 61 6c 75 65 29 3b 0a  ree(p->pValue);.
20e0: 20 20 20 20 70 2d 3e 70 56 61 6c 75 65 20 3d 20      p->pValue = 
20f0: 30 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65  0;.  }.}.#define
2100: 20 6e 74 68 5f 76 61 6c 75 65 49 6e 76 46 75 6e   nth_valueInvFun
2110: 63 20 6e 6f 6f 70 53 74 65 70 46 75 6e 63 0a 23  c noopStepFunc.#
2120: 64 65 66 69 6e 65 20 6e 74 68 5f 76 61 6c 75 65  define nth_value
2130: 56 61 6c 75 65 46 75 6e 63 20 6e 6f 6f 70 56 61  ValueFunc noopVa
2140: 6c 75 65 46 75 6e 63 0a 0a 73 74 61 74 69 63 20  lueFunc..static 
2150: 76 6f 69 64 20 66 69 72 73 74 5f 76 61 6c 75 65  void first_value
2160: 53 74 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69  StepFunc(.  sqli
2170: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
2180: 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  x, .  int nArg,.
2190: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
21a0: 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72  **apArg.){.  str
21b0: 75 63 74 20 4e 74 68 56 61 6c 75 65 43 74 78 20  uct NthValueCtx 
21c0: 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63  *p;.  p = (struc
21d0: 74 20 4e 74 68 56 61 6c 75 65 43 74 78 2a 29 73  t NthValueCtx*)s
21e0: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
21f0: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
2200: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
2210: 28 20 70 20 26 26 20 70 2d 3e 70 56 61 6c 75 65  ( p && p->pValue
2220: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 56  ==0 ){.    p->pV
2230: 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76  alue = sqlite3_v
2240: 61 6c 75 65 5f 64 75 70 28 61 70 41 72 67 5b 30  alue_dup(apArg[0
2250: 5d 29 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e  ]);.    if( !p->
2260: 70 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20  pValue ){.      
2270: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
2280: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29  rror_nomem(pCtx)
2290: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 55 4e  ;.    }.  }.  UN
22a0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
22b0: 41 72 67 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  Arg);.  UNUSED_P
22c0: 41 52 41 4d 45 54 45 52 28 61 70 41 72 67 29 3b  ARAMETER(apArg);
22d0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  .}.static void f
22e0: 69 72 73 74 5f 76 61 6c 75 65 46 69 6e 61 6c 69  irst_valueFinali
22f0: 7a 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  zeFunc(sqlite3_c
2300: 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20  ontext *pCtx){. 
2310: 20 73 74 72 75 63 74 20 4e 74 68 56 61 6c 75 65   struct NthValue
2320: 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73  Ctx *p;.  p = (s
2330: 74 72 75 63 74 20 4e 74 68 56 61 6c 75 65 43 74  truct NthValueCt
2340: 78 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65  x*)sqlite3_aggre
2350: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74  gate_context(pCt
2360: 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  x, sizeof(*p));.
2370: 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 70 56    if( p && p->pV
2380: 61 6c 75 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  alue ){.    sqli
2390: 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65  te3_result_value
23a0: 28 70 43 74 78 2c 20 70 2d 3e 70 56 61 6c 75 65  (pCtx, p->pValue
23b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  );.    sqlite3_v
23c0: 61 6c 75 65 5f 66 72 65 65 28 70 2d 3e 70 56 61  alue_free(p->pVa
23d0: 6c 75 65 29 3b 0a 20 20 20 20 70 2d 3e 70 56 61  lue);.    p->pVa
23e0: 6c 75 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23  lue = 0;.  }.}.#
23f0: 64 65 66 69 6e 65 20 66 69 72 73 74 5f 76 61 6c  define first_val
2400: 75 65 49 6e 76 46 75 6e 63 20 6e 6f 6f 70 53 74  ueInvFunc noopSt
2410: 65 70 46 75 6e 63 0a 23 64 65 66 69 6e 65 20 66  epFunc.#define f
2420: 69 72 73 74 5f 76 61 6c 75 65 56 61 6c 75 65 46  irst_valueValueF
2430: 75 6e 63 20 6e 6f 6f 70 56 61 6c 75 65 46 75 6e  unc noopValueFun
2440: 63 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  c../*.** Impleme
2450: 6e 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74  ntation of built
2460: 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  -in window funct
2470: 69 6f 6e 20 72 61 6e 6b 28 29 2e 20 41 73 73 75  ion rank(). Assu
2480: 6d 65 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  mes that.** the 
2490: 77 69 6e 64 6f 77 20 66 72 61 6d 65 20 68 61 73  window frame has
24a0: 20 62 65 65 6e 20 73 65 74 20 74 6f 3a 0a 2a 2a   been set to:.**
24b0: 0a 2a 2a 20 20 20 52 41 4e 47 45 20 42 45 54 57  .**   RANGE BETW
24c0: 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52  EEN UNBOUNDED PR
24d0: 45 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52  ECEDING AND CURR
24e0: 45 4e 54 20 52 4f 57 20 0a 2a 2f 0a 73 74 61 74  ENT ROW .*/.stat
24f0: 69 63 20 76 6f 69 64 20 72 61 6e 6b 53 74 65 70  ic void rankStep
2500: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
2510: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
2520: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
2530: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
2540: 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20  Arg.){.  struct 
2550: 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20  CallCount *p;.  
2560: 70 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c  p = (struct Call
2570: 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61  Count*)sqlite3_a
2580: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
2590: 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70  (pCtx, sizeof(*p
25a0: 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ));.  if( p ){. 
25b0: 20 20 20 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 20     p->nStep++;. 
25c0: 20 20 20 69 66 28 20 70 2d 3e 6e 56 61 6c 75 65     if( p->nValue
25d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
25e0: 6e 56 61 6c 75 65 20 3d 20 70 2d 3e 6e 53 74 65  nValue = p->nSte
25f0: 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 55  p;.    }.  }.  U
2600: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2610: 6e 41 72 67 29 3b 0a 20 20 55 4e 55 53 45 44 5f  nArg);.  UNUSED_
2620: 50 41 52 41 4d 45 54 45 52 28 61 70 41 72 67 29  PARAMETER(apArg)
2630: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
2640: 72 61 6e 6b 56 61 6c 75 65 46 75 6e 63 28 73 71  rankValueFunc(sq
2650: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
2660: 43 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20 43  Ctx){.  struct C
2670: 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70  allCount *p;.  p
2680: 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43   = (struct CallC
2690: 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67  ount*)sqlite3_ag
26a0: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
26b0: 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29  pCtx, sizeof(*p)
26c0: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
26d0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
26e0: 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 70 2d 3e  _int64(pCtx, p->
26f0: 6e 56 61 6c 75 65 29 3b 0a 20 20 20 20 70 2d 3e  nValue);.    p->
2700: 6e 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 7d 0a  nValue = 0;.  }.
2710: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
2720: 6e 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74  ntation of built
2730: 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  -in window funct
2740: 69 6f 6e 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b  ion percent_rank
2750: 28 29 2e 20 41 73 73 75 6d 65 73 20 74 68 61 74  (). Assumes that
2760: 0a 2a 2a 20 74 68 65 20 77 69 6e 64 6f 77 20 66  .** the window f
2770: 72 61 6d 65 20 68 61 73 20 62 65 65 6e 20 73 65  rame has been se
2780: 74 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 47 52  t to:.**.**   GR
2790: 4f 55 50 53 20 42 45 54 57 45 45 4e 20 43 55 52  OUPS BETWEEN CUR
27a0: 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 55 4e 42  RENT ROW AND UNB
27b0: 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47  OUNDED FOLLOWING
27c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
27d0: 70 65 72 63 65 6e 74 5f 72 61 6e 6b 53 74 65 70  percent_rankStep
27e0: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
27f0: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
2800: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
2810: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
2820: 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20  Arg.){.  struct 
2830: 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20  CallCount *p;.  
2840: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2850: 28 6e 41 72 67 29 3b 20 61 73 73 65 72 74 28 20  (nArg); assert( 
2860: 6e 41 72 67 3d 3d 30 20 29 3b 0a 20 20 55 4e 55  nArg==0 );.  UNU
2870: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 70  SED_PARAMETER(ap
2880: 41 72 67 29 3b 0a 20 20 70 20 3d 20 28 73 74 72  Arg);.  p = (str
2890: 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29 73  uct CallCount*)s
28a0: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
28b0: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
28c0: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
28d0: 28 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 54  ( p ){.    p->nT
28e0: 6f 74 61 6c 2b 2b 3b 0a 20 20 7d 0a 7d 0a 73 74  otal++;.  }.}.st
28f0: 61 74 69 63 20 76 6f 69 64 20 70 65 72 63 65 6e  atic void percen
2900: 74 5f 72 61 6e 6b 49 6e 76 46 75 6e 63 28 0a 20  t_rankInvFunc(. 
2910: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
2920: 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
2930: 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
2940: 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a  alue **apArg.){.
2950: 20 20 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75    struct CallCou
2960: 6e 74 20 2a 70 3b 0a 20 20 55 4e 55 53 45 44 5f  nt *p;.  UNUSED_
2970: 50 41 52 41 4d 45 54 45 52 28 6e 41 72 67 29 3b  PARAMETER(nArg);
2980: 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 30   assert( nArg==0
2990: 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
29a0: 41 4d 45 54 45 52 28 61 70 41 72 67 29 3b 0a 20  AMETER(apArg);. 
29b0: 20 70 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c   p = (struct Cal
29c0: 6c 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f  lCount*)sqlite3_
29d0: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
29e0: 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a  t(pCtx, sizeof(*
29f0: 70 29 29 3b 0a 20 20 70 2d 3e 6e 53 74 65 70 2b  p));.  p->nStep+
2a00: 2b 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  +;.}.static void
2a10: 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b 56 61 6c   percent_rankVal
2a20: 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  ueFunc(sqlite3_c
2a30: 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20  ontext *pCtx){. 
2a40: 20 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e   struct CallCoun
2a50: 74 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72  t *p;.  p = (str
2a60: 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29 73  uct CallCount*)s
2a70: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
2a80: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
2a90: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
2aa0: 28 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56  ( p ){.    p->nV
2ab0: 61 6c 75 65 20 3d 20 70 2d 3e 6e 53 74 65 70 3b  alue = p->nStep;
2ac0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 54 6f 74  .    if( p->nTot
2ad0: 61 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20 64 6f  al>1 ){.      do
2ae0: 75 62 6c 65 20 72 20 3d 20 28 64 6f 75 62 6c 65  uble r = (double
2af0: 29 70 2d 3e 6e 56 61 6c 75 65 20 2f 20 28 64 6f  )p->nValue / (do
2b00: 75 62 6c 65 29 28 70 2d 3e 6e 54 6f 74 61 6c 2d  uble)(p->nTotal-
2b10: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
2b20: 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28  3_result_double(
2b30: 70 43 74 78 2c 20 72 29 3b 0a 20 20 20 20 7d 65  pCtx, r);.    }e
2b40: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
2b50: 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65  e3_result_double
2b60: 28 70 43 74 78 2c 20 30 2e 30 29 3b 0a 20 20 20  (pCtx, 0.0);.   
2b70: 20 7d 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65   }.  }.}.#define
2b80: 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b 46 69 6e   percent_rankFin
2b90: 61 6c 69 7a 65 46 75 6e 63 20 70 65 72 63 65 6e  alizeFunc percen
2ba0: 74 5f 72 61 6e 6b 56 61 6c 75 65 46 75 6e 63 0a  t_rankValueFunc.
2bb0: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
2bc0: 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74 2d 69  ation of built-i
2bd0: 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  n window functio
2be0: 6e 20 63 75 6d 65 5f 64 69 73 74 28 29 2e 20 41  n cume_dist(). A
2bf0: 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 74  ssumes that.** t
2c00: 68 65 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 20  he window frame 
2c10: 68 61 73 20 62 65 65 6e 20 73 65 74 20 74 6f 3a  has been set to:
2c20: 0a 2a 2a 0a 2a 2a 20 20 20 47 52 4f 55 50 53 20  .**.**   GROUPS 
2c30: 42 45 54 57 45 45 4e 20 31 20 46 4f 4c 4c 4f 57  BETWEEN 1 FOLLOW
2c40: 49 4e 47 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45  ING AND UNBOUNDE
2c50: 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2f 0a 73  D FOLLOWING.*/.s
2c60: 74 61 74 69 63 20 76 6f 69 64 20 63 75 6d 65 5f  tatic void cume_
2c70: 64 69 73 74 53 74 65 70 46 75 6e 63 28 0a 20 20  distStepFunc(.  
2c80: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
2c90: 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41  *pCtx, .  int nA
2ca0: 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  rg,.  sqlite3_va
2cb0: 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 20  lue **apArg.){. 
2cc0: 20 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e   struct CallCoun
2cd0: 74 20 2a 70 3b 0a 20 20 55 4e 55 53 45 44 5f 50  t *p;.  UNUSED_P
2ce0: 41 52 41 4d 45 54 45 52 28 6e 41 72 67 29 3b 20  ARAMETER(nArg); 
2cf0: 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 30 20  assert( nArg==0 
2d00: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
2d10: 4d 45 54 45 52 28 61 70 41 72 67 29 3b 0a 20 20  METER(apArg);.  
2d20: 70 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c  p = (struct Call
2d30: 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61  Count*)sqlite3_a
2d40: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
2d50: 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70  (pCtx, sizeof(*p
2d60: 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ));.  if( p ){. 
2d70: 20 20 20 70 2d 3e 6e 54 6f 74 61 6c 2b 2b 3b 0a     p->nTotal++;.
2d80: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
2d90: 64 20 63 75 6d 65 5f 64 69 73 74 49 6e 76 46 75  d cume_distInvFu
2da0: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
2db0: 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20  ntext *pCtx, .  
2dc0: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69  int nArg,.  sqli
2dd0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72  te3_value **apAr
2de0: 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61  g.){.  struct Ca
2df0: 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 55 4e  llCount *p;.  UN
2e00: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
2e10: 41 72 67 29 3b 20 61 73 73 65 72 74 28 20 6e 41  Arg); assert( nA
2e20: 72 67 3d 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45  rg==0 );.  UNUSE
2e30: 44 5f 50 41 52 41 4d 45 54 45 52 28 61 70 41 72  D_PARAMETER(apAr
2e40: 67 29 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63  g);.  p = (struc
2e50: 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29 73 71 6c  t CallCount*)sql
2e60: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
2e70: 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a  ontext(pCtx, siz
2e80: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 70 2d 3e 6e  eof(*p));.  p->n
2e90: 53 74 65 70 2b 2b 3b 0a 7d 0a 73 74 61 74 69 63  Step++;.}.static
2ea0: 20 76 6f 69 64 20 63 75 6d 65 5f 64 69 73 74 56   void cume_distV
2eb0: 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33  alueFunc(sqlite3
2ec0: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b  _context *pCtx){
2ed0: 0a 20 20 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  .  struct CallCo
2ee0: 75 6e 74 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73  unt *p;.  p = (s
2ef0: 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a  truct CallCount*
2f00: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
2f10: 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c  te_context(pCtx,
2f20: 20 30 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a   0);.  if( p ){.
2f30: 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 28      double r = (
2f40: 64 6f 75 62 6c 65 29 28 70 2d 3e 6e 53 74 65 70  double)(p->nStep
2f50: 29 20 2f 20 28 64 6f 75 62 6c 65 29 28 70 2d 3e  ) / (double)(p->
2f60: 6e 54 6f 74 61 6c 29 3b 0a 20 20 20 20 73 71 6c  nTotal);.    sql
2f70: 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62  ite3_result_doub
2f80: 6c 65 28 70 43 74 78 2c 20 72 29 3b 0a 20 20 7d  le(pCtx, r);.  }
2f90: 0a 7d 0a 23 64 65 66 69 6e 65 20 63 75 6d 65 5f  .}.#define cume_
2fa0: 64 69 73 74 46 69 6e 61 6c 69 7a 65 46 75 6e 63  distFinalizeFunc
2fb0: 20 63 75 6d 65 5f 64 69 73 74 56 61 6c 75 65 46   cume_distValueF
2fc0: 75 6e 63 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65  unc../*.** Conte
2fd0: 78 74 20 6f 62 6a 65 63 74 20 66 6f 72 20 6e 74  xt object for nt
2fe0: 69 6c 65 28 29 20 77 69 6e 64 6f 77 20 66 75 6e  ile() window fun
2ff0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74  ction..*/.struct
3000: 20 4e 74 69 6c 65 43 74 78 20 7b 0a 20 20 69 36   NtileCtx {.  i6
3010: 34 20 6e 54 6f 74 61 6c 3b 20 20 20 20 20 20 20  4 nTotal;       
3020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3030: 20 54 6f 74 61 6c 20 72 6f 77 73 20 69 6e 20 70   Total rows in p
3040: 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 20 20 69 36  artition */.  i6
3050: 34 20 6e 50 61 72 61 6d 3b 20 20 20 20 20 20 20  4 nParam;       
3060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3070: 20 50 61 72 61 6d 65 74 65 72 20 70 61 73 73 65   Parameter passe
3080: 64 20 74 6f 20 6e 74 69 6c 65 28 4e 29 20 2a 2f  d to ntile(N) */
3090: 0a 20 20 69 36 34 20 69 52 6f 77 3b 20 20 20 20  .  i64 iRow;    
30a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f     /* Current ro
30c0: 77 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49  w */.};../*.** I
30d0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
30e0: 20 6e 74 69 6c 65 28 29 2e 20 54 68 69 73 20 61   ntile(). This a
30f0: 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20  ssumes that the 
3100: 77 69 6e 64 6f 77 20 66 72 61 6d 65 20 68 61 73  window frame has
3110: 0a 2a 2a 20 62 65 65 6e 20 63 6f 65 72 63 65 64  .** been coerced
3120: 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57   to:.**.**   ROW
3130: 53 20 43 55 52 52 45 4e 54 20 52 4f 57 20 41 4e  S CURRENT ROW AN
3140: 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c  D UNBOUNDED FOLL
3150: 4f 57 49 4e 47 0a 2a 2f 0a 73 74 61 74 69 63 20  OWING.*/.static 
3160: 76 6f 69 64 20 6e 74 69 6c 65 53 74 65 70 46 75  void ntileStepFu
3170: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
3180: 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20  ntext *pCtx, .  
3190: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69  int nArg,.  sqli
31a0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72  te3_value **apAr
31b0: 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 4e 74  g.){.  struct Nt
31c0: 69 6c 65 43 74 78 20 2a 70 3b 0a 20 20 61 73 73  ileCtx *p;.  ass
31d0: 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 20  ert( nArg==1 ); 
31e0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
31f0: 28 6e 41 72 67 29 3b 0a 20 20 70 20 3d 20 28 73  (nArg);.  p = (s
3200: 74 72 75 63 74 20 4e 74 69 6c 65 43 74 78 2a 29  truct NtileCtx*)
3210: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
3220: 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20  e_context(pCtx, 
3230: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69  sizeof(*p));.  i
3240: 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  f( p ){.    if( 
3250: 70 2d 3e 6e 54 6f 74 61 6c 3d 3d 30 20 29 7b 0a  p->nTotal==0 ){.
3260: 20 20 20 20 20 20 70 2d 3e 6e 50 61 72 61 6d 20        p->nParam 
3270: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
3280: 69 6e 74 36 34 28 61 70 41 72 67 5b 30 5d 29 3b  int64(apArg[0]);
3290: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 50  .      if( p->nP
32a0: 61 72 61 6d 3c 3d 30 20 29 7b 0a 20 20 20 20 20  aram<=0 ){.     
32b0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
32c0: 74 5f 65 72 72 6f 72 28 0a 20 20 20 20 20 20 20  t_error(.       
32d0: 20 20 20 20 20 70 43 74 78 2c 20 22 61 72 67 75       pCtx, "argu
32e0: 6d 65 6e 74 20 6f 66 20 6e 74 69 6c 65 20 6d 75  ment of ntile mu
32f0: 73 74 20 62 65 20 61 20 70 6f 73 69 74 69 76 65  st be a positive
3300: 20 69 6e 74 65 67 65 72 22 2c 20 2d 31 0a 20 20   integer", -1.  
3310: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
3320: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 54  .    }.    p->nT
3330: 6f 74 61 6c 2b 2b 3b 0a 20 20 7d 0a 7d 0a 73 74  otal++;.  }.}.st
3340: 61 74 69 63 20 76 6f 69 64 20 6e 74 69 6c 65 49  atic void ntileI
3350: 6e 76 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  nvFunc(.  sqlite
3360: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
3370: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
3380: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
3390: 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63  apArg.){.  struc
33a0: 74 20 4e 74 69 6c 65 43 74 78 20 2a 70 3b 0a 20  t NtileCtx *p;. 
33b0: 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31   assert( nArg==1
33c0: 20 29 3b 20 55 4e 55 53 45 44 5f 50 41 52 41 4d   ); UNUSED_PARAM
33d0: 45 54 45 52 28 6e 41 72 67 29 3b 0a 20 20 55 4e  ETER(nArg);.  UN
33e0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
33f0: 70 41 72 67 29 3b 0a 20 20 70 20 3d 20 28 73 74  pArg);.  p = (st
3400: 72 75 63 74 20 4e 74 69 6c 65 43 74 78 2a 29 73  ruct NtileCtx*)s
3410: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
3420: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
3430: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 70 2d  izeof(*p));.  p-
3440: 3e 69 52 6f 77 2b 2b 3b 0a 7d 0a 73 74 61 74 69  >iRow++;.}.stati
3450: 63 20 76 6f 69 64 20 6e 74 69 6c 65 56 61 6c 75  c void ntileValu
3460: 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  eFunc(sqlite3_co
3470: 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20 20  ntext *pCtx){.  
3480: 73 74 72 75 63 74 20 4e 74 69 6c 65 43 74 78 20  struct NtileCtx 
3490: 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63  *p;.  p = (struc
34a0: 74 20 4e 74 69 6c 65 43 74 78 2a 29 73 71 6c 69  t NtileCtx*)sqli
34b0: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
34c0: 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65  ntext(pCtx, size
34d0: 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70  of(*p));.  if( p
34e0: 20 26 26 20 70 2d 3e 6e 50 61 72 61 6d 3e 30 20   && p->nParam>0 
34f0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 69 7a 65  ){.    int nSize
3500: 20 3d 20 28 70 2d 3e 6e 54 6f 74 61 6c 20 2f 20   = (p->nTotal / 
3510: 70 2d 3e 6e 50 61 72 61 6d 29 3b 0a 20 20 20 20  p->nParam);.    
3520: 69 66 28 20 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a  if( nSize==0 ){.
3530: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
3540: 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c  sult_int64(pCtx,
3550: 20 70 2d 3e 69 52 6f 77 2b 31 29 3b 0a 20 20 20   p->iRow+1);.   
3560: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 36   }else{.      i6
3570: 34 20 6e 4c 61 72 67 65 20 3d 20 70 2d 3e 6e 54  4 nLarge = p->nT
3580: 6f 74 61 6c 20 2d 20 70 2d 3e 6e 50 61 72 61 6d  otal - p->nParam
3590: 2a 6e 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 36  *nSize;.      i6
35a0: 34 20 69 53 6d 61 6c 6c 20 3d 20 6e 4c 61 72 67  4 iSmall = nLarg
35b0: 65 2a 28 6e 53 69 7a 65 2b 31 29 3b 0a 20 20 20  e*(nSize+1);.   
35c0: 20 20 20 69 36 34 20 69 52 6f 77 20 3d 20 70 2d     i64 iRow = p-
35d0: 3e 69 52 6f 77 3b 0a 0a 20 20 20 20 20 20 61 73  >iRow;..      as
35e0: 73 65 72 74 28 20 28 6e 4c 61 72 67 65 2a 28 6e  sert( (nLarge*(n
35f0: 53 69 7a 65 2b 31 29 20 2b 20 28 70 2d 3e 6e 50  Size+1) + (p->nP
3600: 61 72 61 6d 2d 6e 4c 61 72 67 65 29 2a 6e 53 69  aram-nLarge)*nSi
3610: 7a 65 29 3d 3d 70 2d 3e 6e 54 6f 74 61 6c 20 29  ze)==p->nTotal )
3620: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 69 52 6f  ;..      if( iRo
3630: 77 3c 69 53 6d 61 6c 6c 20 29 7b 0a 20 20 20 20  w<iSmall ){.    
3640: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
3650: 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 31  lt_int64(pCtx, 1
3660: 20 2b 20 69 52 6f 77 2f 28 6e 53 69 7a 65 2b 31   + iRow/(nSize+1
3670: 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
3680: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3690: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43  _result_int64(pC
36a0: 74 78 2c 20 31 20 2b 20 6e 4c 61 72 67 65 20 2b  tx, 1 + nLarge +
36b0: 20 28 69 52 6f 77 2d 69 53 6d 61 6c 6c 29 2f 6e   (iRow-iSmall)/n
36c0: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Size);.      }. 
36d0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 64 65 66 69     }.  }.}.#defi
36e0: 6e 65 20 6e 74 69 6c 65 46 69 6e 61 6c 69 7a 65  ne ntileFinalize
36f0: 46 75 6e 63 20 6e 74 69 6c 65 56 61 6c 75 65 46  Func ntileValueF
3700: 75 6e 63 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65  unc../*.** Conte
3710: 78 74 20 6f 62 6a 65 63 74 20 66 6f 72 20 6c 61  xt object for la
3720: 73 74 5f 76 61 6c 75 65 28 29 20 77 69 6e 64 6f  st_value() windo
3730: 77 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  w function..*/.s
3740: 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75 65 43  truct LastValueC
3750: 74 78 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  tx {.  sqlite3_v
3760: 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e  alue *pVal;.  in
3770: 74 20 6e 56 61 6c 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a  t nVal;.};../*.*
3780: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
3790: 20 6f 66 20 6c 61 73 74 5f 76 61 6c 75 65 28 29   of last_value()
37a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
37b0: 20 6c 61 73 74 5f 76 61 6c 75 65 53 74 65 70 46   last_valueStepF
37c0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
37d0: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
37e0: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
37f0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41  ite3_value **apA
3800: 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 4c  rg.){.  struct L
3810: 61 73 74 56 61 6c 75 65 43 74 78 20 2a 70 3b 0a  astValueCtx *p;.
3820: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
3830: 45 52 28 6e 41 72 67 29 3b 0a 20 20 70 20 3d 20  ER(nArg);.  p = 
3840: 28 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75  (struct LastValu
3850: 65 43 74 78 2a 29 73 71 6c 69 74 65 33 5f 61 67  eCtx*)sqlite3_ag
3860: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
3870: 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29  pCtx, sizeof(*p)
3880: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
3890: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f    sqlite3_value_
38a0: 66 72 65 65 28 70 2d 3e 70 56 61 6c 29 3b 0a 20  free(p->pVal);. 
38b0: 20 20 20 70 2d 3e 70 56 61 6c 20 3d 20 73 71 6c     p->pVal = sql
38c0: 69 74 65 33 5f 76 61 6c 75 65 5f 64 75 70 28 61  ite3_value_dup(a
38d0: 70 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 69 66  pArg[0]);.    if
38e0: 28 20 70 2d 3e 70 56 61 6c 3d 3d 30 20 29 7b 0a  ( p->pVal==0 ){.
38f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
3900: 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d  sult_error_nomem
3910: 28 70 43 74 78 29 3b 0a 20 20 20 20 7d 65 6c 73  (pCtx);.    }els
3920: 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61 6c  e{.      p->nVal
3930: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ++;.    }.  }.}.
3940: 73 74 61 74 69 63 20 76 6f 69 64 20 6c 61 73 74  static void last
3950: 5f 76 61 6c 75 65 49 6e 76 46 75 6e 63 28 0a 20  _valueInvFunc(. 
3960: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
3970: 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
3980: 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
3990: 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a  alue **apArg.){.
39a0: 20 20 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c    struct LastVal
39b0: 75 65 43 74 78 20 2a 70 3b 0a 20 20 55 4e 55 53  ueCtx *p;.  UNUS
39c0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72  ED_PARAMETER(nAr
39d0: 67 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  g);.  UNUSED_PAR
39e0: 41 4d 45 54 45 52 28 61 70 41 72 67 29 3b 0a 20  AMETER(apArg);. 
39f0: 20 70 20 3d 20 28 73 74 72 75 63 74 20 4c 61 73   p = (struct Las
3a00: 74 56 61 6c 75 65 43 74 78 2a 29 73 71 6c 69 74  tValueCtx*)sqlit
3a10: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
3a20: 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f  text(pCtx, sizeo
3a30: 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 41 4c  f(*p));.  if( AL
3a40: 57 41 59 53 28 70 29 20 29 7b 0a 20 20 20 20 70  WAYS(p) ){.    p
3a50: 2d 3e 6e 56 61 6c 2d 2d 3b 0a 20 20 20 20 69 66  ->nVal--;.    if
3a60: 28 20 70 2d 3e 6e 56 61 6c 3d 3d 30 20 29 7b 0a  ( p->nVal==0 ){.
3a70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
3a80: 6c 75 65 5f 66 72 65 65 28 70 2d 3e 70 56 61 6c  lue_free(p->pVal
3a90: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 56 61 6c  );.      p->pVal
3aa0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
3ab0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 61  }.static void la
3ac0: 73 74 5f 76 61 6c 75 65 56 61 6c 75 65 46 75 6e  st_valueValueFun
3ad0: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
3ae0: 74 20 2a 70 43 74 78 29 7b 0a 20 20 73 74 72 75  t *pCtx){.  stru
3af0: 63 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 20  ct LastValueCtx 
3b00: 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63  *p;.  p = (struc
3b10: 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 2a 29  t LastValueCtx*)
3b20: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
3b30: 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20  e_context(pCtx, 
3b40: 30 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70  0);.  if( p && p
3b50: 2d 3e 70 56 61 6c 20 29 7b 0a 20 20 20 20 73 71  ->pVal ){.    sq
3b60: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c  lite3_result_val
3b70: 75 65 28 70 43 74 78 2c 20 70 2d 3e 70 56 61 6c  ue(pCtx, p->pVal
3b80: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
3b90: 76 6f 69 64 20 6c 61 73 74 5f 76 61 6c 75 65 46  void last_valueF
3ba0: 69 6e 61 6c 69 7a 65 46 75 6e 63 28 73 71 6c 69  inalizeFunc(sqli
3bb0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
3bc0: 78 29 7b 0a 20 20 73 74 72 75 63 74 20 4c 61 73  x){.  struct Las
3bd0: 74 56 61 6c 75 65 43 74 78 20 2a 70 3b 0a 20 20  tValueCtx *p;.  
3be0: 70 20 3d 20 28 73 74 72 75 63 74 20 4c 61 73 74  p = (struct Last
3bf0: 56 61 6c 75 65 43 74 78 2a 29 73 71 6c 69 74 65  ValueCtx*)sqlite
3c00: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
3c10: 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66  ext(pCtx, sizeof
3c20: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 26  (*p));.  if( p &
3c30: 26 20 70 2d 3e 70 56 61 6c 20 29 7b 0a 20 20 20  & p->pVal ){.   
3c40: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
3c50: 76 61 6c 75 65 28 70 43 74 78 2c 20 70 2d 3e 70  value(pCtx, p->p
3c60: 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Val);.    sqlite
3c70: 33 5f 76 61 6c 75 65 5f 66 72 65 65 28 70 2d 3e  3_value_free(p->
3c80: 70 56 61 6c 29 3b 0a 20 20 20 20 70 2d 3e 70 56  pVal);.    p->pV
3c90: 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  al = 0;.  }.}../
3ca0: 2a 0a 2a 2a 20 53 74 61 74 69 63 20 6e 61 6d 65  *.** Static name
3cb0: 73 20 66 6f 72 20 74 68 65 20 62 75 69 6c 74 2d  s for the built-
3cc0: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
3cd0: 6f 6e 20 6e 61 6d 65 73 2e 20 20 54 68 65 73 65  on names.  These
3ce0: 20 73 74 61 74 69 63 0a 2a 2a 20 6e 61 6d 65 73   static.** names
3cf0: 20 61 72 65 20 75 73 65 64 2c 20 72 61 74 68 65   are used, rathe
3d00: 72 20 74 68 61 6e 20 73 74 72 69 6e 67 20 6c 69  r than string li
3d10: 74 65 72 61 6c 73 2c 20 73 6f 20 74 68 61 74 20  terals, so that 
3d20: 46 75 6e 63 44 65 66 20 6f 62 6a 65 63 74 73 0a  FuncDef objects.
3d30: 2a 2a 20 63 61 6e 20 62 65 20 61 73 73 6f 63 69  ** can be associ
3d40: 61 74 65 64 20 77 69 74 68 20 61 20 70 61 72 74  ated with a part
3d50: 69 63 75 6c 61 72 20 77 69 6e 64 6f 77 20 66 75  icular window fu
3d60: 6e 63 74 69 6f 6e 20 62 79 20 64 69 72 65 63 74  nction by direct
3d70: 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  .** comparison o
3d80: 66 20 74 68 65 20 7a 4e 61 6d 65 20 70 6f 69 6e  f the zName poin
3d90: 74 65 72 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a  ter.  Example:.*
3da0: 2a 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 70  *.**       if( p
3db0: 46 75 6e 63 44 65 66 2d 3e 7a 4e 61 6d 65 3d 3d  FuncDef->zName==
3dc0: 72 6f 77 5f 76 61 6c 75 65 4e 61 6d 65 20 29 7b  row_valueName ){
3dd0: 20 2e 2e 2e 20 7d 0a 2a 2f 0a 73 74 61 74 69 63   ... }.*/.static
3de0: 20 63 6f 6e 73 74 20 63 68 61 72 20 72 6f 77 5f   const char row_
3df0: 6e 75 6d 62 65 72 4e 61 6d 65 5b 5d 20 3d 20 20  numberName[] =  
3e00: 20 22 72 6f 77 5f 6e 75 6d 62 65 72 22 3b 0a 73   "row_number";.s
3e10: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
3e20: 20 64 65 6e 73 65 5f 72 61 6e 6b 4e 61 6d 65 5b   dense_rankName[
3e30: 5d 20 3d 20 20 20 22 64 65 6e 73 65 5f 72 61 6e  ] =   "dense_ran
3e40: 6b 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  k";.static const
3e50: 20 63 68 61 72 20 72 61 6e 6b 4e 61 6d 65 5b 5d   char rankName[]
3e60: 20 3d 20 20 20 20 20 20 20 20 20 22 72 61 6e 6b   =         "rank
3e70: 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  ";.static const 
3e80: 63 68 61 72 20 70 65 72 63 65 6e 74 5f 72 61 6e  char percent_ran
3e90: 6b 4e 61 6d 65 5b 5d 20 3d 20 22 70 65 72 63 65  kName[] = "perce
3ea0: 6e 74 5f 72 61 6e 6b 22 3b 0a 73 74 61 74 69 63  nt_rank";.static
3eb0: 20 63 6f 6e 73 74 20 63 68 61 72 20 63 75 6d 65   const char cume
3ec0: 5f 64 69 73 74 4e 61 6d 65 5b 5d 20 3d 20 20 20  _distName[] =   
3ed0: 20 22 63 75 6d 65 5f 64 69 73 74 22 3b 0a 73 74   "cume_dist";.st
3ee0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
3ef0: 6e 74 69 6c 65 4e 61 6d 65 5b 5d 20 3d 20 20 20  ntileName[] =   
3f00: 20 20 20 20 20 22 6e 74 69 6c 65 22 3b 0a 73 74       "ntile";.st
3f10: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
3f20: 6c 61 73 74 5f 76 61 6c 75 65 4e 61 6d 65 5b 5d  last_valueName[]
3f30: 20 3d 20 20 20 22 6c 61 73 74 5f 76 61 6c 75 65   =   "last_value
3f40: 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  ";.static const 
3f50: 63 68 61 72 20 6e 74 68 5f 76 61 6c 75 65 4e 61  char nth_valueNa
3f60: 6d 65 5b 5d 20 3d 20 20 20 20 22 6e 74 68 5f 76  me[] =    "nth_v
3f70: 61 6c 75 65 22 3b 0a 73 74 61 74 69 63 20 63 6f  alue";.static co
3f80: 6e 73 74 20 63 68 61 72 20 66 69 72 73 74 5f 76  nst char first_v
3f90: 61 6c 75 65 4e 61 6d 65 5b 5d 20 3d 20 20 22 66  alueName[] =  "f
3fa0: 69 72 73 74 5f 76 61 6c 75 65 22 3b 0a 73 74 61  irst_value";.sta
3fb0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6c  tic const char l
3fc0: 65 61 64 4e 61 6d 65 5b 5d 20 3d 20 20 20 20 20  eadName[] =     
3fd0: 20 20 20 20 22 6c 65 61 64 22 3b 0a 73 74 61 74      "lead";.stat
3fe0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6c 61  ic const char la
3ff0: 67 4e 61 6d 65 5b 5d 20 3d 20 20 20 20 20 20 20  gName[] =       
4000: 20 20 20 22 6c 61 67 22 3b 0a 0a 2f 2a 0a 2a 2a     "lag";../*.**
4010: 20 4e 6f 2d 6f 70 20 69 6d 70 6c 65 6d 65 6e 74   No-op implement
4020: 61 74 69 6f 6e 73 20 6f 66 20 78 53 74 65 70 28  ations of xStep(
4030: 29 20 61 6e 64 20 78 46 69 6e 61 6c 69 7a 65 28  ) and xFinalize(
4040: 29 2e 20 20 55 73 65 64 20 61 73 20 70 6c 61 63  ).  Used as plac
4050: 65 2d 68 6f 6c 64 65 72 73 0a 2a 2a 20 66 6f 72  e-holders.** for
4060: 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77   built-in window
4070: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
4080: 6e 65 76 65 72 20 63 61 6c 6c 20 74 68 6f 73 65  never call those
4090: 20 69 6e 74 65 72 66 61 63 65 73 2e 0a 2a 2a 0a   interfaces..**.
40a0: 2a 2a 20 54 68 65 20 6e 6f 6f 70 56 61 6c 75 65  ** The noopValue
40b0: 46 75 6e 63 28 29 20 69 73 20 63 61 6c 6c 65 64  Func() is called
40c0: 20 62 75 74 20 69 73 20 65 78 70 65 63 74 65 64   but is expected
40d0: 20 74 6f 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20   to do nothing. 
40e0: 20 54 68 65 0a 2a 2a 20 6e 6f 6f 70 53 74 65 70   The.** noopStep
40f0: 46 75 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20  Func() is never 
4100: 63 61 6c 6c 65 64 2c 20 61 6e 64 20 73 6f 20 69  called, and so i
4110: 74 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  t is marked with
4120: 20 4e 4f 5f 54 45 53 54 20 74 6f 0a 2a 2a 20 6c   NO_TEST to.** l
4130: 65 74 20 74 68 65 20 74 65 73 74 20 63 6f 76 65  et the test cove
4140: 72 61 67 65 20 72 6f 75 74 69 6e 65 20 6b 6e 6f  rage routine kno
4150: 77 20 6e 6f 74 20 74 6f 20 65 78 70 65 63 74 20  w not to expect 
4160: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f  this function to
4170: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2e 0a   be.** invoked..
4180: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e  */.static void n
4190: 6f 6f 70 53 74 65 70 46 75 6e 63 28 20 20 20 20  oopStepFunc(    
41a0: 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 73 71  /*NO_TEST*/.  sq
41b0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
41c0: 2c 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45  ,        /*NO_TE
41d0: 53 54 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20  ST*/.  int n,   
41e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41f0: 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20    /*NO_TEST*/.  
4200: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
4210: 61 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f  a          /*NO_
4220: 54 45 53 54 2a 2f 0a 29 7b 20 20 20 20 20 20 20  TEST*/.){       
4230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4240: 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a      /*NO_TEST*/.
4250: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
4260: 45 52 28 70 29 3b 20 20 20 20 20 20 20 2f 2a 4e  ER(p);       /*N
4270: 4f 5f 54 45 53 54 2a 2f 0a 20 20 55 4e 55 53 45  O_TEST*/.  UNUSE
4280: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 29 3b 20  D_PARAMETER(n); 
4290: 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a        /*NO_TEST*
42a0: 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  /.  UNUSED_PARAM
42b0: 45 54 45 52 28 61 29 3b 20 20 20 20 20 20 20 2f  ETER(a);       /
42c0: 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 61 73 73  *NO_TEST*/.  ass
42d0: 65 72 74 28 30 29 3b 20 20 20 20 20 20 20 20 20  ert(0);         
42e0: 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53          /*NO_TES
42f0: 54 2a 2f 0a 7d 20 20 20 20 20 20 20 20 20 20 20  T*/.}           
4300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4310: 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 73 74 61   /*NO_TEST*/.sta
4320: 74 69 63 20 76 6f 69 64 20 6e 6f 6f 70 56 61 6c  tic void noopVal
4330: 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  ueFunc(sqlite3_c
4340: 6f 6e 74 65 78 74 20 2a 70 29 7b 20 55 4e 55 53  ontext *p){ UNUS
4350: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b  ED_PARAMETER(p);
4360: 20 2f 2a 6e 6f 2d 6f 70 2a 2f 20 7d 0a 0a 2f 2a   /*no-op*/ }../*
4370: 20 57 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   Window function
4380: 73 20 74 68 61 74 20 75 73 65 20 61 6c 6c 20 77  s that use all w
4390: 69 6e 64 6f 77 20 69 6e 74 65 72 66 61 63 65 73  indow interfaces
43a0: 3a 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c  : xStep, xFinal,
43b0: 0a 2a 2a 20 78 56 61 6c 75 65 2c 20 61 6e 64 20  .** xValue, and 
43c0: 78 49 6e 76 65 72 73 65 20 2a 2f 0a 23 64 65 66  xInverse */.#def
43d0: 69 6e 65 20 57 49 4e 44 4f 57 46 55 4e 43 41 4c  ine WINDOWFUNCAL
43e0: 4c 28 6e 61 6d 65 2c 6e 41 72 67 2c 65 78 74 72  L(name,nArg,extr
43f0: 61 29 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  a) {            
4400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4410: 20 20 20 20 20 20 20 5c 0a 20 20 6e 41 72 67 2c         \.  nArg,
4420: 20 28 53 51 4c 49 54 45 5f 55 54 46 38 7c 53 51   (SQLITE_UTF8|SQ
4430: 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57  LITE_FUNC_WINDOW
4440: 7c 65 78 74 72 61 29 2c 20 30 2c 20 30 2c 20 20  |extra), 0, 0,  
4450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4460: 20 20 20 20 5c 0a 20 20 6e 61 6d 65 20 23 23 20      \.  name ## 
4470: 53 74 65 70 46 75 6e 63 2c 20 6e 61 6d 65 20 23  StepFunc, name #
4480: 23 20 46 69 6e 61 6c 69 7a 65 46 75 6e 63 2c 20  # FinalizeFunc, 
4490: 6e 61 6d 65 20 23 23 20 56 61 6c 75 65 46 75 6e  name ## ValueFun
44a0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
44b0: 20 5c 0a 20 20 6e 61 6d 65 20 23 23 20 49 6e 76   \.  name ## Inv
44c0: 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20 4e 61  Func, name ## Na
44d0: 6d 65 2c 20 7b 30 7d 20 20 20 20 20 20 20 20 20  me, {0}         
44e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
4500: 7d 0a 0a 2f 2a 20 57 69 6e 64 6f 77 20 66 75 6e  }../* Window fun
4510: 63 74 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  ctions that are 
4520: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e  implemented usin
4530: 67 20 62 79 74 65 63 6f 64 65 20 61 6e 64 20 74  g bytecode and t
4540: 68 75 73 20 68 61 76 65 0a 2a 2a 20 6e 6f 2d 6f  hus have.** no-o
4550: 70 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 74  p routines for t
4560: 68 65 69 72 20 6d 65 74 68 6f 64 73 20 2a 2f 0a  heir methods */.
4570: 23 64 65 66 69 6e 65 20 57 49 4e 44 4f 57 46 55  #define WINDOWFU
4580: 4e 43 4e 4f 4f 50 28 6e 61 6d 65 2c 6e 41 72 67  NCNOOP(name,nArg
4590: 2c 65 78 74 72 61 29 20 7b 20 20 20 20 20 20 20  ,extra) {       
45a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45b0: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6e             \.  n
45c0: 41 72 67 2c 20 28 53 51 4c 49 54 45 5f 55 54 46  Arg, (SQLITE_UTF
45d0: 38 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49  8|SQLITE_FUNC_WI
45e0: 4e 44 4f 57 7c 65 78 74 72 61 29 2c 20 30 2c 20  NDOW|extra), 0, 
45f0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4600: 20 20 20 20 20 20 20 20 5c 0a 20 20 6e 6f 6f 70          \.  noop
4610: 53 74 65 70 46 75 6e 63 2c 20 6e 6f 6f 70 56 61  StepFunc, noopVa
4620: 6c 75 65 46 75 6e 63 2c 20 6e 6f 6f 70 56 61 6c  lueFunc, noopVal
4630: 75 65 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20  ueFunc,         
4640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4650: 20 20 20 20 20 5c 0a 20 20 6e 6f 6f 70 53 74 65       \.  noopSte
4660: 70 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20 4e  pFunc, name ## N
4670: 61 6d 65 2c 20 7b 30 7d 20 20 20 20 20 20 20 20  ame, {0}        
4680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46a0: 20 20 5c 0a 7d 0a 0a 2f 2a 20 57 69 6e 64 6f 77    \.}../* Window
46b0: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
46c0: 75 73 65 20 61 6c 6c 20 77 69 6e 64 6f 77 20 69  use all window i
46d0: 6e 74 65 72 66 61 63 65 73 3a 20 78 53 74 65 70  nterfaces: xStep
46e0: 2c 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 72 6f  , the.** same ro
46f0: 75 74 69 6e 65 20 66 6f 72 20 78 46 69 6e 61 6c  utine for xFinal
4700: 69 7a 65 20 61 6e 64 20 78 56 61 6c 75 65 20 61  ize and xValue a
4710: 6e 64 20 77 68 69 63 68 20 6e 65 76 65 72 20 63  nd which never c
4720: 61 6c 6c 0a 2a 2a 20 78 49 6e 76 65 72 73 65 2e  all.** xInverse.
4730: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 44   */.#define WIND
4740: 4f 57 46 55 4e 43 58 28 6e 61 6d 65 2c 6e 41 72  OWFUNCX(name,nAr
4750: 67 2c 65 78 74 72 61 29 20 7b 20 20 20 20 20 20  g,extra) {      
4760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
4780: 0a 20 20 6e 41 72 67 2c 20 28 53 51 4c 49 54 45  .  nArg, (SQLITE
4790: 5f 55 54 46 38 7c 53 51 4c 49 54 45 5f 46 55 4e  _UTF8|SQLITE_FUN
47a0: 43 5f 57 49 4e 44 4f 57 7c 65 78 74 72 61 29 2c  C_WINDOW|extra),
47b0: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 20 20   0, 0,          
47c0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
47d0: 6e 61 6d 65 20 23 23 20 53 74 65 70 46 75 6e 63  name ## StepFunc
47e0: 2c 20 6e 61 6d 65 20 23 23 20 56 61 6c 75 65 46  , name ## ValueF
47f0: 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20 56 61 6c  unc, name ## Val
4800: 75 65 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20  ueFunc,         
4810: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6e 6f 6f           \.  noo
4820: 70 53 74 65 70 46 75 6e 63 2c 20 6e 61 6d 65 20  pStepFunc, name 
4830: 23 23 20 4e 61 6d 65 2c 20 7b 30 7d 20 20 20 20  ## Name, {0}    
4840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4860: 20 20 20 20 20 20 5c 0a 7d 0a 0a 0a 2f 2a 0a 2a        \.}.../*.*
4870: 2a 20 52 65 67 69 73 74 65 72 20 74 68 6f 73 65  * Register those
4880: 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77   built-in window
4890: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
48a0: 61 72 65 20 6e 6f 74 20 61 6c 73 6f 20 61 67 67  are not also agg
48b0: 72 65 67 61 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64  regates..*/.void
48c0: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 46 75   sqlite3WindowFu
48d0: 6e 63 74 69 6f 6e 73 28 76 6f 69 64 29 7b 0a 20  nctions(void){. 
48e0: 20 73 74 61 74 69 63 20 46 75 6e 63 44 65 66 20   static FuncDef 
48f0: 61 57 69 6e 64 6f 77 46 75 6e 63 73 5b 5d 20 3d  aWindowFuncs[] =
4900: 20 7b 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e   {.    WINDOWFUN
4910: 43 58 28 72 6f 77 5f 6e 75 6d 62 65 72 2c 20 30  CX(row_number, 0
4920: 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57  , 0),.    WINDOW
4930: 46 55 4e 43 58 28 64 65 6e 73 65 5f 72 61 6e 6b  FUNCX(dense_rank
4940: 2c 20 30 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e  , 0, 0),.    WIN
4950: 44 4f 57 46 55 4e 43 58 28 72 61 6e 6b 2c 20 30  DOWFUNCX(rank, 0
4960: 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57  , 0),.    WINDOW
4970: 46 55 4e 43 41 4c 4c 28 70 65 72 63 65 6e 74 5f  FUNCALL(percent_
4980: 72 61 6e 6b 2c 20 30 2c 20 30 29 2c 0a 20 20 20  rank, 0, 0),.   
4990: 20 57 49 4e 44 4f 57 46 55 4e 43 41 4c 4c 28 63   WINDOWFUNCALL(c
49a0: 75 6d 65 5f 64 69 73 74 2c 20 30 2c 20 30 29 2c  ume_dist, 0, 0),
49b0: 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 41  .    WINDOWFUNCA
49c0: 4c 4c 28 6e 74 69 6c 65 2c 20 31 2c 20 30 29 2c  LL(ntile, 1, 0),
49d0: 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 41  .    WINDOWFUNCA
49e0: 4c 4c 28 6c 61 73 74 5f 76 61 6c 75 65 2c 20 31  LL(last_value, 1
49f0: 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57  , 0),.    WINDOW
4a00: 46 55 4e 43 41 4c 4c 28 6e 74 68 5f 76 61 6c 75  FUNCALL(nth_valu
4a10: 65 2c 20 32 2c 20 30 29 2c 0a 20 20 20 20 57 49  e, 2, 0),.    WI
4a20: 4e 44 4f 57 46 55 4e 43 41 4c 4c 28 66 69 72 73  NDOWFUNCALL(firs
4a30: 74 5f 76 61 6c 75 65 2c 20 31 2c 20 30 29 2c 0a  t_value, 1, 0),.
4a40: 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f      WINDOWFUNCNO
4a50: 4f 50 28 6c 65 61 64 2c 20 31 2c 20 30 29 2c 0a  OP(lead, 1, 0),.
4a60: 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f      WINDOWFUNCNO
4a70: 4f 50 28 6c 65 61 64 2c 20 32 2c 20 30 29 2c 0a  OP(lead, 2, 0),.
4a80: 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f      WINDOWFUNCNO
4a90: 4f 50 28 6c 65 61 64 2c 20 33 2c 20 30 29 2c 0a  OP(lead, 3, 0),.
4aa0: 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f      WINDOWFUNCNO
4ab0: 4f 50 28 6c 61 67 2c 20 31 2c 20 30 29 2c 0a 20  OP(lag, 1, 0),. 
4ac0: 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f 4f     WINDOWFUNCNOO
4ad0: 50 28 6c 61 67 2c 20 32 2c 20 30 29 2c 0a 20 20  P(lag, 2, 0),.  
4ae0: 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f 4f 50    WINDOWFUNCNOOP
4af0: 28 6c 61 67 2c 20 33 2c 20 30 29 2c 0a 20 20 7d  (lag, 3, 0),.  }
4b00: 3b 0a 20 20 73 71 6c 69 74 65 33 49 6e 73 65 72  ;.  sqlite3Inser
4b10: 74 42 75 69 6c 74 69 6e 46 75 6e 63 73 28 61 57  tBuiltinFuncs(aW
4b20: 69 6e 64 6f 77 46 75 6e 63 73 2c 20 41 72 72 61  indowFuncs, Arra
4b30: 79 53 69 7a 65 28 61 57 69 6e 64 6f 77 46 75 6e  ySize(aWindowFun
4b40: 63 73 29 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  cs));.}..static 
4b50: 57 69 6e 64 6f 77 20 2a 77 69 6e 64 6f 77 46 69  Window *windowFi
4b60: 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  nd(Parse *pParse
4b70: 2c 20 57 69 6e 64 6f 77 20 2a 70 4c 69 73 74 2c  , Window *pList,
4b80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
4b90: 6d 65 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70  me){.  Window *p
4ba0: 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b  ;.  for(p=pList;
4bb0: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 57 69   p; p=p->pNextWi
4bc0: 6e 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  n){.    if( sqli
4bd0: 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 7a 4e  te3StrICmp(p->zN
4be0: 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29  ame, zName)==0 )
4bf0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
4c00: 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ( p==0 ){.    sq
4c10: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
4c20: 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 77  arse, "no such w
4c30: 69 6e 64 6f 77 3a 20 25 73 22 2c 20 7a 4e 61 6d  indow: %s", zNam
4c40: 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
4c50: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   p;.}../*.** Thi
4c60: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
4c70: 6c 6c 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  lled immediately
4c80: 20 61 66 74 65 72 20 72 65 73 6f 6c 76 69 6e 67   after resolving
4c90: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61   the function na
4ca0: 6d 65 0a 2a 2a 20 66 6f 72 20 61 20 77 69 6e 64  me.** for a wind
4cb0: 6f 77 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  ow function with
4cc0: 69 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  in a SELECT stat
4cd0: 65 6d 65 6e 74 2e 20 41 72 67 75 6d 65 6e 74 20  ement. Argument 
4ce0: 70 4c 69 73 74 20 69 73 20 61 0a 2a 2a 20 6c 69  pList is a.** li
4cf0: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 57 49 4e  nked list of WIN
4d00: 44 4f 57 20 64 65 66 69 6e 69 74 69 6f 6e 73 20  DOW definitions 
4d10: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
4d20: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
4d30: 2e 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 46  ..** Argument pF
4d40: 75 6e 63 20 69 73 20 74 68 65 20 66 75 6e 63 74  unc is the funct
4d50: 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 6a  ion definition j
4d60: 75 73 74 20 72 65 73 6f 6c 76 65 64 20 61 6e 64  ust resolved and
4d70: 20 70 57 69 6e 0a 2a 2a 20 69 73 20 74 68 65 20   pWin.** is the 
4d80: 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 72 65  Window object re
4d90: 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 61  presenting the a
4da0: 73 73 6f 63 69 61 74 65 64 20 4f 56 45 52 20 63  ssociated OVER c
4db0: 6c 61 75 73 65 2e 20 54 68 69 73 0a 2a 2a 20 66  lause. This.** f
4dc0: 75 6e 63 74 69 6f 6e 20 75 70 64 61 74 65 73 20  unction updates 
4dd0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
4de0: 70 57 69 6e 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  pWin as follows:
4df0: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68  .**.**   * If th
4e00: 65 20 4f 56 45 52 20 63 6c 61 75 73 65 20 72 65  e OVER clause re
4e10: 66 65 72 65 64 20 74 6f 20 61 20 6e 61 6d 65 64  fered to a named
4e20: 20 77 69 6e 64 6f 77 20 28 61 73 20 69 6e 20 22   window (as in "
4e30: 6d 61 78 28 78 29 20 4f 56 45 52 20 77 69 6e 22  max(x) OVER win"
4e40: 29 2c 0a 2a 2a 20 20 20 20 20 73 65 61 72 63 68  ),.**     search
4e50: 20 6c 69 73 74 20 70 4c 69 73 74 20 66 6f 72 20   list pList for 
4e60: 61 20 6d 61 74 63 68 69 6e 67 20 57 49 4e 44 4f  a matching WINDO
4e70: 57 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 61 6e  W definition, an
4e80: 64 20 75 70 64 61 74 65 20 70 57 69 6e 0a 2a 2a  d update pWin.**
4e90: 20 20 20 20 20 61 63 63 6f 72 64 69 6e 67 6c 79       accordingly
4ea0: 2e 20 49 66 20 6e 6f 20 73 75 63 68 20 57 49 4e  . If no such WIN
4eb0: 44 4f 57 20 63 6c 61 75 73 65 20 63 61 6e 20 62  DOW clause can b
4ec0: 65 20 66 6f 75 6e 64 2c 20 6c 65 61 76 65 20 61  e found, leave a
4ed0: 6e 20 65 72 72 6f 72 0a 2a 2a 20 20 20 20 20 69  n error.**     i
4ee0: 6e 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20  n pParse..**.** 
4ef0: 20 20 2a 20 49 66 20 74 68 65 20 66 75 6e 63 74    * If the funct
4f00: 69 6f 6e 20 69 73 20 61 20 62 75 69 6c 74 2d 69  ion is a built-i
4f10: 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  n window functio
4f20: 6e 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20  n that requires 
4f30: 74 68 65 0a 2a 2a 20 20 20 20 20 77 69 6e 64 6f  the.**     windo
4f40: 77 20 74 6f 20 62 65 20 63 6f 65 72 63 65 64 20  w to be coerced 
4f50: 28 73 65 65 20 22 42 55 49 4c 54 2d 49 4e 20 57  (see "BUILT-IN W
4f60: 49 4e 44 4f 57 20 46 55 4e 43 54 49 4f 4e 53 22  INDOW FUNCTIONS"
4f70: 20 61 74 20 74 68 65 20 74 6f 70 0a 2a 2a 20 20   at the top.**  
4f80: 20 20 20 6f 66 20 74 68 69 73 20 66 69 6c 65 29     of this file)
4f90: 2c 20 70 57 69 6e 20 69 73 20 75 70 64 61 74 65  , pWin is update
4fa0: 64 20 68 65 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20  d here..*/.void 
4fb0: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 55 70 64  sqlite3WindowUpd
4fc0: 61 74 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ate(.  Parse *pP
4fd0: 61 72 73 65 2c 20 0a 20 20 57 69 6e 64 6f 77 20  arse, .  Window 
4fe0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  *pList,         
4ff0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
5000: 20 6f 66 20 6e 61 6d 65 64 20 77 69 6e 64 6f 77   of named window
5010: 73 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43  s for this SELEC
5020: 54 20 2a 2f 0a 20 20 57 69 6e 64 6f 77 20 2a 70  T */.  Window *p
5030: 57 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  Win,            
5040: 20 20 20 20 20 20 20 2f 2a 20 57 69 6e 64 6f 77         /* Window
5050: 20 66 72 61 6d 65 20 74 6f 20 75 70 64 61 74 65   frame to update
5060: 20 2a 2f 0a 20 20 46 75 6e 63 44 65 66 20 2a 70   */.  FuncDef *p
5070: 46 75 6e 63 20 20 20 20 20 20 20 20 20 20 20 20  Func            
5080: 20 20 20 20 20 20 2f 2a 20 57 69 6e 64 6f 77 20        /* Window 
5090: 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74  function definit
50a0: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ion */.){.  if( 
50b0: 70 57 69 6e 2d 3e 7a 4e 61 6d 65 20 26 26 20 70  pWin->zName && p
50c0: 57 69 6e 2d 3e 65 46 72 6d 54 79 70 65 3d 3d 30  Win->eFrmType==0
50d0: 20 29 7b 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a   ){.    Window *
50e0: 70 20 3d 20 77 69 6e 64 6f 77 46 69 6e 64 28 70  p = windowFind(p
50f0: 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 57  Parse, pList, pW
5100: 69 6e 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  in->zName);.    
5110: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
5120: 6e 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70 50 61  n;.    pWin->pPa
5130: 72 74 69 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65  rtition = sqlite
5140: 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 50 61  3ExprListDup(pPa
5150: 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 50 61 72  rse->db, p->pPar
5160: 74 69 74 69 6f 6e 2c 20 30 29 3b 0a 20 20 20 20  tition, 0);.    
5170: 70 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pWin->pOrderBy =
5180: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
5190: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
51a0: 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 30 29 3b  p->pOrderBy, 0);
51b0: 0a 20 20 20 20 70 57 69 6e 2d 3e 70 53 74 61 72  .    pWin->pStar
51c0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
51d0: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
51e0: 2d 3e 70 53 74 61 72 74 2c 20 30 29 3b 0a 20 20  ->pStart, 0);.  
51f0: 20 20 70 57 69 6e 2d 3e 70 45 6e 64 20 3d 20 73    pWin->pEnd = s
5200: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50  qlite3ExprDup(pP
5210: 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 45 6e  arse->db, p->pEn
5220: 64 2c 20 30 29 3b 0a 20 20 20 20 70 57 69 6e 2d  d, 0);.    pWin-
5230: 3e 65 53 74 61 72 74 20 3d 20 70 2d 3e 65 53 74  >eStart = p->eSt
5240: 61 72 74 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 65  art;.    pWin->e
5250: 45 6e 64 20 3d 20 70 2d 3e 65 45 6e 64 3b 0a 20  End = p->eEnd;. 
5260: 20 20 20 70 57 69 6e 2d 3e 65 46 72 6d 54 79 70     pWin->eFrmTyp
5270: 65 20 3d 20 70 2d 3e 65 46 72 6d 54 79 70 65 3b  e = p->eFrmType;
5280: 0a 20 20 20 20 70 57 69 6e 2d 3e 65 45 78 63 6c  .    pWin->eExcl
5290: 75 64 65 20 3d 20 70 2d 3e 65 45 78 63 6c 75 64  ude = p->eExclud
52a0: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
52b0: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 68 61  sqlite3WindowCha
52c0: 69 6e 28 70 50 61 72 73 65 2c 20 70 57 69 6e 2c  in(pParse, pWin,
52d0: 20 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69   pList);.  }.  i
52e0: 66 28 20 28 70 57 69 6e 2d 3e 65 46 72 6d 54 79  f( (pWin->eFrmTy
52f0: 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 29 0a 20 20  pe==TK_RANGE).  
5300: 20 26 26 20 28 70 57 69 6e 2d 3e 70 53 74 61 72   && (pWin->pStar
5310: 74 20 7c 7c 20 70 57 69 6e 2d 3e 70 45 6e 64 29  t || pWin->pEnd)
5320: 20 0a 20 20 20 26 26 20 28 70 57 69 6e 2d 3e 70   .   && (pWin->p
5330: 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 57  OrderBy==0 || pW
5340: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  in->pOrderBy->nE
5350: 78 70 72 21 3d 31 29 0a 20 20 29 7b 0a 20 20 20  xpr!=1).  ){.   
5360: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
5370: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
5380: 22 52 41 4e 47 45 20 77 69 74 68 20 6f 66 66 73  "RANGE with offs
5390: 65 74 20 50 52 45 43 45 44 49 4e 47 2f 46 4f 4c  et PRECEDING/FOL
53a0: 4c 4f 57 49 4e 47 20 72 65 71 75 69 72 65 73 20  LOWING requires 
53b0: 6f 6e 65 20 4f 52 44 45 52 20 42 59 20 65 78 70  one ORDER BY exp
53c0: 72 65 73 73 69 6f 6e 22 0a 20 20 20 20 29 3b 0a  ression".    );.
53d0: 20 20 7d 65 6c 73 65 0a 20 20 69 66 28 20 70 46    }else.  if( pF
53e0: 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  unc->funcFlags &
53f0: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e   SQLITE_FUNC_WIN
5400: 44 4f 57 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  DOW ){.    sqlit
5410: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
5420: 3e 64 62 3b 0a 20 20 20 20 69 66 28 20 70 57 69  >db;.    if( pWi
5430: 6e 2d 3e 70 46 69 6c 74 65 72 20 29 7b 0a 20 20  n->pFilter ){.  
5440: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
5450: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
5460: 20 20 20 20 20 20 20 22 46 49 4c 54 45 52 20 63         "FILTER c
5470: 6c 61 75 73 65 20 6d 61 79 20 6f 6e 6c 79 20 62  lause may only b
5480: 65 20 75 73 65 64 20 77 69 74 68 20 61 67 67 72  e used with aggr
5490: 65 67 61 74 65 20 77 69 6e 64 6f 77 20 66 75 6e  egate window fun
54a0: 63 74 69 6f 6e 73 22 0a 20 20 20 20 20 20 29 3b  ctions".      );
54b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
54c0: 20 20 73 74 72 75 63 74 20 57 69 6e 64 6f 77 55    struct WindowU
54d0: 70 64 61 74 65 20 7b 0a 20 20 20 20 20 20 20 20  pdate {.        
54e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
54f0: 63 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65  c;.        int e
5500: 46 72 6d 54 79 70 65 3b 0a 20 20 20 20 20 20 20  FrmType;.       
5510: 20 69 6e 74 20 65 53 74 61 72 74 3b 0a 20 20 20   int eStart;.   
5520: 20 20 20 20 20 69 6e 74 20 65 45 6e 64 3b 0a 20       int eEnd;. 
5530: 20 20 20 20 20 7d 20 61 55 70 5b 5d 20 3d 20 7b       } aUp[] = {
5540: 0a 20 20 20 20 20 20 20 20 7b 20 72 6f 77 5f 6e  .        { row_n
5550: 75 6d 62 65 72 4e 61 6d 65 2c 20 20 20 54 4b 5f  umberName,   TK_
5560: 52 4f 57 53 2c 20 20 20 54 4b 5f 55 4e 42 4f 55  ROWS,   TK_UNBOU
5570: 4e 44 45 44 2c 20 54 4b 5f 43 55 52 52 45 4e 54  NDED, TK_CURRENT
5580: 20 7d 2c 20 0a 20 20 20 20 20 20 20 20 7b 20 64   }, .        { d
5590: 65 6e 73 65 5f 72 61 6e 6b 4e 61 6d 65 2c 20 20  ense_rankName,  
55a0: 20 54 4b 5f 52 41 4e 47 45 2c 20 20 54 4b 5f 55   TK_RANGE,  TK_U
55b0: 4e 42 4f 55 4e 44 45 44 2c 20 54 4b 5f 43 55 52  NBOUNDED, TK_CUR
55c0: 52 45 4e 54 20 7d 2c 20 0a 20 20 20 20 20 20 20  RENT }, .       
55d0: 20 7b 20 72 61 6e 6b 4e 61 6d 65 2c 20 20 20 20   { rankName,    
55e0: 20 20 20 20 20 54 4b 5f 52 41 4e 47 45 2c 20 20       TK_RANGE,  
55f0: 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 2c 20 54 4b  TK_UNBOUNDED, TK
5600: 5f 43 55 52 52 45 4e 54 20 7d 2c 20 0a 20 20 20  _CURRENT }, .   
5610: 20 20 20 20 20 7b 20 70 65 72 63 65 6e 74 5f 72       { percent_r
5620: 61 6e 6b 4e 61 6d 65 2c 20 54 4b 5f 47 52 4f 55  ankName, TK_GROU
5630: 50 53 2c 20 54 4b 5f 43 55 52 52 45 4e 54 2c 20  PS, TK_CURRENT, 
5640: 20 20 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 7d    TK_UNBOUNDED }
5650: 2c 20 0a 20 20 20 20 20 20 20 20 7b 20 63 75 6d  , .        { cum
5660: 65 5f 64 69 73 74 4e 61 6d 65 2c 20 20 20 20 54  e_distName,    T
5670: 4b 5f 47 52 4f 55 50 53 2c 20 54 4b 5f 46 4f 4c  K_GROUPS, TK_FOL
5680: 4c 4f 57 49 4e 47 2c 20 54 4b 5f 55 4e 42 4f 55  LOWING, TK_UNBOU
5690: 4e 44 45 44 20 7d 2c 20 0a 20 20 20 20 20 20 20  NDED }, .       
56a0: 20 7b 20 6e 74 69 6c 65 4e 61 6d 65 2c 20 20 20   { ntileName,   
56b0: 20 20 20 20 20 54 4b 5f 52 4f 57 53 2c 20 20 20       TK_ROWS,   
56c0: 54 4b 5f 43 55 52 52 45 4e 54 2c 20 20 20 54 4b  TK_CURRENT,   TK
56d0: 5f 55 4e 42 4f 55 4e 44 45 44 20 7d 2c 20 0a 20  _UNBOUNDED }, . 
56e0: 20 20 20 20 20 20 20 7b 20 6c 65 61 64 4e 61 6d         { leadNam
56f0: 65 2c 20 20 20 20 20 20 20 20 20 54 4b 5f 52 4f  e,         TK_RO
5700: 57 53 2c 20 20 20 54 4b 5f 55 4e 42 4f 55 4e 44  WS,   TK_UNBOUND
5710: 45 44 2c 20 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  ED, TK_UNBOUNDED
5720: 20 7d 2c 20 0a 20 20 20 20 20 20 20 20 7b 20 6c   }, .        { l
5730: 61 67 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  agName,         
5740: 20 54 4b 5f 52 4f 57 53 2c 20 20 20 54 4b 5f 55   TK_ROWS,   TK_U
5750: 4e 42 4f 55 4e 44 45 44 2c 20 54 4b 5f 43 55 52  NBOUNDED, TK_CUR
5760: 52 45 4e 54 20 7d 2c 20 0a 20 20 20 20 20 20 7d  RENT }, .      }
5770: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
5780: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
5790: 41 72 72 61 79 53 69 7a 65 28 61 55 70 29 3b 20  ArraySize(aUp); 
57a0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
57b0: 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d  ( pFunc->zName==
57c0: 61 55 70 5b 69 5d 2e 7a 46 75 6e 63 20 29 7b 0a  aUp[i].zFunc ){.
57d0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
57e0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
57f0: 70 57 69 6e 2d 3e 70 53 74 61 72 74 29 3b 0a 20  pWin->pStart);. 
5800: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
5810: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
5820: 57 69 6e 2d 3e 70 45 6e 64 29 3b 0a 20 20 20 20  Win->pEnd);.    
5830: 20 20 20 20 20 20 70 57 69 6e 2d 3e 70 45 6e 64        pWin->pEnd
5840: 20 3d 20 70 57 69 6e 2d 3e 70 53 74 61 72 74 20   = pWin->pStart 
5850: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 0;.          p
5860: 57 69 6e 2d 3e 65 46 72 6d 54 79 70 65 20 3d 20  Win->eFrmType = 
5870: 61 55 70 5b 69 5d 2e 65 46 72 6d 54 79 70 65 3b  aUp[i].eFrmType;
5880: 0a 20 20 20 20 20 20 20 20 20 20 70 57 69 6e 2d  .          pWin-
5890: 3e 65 53 74 61 72 74 20 3d 20 61 55 70 5b 69 5d  >eStart = aUp[i]
58a0: 2e 65 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20  .eStart;.       
58b0: 20 20 20 70 57 69 6e 2d 3e 65 45 6e 64 20 3d 20     pWin->eEnd = 
58c0: 61 55 70 5b 69 5d 2e 65 45 6e 64 3b 0a 20 20 20  aUp[i].eEnd;.   
58d0: 20 20 20 20 20 20 20 70 57 69 6e 2d 3e 65 45 78         pWin->eEx
58e0: 63 6c 75 64 65 20 3d 20 30 3b 0a 20 20 20 20 20  clude = 0;.     
58f0: 20 20 20 20 20 69 66 28 20 70 57 69 6e 2d 3e 65       if( pWin->e
5900: 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57  Start==TK_FOLLOW
5910: 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ING ){.         
5920: 20 20 20 70 57 69 6e 2d 3e 70 53 74 61 72 74 20     pWin->pStart 
5930: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
5940: 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 22 31  , TK_INTEGER, "1
5950: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ");.          }.
5960: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
5970: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5980: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70   }.    }.  }.  p
5990: 57 69 6e 2d 3e 70 46 75 6e 63 20 3d 20 70 46 75  Win->pFunc = pFu
59a0: 6e 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  nc;.}../*.** Con
59b0: 74 65 78 74 20 6f 62 6a 65 63 74 20 70 61 73 73  text object pass
59c0: 65 64 20 74 68 72 6f 75 67 68 20 73 71 6c 69 74  ed through sqlit
59d0: 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 29  e3WalkExprList()
59e0: 20 74 6f 0a 2a 2a 20 73 65 6c 65 63 74 57 69 6e   to.** selectWin
59f0: 64 6f 77 52 65 77 72 69 74 65 45 78 70 72 43 62  dowRewriteExprCb
5a00: 28 29 20 62 79 20 73 65 6c 65 63 74 57 69 6e 64  () by selectWind
5a10: 6f 77 52 65 77 72 69 74 65 45 4c 69 73 74 28 29  owRewriteEList()
5a20: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
5a30: 75 63 74 20 57 69 6e 64 6f 77 52 65 77 72 69 74  uct WindowRewrit
5a40: 65 20 57 69 6e 64 6f 77 52 65 77 72 69 74 65 3b  e WindowRewrite;
5a50: 0a 73 74 72 75 63 74 20 57 69 6e 64 6f 77 52 65  .struct WindowRe
5a60: 77 72 69 74 65 20 7b 0a 20 20 57 69 6e 64 6f 77  write {.  Window
5a70: 20 2a 70 57 69 6e 3b 0a 20 20 53 72 63 4c 69 73   *pWin;.  SrcLis
5a80: 74 20 2a 70 53 72 63 3b 0a 20 20 45 78 70 72 4c  t *pSrc;.  ExprL
5a90: 69 73 74 20 2a 70 53 75 62 3b 0a 20 20 53 65 6c  ist *pSub;.  Sel
5aa0: 65 63 74 20 2a 70 53 75 62 53 65 6c 65 63 74 3b  ect *pSubSelect;
5ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5ac0: 43 75 72 72 65 6e 74 20 73 75 62 2d 73 65 6c 65  Current sub-sele
5ad0: 63 74 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 7d 3b  ct, if any */.};
5ae0: 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 62 61 63 6b  ../*.** Callback
5af0: 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 64 20 62   function used b
5b00: 79 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65  y selectWindowRe
5b10: 77 72 69 74 65 45 4c 69 73 74 28 29 2e 20 49 66  writeEList(). If
5b20: 20 6e 65 63 65 73 73 61 72 79 2c 0a 2a 2a 20 74   necessary,.** t
5b30: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 70 70  his function app
5b40: 65 6e 64 73 20 74 6f 20 74 68 65 20 6f 75 74 70  ends to the outp
5b50: 75 74 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69  ut expression-li
5b60: 73 74 20 61 6e 64 20 75 70 64 61 74 65 73 20 0a  st and updates .
5b70: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 28 2a  ** expression (*
5b80: 70 70 45 78 70 72 29 20 69 6e 20 70 6c 61 63 65  ppExpr) in place
5b90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5ba0: 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72  selectWindowRewr
5bb0: 69 74 65 45 78 70 72 43 62 28 57 61 6c 6b 65 72  iteExprCb(Walker
5bc0: 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
5bd0: 2a 70 45 78 70 72 29 7b 0a 20 20 73 74 72 75 63  *pExpr){.  struc
5be0: 74 20 57 69 6e 64 6f 77 52 65 77 72 69 74 65 20  t WindowRewrite 
5bf0: 2a 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  *p = pWalker->u.
5c00: 70 52 65 77 72 69 74 65 3b 0a 20 20 50 61 72 73  pRewrite;.  Pars
5c10: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c  e *pParse = pWal
5c20: 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 0a 20 20  ker->pParse;..  
5c30: 2f 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74  /* If this funct
5c40: 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c  ion is being cal
5c50: 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  led from within 
5c60: 61 20 73 63 61 6c 61 72 20 73 75 62 2d 73 65 6c  a scalar sub-sel
5c70: 65 63 74 0a 20 20 2a 2a 20 74 68 61 74 20 75 73  ect.  ** that us
5c80: 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54  ed by the SELECT
5c90: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
5ca0: 20 70 72 6f 63 65 73 73 65 64 2c 20 6f 6e 6c 79   processed, only
5cb0: 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 54 4b   process.  ** TK
5cc0: 5f 43 4f 4c 55 4d 4e 20 65 78 70 72 65 73 73 69  _COLUMN expressi
5cd0: 6f 6e 73 20 74 68 61 74 20 72 65 66 65 72 20 74  ons that refer t
5ce0: 6f 20 69 74 20 28 74 68 65 20 6f 75 74 65 72 20  o it (the outer 
5cf0: 53 45 4c 45 43 54 29 2e 20 44 6f 0a 20 20 2a 2a  SELECT). Do.  **
5d00: 20 6e 6f 74 20 70 72 6f 63 65 73 73 20 61 67 67   not process agg
5d10: 72 65 67 61 74 65 73 20 6f 72 20 77 69 6e 64 6f  regates or windo
5d20: 77 20 66 75 6e 63 74 69 6f 6e 73 20 61 74 20 61  w functions at a
5d30: 6c 6c 2c 20 61 73 20 74 68 65 79 20 62 65 6c 6f  ll, as they belo
5d40: 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 73  ng.  ** to the s
5d50: 63 61 6c 61 72 20 73 75 62 2d 73 65 6c 65 63 74  calar sub-select
5d60: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
5d70: 53 75 62 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  SubSelect ){.   
5d80: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
5d90: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
5da0: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
5db0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 65 6c 73  ntinue;.    }els
5dc0: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 72  e{.      int nSr
5dd0: 63 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72  c = p->pSrc->nSr
5de0: 63 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  c;.      int i;.
5df0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
5e00: 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nSrc; i++){.   
5e10: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
5e20: 69 54 61 62 6c 65 3d 3d 70 2d 3e 70 53 72 63 2d  iTable==p->pSrc-
5e30: 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 29 20  >a[i].iCursor ) 
5e40: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
5e50: 20 20 20 20 20 69 66 28 20 69 3d 3d 6e 53 72 63       if( i==nSrc
5e60: 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f   ) return WRC_Co
5e70: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
5e80: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  }..  switch( pEx
5e90: 70 72 2d 3e 6f 70 20 29 7b 0a 0a 20 20 20 20 63  pr->op ){..    c
5ea0: 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
5eb0: 0a 20 20 20 20 20 20 69 66 28 20 21 45 78 70 72  .      if( !Expr
5ec0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
5ed0: 72 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29  r, EP_WinFunc) )
5ee0: 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
5ef0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5f00: 20 20 20 20 20 20 57 69 6e 64 6f 77 20 2a 70 57        Window *pW
5f10: 69 6e 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  in;.        for(
5f20: 70 57 69 6e 3d 70 2d 3e 70 57 69 6e 3b 20 70 57  pWin=p->pWin; pW
5f30: 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70  in; pWin=pWin->p
5f40: 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 20 20  NextWin){.      
5f50: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 79      if( pExpr->y
5f60: 2e 70 57 69 6e 3d 3d 70 57 69 6e 20 29 7b 0a 20  .pWin==pWin ){. 
5f70: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
5f80: 74 28 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 3d  t( pWin->pOwner=
5f90: 3d 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  =pExpr );.      
5fa0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
5fb0: 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 20 20  _Prune;.        
5fc0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
5fd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46      }.      /* F
5fe0: 61 6c 6c 20 74 68 72 6f 75 67 68 2e 20 20 2a 2f  all through.  */
5ff0: 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  ..    case TK_AG
6000: 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  G_FUNCTION:.    
6010: 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
6020: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 44  {.      Expr *pD
6030: 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  up = sqlite3Expr
6040: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
6050: 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  pExpr, 0);.     
6060: 20 70 2d 3e 70 53 75 62 20 3d 20 73 71 6c 69 74   p->pSub = sqlit
6070: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
6080: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 53 75 62  (pParse, p->pSub
6090: 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 69  , pDup);.      i
60a0: 66 28 20 70 2d 3e 70 53 75 62 20 29 7b 0a 20 20  f( p->pSub ){.  
60b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78        assert( Ex
60c0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
60d0: 78 70 72 2c 20 45 50 5f 53 74 61 74 69 63 29 3d  xpr, EP_Static)=
60e0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 45 78  =0 );.        Ex
60f0: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
6100: 78 70 72 2c 20 45 50 5f 53 74 61 74 69 63 29 3b  xpr, EP_Static);
6110: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6120: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
6130: 65 2d 3e 64 62 2c 20 70 45 78 70 72 29 3b 0a 20  e->db, pExpr);. 
6140: 20 20 20 20 20 20 20 45 78 70 72 43 6c 65 61 72         ExprClear
6150: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
6160: 45 50 5f 53 74 61 74 69 63 29 3b 0a 20 20 20 20  EP_Static);.    
6170: 20 20 20 20 6d 65 6d 73 65 74 28 70 45 78 70 72      memset(pExpr
6180: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  , 0, sizeof(Expr
6190: 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 70 45 78  ));..        pEx
61a0: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55  pr->op = TK_COLU
61b0: 4d 4e 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70  MN;.        pExp
61c0: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 2d 3e  r->iColumn = p->
61d0: 70 53 75 62 2d 3e 6e 45 78 70 72 2d 31 3b 0a 20  pSub->nExpr-1;. 
61e0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
61f0: 61 62 6c 65 20 3d 20 70 2d 3e 70 57 69 6e 2d 3e  able = p->pWin->
6200: 69 45 70 68 43 73 72 3b 0a 20 20 20 20 20 20 7d  iEphCsr;.      }
6210: 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ..      break;. 
6220: 20 20 20 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c     }..    defaul
6230: 74 3a 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20  t: /* no-op */. 
6240: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
6250: 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
6260: 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63  ntinue;.}.static
6270: 20 69 6e 74 20 73 65 6c 65 63 74 57 69 6e 64 6f   int selectWindo
6280: 77 52 65 77 72 69 74 65 53 65 6c 65 63 74 43 62  wRewriteSelectCb
6290: 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
62a0: 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
62b0: 74 29 7b 0a 20 20 73 74 72 75 63 74 20 57 69 6e  t){.  struct Win
62c0: 64 6f 77 52 65 77 72 69 74 65 20 2a 70 20 3d 20  dowRewrite *p = 
62d0: 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 52 65 77 72  pWalker->u.pRewr
62e0: 69 74 65 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  ite;.  Select *p
62f0: 53 61 76 65 20 3d 20 70 2d 3e 70 53 75 62 53 65  Save = p->pSubSe
6300: 6c 65 63 74 3b 0a 20 20 69 66 28 20 70 53 61 76  lect;.  if( pSav
6310: 65 3d 3d 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  e==pSelect ){.  
6320: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
6330: 74 69 6e 75 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tinue;.  }else{.
6340: 20 20 20 20 70 2d 3e 70 53 75 62 53 65 6c 65 63      p->pSubSelec
6350: 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20 20  t = pSelect;.   
6360: 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
6370: 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c  ct(pWalker, pSel
6380: 65 63 74 29 3b 0a 20 20 20 20 70 2d 3e 70 53 75  ect);.    p->pSu
6390: 62 53 65 6c 65 63 74 20 3d 20 70 53 61 76 65 3b  bSelect = pSave;
63a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
63b0: 43 5f 50 72 75 6e 65 3b 0a 7d 0a 0a 0a 2f 2a 0a  C_Prune;.}.../*.
63c0: 2a 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75  ** Iterate throu
63d0: 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69  gh each expressi
63e0: 6f 6e 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  on in expression
63f0: 2d 6c 69 73 74 20 70 45 4c 69 73 74 2e 20 46 6f  -list pEList. Fo
6400: 72 20 65 61 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20  r each:.**.**   
6410: 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 2c 0a 2a 2a 20  * TK_COLUMN,.** 
6420: 20 20 2a 20 61 67 67 72 65 67 61 74 65 20 66 75    * aggregate fu
6430: 6e 63 74 69 6f 6e 2c 20 6f 72 0a 2a 2a 20 20 20  nction, or.**   
6440: 2a 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  * window functio
6450: 6e 20 77 69 74 68 20 61 20 57 69 6e 64 6f 77 20  n with a Window 
6460: 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73 20 6e  object that is n
6470: 6f 74 20 61 20 6d 65 6d 62 65 72 20 6f 66 20 74  ot a member of t
6480: 68 65 20 0a 2a 2a 20 20 20 20 20 57 69 6e 64 6f  he .**     Windo
6490: 77 20 6c 69 73 74 20 70 61 73 73 65 64 20 61 73  w list passed as
64a0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
64b0: 6d 65 6e 74 20 28 70 57 69 6e 29 2e 0a 2a 2a 0a  ment (pWin)..**.
64c0: 2a 2a 20 41 70 70 65 6e 64 20 74 68 65 20 6e 6f  ** Append the no
64d0: 64 65 20 74 6f 20 6f 75 74 70 75 74 20 65 78 70  de to output exp
64e0: 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 28 2a 70  ression-list (*p
64f0: 70 53 75 62 29 2e 20 41 6e 64 20 72 65 70 6c 61  pSub). And repla
6500: 63 65 20 69 74 0a 2a 2a 20 77 69 74 68 20 61 20  ce it.** with a 
6510: 54 4b 5f 43 4f 4c 55 4d 4e 20 74 68 61 74 20 72  TK_COLUMN that r
6520: 65 61 64 73 20 74 68 65 20 28 4e 2d 31 29 74 68  eads the (N-1)th
6530: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 61 62 6c   element of tabl
6540: 65 20 0a 2a 2a 20 70 57 69 6e 2d 3e 69 45 70 68  e .** pWin->iEph
6550: 43 73 72 2c 20 77 68 65 72 65 20 4e 20 69 73 20  Csr, where N is 
6560: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
6570: 65 6d 65 6e 74 73 20 69 6e 20 28 2a 70 70 53 75  ements in (*ppSu
6580: 62 29 20 61 66 74 65 72 0a 2a 2a 20 61 70 70 65  b) after.** appe
6590: 6e 64 69 6e 67 20 74 68 65 20 6e 65 77 20 6f 6e  nding the new on
65a0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
65b0: 64 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65  d selectWindowRe
65c0: 77 72 69 74 65 45 4c 69 73 74 28 0a 20 20 50 61  writeEList(.  Pa
65d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20  rse *pParse, .  
65e0: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 2c 0a 20 20  Window *pWin,.  
65f0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 0a 20  SrcList *pSrc,. 
6600: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
6610: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
6620: 20 2f 2a 20 52 65 77 72 69 74 65 20 65 78 70 72   /* Rewrite expr
6630: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 69 73 20  essions in this 
6640: 6c 69 73 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  list */.  ExprLi
6650: 73 74 20 2a 2a 70 70 53 75 62 20 20 20 20 20 20  st **ppSub      
6660: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
6670: 4f 55 54 3a 20 53 75 62 2d 73 65 6c 65 63 74 20  OUT: Sub-select 
6680: 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20  expression-list 
6690: 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65 72 20 73  */.){.  Walker s
66a0: 57 61 6c 6b 65 72 3b 0a 20 20 57 69 6e 64 6f 77  Walker;.  Window
66b0: 52 65 77 72 69 74 65 20 73 52 65 77 72 69 74 65  Rewrite sRewrite
66c0: 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 61  ;..  memset(&sWa
66d0: 6c 6b 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  lker, 0, sizeof(
66e0: 57 61 6c 6b 65 72 29 29 3b 0a 20 20 6d 65 6d 73  Walker));.  mems
66f0: 65 74 28 26 73 52 65 77 72 69 74 65 2c 20 30 2c  et(&sRewrite, 0,
6700: 20 73 69 7a 65 6f 66 28 57 69 6e 64 6f 77 52 65   sizeof(WindowRe
6710: 77 72 69 74 65 29 29 3b 0a 0a 20 20 73 52 65 77  write));..  sRew
6720: 72 69 74 65 2e 70 53 75 62 20 3d 20 2a 70 70 53  rite.pSub = *ppS
6730: 75 62 3b 0a 20 20 73 52 65 77 72 69 74 65 2e 70  ub;.  sRewrite.p
6740: 57 69 6e 20 3d 20 70 57 69 6e 3b 0a 20 20 73 52  Win = pWin;.  sR
6750: 65 77 72 69 74 65 2e 70 53 72 63 20 3d 20 70 53  ewrite.pSrc = pS
6760: 72 63 3b 0a 0a 20 20 73 57 61 6c 6b 65 72 2e 70  rc;..  sWalker.p
6770: 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
6780: 20 20 73 57 61 6c 6b 65 72 2e 78 45 78 70 72 43    sWalker.xExprC
6790: 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74  allback = select
67a0: 57 69 6e 64 6f 77 52 65 77 72 69 74 65 45 78 70  WindowRewriteExp
67b0: 72 43 62 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 78  rCb;.  sWalker.x
67c0: 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
67d0: 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77   selectWindowRew
67e0: 72 69 74 65 53 65 6c 65 63 74 43 62 3b 0a 20 20  riteSelectCb;.  
67f0: 73 57 61 6c 6b 65 72 2e 75 2e 70 52 65 77 72 69  sWalker.u.pRewri
6800: 74 65 20 3d 20 26 73 52 65 77 72 69 74 65 3b 0a  te = &sRewrite;.
6810: 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33  .  (void)sqlite3
6820: 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 26 73 57  WalkExprList(&sW
6830: 61 6c 6b 65 72 2c 20 70 45 4c 69 73 74 29 3b 0a  alker, pEList);.
6840: 0a 20 20 2a 70 70 53 75 62 20 3d 20 73 52 65 77  .  *ppSub = sRew
6850: 72 69 74 65 2e 70 53 75 62 3b 0a 7d 0a 0a 2f 2a  rite.pSub;.}../*
6860: 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 63 6f 70  .** Append a cop
6870: 79 20 6f 66 20 65 61 63 68 20 65 78 70 72 65 73  y of each expres
6880: 73 69 6f 6e 20 69 6e 20 65 78 70 72 65 73 73 69  sion in expressi
6890: 6f 6e 2d 6c 69 73 74 20 70 41 70 70 65 6e 64 20  on-list pAppend 
68a0: 74 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  to.** expression
68b0: 20 6c 69 73 74 20 70 4c 69 73 74 2e 20 52 65 74   list pList. Ret
68c0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
68d0: 20 74 68 65 20 72 65 73 75 6c 74 20 6c 69 73 74   the result list
68e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72  ..*/.static Expr
68f0: 4c 69 73 74 20 2a 65 78 70 72 4c 69 73 74 41 70  List *exprListAp
6900: 70 65 6e 64 4c 69 73 74 28 0a 20 20 50 61 72 73  pendList(.  Pars
6910: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
6920: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
6930: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
6940: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
6950: 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77      /* List to w
6960: 68 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20  hich to append. 
6970: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
6980: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 41 70  .  ExprList *pAp
6990: 70 65 6e 64 20 20 20 20 20 20 20 2f 2a 20 4c 69  pend       /* Li
69a0: 73 74 20 6f 66 20 76 61 6c 75 65 73 20 74 6f 20  st of values to 
69b0: 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65  append. Might be
69c0: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66   NULL */.){.  if
69d0: 28 20 70 41 70 70 65 6e 64 20 29 7b 0a 20 20 20  ( pAppend ){.   
69e0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
69f0: 6e 49 6e 69 74 20 3d 20 70 4c 69 73 74 20 3f 20  nInit = pList ? 
6a00: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
6a10: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
6a20: 3c 70 41 70 70 65 6e 64 2d 3e 6e 45 78 70 72 3b  <pAppend->nExpr;
6a30: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
6a40: 72 20 2a 70 44 75 70 20 3d 20 73 71 6c 69 74 65  r *pDup = sqlite
6a50: 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d  3ExprDup(pParse-
6a60: 3e 64 62 2c 20 70 41 70 70 65 6e 64 2d 3e 61 5b  >db, pAppend->a[
6a70: 69 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  i].pExpr, 0);.  
6a80: 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
6a90: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
6aa0: 64 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c  d(pParse, pList,
6ab0: 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 69 66   pDup);.      if
6ac0: 28 20 70 4c 69 73 74 20 29 20 70 4c 69 73 74 2d  ( pList ) pList-
6ad0: 3e 61 5b 6e 49 6e 69 74 2b 69 5d 2e 73 6f 72 74  >a[nInit+i].sort
6ae0: 4f 72 64 65 72 20 3d 20 70 41 70 70 65 6e 64 2d  Order = pAppend-
6af0: 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
6b00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
6b10: 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
6b20: 0a 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43  .** If the SELEC
6b30: 54 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  T statement pass
6b40: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
6b50: 20 61 72 67 75 6d 65 6e 74 20 64 6f 65 73 20 6e   argument does n
6b60: 6f 74 20 69 6e 76 6f 6b 65 0a 2a 2a 20 61 6e 79  ot invoke.** any
6b70: 20 53 51 4c 20 77 69 6e 64 6f 77 20 66 75 6e 63   SQL window func
6b80: 74 69 6f 6e 73 2c 20 74 68 69 73 20 66 75 6e 63  tions, this func
6b90: 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
6ba0: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 0a   Otherwise, it .
6bb0: 2a 2a 20 72 65 77 72 69 74 65 73 20 74 68 65 20  ** rewrites the 
6bc0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
6bd0: 20 73 6f 20 74 68 61 74 20 77 69 6e 64 6f 77 20   so that window 
6be0: 66 75 6e 63 74 69 6f 6e 20 78 53 74 65 70 20 66  function xStep f
6bf0: 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 61 72 65 20  unctions.** are 
6c00: 69 6e 76 6f 6b 65 64 20 69 6e 20 74 68 65 20 63  invoked in the c
6c10: 6f 72 72 65 63 74 20 6f 72 64 65 72 20 61 73 20  orrect order as 
6c20: 64 65 73 63 72 69 62 65 64 20 75 6e 64 65 72 20  described under 
6c30: 22 53 45 4c 45 43 54 20 52 45 57 52 49 54 49 4e  "SELECT REWRITIN
6c40: 47 22 0a 2a 2a 20 61 74 20 74 68 65 20 74 6f 70  G".** at the top
6c50: 20 6f 66 20 74 68 69 73 20 66 69 6c 65 2e 0a 2a   of this file..*
6c60: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 69 6e  /.int sqlite3Win
6c70: 64 6f 77 52 65 77 72 69 74 65 28 50 61 72 73 65  dowRewrite(Parse
6c80: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
6c90: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d   *p){.  int rc =
6ca0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
6cb0: 28 20 70 2d 3e 70 57 69 6e 20 26 26 20 70 2d 3e  ( p->pWin && p->
6cc0: 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20  pPrior==0 ){.   
6cd0: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
6ce0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
6cf0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  );.    sqlite3 *
6d00: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
6d10: 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75  .    Select *pSu
6d20: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
6d30: 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65     /* The subque
6d40: 72 79 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73  ry */.    SrcLis
6d50: 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  t *pSrc = p->pSr
6d60: 63 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 57 68  c;.    Expr *pWh
6d70: 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ere = p->pWhere;
6d80: 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
6d90: 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
6da0: 6f 75 70 42 79 3b 0a 20 20 20 20 45 78 70 72 20  oupBy;.    Expr 
6db0: 2a 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48  *pHaving = p->pH
6dc0: 61 76 69 6e 67 3b 0a 20 20 20 20 45 78 70 72 4c  aving;.    ExprL
6dd0: 69 73 74 20 2a 70 53 6f 72 74 20 3d 20 30 3b 0a  ist *pSort = 0;.
6de0: 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
6df0: 53 75 62 6c 69 73 74 20 3d 20 30 3b 20 20 20 20  Sublist = 0;    
6e00: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
6e10: 20 6c 69 73 74 20 66 6f 72 20 73 75 62 2d 71 75   list for sub-qu
6e20: 65 72 79 20 2a 2f 0a 20 20 20 20 57 69 6e 64 6f  ery */.    Windo
6e30: 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57  w *pMWin = p->pW
6e40: 69 6e 3b 20 20 20 20 20 20 2f 2a 20 4d 61 73 74  in;      /* Mast
6e50: 65 72 20 77 69 6e 64 6f 77 20 6f 62 6a 65 63 74  er window object
6e60: 20 2a 2f 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a   */.    Window *
6e70: 70 57 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20  pWin;           
6e80: 20 20 20 20 20 20 2f 2a 20 57 69 6e 64 6f 77 20        /* Window 
6e90: 6f 62 6a 65 63 74 20 69 74 65 72 61 74 6f 72 20  object iterator 
6ea0: 2a 2f 0a 0a 20 20 20 20 70 2d 3e 70 53 72 63 20  */..    p->pSrc 
6eb0: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65  = 0;.    p->pWhe
6ec0: 72 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  re = 0;.    p->p
6ed0: 47 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20 20  GroupBy = 0;.   
6ee0: 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b   p->pHaving = 0;
6ef0: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
6f00: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
6f10: 75 73 65 20 66 6f 72 20 74 68 65 20 73 75 62 2d  use for the sub-
6f20: 73 65 6c 65 63 74 2e 20 54 68 69 73 20 69 73 20  select. This is 
6f30: 74 68 65 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f  the concatenatio
6f40: 6e 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  n.    ** of the 
6f50: 77 69 6e 64 6f 77 20 50 41 52 54 49 54 49 4f 4e  window PARTITION
6f60: 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 63 6c   and ORDER BY cl
6f70: 61 75 73 65 73 2e 20 54 68 65 6e 2c 20 69 66 20  auses. Then, if 
6f80: 74 68 69 73 20 6d 61 6b 65 73 20 69 74 0a 20 20  this makes it.  
6f90: 20 20 2a 2a 20 72 65 64 75 6e 64 61 6e 74 2c 20    ** redundant, 
6fa0: 72 65 6d 6f 76 65 20 74 68 65 20 4f 52 44 45 52  remove the ORDER
6fb0: 20 42 59 20 66 72 6f 6d 20 74 68 65 20 70 61 72   BY from the par
6fc0: 65 6e 74 20 53 45 4c 45 43 54 2e 20 20 2a 2f 0a  ent SELECT.  */.
6fd0: 20 20 20 20 70 53 6f 72 74 20 3d 20 73 71 6c 69      pSort = sqli
6fe0: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
6ff0: 62 2c 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69  b, pMWin->pParti
7000: 74 69 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 70 53  tion, 0);.    pS
7010: 6f 72 74 20 3d 20 65 78 70 72 4c 69 73 74 41 70  ort = exprListAp
7020: 70 65 6e 64 4c 69 73 74 28 70 50 61 72 73 65 2c  pendList(pParse,
7030: 20 70 53 6f 72 74 2c 20 70 4d 57 69 6e 2d 3e 70   pSort, pMWin->p
7040: 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66  OrderBy);.    if
7050: 28 20 70 53 6f 72 74 20 26 26 20 70 2d 3e 70 4f  ( pSort && p->pO
7060: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
7070: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c  if( sqlite3ExprL
7080: 69 73 74 43 6f 6d 70 61 72 65 28 70 53 6f 72 74  istCompare(pSort
7090: 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d  , p->pOrderBy, -
70a0: 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1)==0 ){.       
70b0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
70c0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f  Delete(db, p->pO
70d0: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 20  rderBy);.       
70e0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30   p->pOrderBy = 0
70f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7100: 0a 20 20 20 20 2f 2a 20 41 73 73 69 67 6e 20 61  .    /* Assign a
7110: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
7120: 6f 72 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  or the ephemeral
7130: 20 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20 62   table used to b
7140: 75 66 66 65 72 20 72 6f 77 73 2e 0a 20 20 20 20  uffer rows..    
7150: 2a 2a 20 54 68 65 20 4f 70 65 6e 45 70 68 65 6d  ** The OpenEphem
7160: 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  eral instruction
7170: 20 69 73 20 63 6f 64 65 64 20 6c 61 74 65 72 2c   is coded later,
7180: 20 61 66 74 65 72 20 69 74 20 69 73 20 6b 6e 6f   after it is kno
7190: 77 6e 20 68 6f 77 0a 20 20 20 20 2a 2a 20 6d 61  wn how.    ** ma
71a0: 6e 79 20 63 6f 6c 75 6d 6e 73 20 74 68 65 20 74  ny columns the t
71b0: 61 62 6c 65 20 77 69 6c 6c 20 68 61 76 65 2e 20  able will have. 
71c0: 20 2a 2f 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 69   */.    pMWin->i
71d0: 45 70 68 43 73 72 20 3d 20 70 50 61 72 73 65 2d  EphCsr = pParse-
71e0: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70 50 61  >nTab++;.    pPa
71f0: 72 73 65 2d 3e 6e 54 61 62 20 2b 3d 20 33 3b 0a  rse->nTab += 3;.
7200: 0a 20 20 20 20 73 65 6c 65 63 74 57 69 6e 64 6f  .    selectWindo
7210: 77 52 65 77 72 69 74 65 45 4c 69 73 74 28 70 50  wRewriteEList(pP
7220: 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 70 53 72  arse, pMWin, pSr
7230: 63 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 26 70  c, p->pEList, &p
7240: 53 75 62 6c 69 73 74 29 3b 0a 20 20 20 20 73 65  Sublist);.    se
7250: 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74  lectWindowRewrit
7260: 65 45 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  eEList(pParse, p
7270: 4d 57 69 6e 2c 20 70 53 72 63 2c 20 70 2d 3e 70  MWin, pSrc, p->p
7280: 4f 72 64 65 72 42 79 2c 20 26 70 53 75 62 6c 69  OrderBy, &pSubli
7290: 73 74 29 3b 0a 20 20 20 20 70 4d 57 69 6e 2d 3e  st);.    pMWin->
72a0: 6e 42 75 66 66 65 72 43 6f 6c 20 3d 20 28 70 53  nBufferCol = (pS
72b0: 75 62 6c 69 73 74 20 3f 20 70 53 75 62 6c 69 73  ublist ? pSublis
72c0: 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 0a  t->nExpr : 0);..
72d0: 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68      /* Append th
72e0: 65 20 50 41 52 54 49 54 49 4f 4e 20 42 59 20 61  e PARTITION BY a
72f0: 6e 64 20 4f 52 44 45 52 20 42 59 20 65 78 70 72  nd ORDER BY expr
7300: 65 73 73 69 6f 6e 73 20 74 6f 20 74 68 65 20 74  essions to the t
7310: 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 75  o the .    ** su
7320: 62 2d 73 65 6c 65 63 74 20 65 78 70 72 65 73 73  b-select express
7330: 69 6f 6e 20 6c 69 73 74 2e 20 54 68 65 79 20 61  ion list. They a
7340: 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 66  re required to f
7350: 69 67 75 72 65 20 6f 75 74 20 77 68 65 72 65 20  igure out where 
7360: 0a 20 20 20 20 2a 2a 20 62 6f 75 6e 64 61 72 69  .    ** boundari
7370: 65 73 20 66 6f 72 20 70 61 72 74 69 74 69 6f 6e  es for partition
7380: 73 20 61 6e 64 20 73 65 74 73 20 6f 66 20 70 65  s and sets of pe
7390: 65 72 20 72 6f 77 73 20 6c 69 65 2e 20 20 2a 2f  er rows lie.  */
73a0: 0a 20 20 20 20 70 53 75 62 6c 69 73 74 20 3d 20  .    pSublist = 
73b0: 65 78 70 72 4c 69 73 74 41 70 70 65 6e 64 4c 69  exprListAppendLi
73c0: 73 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 6c  st(pParse, pSubl
73d0: 69 73 74 2c 20 70 4d 57 69 6e 2d 3e 70 50 61 72  ist, pMWin->pPar
73e0: 74 69 74 69 6f 6e 29 3b 0a 20 20 20 20 70 53 75  tition);.    pSu
73f0: 62 6c 69 73 74 20 3d 20 65 78 70 72 4c 69 73 74  blist = exprList
7400: 41 70 70 65 6e 64 4c 69 73 74 28 70 50 61 72 73  AppendList(pPars
7410: 65 2c 20 70 53 75 62 6c 69 73 74 2c 20 70 4d 57  e, pSublist, pMW
7420: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 0a  in->pOrderBy);..
7430: 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68      /* Append th
7440: 65 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73  e arguments pass
7450: 65 64 20 74 6f 20 65 61 63 68 20 77 69 6e 64 6f  ed to each windo
7460: 77 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 74 68  w function to th
7470: 65 0a 20 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c  e.    ** sub-sel
7480: 65 63 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  ect expression l
7490: 69 73 74 2e 20 41 6c 73 6f 20 61 6c 6c 6f 63 61  ist. Also alloca
74a0: 74 65 20 74 77 6f 20 72 65 67 69 73 74 65 72 73  te two registers
74b0: 20 66 6f 72 20 65 61 63 68 0a 20 20 20 20 2a 2a   for each.    **
74c0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
74d0: 20 2d 20 6f 6e 65 20 66 6f 72 20 74 68 65 20 61   - one for the a
74e0: 63 63 75 6d 75 6c 61 74 6f 72 2c 20 61 6e 6f 74  ccumulator, anot
74f0: 68 65 72 20 66 6f 72 20 69 6e 74 65 72 69 6d 0a  her for interim.
7500: 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 73 2e 20      ** results. 
7510: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 57 69 6e   */.    for(pWin
7520: 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57  =pMWin; pWin; pW
7530: 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69  in=pWin->pNextWi
7540: 6e 29 7b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e  n){.      pWin->
7550: 69 41 72 67 43 6f 6c 20 3d 20 28 70 53 75 62 6c  iArgCol = (pSubl
7560: 69 73 74 20 3f 20 70 53 75 62 6c 69 73 74 2d 3e  ist ? pSublist->
7570: 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20  nExpr : 0);.    
7580: 20 20 70 53 75 62 6c 69 73 74 20 3d 20 65 78 70    pSublist = exp
7590: 72 4c 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28  rListAppendList(
75a0: 70 50 61 72 73 65 2c 20 70 53 75 62 6c 69 73 74  pParse, pSublist
75b0: 2c 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e  , pWin->pOwner->
75c0: 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  x.pList);.      
75d0: 69 66 28 20 70 57 69 6e 2d 3e 70 46 69 6c 74 65  if( pWin->pFilte
75e0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  r ){.        Exp
75f0: 72 20 2a 70 46 69 6c 74 65 72 20 3d 20 73 71 6c  r *pFilter = sql
7600: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
7610: 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72 2c 20 30  pWin->pFilter, 0
7620: 29 3b 0a 20 20 20 20 20 20 20 20 70 53 75 62 6c  );.        pSubl
7630: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
7640: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
7650: 73 65 2c 20 70 53 75 62 6c 69 73 74 2c 20 70 46  se, pSublist, pF
7660: 69 6c 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  ilter);.      }.
7670: 20 20 20 20 20 20 70 57 69 6e 2d 3e 72 65 67 41        pWin->regA
7680: 63 63 75 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  ccum = ++pParse-
7690: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 57 69  >nMem;.      pWi
76a0: 6e 2d 3e 72 65 67 52 65 73 75 6c 74 20 3d 20 2b  n->regResult = +
76b0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
76c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
76d0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
76e0: 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41  l, 0, pWin->regA
76f0: 63 63 75 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ccum);.    }..  
7700: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
7710: 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20   no ORDER BY or 
7720: 50 41 52 54 49 54 49 4f 4e 20 42 59 20 63 6c 61  PARTITION BY cla
7730: 75 73 65 2c 20 61 6e 64 20 74 68 65 20 77 69 6e  use, and the win
7740: 64 6f 77 0a 20 20 20 20 2a 2a 20 66 75 6e 63 74  dow.    ** funct
7750: 69 6f 6e 20 61 63 63 65 70 74 73 20 7a 65 72 6f  ion accepts zero
7760: 20 61 72 67 75 6d 65 6e 74 73 2c 20 61 6e 64 20   arguments, and 
7770: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 74 68  there are no oth
7780: 65 72 20 63 6f 6c 75 6d 6e 73 0a 20 20 20 20 2a  er columns.    *
7790: 2a 20 73 65 6c 65 63 74 65 64 20 28 65 2e 67 2e  * selected (e.g.
77a0: 20 22 53 45 4c 45 43 54 20 72 6f 77 5f 6e 75 6d   "SELECT row_num
77b0: 62 65 72 28 29 20 4f 56 45 52 20 28 29 20 46 52  ber() OVER () FR
77c0: 4f 4d 20 74 31 22 29 2c 20 69 74 20 69 73 20 70  OM t1"), it is p
77d0: 6f 73 73 69 62 6c 65 0a 20 20 20 20 2a 2a 20 74  ossible.    ** t
77e0: 68 61 74 20 70 53 75 62 6c 69 73 74 20 69 73 20  hat pSublist is 
77f0: 73 74 69 6c 6c 20 4e 55 4c 4c 20 68 65 72 65 2e  still NULL here.
7800: 20 41 64 64 20 61 20 63 6f 6e 73 74 61 6e 74 20   Add a constant 
7810: 65 78 70 72 65 73 73 69 6f 6e 20 68 65 72 65 20  expression here 
7820: 74 6f 20 0a 20 20 20 20 2a 2a 20 6b 65 65 70 20  to .    ** keep 
7830: 65 76 65 72 79 74 68 69 6e 67 20 6c 65 67 61 6c  everything legal
7840: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 0a   in this case. .
7850: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
7860: 53 75 62 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  Sublist==0 ){.  
7870: 20 20 20 20 70 53 75 62 6c 69 73 74 20 3d 20 73      pSublist = s
7880: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
7890: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20  pend(pParse, 0, 
78a0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
78b0: 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20  e3ExprAlloc(db, 
78c0: 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73 71 6c  TK_INTEGER, &sql
78d0: 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 30 5d  ite3IntTokens[0]
78e0: 2c 20 30 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  , 0).      );.  
78f0: 20 20 7d 0a 0a 20 20 20 20 70 53 75 62 20 3d 20    }..    pSub = 
7900: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77  sqlite3SelectNew
7910: 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  (.        pParse
7920: 2c 20 70 53 75 62 6c 69 73 74 2c 20 70 53 72 63  , pSublist, pSrc
7930: 2c 20 70 57 68 65 72 65 2c 20 70 47 72 6f 75 70  , pWhere, pGroup
7940: 42 79 2c 20 70 48 61 76 69 6e 67 2c 20 70 53 6f  By, pHaving, pSo
7950: 72 74 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a  rt, 0, 0.    );.
7960: 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 73 71      p->pSrc = sq
7970: 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
7980: 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c  nd(pParse, 0, 0,
7990: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e   0);.    if( p->
79a0: 70 53 72 63 20 29 7b 0a 20 20 20 20 20 20 70 2d  pSrc ){.      p-
79b0: 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c  >pSrc->a[0].pSel
79c0: 65 63 74 20 3d 20 70 53 75 62 3b 0a 20 20 20 20  ect = pSub;.    
79d0: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
79e0: 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50  AssignCursors(pP
79f0: 61 72 73 65 2c 20 70 2d 3e 70 53 72 63 29 3b 0a  arse, p->pSrc);.
7a00: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
7a10: 33 45 78 70 61 6e 64 53 75 62 71 75 65 72 79 28  3ExpandSubquery(
7a20: 70 50 61 72 73 65 2c 20 26 70 2d 3e 70 53 72 63  pParse, &p->pSrc
7a30: 2d 3e 61 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  ->a[0]) ){.     
7a40: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
7a50: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  OMEM;.      }els
7a60: 65 7b 0a 20 20 20 20 20 20 20 20 70 53 75 62 2d  e{.        pSub-
7a70: 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
7a80: 45 78 70 61 6e 64 65 64 3b 0a 20 20 20 20 20 20  Expanded;.      
7a90: 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d    p->selFlags &=
7aa0: 20 7e 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a   ~SF_Aggregate;.
7ab0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
7ac0: 65 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65  electPrep(pParse
7ad0: 2c 20 70 53 75 62 2c 20 30 29 3b 0a 20 20 20 20  , pSub, 0);.    
7ae0: 20 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69 74    }..      sqlit
7af0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
7b00: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
7b10: 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
7b20: 2c 20 70 53 75 62 6c 69 73 74 2d 3e 6e 45 78 70  , pSublist->nExp
7b30: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
7b40: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7b50: 50 5f 4f 70 65 6e 44 75 70 2c 20 70 4d 57 69 6e  P_OpenDup, pMWin
7b60: 2d 3e 69 45 70 68 43 73 72 2b 31 2c 20 70 4d 57  ->iEphCsr+1, pMW
7b70: 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20  in->iEphCsr);.  
7b80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7b90: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
7ba0: 44 75 70 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  Dup, pMWin->iEph
7bb0: 43 73 72 2b 32 2c 20 70 4d 57 69 6e 2d 3e 69 45  Csr+2, pMWin->iE
7bc0: 70 68 43 73 72 29 3b 0a 20 20 20 20 20 20 73 71  phCsr);.      sq
7bd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7be0: 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70  v, OP_OpenDup, p
7bf0: 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2b 33 2c  MWin->iEphCsr+3,
7c00: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29   pMWin->iEphCsr)
7c10: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7c20: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
7c30: 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 29  Delete(db, pSub)
7c40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
7c50: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
7c60: 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e   ) rc = SQLITE_N
7c70: 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  OMEM;.  }..  ret
7c80: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
7c90: 20 46 72 65 65 20 74 68 65 20 57 69 6e 64 6f 77   Free the Window
7ca0: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
7cb0: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
7cc0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ument..*/.void s
7cd0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65  qlite3WindowDele
7ce0: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
7cf0: 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 69 66  Window *p){.  if
7d00: 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( p ){.    sqlit
7d10: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
7d20: 20 70 2d 3e 70 46 69 6c 74 65 72 29 3b 0a 20 20   p->pFilter);.  
7d30: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
7d40: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
7d50: 50 61 72 74 69 74 69 6f 6e 29 3b 0a 20 20 20 20  Partition);.    
7d60: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
7d70: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
7d80: 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71 6c 69  derBy);.    sqli
7d90: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
7da0: 2c 20 70 2d 3e 70 45 6e 64 29 3b 0a 20 20 20 20  , p->pEnd);.    
7db0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
7dc0: 65 28 64 62 2c 20 70 2d 3e 70 53 74 61 72 74 29  e(db, p->pStart)
7dd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
7de0: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4e 61 6d 65  ree(db, p->zName
7df0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
7e00: 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 42 61 73  Free(db, p->zBas
7e10: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  e);.    sqlite3D
7e20: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
7e30: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
7e40: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
7e50: 6f 66 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74  of Window object
7e60: 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 74 68  s starting at th
7e70: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
7e80: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
7e90: 65 33 57 69 6e 64 6f 77 4c 69 73 74 44 65 6c 65  e3WindowListDele
7ea0: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
7eb0: 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 77 68  Window *p){.  wh
7ec0: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 57 69  ile( p ){.    Wi
7ed0: 6e 64 6f 77 20 2a 70 4e 65 78 74 20 3d 20 70 2d  ndow *pNext = p-
7ee0: 3e 70 4e 65 78 74 57 69 6e 3b 0a 20 20 20 20 73  >pNextWin;.    s
7ef0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65  qlite3WindowDele
7f00: 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 70  te(db, p);.    p
7f10: 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 7d 0a   = pNext;.  }.}.
7f20: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  ./*.** The argum
7f30: 65 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ent expression i
7f40: 73 20 61 6e 20 50 52 45 43 45 44 49 4e 47 20 6f  s an PRECEDING o
7f50: 72 20 46 4f 4c 4c 4f 57 49 4e 47 20 6f 66 66 73  r FOLLOWING offs
7f60: 65 74 2e 20 20 54 68 65 0a 2a 2a 20 76 61 6c 75  et.  The.** valu
7f70: 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f  e should be a no
7f80: 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67  n-negative integ
7f90: 65 72 2e 20 20 49 66 20 74 68 65 20 76 61 6c 75  er.  If the valu
7fa0: 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 63 6f  e is not a.** co
7fb0: 6e 73 74 61 6e 74 2c 20 63 68 61 6e 67 65 20 69  nstant, change i
7fc0: 74 20 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 65 20  t to NULL.  The 
7fd0: 66 61 63 74 20 74 68 61 74 20 69 74 20 69 73 20  fact that it is 
7fe0: 74 68 65 6e 20 61 20 6e 6f 6e 2d 6e 65 67 61 74  then a non-negat
7ff0: 69 76 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 77  ive.** integer w
8000: 69 6c 6c 20 62 65 20 63 61 75 67 68 74 20 6c 61  ill be caught la
8010: 74 65 72 2e 20 20 42 75 74 20 69 74 20 69 73 20  ter.  But it is 
8020: 69 6d 70 6f 72 74 61 6e 74 20 6e 6f 74 20 74 6f  important not to
8030: 20 6c 65 61 76 65 0a 2a 2a 20 76 61 72 69 61 62   leave.** variab
8040: 6c 65 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65  le values in the
8050: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
8060: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72  ..*/.static Expr
8070: 20 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4f   *sqlite3WindowO
8080: 66 66 73 65 74 45 78 70 72 28 50 61 72 73 65 20  ffsetExpr(Parse 
8090: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
80a0: 45 78 70 72 29 7b 0a 20 20 69 66 28 20 30 3d 3d  Expr){.  if( 0==
80b0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
80c0: 73 74 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a  stant(pExpr) ){.
80d0: 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d      if( IN_RENAM
80e0: 45 5f 4f 42 4a 45 43 54 20 29 20 73 71 6c 69 74  E_OBJECT ) sqlit
80f0: 65 33 52 65 6e 61 6d 65 45 78 70 72 55 6e 6d 61  e3RenameExprUnma
8100: 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  p(pParse, pExpr)
8110: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
8120: 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
8130: 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  db, pExpr);.    
8140: 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
8150: 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d  xprAlloc(pParse-
8160: 3e 64 62 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c  >db, TK_NULL, 0,
8170: 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
8180: 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pExpr;.}../*.*
8190: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72  * Allocate and r
81a0: 65 74 75 72 6e 20 61 20 6e 65 77 20 57 69 6e 64  eturn a new Wind
81b0: 6f 77 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69  ow object descri
81c0: 62 69 6e 67 20 61 20 57 69 6e 64 6f 77 20 44 65  bing a Window De
81d0: 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 57 69 6e  finition..*/.Win
81e0: 64 6f 77 20 2a 73 71 6c 69 74 65 33 57 69 6e 64  dow *sqlite3Wind
81f0: 6f 77 41 6c 6c 6f 63 28 0a 20 20 50 61 72 73 65  owAlloc(.  Parse
8200: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
8210: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
8220: 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 2c 20  */.  int eType, 
8230: 20 20 20 20 20 20 20 2f 2a 20 46 72 61 6d 65 20         /* Frame 
8240: 74 79 70 65 2e 20 54 4b 5f 52 41 4e 47 45 2c 20  type. TK_RANGE, 
8250: 54 4b 5f 52 4f 57 53 2c 20 54 4b 5f 47 52 4f 55  TK_ROWS, TK_GROU
8260: 50 53 2c 20 6f 72 20 30 20 2a 2f 0a 20 20 69 6e  PS, or 0 */.  in
8270: 74 20 65 53 74 61 72 74 2c 20 20 20 20 20 20 20  t eStart,       
8280: 2f 2a 20 53 74 61 72 74 20 74 79 70 65 3a 20 43  /* Start type: C
8290: 55 52 52 45 4e 54 2c 20 50 52 45 43 45 44 49 4e  URRENT, PRECEDIN
82a0: 47 2c 20 46 4f 4c 4c 4f 57 49 4e 47 2c 20 55 4e  G, FOLLOWING, UN
82b0: 42 4f 55 4e 44 45 44 20 2a 2f 0a 20 20 45 78 70  BOUNDED */.  Exp
82c0: 72 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20 2f  r *pStart,     /
82d0: 2a 20 53 74 61 72 74 20 77 69 6e 64 6f 77 20 73  * Start window s
82e0: 69 7a 65 20 69 66 20 54 4b 5f 50 52 45 43 45 44  ize if TK_PRECED
82f0: 49 4e 47 20 6f 72 20 46 4f 4c 4c 4f 57 49 4e 47  ING or FOLLOWING
8300: 20 2a 2f 0a 20 20 69 6e 74 20 65 45 6e 64 2c 20   */.  int eEnd, 
8310: 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 74          /* End t
8320: 79 70 65 3a 20 43 55 52 52 45 4e 54 2c 20 46 4f  ype: CURRENT, FO
8330: 4c 4c 4f 57 49 4e 47 2c 20 54 4b 5f 55 4e 42 4f  LLOWING, TK_UNBO
8340: 55 4e 44 45 44 2c 20 50 52 45 43 45 44 49 4e 47  UNDED, PRECEDING
8350: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 6e 64   */.  Expr *pEnd
8360: 2c 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 77  ,       /* End w
8370: 69 6e 64 6f 77 20 73 69 7a 65 20 69 66 20 54 4b  indow size if TK
8380: 5f 46 4f 4c 4c 4f 57 49 4e 47 20 6f 72 20 50 52  _FOLLOWING or PR
8390: 45 43 45 44 49 4e 47 20 2a 2f 0a 20 20 75 38 20  ECEDING */.  u8 
83a0: 65 45 78 63 6c 75 64 65 20 20 20 20 20 20 20 2f  eExclude       /
83b0: 2a 20 45 58 43 4c 55 44 45 20 63 6c 61 75 73 65  * EXCLUDE clause
83c0: 20 2a 2f 0a 29 7b 0a 20 20 57 69 6e 64 6f 77 20   */.){.  Window 
83d0: 2a 70 57 69 6e 20 3d 20 30 3b 0a 20 20 69 6e 74  *pWin = 0;.  int
83e0: 20 62 49 6d 70 6c 69 63 69 74 46 72 61 6d 65 20   bImplicitFrame 
83f0: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65  = 0;..  /* Parse
8400: 72 20 61 73 73 75 72 65 73 20 74 68 65 20 66 6f  r assures the fo
8410: 6c 6c 6f 77 69 6e 67 3a 20 2a 2f 0a 20 20 61 73  llowing: */.  as
8420: 73 65 72 74 28 20 65 54 79 70 65 3d 3d 30 20 7c  sert( eType==0 |
8430: 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47  | eType==TK_RANG
8440: 45 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 52  E || eType==TK_R
8450: 4f 57 53 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b  OWS || eType==TK
8460: 5f 47 52 4f 55 50 53 20 29 3b 0a 20 20 61 73 73  _GROUPS );.  ass
8470: 65 72 74 28 20 65 53 74 61 72 74 3d 3d 54 4b 5f  ert( eStart==TK_
8480: 43 55 52 52 45 4e 54 20 7c 7c 20 65 53 74 61 72  CURRENT || eStar
8490: 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 0a  t==TK_PRECEDING.
84a0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 53             || eS
84b0: 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44  tart==TK_UNBOUND
84c0: 45 44 20 7c 7c 20 65 53 74 61 72 74 3d 3d 54 4b  ED || eStart==TK
84d0: 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 3b 0a 20 20  _FOLLOWING );.  
84e0: 61 73 73 65 72 74 28 20 65 45 6e 64 3d 3d 54 4b  assert( eEnd==TK
84f0: 5f 43 55 52 52 45 4e 54 20 7c 7c 20 65 45 6e 64  _CURRENT || eEnd
8500: 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 0a 20  ==TK_FOLLOWING. 
8510: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 45 6e            || eEn
8520: 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20  d==TK_UNBOUNDED 
8530: 7c 7c 20 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43  || eEnd==TK_PREC
8540: 45 44 49 4e 47 20 29 3b 0a 20 20 61 73 73 65 72  EDING );.  asser
8550: 74 28 20 28 65 53 74 61 72 74 3d 3d 54 4b 5f 50  t( (eStart==TK_P
8560: 52 45 43 45 44 49 4e 47 20 7c 7c 20 65 53 74 61  RECEDING || eSta
8570: 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  rt==TK_FOLLOWING
8580: 29 3d 3d 28 70 53 74 61 72 74 21 3d 30 29 20 29  )==(pStart!=0) )
8590: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 65 45 6e  ;.  assert( (eEn
85a0: 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  d==TK_FOLLOWING 
85b0: 7c 7c 20 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43  || eEnd==TK_PREC
85c0: 45 44 49 4e 47 29 3d 3d 28 70 45 6e 64 21 3d 30  EDING)==(pEnd!=0
85d0: 29 20 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70  ) );..  if( eTyp
85e0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 62 49 6d 70  e==0 ){.    bImp
85f0: 6c 69 63 69 74 46 72 61 6d 65 20 3d 20 31 3b 0a  licitFrame = 1;.
8600: 20 20 20 20 65 54 79 70 65 20 3d 20 54 4b 5f 52      eType = TK_R
8610: 41 4e 47 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ANGE;.  }..  /* 
8620: 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68  Additionally, th
8630: 65 0a 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20  e.  ** starting 
8640: 62 6f 75 6e 64 61 72 79 20 74 79 70 65 20 6d 61  boundary type ma
8650: 79 20 6e 6f 74 20 6f 63 63 75 72 20 65 61 72 6c  y not occur earl
8660: 69 65 72 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ier in the follo
8670: 77 69 6e 67 20 6c 69 73 74 20 74 68 61 6e 0a 20  wing list than. 
8680: 20 2a 2a 20 74 68 65 20 65 6e 64 69 6e 67 20 62   ** the ending b
8690: 6f 75 6e 64 61 72 79 20 74 79 70 65 3a 0a 20 20  oundary type:.  
86a0: 2a 2a 0a 20 20 2a 2a 20 20 20 55 4e 42 4f 55 4e  **.  **   UNBOUN
86b0: 44 45 44 20 50 52 45 43 45 44 49 4e 47 0a 20 20  DED PRECEDING.  
86c0: 2a 2a 20 20 20 3c 65 78 70 72 3e 20 50 52 45 43  **   <expr> PREC
86d0: 45 44 49 4e 47 0a 20 20 2a 2a 20 20 20 43 55 52  EDING.  **   CUR
86e0: 52 45 4e 54 20 52 4f 57 0a 20 20 2a 2a 20 20 20  RENT ROW.  **   
86f0: 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47  <expr> FOLLOWING
8700: 0a 20 20 2a 2a 20 20 20 55 4e 42 4f 55 4e 44 45  .  **   UNBOUNDE
8710: 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20 2a 2a  D FOLLOWING.  **
8720: 0a 20 20 2a 2a 20 54 68 65 20 70 61 72 73 65 72  .  ** The parser
8730: 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 22 55   ensures that "U
8740: 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49  NBOUNDED PRECEDI
8750: 4e 47 22 20 63 61 6e 6e 6f 74 20 62 65 20 75 73  NG" cannot be us
8760: 65 64 20 61 73 20 61 6e 20 65 6e 64 69 6e 67 0a  ed as an ending.
8770: 20 20 2a 2a 20 62 6f 75 6e 64 61 72 79 2c 20 61    ** boundary, a
8780: 6e 64 20 74 68 61 6e 20 22 55 4e 42 4f 55 4e 44  nd than "UNBOUND
8790: 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 22 20 63 61  ED FOLLOWING" ca
87a0: 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 61 73 20  nnot be used as 
87b0: 61 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20  a starting.  ** 
87c0: 66 72 61 6d 65 20 62 6f 75 6e 64 61 72 79 2e 0a  frame boundary..
87d0: 20 20 2a 2f 0a 20 20 69 66 28 20 28 65 53 74 61    */.  if( (eSta
87e0: 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 26  rt==TK_CURRENT &
87f0: 26 20 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45  & eEnd==TK_PRECE
8800: 44 49 4e 47 29 0a 20 20 20 7c 7c 20 28 65 53 74  DING).   || (eSt
8810: 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e  art==TK_FOLLOWIN
8820: 47 20 26 26 20 28 65 45 6e 64 3d 3d 54 4b 5f 50  G && (eEnd==TK_P
8830: 52 45 43 45 44 49 4e 47 20 7c 7c 20 65 45 6e 64  RECEDING || eEnd
8840: 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29 29 0a 20  ==TK_CURRENT)). 
8850: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
8860: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
8870: 22 75 6e 73 75 70 70 6f 72 74 65 64 20 66 72 61  "unsupported fra
8880: 6d 65 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e  me specification
8890: 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 77 69 6e  ");.    goto win
88a0: 64 6f 77 41 6c 6c 6f 63 45 72 72 3b 0a 20 20 7d  dowAllocErr;.  }
88b0: 0a 0a 20 20 70 57 69 6e 20 3d 20 28 57 69 6e 64  ..  pWin = (Wind
88c0: 6f 77 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c  ow*)sqlite3DbMal
88d0: 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e  locZero(pParse->
88e0: 64 62 2c 20 73 69 7a 65 6f 66 28 57 69 6e 64 6f  db, sizeof(Windo
88f0: 77 29 29 3b 0a 20 20 69 66 28 20 70 57 69 6e 3d  w));.  if( pWin=
8900: 3d 30 20 29 20 67 6f 74 6f 20 77 69 6e 64 6f 77  =0 ) goto window
8910: 41 6c 6c 6f 63 45 72 72 3b 0a 20 20 70 57 69 6e  AllocErr;.  pWin
8920: 2d 3e 65 46 72 6d 54 79 70 65 20 3d 20 65 54 79  ->eFrmType = eTy
8930: 70 65 3b 0a 20 20 70 57 69 6e 2d 3e 65 53 74 61  pe;.  pWin->eSta
8940: 72 74 20 3d 20 65 53 74 61 72 74 3b 0a 20 20 70  rt = eStart;.  p
8950: 57 69 6e 2d 3e 65 45 6e 64 20 3d 20 65 45 6e 64  Win->eEnd = eEnd
8960: 3b 0a 20 20 69 66 28 20 65 45 78 63 6c 75 64 65  ;.  if( eExclude
8970: 3d 3d 30 20 26 26 20 4f 70 74 69 6d 69 7a 61 74  ==0 && Optimizat
8980: 69 6f 6e 44 69 73 61 62 6c 65 64 28 70 50 61 72  ionDisabled(pPar
8990: 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 51  se->db, SQLITE_Q
89a0: 75 65 72 79 46 6c 61 74 74 65 6e 65 72 29 20 29  ueryFlattener) )
89b0: 7b 0a 20 20 20 20 65 45 78 63 6c 75 64 65 20 3d  {.    eExclude =
89c0: 20 54 4b 5f 4e 4f 3b 0a 20 20 7d 0a 20 20 70 57   TK_NO;.  }.  pW
89d0: 69 6e 2d 3e 65 45 78 63 6c 75 64 65 20 3d 20 65  in->eExclude = e
89e0: 45 78 63 6c 75 64 65 3b 0a 20 20 70 57 69 6e 2d  Exclude;.  pWin-
89f0: 3e 62 49 6d 70 6c 69 63 69 74 46 72 61 6d 65 20  >bImplicitFrame 
8a00: 3d 20 62 49 6d 70 6c 69 63 69 74 46 72 61 6d 65  = bImplicitFrame
8a10: 3b 0a 20 20 70 57 69 6e 2d 3e 70 45 6e 64 20 3d  ;.  pWin->pEnd =
8a20: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4f 66   sqlite3WindowOf
8a30: 66 73 65 74 45 78 70 72 28 70 50 61 72 73 65 2c  fsetExpr(pParse,
8a40: 20 70 45 6e 64 29 3b 0a 20 20 70 57 69 6e 2d 3e   pEnd);.  pWin->
8a50: 70 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  pStart = sqlite3
8a60: 57 69 6e 64 6f 77 4f 66 66 73 65 74 45 78 70 72  WindowOffsetExpr
8a70: 28 70 50 61 72 73 65 2c 20 70 53 74 61 72 74 29  (pParse, pStart)
8a80: 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 69 6e 3b  ;.  return pWin;
8a90: 0a 0a 77 69 6e 64 6f 77 41 6c 6c 6f 63 45 72 72  ..windowAllocErr
8aa0: 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  :.  sqlite3ExprD
8ab0: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
8ac0: 2c 20 70 45 6e 64 29 3b 0a 20 20 73 71 6c 69 74  , pEnd);.  sqlit
8ad0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61  e3ExprDelete(pPa
8ae0: 72 73 65 2d 3e 64 62 2c 20 70 53 74 61 72 74 29  rse->db, pStart)
8af0: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
8b00: 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20 50 41  ./*.** Attach PA
8b10: 52 54 49 54 49 4f 4e 20 61 6e 64 20 4f 52 44 45  RTITION and ORDE
8b20: 52 20 42 59 20 63 6c 61 75 73 65 73 20 70 50 61  R BY clauses pPa
8b30: 72 74 69 74 69 6f 6e 20 61 6e 64 20 70 4f 72 64  rtition and pOrd
8b40: 65 72 42 79 20 74 6f 20 77 69 6e 64 6f 77 0a 2a  erBy to window.*
8b50: 2a 20 70 57 69 6e 2e 20 41 6c 73 6f 2c 20 69 66  * pWin. Also, if
8b60: 20 70 61 72 61 6d 65 74 65 72 20 70 42 61 73 65   parameter pBase
8b70: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 65   is not NULL, se
8b80: 74 20 70 57 69 6e 2d 3e 7a 42 61 73 65 20 74 6f  t pWin->zBase to
8b90: 20 74 68 65 0a 2a 2a 20 65 71 75 69 76 61 6c 65   the.** equivale
8ba0: 6e 74 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65  nt nul-terminate
8bb0: 64 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 57 69 6e  d string..*/.Win
8bc0: 64 6f 77 20 2a 73 71 6c 69 74 65 33 57 69 6e 64  dow *sqlite3Wind
8bd0: 6f 77 41 73 73 65 6d 62 6c 65 28 0a 20 20 50 61  owAssemble(.  Pa
8be0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20  rse *pParse, .  
8bf0: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 2c 20 0a 20  Window *pWin, . 
8c00: 20 45 78 70 72 4c 69 73 74 20 2a 70 50 61 72 74   ExprList *pPart
8c10: 69 74 69 6f 6e 2c 20 0a 20 20 45 78 70 72 4c 69  ition, .  ExprLi
8c20: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 0a 20  st *pOrderBy, . 
8c30: 20 54 6f 6b 65 6e 20 2a 70 42 61 73 65 0a 29 7b   Token *pBase.){
8c40: 0a 20 20 69 66 28 20 70 57 69 6e 20 29 7b 0a 20  .  if( pWin ){. 
8c50: 20 20 20 70 57 69 6e 2d 3e 70 50 61 72 74 69 74     pWin->pPartit
8c60: 69 6f 6e 20 3d 20 70 50 61 72 74 69 74 69 6f 6e  ion = pPartition
8c70: 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70 4f 72 64  ;.    pWin->pOrd
8c80: 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
8c90: 0a 20 20 20 20 69 66 28 20 70 42 61 73 65 20 29  .    if( pBase )
8ca0: 7b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 7a 42  {.      pWin->zB
8cb0: 61 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ase = sqlite3DbS
8cc0: 74 72 4e 44 75 70 28 70 50 61 72 73 65 2d 3e 64  trNDup(pParse->d
8cd0: 62 2c 20 70 42 61 73 65 2d 3e 7a 2c 20 70 42 61  b, pBase->z, pBa
8ce0: 73 65 2d 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  se->n);.    }.  
8cf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
8d00: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
8d10: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 50 61  (pParse->db, pPa
8d20: 72 74 69 74 69 6f 6e 29 3b 0a 20 20 20 20 73 71  rtition);.    sq
8d30: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
8d40: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
8d50: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d 0a 20  pOrderBy);.  }. 
8d60: 20 72 65 74 75 72 6e 20 70 57 69 6e 3b 0a 7d 0a   return pWin;.}.
8d70: 0a 2f 2a 0a 2a 2a 20 57 69 6e 64 6f 77 20 2a 70  ./*.** Window *p
8d80: 57 69 6e 20 68 61 73 20 6a 75 73 74 20 62 65 65  Win has just bee
8d90: 6e 20 63 72 65 61 74 65 64 20 66 72 6f 6d 20 61  n created from a
8da0: 20 57 49 4e 44 4f 57 20 63 6c 61 75 73 65 2e 20   WINDOW clause. 
8db0: 54 6f 6b 6e 65 20 70 42 61 73 65 0a 2a 2a 20 69  Tokne pBase.** i
8dc0: 73 20 74 68 65 20 62 61 73 65 20 77 69 6e 64 6f  s the base windo
8dd0: 77 2e 20 45 61 72 6c 69 65 72 20 77 69 6e 64 6f  w. Earlier windo
8de0: 77 73 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65  ws from the same
8df0: 20 57 49 4e 44 4f 57 20 63 6c 61 75 73 65 20 61   WINDOW clause a
8e00: 72 65 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  re.** stored in 
8e10: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
8e20: 73 74 61 72 74 69 6e 67 20 61 74 20 70 57 69 6e  starting at pWin
8e30: 2d 3e 70 4e 65 78 74 57 69 6e 2e 20 54 68 69 73  ->pNextWin. This
8e40: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 65 69 74   function.** eit
8e50: 68 65 72 20 75 70 64 61 74 65 73 20 2a 70 57 69  her updates *pWi
8e60: 6e 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  n according to t
8e70: 68 65 20 62 61 73 65 20 73 70 65 63 69 66 69 63  he base specific
8e80: 61 74 69 6f 6e 2c 20 6f 72 20 65 6c 73 65 0a 2a  ation, or else.*
8e90: 2a 20 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f  * leaves an erro
8ea0: 72 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  r in pParse..*/.
8eb0: 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64  void sqlite3Wind
8ec0: 6f 77 43 68 61 69 6e 28 50 61 72 73 65 20 2a 70  owChain(Parse *p
8ed0: 50 61 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70  Parse, Window *p
8ee0: 57 69 6e 2c 20 57 69 6e 64 6f 77 20 2a 70 4c 69  Win, Window *pLi
8ef0: 73 74 29 7b 0a 20 20 69 66 28 20 70 57 69 6e 2d  st){.  if( pWin-
8f00: 3e 7a 42 61 73 65 20 29 7b 0a 20 20 20 20 73 71  >zBase ){.    sq
8f10: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
8f20: 73 65 2d 3e 64 62 3b 0a 20 20 20 20 57 69 6e 64  se->db;.    Wind
8f30: 6f 77 20 2a 70 45 78 69 73 74 20 3d 20 77 69 6e  ow *pExist = win
8f40: 64 6f 77 46 69 6e 64 28 70 50 61 72 73 65 2c 20  dowFind(pParse, 
8f50: 70 4c 69 73 74 2c 20 70 57 69 6e 2d 3e 7a 42 61  pList, pWin->zBa
8f60: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78  se);.    if( pEx
8f70: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  ist ){.      con
8f80: 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20  st char *zErr = 
8f90: 30 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63  0;.      /* Chec
8fa0: 6b 20 66 6f 72 20 65 72 72 6f 72 73 20 2a 2f 0a  k for errors */.
8fb0: 20 20 20 20 20 20 69 66 28 20 70 57 69 6e 2d 3e        if( pWin->
8fc0: 70 50 61 72 74 69 74 69 6f 6e 20 29 7b 0a 20 20  pPartition ){.  
8fd0: 20 20 20 20 20 20 7a 45 72 72 20 3d 20 22 50 41        zErr = "PA
8fe0: 52 54 49 54 49 4f 4e 20 63 6c 61 75 73 65 22 3b  RTITION clause";
8ff0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
9000: 20 70 45 78 69 73 74 2d 3e 70 4f 72 64 65 72 42   pExist->pOrderB
9010: 79 20 26 26 20 70 57 69 6e 2d 3e 70 4f 72 64 65  y && pWin->pOrde
9020: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  rBy ){.        z
9030: 45 72 72 20 3d 20 22 4f 52 44 45 52 20 42 59 20  Err = "ORDER BY 
9040: 63 6c 61 75 73 65 22 3b 0a 20 20 20 20 20 20 7d  clause";.      }
9050: 65 6c 73 65 20 69 66 28 20 70 45 78 69 73 74 2d  else if( pExist-
9060: 3e 62 49 6d 70 6c 69 63 69 74 46 72 61 6d 65 3d  >bImplicitFrame=
9070: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 45  =0 ){.        zE
9080: 72 72 20 3d 20 22 66 72 61 6d 65 20 73 70 65 63  rr = "frame spec
9090: 69 66 69 63 61 74 69 6f 6e 22 3b 0a 20 20 20 20  ification";.    
90a0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 45    }.      if( zE
90b0: 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rr ){.        sq
90c0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
90d0: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
90e0: 20 20 20 22 63 61 6e 6e 6f 74 20 6f 76 65 72 72     "cannot overr
90f0: 69 64 65 20 25 73 20 6f 66 20 77 69 6e 64 6f 77  ide %s of window
9100: 3a 20 25 73 22 2c 20 7a 45 72 72 2c 20 70 57 69  : %s", zErr, pWi
9110: 6e 2d 3e 7a 42 61 73 65 0a 20 20 20 20 20 20 20  n->zBase.       
9120: 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   );.      }else{
9130: 0a 20 20 20 20 20 20 20 20 70 57 69 6e 2d 3e 70  .        pWin->p
9140: 50 61 72 74 69 74 69 6f 6e 20 3d 20 73 71 6c 69  Partition = sqli
9150: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
9160: 62 2c 20 70 45 78 69 73 74 2d 3e 70 50 61 72 74  b, pExist->pPart
9170: 69 74 69 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 20  ition, 0);.     
9180: 20 20 20 69 66 28 20 70 45 78 69 73 74 2d 3e 70     if( pExist->p
9190: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
91a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69       assert( pWi
91b0: 6e 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  n->pOrderBy==0 )
91c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 57 69 6e  ;.          pWin
91d0: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c  ->pOrderBy = sql
91e0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
91f0: 64 62 2c 20 70 45 78 69 73 74 2d 3e 70 4f 72 64  db, pExist->pOrd
9200: 65 72 42 79 2c 20 30 29 3b 0a 20 20 20 20 20 20  erBy, 0);.      
9210: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
9220: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57  te3DbFree(db, pW
9230: 69 6e 2d 3e 7a 42 61 73 65 29 3b 0a 20 20 20 20  in->zBase);.    
9240: 20 20 20 20 70 57 69 6e 2d 3e 7a 42 61 73 65 20      pWin->zBase 
9250: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
9260: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
9270: 41 74 74 61 63 68 20 77 69 6e 64 6f 77 20 6f 62  Attach window ob
9280: 6a 65 63 74 20 70 57 69 6e 20 74 6f 20 65 78 70  ject pWin to exp
9290: 72 65 73 73 69 6f 6e 20 70 2e 0a 2a 2f 0a 76 6f  ression p..*/.vo
92a0: 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  id sqlite3Window
92b0: 41 74 74 61 63 68 28 50 61 72 73 65 20 2a 70 50  Attach(Parse *pP
92c0: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 2c 20 57  arse, Expr *p, W
92d0: 69 6e 64 6f 77 20 2a 70 57 69 6e 29 7b 0a 20 20  indow *pWin){.  
92e0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73  if( p ){.    ass
92f0: 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46  ert( p->op==TK_F
9300: 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 2f  UNCTION );.    /
9310: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
9320: 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f  s only called fo
9330: 72 20 74 68 65 20 70 61 72 73 65 72 2e 20 20 49  r the parser.  I
9340: 66 20 70 57 69 6e 20 77 61 73 20 6e 6f 74 0a 20  f pWin was not. 
9350: 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20     ** allocated 
9360: 64 75 65 20 74 6f 20 61 6e 20 4f 4f 4d 2c 20 74  due to an OOM, t
9370: 68 65 6e 20 74 68 65 20 70 61 72 73 65 72 20 77  hen the parser w
9380: 6f 75 6c 64 20 66 61 69 6c 20 62 65 66 6f 72 65  ould fail before
9390: 20 65 76 65 72 0a 20 20 20 20 2a 2a 20 69 6e 76   ever.    ** inv
93a0: 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  oking this routi
93b0: 6e 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 41 4c  ne */.    if( AL
93c0: 57 41 59 53 28 70 57 69 6e 29 20 29 7b 0a 20 20  WAYS(pWin) ){.  
93d0: 20 20 20 20 70 2d 3e 79 2e 70 57 69 6e 20 3d 20      p->y.pWin = 
93e0: 70 57 69 6e 3b 0a 20 20 20 20 20 20 45 78 70 72  pWin;.      Expr
93f0: 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45  SetProperty(p, E
9400: 50 5f 57 69 6e 46 75 6e 63 29 3b 0a 20 20 20 20  P_WinFunc);.    
9410: 20 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 20 3d    pWin->pOwner =
9420: 20 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   p;.      if( p-
9430: 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74  >flags & EP_Dist
9440: 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  inct ){.        
9450: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
9460: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
9470: 20 20 20 22 44 49 53 54 49 4e 43 54 20 69 73 20     "DISTINCT is 
9480: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 66 6f  not supported fo
9490: 72 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  r window functio
94a0: 6e 73 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ns");.      }.  
94b0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
94c0: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 65   sqlite3WindowDe
94d0: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
94e0: 20 70 57 69 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   pWin);.  }.}../
94f0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66  *.** Return 0 if
9500: 20 74 68 65 20 74 77 6f 20 77 69 6e 64 6f 77 20   the two window 
9510: 6f 62 6a 65 63 74 73 20 61 72 65 20 69 64 65 6e  objects are iden
9520: 74 69 63 61 6c 2c 20 6f 72 20 6e 6f 6e 2d 7a 65  tical, or non-ze
9530: 72 6f 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a  ro otherwise..**
9540: 20 49 64 65 6e 74 69 63 61 6c 20 77 69 6e 64 6f   Identical windo
9550: 77 20 6f 62 6a 65 63 74 73 20 63 61 6e 20 62 65  w objects can be
9560: 20 70 72 6f 63 65 73 73 65 64 20 69 6e 20 61 20   processed in a 
9570: 73 69 6e 67 6c 65 20 73 63 61 6e 2e 0a 2a 2f 0a  single scan..*/.
9580: 69 6e 74 20 73 71 6c 69 74 65 33 57 69 6e 64 6f  int sqlite3Windo
9590: 77 43 6f 6d 70 61 72 65 28 50 61 72 73 65 20 2a  wCompare(Parse *
95a0: 70 50 61 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a  pParse, Window *
95b0: 70 31 2c 20 57 69 6e 64 6f 77 20 2a 70 32 29 7b  p1, Window *p2){
95c0: 0a 20 20 69 66 28 20 70 31 2d 3e 65 46 72 6d 54  .  if( p1->eFrmT
95d0: 79 70 65 21 3d 70 32 2d 3e 65 46 72 6d 54 79 70  ype!=p2->eFrmTyp
95e0: 65 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  e ) return 1;.  
95f0: 69 66 28 20 70 31 2d 3e 65 53 74 61 72 74 21 3d  if( p1->eStart!=
9600: 70 32 2d 3e 65 53 74 61 72 74 20 29 20 72 65 74  p2->eStart ) ret
9610: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 31 2d  urn 1;.  if( p1-
9620: 3e 65 45 6e 64 21 3d 70 32 2d 3e 65 45 6e 64 20  >eEnd!=p2->eEnd 
9630: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
9640: 28 20 70 31 2d 3e 65 45 78 63 6c 75 64 65 21 3d  ( p1->eExclude!=
9650: 70 32 2d 3e 65 45 78 63 6c 75 64 65 20 29 20 72  p2->eExclude ) r
9660: 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73  eturn 1;.  if( s
9670: 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
9680: 65 28 70 50 61 72 73 65 2c 20 70 31 2d 3e 70 53  e(pParse, p1->pS
9690: 74 61 72 74 2c 20 70 32 2d 3e 70 53 74 61 72 74  tart, p2->pStart
96a0: 2c 20 2d 31 29 20 29 20 72 65 74 75 72 6e 20 31  , -1) ) return 1
96b0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  ;.  if( sqlite3E
96c0: 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73  xprCompare(pPars
96d0: 65 2c 20 70 31 2d 3e 70 45 6e 64 2c 20 70 32 2d  e, p1->pEnd, p2-
96e0: 3e 70 45 6e 64 2c 20 2d 31 29 20 29 20 72 65 74  >pEnd, -1) ) ret
96f0: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c  urn 1;.  if( sql
9700: 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
9710: 61 72 65 28 70 31 2d 3e 70 50 61 72 74 69 74 69  are(p1->pPartiti
9720: 6f 6e 2c 20 70 32 2d 3e 70 50 61 72 74 69 74 69  on, p2->pPartiti
9730: 6f 6e 2c 20 2d 31 29 20 29 20 72 65 74 75 72 6e  on, -1) ) return
9740: 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   1;.  if( sqlite
9750: 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65  3ExprListCompare
9760: 28 70 31 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70  (p1->pOrderBy, p
9770: 32 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31 29  2->pOrderBy, -1)
9780: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72   ) return 1;.  r
9790: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn 0;.}.../*.
97a0: 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  ** This is calle
97b0: 64 20 62 79 20 63 6f 64 65 20 69 6e 20 73 65 6c  d by code in sel
97c0: 65 63 74 2e 63 20 62 65 66 6f 72 65 20 69 74 20  ect.c before it 
97d0: 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 57 68 65  calls sqlite3Whe
97e0: 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20 74 6f 20  reBegin().** to 
97f0: 62 65 67 69 6e 20 69 74 65 72 61 74 69 6e 67 20  begin iterating 
9800: 74 68 72 6f 75 67 68 20 74 68 65 20 73 75 62 2d  through the sub-
9810: 71 75 65 72 79 20 72 65 73 75 6c 74 73 2e 20 49  query results. I
9820: 74 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c  t is used to all
9830: 6f 63 61 74 65 0a 2a 2a 20 61 6e 64 20 69 6e 69  ocate.** and ini
9840: 74 69 61 6c 69 7a 65 20 72 65 67 69 73 74 65 72  tialize register
9850: 73 20 61 6e 64 20 63 75 72 73 6f 72 73 20 75 73  s and cursors us
9860: 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 69 6e  ed by sqlite3Win
9870: 64 6f 77 43 6f 64 65 53 74 65 70 28 29 2e 0a 2a  dowCodeStep()..*
9880: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69  /.void sqlite3Wi
9890: 6e 64 6f 77 43 6f 64 65 49 6e 69 74 28 50 61 72  ndowCodeInit(Par
98a0: 73 65 20 2a 70 50 61 72 73 65 2c 20 57 69 6e 64  se *pParse, Wind
98b0: 6f 77 20 2a 70 4d 57 69 6e 29 7b 0a 20 20 57 69  ow *pMWin){.  Wi
98c0: 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 56 64  ndow *pWin;.  Vd
98d0: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
98e0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
98f0: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 72  .  /* Allocate r
9900: 65 67 69 73 74 65 72 73 20 74 6f 20 75 73 65 20  egisters to use 
9910: 66 6f 72 20 50 41 52 54 49 54 49 4f 4e 20 42 59  for PARTITION BY
9920: 20 76 61 6c 75 65 73 2c 20 69 66 20 61 6e 79 2e   values, if any.
9930: 20 49 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a   Initialize.  **
9940: 20 73 61 69 64 20 72 65 67 69 73 74 65 72 73 20   said registers 
9950: 74 6f 20 4e 55 4c 4c 2e 20 20 2a 2f 0a 20 20 69  to NULL.  */.  i
9960: 66 28 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69  f( pMWin->pParti
9970: 74 69 6f 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20  tion ){.    int 
9980: 6e 45 78 70 72 20 3d 20 70 4d 57 69 6e 2d 3e 70  nExpr = pMWin->p
9990: 50 61 72 74 69 74 69 6f 6e 2d 3e 6e 45 78 70 72  Partition->nExpr
99a0: 3b 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 72 65 67  ;.    pMWin->reg
99b0: 50 61 72 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Part = pParse->n
99c0: 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73  Mem+1;.    pPars
99d0: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70 72  e->nMem += nExpr
99e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
99f0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75  eAddOp3(v, OP_Nu
9a00: 6c 6c 2c 20 30 2c 20 70 4d 57 69 6e 2d 3e 72 65  ll, 0, pMWin->re
9a10: 67 50 61 72 74 2c 20 70 4d 57 69 6e 2d 3e 72 65  gPart, pMWin->re
9a20: 67 50 61 72 74 2b 6e 45 78 70 72 2d 31 29 3b 0a  gPart+nExpr-1);.
9a30: 20 20 7d 0a 0a 20 20 70 4d 57 69 6e 2d 3e 72 65    }..  pMWin->re
9a40: 67 4f 6e 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d  gOne = ++pParse-
9a50: 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  >nMem;.  sqlite3
9a60: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
9a70: 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4d 57  _Integer, 1, pMW
9a80: 69 6e 2d 3e 72 65 67 4f 6e 65 29 3b 0a 0a 20 20  in->regOne);..  
9a90: 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 78 63 6c  if( pMWin->eExcl
9aa0: 75 64 65 20 29 7b 0a 20 20 20 20 70 4d 57 69 6e  ude ){.    pMWin
9ab0: 2d 3e 72 65 67 53 74 61 72 74 52 6f 77 69 64 20  ->regStartRowid 
9ac0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
9ad0: 3b 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 72 65 67  ;.    pMWin->reg
9ae0: 45 6e 64 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61  EndRowid = ++pPa
9af0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 70  rse->nMem;.    p
9b00: 4d 57 69 6e 2d 3e 63 73 72 41 70 70 20 3d 20 70  MWin->csrApp = p
9b10: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
9b20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9b30: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
9b40: 65 72 2c 20 31 2c 20 70 4d 57 69 6e 2d 3e 72 65  er, 1, pMWin->re
9b50: 67 53 74 61 72 74 52 6f 77 69 64 29 3b 0a 20 20  gStartRowid);.  
9b60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9b70: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
9b80: 72 2c 20 30 2c 20 70 4d 57 69 6e 2d 3e 72 65 67  r, 0, pMWin->reg
9b90: 45 6e 64 52 6f 77 69 64 29 3b 0a 20 20 20 20 73  EndRowid);.    s
9ba0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
9bb0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20  (v, OP_OpenDup, 
9bc0: 70 4d 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20 70  pMWin->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 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
9bf0: 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69  .  for(pWin=pMWi
9c00: 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57  n; pWin; pWin=pW
9c10: 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20  in->pNextWin){. 
9c20: 20 20 20 46 75 6e 63 44 65 66 20 2a 70 20 3d 20     FuncDef *p = 
9c30: 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20 20  pWin->pFunc;.   
9c40: 20 69 66 28 20 28 70 2d 3e 66 75 6e 63 46 6c 61   if( (p->funcFla
9c50: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
9c60: 5f 4d 49 4e 4d 41 58 29 20 26 26 20 70 57 69 6e  _MINMAX) && pWin
9c70: 2d 3e 65 53 74 61 72 74 21 3d 54 4b 5f 55 4e 42  ->eStart!=TK_UNB
9c80: 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20 20 20 20  OUNDED ){.      
9c90: 2f 2a 20 54 68 65 20 69 6e 6c 69 6e 65 20 76 65  /* The inline ve
9ca0: 72 73 69 6f 6e 73 20 6f 66 20 6d 69 6e 28 29 20  rsions of min() 
9cb0: 61 6e 64 20 6d 61 78 28 29 20 72 65 71 75 69 72  and max() requir
9cc0: 65 20 61 20 73 69 6e 67 6c 65 20 65 70 68 65 6d  e a single ephem
9cd0: 65 72 61 6c 0a 20 20 20 20 20 20 2a 2a 20 74 61  eral.      ** ta
9ce0: 62 6c 65 20 61 6e 64 20 33 20 72 65 67 69 73 74  ble and 3 regist
9cf0: 65 72 73 2e 20 54 68 65 20 72 65 67 69 73 74 65  ers. The registe
9d00: 72 73 20 61 72 65 20 75 73 65 64 20 61 73 20 66  rs are used as f
9d10: 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a  ollows:.      **
9d20: 0a 20 20 20 20 20 20 2a 2a 20 20 20 72 65 67 41  .      **   regA
9d30: 70 70 2b 30 3a 20 73 6c 6f 74 20 74 6f 20 63 6f  pp+0: slot to co
9d40: 70 79 20 6d 69 6e 28 29 2f 6d 61 78 28 29 20 61  py min()/max() a
9d50: 72 67 75 6d 65 6e 74 20 74 6f 20 66 6f 72 20 4d  rgument to for M
9d60: 61 6b 65 52 65 63 6f 72 64 0a 20 20 20 20 20 20  akeRecord.      
9d70: 2a 2a 20 20 20 72 65 67 41 70 70 2b 31 3a 20 69  **   regApp+1: i
9d80: 6e 74 65 67 65 72 20 76 61 6c 75 65 20 75 73 65  nteger value use
9d90: 64 20 74 6f 20 65 6e 73 75 72 65 20 6b 65 79 73  d to ensure keys
9da0: 20 61 72 65 20 75 6e 69 71 75 65 0a 20 20 20 20   are unique.    
9db0: 20 20 2a 2a 20 20 20 72 65 67 41 70 70 2b 32 3a    **   regApp+2:
9dc0: 20 6f 75 74 70 75 74 20 6f 66 20 4d 61 6b 65 52   output of MakeR
9dd0: 65 63 6f 72 64 0a 20 20 20 20 20 20 2a 2f 0a 20  ecord.      */. 
9de0: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
9df0: 4c 69 73 74 20 3d 20 70 57 69 6e 2d 3e 70 4f 77  List = pWin->pOw
9e00: 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  ner->x.pList;.  
9e10: 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
9e20: 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
9e30: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
9e40: 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  st(pParse, pList
9e50: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  , 0, 0);.      p
9e60: 57 69 6e 2d 3e 63 73 72 41 70 70 20 3d 20 70 50  Win->csrApp = pP
9e70: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
9e80: 20 20 20 20 70 57 69 6e 2d 3e 72 65 67 41 70 70      pWin->regApp
9e90: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
9ea0: 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  1;.      pParse-
9eb0: 3e 6e 4d 65 6d 20 2b 3d 20 33 3b 0a 20 20 20 20  >nMem += 3;.    
9ec0: 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 26    if( pKeyInfo &
9ed0: 26 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 7a  & pWin->pFunc->z
9ee0: 4e 61 6d 65 5b 31 5d 3d 3d 27 69 27 20 29 7b 0a  Name[1]=='i' ){.
9ef0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9f00: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
9f10: 72 64 65 72 5b 30 5d 3d 3d 30 20 29 3b 0a 20 20  rder[0]==0 );.  
9f20: 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e        pKeyInfo->
9f30: 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 20 3d 20  aSortOrder[0] = 
9f40: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
9f50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9f60: 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
9f70: 65 6d 65 72 61 6c 2c 20 70 57 69 6e 2d 3e 63 73  emeral, pWin->cs
9f80: 72 41 70 70 2c 20 32 29 3b 0a 20 20 20 20 20 20  rApp, 2);.      
9f90: 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e  sqlite3VdbeAppen
9fa0: 64 50 34 28 76 2c 20 70 4b 65 79 49 6e 66 6f 2c  dP4(v, pKeyInfo,
9fb0: 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
9fc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9fd0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
9fe0: 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65  ger, 0, pWin->re
9ff0: 67 41 70 70 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  gApp+1);.    }. 
a000: 20 20 20 65 6c 73 65 20 69 66 28 20 70 2d 3e 7a     else if( p->z
a010: 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e  Name==nth_valueN
a020: 61 6d 65 20 7c 7c 20 70 2d 3e 7a 4e 61 6d 65 3d  ame || p->zName=
a030: 3d 66 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65  =first_valueName
a040: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c 6c   ){.      /* All
a050: 6f 63 61 74 65 20 74 77 6f 20 72 65 67 69 73 74  ocate two regist
a060: 65 72 73 20 61 74 20 70 57 69 6e 2d 3e 72 65 67  ers at pWin->reg
a070: 41 70 70 2e 20 54 68 65 73 65 20 77 69 6c 6c 20  App. These will 
a080: 62 65 20 75 73 65 64 20 74 6f 0a 20 20 20 20 20  be used to.     
a090: 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 73 74   ** store the st
a0a0: 61 72 74 20 61 6e 64 20 65 6e 64 20 69 6e 64 65  art and end inde
a0b0: 78 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  x of the current
a0c0: 20 66 72 61 6d 65 2e 20 20 2a 2f 0a 20 20 20 20   frame.  */.    
a0d0: 20 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 20 3d    pWin->regApp =
a0e0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
a0f0: 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 63 73 72  .      pWin->csr
a100: 41 70 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  App = pParse->nT
a110: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61 72  ab++;.      pPar
a120: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 32 3b 0a 20  se->nMem += 2;. 
a130: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a140: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
a150: 6e 44 75 70 2c 20 70 57 69 6e 2d 3e 63 73 72 41  nDup, pWin->csrA
a160: 70 70 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43  pp, pMWin->iEphC
a170: 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65  sr);.    }.    e
a180: 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4e 61 6d 65  lse if( p->zName
a190: 3d 3d 6c 65 61 64 4e 61 6d 65 20 7c 7c 20 70 2d  ==leadName || p-
a1a0: 3e 7a 4e 61 6d 65 3d 3d 6c 61 67 4e 61 6d 65 20  >zName==lagName 
a1b0: 29 7b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 63  ){.      pWin->c
a1c0: 73 72 41 70 70 20 3d 20 70 50 61 72 73 65 2d 3e  srApp = pParse->
a1d0: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 73 71  nTab++;.      sq
a1e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
a1f0: 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70  v, OP_OpenDup, p
a200: 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20 70 4d 57  Win->csrApp, pMW
a210: 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20  in->iEphCsr);.  
a220: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 64 65 66 69    }.  }.}..#defi
a230: 6e 65 20 57 49 4e 44 4f 57 5f 53 54 41 52 54 49  ne WINDOW_STARTI
a240: 4e 47 5f 49 4e 54 20 20 30 0a 23 64 65 66 69 6e  NG_INT  0.#defin
a250: 65 20 57 49 4e 44 4f 57 5f 45 4e 44 49 4e 47 5f  e WINDOW_ENDING_
a260: 49 4e 54 20 20 20 20 31 0a 23 64 65 66 69 6e 65  INT    1.#define
a270: 20 57 49 4e 44 4f 57 5f 4e 54 48 5f 56 41 4c 55   WINDOW_NTH_VALU
a280: 45 5f 49 4e 54 20 32 0a 23 64 65 66 69 6e 65 20  E_INT 2.#define 
a290: 57 49 4e 44 4f 57 5f 53 54 41 52 54 49 4e 47 5f  WINDOW_STARTING_
a2a0: 4e 55 4d 20 20 33 0a 23 64 65 66 69 6e 65 20 57  NUM  3.#define W
a2b0: 49 4e 44 4f 57 5f 45 4e 44 49 4e 47 5f 4e 55 4d  INDOW_ENDING_NUM
a2c0: 20 20 20 20 34 0a 0a 2f 2a 0a 2a 2a 20 41 20 22      4../*.** A "
a2d0: 50 52 45 43 45 44 49 4e 47 20 3c 65 78 70 72 3e  PRECEDING <expr>
a2e0: 22 20 28 65 43 6f 6e 64 3d 3d 30 29 20 6f 72 20  " (eCond==0) or 
a2f0: 22 46 4f 4c 4c 4f 57 49 4e 47 20 3c 65 78 70 72  "FOLLOWING <expr
a300: 3e 22 20 28 65 43 6f 6e 64 3d 3d 31 29 20 6f 72  >" (eCond==1) or
a310: 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66   the.** value of
a320: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
a330: 6d 65 6e 74 20 74 6f 20 6e 74 68 5f 76 61 6c 75  ment to nth_valu
a340: 65 28 29 20 28 65 43 6f 6e 64 3d 3d 32 29 20 68  e() (eCond==2) h
a350: 61 73 20 6a 75 73 74 20 62 65 65 6e 0a 2a 2a 20  as just been.** 
a360: 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 74 68  evaluated and th
a370: 65 20 72 65 73 75 6c 74 20 6c 65 66 74 20 69 6e  e result left in
a380: 20 72 65 67 69 73 74 65 72 20 72 65 67 2e 20 54   register reg. T
a390: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 67 65 6e  his function gen
a3a0: 65 72 61 74 65 73 20 56 4d 0a 2a 2a 20 63 6f 64  erates VM.** cod
a3b0: 65 20 74 6f 20 63 68 65 63 6b 20 74 68 61 74 20  e to check that 
a3c0: 74 68 65 20 76 61 6c 75 65 20 69 73 20 61 20 6e  the value is a n
a3d0: 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65  on-negative inte
a3e0: 67 65 72 20 61 6e 64 20 74 68 72 6f 77 73 20 61  ger and throws a
a3f0: 6e 0a 2a 2a 20 65 78 63 65 70 74 69 6f 6e 20 69  n.** exception i
a400: 66 20 69 74 20 69 73 20 6e 6f 74 2e 0a 2a 2f 0a  f it is not..*/.
a410: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64  static void wind
a420: 6f 77 43 68 65 63 6b 56 61 6c 75 65 28 50 61 72  owCheckValue(Par
a430: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
a440: 72 65 67 2c 20 69 6e 74 20 65 43 6f 6e 64 29 7b  reg, int eCond){
a450: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
a460: 63 68 61 72 20 2a 61 7a 45 72 72 5b 5d 20 3d 20  char *azErr[] = 
a470: 7b 0a 20 20 20 20 22 66 72 61 6d 65 20 73 74 61  {.    "frame sta
a480: 72 74 69 6e 67 20 6f 66 66 73 65 74 20 6d 75 73  rting offset mus
a490: 74 20 62 65 20 61 20 6e 6f 6e 2d 6e 65 67 61 74  t be a non-negat
a4a0: 69 76 65 20 69 6e 74 65 67 65 72 22 2c 0a 20 20  ive integer",.  
a4b0: 20 20 22 66 72 61 6d 65 20 65 6e 64 69 6e 67 20    "frame ending 
a4c0: 6f 66 66 73 65 74 20 6d 75 73 74 20 62 65 20 61  offset must be a
a4d0: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e   non-negative in
a4e0: 74 65 67 65 72 22 2c 0a 20 20 20 20 22 73 65 63  teger",.    "sec
a4f0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
a500: 6e 74 68 5f 76 61 6c 75 65 20 6d 75 73 74 20 62  nth_value must b
a510: 65 20 61 20 70 6f 73 69 74 69 76 65 20 69 6e 74  e a positive int
a520: 65 67 65 72 22 2c 0a 20 20 20 20 22 66 72 61 6d  eger",.    "fram
a530: 65 20 73 74 61 72 74 69 6e 67 20 6f 66 66 73 65  e starting offse
a540: 74 20 6d 75 73 74 20 62 65 20 61 20 6e 6f 6e 2d  t must be a non-
a550: 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 22  negative number"
a560: 2c 0a 20 20 20 20 22 66 72 61 6d 65 20 65 6e 64  ,.    "frame end
a570: 69 6e 67 20 6f 66 66 73 65 74 20 6d 75 73 74 20  ing offset must 
a580: 62 65 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  be a non-negativ
a590: 65 20 6e 75 6d 62 65 72 22 2c 0a 20 20 7d 3b 0a  e number",.  };.
a5a0: 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 4f 70    static int aOp
a5b0: 5b 5d 20 3d 20 7b 20 4f 50 5f 47 65 2c 20 4f 50  [] = { OP_Ge, OP
a5c0: 5f 47 65 2c 20 4f 50 5f 47 74 2c 20 4f 50 5f 47  _Ge, OP_Gt, OP_G
a5d0: 65 2c 20 4f 50 5f 47 65 20 7d 3b 0a 20 20 56 64  e, OP_Ge };.  Vd
a5e0: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
a5f0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
a600: 20 20 69 6e 74 20 72 65 67 5a 65 72 6f 20 3d 20    int regZero = 
a610: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
a620: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73  g(pParse);.  ass
a630: 65 72 74 28 20 65 43 6f 6e 64 3e 3d 30 20 26 26  ert( eCond>=0 &&
a640: 20 65 43 6f 6e 64 3c 41 72 72 61 79 53 69 7a 65   eCond<ArraySize
a650: 28 61 7a 45 72 72 29 20 29 3b 0a 20 20 73 71 6c  (azErr) );.  sql
a660: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
a670: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
a680: 20 72 65 67 5a 65 72 6f 29 3b 0a 20 20 69 66 28   regZero);.  if(
a690: 20 65 43 6f 6e 64 3e 3d 57 49 4e 44 4f 57 5f 53   eCond>=WINDOW_S
a6a0: 54 41 52 54 49 4e 47 5f 4e 55 4d 20 29 7b 0a 20  TARTING_NUM ){. 
a6b0: 20 20 20 69 6e 74 20 72 65 67 53 74 72 69 6e 67     int regString
a6c0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
a6d0: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
a6e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a6f0: 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  Op4(v, OP_String
a700: 38 2c 20 30 2c 20 72 65 67 53 74 72 69 6e 67 2c  8, 0, regString,
a710: 20 30 2c 20 22 22 2c 20 50 34 5f 53 54 41 54 49   0, "", P4_STATI
a720: 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  C);.    sqlite3V
a730: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
a740: 47 65 2c 20 72 65 67 53 74 72 69 6e 67 2c 20 73  Ge, regString, s
a750: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
a760: 74 41 64 64 72 28 76 29 2b 32 2c 20 72 65 67 29  tAddr(v)+2, reg)
a770: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
a780: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c  eChangeP5(v, SQL
a790: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 29  ITE_AFF_NUMERIC)
a7a0: 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
a7b0: 67 65 28 76 29 3b 0a 20 20 20 20 61 73 73 65 72  ge(v);.    asser
a7c0: 74 28 20 65 43 6f 6e 64 3d 3d 33 20 7c 7c 20 65  t( eCond==3 || e
a7d0: 43 6f 6e 64 3d 3d 34 20 29 3b 0a 20 20 20 20 56  Cond==4 );.    V
a7e0: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
a7f0: 20 65 43 6f 6e 64 3d 3d 33 29 3b 0a 20 20 20 20   eCond==3);.    
a800: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
a810: 2c 20 65 43 6f 6e 64 3d 3d 34 29 3b 0a 20 20 7d  , eCond==4);.  }
a820: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
a830: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a840: 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 65 67  P_MustBeInt, reg
a850: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
a860: 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a  rentAddr(v)+2);.
a870: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
a880: 28 76 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  (v);.    assert(
a890: 20 65 43 6f 6e 64 3d 3d 30 20 7c 7c 20 65 43 6f   eCond==0 || eCo
a8a0: 6e 64 3d 3d 31 20 7c 7c 20 65 43 6f 6e 64 3d 3d  nd==1 || eCond==
a8b0: 32 20 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  2 );.    VdbeCov
a8c0: 65 72 61 67 65 49 66 28 76 2c 20 65 43 6f 6e 64  erageIf(v, eCond
a8d0: 3d 3d 30 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  ==0);.    VdbeCo
a8e0: 76 65 72 61 67 65 49 66 28 76 2c 20 65 43 6f 6e  verageIf(v, eCon
a8f0: 64 3d 3d 31 29 3b 0a 20 20 20 20 56 64 62 65 43  d==1);.    VdbeC
a900: 6f 76 65 72 61 67 65 49 66 28 76 2c 20 65 43 6f  overageIf(v, eCo
a910: 6e 64 3d 3d 32 29 3b 0a 20 20 7d 0a 20 20 73 71  nd==2);.  }.  sq
a920: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
a930: 76 2c 20 61 4f 70 5b 65 43 6f 6e 64 5d 2c 20 72  v, aOp[eCond], r
a940: 65 67 5a 65 72 6f 2c 20 73 71 6c 69 74 65 33 56  egZero, sqlite3V
a950: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
a960: 29 2b 32 2c 20 72 65 67 29 3b 0a 20 20 56 64 62  )+2, reg);.  Vdb
a970: 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72 4e 75  eCoverageNeverNu
a980: 6c 6c 49 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 30  llIf(v, eCond==0
a990: 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67  );.  VdbeCoverag
a9a0: 65 4e 65 76 65 72 4e 75 6c 6c 49 66 28 76 2c 20  eNeverNullIf(v, 
a9b0: 65 43 6f 6e 64 3d 3d 31 29 3b 0a 20 20 56 64 62  eCond==1);.  Vdb
a9c0: 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72 4e 75  eCoverageNeverNu
a9d0: 6c 6c 49 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 32  llIf(v, eCond==2
a9e0: 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67  );.  VdbeCoverag
a9f0: 65 4e 65 76 65 72 4e 75 6c 6c 49 66 28 76 2c 20  eNeverNullIf(v, 
aa00: 65 43 6f 6e 64 3d 3d 33 29 3b 0a 20 20 56 64 62  eCond==3);.  Vdb
aa10: 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72 4e 75  eCoverageNeverNu
aa20: 6c 6c 49 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 34  llIf(v, eCond==4
aa30: 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 61 79 41  );.  sqlite3MayA
aa40: 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20  bort(pParse);.  
aa50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
aa60: 32 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51  2(v, OP_Halt, SQ
aa70: 4c 49 54 45 5f 45 52 52 4f 52 2c 20 4f 45 5f 41  LITE_ERROR, OE_A
aa80: 62 6f 72 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  bort);.  sqlite3
aa90: 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20  VdbeAppendP4(v, 
aaa0: 28 76 6f 69 64 2a 29 61 7a 45 72 72 5b 65 43 6f  (void*)azErr[eCo
aab0: 6e 64 5d 2c 20 50 34 5f 53 54 41 54 49 43 29 3b  nd], P4_STATIC);
aac0: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
aad0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
aae0: 20 72 65 67 5a 65 72 6f 29 3b 0a 7d 0a 0a 2f 2a   regZero);.}../*
aaf0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
ab00: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
ab10: 74 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  ts passed to the
ab20: 20 77 69 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e   window-function
ab30: 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77   associated.** w
ab40: 69 74 68 20 74 68 65 20 6f 62 6a 65 63 74 20 70  ith the object p
ab50: 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
ab60: 79 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  y argument to th
ab70: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
ab80: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 64 6f  static int windo
ab90: 77 41 72 67 43 6f 75 6e 74 28 57 69 6e 64 6f 77  wArgCount(Window
aba0: 20 2a 70 57 69 6e 29 7b 0a 20 20 45 78 70 72 4c   *pWin){.  ExprL
abb0: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 57 69  ist *pList = pWi
abc0: 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69  n->pOwner->x.pLi
abd0: 73 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 4c  st;.  return (pL
abe0: 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78  ist ? pList->nEx
abf0: 70 72 20 3a 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pr : 0);.}../*.*
ac00: 2a 20 47 65 6e 65 72 61 74 65 20 56 4d 20 63 6f  * Generate VM co
ac10: 64 65 20 74 6f 20 69 6e 76 6f 6b 65 20 65 69 74  de to invoke eit
ac20: 68 65 72 20 78 53 74 65 70 28 29 20 28 69 66 20  her xStep() (if 
ac30: 62 49 6e 76 65 72 73 65 20 69 73 20 30 29 20 6f  bInverse is 0) o
ac40: 72 20 0a 2a 2a 20 78 49 6e 76 65 72 73 65 20 28  r .** xInverse (
ac50: 69 66 20 62 49 6e 76 65 72 73 65 20 69 73 20 6e  if bInverse is n
ac60: 6f 6e 2d 7a 65 72 6f 29 20 66 6f 72 20 65 61 63  on-zero) for eac
ac70: 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  h window functio
ac80: 6e 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e  n in the .** lin
ac90: 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e  ked list startin
aca0: 67 20 61 74 20 70 4d 57 69 6e 2e 20 4f 72 2c 20  g at pMWin. Or, 
acb0: 66 6f 72 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e  for built-in win
acc0: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a  dow functions.**
acd0: 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 75 73 65   that do not use
ace0: 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 66 75   the standard fu
acf0: 6e 63 74 69 6f 6e 20 41 50 49 2c 20 67 65 6e 65  nction API, gene
ad00: 72 61 74 65 20 74 68 65 20 72 65 71 75 69 72 65  rate the require
ad10: 64 0a 2a 2a 20 69 6e 6c 69 6e 65 20 56 4d 20 63  d.** inline VM c
ad20: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72  ode..**.** If ar
ad30: 67 75 6d 65 6e 74 20 63 73 72 20 69 73 20 67 72  gument csr is gr
ad40: 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
ad50: 75 61 6c 20 74 6f 20 30 2c 20 74 68 65 6e 20 61  ual to 0, then a
ad60: 72 67 75 6d 65 6e 74 20 72 65 67 20 69 73 0a 2a  rgument reg is.*
ad70: 2a 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69  * the first regi
ad80: 73 74 65 72 20 69 6e 20 61 6e 20 61 72 72 61 79  ster in an array
ad90: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 67 75   of registers gu
ada0: 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c  aranteed to be l
adb0: 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 20 74  arge.** enough t
adc0: 6f 20 68 6f 6c 64 20 74 68 65 20 61 72 72 61 79  o hold the array
add0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 66 6f   of arguments fo
ade0: 72 20 65 61 63 68 20 66 75 6e 63 74 69 6f 6e 2e  r each function.
adf0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a   In this case.**
ae00: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 61   the arguments a
ae10: 72 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  re extracted fro
ae20: 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  m the current ro
ae30: 77 20 6f 66 20 63 73 72 20 69 6e 74 6f 20 74 68  w of csr into th
ae40: 65 0a 2a 2a 20 61 72 72 61 79 20 6f 66 20 72 65  e.** array of re
ae50: 67 69 73 74 65 72 73 20 62 65 66 6f 72 65 20 69  gisters before i
ae60: 6e 76 6f 6b 69 6e 67 20 4f 50 5f 41 67 67 53 74  nvoking OP_AggSt
ae70: 65 70 20 6f 72 20 4f 50 5f 41 67 67 49 6e 76 65  ep or OP_AggInve
ae80: 72 73 65 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66  rse.**.** Or, if
ae90: 20 63 73 72 20 69 73 20 6c 65 73 73 20 74 68 61   csr is less tha
aea0: 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n zero, then the
aeb0: 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   array of regist
aec0: 65 72 73 20 61 74 20 72 65 67 20 69 73 0a 2a 2a  ers at reg is.**
aed0: 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74   already populat
aee0: 65 64 20 77 69 74 68 20 61 6c 6c 20 63 6f 6c 75  ed with all colu
aef0: 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 63 75 72  mns from the cur
af00: 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20  rent row of the 
af10: 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a  sub-query..**.**
af20: 20 49 66 20 61 72 67 75 6d 65 6e 74 20 72 65 67   If argument reg
af30: 50 61 72 74 53 69 7a 65 20 69 73 20 6e 6f 6e 2d  PartSize is non-
af40: 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73  zero, then it is
af50: 20 61 20 72 65 67 69 73 74 65 72 20 63 6f 6e 74   a register cont
af60: 61 69 6e 69 6e 67 20 74 68 65 0a 2a 2a 20 6e 75  aining the.** nu
af70: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
af80: 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 72 74  the current part
af90: 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ition..*/.static
afa0: 20 76 6f 69 64 20 77 69 6e 64 6f 77 41 67 67 53   void windowAggS
afb0: 74 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50  tep(.  Parse *pP
afc0: 61 72 73 65 2c 20 0a 20 20 57 69 6e 64 6f 77 20  arse, .  Window 
afd0: 2a 70 4d 57 69 6e 2c 20 20 20 20 20 20 20 20 20  *pMWin,         
afe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 6b           /* Link
aff0: 65 64 20 6c 69 73 74 20 6f 66 20 77 69 6e 64 6f  ed list of windo
b000: 77 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  w functions */. 
b010: 20 69 6e 74 20 63 73 72 2c 20 20 20 20 20 20 20   int csr,       
b020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b030: 20 2f 2a 20 52 65 61 64 20 61 72 67 75 6d 65 6e   /* Read argumen
b040: 74 73 20 66 72 6f 6d 20 74 68 69 73 20 63 75 72  ts from this cur
b050: 73 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 62 49 6e  sor */.  int bIn
b060: 76 65 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  verse,          
b070: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
b080: 20 74 6f 20 69 6e 76 6f 6b 65 20 78 49 6e 76 65   to invoke xInve
b090: 72 73 65 20 69 6e 73 74 65 61 64 20 6f 66 20 78  rse instead of x
b0a0: 53 74 65 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65  Step */.  int re
b0b0: 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
b0c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
b0d0: 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ay of registers 
b0e0: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
b0f0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
b100: 28 70 50 61 72 73 65 29 3b 0a 20 20 57 69 6e 64  (pParse);.  Wind
b110: 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 66 6f 72 28  ow *pWin;.  for(
b120: 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e  pWin=pMWin; pWin
b130: 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65  ; pWin=pWin->pNe
b140: 78 74 57 69 6e 29 7b 0a 20 20 20 20 46 75 6e 63  xtWin){.    Func
b150: 44 65 66 20 2a 70 46 75 6e 63 20 3d 20 70 57 69  Def *pFunc = pWi
b160: 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 69 6e  n->pFunc;.    in
b170: 74 20 72 65 67 41 72 67 3b 0a 20 20 20 20 69 6e  t regArg;.    in
b180: 74 20 6e 41 72 67 20 3d 20 77 69 6e 64 6f 77 41  t nArg = windowA
b190: 72 67 43 6f 75 6e 74 28 70 57 69 6e 29 3b 0a 20  rgCount(pWin);. 
b1a0: 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 66     int i;..    f
b1b0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
b1c0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
b1d0: 69 21 3d 31 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a  i!=1 || pFunc->z
b1e0: 4e 61 6d 65 21 3d 6e 74 68 5f 76 61 6c 75 65 4e  Name!=nth_valueN
b1f0: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ame ){.        s
b200: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
b210: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63  (v, OP_Column, c
b220: 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f  sr, pWin->iArgCo
b230: 6c 2b 69 2c 20 72 65 67 2b 69 29 3b 0a 20 20 20  l+i, reg+i);.   
b240: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b250: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b260: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
b270: 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
b280: 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b  , pWin->iArgCol+
b290: 69 2c 20 72 65 67 2b 69 29 3b 0a 20 20 20 20 20  i, reg+i);.     
b2a0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 67   }.    }.    reg
b2b0: 41 72 67 20 3d 20 72 65 67 3b 0a 0a 20 20 20 20  Arg = reg;..    
b2c0: 69 66 28 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74  if( pMWin->regSt
b2d0: 61 72 74 52 6f 77 69 64 3d 3d 30 0a 20 20 20 20  artRowid==0.    
b2e0: 20 26 26 20 28 70 46 75 6e 63 2d 3e 66 75 6e 63   && (pFunc->func
b2f0: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
b300: 55 4e 43 5f 4d 49 4e 4d 41 58 29 20 0a 20 20 20  UNC_MINMAX) .   
b310: 20 20 26 26 20 28 70 57 69 6e 2d 3e 65 53 74 61    && (pWin->eSta
b320: 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  rt!=TK_UNBOUNDED
b330: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69  ).    ){.      i
b340: 6e 74 20 61 64 64 72 49 73 4e 75 6c 6c 20 3d 20  nt addrIsNull = 
b350: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b360: 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  1(v, OP_IsNull, 
b370: 72 65 67 41 72 67 29 3b 0a 20 20 20 20 20 20 56  regArg);.      V
b380: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
b390: 20 20 20 20 20 20 69 66 28 20 62 49 6e 76 65 72        if( bInver
b3a0: 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  se==0 ){.       
b3b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b3c0: 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
b3d0: 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31 2c   pWin->regApp+1,
b3e0: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   1);.        sql
b3f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b400: 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 65 67 41  , OP_SCopy, regA
b410: 72 67 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70  rg, pWin->regApp
b420: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
b430: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
b440: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
b450: 57 69 6e 2d 3e 72 65 67 41 70 70 2c 20 32 2c 20  Win->regApp, 2, 
b460: 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 32 29 3b  pWin->regApp+2);
b470: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b480: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
b490: 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 57 69 6e  _IdxInsert, pWin
b4a0: 2d 3e 63 73 72 41 70 70 2c 20 70 57 69 6e 2d 3e  ->csrApp, pWin->
b4b0: 72 65 67 41 70 70 2b 32 29 3b 0a 20 20 20 20 20  regApp+2);.     
b4c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b4d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b4e0: 34 49 6e 74 28 76 2c 20 4f 50 5f 53 65 65 6b 47  4Int(v, OP_SeekG
b4f0: 45 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c  E, pWin->csrApp,
b500: 20 30 2c 20 72 65 67 41 72 67 2c 20 31 29 3b 0a   0, regArg, 1);.
b510: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
b520: 72 61 67 65 4e 65 76 65 72 54 61 6b 65 6e 28 76  rageNeverTaken(v
b530: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
b540: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
b550: 4f 50 5f 44 65 6c 65 74 65 2c 20 70 57 69 6e 2d  OP_Delete, pWin-
b560: 3e 63 73 72 41 70 70 29 3b 0a 20 20 20 20 20 20  >csrApp);.      
b570: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
b580: 70 48 65 72 65 28 76 2c 20 73 71 6c 69 74 65 33  pHere(v, sqlite3
b590: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
b5a0: 76 29 2d 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20  v)-2);.      }. 
b5b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b5c0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
b5d0: 49 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 65 6c  IsNull);.    }el
b5e0: 73 65 20 69 66 28 20 70 57 69 6e 2d 3e 72 65 67  se if( pWin->reg
b5f0: 41 70 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73  App ){.      ass
b600: 65 72 74 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d  ert( pFunc->zNam
b610: 65 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65  e==nth_valueName
b620: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
b630: 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72  Func->zName==fir
b640: 73 74 5f 76 61 6c 75 65 4e 61 6d 65 0a 20 20 20  st_valueName.   
b650: 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65     );.      asse
b660: 72 74 28 20 62 49 6e 76 65 72 73 65 3d 3d 30 20  rt( bInverse==0 
b670: 7c 7c 20 62 49 6e 76 65 72 73 65 3d 3d 31 20 29  || bInverse==1 )
b680: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b690: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b6a0: 41 64 64 49 6d 6d 2c 20 70 57 69 6e 2d 3e 72 65  AddImm, pWin->re
b6b0: 67 41 70 70 2b 31 2d 62 49 6e 76 65 72 73 65 2c  gApp+1-bInverse,
b6c0: 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69   1);.    }else i
b6d0: 66 28 20 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63  f( pFunc->xSFunc
b6e0: 21 3d 6e 6f 6f 70 53 74 65 70 46 75 6e 63 20 29  !=noopStepFunc )
b6f0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
b700: 49 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  If = 0;.      if
b710: 28 20 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72 20  ( pWin->pFilter 
b720: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
b730: 65 67 54 6d 70 3b 0a 20 20 20 20 20 20 20 20 61  egTmp;.        a
b740: 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 30 20 7c  ssert( nArg==0 |
b750: 7c 20 6e 41 72 67 3d 3d 70 57 69 6e 2d 3e 70 4f  | nArg==pWin->pO
b760: 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  wner->x.pList->n
b770: 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 20 20  Expr );.        
b780: 61 73 73 65 72 74 28 20 6e 41 72 67 20 7c 7c 20  assert( nArg || 
b790: 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e  pWin->pOwner->x.
b7a0: 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pList==0 );.    
b7b0: 20 20 20 20 72 65 67 54 6d 70 20 3d 20 73 71 6c      regTmp = sql
b7c0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
b7d0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
b7e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b7f0: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
b800: 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43  csr, pWin->iArgC
b810: 6f 6c 2b 6e 41 72 67 2c 72 65 67 54 6d 70 29 3b  ol+nArg,regTmp);
b820: 0a 20 20 20 20 20 20 20 20 61 64 64 72 49 66 20  .        addrIf 
b830: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
b840: 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op3(v, OP_IfNot,
b850: 20 72 65 67 54 6d 70 2c 20 30 2c 20 31 29 3b 0a   regTmp, 0, 1);.
b860: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
b870: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
b880: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
b890: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
b8a0: 65 67 54 6d 70 29 3b 0a 20 20 20 20 20 20 7d 0a  egTmp);.      }.
b8b0: 20 20 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d        if( pFunc-
b8c0: 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
b8d0: 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c  ITE_FUNC_NEEDCOL
b8e0: 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c  L ){.        Col
b8f0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20  lSeq *pColl;.   
b900: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 41 72       assert( nAr
b910: 67 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  g>0 );.        p
b920: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
b930: 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72  prNNCollSeq(pPar
b940: 73 65 2c 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72  se, pWin->pOwner
b950: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  ->x.pList->a[0].
b960: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
b970: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b980: 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c  4(v, OP_CollSeq,
b990: 20 30 2c 30 2c 30 2c 20 28 63 6f 6e 73 74 20 63   0,0,0, (const c
b9a0: 68 61 72 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43  har*)pColl, P4_C
b9b0: 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d  OLLSEQ);.      }
b9c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b9d0: 62 65 41 64 64 4f 70 33 28 76 2c 20 62 49 6e 76  beAddOp3(v, bInv
b9e0: 65 72 73 65 3f 20 4f 50 5f 41 67 67 49 6e 76 65  erse? OP_AggInve
b9f0: 72 73 65 20 3a 20 4f 50 5f 41 67 67 53 74 65 70  rse : OP_AggStep
ba00: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
ba10: 20 20 20 20 20 20 20 20 20 20 20 62 49 6e 76 65             bInve
ba20: 72 73 65 2c 20 72 65 67 41 72 67 2c 20 70 57 69  rse, regArg, pWi
ba30: 6e 2d 3e 72 65 67 41 63 63 75 6d 29 3b 0a 20 20  n->regAccum);.  
ba40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ba50: 70 70 65 6e 64 50 34 28 76 2c 20 70 46 75 6e 63  ppendP4(v, pFunc
ba60: 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
ba70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ba80: 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29  ChangeP5(v, (u8)
ba90: 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 69 66 28  nArg);.      if(
baa0: 20 61 64 64 72 49 66 20 29 20 73 71 6c 69 74 65   addrIf ) sqlite
bab0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
bac0: 20 61 64 64 72 49 66 29 3b 0a 20 20 20 20 7d 0a   addrIf);.    }.
bad0: 20 20 7d 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73    }.}..typedef s
bae0: 74 72 75 63 74 20 57 69 6e 64 6f 77 43 6f 64 65  truct WindowCode
baf0: 41 72 67 20 57 69 6e 64 6f 77 43 6f 64 65 41 72  Arg WindowCodeAr
bb00: 67 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  g;.typedef struc
bb10: 74 20 57 69 6e 64 6f 77 43 73 72 41 6e 64 52 65  t WindowCsrAndRe
bb20: 67 20 57 69 6e 64 6f 77 43 73 72 41 6e 64 52 65  g WindowCsrAndRe
bb30: 67 3b 0a 73 74 72 75 63 74 20 57 69 6e 64 6f 77  g;.struct Window
bb40: 43 73 72 41 6e 64 52 65 67 20 7b 0a 20 20 69 6e  CsrAndReg {.  in
bb50: 74 20 63 73 72 3b 0a 20 20 69 6e 74 20 72 65 67  t csr;.  int reg
bb60: 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 57 69 6e  ;.};..struct Win
bb70: 64 6f 77 43 6f 64 65 41 72 67 20 7b 0a 20 20 50  dowCodeArg {.  P
bb80: 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20  arse *pParse;.  
bb90: 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 3b 0a 20  Window *pMWin;. 
bba0: 20 56 64 62 65 20 2a 70 56 64 62 65 3b 0a 20 20   Vdbe *pVdbe;.  
bbb0: 69 6e 74 20 72 65 67 47 6f 73 75 62 3b 0a 20 20  int regGosub;.  
bbc0: 69 6e 74 20 61 64 64 72 47 6f 73 75 62 3b 0a 20  int addrGosub;. 
bbd0: 20 69 6e 74 20 72 65 67 41 72 67 3b 0a 20 20 69   int regArg;.  i
bbe0: 6e 74 20 65 44 65 6c 65 74 65 3b 0a 0a 20 20 57  nt eDelete;..  W
bbf0: 69 6e 64 6f 77 43 73 72 41 6e 64 52 65 67 20 73  indowCsrAndReg s
bc00: 74 61 72 74 3b 0a 20 20 57 69 6e 64 6f 77 43 73  tart;.  WindowCs
bc10: 72 41 6e 64 52 65 67 20 63 75 72 72 65 6e 74 3b  rAndReg current;
bc20: 0a 20 20 57 69 6e 64 6f 77 43 73 72 41 6e 64 52  .  WindowCsrAndR
bc30: 65 67 20 65 6e 64 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a  eg end;.};../*.*
bc40: 2a 20 56 61 6c 75 65 73 20 74 68 61 74 20 6d 61  * Values that ma
bc50: 79 20 62 65 20 70 61 73 73 65 64 20 61 73 20 74  y be passed as t
bc60: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
bc70: 6e 74 20 74 6f 20 77 69 6e 64 6f 77 43 6f 64 65  nt to windowCode
bc80: 4f 70 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  Op()..*/.#define
bc90: 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52   WINDOW_RETURN_R
bca0: 4f 57 20 31 0a 23 64 65 66 69 6e 65 20 57 49 4e  OW 1.#define WIN
bcb0: 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 20 32  DOW_AGGINVERSE 2
bcc0: 0a 23 64 65 66 69 6e 65 20 57 49 4e 44 4f 57 5f  .#define WINDOW_
bcd0: 41 47 47 53 54 45 50 20 20 20 20 33 0a 0a 2f 2a  AGGSTEP    3../*
bce0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 4d 20  .** Generate VM 
bcf0: 63 6f 64 65 20 74 6f 20 72 65 61 64 20 74 68 65  code to read the
bd00: 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 73 20 70   window frames p
bd10: 65 65 72 20 76 61 6c 75 65 73 20 66 72 6f 6d 20  eer values from 
bd20: 63 75 72 73 6f 72 20 63 73 72 20 69 6e 74 6f 0a  cursor csr into.
bd30: 2a 2a 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72  ** an array of r
bd40: 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
bd50: 67 20 61 74 20 72 65 67 2e 0a 2a 2f 0a 73 74 61  g at reg..*/.sta
bd60: 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 52  tic void windowR
bd70: 65 61 64 50 65 65 72 56 61 6c 75 65 73 28 0a 20  eadPeerValues(. 
bd80: 20 57 69 6e 64 6f 77 43 6f 64 65 41 72 67 20 2a   WindowCodeArg *
bd90: 70 2c 0a 20 20 69 6e 74 20 63 73 72 2c 0a 20 20  p,.  int csr,.  
bda0: 69 6e 74 20 72 65 67 0a 29 7b 0a 20 20 57 69 6e  int reg.){.  Win
bdb0: 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e  dow *pMWin = p->
bdc0: 70 4d 57 69 6e 3b 0a 20 20 45 78 70 72 4c 69 73  pMWin;.  ExprLis
bdd0: 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 4d  t *pOrderBy = pM
bde0: 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  Win->pOrderBy;. 
bdf0: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
be00: 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73  .    Vdbe *v = s
be10: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 2d  qlite3GetVdbe(p-
be20: 3e 70 50 61 72 73 65 29 3b 0a 20 20 20 20 45 78  >pParse);.    Ex
be30: 70 72 4c 69 73 74 20 2a 70 50 61 72 74 20 3d 20  prList *pPart = 
be40: 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f  pMWin->pPartitio
be50: 6e 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 4f  n;.    int iColO
be60: 66 66 20 3d 20 70 4d 57 69 6e 2d 3e 6e 42 75 66  ff = pMWin->nBuf
be70: 66 65 72 43 6f 6c 20 2b 20 28 70 50 61 72 74 20  ferCol + (pPart 
be80: 3f 20 70 50 61 72 74 2d 3e 6e 45 78 70 72 20 3a  ? pPart->nExpr :
be90: 20 30 29 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a   0);.    int i;.
bea0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
beb0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
bec0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
bed0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
bee0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c   OP_Column, csr,
bef0: 20 69 43 6f 6c 4f 66 66 2b 69 2c 20 72 65 67 2b   iColOff+i, reg+
bf00: 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  i);.    }.  }.}.
bf10: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
bf20: 56 4d 20 63 6f 64 65 20 74 6f 20 69 6e 76 6f 6b  VM code to invok
bf30: 65 20 65 69 74 68 65 72 20 78 56 61 6c 75 65 28  e either xValue(
bf40: 29 20 28 62 46 69 6e 3d 3d 30 29 20 6f 72 20 78  ) (bFin==0) or x
bf50: 46 69 6e 61 6c 69 7a 65 28 29 0a 2a 2a 20 28 62  Finalize().** (b
bf60: 46 69 6e 3d 3d 31 29 20 66 6f 72 20 65 61 63 68  Fin==1) for each
bf70: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
bf80: 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   in the linked l
bf90: 69 73 74 20 73 74 61 72 74 69 6e 67 20 61 74 0a  ist starting at.
bfa0: 2a 2a 20 70 4d 57 69 6e 2e 20 4f 72 2c 20 66 6f  ** pMWin. Or, fo
bfb0: 72 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  r built-in windo
bfc0: 77 2d 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74  w-functions that
bfd0: 20 64 6f 20 6e 6f 74 20 75 73 65 20 74 68 65 20   do not use the 
bfe0: 73 74 61 6e 64 61 72 64 0a 2a 2a 20 41 50 49 2c  standard.** API,
bff0: 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 65 71   generate the eq
c000: 75 69 76 61 6c 65 6e 74 20 56 4d 20 63 6f 64 65  uivalent VM code
c010: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
c020: 20 77 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28   windowAggFinal(
c030: 57 69 6e 64 6f 77 43 6f 64 65 41 72 67 20 2a 70  WindowCodeArg *p
c040: 2c 20 69 6e 74 20 62 46 69 6e 29 7b 0a 20 20 50  , int bFin){.  P
c050: 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
c060: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 57 69 6e 64  ->pParse;.  Wind
c070: 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70  ow *pMWin = p->p
c080: 4d 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20  MWin;.  Vdbe *v 
c090: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
c0a0: 28 70 50 61 72 73 65 29 3b 0a 20 20 57 69 6e 64  (pParse);.  Wind
c0b0: 6f 77 20 2a 70 57 69 6e 3b 0a 0a 20 20 66 6f 72  ow *pWin;..  for
c0c0: 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69  (pWin=pMWin; pWi
c0d0: 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e  n; pWin=pWin->pN
c0e0: 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 69 66 28  extWin){.    if(
c0f0: 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72 74   pMWin->regStart
c100: 52 6f 77 69 64 3d 3d 30 0a 20 20 20 20 20 26 26  Rowid==0.     &&
c110: 20 28 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66   (pWin->pFunc->f
c120: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
c130: 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 20 0a  E_FUNC_MINMAX) .
c140: 20 20 20 20 20 26 26 20 28 70 57 69 6e 2d 3e 65       && (pWin->e
c150: 53 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e  Start!=TK_UNBOUN
c160: 44 45 44 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  DED).    ){.    
c170: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c180: 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
c190: 30 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75  0, pWin->regResu
c1a0: 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lt);.      sqlit
c1b0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
c1c0: 4f 50 5f 4c 61 73 74 2c 20 70 57 69 6e 2d 3e 63  OP_Last, pWin->c
c1d0: 73 72 41 70 70 29 3b 0a 20 20 20 20 20 20 56 64  srApp);.      Vd
c1e0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
c1f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c200: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
c210: 75 6d 6e 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70  umn, pWin->csrAp
c220: 70 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 52  p, 0, pWin->regR
c230: 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 73 71  esult);.      sq
c240: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
c250: 65 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65  e(v, sqlite3Vdbe
c260: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 32  CurrentAddr(v)-2
c270: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
c280: 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 20 29 7b   pWin->regApp ){
c290: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
c2a0: 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f  MWin->regStartRo
c2b0: 77 69 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65  wid==0 );.    }e
c2c0: 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
c2d0: 41 72 67 20 3d 20 77 69 6e 64 6f 77 41 72 67 43  Arg = windowArgC
c2e0: 6f 75 6e 74 28 70 57 69 6e 29 3b 0a 20 20 20 20  ount(pWin);.    
c2f0: 20 20 69 66 28 20 62 46 69 6e 20 29 7b 0a 20 20    if( bFin ){.  
c300: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c310: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 67  eAddOp2(v, OP_Ag
c320: 67 46 69 6e 61 6c 2c 20 70 57 69 6e 2d 3e 72 65  gFinal, pWin->re
c330: 67 41 63 63 75 6d 2c 20 6e 41 72 67 29 3b 0a 20  gAccum, nArg);. 
c340: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
c350: 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 57  beAppendP4(v, pW
c360: 69 6e 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55  in->pFunc, P4_FU
c370: 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 20 20  NCDEF);.        
c380: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c390: 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 57  2(v, OP_Copy, pW
c3a0: 69 6e 2d 3e 72 65 67 41 63 63 75 6d 2c 20 70 57  in->regAccum, pW
c3b0: 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a  in->regResult);.
c3c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
c3d0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
c3e0: 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72  Null, 0, pWin->r
c3f0: 65 67 41 63 63 75 6d 29 3b 0a 20 20 20 20 20 20  egAccum);.      
c400: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
c410: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
c420: 28 76 2c 20 4f 50 5f 41 67 67 56 61 6c 75 65 2c  (v, OP_AggValue,
c430: 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 2c 6e  pWin->regAccum,n
c440: 41 72 67 2c 70 57 69 6e 2d 3e 72 65 67 52 65 73  Arg,pWin->regRes
c450: 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ult);.        sq
c460: 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
c470: 34 28 76 2c 20 70 57 69 6e 2d 3e 70 46 75 6e 63  4(v, pWin->pFunc
c480: 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
c490: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
c4a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
c4b0: 74 65 20 63 6f 64 65 20 74 6f 20 63 61 6c 63 75  te code to calcu
c4c0: 6c 61 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  late the current
c4d0: 20 76 61 6c 75 65 73 20 6f 66 20 61 6c 6c 20 77   values of all w
c4e0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
c4f0: 69 6e 20 74 68 65 0a 2a 2a 20 70 2d 3e 70 4d 57  in the.** p->pMW
c500: 69 6e 20 6c 69 73 74 20 62 79 20 64 6f 69 6e 67  in list by doing
c510: 20 61 20 66 75 6c 6c 20 73 63 61 6e 20 6f 66 20   a full scan of 
c520: 74 68 65 20 63 75 72 72 65 6e 74 20 77 69 6e 64  the current wind
c530: 6f 77 20 66 72 61 6d 65 2e 20 53 74 6f 72 65 20  ow frame. Store 
c540: 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69  the.** results i
c550: 6e 20 74 68 65 20 57 69 6e 64 6f 77 2e 72 65 67  n the Window.reg
c560: 52 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 73  Result registers
c570: 2c 20 72 65 61 64 79 20 74 6f 20 72 65 74 75 72  , ready to retur
c580: 6e 20 74 68 65 20 75 70 70 65 72 0a 2a 2a 20 6c  n the upper.** l
c590: 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ayer..*/.static 
c5a0: 76 6f 69 64 20 77 69 6e 64 6f 77 46 75 6c 6c 53  void windowFullS
c5b0: 63 61 6e 28 57 69 6e 64 6f 77 43 6f 64 65 41 72  can(WindowCodeAr
c5c0: 67 20 2a 70 29 7b 0a 20 20 57 69 6e 64 6f 77 20  g *p){.  Window 
c5d0: 2a 70 57 69 6e 3b 0a 20 20 50 61 72 73 65 20 2a  *pWin;.  Parse *
c5e0: 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72  pParse = p->pPar
c5f0: 73 65 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d  se;.  Window *pM
c600: 57 69 6e 20 3d 20 70 2d 3e 70 4d 57 69 6e 3b 0a  Win = p->pMWin;.
c610: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 2d 3e 70    Vdbe *v = p->p
c620: 56 64 62 65 3b 0a 0a 20 20 69 6e 74 20 72 65 67  Vdbe;..  int reg
c630: 43 52 6f 77 69 64 20 3d 20 30 3b 20 20 20 20 20  CRowid = 0;     
c640: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
c650: 65 6e 74 20 72 6f 77 69 64 20 76 61 6c 75 65 20  ent rowid value 
c660: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43 50 65 65  */.  int regCPee
c670: 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
c680: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
c690: 70 65 65 72 20 76 61 6c 75 65 73 20 2a 2f 0a 20  peer values */. 
c6a0: 20 69 6e 74 20 72 65 67 52 6f 77 69 64 20 3d 20   int regRowid = 
c6b0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
c6c0: 20 2f 2a 20 41 67 67 53 74 65 70 20 72 6f 77 69   /* AggStep rowi
c6d0: 64 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74  d value */.  int
c6e0: 20 72 65 67 50 65 65 72 20 3d 20 30 3b 20 20 20   regPeer = 0;   
c6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c700: 41 67 67 53 74 65 70 20 70 65 65 72 20 76 61 6c  AggStep peer val
c710: 75 65 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 50  ues */..  int nP
c720: 65 65 72 3b 0a 20 20 69 6e 74 20 6c 62 6c 4e 65  eer;.  int lblNe
c730: 78 74 3b 0a 20 20 69 6e 74 20 6c 62 6c 42 72 6b  xt;.  int lblBrk
c740: 3b 0a 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74  ;.  int addrNext
c750: 3b 0a 20 20 69 6e 74 20 63 73 72 20 3d 20 70 4d  ;.  int csr = pM
c760: 57 69 6e 2d 3e 63 73 72 41 70 70 3b 0a 0a 20 20  Win->csrApp;..  
c770: 6e 50 65 65 72 20 3d 20 28 70 4d 57 69 6e 2d 3e  nPeer = (pMWin->
c780: 70 4f 72 64 65 72 42 79 20 3f 20 70 4d 57 69 6e  pOrderBy ? pMWin
c790: 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
c7a0: 72 20 3a 20 30 29 3b 0a 0a 20 20 6c 62 6c 4e 65  r : 0);..  lblNe
c7b0: 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  xt = sqlite3Vdbe
c7c0: 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65  MakeLabel(pParse
c7d0: 29 3b 0a 20 20 6c 62 6c 42 72 6b 20 3d 20 73 71  );.  lblBrk = sq
c7e0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
c7f0: 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 72  el(pParse);..  r
c800: 65 67 43 52 6f 77 69 64 20 3d 20 73 71 6c 69 74  egCRowid = sqlit
c810: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
c820: 72 73 65 29 3b 0a 20 20 72 65 67 52 6f 77 69 64  rse);.  regRowid
c830: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
c840: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
c850: 69 66 28 20 6e 50 65 65 72 20 29 7b 0a 20 20 20  if( nPeer ){.   
c860: 20 72 65 67 43 50 65 65 72 20 3d 20 73 71 6c 69   regCPeer = sqli
c870: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
c880: 70 50 61 72 73 65 2c 20 6e 50 65 65 72 29 3b 0a  pParse, nPeer);.
c890: 20 20 20 20 72 65 67 50 65 65 72 20 3d 20 73 71      regPeer = sq
c8a0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
c8b0: 65 28 70 50 61 72 73 65 2c 20 6e 50 65 65 72 29  e(pParse, nPeer)
c8c0: 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
c8d0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
c8e0: 5f 52 6f 77 69 64 2c 20 70 4d 57 69 6e 2d 3e 69  _Rowid, pMWin->i
c8f0: 45 70 68 43 73 72 2c 20 72 65 67 43 52 6f 77 69  EphCsr, regCRowi
c900: 64 29 3b 0a 20 20 77 69 6e 64 6f 77 52 65 61 64  d);.  windowRead
c910: 50 65 65 72 56 61 6c 75 65 73 28 70 2c 20 70 4d  PeerValues(p, pM
c920: 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 72 65  Win->iEphCsr, re
c930: 67 43 50 65 65 72 29 3b 0a 0a 20 20 66 6f 72 28  gCPeer);..  for(
c940: 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e  pWin=pMWin; pWin
c950: 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65  ; pWin=pWin->pNe
c960: 78 74 57 69 6e 29 7b 0a 20 20 20 20 73 71 6c 69  xtWin){.    sqli
c970: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
c980: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69   OP_Null, 0, pWi
c990: 6e 2d 3e 72 65 67 41 63 63 75 6d 29 3b 0a 20 20  n->regAccum);.  
c9a0: 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  }..  sqlite3Vdbe
c9b0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65  AddOp3(v, OP_See
c9c0: 6b 47 45 2c 20 63 73 72 2c 20 6c 62 6c 42 72 6b  kGE, csr, lblBrk
c9d0: 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72  , pMWin->regStar
c9e0: 74 52 6f 77 69 64 29 3b 0a 20 20 56 64 62 65 43  tRowid);.  VdbeC
c9f0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 61 64  overage(v);.  ad
ca00: 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33  drNext = sqlite3
ca10: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
ca20: 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
ca30: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
ca40: 77 69 64 2c 20 63 73 72 2c 20 72 65 67 52 6f 77  wid, csr, regRow
ca50: 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  id);.  sqlite3Vd
ca60: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 47  beAddOp3(v, OP_G
ca70: 74 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 45 6e 64  t, pMWin->regEnd
ca80: 52 6f 77 69 64 2c 20 6c 62 6c 42 72 6b 2c 20 72  Rowid, lblBrk, r
ca90: 65 67 52 6f 77 69 64 29 3b 0a 20 20 56 64 62 65  egRowid);.  Vdbe
caa0: 43 6f 76 65 72 61 67 65 4e 65 76 65 72 4e 75 6c  CoverageNeverNul
cab0: 6c 28 76 29 3b 0a 0a 20 20 69 66 28 20 70 4d 57  l(v);..  if( pMW
cac0: 69 6e 2d 3e 65 45 78 63 6c 75 64 65 3d 3d 54 4b  in->eExclude==TK
cad0: 5f 43 55 52 52 45 4e 54 20 29 7b 0a 20 20 20 20  _CURRENT ){.    
cae0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
caf0: 33 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65 67 43  3(v, OP_Eq, regC
cb00: 52 6f 77 69 64 2c 20 6c 62 6c 4e 65 78 74 2c 20  Rowid, lblNext, 
cb10: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 7d 65 6c  regRowid);.  }el
cb20: 73 65 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45  se if( pMWin->eE
cb30: 78 63 6c 75 64 65 21 3d 54 4b 5f 4e 4f 20 29 7b  xclude!=TK_NO ){
cb40: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  .    int addr;. 
cb50: 20 20 20 69 6e 74 20 61 64 64 72 45 71 20 3d 20     int addrEq = 
cb60: 30 3b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  0;.    KeyInfo *
cb70: 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 0a 0a 20  pKeyInfo = 0;.. 
cb80: 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70 4f     if( pMWin->pO
cb90: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
cba0: 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
cbb0: 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  e3KeyInfoFromExp
cbc0: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4d  rList(pParse, pM
cbd0: 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 2c 20 30  Win->pOrderBy, 0
cbe0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
cbf0: 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 78 63 6c  if( pMWin->eExcl
cc00: 75 64 65 3d 3d 54 4b 5f 54 49 45 53 20 29 7b 0a  ude==TK_TIES ){.
cc10: 20 20 20 20 20 20 61 64 64 72 45 71 20 3d 20 73        addrEq = s
cc20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
cc30: 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65 67 43 52  (v, OP_Eq, regCR
cc40: 6f 77 69 64 2c 20 30 2c 20 72 65 67 52 6f 77 69  owid, 0, regRowi
cc50: 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  d);.    }.    if
cc60: 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20  ( pKeyInfo ){.  
cc70: 20 20 20 20 77 69 6e 64 6f 77 52 65 61 64 50 65      windowReadPe
cc80: 65 72 56 61 6c 75 65 73 28 70 2c 20 63 73 72 2c  erValues(p, csr,
cc90: 20 72 65 67 50 65 65 72 29 3b 0a 20 20 20 20 20   regPeer);.     
cca0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ccb0: 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65  p3(v, OP_Compare
ccc0: 2c 20 72 65 67 50 65 65 72 2c 20 72 65 67 43 50  , regPeer, regCP
ccd0: 65 65 72 2c 20 6e 50 65 65 72 29 3b 0a 20 20 20  eer, nPeer);.   
cce0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70     sqlite3VdbeAp
ccf0: 70 65 6e 64 50 34 28 76 2c 20 28 76 6f 69 64 2a  pendP4(v, (void*
cd00: 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
cd10: 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 61 64  YINFO);.      ad
cd20: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
cd30: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31  CurrentAddr(v)+1
cd40: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
cd50: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
cd60: 4a 75 6d 70 2c 20 61 64 64 72 2c 20 6c 62 6c 4e  Jump, addr, lblN
cd70: 65 78 74 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  ext, addr);.    
cd80: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 45 71    VdbeCoverageEq
cd90: 4e 65 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Ne(v);.    }else
cda0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
cdb0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
cdc0: 47 6f 74 6f 2c 20 30 2c 20 6c 62 6c 4e 65 78 74  Goto, 0, lblNext
cdd0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
cde0: 20 61 64 64 72 45 71 20 29 20 73 71 6c 69 74 65   addrEq ) sqlite
cdf0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
ce00: 20 61 64 64 72 45 71 29 3b 0a 20 20 7d 0a 0a 20   addrEq);.  }.. 
ce10: 20 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28 70   windowAggStep(p
ce20: 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 63 73  Parse, pMWin, cs
ce30: 72 2c 20 30 2c 20 70 2d 3e 72 65 67 41 72 67 29  r, 0, p->regArg)
ce40: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ;..  sqlite3Vdbe
ce50: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
ce60: 6c 62 6c 4e 65 78 74 29 3b 0a 20 20 73 71 6c 69  lblNext);.  sqli
ce70: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
ce80: 20 4f 50 5f 4e 65 78 74 2c 20 63 73 72 2c 20 61   OP_Next, csr, a
ce90: 64 64 72 4e 65 78 74 29 3b 0a 20 20 56 64 62 65  ddrNext);.  Vdbe
cea0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
ceb0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
cec0: 72 65 28 76 2c 20 61 64 64 72 4e 65 78 74 2d 31  re(v, addrNext-1
ced0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
cee0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
cef0: 4e 65 78 74 2b 31 29 3b 0a 20 20 73 71 6c 69 74  Next+1);.  sqlit
cf00: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
cf10: 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 69  (pParse, regRowi
cf20: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  d);.  sqlite3Rel
cf30: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
cf40: 73 65 2c 20 72 65 67 43 52 6f 77 69 64 29 3b 0a  se, regCRowid);.
cf50: 20 20 69 66 28 20 6e 50 65 65 72 20 29 7b 0a 20    if( nPeer ){. 
cf60: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
cf70: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
cf80: 65 2c 20 72 65 67 50 65 65 72 2c 20 6e 50 65 65  e, regPeer, nPee
cf90: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  r);.    sqlite3R
cfa0: 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
cfb0: 70 50 61 72 73 65 2c 20 72 65 67 43 50 65 65 72  pParse, regCPeer
cfc0: 2c 20 6e 50 65 65 72 29 3b 0a 20 20 7d 0a 0a 20  , nPeer);.  }.. 
cfd0: 20 77 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28   windowAggFinal(
cfe0: 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p, 1);.}../*.** 
cff0: 49 6e 76 6f 6b 65 20 74 68 65 20 73 75 62 2d 72  Invoke the sub-r
d000: 6f 75 74 69 6e 65 20 61 74 20 72 65 67 47 6f 73  outine at regGos
d010: 75 62 20 28 67 65 6e 65 72 61 74 65 64 20 62 79  ub (generated by
d020: 20 63 6f 64 65 20 69 6e 20 73 65 6c 65 63 74 2e   code in select.
d030: 63 29 20 74 6f 0a 2a 2a 20 72 65 74 75 72 6e 20  c) to.** return 
d040: 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
d050: 6f 66 20 57 69 6e 64 6f 77 2e 69 45 70 68 43 73  of Window.iEphCs
d060: 72 2e 20 49 66 20 61 6c 6c 20 77 69 6e 64 6f 77  r. If all window
d070: 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 0a 2a   functions are.*
d080: 2a 20 61 67 67 72 65 67 61 74 65 20 77 69 6e 64  * aggregate wind
d090: 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61  ow functions tha
d0a0: 74 20 75 73 65 20 74 68 65 20 73 74 61 6e 64 61  t use the standa
d0b0: 72 64 20 41 50 49 2c 20 61 20 73 69 6e 67 6c 65  rd API, a single
d0c0: 0a 2a 2a 20 4f 50 5f 47 6f 73 75 62 20 69 6e 73  .** OP_Gosub ins
d0d0: 74 72 75 63 74 69 6f 6e 20 69 73 20 61 6c 6c 20  truction is all 
d0e0: 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e  that this routin
d0f0: 65 20 67 65 6e 65 72 61 74 65 73 2e 20 45 78 74  e generates. Ext
d100: 72 61 20 56 4d 20 63 6f 64 65 0a 2a 2a 20 66 6f  ra VM code.** fo
d110: 72 20 70 65 72 2d 72 6f 77 20 70 72 6f 63 65 73  r per-row proces
d120: 73 69 6e 67 20 69 73 20 6f 6e 6c 79 20 67 65 6e  sing is only gen
d130: 65 72 61 74 65 64 20 66 6f 72 20 74 68 65 20 66  erated for the f
d140: 6f 6c 6c 6f 77 69 6e 67 20 62 75 69 6c 74 2d 69  ollowing built-i
d150: 6e 20 77 69 6e 64 6f 77 0a 2a 2a 20 66 75 6e 63  n window.** func
d160: 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6e  tions:.**.**   n
d170: 74 68 5f 76 61 6c 75 65 28 29 0a 2a 2a 20 20 20  th_value().**   
d180: 66 69 72 73 74 5f 76 61 6c 75 65 28 29 0a 2a 2a  first_value().**
d190: 20 20 20 6c 61 67 28 29 0a 2a 2a 20 20 20 6c 65     lag().**   le
d1a0: 61 64 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ad().*/.static v
d1b0: 6f 69 64 20 77 69 6e 64 6f 77 52 65 74 75 72 6e  oid windowReturn
d1c0: 4f 6e 65 52 6f 77 28 57 69 6e 64 6f 77 43 6f 64  OneRow(WindowCod
d1d0: 65 41 72 67 20 2a 70 29 7b 0a 20 20 57 69 6e 64  eArg *p){.  Wind
d1e0: 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70  ow *pMWin = p->p
d1f0: 4d 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20  MWin;.  Vdbe *v 
d200: 3d 20 70 2d 3e 70 56 64 62 65 3b 0a 0a 20 20 69  = p->pVdbe;..  i
d210: 66 28 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61  f( pMWin->regSta
d220: 72 74 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 77  rtRowid ){.    w
d230: 69 6e 64 6f 77 46 75 6c 6c 53 63 61 6e 28 70 29  indowFullScan(p)
d240: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50  ;.  }else{.    P
d250: 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
d260: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 57 69  ->pParse;.    Wi
d270: 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 0a 20 20 20  ndow *pWin;..   
d280: 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b   for(pWin=pMWin;
d290: 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e   pWin; pWin=pWin
d2a0: 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20  ->pNextWin){.   
d2b0: 20 20 20 46 75 6e 63 44 65 66 20 2a 70 46 75 6e     FuncDef *pFun
d2c0: 63 20 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63 3b  c = pWin->pFunc;
d2d0: 0a 20 20 20 20 20 20 69 66 28 20 70 46 75 6e 63  .      if( pFunc
d2e0: 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c  ->zName==nth_val
d2f0: 75 65 4e 61 6d 65 0a 20 20 20 20 20 20 20 7c 7c  ueName.       ||
d300: 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66   pFunc->zName==f
d310: 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65 0a 20  irst_valueName. 
d320: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
d330: 69 6e 74 20 63 73 72 20 3d 20 70 57 69 6e 2d 3e  int csr = pWin->
d340: 63 73 72 41 70 70 3b 0a 20 20 20 20 20 20 20 20  csrApp;.        
d350: 69 6e 74 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65  int lbl = sqlite
d360: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70  3VdbeMakeLabel(p
d370: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
d380: 69 6e 74 20 74 6d 70 52 65 67 20 3d 20 73 71 6c  int tmpReg = sql
d390: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
d3a0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
d3b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d3c0: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
d3d0: 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74   pWin->regResult
d3e0: 29 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 69 66  );.  .        if
d3f0: 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d  ( pFunc->zName==
d400: 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 20 29 7b  nth_valueName ){
d410: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
d420: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
d430: 4f 50 5f 43 6f 6c 75 6d 6e 2c 70 4d 57 69 6e 2d  OP_Column,pMWin-
d440: 3e 69 45 70 68 43 73 72 2c 70 57 69 6e 2d 3e 69  >iEphCsr,pWin->i
d450: 41 72 67 43 6f 6c 2b 31 2c 74 6d 70 52 65 67 29  ArgCol+1,tmpReg)
d460: 3b 0a 20 20 20 20 20 20 20 20 20 20 77 69 6e 64  ;.          wind
d470: 6f 77 43 68 65 63 6b 56 61 6c 75 65 28 70 50 61  owCheckValue(pPa
d480: 72 73 65 2c 20 74 6d 70 52 65 67 2c 20 32 29 3b  rse, tmpReg, 2);
d490: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
d4a0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d4b0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
d4c0: 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 6d  P_Integer, 1, tm
d4d0: 70 52 65 67 29 3b 0a 20 20 20 20 20 20 20 20 7d  pReg);.        }
d4e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d4f0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
d500: 5f 41 64 64 2c 20 74 6d 70 52 65 67 2c 20 70 57  _Add, tmpReg, pW
d510: 69 6e 2d 3e 72 65 67 41 70 70 2c 20 74 6d 70 52  in->regApp, tmpR
d520: 65 67 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  eg);.        sql
d530: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
d540: 2c 20 4f 50 5f 47 74 2c 20 70 57 69 6e 2d 3e 72  , OP_Gt, pWin->r
d550: 65 67 41 70 70 2b 31 2c 20 6c 62 6c 2c 20 74 6d  egApp+1, lbl, tm
d560: 70 52 65 67 29 3b 0a 20 20 20 20 20 20 20 20 56  pReg);.        V
d570: 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72  dbeCoverageNever
d580: 4e 75 6c 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  Null(v);.       
d590: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d5a0: 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77  p3(v, OP_SeekRow
d5b0: 69 64 2c 20 63 73 72 2c 20 30 2c 20 74 6d 70 52  id, csr, 0, tmpR
d5c0: 65 67 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  eg);.        Vdb
d5d0: 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72 54 61  eCoverageNeverTa
d5e0: 6b 65 6e 28 76 29 3b 0a 20 20 20 20 20 20 20 20  ken(v);.        
d5f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d600: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
d610: 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43  csr, pWin->iArgC
d620: 6f 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73  ol, pWin->regRes
d630: 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ult);.        sq
d640: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
d650: 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20  Label(v, lbl);. 
d660: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
d670: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
d680: 72 73 65 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20  rse, tmpReg);.  
d690: 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65      }.      else
d6a0: 20 69 66 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d   if( pFunc->zNam
d6b0: 65 3d 3d 6c 65 61 64 4e 61 6d 65 20 7c 7c 20 70  e==leadName || p
d6c0: 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 61 67  Func->zName==lag
d6d0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
d6e0: 69 6e 74 20 6e 41 72 67 20 3d 20 70 57 69 6e 2d  int nArg = pWin-
d6f0: 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74  >pOwner->x.pList
d700: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->nExpr;.       
d710: 20 69 6e 74 20 63 73 72 20 3d 20 70 57 69 6e 2d   int csr = pWin-
d720: 3e 63 73 72 41 70 70 3b 0a 20 20 20 20 20 20 20  >csrApp;.       
d730: 20 69 6e 74 20 6c 62 6c 20 3d 20 73 71 6c 69 74   int lbl = sqlit
d740: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
d750: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
d760: 20 69 6e 74 20 74 6d 70 52 65 67 20 3d 20 73 71   int tmpReg = sq
d770: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
d780: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
d790: 20 69 6e 74 20 69 45 70 68 20 3d 20 70 4d 57 69   int iEph = pMWi
d7a0: 6e 2d 3e 69 45 70 68 43 73 72 3b 0a 20 20 0a 20  n->iEphCsr;.  . 
d7b0: 20 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3c         if( nArg<
d7c0: 33 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  3 ){.          s
d7d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d7e0: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
d7f0: 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29  pWin->regResult)
d800: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
d810: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
d820: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
d830: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 45 70 68 2c  OP_Column, iEph,
d840: 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 32 2c  pWin->iArgCol+2,
d850: 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29  pWin->regResult)
d860: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d870: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d880: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69  ddOp2(v, OP_Rowi
d890: 64 2c 20 69 45 70 68 2c 20 74 6d 70 52 65 67 29  d, iEph, tmpReg)
d8a0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 41  ;.        if( nA
d8b0: 72 67 3c 32 20 29 7b 0a 20 20 20 20 20 20 20 20  rg<2 ){.        
d8c0: 20 20 69 6e 74 20 76 61 6c 20 3d 20 28 70 46 75    int val = (pFu
d8d0: 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e  nc->zName==leadN
d8e0: 61 6d 65 20 3f 20 31 20 3a 20 2d 31 29 3b 0a 20  ame ? 1 : -1);. 
d8f0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d900: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
d910: 5f 41 64 64 49 6d 6d 2c 20 74 6d 70 52 65 67 2c  _AddImm, tmpReg,
d920: 20 76 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d   val);.        }
d930: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
d940: 69 6e 74 20 6f 70 20 3d 20 28 70 46 75 6e 63 2d  int op = (pFunc-
d950: 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65  >zName==leadName
d960: 20 3f 20 4f 50 5f 41 64 64 20 3a 20 4f 50 5f 53   ? OP_Add : OP_S
d970: 75 62 74 72 61 63 74 29 3b 0a 20 20 20 20 20 20  ubtract);.      
d980: 20 20 20 20 69 6e 74 20 74 6d 70 52 65 67 32 20      int tmpReg2 
d990: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
d9a0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
d9b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d9c0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
d9d0: 6f 6c 75 6d 6e 2c 20 69 45 70 68 2c 20 70 57 69  olumn, iEph, pWi
d9e0: 6e 2d 3e 69 41 72 67 43 6f 6c 2b 31 2c 20 74 6d  n->iArgCol+1, tm
d9f0: 70 52 65 67 32 29 3b 0a 20 20 20 20 20 20 20 20  pReg2);.        
da00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
da10: 4f 70 33 28 76 2c 20 6f 70 2c 20 74 6d 70 52 65  Op3(v, op, tmpRe
da20: 67 32 2c 20 74 6d 70 52 65 67 2c 20 74 6d 70 52  g2, tmpReg, tmpR
da30: 65 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  eg);.          s
da40: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
da50: 70 52 65 67 28 70 50 61 72 73 65 2c 20 74 6d 70  pReg(pParse, tmp
da60: 52 65 67 32 29 3b 0a 20 20 20 20 20 20 20 20 7d  Reg2);.        }
da70: 0a 20 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69  .  .        sqli
da80: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
da90: 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 63   OP_SeekRowid, c
daa0: 73 72 2c 20 6c 62 6c 2c 20 74 6d 70 52 65 67 29  sr, lbl, tmpReg)
dab0: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
dac0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
dad0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
dae0: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
daf0: 6e 2c 20 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41  n, csr, pWin->iA
db00: 72 67 43 6f 6c 2c 20 70 57 69 6e 2d 3e 72 65 67  rgCol, pWin->reg
db10: 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 20  Result);.       
db20: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
db30: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29  lveLabel(v, lbl)
db40: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
db50: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
db60: 70 50 61 72 73 65 2c 20 74 6d 70 52 65 67 29 3b  pParse, tmpReg);
db70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
db80: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
db90: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
dba0: 75 62 2c 20 70 2d 3e 72 65 67 47 6f 73 75 62 2c  ub, p->regGosub,
dbb0: 20 70 2d 3e 61 64 64 72 47 6f 73 75 62 29 3b 0a   p->addrGosub);.
dbc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
dbd0: 65 20 63 6f 64 65 20 74 6f 20 73 65 74 20 74 68  e code to set th
dbe0: 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65  e accumulator re
dbf0: 67 69 73 74 65 72 20 66 6f 72 20 65 61 63 68 20  gister for each 
dc00: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 0a  window function.
dc10: 2a 2a 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64  ** in the linked
dc20: 20 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20   list passed as 
dc30: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
dc40: 65 6e 74 20 74 6f 20 4e 55 4c 4c 2e 20 41 6e 64  ent to NULL. And
dc50: 20 70 65 72 66 6f 72 6d 0a 2a 2a 20 61 6e 79 20   perform.** any 
dc60: 65 71 75 69 76 61 6c 65 6e 74 20 69 6e 69 74 69  equivalent initi
dc70: 61 6c 69 7a 61 74 69 6f 6e 20 72 65 71 75 69 72  alization requir
dc80: 65 64 20 62 79 20 61 6e 79 20 62 75 69 6c 74 2d  ed by any built-
dc90: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
dca0: 6f 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 6c 69  ons.** in the li
dcb0: 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
dcc0: 74 20 77 69 6e 64 6f 77 49 6e 69 74 41 63 63 75  t windowInitAccu
dcd0: 6d 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  m(Parse *pParse,
dce0: 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 29 7b   Window *pMWin){
dcf0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
dd00: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
dd10: 73 65 29 3b 0a 20 20 69 6e 74 20 72 65 67 41 72  se);.  int regAr
dd20: 67 3b 0a 20 20 69 6e 74 20 6e 41 72 67 20 3d 20  g;.  int nArg = 
dd30: 30 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69  0;.  Window *pWi
dd40: 6e 3b 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d  n;.  for(pWin=pM
dd50: 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d  Win; pWin; pWin=
dd60: 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b  pWin->pNextWin){
dd70: 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 46  .    FuncDef *pF
dd80: 75 6e 63 20 3d 20 70 57 69 6e 2d 3e 70 46 75 6e  unc = pWin->pFun
dd90: 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  c;.    sqlite3Vd
dda0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
ddb0: 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65  ull, 0, pWin->re
ddc0: 67 41 63 63 75 6d 29 3b 0a 20 20 20 20 6e 41 72  gAccum);.    nAr
ddd0: 67 20 3d 20 4d 41 58 28 6e 41 72 67 2c 20 77 69  g = MAX(nArg, wi
dde0: 6e 64 6f 77 41 72 67 43 6f 75 6e 74 28 70 57 69  ndowArgCount(pWi
ddf0: 6e 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 57  n));.    if( pMW
de00: 69 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f 77 69  in->regStartRowi
de10: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  d==0 ){.      if
de20: 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d  ( pFunc->zName==
de30: 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 20 7c 7c  nth_valueName ||
de40: 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66   pFunc->zName==f
de50: 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65 20 29  irst_valueName )
de60: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
de70: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
de80: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 57  P_Integer, 0, pW
de90: 69 6e 2d 3e 72 65 67 41 70 70 29 3b 0a 20 20 20  in->regApp);.   
dea0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
deb0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
dec0: 65 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d 3e 72  eger, 0, pWin->r
ded0: 65 67 41 70 70 2b 31 29 3b 0a 20 20 20 20 20 20  egApp+1);.      
dee0: 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 28 70 46  }..      if( (pF
def0: 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  unc->funcFlags &
df00: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e   SQLITE_FUNC_MIN
df10: 4d 41 58 29 20 26 26 20 70 57 69 6e 2d 3e 63 73  MAX) && pWin->cs
df20: 72 41 70 70 20 29 7b 0a 20 20 20 20 20 20 20 20  rApp ){.        
df30: 61 73 73 65 72 74 28 20 70 57 69 6e 2d 3e 65 53  assert( pWin->eS
df40: 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44  tart!=TK_UNBOUND
df50: 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ED );.        sq
df60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
df70: 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74 65  v, OP_ResetSorte
df80: 72 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 29  r, pWin->csrApp)
df90: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
dfa0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
dfb0: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 57  P_Integer, 0, pW
dfc0: 69 6e 2d 3e 72 65 67 41 70 70 2b 31 29 3b 0a 20  in->regApp+1);. 
dfd0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
dfe0: 0a 20 20 72 65 67 41 72 67 20 3d 20 70 50 61 72  .  regArg = pPar
dff0: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 70 50  se->nMem+1;.  pP
e000: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 41  arse->nMem += nA
e010: 72 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 67  rg;.  return reg
e020: 41 72 67 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52  Arg;.}../* .** R
e030: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
e040: 65 20 63 75 72 72 65 6e 74 20 66 72 61 6d 65 20  e current frame 
e050: 73 68 6f 75 6c 64 20 62 65 20 63 61 63 68 65 64  should be cached
e060: 20 69 6e 20 74 68 65 20 65 70 68 65 6d 65 72 61   in the ephemera
e070: 6c 20 74 61 62 6c 65 2c 0a 2a 2a 20 65 76 65 6e  l table,.** even
e080: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   if there are no
e090: 20 78 49 6e 76 65 72 73 65 28 29 20 63 61 6c 6c   xInverse() call
e0a0: 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73  s required..*/.s
e0b0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 64 6f 77  tatic int window
e0c0: 43 61 63 68 65 46 72 61 6d 65 28 57 69 6e 64 6f  CacheFrame(Windo
e0d0: 77 20 2a 70 4d 57 69 6e 29 7b 0a 20 20 57 69 6e  w *pMWin){.  Win
e0e0: 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 69 66 28  dow *pWin;.  if(
e0f0: 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72 74   pMWin->regStart
e100: 52 6f 77 69 64 20 29 20 72 65 74 75 72 6e 20 31  Rowid ) return 1
e110: 3b 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57  ;.  for(pWin=pMW
e120: 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70  in; pWin; pWin=p
e130: 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a  Win->pNextWin){.
e140: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 46 75      FuncDef *pFu
e150: 6e 63 20 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63  nc = pWin->pFunc
e160: 3b 0a 20 20 20 20 69 66 28 20 28 70 46 75 6e 63  ;.    if( (pFunc
e170: 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c  ->zName==nth_val
e180: 75 65 4e 61 6d 65 29 0a 20 20 20 20 20 7c 7c 20  ueName).     || 
e190: 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66  (pFunc->zName==f
e1a0: 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65 29 0a  irst_valueName).
e1b0: 20 20 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d 3e       || (pFunc->
e1c0: 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65 29  zName==leadName)
e1d0: 0a 20 20 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d  .     || (pFunc-
e1e0: 3e 7a 4e 61 6d 65 3d 3d 6c 61 67 4e 61 6d 65 29  >zName==lagName)
e1f0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
e200: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
e210: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
e220: 0a 2f 2a 0a 2a 2a 20 72 65 67 4f 6c 64 20 61 6e  ./*.** regOld an
e230: 64 20 72 65 67 4e 65 77 20 61 72 65 20 65 61 63  d regNew are eac
e240: 68 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69  h the first regi
e250: 73 74 65 72 20 69 6e 20 61 6e 20 61 72 72 61 79  ster in an array
e260: 20 6f 66 20 73 69 7a 65 0a 2a 2a 20 70 4f 72 64   of size.** pOrd
e270: 65 72 42 79 2d 3e 6e 45 78 70 72 2e 20 54 68 69  erBy->nExpr. Thi
e280: 73 20 66 75 6e 63 74 69 6f 6e 20 67 65 6e 65 72  s function gener
e290: 61 74 65 73 20 63 6f 64 65 20 74 6f 20 63 6f 6d  ates code to com
e2a0: 70 61 72 65 20 74 68 65 20 74 77 6f 0a 2a 2a 20  pare the two.** 
e2b0: 61 72 72 61 79 73 20 6f 66 20 72 65 67 69 73 74  arrays of regist
e2c0: 65 72 73 20 75 73 69 6e 67 20 74 68 65 20 63 6f  ers using the co
e2d0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
e2e0: 73 20 61 6e 64 20 6f 74 68 65 72 20 63 6f 6d 70  s and other comp
e2f0: 61 72 69 73 6f 6e 0a 2a 2a 20 70 61 72 61 6d 65  arison.** parame
e300: 74 65 72 73 20 73 70 65 63 69 66 69 65 64 20 62  ters specified b
e310: 79 20 70 4f 72 64 65 72 42 79 2e 20 0a 2a 2a 0a  y pOrderBy. .**.
e320: 2a 2a 20 49 66 20 74 68 65 20 74 77 6f 20 61 72  ** If the two ar
e330: 72 61 79 73 20 61 72 65 20 6e 6f 74 20 65 71 75  rays are not equ
e340: 61 6c 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  al, the contents
e350: 20 6f 66 20 72 65 67 4e 65 77 20 69 73 20 63 6f   of regNew is co
e360: 70 69 65 64 20 74 6f 20 0a 2a 2a 20 72 65 67 4f  pied to .** regO
e370: 6c 64 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 66  ld and control f
e380: 61 6c 6c 73 20 74 68 72 6f 75 67 68 2e 20 4f 74  alls through. Ot
e390: 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
e3a0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
e3b0: 61 72 72 61 79 73 0a 2a 2a 20 61 72 65 20 65 71  arrays.** are eq
e3c0: 75 61 6c 2c 20 61 6e 20 4f 50 5f 47 6f 74 6f 20  ual, an OP_Goto 
e3d0: 69 73 20 65 78 65 63 75 74 65 64 2e 20 54 68 65  is executed. The
e3e0: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
e3f0: 4f 50 5f 47 6f 74 6f 20 69 73 20 72 65 74 75 72  OP_Goto is retur
e400: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ned..*/.static v
e410: 6f 69 64 20 77 69 6e 64 6f 77 49 66 4e 65 77 50  oid windowIfNewP
e420: 65 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50  eer(.  Parse *pP
e430: 61 72 73 65 2c 0a 20 20 45 78 70 72 4c 69 73 74  arse,.  ExprList
e440: 20 2a 70 4f 72 64 65 72 42 79 2c 0a 20 20 69 6e   *pOrderBy,.  in
e450: 74 20 72 65 67 4e 65 77 2c 20 20 20 20 20 20 20  t regNew,       
e460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e470: 20 46 69 72 73 74 20 69 6e 20 61 72 72 61 79 20   First in array 
e480: 6f 66 20 6e 65 77 20 76 61 6c 75 65 73 20 2a 2f  of new values */
e490: 0a 20 20 69 6e 74 20 72 65 67 4f 6c 64 2c 20 20  .  int regOld,  
e4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4b0: 20 20 20 2f 2a 20 46 69 72 73 74 20 69 6e 20 61     /* First in a
e4c0: 72 72 61 79 20 6f 66 20 6f 6c 64 20 76 61 6c 75  rray of old valu
e4d0: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  es */.  int addr
e4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4f0: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
e500: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  here */.){.  Vdb
e510: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
e520: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
e530: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
e540: 0a 20 20 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20  .    int nVal = 
e550: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
e560: 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
e570: 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
e580: 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  KeyInfoFromExprL
e590: 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ist(pParse, pOrd
e5a0: 65 72 42 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20  erBy, 0, 0);.   
e5b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e5c0: 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65  p3(v, OP_Compare
e5d0: 2c 20 72 65 67 4f 6c 64 2c 20 72 65 67 4e 65 77  , regOld, regNew
e5e0: 2c 20 6e 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c  , nVal);.    sql
e5f0: 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
e600: 28 76 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79 49  (v, (void*)pKeyI
e610: 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
e620: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
e630: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
e640: 6d 70 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74  mp, .      sqlit
e650: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
e660: 72 28 76 29 2b 31 2c 20 61 64 64 72 2c 20 73 71  r(v)+1, addr, sq
e670: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
e680: 41 64 64 72 28 76 29 2b 31 0a 20 20 20 20 29 3b  Addr(v)+1.    );
e690: 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
e6a0: 65 45 71 4e 65 28 76 29 3b 0a 20 20 20 20 73 71  eEqNe(v);.    sq
e6b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
e6c0: 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4e  v, OP_Copy, regN
e6d0: 65 77 2c 20 72 65 67 4f 6c 64 2c 20 6e 56 61 6c  ew, regOld, nVal
e6e0: 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  -1);.  }else{.  
e6f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e700: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
e710: 30 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a  0, addr);.  }.}.
e720: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
e730: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61  tion is called a
e740: 73 20 70 61 72 74 20 6f 66 20 67 65 6e 65 72 61  s part of genera
e750: 74 69 6e 67 20 56 4d 20 70 72 6f 67 72 61 6d 73  ting VM programs
e760: 20 66 6f 72 20 52 41 4e 47 45 0a 2a 2a 20 6f 66   for RANGE.** of
e770: 66 73 65 74 20 50 52 45 43 45 44 49 4e 47 2f 46  fset PRECEDING/F
e780: 4f 4c 4c 4f 57 49 4e 47 20 66 72 61 6d 65 20 62  OLLOWING frame b
e790: 6f 75 6e 64 61 72 69 65 73 2e 20 41 73 73 75 6d  oundaries. Assum
e7a0: 69 6e 67 20 22 41 53 43 22 20 6f 72 64 65 72 20  ing "ASC" order 
e7b0: 66 6f 72 0a 2a 2a 20 74 68 65 20 4f 52 44 45 52  for.** the ORDER
e7c0: 20 42 59 20 74 65 72 6d 20 69 6e 20 74 68 65 20   BY term in the 
e7d0: 77 69 6e 64 6f 77 2c 20 69 74 20 67 65 6e 65 72  window, it gener
e7e0: 61 74 65 73 20 63 6f 64 65 20 65 71 75 69 76 61  ates code equiva
e7f0: 6c 65 6e 74 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20  lent to:.**.**  
e800: 20 69 66 28 20 63 73 72 31 2e 70 65 65 72 56 61   if( csr1.peerVa
e810: 6c 20 2b 20 72 65 67 56 61 6c 20 3e 3d 20 63 73  l + regVal >= cs
e820: 72 32 2e 70 65 65 72 56 61 6c 20 29 20 67 6f 74  r2.peerVal ) got
e830: 6f 20 6c 62 6c 3b 0a 2a 2a 0a 2a 2a 20 41 20 73  o lbl;.**.** A s
e840: 70 65 63 69 61 6c 20 74 79 70 65 20 6f 66 20 61  pecial type of a
e850: 72 69 74 68 6d 65 74 69 63 20 69 73 20 75 73 65  rithmetic is use
e860: 64 20 73 75 63 68 20 74 68 61 74 20 69 66 20 63  d such that if c
e870: 73 72 2e 70 65 65 72 56 61 6c 20 69 73 20 6e 6f  sr.peerVal is no
e880: 74 0a 2a 2a 20 61 20 6e 75 6d 65 72 69 63 20 74  t.** a numeric t
e890: 79 70 65 20 28 72 65 61 6c 20 6f 72 20 69 6e 74  ype (real or int
e8a0: 65 67 65 72 29 2c 20 74 68 65 6e 20 74 68 65 20  eger), then the 
e8b0: 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 61 64  result of the ad
e8c0: 64 69 74 69 6f 6e 20 69 73 0a 2a 2a 20 61 20 63  dition is.** a c
e8d0: 6f 70 79 20 6f 66 20 63 73 72 31 2e 70 65 65 72  opy of csr1.peer
e8e0: 56 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  Val..*/.static v
e8f0: 6f 69 64 20 77 69 6e 64 6f 77 43 6f 64 65 52 61  oid windowCodeRa
e900: 6e 67 65 54 65 73 74 28 0a 20 20 57 69 6e 64 6f  ngeTest(.  Windo
e910: 77 43 6f 64 65 41 72 67 20 2a 70 2c 20 0a 20 20  wCodeArg *p, .  
e920: 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
e930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e940: 20 2f 2a 20 4f 50 5f 47 65 20 6f 72 20 4f 50 5f   /* OP_Ge or OP_
e950: 47 74 20 2a 2f 0a 20 20 69 6e 74 20 63 73 72 31  Gt */.  int csr1
e960: 2c 20 0a 20 20 69 6e 74 20 72 65 67 56 61 6c 2c  , .  int regVal,
e970: 20 0a 20 20 69 6e 74 20 63 73 72 32 2c 0a 20 20   .  int csr2,.  
e980: 69 6e 74 20 6c 62 6c 0a 29 7b 0a 20 20 50 61 72  int lbl.){.  Par
e990: 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e  se *pParse = p->
e9a0: 70 50 61 72 73 65 3b 0a 20 20 56 64 62 65 20 2a  pParse;.  Vdbe *
e9b0: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
e9c0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e  be(pParse);.  in
e9d0: 74 20 72 65 67 31 20 3d 20 73 71 6c 69 74 65 33  t reg1 = sqlite3
e9e0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
e9f0: 65 29 3b 0a 20 20 69 6e 74 20 72 65 67 32 20 3d  e);.  int reg2 =
ea00: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
ea10: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e  eg(pParse);.  in
ea20: 74 20 61 72 69 74 68 20 3d 20 4f 50 5f 41 64 64  t arith = OP_Add
ea30: 3b 0a 20 20 69 6e 74 20 61 64 64 72 47 65 3b 0a  ;.  int addrGe;.
ea40: 0a 20 20 69 6e 74 20 72 65 67 53 74 72 69 6e 67  .  int regString
ea50: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
ea60: 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 70  m;..  assert( op
ea70: 3d 3d 4f 50 5f 47 65 20 7c 7c 20 6f 70 3d 3d 4f  ==OP_Ge || op==O
ea80: 50 5f 47 74 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c  P_Gt || op==OP_L
ea90: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
eaa0: 2d 3e 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42  ->pMWin->pOrderB
eab0: 79 20 26 26 20 70 2d 3e 70 4d 57 69 6e 2d 3e 70  y && p->pMWin->p
eac0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d  OrderBy->nExpr==
ead0: 31 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4d  1 );.  if( p->pM
eae0: 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61  Win->pOrderBy->a
eaf0: 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 7b  [0].sortOrder ){
eb00: 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f 70 20  .    switch( op 
eb10: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  ){.      case OP
eb20: 5f 47 65 3a 20 6f 70 20 3d 20 4f 50 5f 4c 65 3b  _Ge: op = OP_Le;
eb30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
eb40: 73 65 20 4f 50 5f 47 74 3a 20 6f 70 20 3d 20 4f  se OP_Gt: op = O
eb50: 50 5f 4c 74 3b 20 62 72 65 61 6b 3b 0a 20 20 20  P_Lt; break;.   
eb60: 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65     default: asse
eb70: 72 74 28 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b  rt( op==OP_Le );
eb80: 20 6f 70 20 3d 20 4f 50 5f 47 65 3b 20 62 72 65   op = OP_Ge; bre
eb90: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 72  ak;.    }.    ar
eba0: 69 74 68 20 3d 20 4f 50 5f 53 75 62 74 72 61 63  ith = OP_Subtrac
ebb0: 74 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 64 6f 77  t;.  }..  window
ebc0: 52 65 61 64 50 65 65 72 56 61 6c 75 65 73 28 70  ReadPeerValues(p
ebd0: 2c 20 63 73 72 31 2c 20 72 65 67 31 29 3b 0a 20  , csr1, reg1);. 
ebe0: 20 77 69 6e 64 6f 77 52 65 61 64 50 65 65 72 56   windowReadPeerV
ebf0: 61 6c 75 65 73 28 70 2c 20 63 73 72 32 2c 20 72  alues(p, csr2, r
ec00: 65 67 32 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  eg2);..  /* Chec
ec10: 6b 20 69 66 20 74 68 65 20 70 65 65 72 20 76 61  k if the peer va
ec20: 6c 75 65 20 66 6f 72 20 63 73 72 31 20 76 61 6c  lue for csr1 val
ec30: 75 65 20 69 73 20 61 20 74 65 78 74 20 6f 72 20  ue is a text or 
ec40: 62 6c 6f 62 20 62 79 20 63 6f 6d 70 61 72 69 6e  blob by comparin
ec50: 67 0a 20 20 2a 2a 20 69 74 20 74 6f 20 74 68 65  g.  ** it to the
ec60: 20 73 6d 61 6c 6c 65 73 74 20 70 6f 73 73 69 62   smallest possib
ec70: 6c 65 20 73 74 72 69 6e 67 20 2d 20 27 27 2e 20  le string - ''. 
ec80: 49 66 20 69 74 20 69 73 2c 20 6a 75 6d 70 20 6f  If it is, jump o
ec90: 76 65 72 20 74 68 65 0a 20 20 2a 2a 20 4f 50 5f  ver the.  ** OP_
eca0: 41 64 64 20 6f 72 20 4f 50 5f 53 75 62 74 72 61  Add or OP_Subtra
ecb0: 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 61 6e 64  ct operation and
ecc0: 20 70 72 6f 63 65 65 64 20 64 69 72 65 63 74 6c   proceed directl
ecd0: 79 20 74 6f 20 74 68 65 20 63 6f 6d 70 61 72 69  y to the compari
ece0: 73 6f 6e 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  son. */.  sqlite
ecf0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
ed00: 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 72 65  P_String8, 0, re
ed10: 67 53 74 72 69 6e 67 2c 20 30 2c 20 22 22 2c 20  gString, 0, "", 
ed20: 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 61 64  P4_STATIC);.  ad
ed30: 64 72 47 65 20 3d 20 73 71 6c 69 74 65 33 56 64  drGe = sqlite3Vd
ed40: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 47  beAddOp3(v, OP_G
ed50: 65 2c 20 72 65 67 53 74 72 69 6e 67 2c 20 30 2c  e, regString, 0,
ed60: 20 72 65 67 31 29 3b 0a 20 20 56 64 62 65 43 6f   reg1);.  VdbeCo
ed70: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
ed80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
ed90: 2c 20 61 72 69 74 68 2c 20 72 65 67 56 61 6c 2c  , arith, regVal,
eda0: 20 72 65 67 31 2c 20 72 65 67 31 29 3b 0a 20 20   reg1, reg1);.  
edb0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
edc0: 65 72 65 28 76 2c 20 61 64 64 72 47 65 29 3b 0a  ere(v, addrGe);.
edd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ede0: 4f 70 33 28 76 2c 20 6f 70 2c 20 72 65 67 32 2c  Op3(v, op, reg2,
edf0: 20 6c 62 6c 2c 20 72 65 67 31 29 3b 20 56 64 62   lbl, reg1); Vdb
ee00: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
ee10: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
ee20: 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55  eP5(v, SQLITE_NU
ee30: 4c 4c 45 51 29 3b 0a 20 20 61 73 73 65 72 74 28  LLEQ);.  assert(
ee40: 20 6f 70 3d 3d 4f 50 5f 47 65 20 7c 7c 20 6f 70   op==OP_Ge || op
ee50: 3d 3d 4f 50 5f 47 74 20 7c 7c 20 6f 70 3d 3d 4f  ==OP_Gt || op==O
ee60: 50 5f 4c 74 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c  P_Lt || op==OP_L
ee70: 65 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  e );.  testcase(
ee80: 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65  op==OP_Ge); Vdbe
ee90: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
eea0: 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 74 65 73 74  ==OP_Ge);.  test
eeb0: 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  case(op==OP_Lt);
eec0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
eed0: 76 2c 20 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20  v, op==OP_Lt);. 
eee0: 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
eef0: 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Le); VdbeCovera
ef00: 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4c  geIf(v, op==OP_L
ef10: 65 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 6f  e);.  testcase(o
ef20: 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43  p==OP_Gt); VdbeC
ef30: 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
ef40: 3d 4f 50 5f 47 74 29 3b 0a 0a 20 20 73 71 6c 69  =OP_Gt);..  sqli
ef50: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
ef60: 67 28 70 50 61 72 73 65 2c 20 72 65 67 31 29 3b  g(pParse, reg1);
ef70: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
ef80: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
ef90: 20 72 65 67 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   reg2);.}../*.**
efa0: 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e   Helper function
efb0: 20 66 6f 72 20 73 71 6c 69 74 65 33 57 69 6e 64   for sqlite3Wind
efc0: 6f 77 43 6f 64 65 53 74 65 70 28 29 2e 20 45 61  owCodeStep(). Ea
efd0: 63 68 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20  ch call to this 
efe0: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 67 65 6e 65  function.** gene
eff0: 72 61 74 65 73 20 56 4d 20 63 6f 64 65 20 66 6f  rates VM code fo
f000: 72 20 61 20 73 69 6e 67 6c 65 20 52 45 54 55 52  r a single RETUR
f010: 4e 5f 52 4f 57 2c 20 41 47 47 53 54 45 50 20 6f  N_ROW, AGGSTEP o
f020: 72 20 41 47 47 49 4e 56 45 52 53 45 20 0a 2a 2a  r AGGINVERSE .**
f030: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 52 65 66 65   operation. Refe
f040: 72 20 74 6f 20 74 68 65 20 68 65 61 64 65 72 20  r to the header 
f050: 63 6f 6d 6d 65 6e 74 20 66 6f 72 20 73 71 6c 69  comment for sqli
f060: 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 53 74 65  te3WindowCodeSte
f070: 70 28 29 20 66 6f 72 0a 2a 2a 20 64 65 74 61 69  p() for.** detai
f080: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
f090: 74 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 0a  t windowCodeOp(.
f0a0: 20 57 69 6e 64 6f 77 43 6f 64 65 41 72 67 20 2a   WindowCodeArg *
f0b0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
f0c0: 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a    /* Context obj
f0d0: 65 63 74 20 2a 2f 0a 20 69 6e 74 20 6f 70 2c 20  ect */. int op, 
f0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 49 4e 44           /* WIND
f100: 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 41  OW_RETURN_ROW, A
f110: 47 47 53 54 45 50 20 6f 72 20 41 47 47 49 4e 56  GGSTEP or AGGINV
f120: 45 52 53 45 20 2a 2f 0a 20 69 6e 74 20 72 65 67  ERSE */. int reg
f130: 43 6f 75 6e 74 64 6f 77 6e 2c 20 20 20 20 20 20  Countdown,      
f140: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
f150: 69 73 74 65 72 20 66 6f 72 20 4f 50 5f 49 66 50  ister for OP_IfP
f160: 6f 73 20 63 6f 75 6e 74 64 6f 77 6e 20 2a 2f 0a  os countdown */.
f170: 20 69 6e 74 20 6a 75 6d 70 4f 6e 45 6f 66 20 20   int jumpOnEof  
f180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f190: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
f1a0: 66 20 73 74 65 70 70 65 64 20 63 75 72 73 6f 72  f stepped cursor
f1b0: 20 72 65 61 63 68 65 73 20 45 4f 46 20 2a 2f 0a   reaches EOF */.
f1c0: 29 7b 0a 20 20 69 6e 74 20 63 73 72 2c 20 72 65  ){.  int csr, re
f1d0: 67 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  g;.  Parse *pPar
f1e0: 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a  se = p->pParse;.
f1f0: 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20    Window *pMWin 
f200: 3d 20 70 2d 3e 70 4d 57 69 6e 3b 0a 20 20 69 6e  = p->pMWin;.  in
f210: 74 20 72 65 74 20 3d 20 30 3b 0a 20 20 56 64 62  t ret = 0;.  Vdb
f220: 65 20 2a 76 20 3d 20 70 2d 3e 70 56 64 62 65 3b  e *v = p->pVdbe;
f230: 0a 20 20 69 6e 74 20 61 64 64 72 49 66 20 3d 20  .  int addrIf = 
f240: 30 3b 20 0a 20 20 69 6e 74 20 61 64 64 72 43 6f  0; .  int addrCo
f250: 6e 74 69 6e 75 65 20 3d 20 30 3b 0a 20 20 69 6e  ntinue = 0;.  in
f260: 74 20 61 64 64 72 47 6f 74 6f 20 3d 20 30 3b 0a  t addrGoto = 0;.
f270: 20 20 69 6e 74 20 62 50 65 65 72 20 3d 20 28 70    int bPeer = (p
f280: 4d 57 69 6e 2d 3e 65 46 72 6d 54 79 70 65 21 3d  MWin->eFrmType!=
f290: 54 4b 5f 52 4f 57 53 29 3b 0a 0a 20 20 69 6e 74  TK_ROWS);..  int
f2a0: 20 6c 62 6c 44 6f 6e 65 20 3d 20 73 71 6c 69 74   lblDone = sqlit
f2b0: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
f2c0: 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 61  pParse);.  int a
f2d0: 64 64 72 4e 65 78 74 52 61 6e 67 65 20 3d 20 30  ddrNextRange = 0
f2e0: 3b 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20  ;..  /* Special 
f2f0: 63 61 73 65 20 2d 20 57 49 4e 44 4f 57 5f 41 47  case - WINDOW_AG
f300: 47 49 4e 56 45 52 53 45 20 69 73 20 61 6c 77 61  GINVERSE is alwa
f310: 79 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  ys a no-op if th
f320: 65 20 66 72 61 6d 65 0a 20 20 2a 2a 20 73 74 61  e frame.  ** sta
f330: 72 74 73 20 77 69 74 68 20 55 4e 42 4f 55 4e 44  rts with UNBOUND
f340: 45 44 20 50 52 45 43 45 44 49 4e 47 2e 20 2a 2f  ED PRECEDING. */
f350: 0a 20 20 69 66 28 20 6f 70 3d 3d 57 49 4e 44 4f  .  if( op==WINDO
f360: 57 5f 41 47 47 49 4e 56 45 52 53 45 20 26 26 20  W_AGGINVERSE && 
f370: 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
f380: 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20  K_UNBOUNDED ){. 
f390: 20 20 20 61 73 73 65 72 74 28 20 72 65 67 43 6f     assert( regCo
f3a0: 75 6e 74 64 6f 77 6e 3d 3d 30 20 26 26 20 6a 75  untdown==0 && ju
f3b0: 6d 70 4f 6e 45 6f 66 3d 3d 30 20 29 3b 0a 20 20  mpOnEof==0 );.  
f3c0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
f3d0: 0a 20 20 69 66 28 20 72 65 67 43 6f 75 6e 74 64  .  if( regCountd
f3e0: 6f 77 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  own>0 ){.    if(
f3f0: 20 70 4d 57 69 6e 2d 3e 65 46 72 6d 54 79 70 65   pMWin->eFrmType
f400: 3d 3d 54 4b 5f 52 41 4e 47 45 20 29 7b 0a 20 20  ==TK_RANGE ){.  
f410: 20 20 20 20 61 64 64 72 4e 65 78 74 52 61 6e 67      addrNextRang
f420: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  e = sqlite3VdbeC
f430: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
f440: 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d       assert( op=
f450: 3d 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52  =WINDOW_AGGINVER
f460: 53 45 20 7c 7c 20 6f 70 3d 3d 57 49 4e 44 4f 57  SE || op==WINDOW
f470: 5f 41 47 47 53 54 45 50 20 29 3b 0a 20 20 20 20  _AGGSTEP );.    
f480: 20 20 69 66 28 20 6f 70 3d 3d 57 49 4e 44 4f 57    if( op==WINDOW
f490: 5f 41 47 47 49 4e 56 45 52 53 45 20 29 7b 0a 20  _AGGINVERSE ){. 
f4a0: 20 20 20 20 20 20 20 69 66 28 20 70 4d 57 69 6e         if( pMWin
f4b0: 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c  ->eStart==TK_FOL
f4c0: 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 20 20  LOWING ){.      
f4d0: 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 52 61      windowCodeRa
f4e0: 6e 67 65 54 65 73 74 28 0a 20 20 20 20 20 20 20  ngeTest(.       
f4f0: 20 20 20 20 20 20 20 70 2c 20 4f 50 5f 4c 65 2c         p, OP_Le,
f500: 20 70 2d 3e 63 75 72 72 65 6e 74 2e 63 73 72 2c   p->current.csr,
f510: 20 72 65 67 43 6f 75 6e 74 64 6f 77 6e 2c 20 70   regCountdown, p
f520: 2d 3e 73 74 61 72 74 2e 63 73 72 2c 20 6c 62 6c  ->start.csr, lbl
f530: 44 6f 6e 65 0a 20 20 20 20 20 20 20 20 20 20 29  Done.          )
f540: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
f550: 0a 20 20 20 20 20 20 20 20 20 20 77 69 6e 64 6f  .          windo
f560: 77 43 6f 64 65 52 61 6e 67 65 54 65 73 74 28 0a  wCodeRangeTest(.
f570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c                p,
f580: 20 4f 50 5f 47 65 2c 20 70 2d 3e 73 74 61 72 74   OP_Ge, p->start
f590: 2e 63 73 72 2c 20 72 65 67 43 6f 75 6e 74 64 6f  .csr, regCountdo
f5a0: 77 6e 2c 20 70 2d 3e 63 75 72 72 65 6e 74 2e 63  wn, p->current.c
f5b0: 73 72 2c 20 6c 62 6c 44 6f 6e 65 0a 20 20 20 20  sr, lblDone.    
f5c0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
f5d0: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
f5e0: 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f          windowCo
f5f0: 64 65 52 61 6e 67 65 54 65 73 74 28 0a 20 20 20  deRangeTest(.   
f600: 20 20 20 20 20 20 20 20 20 70 2c 20 4f 50 5f 47           p, OP_G
f610: 74 2c 20 70 2d 3e 65 6e 64 2e 63 73 72 2c 20 72  t, p->end.csr, r
f620: 65 67 43 6f 75 6e 74 64 6f 77 6e 2c 20 70 2d 3e  egCountdown, p->
f630: 63 75 72 72 65 6e 74 2e 63 73 72 2c 20 6c 62 6c  current.csr, lbl
f640: 44 6f 6e 65 0a 20 20 20 20 20 20 20 20 29 3b 0a  Done.        );.
f650: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
f660: 65 7b 0a 20 20 20 20 20 20 61 64 64 72 49 66 20  e{.      addrIf 
f670: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
f680: 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op3(v, OP_IfPos,
f690: 20 72 65 67 43 6f 75 6e 74 64 6f 77 6e 2c 20 30   regCountdown, 0
f6a0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65  , 1);.      Vdbe
f6b0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
f6c0: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f 70   }.  }..  if( op
f6d0: 3d 3d 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f  ==WINDOW_RETURN_
f6e0: 52 4f 57 20 26 26 20 70 4d 57 69 6e 2d 3e 72 65  ROW && pMWin->re
f6f0: 67 53 74 61 72 74 52 6f 77 69 64 3d 3d 30 20 29  gStartRowid==0 )
f700: 7b 0a 20 20 20 20 77 69 6e 64 6f 77 41 67 67 46  {.    windowAggF
f710: 69 6e 61 6c 28 70 2c 20 30 29 3b 0a 20 20 7d 0a  inal(p, 0);.  }.
f720: 20 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 20 3d    addrContinue =
f730: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
f740: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 73 77  entAddr(v);.  sw
f750: 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
f760: 63 61 73 65 20 57 49 4e 44 4f 57 5f 52 45 54 55  case WINDOW_RETU
f770: 52 4e 5f 52 4f 57 3a 0a 20 20 20 20 20 20 63 73  RN_ROW:.      cs
f780: 72 20 3d 20 70 2d 3e 63 75 72 72 65 6e 74 2e 63  r = p->current.c
f790: 73 72 3b 0a 20 20 20 20 20 20 72 65 67 20 3d 20  sr;.      reg = 
f7a0: 70 2d 3e 63 75 72 72 65 6e 74 2e 72 65 67 3b 0a  p->current.reg;.
f7b0: 20 20 20 20 20 20 77 69 6e 64 6f 77 52 65 74 75        windowRetu
f7c0: 72 6e 4f 6e 65 52 6f 77 28 70 29 3b 0a 20 20 20  rnOneRow(p);.   
f7d0: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
f7e0: 61 73 65 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e  ase WINDOW_AGGIN
f7f0: 56 45 52 53 45 3a 0a 20 20 20 20 20 20 63 73 72  VERSE:.      csr
f800: 20 3d 20 70 2d 3e 73 74 61 72 74 2e 63 73 72 3b   = p->start.csr;
f810: 0a 20 20 20 20 20 20 72 65 67 20 3d 20 70 2d 3e  .      reg = p->
f820: 73 74 61 72 74 2e 72 65 67 3b 0a 20 20 20 20 20  start.reg;.     
f830: 20 69 66 28 20 70 4d 57 69 6e 2d 3e 72 65 67 53   if( pMWin->regS
f840: 74 61 72 74 52 6f 77 69 64 20 29 7b 0a 20 20 20  tartRowid ){.   
f850: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 57       assert( pMW
f860: 69 6e 2d 3e 72 65 67 45 6e 64 52 6f 77 69 64 20  in->regEndRowid 
f870: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
f880: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
f890: 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 4d 57 69 6e  OP_AddImm, pMWin
f8a0: 2d 3e 72 65 67 53 74 61 72 74 52 6f 77 69 64 2c  ->regStartRowid,
f8b0: 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   1);.      }else
f8c0: 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77  {.        window
f8d0: 41 67 67 53 74 65 70 28 70 50 61 72 73 65 2c 20  AggStep(pParse, 
f8e0: 70 4d 57 69 6e 2c 20 63 73 72 2c 20 31 2c 20 70  pMWin, csr, 1, p
f8f0: 2d 3e 72 65 67 41 72 67 29 3b 0a 20 20 20 20 20  ->regArg);.     
f900: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
f910: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
f920: 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d      assert( op==
f930: 57 49 4e 44 4f 57 5f 41 47 47 53 54 45 50 20 29  WINDOW_AGGSTEP )
f940: 3b 0a 20 20 20 20 20 20 63 73 72 20 3d 20 70 2d  ;.      csr = p-
f950: 3e 65 6e 64 2e 63 73 72 3b 0a 20 20 20 20 20 20  >end.csr;.      
f960: 72 65 67 20 3d 20 70 2d 3e 65 6e 64 2e 72 65 67  reg = p->end.reg
f970: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 57 69  ;.      if( pMWi
f980: 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f 77 69 64  n->regStartRowid
f990: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
f9a0: 72 74 28 20 70 4d 57 69 6e 2d 3e 72 65 67 45 6e  rt( pMWin->regEn
f9b0: 64 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20  dRowid );.      
f9c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f9d0: 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
f9e0: 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 45 6e 64 52  , pMWin->regEndR
f9f0: 6f 77 69 64 2c 20 31 29 3b 0a 20 20 20 20 20 20  owid, 1);.      
fa00: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 77  }else{.        w
fa10: 69 6e 64 6f 77 41 67 67 53 74 65 70 28 70 50 61  indowAggStep(pPa
fa20: 72 73 65 2c 20 70 4d 57 69 6e 2c 20 63 73 72 2c  rse, pMWin, csr,
fa30: 20 30 2c 20 70 2d 3e 72 65 67 41 72 67 29 3b 0a   0, p->regArg);.
fa40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
fa50: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  eak;.  }..  if( 
fa60: 6f 70 3d 3d 70 2d 3e 65 44 65 6c 65 74 65 20 29  op==p->eDelete )
fa70: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
fa80: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65  eAddOp1(v, OP_De
fa90: 6c 65 74 65 2c 20 63 73 72 29 3b 0a 20 20 20 20  lete, csr);.    
faa0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
fab0: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 53 41  eP5(v, OPFLAG_SA
fac0: 56 45 50 4f 53 49 54 49 4f 4e 29 3b 0a 20 20 7d  VEPOSITION);.  }
fad0: 0a 0a 20 20 69 66 28 20 6a 75 6d 70 4f 6e 45 6f  ..  if( jumpOnEo
fae0: 66 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  f ){.    sqlite3
faf0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
fb00: 5f 4e 65 78 74 2c 20 63 73 72 2c 20 73 71 6c 69  _Next, csr, sqli
fb10: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
fb20: 64 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 56 64  dr(v)+2);.    Vd
fb30: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
fb40: 20 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33     ret = sqlite3
fb50: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
fb60: 5f 47 6f 74 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  _Goto);.  }else{
fb70: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
fb80: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
fb90: 74 2c 20 63 73 72 2c 20 73 71 6c 69 74 65 33 56  t, csr, sqlite3V
fba0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
fbb0: 29 2b 31 2b 62 50 65 65 72 29 3b 0a 20 20 20 20  )+1+bPeer);.    
fbc0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
fbd0: 0a 20 20 20 20 69 66 28 20 62 50 65 65 72 20 29  .    if( bPeer )
fbe0: 7b 0a 20 20 20 20 20 20 61 64 64 72 47 6f 74 6f  {.      addrGoto
fbf0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
fc00: 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29  dOp0(v, OP_Goto)
fc10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
fc20: 66 28 20 62 50 65 65 72 20 29 7b 0a 20 20 20 20  f( bPeer ){.    
fc30: 69 6e 74 20 6e 52 65 67 20 3d 20 28 70 4d 57 69  int nReg = (pMWi
fc40: 6e 2d 3e 70 4f 72 64 65 72 42 79 20 3f 20 70 4d  n->pOrderBy ? pM
fc50: 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  Win->pOrderBy->n
fc60: 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 69  Expr : 0);.    i
fc70: 6e 74 20 72 65 67 54 6d 70 20 3d 20 28 6e 52 65  nt regTmp = (nRe
fc80: 67 20 3f 20 73 71 6c 69 74 65 33 47 65 74 54 65  g ? sqlite3GetTe
fc90: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
fca0: 6e 52 65 67 29 20 3a 20 30 29 3b 0a 20 20 20 20  nReg) : 0);.    
fcb0: 77 69 6e 64 6f 77 52 65 61 64 50 65 65 72 56 61  windowReadPeerVa
fcc0: 6c 75 65 73 28 70 2c 20 63 73 72 2c 20 72 65 67  lues(p, csr, reg
fcd0: 54 6d 70 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77  Tmp);.    window
fce0: 49 66 4e 65 77 50 65 65 72 28 70 50 61 72 73 65  IfNewPeer(pParse
fcf0: 2c 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42  , pMWin->pOrderB
fd00: 79 2c 20 72 65 67 54 6d 70 2c 20 72 65 67 2c 20  y, regTmp, reg, 
fd10: 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  addrContinue);. 
fd20: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
fd30: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
fd40: 65 2c 20 72 65 67 54 6d 70 2c 20 6e 52 65 67 29  e, regTmp, nReg)
fd50: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 61 64 64  ;.  }..  if( add
fd60: 72 4e 65 78 74 52 61 6e 67 65 20 29 7b 0a 20 20  rNextRange ){.  
fd70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fd80: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
fd90: 30 2c 20 61 64 64 72 4e 65 78 74 52 61 6e 67 65  0, addrNextRange
fda0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
fdb0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
fdc0: 28 76 2c 20 6c 62 6c 44 6f 6e 65 29 3b 0a 20 20  (v, lblDone);.  
fdd0: 69 66 28 20 61 64 64 72 47 6f 74 6f 20 29 20 73  if( addrGoto ) s
fde0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
fdf0: 72 65 28 76 2c 20 61 64 64 72 47 6f 74 6f 29 3b  re(v, addrGoto);
fe00: 0a 20 20 69 66 28 20 61 64 64 72 49 66 20 29 20  .  if( addrIf ) 
fe10: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
fe20: 65 72 65 28 76 2c 20 61 64 64 72 49 66 29 3b 0a  ere(v, addrIf);.
fe30: 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a    return ret;.}.
fe40: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
fe50: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64 75   and return a du
fe60: 70 6c 69 63 61 74 65 20 6f 66 20 74 68 65 20 57  plicate of the W
fe70: 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 69 6e 64  indow object ind
fe80: 69 63 61 74 65 64 20 62 79 20 74 68 65 0a 2a 2a  icated by the.**
fe90: 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 2e   third argument.
fea0: 20 53 65 74 20 74 68 65 20 57 69 6e 64 6f 77 2e   Set the Window.
feb0: 70 4f 77 6e 65 72 20 66 69 65 6c 64 20 6f 66 20  pOwner field of 
fec0: 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 74  the new object t
fed0: 6f 0a 2a 2a 20 70 4f 77 6e 65 72 2e 0a 2a 2f 0a  o.** pOwner..*/.
fee0: 57 69 6e 64 6f 77 20 2a 73 71 6c 69 74 65 33 57  Window *sqlite3W
fef0: 69 6e 64 6f 77 44 75 70 28 73 71 6c 69 74 65 33  indowDup(sqlite3
ff00: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4f 77 6e   *db, Expr *pOwn
ff10: 65 72 2c 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a  er, Window *p){.
ff20: 20 20 57 69 6e 64 6f 77 20 2a 70 4e 65 77 20 3d    Window *pNew =
ff30: 20 30 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53   0;.  if( ALWAYS
ff40: 28 70 29 20 29 7b 0a 20 20 20 20 70 4e 65 77 20  (p) ){.    pNew 
ff50: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
ff60: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
ff70: 28 57 69 6e 64 6f 77 29 29 3b 0a 20 20 20 20 69  (Window));.    i
ff80: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
ff90: 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 73   pNew->zName = s
ffa0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
ffb0: 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  b, p->zName);.  
ffc0: 20 20 20 20 70 4e 65 77 2d 3e 70 46 69 6c 74 65      pNew->pFilte
ffd0: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
ffe0: 75 70 28 64 62 2c 20 70 2d 3e 70 46 69 6c 74 65  up(db, p->pFilte
fff0: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65  r, 0);.      pNe
10000 77 2d 3e 70 46 75 6e 63 20 3d 20 70 2d 3e 70 46  w->pFunc = p->pF
10010 75 6e 63 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  unc;.      pNew-
10020 3e 70 50 61 72 74 69 74 69 6f 6e 20 3d 20 73 71  >pPartition = sq
10030 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
10040 28 64 62 2c 20 70 2d 3e 70 50 61 72 74 69 74 69  (db, p->pPartiti
10050 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e  on, 0);.      pN
10060 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73  ew->pOrderBy = s
10070 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
10080 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  p(db, p->pOrderB
10090 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65  y, 0);.      pNe
100a0 77 2d 3e 65 46 72 6d 54 79 70 65 20 3d 20 70 2d  w->eFrmType = p-
100b0 3e 65 46 72 6d 54 79 70 65 3b 0a 20 20 20 20 20  >eFrmType;.     
100c0 20 70 4e 65 77 2d 3e 65 45 6e 64 20 3d 20 70 2d   pNew->eEnd = p-
100d0 3e 65 45 6e 64 3b 0a 20 20 20 20 20 20 70 4e 65  >eEnd;.      pNe
100e0 77 2d 3e 65 53 74 61 72 74 20 3d 20 70 2d 3e 65  w->eStart = p->e
100f0 53 74 61 72 74 3b 0a 20 20 20 20 20 20 70 4e 65  Start;.      pNe
10100 77 2d 3e 65 45 78 63 6c 75 64 65 20 3d 20 70 2d  w->eExclude = p-
10110 3e 65 45 78 63 6c 75 64 65 3b 0a 20 20 20 20 20  >eExclude;.     
10120 20 70 4e 65 77 2d 3e 70 53 74 61 72 74 20 3d 20   pNew->pStart = 
10130 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
10140 62 2c 20 70 2d 3e 70 53 74 61 72 74 2c 20 30 29  b, p->pStart, 0)
10150 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 45  ;.      pNew->pE
10160 6e 64 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  nd = sqlite3Expr
10170 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 6e 64 2c  Dup(db, p->pEnd,
10180 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d   0);.      pNew-
10190 3e 70 4f 77 6e 65 72 20 3d 20 70 4f 77 6e 65 72  >pOwner = pOwner
101a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
101b0 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
101c0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 63 6f 70  .** Return a cop
101d0 79 20 6f 66 20 74 68 65 20 6c 69 6e 6b 65 64 20  y of the linked 
101e0 6c 69 73 74 20 6f 66 20 57 69 6e 64 6f 77 20 6f  list of Window o
101f0 62 6a 65 63 74 73 20 70 61 73 73 65 64 20 61 73  bjects passed as
10200 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 61   the.** second a
10210 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 57 69 6e 64  rgument..*/.Wind
10220 6f 77 20 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f  ow *sqlite3Windo
10230 77 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33  wListDup(sqlite3
10240 20 2a 64 62 2c 20 57 69 6e 64 6f 77 20 2a 70 29   *db, Window *p)
10250 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e  {.  Window *pWin
10260 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 52 65 74  ;.  Window *pRet
10270 20 3d 20 30 3b 0a 20 20 57 69 6e 64 6f 77 20 2a   = 0;.  Window *
10280 2a 70 70 20 3d 20 26 70 52 65 74 3b 0a 0a 20 20  *pp = &pRet;..  
10290 66 6f 72 28 70 57 69 6e 3d 70 3b 20 70 57 69 6e  for(pWin=p; pWin
102a0 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65  ; pWin=pWin->pNe
102b0 78 74 57 69 6e 29 7b 0a 20 20 20 20 2a 70 70 20  xtWin){.    *pp 
102c0 3d 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 44  = sqlite3WindowD
102d0 75 70 28 64 62 2c 20 30 2c 20 70 57 69 6e 29 3b  up(db, 0, pWin);
102e0 0a 20 20 20 20 69 66 28 20 2a 70 70 3d 3d 30 20  .    if( *pp==0 
102f0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 70 20  ) break;.    pp 
10300 3d 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74  = &((*pp)->pNext
10310 57 69 6e 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Win);.  }..  ret
10320 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn pRet;.}../*.
10330 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
10340 66 20 69 74 20 63 61 6e 20 62 65 20 64 65 74 65  f it can be dete
10350 72 6d 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c  rmined at compil
10360 65 20 74 69 6d 65 20 74 68 61 74 20 65 78 70 72  e time that expr
10370 65 73 73 69 6f 6e 20 0a 2a 2a 20 70 45 78 70 72  ession .** pExpr
10380 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 61 20   evaluates to a 
10390 76 61 6c 75 65 20 74 68 61 74 2c 20 77 68 65 6e  value that, when
103a0 20 63 61 73 74 20 74 6f 20 61 6e 20 69 6e 74 65   cast to an inte
103b0 67 65 72 2c 20 69 73 20 67 72 65 61 74 65 72 20  ger, is greater 
103c0 0a 2a 2a 20 74 68 61 6e 20 7a 65 72 6f 2e 20 46  .** than zero. F
103d0 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  alse otherwise..
103e0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20  **.** If an OOM 
103f0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
10400 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73  is function sets
10410 20 74 68 65 20 50 61 72 73 65 2e 64 62 2e 6d 61   the Parse.db.ma
10420 6c 6c 6f 63 46 61 69 6c 65 64 20 0a 2a 2a 20 66  llocFailed .** f
10430 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e 73 20  lag and returns 
10440 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
10450 69 6e 74 20 77 69 6e 64 6f 77 45 78 70 72 47 74  int windowExprGt
10460 5a 65 72 6f 28 50 61 72 73 65 20 2a 70 50 61 72  Zero(Parse *pPar
10470 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
10480 7b 0a 20 20 69 6e 74 20 72 65 74 20 3d 20 30 3b  {.  int ret = 0;
10490 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
104a0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73   pParse->db;.  s
104b0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
104c0 61 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  al = 0;.  sqlite
104d0 33 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 64  3ValueFromExpr(d
104e0 62 2c 20 70 45 78 70 72 2c 20 64 62 2d 3e 65 6e  b, pExpr, db->en
104f0 63 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  c, SQLITE_AFF_NU
10500 4d 45 52 49 43 2c 20 26 70 56 61 6c 29 3b 0a 20  MERIC, &pVal);. 
10510 20 69 66 28 20 70 56 61 6c 20 26 26 20 73 71 6c   if( pVal && sql
10520 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 70  ite3_value_int(p
10530 56 61 6c 29 3e 30 20 29 7b 0a 20 20 20 20 72 65  Val)>0 ){.    re
10540 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c  t = 1;.  }.  sql
10550 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56  ite3ValueFree(pV
10560 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  al);.  return re
10570 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69  t;.}../*.** sqli
10580 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
10590 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
105a0 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20   called for the 
105b0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
105c0 20 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74   .** passed as t
105d0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
105e0 6e 74 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  nt when this fun
105f0 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64  ction is invoked
10600 2e 20 49 74 20 67 65 6e 65 72 61 74 65 73 0a 2a  . It generates.*
10610 2a 20 63 6f 64 65 20 74 6f 20 70 6f 70 75 6c 61  * code to popula
10620 74 65 20 74 68 65 20 57 69 6e 64 6f 77 2e 72 65  te the Window.re
10630 67 52 65 73 75 6c 74 20 72 65 67 69 73 74 65 72  gResult register
10640 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77   for each window
10650 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 6e   function .** an
10660 64 20 69 6e 76 6f 6b 65 20 74 68 65 20 73 75 62  d invoke the sub
10670 2d 72 6f 75 74 69 6e 65 20 61 74 20 69 6e 73 74  -routine at inst
10680 72 75 63 74 69 6f 6e 20 61 64 64 72 47 6f 73 75  ruction addrGosu
10690 62 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  b once for each 
106a0 72 6f 77 2e 0a 2a 2a 20 73 71 6c 69 74 65 33 57  row..** sqlite3W
106b0 68 65 72 65 45 6e 64 28 29 20 69 73 20 61 6c 77  hereEnd() is alw
106c0 61 79 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72  ays called befor
106d0 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 0a 2a 2a  e returning. .**
106e0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
106f0 6e 20 68 61 6e 64 6c 65 73 20 73 65 76 65 72 61  n handles severa
10700 6c 20 64 69 66 66 65 72 65 6e 74 20 74 79 70 65  l different type
10710 73 20 6f 66 20 77 69 6e 64 6f 77 20 66 72 61 6d  s of window fram
10720 65 73 2c 20 77 68 69 63 68 0a 2a 2a 20 72 65 71  es, which.** req
10730 75 69 72 65 20 73 6c 69 67 68 74 6c 79 20 64 69  uire slightly di
10740 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 69  fferent processi
10750 6e 67 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ng. The followin
10760 67 20 70 73 65 75 64 6f 20 63 6f 64 65 20 69 73  g pseudo code is
10770 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69 6d 70 6c  .** used to impl
10780 65 6d 65 6e 74 20 77 69 6e 64 6f 77 20 66 72 61  ement window fra
10790 6d 65 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  mes of the form:
107a0 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57 53 20 42 45  .**.**   ROWS BE
107b0 54 57 45 45 4e 20 3c 65 78 70 72 31 3e 20 50 52  TWEEN <expr1> PR
107c0 45 43 45 44 49 4e 47 20 41 4e 44 20 3c 65 78 70  ECEDING AND <exp
107d0 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a  r2> FOLLOWING.**
107e0 0a 2a 2a 20 4f 74 68 65 72 20 77 69 6e 64 6f 77  .** Other window
107f0 20 66 72 61 6d 65 20 74 79 70 65 73 20 75 73 65   frame types use
10800 20 76 61 72 69 61 6e 74 73 20 6f 66 20 74 68 65   variants of the
10810 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
10820 2a 20 20 20 20 20 2e 2e 2e 20 6c 6f 6f 70 20 73  *     ... loop s
10830 74 61 72 74 65 64 20 62 79 20 73 71 6c 69 74 65  tarted by sqlite
10840 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2e 2e  3WhereBegin() ..
10850 2e 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 6e  ..**       if( n
10860 65 77 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a  ew partition ){.
10870 2a 2a 20 20 20 20 20 20 20 20 20 47 6f 73 75 62  **         Gosub
10880 20 66 6c 75 73 68 0a 2a 2a 20 20 20 20 20 20 20   flush.**       
10890 7d 0a 2a 2a 20 20 20 20 20 20 20 49 6e 73 65 72  }.**       Inser
108a0 74 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20 65  t new row into e
108b0 70 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20  ph table..**    
108c0 20 20 20 0a 2a 2a 20 20 20 20 20 20 20 69 66 28     .**       if(
108d0 20 66 69 72 73 74 20 72 6f 77 20 6f 66 20 70 61   first row of pa
108e0 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20  rtition ){.**   
108f0 20 20 20 20 20 20 2f 2f 20 52 65 77 69 6e 64 20        // Rewind 
10900 74 68 72 65 65 20 63 75 72 73 6f 72 73 2c 20 61  three cursors, a
10910 6c 6c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 65  ll open on the e
10920 70 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20  ph table..**    
10930 20 20 20 20 20 52 65 77 69 6e 64 28 63 73 72 45       Rewind(csrE
10940 6e 64 29 3b 0a 2a 2a 20 20 20 20 20 20 20 20 20  nd);.**         
10950 52 65 77 69 6e 64 28 63 73 72 53 74 61 72 74 29  Rewind(csrStart)
10960 3b 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 65 77  ;.**         Rew
10970 69 6e 64 28 63 73 72 43 75 72 72 65 6e 74 29 3b  ind(csrCurrent);
10980 0a 2a 2a 20 20 20 20 20 20 20 0a 2a 2a 20 20 20  .**       .**   
10990 20 20 20 20 20 20 72 65 67 45 6e 64 20 3d 20 3c        regEnd = <
109a0 65 78 70 72 32 3e 20 20 20 20 20 20 20 20 20 20  expr2>          
109b0 2f 2f 20 46 4f 4c 4c 4f 57 49 4e 47 20 65 78 70  // FOLLOWING exp
109c0 72 65 73 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 20  ression.**      
109d0 20 20 20 72 65 67 53 74 61 72 74 20 3d 20 3c 65     regStart = <e
109e0 78 70 72 31 3e 20 20 20 20 20 20 20 20 2f 2f 20  xpr1>        // 
109f0 50 52 45 43 45 44 49 4e 47 20 65 78 70 72 65 73  PRECEDING expres
10a00 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 7d 65  sion.**       }e
10a10 6c 73 65 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  lse{.**         
10a20 2f 2f 20 46 69 72 73 74 20 74 69 6d 65 20 74 68  // First time th
10a30 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b  is branch is tak
10a40 65 6e 2c 20 74 68 65 20 65 70 68 20 74 61 62 6c  en, the eph tabl
10a50 65 20 63 6f 6e 74 61 69 6e 73 20 74 77 6f 20 0a  e contains two .
10a60 2a 2a 20 20 20 20 20 20 20 20 20 2f 2f 20 72 6f  **         // ro
10a70 77 73 2e 20 54 68 65 20 66 69 72 73 74 20 72 6f  ws. The first ro
10a80 77 20 69 6e 20 74 68 65 20 70 61 72 74 69 74 69  w in the partiti
10a90 6f 6e 2c 20 77 68 69 63 68 20 61 6c 6c 20 74 68  on, which all th
10aa0 72 65 65 20 63 75 72 73 6f 72 73 0a 2a 2a 20 20  ree cursors.**  
10ab0 20 20 20 20 20 20 20 2f 2f 20 63 75 72 72 65 6e         // curren
10ac0 74 6c 79 20 70 6f 69 6e 74 20 74 6f 2c 20 61 6e  tly point to, an
10ad0 64 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  d the following 
10ae0 72 6f 77 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  row..**         
10af0 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 20  AGGSTEP.**      
10b00 20 20 20 69 66 28 20 28 72 65 67 45 6e 64 2d 2d     if( (regEnd--
10b10 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20  )<=0 ){.**      
10b20 20 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a       RETURN_ROW.
10b30 2a 2a 20 20 20 20 20 20 20 20 20 20 20 69 66 28  **           if(
10b40 20 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30   (regStart--)<=0
10b50 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   ){.**          
10b60 20 20 20 41 47 47 49 4e 56 45 52 53 45 0a 2a 2a     AGGINVERSE.**
10b70 20 20 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20             }.** 
10b80 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20          }.**    
10b90 20 20 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a     }.**     }.**
10ba0 20 20 20 20 20 66 6c 75 73 68 3a 0a 2a 2a 20 20       flush:.**  
10bb0 20 20 20 20 20 41 47 47 53 54 45 50 0a 2a 2a 20       AGGSTEP.** 
10bc0 20 20 20 20 20 20 77 68 69 6c 65 28 20 31 20 29        while( 1 )
10bd0 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 45 54  {.**         RET
10be0 55 52 4e 20 52 4f 57 0a 2a 2a 20 20 20 20 20 20  URN ROW.**      
10bf0 20 20 20 69 66 28 20 63 73 72 43 75 72 72 65 6e     if( csrCurren
10c00 74 20 69 73 20 45 4f 46 20 29 20 62 72 65 61 6b  t is EOF ) break
10c10 3b 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 66 28  ;.**         if(
10c20 20 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30   (regStart--)<=0
10c30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   ){.**          
10c40 20 41 67 67 49 6e 76 65 72 73 65 28 63 73 72 53   AggInverse(csrS
10c50 74 61 72 74 29 0a 2a 2a 20 20 20 20 20 20 20 20  tart).**        
10c60 20 20 20 4e 65 78 74 28 63 73 72 53 74 61 72 74     Next(csrStart
10c70 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a  ).**         }.*
10c80 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20  *       }.**.** 
10c90 54 68 65 20 70 73 65 75 64 6f 2d 63 6f 64 65 20  The pseudo-code 
10ca0 61 62 6f 76 65 20 75 73 65 73 20 74 68 65 20 66  above uses the f
10cb0 6f 6c 6c 6f 77 69 6e 67 20 73 68 6f 72 74 68 61  ollowing shortha
10cc0 6e 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 41 47 47 53  nd:.**.**   AGGS
10cd0 54 45 50 3a 20 20 20 20 69 6e 76 6f 6b 65 20 74  TEP:    invoke t
10ce0 68 65 20 61 67 67 72 65 67 61 74 65 20 78 53 74  he aggregate xSt
10cf0 65 70 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f  ep() function fo
10d00 72 20 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75  r each window fu
10d10 6e 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20  nction.**       
10d20 20 20 20 20 20 20 20 20 77 69 74 68 20 61 72 67          with arg
10d30 75 6d 65 6e 74 73 20 72 65 61 64 20 66 72 6f 6d  uments read from
10d40 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
10d50 20 6f 66 20 63 75 72 73 6f 72 20 63 73 72 45 6e   of cursor csrEn
10d60 64 2c 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20  d, then.**      
10d70 20 20 20 20 20 20 20 20 20 73 74 65 70 20 63 75           step cu
10d80 72 73 6f 72 20 63 73 72 45 6e 64 20 66 6f 72 77  rsor csrEnd forw
10d90 61 72 64 20 6f 6e 65 20 72 6f 77 20 28 69 2e 65  ard one row (i.e
10da0 2e 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  . sqlite3BtreeNe
10db0 78 74 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 52  xt())..**.**   R
10dc0 45 54 55 52 4e 5f 52 4f 57 3a 20 72 65 74 75 72  ETURN_ROW: retur
10dd0 6e 20 61 20 72 6f 77 20 74 6f 20 74 68 65 20 63  n a row to the c
10de0 61 6c 6c 65 72 20 62 61 73 65 64 20 6f 6e 20 74  aller based on t
10df0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
10e00 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  he .**          
10e10 20 20 20 20 20 63 75 72 72 65 6e 74 20 72 6f 77       current row
10e20 20 6f 66 20 63 73 72 43 75 72 72 65 6e 74 20 61   of csrCurrent a
10e30 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  nd the current s
10e40 74 61 74 65 20 6f 66 20 61 6c 6c 20 0a 2a 2a 20  tate of all .** 
10e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 67                ag
10e60 67 72 65 67 61 74 65 73 2e 20 54 68 65 6e 20 73  gregates. Then s
10e70 74 65 70 20 63 75 72 73 6f 72 20 63 73 72 43 75  tep cursor csrCu
10e80 72 72 65 6e 74 20 66 6f 72 77 61 72 64 20 6f 6e  rrent forward on
10e90 65 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 41  e row..**.**   A
10ea0 47 47 49 4e 56 45 52 53 45 3a 20 69 6e 76 6f 6b  GGINVERSE: invok
10eb0 65 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  e the aggregate 
10ec0 78 49 6e 76 65 72 73 65 28 29 20 66 75 6e 63 74  xInverse() funct
10ed0 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 77 69 6e  ion for each win
10ee0 64 6f 77 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  dow .**         
10ef0 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 73 20        functions 
10f00 77 69 74 68 20 61 72 67 75 6d 65 6e 74 73 20 72  with arguments r
10f10 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72  ead from the cur
10f20 72 65 6e 74 20 72 6f 77 20 6f 66 20 63 75 72 73  rent row of curs
10f30 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  or.**           
10f40 20 20 20 20 63 73 72 53 74 61 72 74 2e 20 54 68      csrStart. Th
10f50 65 6e 20 73 74 65 70 20 63 73 72 53 74 61 72 74  en step csrStart
10f60 20 66 6f 72 77 61 72 64 20 6f 6e 65 20 72 6f 77   forward one row
10f70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72  ..**.** There ar
10f80 65 20 74 77 6f 20 6f 74 68 65 72 20 52 4f 57 53  e two other ROWS
10f90 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 73 20 74   window frames t
10fa0 68 61 74 20 61 72 65 20 68 61 6e 64 6c 65 64 20  hat are handled 
10fb0 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 2a 2a  significantly.**
10fc0 20 64 69 66 66 65 72 65 6e 74 6c 79 20 66 72 6f   differently fro
10fd0 6d 20 74 68 65 20 61 62 6f 76 65 20 2d 20 22 42  m the above - "B
10fe0 45 54 57 45 45 4e 20 3c 65 78 70 72 3e 20 50 52  ETWEEN <expr> PR
10ff0 45 43 45 44 49 4e 47 20 41 4e 44 20 3c 65 78 70  ECEDING AND <exp
11000 72 3e 20 50 52 45 43 45 44 49 4e 47 22 0a 2a 2a  r> PRECEDING".**
11010 20 61 6e 64 20 22 42 45 54 57 45 45 4e 20 3c 65   and "BETWEEN <e
11020 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 41  xpr> FOLLOWING A
11030 4e 44 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57  ND <expr> FOLLOW
11040 49 4e 47 22 2e 20 54 68 65 73 65 20 61 72 65 20  ING". These are 
11050 73 70 65 63 69 61 6c 20 0a 2a 2a 20 63 61 73 65  special .** case
11060 73 20 62 65 63 61 75 73 65 20 74 68 65 79 20 63  s because they c
11070 68 61 6e 67 65 20 74 68 65 20 6f 72 64 65 72 20  hange the order 
11080 69 6e 20 77 68 69 63 68 20 74 68 65 20 74 68 72  in which the thr
11090 65 65 20 63 75 72 73 6f 72 73 20 28 63 73 72 53  ee cursors (csrS
110a0 74 61 72 74 2c 0a 2a 2a 20 63 73 72 43 75 72 72  tart,.** csrCurr
110b0 65 6e 74 20 61 6e 64 20 63 73 72 45 6e 64 29 20  ent and csrEnd) 
110c0 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
110d0 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61  the ephemeral ta
110e0 62 6c 65 2e 20 43 61 73 65 73 20 74 68 61 74 0a  ble. Cases that.
110f0 2a 2a 20 75 73 65 20 55 4e 42 4f 55 4e 44 45 44  ** use UNBOUNDED
11100 20 6f 72 20 43 55 52 52 45 4e 54 20 52 4f 57 20   or CURRENT ROW 
11110 61 72 65 20 6d 75 63 68 20 73 69 6d 70 6c 65 72  are much simpler
11120 20 76 61 72 69 61 74 69 6f 6e 73 20 6f 6e 20 6f   variations on o
11130 6e 65 20 6f 66 20 74 68 65 73 65 0a 2a 2a 20 74  ne of these.** t
11140 68 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 52 4f  hree..**.**   RO
11150 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72  WS BETWEEN <expr
11160 31 3e 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44  1> PRECEDING AND
11170 20 3c 65 78 70 72 32 3e 20 50 52 45 43 45 44 49   <expr2> PRECEDI
11180 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e  NG.**.**     ...
11190 20 6c 6f 6f 70 20 73 74 61 72 74 65 64 20 62 79   loop started by
111a0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
111b0 69 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20  in() ....**     
111c0 20 20 69 66 28 20 6e 65 77 20 70 61 72 74 69 74    if( new partit
111d0 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  ion ){.**       
111e0 20 20 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a    Gosub flush.**
111f0 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
11200 20 20 49 6e 73 65 72 74 20 6e 65 77 20 72 6f 77    Insert new row
11210 20 69 6e 74 6f 20 65 70 68 20 74 61 62 6c 65 2e   into eph table.
11220 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 66 69  .**       if( fi
11230 72 73 74 20 72 6f 77 20 6f 66 20 70 61 72 74 69  rst row of parti
11240 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20  tion ){.**      
11250 20 20 20 52 65 77 69 6e 64 28 63 73 72 45 6e 64     Rewind(csrEnd
11260 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72 53 74  ) ; Rewind(csrSt
11270 61 72 74 29 20 3b 20 52 65 77 69 6e 64 28 63 73  art) ; Rewind(cs
11280 72 43 75 72 72 65 6e 74 29 0a 2a 2a 20 20 20 20  rCurrent).**    
11290 20 20 20 20 20 72 65 67 45 6e 64 20 3d 20 3c 65       regEnd = <e
112a0 78 70 72 32 3e 0a 2a 2a 20 20 20 20 20 20 20 20  xpr2>.**        
112b0 20 72 65 67 53 74 61 72 74 20 3d 20 3c 65 78 70   regStart = <exp
112c0 72 31 3e 0a 2a 2a 20 20 20 20 20 20 20 7d 65 6c  r1>.**       }el
112d0 73 65 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 69  se{.**         i
112e0 66 28 20 28 72 65 67 45 6e 64 2d 2d 29 3c 3d 30  f( (regEnd--)<=0
112f0 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   ){.**          
11300 20 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20 20   AGGSTEP.**     
11310 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20      }.**        
11320 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20   RETURN_ROW.**  
11330 20 20 20 20 20 20 20 69 66 28 20 28 72 65 67 53         if( (regS
11340 74 61 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a  tart--)<=0 ){.**
11350 20 20 20 20 20 20 20 20 20 20 20 41 47 47 49 4e             AGGIN
11360 56 45 52 53 45 0a 2a 2a 20 20 20 20 20 20 20 20  VERSE.**        
11370 20 7d 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a   }.**       }.**
11380 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 66 6c       }.**     fl
11390 75 73 68 3a 0a 2a 2a 20 20 20 20 20 20 20 69 66  ush:.**       if
113a0 28 20 28 72 65 67 45 6e 64 2d 2d 29 3c 3d 30 20  ( (regEnd--)<=0 
113b0 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 47  ){.**         AG
113c0 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 7d  GSTEP.**       }
113d0 0a 2a 2a 20 20 20 20 20 20 20 52 45 54 55 52 4e  .**       RETURN
113e0 5f 52 4f 57 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20  _ROW.**.**.**   
113f0 52 4f 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78  ROWS BETWEEN <ex
11400 70 72 31 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 41  pr1> FOLLOWING A
11410 4e 44 20 3c 65 78 70 72 32 3e 20 46 4f 4c 4c 4f  ND <expr2> FOLLO
11420 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e  WING.**.**     .
11430 2e 2e 20 6c 6f 6f 70 20 73 74 61 72 74 65 64 20  .. loop started 
11440 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  by sqlite3WhereB
11450 65 67 69 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20  egin() ....**   
11460 20 20 69 66 28 20 6e 65 77 20 70 61 72 74 69 74    if( new partit
11470 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  ion ){.**       
11480 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20  Gosub flush.**  
11490 20 20 20 7d 0a 2a 2a 20 20 20 20 20 49 6e 73 65     }.**     Inse
114a0 72 74 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20  rt new row into 
114b0 65 70 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20  eph table..**   
114c0 20 20 69 66 28 20 66 69 72 73 74 20 72 6f 77 20    if( first row 
114d0 6f 66 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a  of partition ){.
114e0 2a 2a 20 20 20 20 20 20 20 52 65 77 69 6e 64 28  **       Rewind(
114f0 63 73 72 45 6e 64 29 20 3b 20 52 65 77 69 6e 64  csrEnd) ; Rewind
11500 28 63 73 72 53 74 61 72 74 29 20 3b 20 52 65 77  (csrStart) ; Rew
11510 69 6e 64 28 63 73 72 43 75 72 72 65 6e 74 29 0a  ind(csrCurrent).
11520 2a 2a 20 20 20 20 20 20 20 72 65 67 45 6e 64 20  **       regEnd 
11530 3d 20 3c 65 78 70 72 32 3e 0a 2a 2a 20 20 20 20  = <expr2>.**    
11540 20 20 20 72 65 67 53 74 61 72 74 20 3d 20 72 65     regStart = re
11550 67 45 6e 64 20 2d 20 3c 65 78 70 72 31 3e 0a 2a  gEnd - <expr1>.*
11560 2a 20 20 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20  *     }else{.** 
11570 20 20 20 20 20 20 41 47 47 53 54 45 50 0a 2a 2a        AGGSTEP.**
11580 20 20 20 20 20 20 20 69 66 28 20 28 72 65 67 45         if( (regE
11590 6e 64 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20  nd--)<=0 ){.**  
115a0 20 20 20 20 20 20 20 52 45 54 55 52 4e 5f 52 4f         RETURN_RO
115b0 57 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20  W.**       }.** 
115c0 20 20 20 20 20 20 69 66 28 20 28 72 65 67 53 74        if( (regSt
115d0 61 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20  art--)<=0 ){.** 
115e0 20 20 20 20 20 20 20 20 41 47 47 49 4e 56 45 52          AGGINVER
115f0 53 45 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a  SE.**       }.**
11600 20 20 20 20 20 7d 0a 2a 2a 20 20 20 7d 0a 2a 2a       }.**   }.**
11610 20 20 20 66 6c 75 73 68 3a 0a 2a 2a 20 20 20 20     flush:.**    
11620 20 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20 20   AGGSTEP.**     
11630 77 68 69 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20  while( 1 ){.**  
11640 20 20 20 20 20 69 66 28 20 28 72 65 67 45 6e 64       if( (regEnd
11650 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20  --)<=0 ){.**    
11660 20 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a       RETURN_ROW.
11670 2a 2a 20 20 20 20 20 20 20 20 20 69 66 28 20 65  **         if( e
11680 6f 66 20 29 20 62 72 65 61 6b 3b 0a 2a 2a 20 20  of ) break;.**  
11690 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20       }.**       
116a0 69 66 28 20 28 72 65 67 53 74 61 72 74 2d 2d 29  if( (regStart--)
116b0 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  <=0 ){.**       
116c0 20 20 41 47 47 49 4e 56 45 52 53 45 0a 2a 2a 20    AGGINVERSE.** 
116d0 20 20 20 20 20 20 20 20 69 66 28 20 65 6f 66 20          if( eof 
116e0 29 20 62 72 65 61 6b 0a 2a 2a 20 20 20 20 20 20  ) break.**      
116f0 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20   }.**     }.**  
11700 20 20 20 77 68 69 6c 65 28 20 21 65 6f 66 20 63     while( !eof c
11710 73 72 43 75 72 72 65 6e 74 20 29 7b 0a 2a 2a 20  srCurrent ){.** 
11720 20 20 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57        RETURN_ROW
11730 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20  .**     }.**.** 
11740 46 6f 72 20 74 68 65 20 6d 6f 73 74 20 70 61 72  For the most par
11750 74 2c 20 74 68 65 20 70 61 74 74 65 72 6e 73 20  t, the patterns 
11760 61 62 6f 76 65 20 61 72 65 20 61 64 61 70 74 65  above are adapte
11770 64 20 74 6f 20 73 75 70 70 6f 72 74 20 55 4e 42  d to support UNB
11780 4f 55 4e 44 45 44 20 62 79 0a 2a 2a 20 61 73 73  OUNDED by.** ass
11790 75 6d 69 6e 67 20 74 68 61 74 20 69 74 20 69 73  uming that it is
117a0 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 22   equivalent to "
117b0 69 6e 66 69 6e 69 74 79 20 50 52 45 43 45 44 49  infinity PRECEDI
117c0 4e 47 2f 46 4f 4c 4c 4f 57 49 4e 47 22 20 61 6e  NG/FOLLOWING" an
117d0 64 0a 2a 2a 20 43 55 52 52 45 4e 54 20 52 4f 57  d.** CURRENT ROW
117e0 20 62 79 20 61 73 73 75 6d 69 6e 67 20 74 68 61   by assuming tha
117f0 74 20 69 74 20 69 73 20 65 71 75 69 76 69 6c 65  t it is equivile
11800 6e 74 20 74 6f 20 22 30 20 50 52 45 43 45 44 49  nt to "0 PRECEDI
11810 4e 47 2f 46 4f 4c 4c 4f 57 49 4e 47 22 2e 0a 2a  NG/FOLLOWING"..*
11820 2a 20 54 68 69 73 20 69 73 20 6f 70 74 69 6d 69  * This is optimi
11830 7a 65 64 20 6f 66 20 63 6f 75 72 73 65 20 2d 20  zed of course - 
11840 62 72 61 6e 63 68 65 73 20 74 68 61 74 20 77 69  branches that wi
11850 6c 6c 20 6e 65 76 65 72 20 62 65 20 74 61 6b 65  ll never be take
11860 6e 20 61 6e 64 0a 2a 2a 20 63 6f 6e 64 69 74 69  n and.** conditi
11870 6f 6e 73 20 74 68 61 74 20 61 72 65 20 61 6c 77  ons that are alw
11880 61 79 73 20 74 72 75 65 20 61 72 65 20 6f 6d 69  ays true are omi
11890 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 56 4d  tted from the VM
118a0 20 63 6f 64 65 2e 20 54 68 65 20 6f 6e 6c 79 0a   code. The only.
118b0 2a 2a 20 65 78 63 65 70 74 69 6f 6e 61 6c 20 63  ** exceptional c
118c0 61 73 65 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ase is:.**.**   
118d0 52 4f 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78  ROWS BETWEEN <ex
118e0 70 72 31 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 41  pr1> FOLLOWING A
118f0 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c  ND UNBOUNDED FOL
11900 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20  LOWING.**.**    
11910 20 2e 2e 2e 20 6c 6f 6f 70 20 73 74 61 72 74 65   ... loop starte
11920 64 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72  d by sqlite3Wher
11930 65 42 65 67 69 6e 28 29 20 2e 2e 2e 0a 2a 2a 20  eBegin() ....** 
11940 20 20 20 20 69 66 28 20 6e 65 77 20 70 61 72 74      if( new part
11950 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20  ition ){.**     
11960 20 20 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a    Gosub flush.**
11970 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 49 6e       }.**     In
11980 73 65 72 74 20 6e 65 77 20 72 6f 77 20 69 6e 74  sert new row int
11990 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a 2a 2a 20  o eph table..** 
119a0 20 20 20 20 69 66 28 20 66 69 72 73 74 20 72 6f      if( first ro
119b0 77 20 6f 66 20 70 61 72 74 69 74 69 6f 6e 20 29  w of partition )
119c0 7b 0a 2a 2a 20 20 20 20 20 20 20 52 65 77 69 6e  {.**       Rewin
119d0 64 28 63 73 72 45 6e 64 29 20 3b 20 52 65 77 69  d(csrEnd) ; Rewi
119e0 6e 64 28 63 73 72 53 74 61 72 74 29 20 3b 20 52  nd(csrStart) ; R
119f0 65 77 69 6e 64 28 63 73 72 43 75 72 72 65 6e 74  ewind(csrCurrent
11a00 29 0a 2a 2a 20 20 20 20 20 20 20 72 65 67 53 74  ).**       regSt
11a10 61 72 74 20 3d 20 3c 65 78 70 72 31 3e 0a 2a 2a  art = <expr1>.**
11a20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20       }else{.**  
11a30 20 20 20 20 20 41 47 47 53 54 45 50 0a 2a 2a 20       AGGSTEP.** 
11a40 20 20 20 20 7d 0a 2a 2a 20 20 20 7d 0a 2a 2a 20      }.**   }.** 
11a50 20 20 66 6c 75 73 68 3a 0a 2a 2a 20 20 20 20 20    flush:.**     
11a60 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 77  AGGSTEP.**     w
11a70 68 69 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20  hile( 1 ){.**   
11a80 20 20 20 20 69 66 28 20 28 72 65 67 53 74 61 72      if( (regStar
11a90 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20  t--)<=0 ){.**   
11aa0 20 20 20 20 20 20 41 47 47 49 4e 56 45 52 53 45        AGGINVERSE
11ab0 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 66 28 20  .**         if( 
11ac0 65 6f 66 20 29 20 62 72 65 61 6b 0a 2a 2a 20 20  eof ) break.**  
11ad0 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20       }.**       
11ae0 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20  RETURN_ROW.**   
11af0 20 20 7d 0a 2a 2a 20 20 20 20 20 77 68 69 6c 65    }.**     while
11b00 28 20 21 65 6f 66 20 63 73 72 43 75 72 72 65 6e  ( !eof csrCurren
11b10 74 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 52 45  t ){.**       RE
11b20 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20  TURN_ROW.**     
11b30 7d 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 71  }.**.** Also req
11b40 75 69 72 69 6e 67 20 73 70 65 63 69 61 6c 20 68  uiring special h
11b50 61 6e 64 6c 69 6e 67 20 61 72 65 20 74 68 65 20  andling are the 
11b60 63 61 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 52  cases:.**.**   R
11b70 4f 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70  OWS BETWEEN <exp
11b80 72 31 3e 20 50 52 45 43 45 44 49 4e 47 20 41 4e  r1> PRECEDING AN
11b90 44 20 3c 65 78 70 72 32 3e 20 50 52 45 43 45 44  D <expr2> PRECED
11ba0 49 4e 47 0a 2a 2a 20 20 20 52 4f 57 53 20 42 45  ING.**   ROWS BE
11bb0 54 57 45 45 4e 20 3c 65 78 70 72 31 3e 20 46 4f  TWEEN <expr1> FO
11bc0 4c 4c 4f 57 49 4e 47 20 41 4e 44 20 3c 65 78 70  LLOWING AND <exp
11bd0 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a  r2> FOLLOWING.**
11be0 0a 2a 2a 20 77 68 65 6e 20 28 65 78 70 72 31 20  .** when (expr1 
11bf0 3c 20 65 78 70 72 32 29 2e 20 54 68 69 73 20 69  < expr2). This i
11c00 73 20 64 65 74 65 63 74 65 64 20 61 74 20 72 75  s detected at ru
11c10 6e 74 69 6d 65 2c 20 6e 6f 74 20 62 79 20 74 68  ntime, not by th
11c20 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20  is function..** 
11c30 54 6f 20 68 61 6e 64 6c 65 20 74 68 69 73 20 63  To handle this c
11c40 61 73 65 2c 20 74 68 65 20 70 73 65 75 64 6f 2d  ase, the pseudo-
11c50 63 6f 64 65 20 70 72 6f 67 72 61 6d 73 20 64 65  code programs de
11c60 70 69 63 74 65 64 20 61 62 6f 76 65 20 61 72 65  picted above are
11c70 20 6d 6f 64 69 66 69 65 64 0a 2a 2a 20 73 6c 69   modified.** sli
11c80 67 68 74 6c 79 20 74 6f 20 62 65 3a 0a 2a 2a 0a  ghtly to be:.**.
11c90 2a 2a 20 20 20 20 20 2e 2e 2e 20 6c 6f 6f 70 20  **     ... loop 
11ca0 73 74 61 72 74 65 64 20 62 79 20 73 71 6c 69 74  started by sqlit
11cb0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2e  e3WhereBegin() .
11cc0 2e 2e 0a 2a 2a 20 20 20 20 20 69 66 28 20 6e 65  ...**     if( ne
11cd0 77 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a  w partition ){.*
11ce0 2a 20 20 20 20 20 20 20 47 6f 73 75 62 20 66 6c  *       Gosub fl
11cf0 75 73 68 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20  ush.**     }.** 
11d00 20 20 20 20 49 6e 73 65 72 74 20 6e 65 77 20 72      Insert new r
11d10 6f 77 20 69 6e 74 6f 20 65 70 68 20 74 61 62 6c  ow into eph tabl
11d20 65 2e 0a 2a 2a 20 20 20 20 20 69 66 28 20 66 69  e..**     if( fi
11d30 72 73 74 20 72 6f 77 20 6f 66 20 70 61 72 74 69  rst row of parti
11d40 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20  tion ){.**      
11d50 20 52 65 77 69 6e 64 28 63 73 72 45 6e 64 29 20   Rewind(csrEnd) 
11d60 3b 20 52 65 77 69 6e 64 28 63 73 72 53 74 61 72  ; Rewind(csrStar
11d70 74 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72 43  t) ; Rewind(csrC
11d80 75 72 72 65 6e 74 29 0a 2a 2a 20 20 20 20 20 20  urrent).**      
11d90 20 72 65 67 45 6e 64 20 3d 20 3c 65 78 70 72 32   regEnd = <expr2
11da0 3e 0a 2a 2a 20 20 20 20 20 20 20 72 65 67 53 74  >.**       regSt
11db0 61 72 74 20 3d 20 3c 65 78 70 72 31 3e 0a 2a 2a  art = <expr1>.**
11dc0 20 20 20 20 20 20 20 69 66 28 20 72 65 67 45 6e         if( regEn
11dd0 64 20 3c 20 72 65 67 53 74 61 72 74 20 29 7b 0a  d < regStart ){.
11de0 2a 2a 20 20 20 20 20 20 20 20 20 52 45 54 55 52  **         RETUR
11df0 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 20 20 20  N_ROW.**        
11e00 20 64 65 6c 65 74 65 20 65 70 68 20 74 61 62 6c   delete eph tabl
11e10 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 20 20  e contents.**   
11e20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 0a 2a        continue.*
11e30 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  *       }.**    
11e40 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e   ....**.** The n
11e50 65 77 20 22 63 6f 6e 74 69 6e 75 65 22 20 73 74  ew "continue" st
11e60 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 61  atement in the a
11e70 62 6f 76 65 20 6a 75 6d 70 73 20 74 6f 20 74 68  bove jumps to th
11e80 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  e next iteration
11e90 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 75 74 65 72  .** of the outer
11ea0 20 6c 6f 6f 70 20 2d 20 74 68 65 20 6f 6e 65 20   loop - the one 
11eb0 73 74 61 72 74 65 64 20 62 79 20 73 71 6c 69 74  started by sqlit
11ec0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e 0a  e3WhereBegin()..
11ed0 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 72 69 6f 75  **.** The variou
11ee0 73 20 47 52 4f 55 50 53 20 63 61 73 65 73 20 61  s GROUPS cases a
11ef0 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75  re implemented u
11f00 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 70 61  sing the same pa
11f10 74 74 65 72 6e 73 20 61 73 0a 2a 2a 20 52 4f 57  tterns as.** ROW
11f20 53 2e 20 54 68 65 20 56 4d 20 63 6f 64 65 20 69  S. The VM code i
11f30 73 20 6d 6f 64 69 66 69 65 64 20 73 6c 69 67 68  s modified sligh
11f40 74 6c 79 20 73 6f 20 74 68 61 74 3a 0a 2a 2a 0a  tly so that:.**.
11f50 2a 2a 20 20 20 31 2e 20 54 68 65 20 65 6c 73 65  **   1. The else
11f60 20 62 72 61 6e 63 68 20 69 6e 20 74 68 65 20 6d   branch in the m
11f70 61 69 6e 20 6c 6f 6f 70 20 69 73 20 6f 6e 6c 79  ain loop is only
11f80 20 74 61 6b 65 6e 20 69 66 20 74 68 65 20 72 6f   taken if the ro
11f90 77 20 6a 75 73 74 0a 2a 2a 20 20 20 20 20 20 61  w just.**      a
11fa0 64 64 65 64 20 74 6f 20 74 68 65 20 65 70 68 65  dded to the ephe
11fb0 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 73 20 74  meral table is t
11fc0 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 6e 65  he start of a ne
11fd0 77 20 67 72 6f 75 70 2e 20 49 6e 0a 2a 2a 20 20  w group. In.**  
11fe0 20 20 20 20 6f 74 68 65 72 20 77 6f 72 64 73 2c      other words,
11ff0 20 69 74 20 62 65 63 6f 6d 65 73 3a 0a 2a 2a 0a   it becomes:.**.
12000 2a 2a 20 20 20 20 20 20 20 20 20 2e 2e 2e 20 6c  **         ... l
12010 6f 6f 70 20 73 74 61 72 74 65 64 20 62 79 20 73  oop started by s
12020 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
12030 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20  () ....**       
12040 20 20 69 66 28 20 6e 65 77 20 70 61 72 74 69 74    if( new partit
12050 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  ion ){.**       
12060 20 20 20 20 47 6f 73 75 62 20 66 6c 75 73 68 0a      Gosub flush.
12070 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20  **         }.** 
12080 20 20 20 20 20 20 20 20 49 6e 73 65 72 74 20 6e          Insert n
12090 65 77 20 72 6f 77 20 69 6e 74 6f 20 65 70 68 20  ew row into eph 
120a0 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 20 20  table..**       
120b0 20 20 69 66 28 20 66 69 72 73 74 20 72 6f 77 20    if( first row 
120c0 6f 66 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a  of partition ){.
120d0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 52 65 77  **           Rew
120e0 69 6e 64 28 63 73 72 45 6e 64 29 20 3b 20 52 65  ind(csrEnd) ; Re
120f0 77 69 6e 64 28 63 73 72 53 74 61 72 74 29 20 3b  wind(csrStart) ;
12100 20 52 65 77 69 6e 64 28 63 73 72 43 75 72 72 65   Rewind(csrCurre
12110 6e 74 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  nt).**          
12120 20 72 65 67 45 6e 64 20 3d 20 3c 65 78 70 72 32   regEnd = <expr2
12130 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 72  >.**           r
12140 65 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72 31  egStart = <expr1
12150 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 65 6c  >.**         }el
12160 73 65 20 69 66 28 20 6e 65 77 20 67 72 6f 75 70  se if( new group
12170 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   ){.**          
12180 20 2e 2e 2e 20 0a 2a 2a 20 20 20 20 20 20 20 20   ... .**        
12190 20 7d 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a   }.**       }.**
121a0 0a 2a 2a 20 20 20 32 2e 20 49 6e 73 74 65 61 64  .**   2. Instead
121b0 20 6f 66 20 70 72 6f 63 65 73 73 69 6e 67 20 61   of processing a
121c0 20 73 69 6e 67 6c 65 20 72 6f 77 2c 20 65 61 63   single row, eac
121d0 68 20 52 45 54 55 52 4e 5f 52 4f 57 2c 20 41 47  h RETURN_ROW, AG
121e0 47 53 54 45 50 20 6f 72 20 0a 2a 2a 20 20 20 20  GSTEP or .**    
121f0 20 20 41 47 47 49 4e 56 45 52 53 45 20 73 74 65    AGGINVERSE ste
12200 70 20 70 72 6f 63 65 73 73 65 73 20 74 68 65 20  p processes the 
12210 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74  current row of t
12220 68 65 20 72 65 6c 65 76 61 6e 74 20 63 75 72 73  he relevant curs
12230 6f 72 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 61  or and.**      a
12240 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 72 6f  ll subsequent ro
12250 77 73 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  ws belonging to 
12260 74 68 65 20 73 61 6d 65 20 67 72 6f 75 70 2e 0a  the same group..
12270 2a 2a 0a 2a 2a 20 52 41 4e 47 45 20 77 69 6e 64  **.** RANGE wind
12280 6f 77 20 66 72 61 6d 65 73 20 61 72 65 20 61 20  ow frames are a 
12290 6c 69 74 74 6c 65 20 64 69 66 66 65 72 65 6e 74  little different
122a0 20 61 67 61 69 6e 2e 20 41 73 20 66 6f 72 20 47   again. As for G
122b0 52 4f 55 50 53 2c 20 74 68 65 20 0a 2a 2a 20 6d  ROUPS, the .** m
122c0 61 69 6e 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e  ain loop runs on
122d0 63 65 20 70 65 72 20 67 72 6f 75 70 20 6f 6e 6c  ce per group onl
122e0 79 2e 20 41 6e 64 20 52 45 54 55 52 4e 5f 52 4f  y. And RETURN_RO
122f0 57 2c 20 41 47 47 53 54 45 50 20 61 6e 64 20 41  W, AGGSTEP and A
12300 47 47 49 4e 56 45 52 53 45 0a 2a 2a 20 64 65 61  GGINVERSE.** dea
12310 6c 20 69 6e 20 67 72 6f 75 70 73 20 69 6e 73 74  l in groups inst
12320 65 61 64 20 6f 66 20 72 6f 77 73 2e 20 41 73 20  ead of rows. As 
12330 66 6f 72 20 52 4f 57 53 20 61 6e 64 20 47 52 4f  for ROWS and GRO
12340 55 50 53 2c 20 74 68 65 72 65 20 61 72 65 20 74  UPS, there are t
12350 68 72 65 65 0a 2a 2a 20 62 61 73 69 63 20 63 61  hree.** basic ca
12360 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e  ses:.**.**   RAN
12370 47 45 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72  GE BETWEEN <expr
12380 31 3e 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44  1> PRECEDING AND
12390 20 3c 65 78 70 72 32 3e 20 46 4f 4c 4c 4f 57 49   <expr2> FOLLOWI
123a0 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e  NG.**.**     ...
123b0 20 6c 6f 6f 70 20 73 74 61 72 74 65 64 20 62 79   loop started by
123c0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
123d0 69 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20  in() ....**     
123e0 20 20 69 66 28 20 6e 65 77 20 70 61 72 74 69 74    if( new partit
123f0 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  ion ){.**       
12400 20 20 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a    Gosub flush.**
12410 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
12420 20 20 49 6e 73 65 72 74 20 6e 65 77 20 72 6f 77    Insert new row
12430 20 69 6e 74 6f 20 65 70 68 20 74 61 62 6c 65 2e   into eph table.
12440 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 66 69  .**       if( fi
12450 72 73 74 20 72 6f 77 20 6f 66 20 70 61 72 74 69  rst row of parti
12460 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20  tion ){.**      
12470 20 20 20 52 65 77 69 6e 64 28 63 73 72 45 6e 64     Rewind(csrEnd
12480 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72 53 74  ) ; Rewind(csrSt
12490 61 72 74 29 20 3b 20 52 65 77 69 6e 64 28 63 73  art) ; Rewind(cs
124a0 72 43 75 72 72 65 6e 74 29 0a 2a 2a 20 20 20 20  rCurrent).**    
124b0 20 20 20 20 20 72 65 67 45 6e 64 20 3d 20 3c 65       regEnd = <e
124c0 78 70 72 32 3e 0a 2a 2a 20 20 20 20 20 20 20 20  xpr2>.**        
124d0 20 72 65 67 53 74 61 72 74 20 3d 20 3c 65 78 70   regStart = <exp
124e0 72 31 3e 0a 2a 2a 20 20 20 20 20 20 20 7d 65 6c  r1>.**       }el
124f0 73 65 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41  se{.**         A
12500 47 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 20 20  GGSTEP.**       
12510 20 20 77 68 69 6c 65 28 20 28 63 73 72 43 75 72    while( (csrCur
12520 72 65 6e 74 2e 6b 65 79 20 2b 20 72 65 67 45 6e  rent.key + regEn
12530 64 29 20 3c 20 63 73 72 45 6e 64 2e 6b 65 79 20  d) < csrEnd.key 
12540 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ){.**           
12550 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20  RETURN_ROW.**   
12560 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 63          while( c
12570 73 72 53 74 61 72 74 2e 6b 65 79 20 2b 20 72 65  srStart.key + re
12580 67 53 74 61 72 74 29 20 3c 20 63 73 72 43 75 72  gStart) < csrCur
12590 72 65 6e 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20  rent.key ){.**  
125a0 20 20 20 20 20 20 20 20 20 20 20 41 47 47 49 4e             AGGIN
125b0 56 45 52 53 45 0a 2a 2a 20 20 20 20 20 20 20 20  VERSE.**        
125c0 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20     }.**         
125d0 7d 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20  }.**       }.** 
125e0 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 66 6c 75      }.**     flu
125f0 73 68 3a 0a 2a 2a 20 20 20 20 20 20 20 41 47 47  sh:.**       AGG
12600 53 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 77 68  STEP.**       wh
12610 69 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20  ile( 1 ){.**    
12620 20 20 20 20 20 52 45 54 55 52 4e 20 52 4f 57 0a       RETURN ROW.
12630 2a 2a 20 20 20 20 20 20 20 20 20 69 66 28 20 63  **         if( c
12640 73 72 43 75 72 72 65 6e 74 20 69 73 20 45 4f 46  srCurrent is EOF
12650 20 29 20 62 72 65 61 6b 3b 0a 2a 2a 20 20 20 20   ) break;.**    
12660 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 63 73         while( cs
12670 72 53 74 61 72 74 2e 6b 65 79 20 2b 20 72 65 67  rStart.key + reg
12680 53 74 61 72 74 29 20 3c 20 63 73 72 43 75 72 72  Start) < csrCurr
12690 65 6e 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20  ent.key ){.**   
126a0 20 20 20 20 20 20 20 20 20 20 41 47 47 49 4e 56            AGGINV
126b0 45 52 53 45 0a 2a 2a 20 20 20 20 20 20 20 20 20  ERSE.**         
126c0 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d    }.**         }
126d0 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a  .**       }.**.*
126e0 2a 20 49 6e 20 74 68 65 20 61 62 6f 76 65 20 6e  * In the above n
126f0 6f 74 61 74 69 6f 6e 2c 20 22 63 73 72 2e 6b 65  otation, "csr.ke
12700 79 22 20 6d 65 61 6e 73 20 74 68 65 20 63 75 72  y" means the cur
12710 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68  rent value of th
12720 65 20 4f 52 44 45 52 20 42 59 20 0a 2a 2a 20 65  e ORDER BY .** e
12730 78 70 72 65 73 73 69 6f 6e 20 28 74 68 65 72 65  xpression (there
12740 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 31 20   is only ever 1 
12750 66 6f 72 20 61 20 52 41 4e 47 45 20 74 68 61 74  for a RANGE that
12760 20 75 73 65 73 20 61 6e 20 3c 65 78 70 72 3e 20   uses an <expr> 
12770 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 20 6f 72 20  FOLLOWING.** or 
12780 3c 65 78 70 72 20 50 52 45 43 45 44 49 4e 47 29  <expr PRECEDING)
12790 20 72 65 61 64 20 66 72 6f 6d 20 63 75 72 73 6f   read from curso
127a0 72 20 63 73 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 52  r csr..**.**   R
127b0 41 4e 47 45 20 42 45 54 57 45 45 4e 20 3c 65 78  ANGE BETWEEN <ex
127c0 70 72 31 3e 20 50 52 45 43 45 44 49 4e 47 20 41  pr1> PRECEDING A
127d0 4e 44 20 3c 65 78 70 72 32 3e 20 50 52 45 43 45  ND <expr2> PRECE
127e0 44 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e  DING.**.**     .
127f0 2e 2e 20 6c 6f 6f 70 20 73 74 61 72 74 65 64 20  .. loop started 
12800 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  by sqlite3WhereB
12810 65 67 69 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20  egin() ....**   
12820 20 20 20 20 69 66 28 20 6e 65 77 20 70 61 72 74      if( new part
12830 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20  ition ){.**     
12840 20 20 20 20 47 6f 73 75 62 20 66 6c 75 73 68 0a      Gosub flush.
12850 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20  **       }.**   
12860 20 20 20 20 49 6e 73 65 72 74 20 6e 65 77 20 72      Insert new r
12870 6f 77 20 69 6e 74 6f 20 65 70 68 20 74 61 62 6c  ow into eph tabl
12880 65 2e 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20  e..**       if( 
12890 66 69 72 73 74 20 72 6f 77 20 6f 66 20 70 61 72  first row of par
128a0 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20  tition ){.**    
128b0 20 20 20 20 20 52 65 77 69 6e 64 28 63 73 72 45       Rewind(csrE
128c0 6e 64 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72  nd) ; Rewind(csr
128d0 53 74 61 72 74 29 20 3b 20 52 65 77 69 6e 64 28  Start) ; Rewind(
128e0 63 73 72 43 75 72 72 65 6e 74 29 0a 2a 2a 20 20  csrCurrent).**  
128f0 20 20 20 20 20 20 20 72 65 67 45 6e 64 20 3d 20         regEnd = 
12900 3c 65 78 70 72 32 3e 0a 2a 2a 20 20 20 20 20 20  <expr2>.**      
12910 20 20 20 72 65 67 53 74 61 72 74 20 3d 20 3c 65     regStart = <e
12920 78 70 72 31 3e 0a 2a 2a 20 20 20 20 20 20 20 7d  xpr1>.**       }
12930 65 6c 73 65 7b 0a 2a 2a 20 20 20 20 20 20 20 20  else{.**        
12940 20 77 68 69 6c 65 28 20 28 63 73 72 45 6e 64 2e   while( (csrEnd.
12950 6b 65 79 20 2b 20 72 65 67 45 6e 64 29 20 3c 3d  key + regEnd) <=
12960 20 63 73 72 43 75 72 72 65 6e 74 2e 6b 65 79 20   csrCurrent.key 
12970 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ){.**           
12980 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 20  AGGSTEP.**      
12990 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20     }.**         
129a0 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20  RETURN_ROW.**   
129b0 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 73        while( (cs
129c0 72 53 74 61 72 74 2e 6b 65 79 20 2b 20 72 65 67  rStart.key + reg
129d0 53 74 61 72 74 29 20 3c 20 63 73 72 43 75 72 72  Start) < csrCurr
129e0 65 6e 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20  ent.key ){.**   
129f0 20 20 20 20 20 20 20 20 41 47 47 49 4e 56 45 52          AGGINVER
12a00 53 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a  SE.**         }.
12a10 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20  **       }.**   
12a20 20 20 7d 0a 2a 2a 20 20 20 20 20 66 6c 75 73 68    }.**     flush
12a30 3a 0a 2a 2a 20 20 20 20 20 20 20 77 68 69 6c 65  :.**       while
12a40 28 20 28 63 73 72 45 6e 64 2e 6b 65 79 20 2b 20  ( (csrEnd.key + 
12a50 72 65 67 45 6e 64 29 20 3c 3d 20 63 73 72 43 75  regEnd) <= csrCu
12a60 72 72 65 6e 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20  rrent.key ){.** 
12a70 20 20 20 20 20 20 20 20 41 47 47 53 54 45 50 0a          AGGSTEP.
12a80 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20  **       }.**   
12a90 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a      RETURN_ROW.*
12aa0 2a 0a 2a 2a 20 20 20 52 41 4e 47 45 20 42 45 54  *.**   RANGE BET
12ab0 57 45 45 4e 20 3c 65 78 70 72 31 3e 20 46 4f 4c  WEEN <expr1> FOL
12ac0 4c 4f 57 49 4e 47 20 41 4e 44 20 3c 65 78 70 72  LOWING AND <expr
12ad0 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a  2> FOLLOWING.**.
12ae0 2a 2a 20 20 20 20 20 2e 2e 2e 20 6c 6f 6f 70 20  **     ... loop 
12af0 73 74 61 72 74 65 64 20 62 79 20 73 71 6c 69 74  started by sqlit
12b00 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2e  e3WhereBegin() .
12b10 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20  ...**       if( 
12b20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 20 29 7b  new partition ){
12b30 0a 2a 2a 20 20 20 20 20 20 20 20 20 47 6f 73 75  .**         Gosu
12b40 62 20 66 6c 75 73 68 0a 2a 2a 20 20 20 20 20 20  b flush.**      
12b50 20 7d 0a 2a 2a 20 20 20 20 20 20 20 49 6e 73 65   }.**       Inse
12b60 72 74 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20  rt new row into 
12b70 65 70 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20  eph table..**   
12b80 20 20 20 20 69 66 28 20 66 69 72 73 74 20 72 6f      if( first ro
12b90 77 20 6f 66 20 70 61 72 74 69 74 69 6f 6e 20 29  w of partition )
12ba0 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 65 77  {.**         Rew
12bb0 69 6e 64 28 63 73 72 45 6e 64 29 20 3b 20 52 65  ind(csrEnd) ; Re
12bc0 77 69 6e 64 28 63 73 72 53 74 61 72 74 29 20 3b  wind(csrStart) ;
12bd0 20 52 65 77 69 6e 64 28 63 73 72 43 75 72 72 65   Rewind(csrCurre
12be0 6e 74 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 72  nt).**         r
12bf0 65 67 45 6e 64 20 3d 20 3c 65 78 70 72 32 3e 0a  egEnd = <expr2>.
12c00 2a 2a 20 20 20 20 20 20 20 20 20 72 65 67 53 74  **         regSt
12c10 61 72 74 20 3d 20 3c 65 78 70 72 31 3e 0a 2a 2a  art = <expr1>.**
12c20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a         }else{.**
12c30 20 20 20 20 20 20 20 20 20 41 47 47 53 54 45 50           AGGSTEP
12c40 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 68 69 6c  .**         whil
12c50 65 28 20 28 63 73 72 43 75 72 72 65 6e 74 2e 6b  e( (csrCurrent.k
12c60 65 79 20 2b 20 72 65 67 45 6e 64 29 20 3c 20 63  ey + regEnd) < c
12c70 73 72 45 6e 64 2e 6b 65 79 20 29 7b 0a 2a 2a 20  srEnd.key ){.** 
12c80 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
12c90 20 28 63 73 72 43 75 72 72 65 6e 74 2e 6b 65 79   (csrCurrent.key
12ca0 20 2b 20 72 65 67 53 74 61 72 74 29 20 3e 20 63   + regStart) > c
12cb0 73 72 53 74 61 72 74 2e 6b 65 79 20 29 7b 0a 2a  srStart.key ){.*
12cc0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 41 47  *             AG
12cd0 47 49 4e 56 45 52 53 45 0a 2a 2a 20 20 20 20 20  GINVERSE.**     
12ce0 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20        }.**      
12cf0 20 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a       RETURN_ROW.
12d00 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20  **         }.** 
12d10 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 7d        }.**     }
12d20 0a 2a 2a 20 20 20 20 20 66 6c 75 73 68 3a 0a 2a  .**     flush:.*
12d30 2a 20 20 20 20 20 20 20 41 47 47 53 54 45 50 0a  *       AGGSTEP.
12d40 2a 2a 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  **       while( 
12d50 31 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  1 ){.**         
12d60 77 68 69 6c 65 28 20 28 63 73 72 43 75 72 72 65  while( (csrCurre
12d70 6e 74 2e 6b 65 79 20 2b 20 72 65 67 53 74 61 72  nt.key + regStar
12d80 74 29 20 3e 20 63 73 72 53 74 61 72 74 2e 6b 65  t) > csrStart.ke
12d90 79 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  y ){.**         
12da0 20 20 41 47 47 49 4e 56 45 52 53 45 0a 2a 2a 20    AGGINVERSE.** 
12db0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 6f            if( eo
12dc0 66 20 29 20 62 72 65 61 6b 20 22 77 68 69 6c 65  f ) break "while
12dd0 28 20 31 20 29 22 20 6c 6f 6f 70 2e 0a 2a 2a 20  ( 1 )" loop..** 
12de0 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20          }.**    
12df0 20 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a       RETURN_ROW.
12e00 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20  **       }.**   
12e10 20 20 20 20 77 68 69 6c 65 28 20 21 65 6f 66 20      while( !eof 
12e20 63 73 72 43 75 72 72 65 6e 74 20 29 7b 0a 2a 2a  csrCurrent ){.**
12e30 20 20 20 20 20 20 20 20 20 52 45 54 55 52 4e 5f           RETURN_
12e40 52 4f 57 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a  ROW.**       }.*
12e50 2a 0a 2a 2a 20 54 68 65 20 74 65 78 74 20 61 62  *.** The text ab
12e60 6f 76 65 20 6c 65 61 76 65 73 20 6f 75 74 20 6d  ove leaves out m
12e70 61 6e 79 20 64 65 74 61 69 6c 73 2e 20 52 65 66  any details. Ref
12e80 65 72 20 74 6f 20 74 68 65 20 63 6f 64 65 20 61  er to the code a
12e90 6e 64 20 63 6f 6d 6d 65 6e 74 73 0a 2a 2a 20 62  nd comments.** b
12ea0 65 6c 6f 77 20 66 6f 72 20 61 20 6d 6f 72 65 20  elow for a more 
12eb0 63 6f 6d 70 6c 65 74 65 20 70 69 63 74 75 72 65  complete picture
12ec0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
12ed0 33 57 69 6e 64 6f 77 43 6f 64 65 53 74 65 70 28  3WindowCodeStep(
12ee0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
12ef0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
12f00 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
12f10 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
12f20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
12f30 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 77 72           /* Rewr
12f40 69 74 74 65 6e 20 53 45 4c 45 43 54 20 73 74 61  itten SELECT sta
12f50 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 57 68 65 72  tement */.  Wher
12f60 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20  eInfo *pWInfo,  
12f70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
12f80 6f 6e 74 65 78 74 20 72 65 74 75 72 6e 65 64 20  ontext returned 
12f90 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  by sqlite3WhereB
12fa0 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  egin() */.  int 
12fb0 72 65 67 47 6f 73 75 62 2c 20 20 20 20 20 20 20  regGosub,       
12fc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
12fd0 65 67 69 73 74 65 72 20 66 6f 72 20 4f 50 5f 47  egister for OP_G
12fe0 6f 73 75 62 20 2a 2f 0a 20 20 69 6e 74 20 61 64  osub */.  int ad
12ff0 64 72 47 6f 73 75 62 20 20 20 20 20 20 20 20 20  drGosub         
13000 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 50 5f            /* OP_
13010 47 6f 73 75 62 20 68 65 72 65 20 74 6f 20 72 65  Gosub here to re
13020 74 75 72 6e 20 65 61 63 68 20 72 6f 77 20 2a 2f  turn each row */
13030 0a 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d  .){.  Window *pM
13040 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b 0a 20  Win = p->pWin;. 
13050 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
13060 72 42 79 20 3d 20 70 4d 57 69 6e 2d 3e 70 4f 72  rBy = pMWin->pOr
13070 64 65 72 42 79 3b 0a 20 20 56 64 62 65 20 2a 76  derBy;.  Vdbe *v
13080 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
13090 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  e(pParse);.  int
130a0 20 63 73 72 57 72 69 74 65 3b 20 20 20 20 20 20   csrWrite;      
130b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
130c0 43 75 72 73 6f 72 20 75 73 65 64 20 74 6f 20 77  Cursor used to w
130d0 72 69 74 65 20 74 6f 20 65 70 68 2e 20 74 61 62  rite to eph. tab
130e0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 63 73 72 49  le */.  int csrI
130f0 6e 70 75 74 20 3d 20 70 2d 3e 70 53 72 63 2d 3e  nput = p->pSrc->
13100 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 20 20 20  a[0].iCursor;   
13110 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20 73    /* Cursor of s
13120 75 62 2d 73 65 6c 65 63 74 20 2a 2f 0a 20 20 69  ub-select */.  i
13130 6e 74 20 6e 49 6e 70 75 74 20 3d 20 70 2d 3e 70  nt nInput = p->p
13140 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 2d 3e  Src->a[0].pTab->
13150 6e 43 6f 6c 3b 20 20 20 20 2f 2a 20 4e 75 6d 62  nCol;    /* Numb
13160 65 72 20 6f 66 20 63 6f 6c 73 20 72 65 74 75 72  er of cols retur
13170 6e 65 64 20 62 79 20 73 75 62 20 2a 2f 0a 20 20  ned by sub */.  
13180 69 6e 74 20 69 49 6e 70 75 74 3b 20 20 20 20 20  int iInput;     
13190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 20            /* To 
131b0 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
131c0 73 75 62 20 63 6f 6c 73 20 2a 2f 0a 20 20 69 6e  sub cols */.  in
131d0 74 20 61 64 64 72 4e 65 3b 20 20 20 20 20 20 20  t addrNe;       
131e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
131f0 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4e   Address of OP_N
13200 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 47  e */.  int addrG
13210 6f 73 75 62 46 6c 75 73 68 20 3d 20 30 3b 20 20  osubFlush = 0;  
13220 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
13230 73 20 6f 66 20 4f 50 5f 47 6f 73 75 62 20 74 6f  s of OP_Gosub to
13240 20 66 6c 75 73 68 3a 20 2a 2f 0a 20 20 69 6e 74   flush: */.  int
13250 20 61 64 64 72 49 6e 74 65 67 65 72 20 3d 20 30   addrInteger = 0
13260 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
13270 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 49 6e  Address of OP_In
13280 74 65 67 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61  teger */.  int a
13290 64 64 72 45 6d 70 74 79 3b 20 20 20 20 20 20 20  ddrEmpty;       
132a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
132b0 64 72 65 73 73 20 6f 66 20 4f 50 5f 52 65 77 69  dress of OP_Rewi
132c0 6e 64 20 69 6e 20 66 6c 75 73 68 3a 20 2a 2f 0a  nd in flush: */.
132d0 20 20 69 6e 74 20 72 65 67 53 74 61 72 74 20 3d    int regStart =
132e0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
132f0 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 3c 65    /* Value of <e
13300 78 70 72 3e 20 50 52 45 43 45 44 49 4e 47 20 2a  xpr> PRECEDING *
13310 2f 0a 20 20 69 6e 74 20 72 65 67 45 6e 64 20 3d  /.  int regEnd =
13320 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
13330 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20      /* Value of 
13340 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47  <expr> FOLLOWING
13350 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4e 65 77   */.  int regNew
13360 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13370 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
13380 66 20 72 65 67 69 73 74 65 72 73 20 68 6f 6c 64  f registers hold
13390 69 6e 67 20 6e 65 77 20 69 6e 70 75 74 20 72 6f  ing new input ro
133a0 77 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  w */.  int regRe
133b0 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20 20  cord;           
133c0 20 20 20 20 20 20 20 2f 2a 20 72 65 67 4e 65 77         /* regNew
133d0 20 61 72 72 61 79 20 69 6e 20 72 65 63 6f 72 64   array in record
133e0 20 66 6f 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 72   form */.  int r
133f0 65 67 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20  egRowid;        
13400 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
13410 77 69 64 20 66 6f 72 20 72 65 67 52 65 63 6f 72  wid for regRecor
13420 64 20 69 6e 20 65 70 68 20 74 61 62 6c 65 20 2a  d in eph table *
13430 2f 0a 20 20 69 6e 74 20 72 65 67 4e 65 77 50 65  /.  int regNewPe
13440 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  er = 0;         
13450 20 20 20 20 2f 2a 20 50 65 65 72 20 76 61 6c 75      /* Peer valu
13460 65 73 20 66 6f 72 20 6e 65 77 20 72 6f 77 20 28  es for new row (
13470 70 61 72 74 20 6f 66 20 72 65 67 4e 65 77 29 20  part of regNew) 
13480 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 65 65 72  */.  int regPeer
13490 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
134a0 20 20 20 20 20 2f 2a 20 50 65 65 72 20 76 61 6c       /* Peer val
134b0 75 65 73 20 66 6f 72 20 63 75 72 72 65 6e 74 20  ues for current 
134c0 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  row */.  int reg
134d0 46 6c 75 73 68 50 61 72 74 20 3d 20 30 3b 20 20  FlushPart = 0;  
134e0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
134f0 73 74 65 72 20 66 6f 72 20 22 47 6f 73 75 62 20  ster for "Gosub 
13500 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 22  flush_partition"
13510 20 2a 2f 0a 20 20 57 69 6e 64 6f 77 43 6f 64 65   */.  WindowCode
13520 41 72 67 20 73 3b 20 20 20 20 20 20 20 20 20 20  Arg s;          
13530 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74        /* Context
13540 20 6f 62 6a 65 63 74 20 66 6f 72 20 73 75 62 2d   object for sub-
13550 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20 69 6e  routines */.  in
13560 74 20 6c 62 6c 57 68 65 72 65 45 6e 64 3b 20 20  t lblWhereEnd;  
13570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13580 20 4c 61 62 65 6c 20 6a 75 73 74 20 62 65 66 6f   Label just befo
13590 72 65 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  re sqlite3WhereE
135a0 6e 64 28 29 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  nd() code */..  
135b0 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65  assert( pMWin->e
135c0 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44  Start==TK_PRECED
135d0 49 4e 47 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53  ING || pMWin->eS
135e0 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54  tart==TK_CURRENT
135f0 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69   .       || pMWi
13600 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f  n->eStart==TK_FO
13610 4c 4c 4f 57 49 4e 47 20 7c 7c 20 70 4d 57 69 6e  LLOWING || pMWin
13620 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42  ->eStart==TK_UNB
13630 4f 55 4e 44 45 44 20 0a 20 20 29 3b 0a 20 20 61  OUNDED .  );.  a
13640 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 45  ssert( pMWin->eE
13650 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  nd==TK_FOLLOWING
13660 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d   || pMWin->eEnd=
13670 3d 54 4b 5f 43 55 52 52 45 4e 54 20 0a 20 20 20  =TK_CURRENT .   
13680 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45      || pMWin->eE
13690 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  nd==TK_UNBOUNDED
136a0 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d   || pMWin->eEnd=
136b0 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 0a 20  =TK_PRECEDING . 
136c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d   );.  assert( pM
136d0 57 69 6e 2d 3e 65 45 78 63 6c 75 64 65 3d 3d 30  Win->eExclude==0
136e0 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 78 63 6c   || pMWin->eExcl
136f0 75 64 65 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 0a  ude==TK_CURRENT.
13700 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d         || pMWin-
13710 3e 65 45 78 63 6c 75 64 65 3d 3d 54 4b 5f 47 52  >eExclude==TK_GR
13720 4f 55 50 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45  OUP || pMWin->eE
13730 78 63 6c 75 64 65 3d 3d 54 4b 5f 54 49 45 53 0a  xclude==TK_TIES.
13740 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d         || pMWin-
13750 3e 65 45 78 63 6c 75 64 65 3d 3d 54 4b 5f 4e 4f  >eExclude==TK_NO
13760 0a 20 20 29 3b 0a 0a 20 20 6c 62 6c 57 68 65 72  .  );..  lblWher
13770 65 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  eEnd = sqlite3Vd
13780 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
13790 73 65 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  se);..  /* Fill 
137a0 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f  in the context o
137b0 62 6a 65 63 74 20 2a 2f 0a 20 20 6d 65 6d 73 65  bject */.  memse
137c0 74 28 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&s, 0, sizeof(
137d0 57 69 6e 64 6f 77 43 6f 64 65 41 72 67 29 29 3b  WindowCodeArg));
137e0 0a 20 20 73 2e 70 50 61 72 73 65 20 3d 20 70 50  .  s.pParse = pP
137f0 61 72 73 65 3b 0a 20 20 73 2e 70 4d 57 69 6e 20  arse;.  s.pMWin 
13800 3d 20 70 4d 57 69 6e 3b 0a 20 20 73 2e 70 56 64  = pMWin;.  s.pVd
13810 62 65 20 3d 20 76 3b 0a 20 20 73 2e 72 65 67 47  be = v;.  s.regG
13820 6f 73 75 62 20 3d 20 72 65 67 47 6f 73 75 62 3b  osub = regGosub;
13830 0a 20 20 73 2e 61 64 64 72 47 6f 73 75 62 20 3d  .  s.addrGosub =
13840 20 61 64 64 72 47 6f 73 75 62 3b 0a 20 20 73 2e   addrGosub;.  s.
13850 63 75 72 72 65 6e 74 2e 63 73 72 20 3d 20 70 4d  current.csr = pM
13860 57 69 6e 2d 3e 69 45 70 68 43 73 72 3b 0a 20 20  Win->iEphCsr;.  
13870 63 73 72 57 72 69 74 65 20 3d 20 73 2e 63 75 72  csrWrite = s.cur
13880 72 65 6e 74 2e 63 73 72 2b 31 3b 0a 20 20 73 2e  rent.csr+1;.  s.
13890 73 74 61 72 74 2e 63 73 72 20 3d 20 73 2e 63 75  start.csr = s.cu
138a0 72 72 65 6e 74 2e 63 73 72 2b 32 3b 0a 20 20 73  rrent.csr+2;.  s
138b0 2e 65 6e 64 2e 63 73 72 20 3d 20 73 2e 63 75 72  .end.csr = s.cur
138c0 72 65 6e 74 2e 63 73 72 2b 33 3b 0a 0a 20 20 2f  rent.csr+3;..  /
138d0 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65  * Figure out whe
138e0 6e 20 72 6f 77 73 20 6d 61 79 20 62 65 20 64 65  n rows may be de
138f0 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20 65  leted from the e
13900 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20  phemeral table. 
13910 54 68 65 72 65 0a 20 20 2a 2a 20 61 72 65 20 66  There.  ** are f
13920 6f 75 72 20 6f 70 74 69 6f 6e 73 20 2d 20 74 68  our options - th
13930 65 79 20 6d 61 79 20 6e 65 76 65 72 20 62 65 20  ey may never be 
13940 64 65 6c 65 74 65 64 20 28 65 44 65 6c 65 74 65  deleted (eDelete
13950 3d 3d 30 29 2c 20 74 68 65 79 20 6d 61 79 20 0a  ==0), they may .
13960 20 20 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20    ** be deleted 
13970 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 79 20  as soon as they 
13980 61 72 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 70 61  are no longer pa
13990 72 74 20 6f 66 20 74 68 65 20 77 69 6e 64 6f 77  rt of the window
139a0 20 66 72 61 6d 65 0a 20 20 2a 2a 20 28 65 44 65   frame.  ** (eDe
139b0 6c 65 74 65 3d 3d 57 49 4e 44 4f 57 5f 41 47 47  lete==WINDOW_AGG
139c0 49 4e 56 45 52 53 45 29 2c 20 74 68 65 79 20 6d  INVERSE), they m
139d0 61 79 20 62 65 20 64 65 6c 65 74 65 64 20 61 73  ay be deleted as
139e0 20 61 66 74 65 72 20 74 68 65 20 72 6f 77 20 0a   after the row .
139f0 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 65    ** has been re
13a00 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
13a10 6c 6c 65 72 20 28 57 49 4e 44 4f 57 5f 52 45 54  ller (WINDOW_RET
13a20 55 52 4e 5f 52 4f 57 29 2c 20 6f 72 20 74 68 65  URN_ROW), or the
13a30 79 20 6d 61 79 0a 20 20 2a 2a 20 62 65 20 64 65  y may.  ** be de
13a40 6c 65 74 65 64 20 61 66 74 65 72 20 74 68 65 79  leted after they
13a50 20 65 6e 74 65 72 20 74 68 65 20 66 72 61 6d 65   enter the frame
13a60 20 28 57 49 4e 44 4f 57 5f 41 47 47 53 54 45 50   (WINDOW_AGGSTEP
13a70 29 2e 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20  ). */.  switch( 
13a80 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 20 29 7b  pMWin->eStart ){
13a90 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4f 4c  .    case TK_FOL
13aa0 4c 4f 57 49 4e 47 3a 0a 20 20 20 20 20 20 69 66  LOWING:.      if
13ab0 28 20 70 4d 57 69 6e 2d 3e 65 46 72 6d 54 79 70  ( pMWin->eFrmTyp
13ac0 65 21 3d 54 4b 5f 52 41 4e 47 45 0a 20 20 20 20  e!=TK_RANGE.    
13ad0 20 20 20 26 26 20 77 69 6e 64 6f 77 45 78 70 72     && windowExpr
13ae0 47 74 5a 65 72 6f 28 70 50 61 72 73 65 2c 20 70  GtZero(pParse, p
13af0 4d 57 69 6e 2d 3e 70 53 74 61 72 74 29 0a 20 20  MWin->pStart).  
13b00 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73      ){.        s
13b10 2e 65 44 65 6c 65 74 65 20 3d 20 57 49 4e 44 4f  .eDelete = WINDO
13b20 57 5f 52 45 54 55 52 4e 5f 52 4f 57 3b 0a 20 20  W_RETURN_ROW;.  
13b30 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
13b40 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  k;.    case TK_U
13b50 4e 42 4f 55 4e 44 45 44 3a 0a 20 20 20 20 20 20  NBOUNDED:.      
13b60 69 66 28 20 77 69 6e 64 6f 77 43 61 63 68 65 46  if( windowCacheF
13b70 72 61 6d 65 28 70 4d 57 69 6e 29 3d 3d 30 20 29  rame(pMWin)==0 )
13b80 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d  {.        if( pM
13b90 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52  Win->eEnd==TK_PR
13ba0 45 43 45 44 49 4e 47 20 29 7b 0a 20 20 20 20 20  ECEDING ){.     
13bb0 20 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e       if( pMWin->
13bc0 65 46 72 6d 54 79 70 65 21 3d 54 4b 5f 52 41 4e  eFrmType!=TK_RAN
13bd0 47 45 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  GE.           &&
13be0 20 77 69 6e 64 6f 77 45 78 70 72 47 74 5a 65 72   windowExprGtZer
13bf0 6f 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2d  o(pParse, pMWin-
13c00 3e 70 45 6e 64 29 0a 20 20 20 20 20 20 20 20 20  >pEnd).         
13c10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
13c20 73 2e 65 44 65 6c 65 74 65 20 3d 20 57 49 4e 44  s.eDelete = WIND
13c30 4f 57 5f 41 47 47 53 54 45 50 3b 0a 20 20 20 20  OW_AGGSTEP;.    
13c40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
13c50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
13c60 20 73 2e 65 44 65 6c 65 74 65 20 3d 20 57 49 4e   s.eDelete = WIN
13c70 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 3b 0a  DOW_RETURN_ROW;.
13c80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13c90 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
13ca0 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
13cb0 20 20 73 2e 65 44 65 6c 65 74 65 20 3d 20 57 49    s.eDelete = WI
13cc0 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 3b  NDOW_AGGINVERSE;
13cd0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
13ce0 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
13cf0 20 72 65 67 69 73 74 65 72 73 20 66 6f 72 20 74   registers for t
13d00 68 65 20 61 72 72 61 79 20 6f 66 20 76 61 6c 75  he array of valu
13d10 65 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  es from the sub-
13d20 71 75 65 72 79 2c 20 74 68 65 0a 20 20 2a 2a 20  query, the.  ** 
13d30 73 61 6d 76 65 20 76 61 6c 75 65 73 20 69 6e 20  samve values in 
13d40 72 65 63 6f 72 64 20 66 6f 72 6d 2c 20 61 6e 64  record form, and
13d50 20 74 68 65 20 72 6f 77 69 64 20 75 73 65 64 20   the rowid used 
13d60 74 6f 20 69 6e 73 65 72 74 20 73 61 69 64 20 72  to insert said r
13d70 65 63 6f 72 64 0a 20 20 2a 2a 20 69 6e 74 6f 20  ecord.  ** into 
13d80 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61  the ephemeral ta
13d90 62 6c 65 2e 20 20 2a 2f 0a 20 20 72 65 67 4e 65  ble.  */.  regNe
13da0 77 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  w = pParse->nMem
13db0 2b 31 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d  +1;.  pParse->nM
13dc0 65 6d 20 2b 3d 20 6e 49 6e 70 75 74 3b 0a 20 20  em += nInput;.  
13dd0 72 65 67 52 65 63 6f 72 64 20 3d 20 2b 2b 70 50  regRecord = ++pP
13de0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
13df0 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73  gRowid = ++pPars
13e00 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 2f 2a 20 49  e->nMem;..  /* I
13e10 66 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61  f the window fra
13e20 6d 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22  me contains an "
13e30 3c 65 78 70 72 3e 20 50 52 45 43 45 44 49 4e 47  <expr> PRECEDING
13e40 22 20 6f 72 20 22 3c 65 78 70 72 3e 20 46 4f 4c  " or "<expr> FOL
13e50 4c 4f 57 49 4e 47 22 0a 20 20 2a 2a 20 63 6c 61  LOWING".  ** cla
13e60 75 73 65 2c 20 61 6c 6c 6f 63 61 74 65 20 72 65  use, allocate re
13e70 67 69 73 74 65 72 73 20 74 6f 20 73 74 6f 72 65  gisters to store
13e80 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
13e90 65 76 61 6c 75 61 74 69 6e 67 20 65 61 63 68 0a  evaluating each.
13ea0 20 20 2a 2a 20 3c 65 78 70 72 3e 2e 20 20 2a 2f    ** <expr>.  */
13eb0 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53  .  if( pMWin->eS
13ec0 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49  tart==TK_PRECEDI
13ed0 4e 47 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74  NG || pMWin->eSt
13ee0 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e  art==TK_FOLLOWIN
13ef0 47 20 29 7b 0a 20 20 20 20 72 65 67 53 74 61 72  G ){.    regStar
13f00 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
13f10 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d  em;.  }.  if( pM
13f20 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52  Win->eEnd==TK_PR
13f30 45 43 45 44 49 4e 47 20 7c 7c 20 70 4d 57 69 6e  ECEDING || pMWin
13f40 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f  ->eEnd==TK_FOLLO
13f50 57 49 4e 47 20 29 7b 0a 20 20 20 20 72 65 67 45  WING ){.    regE
13f60 6e 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  nd = ++pParse->n
13f70 4d 65 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  Mem;.  }..  /* I
13f80 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  f this is not a 
13f90 22 52 4f 57 53 20 42 45 54 57 45 45 4e 20 2e 2e  "ROWS BETWEEN ..
13fa0 2e 22 20 66 72 61 6d 65 2c 20 74 68 65 6e 20 61  ." frame, then a
13fb0 6c 6c 6f 63 61 74 65 20 61 72 72 61 79 73 20 6f  llocate arrays o
13fc0 66 0a 20 20 2a 2a 20 72 65 67 69 73 74 65 72 73  f.  ** registers
13fd0 20 74 6f 20 73 74 6f 72 65 20 63 6f 70 69 65 73   to store copies
13fe0 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
13ff0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 28 70 65   expressions (pe
14000 65 72 20 76 61 6c 75 65 73 29 20 0a 20 20 2a 2a  er values) .  **
14010 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 6c 6f   for the main lo
14020 6f 70 2c 20 61 6e 64 20 66 6f 72 20 65 61 63 68  op, and for each
14030 20 63 75 72 73 6f 72 20 28 73 74 61 72 74 2c 20   cursor (start, 
14040 63 75 72 72 65 6e 74 20 61 6e 64 20 65 6e 64 29  current and end)
14050 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e  . */.  if( pMWin
14060 2d 3e 65 46 72 6d 54 79 70 65 21 3d 54 4b 5f 52  ->eFrmType!=TK_R
14070 4f 57 53 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  OWS ){.    int n
14080 50 65 65 72 20 3d 20 28 70 4f 72 64 65 72 42 79  Peer = (pOrderBy
14090 20 3f 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   ? pOrderBy->nEx
140a0 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 72 65 67  pr : 0);.    reg
140b0 4e 65 77 50 65 65 72 20 3d 20 72 65 67 4e 65 77  NewPeer = regNew
140c0 20 2b 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65   + pMWin->nBuffe
140d0 72 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 70 4d  rCol;.    if( pM
140e0 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20  Win->pPartition 
140f0 29 20 72 65 67 4e 65 77 50 65 65 72 20 2b 3d 20  ) regNewPeer += 
14100 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f  pMWin->pPartitio
14110 6e 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 72 65  n->nExpr;.    re
14120 67 50 65 65 72 20 3d 20 70 50 61 72 73 65 2d 3e  gPeer = pParse->
14130 6e 4d 65 6d 2b 31 3b 20 20 20 20 20 20 20 70 50  nMem+1;       pP
14140 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50  arse->nMem += nP
14150 65 65 72 3b 0a 20 20 20 20 73 2e 73 74 61 72 74  eer;.    s.start
14160 2e 72 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e  .reg = pParse->n
14170 4d 65 6d 2b 31 3b 20 20 20 70 50 61 72 73 65 2d  Mem+1;   pParse-
14180 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 65 65 72 3b 0a  >nMem += nPeer;.
14190 20 20 20 20 73 2e 63 75 72 72 65 6e 74 2e 72 65      s.current.re
141a0 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  g = pParse->nMem
141b0 2b 31 3b 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  +1; pParse->nMem
141c0 20 2b 3d 20 6e 50 65 65 72 3b 0a 20 20 20 20 73   += nPeer;.    s
141d0 2e 65 6e 64 2e 72 65 67 20 3d 20 70 50 61 72 73  .end.reg = pPars
141e0 65 2d 3e 6e 4d 65 6d 2b 31 3b 20 20 20 20 20 70  e->nMem+1;     p
141f0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
14200 50 65 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Peer;.  }..  /* 
14210 4c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20  Load the column 
14220 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20 72  values for the r
14230 6f 77 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ow returned by t
14240 68 65 20 73 75 62 2d 73 65 6c 65 63 74 0a 20 20  he sub-select.  
14250 2a 2a 20 69 6e 74 6f 20 61 6e 20 61 72 72 61 79  ** into an array
14260 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 73 74   of registers st
14270 61 72 74 69 6e 67 20 61 74 20 72 65 67 4e 65 77  arting at regNew
14280 2e 20 41 73 73 65 6d 62 6c 65 20 74 68 65 6d 20  . Assemble them 
14290 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 72 65 63 6f  into.  ** a reco
142a0 72 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 72  rd in register r
142b0 65 67 52 65 63 6f 72 64 2e 20 2a 2f 0a 20 20 66  egRecord. */.  f
142c0 6f 72 28 69 49 6e 70 75 74 3d 30 3b 20 69 49 6e  or(iInput=0; iIn
142d0 70 75 74 3c 6e 49 6e 70 75 74 3b 20 69 49 6e 70  put<nInput; iInp
142e0 75 74 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  ut++){.    sqlit
142f0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
14300 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 49 6e  OP_Column, csrIn
14310 70 75 74 2c 20 69 49 6e 70 75 74 2c 20 72 65 67  put, iInput, reg
14320 4e 65 77 2b 69 49 6e 70 75 74 29 3b 0a 20 20 7d  New+iInput);.  }
14330 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
14340 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
14350 65 63 6f 72 64 2c 20 72 65 67 4e 65 77 2c 20 6e  ecord, regNew, n
14360 49 6e 70 75 74 2c 20 72 65 67 52 65 63 6f 72 64  Input, regRecord
14370 29 3b 0a 0a 20 20 2f 2a 20 41 6e 20 69 6e 70 75  );..  /* An inpu
14380 74 20 72 6f 77 20 68 61 73 20 6a 75 73 74 20 62  t row has just b
14390 65 65 6e 20 72 65 61 64 20 69 6e 74 6f 20 61 6e  een read into an
143a0 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   array of regist
143b0 65 72 73 20 73 74 61 72 74 69 6e 67 0a 20 20 2a  ers starting.  *
143c0 2a 20 61 74 20 72 65 67 4e 65 77 2e 20 49 66 20  * at regNew. If 
143d0 74 68 65 20 77 69 6e 64 6f 77 20 68 61 73 20 61  the window has a
143e0 20 50 41 52 54 49 54 49 4f 4e 20 63 6c 61 75 73   PARTITION claus
143f0 65 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20 67 65  e, this block ge
14400 6e 65 72 61 74 65 73 20 0a 20 20 2a 2a 20 56 4d  nerates .  ** VM
14410 20 63 6f 64 65 20 74 6f 20 63 68 65 63 6b 20 69   code to check i
14420 66 20 74 68 65 20 69 6e 70 75 74 20 72 6f 77 20  f the input row 
14430 69 73 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  is the start of 
14440 61 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 2e  a new partition.
14450 0a 20 20 2a 2a 20 49 66 20 73 6f 2c 20 69 74 20  .  ** If so, it 
14460 64 6f 65 73 20 61 6e 20 4f 50 5f 47 6f 73 75 62  does an OP_Gosub
14470 20 74 6f 20 61 6e 20 61 64 64 72 65 73 73 20 74   to an address t
14480 6f 20 62 65 20 66 69 6c 6c 65 64 20 69 6e 20 6c  o be filled in l
14490 61 74 65 72 2e 20 54 68 65 0a 20 20 2a 2a 20 61  ater. The.  ** a
144a0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50  ddress of the OP
144b0 5f 47 6f 73 75 62 20 69 73 20 73 74 6f 72 65 64  _Gosub is stored
144c0 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61 62   in local variab
144d0 6c 65 20 61 64 64 72 47 6f 73 75 62 46 6c 75 73  le addrGosubFlus
144e0 68 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69  h. */.  if( pMWi
144f0 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 29 7b  n->pPartition ){
14500 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  .    int addr;. 
14510 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 50 61     ExprList *pPa
14520 72 74 20 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72  rt = pMWin->pPar
14530 74 69 74 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20  tition;.    int 
14540 6e 50 61 72 74 20 3d 20 70 50 61 72 74 2d 3e 6e  nPart = pPart->n
14550 45 78 70 72 3b 0a 20 20 20 20 69 6e 74 20 72 65  Expr;.    int re
14560 67 4e 65 77 50 61 72 74 20 3d 20 72 65 67 4e 65  gNewPart = regNe
14570 77 20 2b 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66  w + pMWin->nBuff
14580 65 72 43 6f 6c 3b 0a 20 20 20 20 4b 65 79 49 6e  erCol;.    KeyIn
14590 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 73  fo *pKeyInfo = s
145a0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f  qlite3KeyInfoFro
145b0 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
145c0 2c 20 70 50 61 72 74 2c 20 30 2c 20 30 29 3b 0a  , pPart, 0, 0);.
145d0 0a 20 20 20 20 72 65 67 46 6c 75 73 68 50 61 72  .    regFlushPar
145e0 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
145f0 65 6d 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73  em;.    addr = s
14600 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
14610 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
14620 72 65 67 4e 65 77 50 61 72 74 2c 20 70 4d 57 69  regNewPart, pMWi
14630 6e 2d 3e 72 65 67 50 61 72 74 2c 20 6e 50 61 72  n->regPart, nPar
14640 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
14650 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28  dbeAppendP4(v, (
14660 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  void*)pKeyInfo, 
14670 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
14680 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14690 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61  p3(v, OP_Jump, a
146a0 64 64 72 2b 32 2c 20 61 64 64 72 2b 34 2c 20 61  ddr+2, addr+4, a
146b0 64 64 72 2b 32 29 3b 0a 20 20 20 20 56 64 62 65  ddr+2);.    Vdbe
146c0 43 6f 76 65 72 61 67 65 45 71 4e 65 28 76 29 3b  CoverageEqNe(v);
146d0 0a 20 20 20 20 61 64 64 72 47 6f 73 75 62 46 6c  .    addrGosubFl
146e0 75 73 68 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ush = sqlite3Vdb
146f0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 47 6f  eAddOp1(v, OP_Go
14700 73 75 62 2c 20 72 65 67 46 6c 75 73 68 50 61 72  sub, regFlushPar
14710 74 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  t);.    VdbeComm
14720 65 6e 74 28 28 76 2c 20 22 63 61 6c 6c 20 66 6c  ent((v, "call fl
14730 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 29 29  ush_partition"))
14740 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
14750 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
14760 70 79 2c 20 72 65 67 4e 65 77 50 61 72 74 2c 20  py, regNewPart, 
14770 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c 20  pMWin->regPart, 
14780 6e 50 61 72 74 2d 31 29 3b 0a 20 20 7d 0a 0a 20  nPart-1);.  }.. 
14790 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e   /* Insert the n
147a0 65 77 20 72 6f 77 20 69 6e 74 6f 20 74 68 65 20  ew row into the 
147b0 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
147c0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
147d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
147e0 52 6f 77 69 64 2c 20 63 73 72 57 72 69 74 65 2c  Rowid, csrWrite,
147f0 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 73 71   regRowid);.  sq
14800 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
14810 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 63 73  v, OP_Insert, cs
14820 72 57 72 69 74 65 2c 20 72 65 67 52 65 63 6f 72  rWrite, regRecor
14830 64 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  d, regRowid);.  
14840 61 64 64 72 4e 65 20 3d 20 73 71 6c 69 74 65 33  addrNe = sqlite3
14850 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
14860 5f 4e 65 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 4f  _Ne, pMWin->regO
14870 6e 65 2c 20 30 2c 20 72 65 67 52 6f 77 69 64 29  ne, 0, regRowid)
14880 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  ;.  VdbeCoverage
14890 28 76 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  (v);..  /* This 
148a0 62 6c 6f 63 6b 20 69 73 20 72 75 6e 20 66 6f 72  block is run for
148b0 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 20 6f   the first row o
148c0 66 20 65 61 63 68 20 70 61 72 74 69 74 69 6f 6e  f each partition
148d0 20 2a 2f 0a 20 20 73 2e 72 65 67 41 72 67 20 3d   */.  s.regArg =
148e0 20 77 69 6e 64 6f 77 49 6e 69 74 41 63 63 75 6d   windowInitAccum
148f0 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 29 3b  (pParse, pMWin);
14900 0a 0a 20 20 69 66 28 20 72 65 67 53 74 61 72 74  ..  if( regStart
14910 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
14920 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
14930 70 4d 57 69 6e 2d 3e 70 53 74 61 72 74 2c 20 72  pMWin->pStart, r
14940 65 67 53 74 61 72 74 29 3b 0a 20 20 20 20 77 69  egStart);.    wi
14950 6e 64 6f 77 43 68 65 63 6b 56 61 6c 75 65 28 70  ndowCheckValue(p
14960 50 61 72 73 65 2c 20 72 65 67 53 74 61 72 74 2c  Parse, regStart,
14970 20 30 20 2b 20 28 70 4d 57 69 6e 2d 3e 65 46 72   0 + (pMWin->eFr
14980 6d 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 20  mType==TK_RANGE 
14990 3f 20 33 20 3a 20 30 29 29 3b 0a 20 20 7d 0a 20  ? 3 : 0));.  }. 
149a0 20 69 66 28 20 72 65 67 45 6e 64 20 29 7b 0a 20   if( regEnd ){. 
149b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
149c0 64 65 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  de(pParse, pMWin
149d0 2d 3e 70 45 6e 64 2c 20 72 65 67 45 6e 64 29 3b  ->pEnd, regEnd);
149e0 0a 20 20 20 20 77 69 6e 64 6f 77 43 68 65 63 6b  .    windowCheck
149f0 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 72 65  Value(pParse, re
14a00 67 45 6e 64 2c 20 31 20 2b 20 28 70 4d 57 69 6e  gEnd, 1 + (pMWin
14a10 2d 3e 65 46 72 6d 54 79 70 65 3d 3d 54 4b 5f 52  ->eFrmType==TK_R
14a20 41 4e 47 45 20 3f 20 33 20 3a 20 30 29 29 3b 0a  ANGE ? 3 : 0));.
14a30 20 20 7d 0a 0a 20 20 69 66 28 20 70 4d 57 69 6e    }..  if( pMWin
14a40 2d 3e 65 53 74 61 72 74 3d 3d 70 4d 57 69 6e 2d  ->eStart==pMWin-
14a50 3e 65 45 6e 64 20 26 26 20 72 65 67 53 74 61 72  >eEnd && regStar
14a60 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20  t ){.    int op 
14a70 3d 20 28 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72  = ((pMWin->eStar
14a80 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 29  t==TK_FOLLOWING)
14a90 20 3f 20 4f 50 5f 47 65 20 3a 20 4f 50 5f 4c 65   ? OP_Ge : OP_Le
14aa0 29 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 47  );.    int addrG
14ab0 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  e = sqlite3VdbeA
14ac0 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72 65 67  ddOp3(v, op, reg
14ad0 53 74 61 72 74 2c 20 30 2c 20 72 65 67 45 6e 64  Start, 0, regEnd
14ae0 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
14af0 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65  age(v);.    Vdbe
14b00 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
14b10 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 56 64  ==OP_Ge);.    Vd
14b20 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
14b30 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20  op==OP_Le);.    
14b40 77 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 26  windowAggFinal(&
14b50 73 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  s, 0);.    sqlit
14b60 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14b70 4f 50 5f 52 65 77 69 6e 64 2c 20 73 2e 63 75 72  OP_Rewind, s.cur
14b80 72 65 6e 74 2e 63 73 72 2c 20 31 29 3b 0a 20 20  rent.csr, 1);.  
14b90 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65    VdbeCoverageNe
14ba0 76 65 72 54 61 6b 65 6e 28 76 29 3b 0a 20 20 20  verTaken(v);.   
14bb0 20 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65   windowReturnOne
14bc0 52 6f 77 28 26 73 29 3b 0a 20 20 20 20 73 71 6c  Row(&s);.    sql
14bd0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
14be0 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72  , OP_ResetSorter
14bf0 2c 20 73 2e 63 75 72 72 65 6e 74 2e 63 73 72 29  , s.current.csr)
14c00 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
14c10 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
14c20 74 6f 2c 20 30 2c 20 6c 62 6c 57 68 65 72 65 45  to, 0, lblWhereE
14c30 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  nd);.    sqlite3
14c40 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
14c50 61 64 64 72 47 65 29 3b 0a 20 20 7d 0a 20 20 69  addrGe);.  }.  i
14c60 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  f( pMWin->eStart
14c70 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 26  ==TK_FOLLOWING &
14c80 26 20 70 4d 57 69 6e 2d 3e 65 46 72 6d 54 79 70  & pMWin->eFrmTyp
14c90 65 21 3d 54 4b 5f 52 41 4e 47 45 20 26 26 20 72  e!=TK_RANGE && r
14ca0 65 67 45 6e 64 20 29 7b 0a 20 20 20 20 61 73 73  egEnd ){.    ass
14cb0 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64  ert( pMWin->eEnd
14cc0 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29  ==TK_FOLLOWING )
14cd0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
14ce0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75  eAddOp3(v, OP_Su
14cf0 62 74 72 61 63 74 2c 20 72 65 67 53 74 61 72 74  btract, regStart
14d00 2c 20 72 65 67 45 6e 64 2c 20 72 65 67 53 74 61  , regEnd, regSta
14d10 72 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  rt);.  }..  if( 
14d20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 21 3d 54  pMWin->eStart!=T
14d30 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20  K_UNBOUNDED ){. 
14d40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14d50 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
14d60 64 2c 20 73 2e 73 74 61 72 74 2e 63 73 72 2c 20  d, s.start.csr, 
14d70 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  1);.    VdbeCove
14d80 72 61 67 65 4e 65 76 65 72 54 61 6b 65 6e 28 76  rageNeverTaken(v
14d90 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
14da0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14db0 5f 52 65 77 69 6e 64 2c 20 73 2e 63 75 72 72 65  _Rewind, s.curre
14dc0 6e 74 2e 63 73 72 2c 20 31 29 3b 0a 20 20 56 64  nt.csr, 1);.  Vd
14dd0 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72 54  beCoverageNeverT
14de0 61 6b 65 6e 28 76 29 3b 0a 20 20 73 71 6c 69 74  aken(v);.  sqlit
14df0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14e00 4f 50 5f 52 65 77 69 6e 64 2c 20 73 2e 65 6e 64  OP_Rewind, s.end
14e10 2e 63 73 72 2c 20 31 29 3b 0a 20 20 56 64 62 65  .csr, 1);.  Vdbe
14e20 43 6f 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b  CoverageNeverTak
14e30 65 6e 28 76 29 3b 0a 20 20 69 66 28 20 72 65 67  en(v);.  if( reg
14e40 50 65 65 72 20 26 26 20 70 4f 72 64 65 72 42 79  Peer && pOrderBy
14e50 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
14e60 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
14e70 43 6f 70 79 2c 20 72 65 67 4e 65 77 50 65 65 72  Copy, regNewPeer
14e80 2c 20 72 65 67 50 65 65 72 2c 20 70 4f 72 64 65  , regPeer, pOrde
14e90 72 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20  rBy->nExpr-1);. 
14ea0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14eb0 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp3(v, OP_Copy,
14ec0 20 72 65 67 50 65 65 72 2c 20 73 2e 73 74 61 72   regPeer, s.star
14ed0 74 2e 72 65 67 2c 20 70 4f 72 64 65 72 42 79 2d  t.reg, pOrderBy-
14ee0 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 73  >nExpr-1);.    s
14ef0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
14f00 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67  (v, OP_Copy, reg
14f10 50 65 65 72 2c 20 73 2e 63 75 72 72 65 6e 74 2e  Peer, s.current.
14f20 72 65 67 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  reg, pOrderBy->n
14f30 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 73 71 6c  Expr-1);.    sql
14f40 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
14f50 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 50 65  , OP_Copy, regPe
14f60 65 72 2c 20 73 2e 65 6e 64 2e 72 65 67 2c 20 70  er, s.end.reg, p
14f70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31  OrderBy->nExpr-1
14f80 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
14f90 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14fa0 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 62 6c 57 68  P_Goto, 0, lblWh
14fb0 65 72 65 45 6e 64 29 3b 0a 0a 20 20 73 71 6c 69  ereEnd);..  sqli
14fc0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
14fd0 76 2c 20 61 64 64 72 4e 65 29 3b 0a 20 20 69 66  v, addrNe);.  if
14fe0 28 20 72 65 67 50 65 65 72 20 29 7b 0a 20 20 20  ( regPeer ){.   
14ff0 20 77 69 6e 64 6f 77 49 66 4e 65 77 50 65 65 72   windowIfNewPeer
15000 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
15010 79 2c 20 72 65 67 4e 65 77 50 65 65 72 2c 20 72  y, regNewPeer, r
15020 65 67 50 65 65 72 2c 20 6c 62 6c 57 68 65 72 65  egPeer, lblWhere
15030 45 6e 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  End);.  }.  if( 
15040 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
15050 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20  K_FOLLOWING ){. 
15060 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28     windowCodeOp(
15070 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 53 54  &s, WINDOW_AGGST
15080 45 50 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  EP, 0, 0);.    i
15090 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 21 3d  f( pMWin->eEnd!=
150a0 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a  TK_UNBOUNDED ){.
150b0 20 20 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d        if( pMWin-
150c0 3e 65 46 72 6d 54 79 70 65 3d 3d 54 4b 5f 52 41  >eFrmType==TK_RA
150d0 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69  NGE ){.        i
150e0 6e 74 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33  nt lbl = sqlite3
150f0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
15100 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69  arse);.        i
15110 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71  nt addrNext = sq
15120 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
15130 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20  Addr(v);.       
15140 20 77 69 6e 64 6f 77 43 6f 64 65 52 61 6e 67 65   windowCodeRange
15150 54 65 73 74 28 26 73 2c 20 4f 50 5f 47 65 2c 20  Test(&s, OP_Ge, 
15160 73 2e 63 75 72 72 65 6e 74 2e 63 73 72 2c 20 72  s.current.csr, r
15170 65 67 45 6e 64 2c 20 73 2e 65 6e 64 2e 63 73 72  egEnd, s.end.csr
15180 2c 20 6c 62 6c 29 3b 0a 20 20 20 20 20 20 20 20  , lbl);.        
15190 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c  windowCodeOp(&s,
151a0 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52   WINDOW_AGGINVER
151b0 53 45 2c 20 72 65 67 53 74 61 72 74 2c 20 30 29  SE, regStart, 0)
151c0 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77  ;.        window
151d0 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f  CodeOp(&s, WINDO
151e0 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 30 2c  W_RETURN_ROW, 0,
151f0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
15200 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15210 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
15220 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 20  drNext);.       
15230 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
15240 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29  lveLabel(v, lbl)
15250 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
15260 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64         windowCod
15270 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52  eOp(&s, WINDOW_R
15280 45 54 55 52 4e 5f 52 4f 57 2c 20 72 65 67 45 6e  ETURN_ROW, regEn
15290 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 77  d, 0);.        w
152a0 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20  indowCodeOp(&s, 
152b0 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53  WINDOW_AGGINVERS
152c0 45 2c 20 72 65 67 53 74 61 72 74 2c 20 30 29 3b  E, regStart, 0);
152d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
152e0 20 7d 65 6c 73 65 0a 20 20 69 66 28 20 70 4d 57   }else.  if( pMW
152f0 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52 45  in->eEnd==TK_PRE
15300 43 45 44 49 4e 47 20 29 7b 0a 20 20 20 20 77 69  CEDING ){.    wi
15310 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57  ndowCodeOp(&s, W
15320 49 4e 44 4f 57 5f 41 47 47 53 54 45 50 2c 20 72  INDOW_AGGSTEP, r
15330 65 67 45 6e 64 2c 20 30 29 3b 0a 20 20 20 20 77  egEnd, 0);.    w
15340 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20  indowCodeOp(&s, 
15350 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f  WINDOW_RETURN_RO
15360 57 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 77 69  W, 0, 0);.    wi
15370 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57  ndowCodeOp(&s, W
15380 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45  INDOW_AGGINVERSE
15390 2c 20 72 65 67 53 74 61 72 74 2c 20 30 29 3b 0a  , regStart, 0);.
153a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
153b0 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 77   addr = 0;.    w
153c0 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20  indowCodeOp(&s, 
153d0 57 49 4e 44 4f 57 5f 41 47 47 53 54 45 50 2c 20  WINDOW_AGGSTEP, 
153e0 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
153f0 4d 57 69 6e 2d 3e 65 45 6e 64 21 3d 54 4b 5f 55  MWin->eEnd!=TK_U
15400 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20 20  NBOUNDED ){.    
15410 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 46 72    if( pMWin->eFr
15420 6d 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 20  mType==TK_RANGE 
15430 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c  ){.        int l
15440 62 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  bl = 0;.        
15450 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
15460 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
15470 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65  ;.        if( re
15480 67 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20  gEnd ){.        
15490 20 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33 56    lbl = sqlite3V
154a0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
154b0 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rse);.          
154c0 77 69 6e 64 6f 77 43 6f 64 65 52 61 6e 67 65 54  windowCodeRangeT
154d0 65 73 74 28 26 73 2c 20 4f 50 5f 47 65 2c 20 73  est(&s, OP_Ge, s
154e0 2e 63 75 72 72 65 6e 74 2e 63 73 72 2c 20 72 65  .current.csr, re
154f0 67 45 6e 64 2c 20 73 2e 65 6e 64 2e 63 73 72 2c  gEnd, s.end.csr,
15500 20 6c 62 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d   lbl);.        }
15510 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43  .        windowC
15520 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57  odeOp(&s, WINDOW
15530 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 30 2c 20  _RETURN_ROW, 0, 
15540 30 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 64  0);.        wind
15550 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e  owCodeOp(&s, WIN
15560 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 2c 20  DOW_AGGINVERSE, 
15570 72 65 67 53 74 61 72 74 2c 20 30 29 3b 0a 20 20  regStart, 0);.  
15580 20 20 20 20 20 20 69 66 28 20 72 65 67 45 6e 64        if( regEnd
15590 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
155a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
155b0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
155c0 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ddr);.          
155d0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
155e0 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b  veLabel(v, lbl);
155f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15600 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15610 69 66 28 20 72 65 67 45 6e 64 20 29 7b 0a 20 20  if( regEnd ){.  
15620 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73          addr = s
15630 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
15640 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 72 65  (v, OP_IfPos, re
15650 67 45 6e 64 2c 20 30 2c 20 31 29 3b 0a 20 20 20  gEnd, 0, 1);.   
15660 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
15670 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
15680 7d 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77  }.        window
15690 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f  CodeOp(&s, WINDO
156a0 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 30 2c  W_RETURN_ROW, 0,
156b0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e   0);.        win
156c0 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49  dowCodeOp(&s, WI
156d0 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 2c  NDOW_AGGINVERSE,
156e0 20 72 65 67 53 74 61 72 74 2c 20 30 29 3b 0a 20   regStart, 0);. 
156f0 20 20 20 20 20 20 20 69 66 28 20 72 65 67 45 6e         if( regEn
15700 64 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  d ) sqlite3VdbeJ
15710 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
15720 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15730 20 20 7d 0a 0a 20 20 2f 2a 20 45 6e 64 20 6f 66    }..  /* End of
15740 20 74 68 65 20 6d 61 69 6e 20 69 6e 70 75 74 20   the main input 
15750 6c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65  loop */.  sqlite
15760 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
15770 6c 28 76 2c 20 6c 62 6c 57 68 65 72 65 45 6e 64  l(v, lblWhereEnd
15780 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72  );.  sqlite3Wher
15790 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a 20  eEnd(pWInfo);.. 
157a0 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
157b0 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d   */.  if( pMWin-
157c0 3e 70 50 61 72 74 69 74 69 6f 6e 20 29 7b 0a 20  >pPartition ){. 
157d0 20 20 20 61 64 64 72 49 6e 74 65 67 65 72 20 3d     addrInteger =
157e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
157f0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
15800 2c 20 30 2c 20 72 65 67 46 6c 75 73 68 50 61 72  , 0, regFlushPar
15810 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
15820 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
15830 64 64 72 47 6f 73 75 62 46 6c 75 73 68 29 3b 0a  ddrGosubFlush);.
15840 20 20 7d 0a 0a 20 20 61 64 64 72 45 6d 70 74 79    }..  addrEmpty
15850 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
15860 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp1(v, OP_Rewin
15870 64 2c 20 63 73 72 57 72 69 74 65 29 3b 0a 20 20  d, csrWrite);.  
15880 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
15890 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45  .  if( pMWin->eE
158a0 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47  nd==TK_PRECEDING
158b0 20 29 7b 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f   ){.    windowCo
158c0 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f  deOp(&s, WINDOW_
158d0 41 47 47 53 54 45 50 2c 20 72 65 67 45 6e 64 2c  AGGSTEP, regEnd,
158e0 20 30 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43   0);.    windowC
158f0 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57  odeOp(&s, WINDOW
15900 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 30 2c 20  _RETURN_ROW, 0, 
15910 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  0);.  }else if( 
15920 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
15930 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20  K_FOLLOWING ){. 
15940 20 20 20 69 6e 74 20 61 64 64 72 53 74 61 72 74     int addrStart
15950 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 42 72  ;.    int addrBr
15960 65 61 6b 31 3b 0a 20 20 20 20 69 6e 74 20 61 64  eak1;.    int ad
15970 64 72 42 72 65 61 6b 32 3b 0a 20 20 20 20 69 6e  drBreak2;.    in
15980 74 20 61 64 64 72 42 72 65 61 6b 33 3b 0a 20 20  t addrBreak3;.  
15990 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26    windowCodeOp(&
159a0 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 53 54 45  s, WINDOW_AGGSTE
159b0 50 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  P, 0, 0);.    if
159c0 28 20 70 4d 57 69 6e 2d 3e 65 46 72 6d 54 79 70  ( pMWin->eFrmTyp
159d0 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 29 7b 0a 20  e==TK_RANGE ){. 
159e0 20 20 20 20 20 61 64 64 72 53 74 61 72 74 20 3d       addrStart =
159f0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
15a00 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
15a10 20 20 61 64 64 72 42 72 65 61 6b 32 20 3d 20 77    addrBreak2 = w
15a20 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20  indowCodeOp(&s, 
15a30 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53  WINDOW_AGGINVERS
15a40 45 2c 20 72 65 67 53 74 61 72 74 2c 20 31 29 3b  E, regStart, 1);
15a50 0a 20 20 20 20 20 20 61 64 64 72 42 72 65 61 6b  .      addrBreak
15a60 31 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70  1 = windowCodeOp
15a70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55  (&s, WINDOW_RETU
15a80 52 4e 5f 52 4f 57 2c 20 30 2c 20 31 29 3b 0a 20  RN_ROW, 0, 1);. 
15a90 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 69 66 28     }else.    if(
15aa0 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b   pMWin->eEnd==TK
15ab0 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20  _UNBOUNDED ){.  
15ac0 20 20 20 20 61 64 64 72 53 74 61 72 74 20 3d 20      addrStart = 
15ad0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
15ae0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
15af0 20 61 64 64 72 42 72 65 61 6b 31 20 3d 20 77 69   addrBreak1 = wi
15b00 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57  ndowCodeOp(&s, W
15b10 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57  INDOW_RETURN_ROW
15b20 2c 20 72 65 67 53 74 61 72 74 2c 20 31 29 3b 0a  , regStart, 1);.
15b30 20 20 20 20 20 20 61 64 64 72 42 72 65 61 6b 32        addrBreak2
15b40 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28   = windowCodeOp(
15b50 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e  &s, WINDOW_AGGIN
15b60 56 45 52 53 45 2c 20 30 2c 20 31 29 3b 0a 20 20  VERSE, 0, 1);.  
15b70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
15b80 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 45  ssert( pMWin->eE
15b90 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  nd==TK_FOLLOWING
15ba0 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53 74   );.      addrSt
15bb0 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
15bc0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
15bd0 0a 20 20 20 20 20 20 61 64 64 72 42 72 65 61 6b  .      addrBreak
15be0 31 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70  1 = windowCodeOp
15bf0 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55  (&s, WINDOW_RETU
15c00 52 4e 5f 52 4f 57 2c 20 72 65 67 45 6e 64 2c 20  RN_ROW, regEnd, 
15c10 31 29 3b 0a 20 20 20 20 20 20 61 64 64 72 42 72  1);.      addrBr
15c20 65 61 6b 32 20 3d 20 77 69 6e 64 6f 77 43 6f 64  eak2 = windowCod
15c30 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41  eOp(&s, WINDOW_A
15c40 47 47 49 4e 56 45 52 53 45 2c 20 72 65 67 53 74  GGINVERSE, regSt
15c50 61 72 74 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  art, 1);.    }. 
15c60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15c70 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
15c80 20 30 2c 20 61 64 64 72 53 74 61 72 74 29 3b 0a   0, addrStart);.
15c90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
15ca0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 42  umpHere(v, addrB
15cb0 72 65 61 6b 32 29 3b 0a 20 20 20 20 61 64 64 72  reak2);.    addr
15cc0 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
15cd0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
15ce0 29 3b 0a 20 20 20 20 61 64 64 72 42 72 65 61 6b  );.    addrBreak
15cf0 33 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70  3 = windowCodeOp
15d00 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55  (&s, WINDOW_RETU
15d10 52 4e 5f 52 4f 57 2c 20 30 2c 20 31 29 3b 0a 20  RN_ROW, 0, 1);. 
15d20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15d30 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
15d40 20 30 2c 20 61 64 64 72 53 74 61 72 74 29 3b 0a   0, addrStart);.
15d50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
15d60 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 42  umpHere(v, addrB
15d70 72 65 61 6b 31 29 3b 0a 20 20 20 20 73 71 6c 69  reak1);.    sqli
15d80 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
15d90 76 2c 20 61 64 64 72 42 72 65 61 6b 33 29 3b 0a  v, addrBreak3);.
15da0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
15db0 20 61 64 64 72 42 72 65 61 6b 3b 0a 20 20 20 20   addrBreak;.    
15dc0 69 6e 74 20 61 64 64 72 53 74 61 72 74 3b 0a 20  int addrStart;. 
15dd0 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28     windowCodeOp(
15de0 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 53 54  &s, WINDOW_AGGST
15df0 45 50 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 61  EP, 0, 0);.    a
15e00 64 64 72 53 74 61 72 74 20 3d 20 73 71 6c 69 74  ddrStart = sqlit
15e10 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
15e20 72 28 76 29 3b 0a 20 20 20 20 61 64 64 72 42 72  r(v);.    addrBr
15e30 65 61 6b 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65  eak = windowCode
15e40 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45  Op(&s, WINDOW_RE
15e50 54 55 52 4e 5f 52 4f 57 2c 20 30 2c 20 31 29 3b  TURN_ROW, 0, 1);
15e60 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f  .    windowCodeO
15e70 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47  p(&s, WINDOW_AGG
15e80 49 4e 56 45 52 53 45 2c 20 72 65 67 53 74 61 72  INVERSE, regStar
15e90 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 0);.    sqlit
15ea0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15eb0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
15ec0 53 74 61 72 74 29 3b 0a 20 20 20 20 73 71 6c 69  Start);.    sqli
15ed0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
15ee0 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20  v, addrBreak);. 
15ef0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
15f00 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
15f10 45 6d 70 74 79 29 3b 0a 0a 20 20 73 71 6c 69 74  Empty);..  sqlit
15f20 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
15f30 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20  OP_ResetSorter, 
15f40 73 2e 63 75 72 72 65 6e 74 2e 63 73 72 29 3b 0a  s.current.csr);.
15f50 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70 50 61    if( pMWin->pPa
15f60 72 74 69 74 69 6f 6e 20 29 7b 0a 20 20 20 20 69  rtition ){.    i
15f70 66 28 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61  f( pMWin->regSta
15f80 72 74 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  rtRowid ){.     
15f90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15fa0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
15fb0 2c 20 31 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 53  , 1, pMWin->regS
15fc0 74 61 72 74 52 6f 77 69 64 29 3b 0a 20 20 20 20  tartRowid);.    
15fd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15fe0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
15ff0 72 2c 20 30 2c 20 70 4d 57 69 6e 2d 3e 72 65 67  r, 0, pMWin->reg
16000 45 6e 64 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d  EndRowid);.    }
16010 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16020 43 68 61 6e 67 65 50 31 28 76 2c 20 61 64 64 72  ChangeP1(v, addr
16030 49 6e 74 65 67 65 72 2c 20 73 71 6c 69 74 65 33  Integer, sqlite3
16040 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
16050 76 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  v));.    sqlite3
16060 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
16070 5f 52 65 74 75 72 6e 2c 20 72 65 67 46 6c 75 73  _Return, regFlus
16080 68 50 61 72 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  hPart);.  }.}..#
16090 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
160a0 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20  OMIT_WINDOWFUNC 
160b0 2a 2f 0a                                         */.