/ Hex Artifact Content
Login

Artifact 2e3fdb046dfe32a0a30855b952152ea8f1cb5cffdccb2b9d6845ca1f3a4d3bdc:


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 54 79 70 65 3d 3d 30 20 29 7b  Win->eType==0 ){
50d0: 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a 70 20 3d  .    Window *p =
50e0: 20 77 69 6e 64 6f 77 46 69 6e 64 28 70 50 61 72   windowFind(pPar
50f0: 73 65 2c 20 70 4c 69 73 74 2c 20 70 57 69 6e 2d  se, pList, pWin-
5100: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  >zName);.    if(
5110: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
5120: 20 20 20 20 70 57 69 6e 2d 3e 70 50 61 72 74 69      pWin->pParti
5130: 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78  tion = sqlite3Ex
5140: 70 72 4c 69 73 74 44 75 70 28 70 50 61 72 73 65  prListDup(pParse
5150: 2d 3e 64 62 2c 20 70 2d 3e 70 50 61 72 74 69 74  ->db, p->pPartit
5160: 69 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 70 57 69  ion, 0);.    pWi
5170: 6e 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71  n->pOrderBy = sq
5180: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
5190: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e  (pParse->db, p->
51a0: 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 20 20  pOrderBy, 0);.  
51b0: 20 20 70 57 69 6e 2d 3e 70 53 74 61 72 74 20 3d    pWin->pStart =
51c0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
51d0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70  pParse->db, p->p
51e0: 53 74 61 72 74 2c 20 30 29 3b 0a 20 20 20 20 70  Start, 0);.    p
51f0: 57 69 6e 2d 3e 70 45 6e 64 20 3d 20 73 71 6c 69  Win->pEnd = sqli
5200: 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73  te3ExprDup(pPars
5210: 65 2d 3e 64 62 2c 20 70 2d 3e 70 45 6e 64 2c 20  e->db, p->pEnd, 
5220: 30 29 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 65 53  0);.    pWin->eS
5230: 74 61 72 74 20 3d 20 70 2d 3e 65 53 74 61 72 74  tart = p->eStart
5240: 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 65 45 6e 64  ;.    pWin->eEnd
5250: 20 3d 20 70 2d 3e 65 45 6e 64 3b 0a 20 20 20 20   = p->eEnd;.    
5260: 70 57 69 6e 2d 3e 65 54 79 70 65 20 3d 20 70 2d  pWin->eType = p-
5270: 3e 65 54 79 70 65 3b 0a 20 20 20 20 70 57 69 6e  >eType;.    pWin
5280: 2d 3e 65 45 78 63 6c 75 64 65 20 3d 20 70 2d 3e  ->eExclude = p->
5290: 65 45 78 63 6c 75 64 65 3b 0a 20 20 7d 65 6c 73  eExclude;.  }els
52a0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 69  e{.    sqlite3Wi
52b0: 6e 64 6f 77 43 68 61 69 6e 28 70 50 61 72 73 65  ndowChain(pParse
52c0: 2c 20 70 57 69 6e 2c 20 70 4c 69 73 74 29 3b 0a  , pWin, pList);.
52d0: 20 20 7d 0a 20 20 69 66 28 20 28 70 57 69 6e 2d    }.  if( (pWin-
52e0: 3e 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45  >eType==TK_RANGE
52f0: 29 0a 20 20 20 26 26 20 28 70 57 69 6e 2d 3e 70  ).   && (pWin->p
5300: 53 74 61 72 74 20 7c 7c 20 70 57 69 6e 2d 3e 70  Start || pWin->p
5310: 45 6e 64 29 20 0a 20 20 20 26 26 20 28 70 57 69  End) .   && (pWi
5320: 6e 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c  n->pOrderBy==0 |
5330: 7c 20 70 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79  | pWin->pOrderBy
5340: 2d 3e 6e 45 78 70 72 21 3d 31 29 0a 20 20 29 7b  ->nExpr!=1).  ){
5350: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
5360: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
5370: 20 20 20 20 22 52 41 4e 47 45 20 77 69 74 68 20      "RANGE with 
5380: 6f 66 66 73 65 74 20 50 52 45 43 45 44 49 4e 47  offset PRECEDING
5390: 2f 46 4f 4c 4c 4f 57 49 4e 47 20 72 65 71 75 69  /FOLLOWING requi
53a0: 72 65 73 20 6f 6e 65 20 4f 52 44 45 52 20 42 59  res one ORDER BY
53b0: 20 65 78 70 72 65 73 73 69 6f 6e 22 0a 20 20 20   expression".   
53c0: 20 29 3b 0a 20 20 7d 65 6c 73 65 0a 20 20 69 66   );.  }else.  if
53d0: 28 20 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61  ( pFunc->funcFla
53e0: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
53f0: 5f 57 49 4e 44 4f 57 20 29 7b 0a 20 20 20 20 73  _WINDOW ){.    s
5400: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
5410: 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28  rse->db;.    if(
5420: 20 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72 20 29   pWin->pFilter )
5430: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
5440: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
5450: 0a 20 20 20 20 20 20 20 20 20 20 22 46 49 4c 54  .          "FILT
5460: 45 52 20 63 6c 61 75 73 65 20 6d 61 79 20 6f 6e  ER clause may on
5470: 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ly be used with 
5480: 61 67 67 72 65 67 61 74 65 20 77 69 6e 64 6f 77  aggregate window
5490: 20 66 75 6e 63 74 69 6f 6e 73 22 0a 20 20 20 20   functions".    
54a0: 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a    );.    }else{.
54b0: 20 20 20 20 20 20 73 74 72 75 63 74 20 57 69 6e        struct Win
54c0: 64 6f 77 55 70 64 61 74 65 20 7b 0a 20 20 20 20  dowUpdate {.    
54d0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
54e0: 7a 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 69  zFunc;.        i
54f0: 6e 74 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20  nt eType;.      
5500: 20 20 69 6e 74 20 65 53 74 61 72 74 3b 0a 20 20    int eStart;.  
5510: 20 20 20 20 20 20 69 6e 74 20 65 45 6e 64 3b 0a        int eEnd;.
5520: 20 20 20 20 20 20 7d 20 61 55 70 5b 5d 20 3d 20        } aUp[] = 
5530: 7b 0a 20 20 20 20 20 20 20 20 7b 20 72 6f 77 5f  {.        { row_
5540: 6e 75 6d 62 65 72 4e 61 6d 65 2c 20 20 20 54 4b  numberName,   TK
5550: 5f 52 4f 57 53 2c 20 20 20 54 4b 5f 55 4e 42 4f  _ROWS,   TK_UNBO
5560: 55 4e 44 45 44 2c 20 54 4b 5f 43 55 52 52 45 4e  UNDED, TK_CURREN
5570: 54 20 7d 2c 20 0a 20 20 20 20 20 20 20 20 7b 20  T }, .        { 
5580: 64 65 6e 73 65 5f 72 61 6e 6b 4e 61 6d 65 2c 20  dense_rankName, 
5590: 20 20 54 4b 5f 52 41 4e 47 45 2c 20 20 54 4b 5f    TK_RANGE,  TK_
55a0: 55 4e 42 4f 55 4e 44 45 44 2c 20 54 4b 5f 43 55  UNBOUNDED, TK_CU
55b0: 52 52 45 4e 54 20 7d 2c 20 0a 20 20 20 20 20 20  RRENT }, .      
55c0: 20 20 7b 20 72 61 6e 6b 4e 61 6d 65 2c 20 20 20    { rankName,   
55d0: 20 20 20 20 20 20 54 4b 5f 52 41 4e 47 45 2c 20        TK_RANGE, 
55e0: 20 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 2c 20 54   TK_UNBOUNDED, T
55f0: 4b 5f 43 55 52 52 45 4e 54 20 7d 2c 20 0a 20 20  K_CURRENT }, .  
5600: 20 20 20 20 20 20 7b 20 70 65 72 63 65 6e 74 5f        { percent_
5610: 72 61 6e 6b 4e 61 6d 65 2c 20 54 4b 5f 47 52 4f  rankName, TK_GRO
5620: 55 50 53 2c 20 54 4b 5f 43 55 52 52 45 4e 54 2c  UPS, TK_CURRENT,
5630: 20 20 20 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20     TK_UNBOUNDED 
5640: 7d 2c 20 0a 20 20 20 20 20 20 20 20 7b 20 63 75  }, .        { cu
5650: 6d 65 5f 64 69 73 74 4e 61 6d 65 2c 20 20 20 20  me_distName,    
5660: 54 4b 5f 47 52 4f 55 50 53 2c 20 54 4b 5f 46 4f  TK_GROUPS, TK_FO
5670: 4c 4c 4f 57 49 4e 47 2c 20 54 4b 5f 55 4e 42 4f  LLOWING, TK_UNBO
5680: 55 4e 44 45 44 20 7d 2c 20 0a 20 20 20 20 20 20  UNDED }, .      
5690: 20 20 7b 20 6e 74 69 6c 65 4e 61 6d 65 2c 20 20    { ntileName,  
56a0: 20 20 20 20 20 20 54 4b 5f 52 4f 57 53 2c 20 20        TK_ROWS,  
56b0: 20 54 4b 5f 43 55 52 52 45 4e 54 2c 20 20 20 54   TK_CURRENT,   T
56c0: 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 7d 2c 20 0a  K_UNBOUNDED }, .
56d0: 20 20 20 20 20 20 20 20 7b 20 6c 65 61 64 4e 61          { leadNa
56e0: 6d 65 2c 20 20 20 20 20 20 20 20 20 54 4b 5f 52  me,         TK_R
56f0: 4f 57 53 2c 20 20 20 54 4b 5f 55 4e 42 4f 55 4e  OWS,   TK_UNBOUN
5700: 44 45 44 2c 20 54 4b 5f 55 4e 42 4f 55 4e 44 45  DED, TK_UNBOUNDE
5710: 44 20 7d 2c 20 0a 20 20 20 20 20 20 20 20 7b 20  D }, .        { 
5720: 6c 61 67 4e 61 6d 65 2c 20 20 20 20 20 20 20 20  lagName,        
5730: 20 20 54 4b 5f 52 4f 57 53 2c 20 20 20 54 4b 5f    TK_ROWS,   TK_
5740: 55 4e 42 4f 55 4e 44 45 44 2c 20 54 4b 5f 43 55  UNBOUNDED, TK_CU
5750: 52 52 45 4e 54 20 7d 2c 20 0a 20 20 20 20 20 20  RRENT }, .      
5760: 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  };.      int i;.
5770: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
5780: 3c 41 72 72 61 79 53 69 7a 65 28 61 55 70 29 3b  <ArraySize(aUp);
5790: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
57a0: 66 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d  f( pFunc->zName=
57b0: 3d 61 55 70 5b 69 5d 2e 7a 46 75 6e 63 20 29 7b  =aUp[i].zFunc ){
57c0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
57d0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
57e0: 20 70 57 69 6e 2d 3e 70 53 74 61 72 74 29 3b 0a   pWin->pStart);.
57f0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
5800: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
5810: 70 57 69 6e 2d 3e 70 45 6e 64 29 3b 0a 20 20 20  pWin->pEnd);.   
5820: 20 20 20 20 20 20 20 70 57 69 6e 2d 3e 70 45 6e         pWin->pEn
5830: 64 20 3d 20 70 57 69 6e 2d 3e 70 53 74 61 72 74  d = pWin->pStart
5840: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
5850: 70 57 69 6e 2d 3e 65 54 79 70 65 20 3d 20 61 55  pWin->eType = aU
5860: 70 5b 69 5d 2e 65 54 79 70 65 3b 0a 20 20 20 20  p[i].eType;.    
5870: 20 20 20 20 20 20 70 57 69 6e 2d 3e 65 53 74 61        pWin->eSta
5880: 72 74 20 3d 20 61 55 70 5b 69 5d 2e 65 53 74 61  rt = aUp[i].eSta
5890: 72 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 57  rt;.          pW
58a0: 69 6e 2d 3e 65 45 6e 64 20 3d 20 61 55 70 5b 69  in->eEnd = aUp[i
58b0: 5d 2e 65 45 6e 64 3b 0a 20 20 20 20 20 20 20 20  ].eEnd;.        
58c0: 20 20 70 57 69 6e 2d 3e 65 45 78 63 6c 75 64 65    pWin->eExclude
58d0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
58e0: 69 66 28 20 70 57 69 6e 2d 3e 65 53 74 61 72 74  if( pWin->eStart
58f0: 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29  ==TK_FOLLOWING )
5900: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 57  {.            pW
5910: 69 6e 2d 3e 70 53 74 61 72 74 20 3d 20 73 71 6c  in->pStart = sql
5920: 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
5930: 49 4e 54 45 47 45 52 2c 20 22 31 22 29 3b 0a 20  INTEGER, "1");. 
5940: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
5950: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5960: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
5970: 20 20 7d 0a 20 20 7d 0a 20 20 70 57 69 6e 2d 3e    }.  }.  pWin->
5980: 70 46 75 6e 63 20 3d 20 70 46 75 6e 63 3b 0a 7d  pFunc = pFunc;.}
5990: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65 78 74 20  ../*.** Context 
59a0: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 74 68  object passed th
59b0: 72 6f 75 67 68 20 73 71 6c 69 74 65 33 57 61 6c  rough sqlite3Wal
59c0: 6b 45 78 70 72 4c 69 73 74 28 29 20 74 6f 0a 2a  kExprList() to.*
59d0: 2a 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65  * selectWindowRe
59e0: 77 72 69 74 65 45 78 70 72 43 62 28 29 20 62 79  writeExprCb() by
59f0: 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77   selectWindowRew
5a00: 72 69 74 65 45 4c 69 73 74 28 29 2e 0a 2a 2f 0a  riteEList()..*/.
5a10: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57  typedef struct W
5a20: 69 6e 64 6f 77 52 65 77 72 69 74 65 20 57 69 6e  indowRewrite Win
5a30: 64 6f 77 52 65 77 72 69 74 65 3b 0a 73 74 72 75  dowRewrite;.stru
5a40: 63 74 20 57 69 6e 64 6f 77 52 65 77 72 69 74 65  ct WindowRewrite
5a50: 20 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69   {.  Window *pWi
5a60: 6e 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  n;.  SrcList *pS
5a70: 72 63 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  rc;.  ExprList *
5a80: 70 53 75 62 3b 0a 20 20 53 65 6c 65 63 74 20 2a  pSub;.  Select *
5a90: 70 53 75 62 53 65 6c 65 63 74 3b 20 20 20 20 20  pSubSelect;     
5aa0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
5ab0: 6e 74 20 73 75 62 2d 73 65 6c 65 63 74 2c 20 69  nt sub-select, i
5ac0: 66 20 61 6e 79 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  f any */.};../*.
5ad0: 2a 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63  ** Callback func
5ae0: 74 69 6f 6e 20 75 73 65 64 20 62 79 20 73 65 6c  tion used by sel
5af0: 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65  ectWindowRewrite
5b00: 45 4c 69 73 74 28 29 2e 20 49 66 20 6e 65 63 65  EList(). If nece
5b10: 73 73 61 72 79 2c 0a 2a 2a 20 74 68 69 73 20 66  ssary,.** this f
5b20: 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20  unction appends 
5b30: 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 65 78  to the output ex
5b40: 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 61 6e  pression-list an
5b50: 64 20 75 70 64 61 74 65 73 20 0a 2a 2a 20 65 78  d updates .** ex
5b60: 70 72 65 73 73 69 6f 6e 20 28 2a 70 70 45 78 70  pression (*ppExp
5b70: 72 29 20 69 6e 20 70 6c 61 63 65 2e 0a 2a 2f 0a  r) in place..*/.
5b80: 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63  static int selec
5b90: 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65 45 78  tWindowRewriteEx
5ba0: 70 72 43 62 28 57 61 6c 6b 65 72 20 2a 70 57 61  prCb(Walker *pWa
5bb0: 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
5bc0: 72 29 7b 0a 20 20 73 74 72 75 63 74 20 57 69 6e  r){.  struct Win
5bd0: 64 6f 77 52 65 77 72 69 74 65 20 2a 70 20 3d 20  dowRewrite *p = 
5be0: 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 52 65 77 72  pWalker->u.pRewr
5bf0: 69 74 65 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  ite;.  Parse *pP
5c00: 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
5c10: 70 50 61 72 73 65 3b 0a 0a 20 20 2f 2a 20 49 66  pParse;..  /* If
5c20: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
5c30: 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66  s being called f
5c40: 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 73 63 61  rom within a sca
5c50: 6c 61 72 20 73 75 62 2d 73 65 6c 65 63 74 0a 20  lar sub-select. 
5c60: 20 2a 2a 20 74 68 61 74 20 75 73 65 64 20 62 79   ** that used by
5c70: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
5c80: 65 6d 65 6e 74 20 62 65 69 6e 67 20 70 72 6f 63  ement being proc
5c90: 65 73 73 65 64 2c 20 6f 6e 6c 79 20 70 72 6f 63  essed, only proc
5ca0: 65 73 73 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55  ess.  ** TK_COLU
5cb0: 4d 4e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  MN expressions t
5cc0: 68 61 74 20 72 65 66 65 72 20 74 6f 20 69 74 20  hat refer to it 
5cd0: 28 74 68 65 20 6f 75 74 65 72 20 53 45 4c 45 43  (the outer SELEC
5ce0: 54 29 2e 20 44 6f 0a 20 20 2a 2a 20 6e 6f 74 20  T). Do.  ** not 
5cf0: 70 72 6f 63 65 73 73 20 61 67 67 72 65 67 61 74  process aggregat
5d00: 65 73 20 6f 72 20 77 69 6e 64 6f 77 20 66 75 6e  es or window fun
5d10: 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 61  ctions at all, a
5d20: 73 20 74 68 65 79 20 62 65 6c 6f 6e 67 0a 20 20  s they belong.  
5d30: 2a 2a 20 74 6f 20 74 68 65 20 73 63 61 6c 61 72  ** to the scalar
5d40: 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 20 2a 2f   sub-select.  */
5d50: 0a 20 20 69 66 28 20 70 2d 3e 70 53 75 62 53 65  .  if( p->pSubSe
5d60: 6c 65 63 74 20 29 7b 0a 20 20 20 20 69 66 28 20  lect ){.    if( 
5d70: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  pExpr->op!=TK_CO
5d80: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 72 65  LUMN ){.      re
5d90: 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
5da0: 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
5db0: 20 20 20 20 69 6e 74 20 6e 53 72 63 20 3d 20 70      int nSrc = p
5dc0: 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 0a 20 20  ->pSrc->nSrc;.  
5dd0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
5de0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 72 63   for(i=0; i<nSrc
5df0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
5e00: 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  if( pExpr->iTabl
5e10: 65 3d 3d 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d  e==p->pSrc->a[i]
5e20: 2e 69 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b  .iCursor ) break
5e30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5e40: 69 66 28 20 69 3d 3d 6e 53 72 63 20 29 20 72 65  if( i==nSrc ) re
5e50: 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
5e60: 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  e;.    }.  }..  
5e70: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
5e80: 70 20 29 7b 0a 0a 20 20 20 20 63 61 73 65 20 54  p ){..    case T
5e90: 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  K_FUNCTION:.    
5ea0: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
5eb0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
5ec0: 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20 20 20  _WinFunc) ){.   
5ed0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5ee0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5ef0: 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20   Window *pWin;. 
5f00: 20 20 20 20 20 20 20 66 6f 72 28 70 57 69 6e 3d         for(pWin=
5f10: 70 2d 3e 70 57 69 6e 3b 20 70 57 69 6e 3b 20 70  p->pWin; pWin; p
5f20: 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57  Win=pWin->pNextW
5f30: 69 6e 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  in){.          i
5f40: 66 28 20 70 45 78 70 72 2d 3e 79 2e 70 57 69 6e  f( pExpr->y.pWin
5f50: 3d 3d 70 57 69 6e 20 29 7b 0a 20 20 20 20 20 20  ==pWin ){.      
5f60: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57        assert( pW
5f70: 69 6e 2d 3e 70 4f 77 6e 65 72 3d 3d 70 45 78 70  in->pOwner==pExp
5f80: 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r );.           
5f90: 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
5fa0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
5fb0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
5fc0: 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74  .      /* Fall t
5fd0: 68 72 6f 75 67 68 2e 20 20 2a 2f 0a 0a 20 20 20  hrough.  */..   
5fe0: 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
5ff0: 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20  CTION:.    case 
6000: 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
6010: 20 20 20 45 78 70 72 20 2a 70 44 75 70 20 3d 20     Expr *pDup = 
6020: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
6030: 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72  Parse->db, pExpr
6040: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  , 0);.      p->p
6050: 53 75 62 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Sub = sqlite3Exp
6060: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
6070: 73 65 2c 20 70 2d 3e 70 53 75 62 2c 20 70 44 75  se, p->pSub, pDu
6080: 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  p);.      if( p-
6090: 3e 70 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20  >pSub ){.       
60a0: 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
60b0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
60c0: 45 50 5f 53 74 61 74 69 63 29 3d 3d 30 20 29 3b  EP_Static)==0 );
60d0: 0a 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74  .        ExprSet
60e0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
60f0: 45 50 5f 53 74 61 74 69 63 29 3b 0a 20 20 20 20  EP_Static);.    
6100: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
6110: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
6120: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
6130: 20 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65    ExprClearPrope
6140: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 74  rty(pExpr, EP_St
6150: 61 74 69 63 29 3b 0a 20 20 20 20 20 20 20 20 6d  atic);.        m
6160: 65 6d 73 65 74 28 70 45 78 70 72 2c 20 30 2c 20  emset(pExpr, 0, 
6170: 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 0a  sizeof(Expr));..
6180: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
6190: 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20  p = TK_COLUMN;. 
61a0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
61b0: 6f 6c 75 6d 6e 20 3d 20 70 2d 3e 70 53 75 62 2d  olumn = p->pSub-
61c0: 3e 6e 45 78 70 72 2d 31 3b 0a 20 20 20 20 20 20  >nExpr-1;.      
61d0: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
61e0: 3d 20 70 2d 3e 70 57 69 6e 2d 3e 69 45 70 68 43  = p->pWin->iEphC
61f0: 73 72 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  sr;.      }..   
6200: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6210: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 2f 2a  .    default: /*
6220: 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20   no-op */.      
6230: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65  break;.  }..  re
6240: 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
6250: 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  e;.}.static int 
6260: 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72  selectWindowRewr
6270: 69 74 65 53 65 6c 65 63 74 43 62 28 57 61 6c 6b  iteSelectCb(Walk
6280: 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
6290: 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
62a0: 20 73 74 72 75 63 74 20 57 69 6e 64 6f 77 52 65   struct WindowRe
62b0: 77 72 69 74 65 20 2a 70 20 3d 20 70 57 61 6c 6b  write *p = pWalk
62c0: 65 72 2d 3e 75 2e 70 52 65 77 72 69 74 65 3b 0a  er->u.pRewrite;.
62d0: 20 20 53 65 6c 65 63 74 20 2a 70 53 61 76 65 20    Select *pSave 
62e0: 3d 20 70 2d 3e 70 53 75 62 53 65 6c 65 63 74 3b  = p->pSubSelect;
62f0: 0a 20 20 69 66 28 20 70 53 61 76 65 3d 3d 70 53  .  if( pSave==pS
6300: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 72 65 74  elect ){.    ret
6310: 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
6320: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
6330: 2d 3e 70 53 75 62 53 65 6c 65 63 74 20 3d 20 70  ->pSubSelect = p
6340: 53 65 6c 65 63 74 3b 0a 20 20 20 20 73 71 6c 69  Select;.    sqli
6350: 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
6360: 61 6c 6b 65 72 2c 20 70 53 65 6c 65 63 74 29 3b  alker, pSelect);
6370: 0a 20 20 20 20 70 2d 3e 70 53 75 62 53 65 6c 65  .    p->pSubSele
6380: 63 74 20 3d 20 70 53 61 76 65 3b 0a 20 20 7d 0a  ct = pSave;.  }.
6390: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
63a0: 6e 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 74  ne;.}.../*.** It
63b0: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 65 61  erate through ea
63c0: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ch expression in
63d0: 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74   expression-list
63e0: 20 70 45 4c 69 73 74 2e 20 46 6f 72 20 65 61 63   pEList. For eac
63f0: 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 4b 5f  h:.**.**   * TK_
6400: 43 4f 4c 55 4d 4e 2c 0a 2a 2a 20 20 20 2a 20 61  COLUMN,.**   * a
6410: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
6420: 6e 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 77 69 6e  n, or.**   * win
6430: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  dow function wit
6440: 68 20 61 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63  h a Window objec
6450: 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20  t that is not a 
6460: 6d 65 6d 62 65 72 20 6f 66 20 74 68 65 20 0a 2a  member of the .*
6470: 2a 20 20 20 20 20 57 69 6e 64 6f 77 20 6c 69 73  *     Window lis
6480: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
6490: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
64a0: 28 70 57 69 6e 29 2e 0a 2a 2a 0a 2a 2a 20 41 70  (pWin)..**.** Ap
64b0: 70 65 6e 64 20 74 68 65 20 6e 6f 64 65 20 74 6f  pend the node to
64c0: 20 6f 75 74 70 75 74 20 65 78 70 72 65 73 73 69   output expressi
64d0: 6f 6e 2d 6c 69 73 74 20 28 2a 70 70 53 75 62 29  on-list (*ppSub)
64e0: 2e 20 41 6e 64 20 72 65 70 6c 61 63 65 20 69 74  . And replace it
64f0: 0a 2a 2a 20 77 69 74 68 20 61 20 54 4b 5f 43 4f  .** with a TK_CO
6500: 4c 55 4d 4e 20 74 68 61 74 20 72 65 61 64 73 20  LUMN that reads 
6510: 74 68 65 20 28 4e 2d 31 29 74 68 20 65 6c 65 6d  the (N-1)th elem
6520: 65 6e 74 20 6f 66 20 74 61 62 6c 65 20 0a 2a 2a  ent of table .**
6530: 20 70 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20   pWin->iEphCsr, 
6540: 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e  where N is the n
6550: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
6560: 73 20 69 6e 20 28 2a 70 70 53 75 62 29 20 61 66  s in (*ppSub) af
6570: 74 65 72 0a 2a 2a 20 61 70 70 65 6e 64 69 6e 67  ter.** appending
6580: 20 74 68 65 20 6e 65 77 20 6f 6e 65 2e 0a 2a 2f   the new one..*/
6590: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c  .static void sel
65a0: 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65  ectWindowRewrite
65b0: 45 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  EList(.  Parse *
65c0: 70 50 61 72 73 65 2c 20 0a 20 20 57 69 6e 64 6f  pParse, .  Windo
65d0: 77 20 2a 70 57 69 6e 2c 0a 20 20 53 72 63 4c 69  w *pWin,.  SrcLi
65e0: 73 74 20 2a 70 53 72 63 2c 0a 20 20 45 78 70 72  st *pSrc,.  Expr
65f0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20  List *pEList,   
6600: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
6610: 65 77 72 69 74 65 20 65 78 70 72 65 73 73 69 6f  ewrite expressio
6620: 6e 73 20 69 6e 20 74 68 69 73 20 6c 69 73 74 20  ns in this list 
6630: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 2a  */.  ExprList **
6640: 70 70 53 75 62 20 20 20 20 20 20 20 20 20 20 20  ppSub           
6650: 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
6660: 53 75 62 2d 73 65 6c 65 63 74 20 65 78 70 72 65  Sub-select expre
6670: 73 73 69 6f 6e 2d 6c 69 73 74 20 2a 2f 0a 29 7b  ssion-list */.){
6680: 0a 20 20 57 61 6c 6b 65 72 20 73 57 61 6c 6b 65  .  Walker sWalke
6690: 72 3b 0a 20 20 57 69 6e 64 6f 77 52 65 77 72 69  r;.  WindowRewri
66a0: 74 65 20 73 52 65 77 72 69 74 65 3b 0a 0a 20 20  te sRewrite;..  
66b0: 6d 65 6d 73 65 74 28 26 73 57 61 6c 6b 65 72 2c  memset(&sWalker,
66c0: 20 30 2c 20 73 69 7a 65 6f 66 28 57 61 6c 6b 65   0, sizeof(Walke
66d0: 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  r));.  memset(&s
66e0: 52 65 77 72 69 74 65 2c 20 30 2c 20 73 69 7a 65  Rewrite, 0, size
66f0: 6f 66 28 57 69 6e 64 6f 77 52 65 77 72 69 74 65  of(WindowRewrite
6700: 29 29 3b 0a 0a 20 20 73 52 65 77 72 69 74 65 2e  ));..  sRewrite.
6710: 70 53 75 62 20 3d 20 2a 70 70 53 75 62 3b 0a 20  pSub = *ppSub;. 
6720: 20 73 52 65 77 72 69 74 65 2e 70 57 69 6e 20 3d   sRewrite.pWin =
6730: 20 70 57 69 6e 3b 0a 20 20 73 52 65 77 72 69 74   pWin;.  sRewrit
6740: 65 2e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 0a  e.pSrc = pSrc;..
6750: 20 20 73 57 61 6c 6b 65 72 2e 70 50 61 72 73 65    sWalker.pParse
6760: 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 57 61   = pParse;.  sWa
6770: 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61  lker.xExprCallba
6780: 63 6b 20 3d 20 73 65 6c 65 63 74 57 69 6e 64 6f  ck = selectWindo
6790: 77 52 65 77 72 69 74 65 45 78 70 72 43 62 3b 0a  wRewriteExprCb;.
67a0: 20 20 73 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63    sWalker.xSelec
67b0: 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65  tCallback = sele
67c0: 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65 53  ctWindowRewriteS
67d0: 65 6c 65 63 74 43 62 3b 0a 20 20 73 57 61 6c 6b  electCb;.  sWalk
67e0: 65 72 2e 75 2e 70 52 65 77 72 69 74 65 20 3d 20  er.u.pRewrite = 
67f0: 26 73 52 65 77 72 69 74 65 3b 0a 0a 20 20 28 76  &sRewrite;..  (v
6800: 6f 69 64 29 73 71 6c 69 74 65 33 57 61 6c 6b 45  oid)sqlite3WalkE
6810: 78 70 72 4c 69 73 74 28 26 73 57 61 6c 6b 65 72  xprList(&sWalker
6820: 2c 20 70 45 4c 69 73 74 29 3b 0a 0a 20 20 2a 70  , pEList);..  *p
6830: 70 53 75 62 20 3d 20 73 52 65 77 72 69 74 65 2e  pSub = sRewrite.
6840: 70 53 75 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  pSub;.}../*.** A
6850: 70 70 65 6e 64 20 61 20 63 6f 70 79 20 6f 66 20  ppend a copy of 
6860: 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20  each expression 
6870: 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69  in expression-li
6880: 73 74 20 70 41 70 70 65 6e 64 20 74 6f 0a 2a 2a  st pAppend to.**
6890: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
68a0: 20 70 4c 69 73 74 2e 20 52 65 74 75 72 6e 20 61   pList. Return a
68b0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
68c0: 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a 2a 2f 0a  result list..*/.
68d0: 73 74 61 74 69 63 20 45 78 70 72 4c 69 73 74 20  static ExprList 
68e0: 2a 65 78 70 72 4c 69 73 74 41 70 70 65 6e 64 4c  *exprListAppendL
68f0: 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ist(.  Parse *pP
6900: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
6910: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
6920: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
6930: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f  *pList,        /
6940: 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20  * List to which 
6950: 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74  to append. Might
6960: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
6970: 70 72 4c 69 73 74 20 2a 70 41 70 70 65 6e 64 20  prList *pAppend 
6980: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
6990: 20 76 61 6c 75 65 73 20 74 6f 20 61 70 70 65 6e   values to appen
69a0: 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  d. Might be NULL
69b0: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 41 70   */.){.  if( pAp
69c0: 70 65 6e 64 20 29 7b 0a 20 20 20 20 69 6e 74 20  pend ){.    int 
69d0: 69 3b 0a 20 20 20 20 69 6e 74 20 6e 49 6e 69 74  i;.    int nInit
69e0: 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74   = pList ? pList
69f0: 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20  ->nExpr : 0;.   
6a00: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 70 70   for(i=0; i<pApp
6a10: 65 6e 64 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  end->nExpr; i++)
6a20: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 44  {.      Expr *pD
6a30: 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  up = sqlite3Expr
6a40: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
6a50: 70 41 70 70 65 6e 64 2d 3e 61 5b 69 5d 2e 70 45  pAppend->a[i].pE
6a60: 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  xpr, 0);.      p
6a70: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
6a80: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
6a90: 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 44 75 70  rse, pList, pDup
6aa0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  );.      if( pLi
6ab0: 73 74 20 29 20 70 4c 69 73 74 2d 3e 61 5b 6e 49  st ) pList->a[nI
6ac0: 6e 69 74 2b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  nit+i].sortOrder
6ad0: 20 3d 20 70 41 70 70 65 6e 64 2d 3e 61 5b 69 5d   = pAppend->a[i]
6ae0: 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  .sortOrder;.    
6af0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
6b00: 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  List;.}../*.** I
6b10: 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
6b20: 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73  tement passed as
6b30: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
6b40: 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e  ment does not in
6b50: 76 6f 6b 65 0a 2a 2a 20 61 6e 79 20 53 51 4c 20  voke.** any SQL 
6b60: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73  window functions
6b70: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
6b80: 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65  is a no-op. Othe
6b90: 72 77 69 73 65 2c 20 69 74 20 0a 2a 2a 20 72 65  rwise, it .** re
6ba0: 77 72 69 74 65 73 20 74 68 65 20 53 45 4c 45 43  writes the SELEC
6bb0: 54 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74  T statement so t
6bc0: 68 61 74 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  hat window funct
6bd0: 69 6f 6e 20 78 53 74 65 70 20 66 75 6e 63 74 69  ion xStep functi
6be0: 6f 6e 73 0a 2a 2a 20 61 72 65 20 69 6e 76 6f 6b  ons.** are invok
6bf0: 65 64 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63  ed in the correc
6c00: 74 20 6f 72 64 65 72 20 61 73 20 64 65 73 63 72  t order as descr
6c10: 69 62 65 64 20 75 6e 64 65 72 20 22 53 45 4c 45  ibed under "SELE
6c20: 43 54 20 52 45 57 52 49 54 49 4e 47 22 0a 2a 2a  CT REWRITING".**
6c30: 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74   at the top of t
6c40: 68 69 73 20 66 69 6c 65 2e 0a 2a 2f 0a 69 6e 74  his file..*/.int
6c50: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 52 65   sqlite3WindowRe
6c60: 77 72 69 74 65 28 50 61 72 73 65 20 2a 70 50 61  write(Parse *pPa
6c70: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  rse, Select *p){
6c80: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
6c90: 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e  TE_OK;.  if( p->
6ca0: 70 57 69 6e 20 26 26 20 70 2d 3e 70 50 72 69 6f  pWin && p->pPrio
6cb0: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 56 64 62 65  r==0 ){.    Vdbe
6cc0: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
6cd0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
6ce0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
6cf0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20  pParse->db;.    
6d00: 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 30  Select *pSub = 0
6d10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
6d20: 20 54 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f   The subquery */
6d30: 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53  .    SrcList *pS
6d40: 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
6d50: 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 20 3d    Expr *pWhere =
6d60: 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20   p->pWhere;.    
6d70: 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70  ExprList *pGroup
6d80: 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
6d90: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 48 61 76  ;.    Expr *pHav
6da0: 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67  ing = p->pHaving
6db0: 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
6dc0: 70 53 6f 72 74 20 3d 20 30 3b 0a 0a 20 20 20 20  pSort = 0;..    
6dd0: 45 78 70 72 4c 69 73 74 20 2a 70 53 75 62 6c 69  ExprList *pSubli
6de0: 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  st = 0;       /*
6df0: 20 45 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   Expression list
6e00: 20 66 6f 72 20 73 75 62 2d 71 75 65 72 79 20 2a   for sub-query *
6e10: 2f 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a 70 4d  /.    Window *pM
6e20: 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b 20 20  Win = p->pWin;  
6e30: 20 20 20 20 2f 2a 20 4d 61 73 74 65 72 20 77 69      /* Master wi
6e40: 6e 64 6f 77 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ndow object */. 
6e50: 20 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b     Window *pWin;
6e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e70: 20 2f 2a 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63   /* Window objec
6e80: 74 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 0a 20  t iterator */.. 
6e90: 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a     p->pSrc = 0;.
6ea0: 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20      p->pWhere = 
6eb0: 30 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70  0;.    p->pGroup
6ec0: 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  By = 0;.    p->p
6ed0: 48 61 76 69 6e 67 20 3d 20 30 3b 0a 0a 20 20 20  Having = 0;..   
6ee0: 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 4f   /* Create the O
6ef0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66  RDER BY clause f
6f00: 6f 72 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63  or the sub-selec
6f10: 74 2e 20 54 68 69 73 20 69 73 20 74 68 65 20 63  t. This is the c
6f20: 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 0a 20 20 20  oncatenation.   
6f30: 20 2a 2a 20 6f 66 20 74 68 65 20 77 69 6e 64 6f   ** of the windo
6f40: 77 20 50 41 52 54 49 54 49 4f 4e 20 61 6e 64 20  w PARTITION and 
6f50: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73  ORDER BY clauses
6f60: 2e 20 54 68 65 6e 2c 20 69 66 20 74 68 69 73 20  . Then, if this 
6f70: 6d 61 6b 65 73 20 69 74 0a 20 20 20 20 2a 2a 20  makes it.    ** 
6f80: 72 65 64 75 6e 64 61 6e 74 2c 20 72 65 6d 6f 76  redundant, remov
6f90: 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 66  e the ORDER BY f
6fa0: 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 53  rom the parent S
6fb0: 45 4c 45 43 54 2e 20 20 2a 2f 0a 20 20 20 20 70  ELECT.  */.    p
6fc0: 53 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Sort = sqlite3Ex
6fd0: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4d  prListDup(db, pM
6fe0: 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c  Win->pPartition,
6ff0: 20 30 29 3b 0a 20 20 20 20 70 53 6f 72 74 20 3d   0);.    pSort =
7000: 20 65 78 70 72 4c 69 73 74 41 70 70 65 6e 64 4c   exprListAppendL
7010: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 6f 72  ist(pParse, pSor
7020: 74 2c 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72  t, pMWin->pOrder
7030: 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70 53 6f  By);.    if( pSo
7040: 72 74 20 26 26 20 70 2d 3e 70 4f 72 64 65 72 42  rt && p->pOrderB
7050: 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  y ){.      if( s
7060: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
7070: 6d 70 61 72 65 28 70 53 6f 72 74 2c 20 70 2d 3e  mpare(pSort, p->
7080: 70 4f 72 64 65 72 42 79 2c 20 2d 31 29 3d 3d 30  pOrderBy, -1)==0
7090: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
70a0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
70b0: 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
70c0: 79 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  y);.        p->p
70d0: 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
70e0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
70f0: 2f 2a 20 41 73 73 69 67 6e 20 61 20 63 75 72 73  /* Assign a curs
7100: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  or number for th
7110: 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  e ephemeral tabl
7120: 65 20 75 73 65 64 20 74 6f 20 62 75 66 66 65 72  e used to buffer
7130: 20 72 6f 77 73 2e 0a 20 20 20 20 2a 2a 20 54 68   rows..    ** Th
7140: 65 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  e OpenEphemeral 
7150: 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 63  instruction is c
7160: 6f 64 65 64 20 6c 61 74 65 72 2c 20 61 66 74 65  oded later, afte
7170: 72 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 68 6f  r it is known ho
7180: 77 0a 20 20 20 20 2a 2a 20 6d 61 6e 79 20 63 6f  w.    ** many co
7190: 6c 75 6d 6e 73 20 74 68 65 20 74 61 62 6c 65 20  lumns the table 
71a0: 77 69 6c 6c 20 68 61 76 65 2e 20 20 2a 2f 0a 20  will have.  */. 
71b0: 20 20 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73     pMWin->iEphCs
71c0: 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
71d0: 2b 2b 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  ++;.    pParse->
71e0: 6e 54 61 62 20 2b 3d 20 33 3b 0a 0a 20 20 20 20  nTab += 3;..    
71f0: 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72  selectWindowRewr
7200: 69 74 65 45 4c 69 73 74 28 70 50 61 72 73 65 2c  iteEList(pParse,
7210: 20 70 4d 57 69 6e 2c 20 70 53 72 63 2c 20 70 2d   pMWin, pSrc, p-
7220: 3e 70 45 4c 69 73 74 2c 20 26 70 53 75 62 6c 69  >pEList, &pSubli
7230: 73 74 29 3b 0a 20 20 20 20 73 65 6c 65 63 74 57  st);.    selectW
7240: 69 6e 64 6f 77 52 65 77 72 69 74 65 45 4c 69 73  indowRewriteELis
7250: 74 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c  t(pParse, pMWin,
7260: 20 70 53 72 63 2c 20 70 2d 3e 70 4f 72 64 65 72   pSrc, p->pOrder
7270: 42 79 2c 20 26 70 53 75 62 6c 69 73 74 29 3b 0a  By, &pSublist);.
7280: 20 20 20 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66      pMWin->nBuff
7290: 65 72 43 6f 6c 20 3d 20 28 70 53 75 62 6c 69 73  erCol = (pSublis
72a0: 74 20 3f 20 70 53 75 62 6c 69 73 74 2d 3e 6e 45  t ? pSublist->nE
72b0: 78 70 72 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f  xpr : 0);..    /
72c0: 2a 20 41 70 70 65 6e 64 20 74 68 65 20 50 41 52  * Append the PAR
72d0: 54 49 54 49 4f 4e 20 42 59 20 61 6e 64 20 4f 52  TITION BY and OR
72e0: 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69 6f  DER BY expressio
72f0: 6e 73 20 74 6f 20 74 68 65 20 74 6f 20 74 68 65  ns to the to the
7300: 20 0a 20 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c   .    ** sub-sel
7310: 65 63 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  ect expression l
7320: 69 73 74 2e 20 54 68 65 79 20 61 72 65 20 72 65  ist. They are re
7330: 71 75 69 72 65 64 20 74 6f 20 66 69 67 75 72 65  quired to figure
7340: 20 6f 75 74 20 77 68 65 72 65 20 0a 20 20 20 20   out where .    
7350: 2a 2a 20 62 6f 75 6e 64 61 72 69 65 73 20 66 6f  ** boundaries fo
7360: 72 20 70 61 72 74 69 74 69 6f 6e 73 20 61 6e 64  r partitions and
7370: 20 73 65 74 73 20 6f 66 20 70 65 65 72 20 72 6f   sets of peer ro
7380: 77 73 20 6c 69 65 2e 20 20 2a 2f 0a 20 20 20 20  ws lie.  */.    
7390: 70 53 75 62 6c 69 73 74 20 3d 20 65 78 70 72 4c  pSublist = exprL
73a0: 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28 70 50  istAppendList(pP
73b0: 61 72 73 65 2c 20 70 53 75 62 6c 69 73 74 2c 20  arse, pSublist, 
73c0: 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f  pMWin->pPartitio
73d0: 6e 29 3b 0a 20 20 20 20 70 53 75 62 6c 69 73 74  n);.    pSublist
73e0: 20 3d 20 65 78 70 72 4c 69 73 74 41 70 70 65 6e   = exprListAppen
73f0: 64 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53  dList(pParse, pS
7400: 75 62 6c 69 73 74 2c 20 70 4d 57 69 6e 2d 3e 70  ublist, pMWin->p
7410: 4f 72 64 65 72 42 79 29 3b 0a 0a 20 20 20 20 2f  OrderBy);..    /
7420: 2a 20 41 70 70 65 6e 64 20 74 68 65 20 61 72 67  * Append the arg
7430: 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f  uments passed to
7440: 20 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e   each window fun
7450: 63 74 69 6f 6e 20 74 6f 20 74 68 65 0a 20 20 20  ction to the.   
7460: 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 20 65   ** sub-select e
7470: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20  xpression list. 
7480: 41 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 20 74 77  Also allocate tw
7490: 6f 20 72 65 67 69 73 74 65 72 73 20 66 6f 72 20  o registers for 
74a0: 65 61 63 68 0a 20 20 20 20 2a 2a 20 77 69 6e 64  each.    ** wind
74b0: 6f 77 20 66 75 6e 63 74 69 6f 6e 20 2d 20 6f 6e  ow function - on
74c0: 65 20 66 6f 72 20 74 68 65 20 61 63 63 75 6d 75  e for the accumu
74d0: 6c 61 74 6f 72 2c 20 61 6e 6f 74 68 65 72 20 66  lator, another f
74e0: 6f 72 20 69 6e 74 65 72 69 6d 0a 20 20 20 20 2a  or interim.    *
74f0: 2a 20 72 65 73 75 6c 74 73 2e 20 20 2a 2f 0a 20  * results.  */. 
7500: 20 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69     for(pWin=pMWi
7510: 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57  n; pWin; pWin=pW
7520: 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20  in->pNextWin){. 
7530: 20 20 20 20 20 70 57 69 6e 2d 3e 69 41 72 67 43       pWin->iArgC
7540: 6f 6c 20 3d 20 28 70 53 75 62 6c 69 73 74 20 3f  ol = (pSublist ?
7550: 20 70 53 75 62 6c 69 73 74 2d 3e 6e 45 78 70 72   pSublist->nExpr
7560: 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 70 53 75   : 0);.      pSu
7570: 62 6c 69 73 74 20 3d 20 65 78 70 72 4c 69 73 74  blist = exprList
7580: 41 70 70 65 6e 64 4c 69 73 74 28 70 50 61 72 73  AppendList(pPars
7590: 65 2c 20 70 53 75 62 6c 69 73 74 2c 20 70 57 69  e, pSublist, pWi
75a0: 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69  n->pOwner->x.pLi
75b0: 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  st);.      if( p
75c0: 57 69 6e 2d 3e 70 46 69 6c 74 65 72 20 29 7b 0a  Win->pFilter ){.
75d0: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 46          Expr *pF
75e0: 69 6c 74 65 72 20 3d 20 73 71 6c 69 74 65 33 45  ilter = sqlite3E
75f0: 78 70 72 44 75 70 28 64 62 2c 20 70 57 69 6e 2d  xprDup(db, pWin-
7600: 3e 70 46 69 6c 74 65 72 2c 20 30 29 3b 0a 20 20  >pFilter, 0);.  
7610: 20 20 20 20 20 20 70 53 75 62 6c 69 73 74 20 3d        pSublist =
7620: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
7630: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
7640: 53 75 62 6c 69 73 74 2c 20 70 46 69 6c 74 65 72  Sublist, pFilter
7650: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
7660: 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 20   pWin->regAccum 
7670: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
7680: 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 72 65  ;.      pWin->re
7690: 67 52 65 73 75 6c 74 20 3d 20 2b 2b 70 50 61 72  gResult = ++pPar
76a0: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
76b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
76c0: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
76d0: 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 29   pWin->regAccum)
76e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
76f0: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f  If there is no O
7700: 52 44 45 52 20 42 59 20 6f 72 20 50 41 52 54 49  RDER BY or PARTI
7710: 54 49 4f 4e 20 42 59 20 63 6c 61 75 73 65 2c 20  TION BY clause, 
7720: 61 6e 64 20 74 68 65 20 77 69 6e 64 6f 77 0a 20  and the window. 
7730: 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61     ** function a
7740: 63 63 65 70 74 73 20 7a 65 72 6f 20 61 72 67 75  ccepts zero argu
7750: 6d 65 6e 74 73 2c 20 61 6e 64 20 74 68 65 72 65  ments, and there
7760: 20 61 72 65 20 6e 6f 20 6f 74 68 65 72 20 63 6f   are no other co
7770: 6c 75 6d 6e 73 0a 20 20 20 20 2a 2a 20 73 65 6c  lumns.    ** sel
7780: 65 63 74 65 64 20 28 65 2e 67 2e 20 22 53 45 4c  ected (e.g. "SEL
7790: 45 43 54 20 72 6f 77 5f 6e 75 6d 62 65 72 28 29  ECT row_number()
77a0: 20 4f 56 45 52 20 28 29 20 46 52 4f 4d 20 74 31   OVER () FROM t1
77b0: 22 29 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  "), it is possib
77c0: 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 70  le.    ** that p
77d0: 53 75 62 6c 69 73 74 20 69 73 20 73 74 69 6c 6c  Sublist is still
77e0: 20 4e 55 4c 4c 20 68 65 72 65 2e 20 41 64 64 20   NULL here. Add 
77f0: 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65  a constant expre
7800: 73 73 69 6f 6e 20 68 65 72 65 20 74 6f 20 0a 20  ssion here to . 
7810: 20 20 20 2a 2a 20 6b 65 65 70 20 65 76 65 72 79     ** keep every
7820: 74 68 69 6e 67 20 6c 65 67 61 6c 20 69 6e 20 74  thing legal in t
7830: 68 69 73 20 63 61 73 65 2e 20 0a 20 20 20 20 2a  his case. .    *
7840: 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 6c 69  /.    if( pSubli
7850: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  st==0 ){.      p
7860: 53 75 62 6c 69 73 74 20 3d 20 73 71 6c 69 74 65  Sublist = sqlite
7870: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
7880: 70 50 61 72 73 65 2c 20 30 2c 20 0a 20 20 20 20  pParse, 0, .    
7890: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
78a0: 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e  rAlloc(db, TK_IN
78b0: 54 45 47 45 52 2c 20 26 73 71 6c 69 74 65 33 49  TEGER, &sqlite3I
78c0: 6e 74 54 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29 0a  ntTokens[0], 0).
78d0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a        );.    }..
78e0: 20 20 20 20 70 53 75 62 20 3d 20 73 71 6c 69 74      pSub = sqlit
78f0: 65 33 53 65 6c 65 63 74 4e 65 77 28 0a 20 20 20  e3SelectNew(.   
7900: 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 53 75       pParse, pSu
7910: 62 6c 69 73 74 2c 20 70 53 72 63 2c 20 70 57 68  blist, pSrc, pWh
7920: 65 72 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 70  ere, pGroupBy, p
7930: 48 61 76 69 6e 67 2c 20 70 53 6f 72 74 2c 20 30  Having, pSort, 0
7940: 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 20 20 70  , 0.    );.    p
7950: 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  ->pSrc = sqlite3
7960: 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 70 50  SrcListAppend(pP
7970: 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  arse, 0, 0, 0);.
7980: 20 20 20 20 69 66 28 20 70 2d 3e 70 53 72 63 20      if( p->pSrc 
7990: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 53 72 63  ){.      p->pSrc
79a0: 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 3d  ->a[0].pSelect =
79b0: 20 70 53 75 62 3b 0a 20 20 20 20 20 20 73 71 6c   pSub;.      sql
79c0: 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
79d0: 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
79e0: 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 20   p->pSrc);.     
79f0: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 61   if( sqlite3Expa
7a00: 6e 64 53 75 62 71 75 65 72 79 28 70 50 61 72 73  ndSubquery(pPars
7a10: 65 2c 20 26 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  e, &p->pSrc->a[0
7a20: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ]) ){.        rc
7a30: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
7a40: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7a50: 20 20 20 20 20 20 70 53 75 62 2d 3e 73 65 6c 46        pSub->selF
7a60: 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e  lags |= SF_Expan
7a70: 64 65 64 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ded;.        p->
7a80: 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f  selFlags &= ~SF_
7a90: 41 67 67 72 65 67 61 74 65 3b 0a 20 20 20 20 20  Aggregate;.     
7aa0: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
7ab0: 50 72 65 70 28 70 50 61 72 73 65 2c 20 70 53 75  Prep(pParse, pSu
7ac0: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  b, 0);.      }..
7ad0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7ae0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
7af0: 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 4d 57  enEphemeral, pMW
7b00: 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 70 53 75  in->iEphCsr, pSu
7b10: 62 6c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  blist->nExpr);. 
7b20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7b30: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
7b40: 6e 44 75 70 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  nDup, pMWin->iEp
7b50: 68 43 73 72 2b 31 2c 20 70 4d 57 69 6e 2d 3e 69  hCsr+1, pMWin->i
7b60: 45 70 68 43 73 72 29 3b 0a 20 20 20 20 20 20 73  EphCsr);.      s
7b70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
7b80: 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20  (v, OP_OpenDup, 
7b90: 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2b 32  pMWin->iEphCsr+2
7ba0: 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
7bb0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
7bc0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7bd0: 5f 4f 70 65 6e 44 75 70 2c 20 70 4d 57 69 6e 2d  _OpenDup, pMWin-
7be0: 3e 69 45 70 68 43 73 72 2b 33 2c 20 70 4d 57 69  >iEphCsr+3, pMWi
7bf0: 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 20  n->iEphCsr);.   
7c00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
7c10: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
7c20: 65 28 64 62 2c 20 70 53 75 62 29 3b 0a 20 20 20  e(db, pSub);.   
7c30: 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d   }.    if( db->m
7c40: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 63  allocFailed ) rc
7c50: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
7c60: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
7c70: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  c;.}../*.** Free
7c80: 20 74 68 65 20 57 69 6e 64 6f 77 20 6f 62 6a 65   the Window obje
7c90: 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
7ca0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
7cb0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
7cc0: 33 57 69 6e 64 6f 77 44 65 6c 65 74 65 28 73 71  3WindowDelete(sq
7cd0: 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 6e 64 6f  lite3 *db, Windo
7ce0: 77 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  w *p){.  if( p )
7cf0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
7d00: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
7d10: 46 69 6c 74 65 72 29 3b 0a 20 20 20 20 73 71 6c  Filter);.    sql
7d20: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
7d30: 74 65 28 64 62 2c 20 70 2d 3e 70 50 61 72 74 69  te(db, p->pParti
7d40: 74 69 6f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  tion);.    sqlit
7d50: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
7d60: 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
7d70: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
7d80: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
7d90: 70 45 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  pEnd);.    sqlit
7da0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
7db0: 20 70 2d 3e 70 53 74 61 72 74 29 3b 0a 20 20 20   p->pStart);.   
7dc0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
7dd0: 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  b, p->zName);.  
7de0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
7df0: 64 62 2c 20 70 2d 3e 7a 42 61 73 65 29 3b 0a 20  db, p->zBase);. 
7e00: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
7e10: 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  (db, p);.  }.}..
7e20: 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 6c  /*.** Free the l
7e30: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 57 69  inked list of Wi
7e40: 6e 64 6f 77 20 6f 62 6a 65 63 74 73 20 73 74 61  ndow objects sta
7e50: 72 74 69 6e 67 20 61 74 20 74 68 65 20 73 65 63  rting at the sec
7e60: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
7e70: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 6e  .void sqlite3Win
7e80: 64 6f 77 4c 69 73 74 44 65 6c 65 74 65 28 73 71  dowListDelete(sq
7e90: 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 6e 64 6f  lite3 *db, Windo
7ea0: 77 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28 20  w *p){.  while( 
7eb0: 70 20 29 7b 0a 20 20 20 20 57 69 6e 64 6f 77 20  p ){.    Window 
7ec0: 2a 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  *pNext = p->pNex
7ed0: 74 57 69 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  tWin;.    sqlite
7ee0: 33 57 69 6e 64 6f 77 44 65 6c 65 74 65 28 64 62  3WindowDelete(db
7ef0: 2c 20 70 29 3b 0a 20 20 20 20 70 20 3d 20 70 4e  , p);.    p = pN
7f00: 65 78 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ext;.  }.}../*.*
7f10: 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 65  * The argument e
7f20: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20  xpression is an 
7f30: 50 52 45 43 45 44 49 4e 47 20 6f 72 20 46 4f 4c  PRECEDING or FOL
7f40: 4c 4f 57 49 4e 47 20 6f 66 66 73 65 74 2e 20 20  LOWING offset.  
7f50: 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 73 68 6f  The.** value sho
7f60: 75 6c 64 20 62 65 20 61 20 6e 6f 6e 2d 6e 65 67  uld be a non-neg
7f70: 61 74 69 76 65 20 69 6e 74 65 67 65 72 2e 20 20  ative integer.  
7f80: 49 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  If the value is 
7f90: 6e 6f 74 20 61 0a 2a 2a 20 63 6f 6e 73 74 61 6e  not a.** constan
7fa0: 74 2c 20 63 68 61 6e 67 65 20 69 74 20 74 6f 20  t, change it to 
7fb0: 4e 55 4c 4c 2e 20 20 54 68 65 20 66 61 63 74 20  NULL.  The fact 
7fc0: 74 68 61 74 20 69 74 20 69 73 20 74 68 65 6e 20  that it is then 
7fd0: 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 0a 2a  a non-negative.*
7fe0: 2a 20 69 6e 74 65 67 65 72 20 77 69 6c 6c 20 62  * integer will b
7ff0: 65 20 63 61 75 67 68 74 20 6c 61 74 65 72 2e 20  e caught later. 
8000: 20 42 75 74 20 69 74 20 69 73 20 69 6d 70 6f 72   But it is impor
8010: 74 61 6e 74 20 6e 6f 74 20 74 6f 20 6c 65 61 76  tant not to leav
8020: 65 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 76 61  e.** variable va
8030: 6c 75 65 73 20 69 6e 20 74 68 65 20 65 78 70 72  lues in the expr
8040: 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a  ession tree..*/.
8050: 73 74 61 74 69 63 20 45 78 70 72 20 2a 73 71 6c  static Expr *sql
8060: 69 74 65 33 57 69 6e 64 6f 77 4f 66 66 73 65 74  ite3WindowOffset
8070: 45 78 70 72 28 50 61 72 73 65 20 2a 70 50 61 72  Expr(Parse *pPar
8080: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
8090: 7b 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  {.  if( 0==sqlit
80a0: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
80b0: 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 69  (pExpr) ){.    i
80c0: 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  f( IN_RENAME_OBJ
80d0: 45 43 54 20 29 20 73 71 6c 69 74 65 33 52 65 6e  ECT ) sqlite3Ren
80e0: 61 6d 65 45 78 70 72 55 6e 6d 61 70 28 70 50 61  ameExprUnmap(pPa
80f0: 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  rse, pExpr);.   
8100: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
8110: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
8120: 45 78 70 72 29 3b 0a 20 20 20 20 70 45 78 70 72  Expr);.    pExpr
8130: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c   = sqlite3ExprAl
8140: 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  loc(pParse->db, 
8150: 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 29 3b 0a  TK_NULL, 0, 0);.
8160: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78    }.  return pEx
8170: 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  pr;.}../*.** All
8180: 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e  ocate and return
8190: 20 61 20 6e 65 77 20 57 69 6e 64 6f 77 20 6f 62   a new Window ob
81a0: 6a 65 63 74 20 64 65 73 63 72 69 62 69 6e 67 20  ject describing 
81b0: 61 20 57 69 6e 64 6f 77 20 44 65 66 69 6e 69 74  a Window Definit
81c0: 69 6f 6e 2e 0a 2a 2f 0a 57 69 6e 64 6f 77 20 2a  ion..*/.Window *
81d0: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 41 6c 6c  sqlite3WindowAll
81e0: 6f 63 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  oc(.  Parse *pPa
81f0: 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
8200: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
8210: 69 6e 74 20 65 54 79 70 65 2c 20 20 20 20 20 20  int eType,      
8220: 20 20 2f 2a 20 46 72 61 6d 65 20 74 79 70 65 2e    /* Frame type.
8230: 20 54 4b 5f 52 41 4e 47 45 20 6f 72 20 54 4b 5f   TK_RANGE or TK_
8240: 52 4f 57 53 20 2a 2f 0a 20 20 69 6e 74 20 65 53  ROWS */.  int eS
8250: 74 61 72 74 2c 20 20 20 20 20 20 20 2f 2a 20 53  tart,       /* S
8260: 74 61 72 74 20 74 79 70 65 3a 20 43 55 52 52 45  tart type: CURRE
8270: 4e 54 2c 20 50 52 45 43 45 44 49 4e 47 2c 20 46  NT, PRECEDING, F
8280: 4f 4c 4c 4f 57 49 4e 47 2c 20 55 4e 42 4f 55 4e  OLLOWING, UNBOUN
8290: 44 45 44 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  DED */.  Expr *p
82a0: 53 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 53 74  Start,     /* St
82b0: 61 72 74 20 77 69 6e 64 6f 77 20 73 69 7a 65 20  art window size 
82c0: 69 66 20 54 4b 5f 50 52 45 43 45 44 49 4e 47 20  if TK_PRECEDING 
82d0: 6f 72 20 46 4f 4c 4c 4f 57 49 4e 47 20 2a 2f 0a  or FOLLOWING */.
82e0: 20 20 69 6e 74 20 65 45 6e 64 2c 20 20 20 20 20    int eEnd,     
82f0: 20 20 20 20 2f 2a 20 45 6e 64 20 74 79 70 65 3a      /* End type:
8300: 20 43 55 52 52 45 4e 54 2c 20 46 4f 4c 4c 4f 57   CURRENT, FOLLOW
8310: 49 4e 47 2c 20 54 4b 5f 55 4e 42 4f 55 4e 44 45  ING, TK_UNBOUNDE
8320: 44 2c 20 50 52 45 43 45 44 49 4e 47 20 2a 2f 0a  D, PRECEDING */.
8330: 20 20 45 78 70 72 20 2a 70 45 6e 64 2c 20 20 20    Expr *pEnd,   
8340: 20 20 20 20 2f 2a 20 45 6e 64 20 77 69 6e 64 6f      /* End windo
8350: 77 20 73 69 7a 65 20 69 66 20 54 4b 5f 46 4f 4c  w size if TK_FOL
8360: 4c 4f 57 49 4e 47 20 6f 72 20 50 52 45 43 45 44  LOWING or PRECED
8370: 49 4e 47 20 2a 2f 0a 20 20 75 38 20 65 45 78 63  ING */.  u8 eExc
8380: 6c 75 64 65 20 20 20 20 20 20 20 2f 2a 20 45 58  lude       /* EX
8390: 43 4c 55 44 45 20 63 6c 61 75 73 65 20 2a 2f 0a  CLUDE clause */.
83a0: 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69  ){.  Window *pWi
83b0: 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 62 49 6d  n = 0;.  int bIm
83c0: 70 6c 69 63 69 74 46 72 61 6d 65 20 3d 20 30 3b  plicitFrame = 0;
83d0: 0a 0a 20 20 2f 2a 20 50 61 72 73 65 72 20 61 73  ..  /* Parser as
83e0: 73 75 72 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77  sures the follow
83f0: 69 6e 67 3a 20 2a 2f 0a 20 20 61 73 73 65 72 74  ing: */.  assert
8400: 28 20 65 54 79 70 65 3d 3d 30 20 7c 7c 20 65 54  ( eType==0 || eT
8410: 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 7c 7c  ype==TK_RANGE ||
8420: 20 65 54 79 70 65 3d 3d 54 4b 5f 52 4f 57 53 20   eType==TK_ROWS 
8430: 7c 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 47 52 4f  || eType==TK_GRO
8440: 55 50 53 20 29 3b 0a 20 20 61 73 73 65 72 74 28  UPS );.  assert(
8450: 20 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52   eStart==TK_CURR
8460: 45 4e 54 20 7c 7c 20 65 53 74 61 72 74 3d 3d 54  ENT || eStart==T
8470: 4b 5f 50 52 45 43 45 44 49 4e 47 0a 20 20 20 20  K_PRECEDING.    
8480: 20 20 20 20 20 20 20 7c 7c 20 65 53 74 61 72 74         || eStart
8490: 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 7c  ==TK_UNBOUNDED |
84a0: 7c 20 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c  | eStart==TK_FOL
84b0: 4c 4f 57 49 4e 47 20 29 3b 0a 20 20 61 73 73 65  LOWING );.  asse
84c0: 72 74 28 20 65 45 6e 64 3d 3d 54 4b 5f 43 55 52  rt( eEnd==TK_CUR
84d0: 52 45 4e 54 20 7c 7c 20 65 45 6e 64 3d 3d 54 4b  RENT || eEnd==TK
84e0: 5f 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20 20 20 20  _FOLLOWING.     
84f0: 20 20 20 20 20 20 7c 7c 20 65 45 6e 64 3d 3d 54        || eEnd==T
8500: 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 7c 7c 20 65  K_UNBOUNDED || e
8510: 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e  End==TK_PRECEDIN
8520: 47 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  G );.  assert( (
8530: 65 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45  eStart==TK_PRECE
8540: 44 49 4e 47 20 7c 7c 20 65 53 74 61 72 74 3d 3d  DING || eStart==
8550: 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 29 3d 3d 28  TK_FOLLOWING)==(
8560: 70 53 74 61 72 74 21 3d 30 29 20 29 3b 0a 20 20  pStart!=0) );.  
8570: 61 73 73 65 72 74 28 20 28 65 45 6e 64 3d 3d 54  assert( (eEnd==T
8580: 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 7c 7c 20 65  K_FOLLOWING || e
8590: 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e  End==TK_PRECEDIN
85a0: 47 29 3d 3d 28 70 45 6e 64 21 3d 30 29 20 29 3b  G)==(pEnd!=0) );
85b0: 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30  ..  if( eType==0
85c0: 20 29 7b 0a 20 20 20 20 62 49 6d 70 6c 69 63 69   ){.    bImplici
85d0: 74 46 72 61 6d 65 20 3d 20 31 3b 0a 20 20 20 20  tFrame = 1;.    
85e0: 65 54 79 70 65 20 3d 20 54 4b 5f 52 41 4e 47 45  eType = TK_RANGE
85f0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 69  ;.  }..  /* Addi
8600: 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 0a 20 20  tionally, the.  
8610: 2a 2a 20 73 74 61 72 74 69 6e 67 20 62 6f 75 6e  ** starting boun
8620: 64 61 72 79 20 74 79 70 65 20 6d 61 79 20 6e 6f  dary type may no
8630: 74 20 6f 63 63 75 72 20 65 61 72 6c 69 65 72 20  t occur earlier 
8640: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
8650: 20 6c 69 73 74 20 74 68 61 6e 0a 20 20 2a 2a 20   list than.  ** 
8660: 74 68 65 20 65 6e 64 69 6e 67 20 62 6f 75 6e 64  the ending bound
8670: 61 72 79 20 74 79 70 65 3a 0a 20 20 2a 2a 0a 20  ary type:.  **. 
8680: 20 2a 2a 20 20 20 55 4e 42 4f 55 4e 44 45 44 20   **   UNBOUNDED 
8690: 50 52 45 43 45 44 49 4e 47 0a 20 20 2a 2a 20 20  PRECEDING.  **  
86a0: 20 3c 65 78 70 72 3e 20 50 52 45 43 45 44 49 4e   <expr> PRECEDIN
86b0: 47 0a 20 20 2a 2a 20 20 20 43 55 52 52 45 4e 54  G.  **   CURRENT
86c0: 20 52 4f 57 0a 20 20 2a 2a 20 20 20 3c 65 78 70   ROW.  **   <exp
86d0: 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20 2a  r> FOLLOWING.  *
86e0: 2a 20 20 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f  *   UNBOUNDED FO
86f0: 4c 4c 4f 57 49 4e 47 0a 20 20 2a 2a 0a 20 20 2a  LLOWING.  **.  *
8700: 2a 20 54 68 65 20 70 61 72 73 65 72 20 65 6e 73  * The parser ens
8710: 75 72 65 73 20 74 68 61 74 20 22 55 4e 42 4f 55  ures that "UNBOU
8720: 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 22 20  NDED PRECEDING" 
8730: 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 61  cannot be used a
8740: 73 20 61 6e 20 65 6e 64 69 6e 67 0a 20 20 2a 2a  s an ending.  **
8750: 20 62 6f 75 6e 64 61 72 79 2c 20 61 6e 64 20 74   boundary, and t
8760: 68 61 6e 20 22 55 4e 42 4f 55 4e 44 45 44 20 46  han "UNBOUNDED F
8770: 4f 4c 4c 4f 57 49 4e 47 22 20 63 61 6e 6e 6f 74  OLLOWING" cannot
8780: 20 62 65 20 75 73 65 64 20 61 73 20 61 20 73 74   be used as a st
8790: 61 72 74 69 6e 67 0a 20 20 2a 2a 20 66 72 61 6d  arting.  ** fram
87a0: 65 20 62 6f 75 6e 64 61 72 79 2e 0a 20 20 2a 2f  e boundary..  */
87b0: 0a 20 20 69 66 28 20 28 65 53 74 61 72 74 3d 3d  .  if( (eStart==
87c0: 54 4b 5f 43 55 52 52 45 4e 54 20 26 26 20 65 45  TK_CURRENT && eE
87d0: 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47  nd==TK_PRECEDING
87e0: 29 0a 20 20 20 7c 7c 20 28 65 53 74 61 72 74 3d  ).   || (eStart=
87f0: 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 26 26  =TK_FOLLOWING &&
8800: 20 28 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45   (eEnd==TK_PRECE
8810: 44 49 4e 47 20 7c 7c 20 65 45 6e 64 3d 3d 54 4b  DING || eEnd==TK
8820: 5f 43 55 52 52 45 4e 54 29 29 0a 20 20 29 7b 0a  _CURRENT)).  ){.
8830: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8840: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 73  Msg(pParse, "uns
8850: 75 70 70 6f 72 74 65 64 20 66 72 61 6d 65 20 73  upported frame s
8860: 70 65 63 69 66 69 63 61 74 69 6f 6e 22 29 3b 0a  pecification");.
8870: 20 20 20 20 67 6f 74 6f 20 77 69 6e 64 6f 77 41      goto windowA
8880: 6c 6c 6f 63 45 72 72 3b 0a 20 20 7d 0a 0a 20 20  llocErr;.  }..  
8890: 70 57 69 6e 20 3d 20 28 57 69 6e 64 6f 77 2a 29  pWin = (Window*)
88a0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
88b0: 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ero(pParse->db, 
88c0: 73 69 7a 65 6f 66 28 57 69 6e 64 6f 77 29 29 3b  sizeof(Window));
88d0: 0a 20 20 69 66 28 20 70 57 69 6e 3d 3d 30 20 29  .  if( pWin==0 )
88e0: 20 67 6f 74 6f 20 77 69 6e 64 6f 77 41 6c 6c 6f   goto windowAllo
88f0: 63 45 72 72 3b 0a 20 20 70 57 69 6e 2d 3e 65 54  cErr;.  pWin->eT
8900: 79 70 65 20 3d 20 65 54 79 70 65 3b 0a 20 20 70  ype = eType;.  p
8910: 57 69 6e 2d 3e 65 53 74 61 72 74 20 3d 20 65 53  Win->eStart = eS
8920: 74 61 72 74 3b 0a 20 20 70 57 69 6e 2d 3e 65 45  tart;.  pWin->eE
8930: 6e 64 20 3d 20 65 45 6e 64 3b 0a 20 20 69 66 28  nd = eEnd;.  if(
8940: 20 65 45 78 63 6c 75 64 65 3d 3d 30 20 26 26 20   eExclude==0 && 
8950: 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61  OptimizationDisa
8960: 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  bled(pParse->db,
8970: 20 53 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61   SQLITE_QueryFla
8980: 74 74 65 6e 65 72 29 20 29 7b 0a 20 20 20 20 65  ttener) ){.    e
8990: 45 78 63 6c 75 64 65 20 3d 20 54 4b 5f 4e 4f 3b  Exclude = TK_NO;
89a0: 0a 20 20 7d 0a 20 20 70 57 69 6e 2d 3e 65 45 78  .  }.  pWin->eEx
89b0: 63 6c 75 64 65 20 3d 20 65 45 78 63 6c 75 64 65  clude = eExclude
89c0: 3b 0a 20 20 70 57 69 6e 2d 3e 62 49 6d 70 6c 69  ;.  pWin->bImpli
89d0: 63 69 74 46 72 61 6d 65 20 3d 20 62 49 6d 70 6c  citFrame = bImpl
89e0: 69 63 69 74 46 72 61 6d 65 3b 0a 20 20 70 57 69  icitFrame;.  pWi
89f0: 6e 2d 3e 70 45 6e 64 20 3d 20 73 71 6c 69 74 65  n->pEnd = sqlite
8a00: 33 57 69 6e 64 6f 77 4f 66 66 73 65 74 45 78 70  3WindowOffsetExp
8a10: 72 28 70 50 61 72 73 65 2c 20 70 45 6e 64 29 3b  r(pParse, pEnd);
8a20: 0a 20 20 70 57 69 6e 2d 3e 70 53 74 61 72 74 20  .  pWin->pStart 
8a30: 3d 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4f  = sqlite3WindowO
8a40: 66 66 73 65 74 45 78 70 72 28 70 50 61 72 73 65  ffsetExpr(pParse
8a50: 2c 20 70 53 74 61 72 74 29 3b 0a 20 20 72 65 74  , pStart);.  ret
8a60: 75 72 6e 20 70 57 69 6e 3b 0a 0a 77 69 6e 64 6f  urn pWin;..windo
8a70: 77 41 6c 6c 6f 63 45 72 72 3a 0a 20 20 73 71 6c  wAllocErr:.  sql
8a80: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
8a90: 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 6e 64 29  Parse->db, pEnd)
8aa0: 3b 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 53 74 61 72 74 29 3b 0a 20 20 72 65 74  , pStart);.  ret
8ad0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
8ae0: 41 74 74 61 63 68 20 50 41 52 54 49 54 49 4f 4e  Attach PARTITION
8af0: 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 63 6c   and ORDER BY cl
8b00: 61 75 73 65 73 20 70 50 61 72 74 69 74 69 6f 6e  auses pPartition
8b10: 20 61 6e 64 20 70 4f 72 64 65 72 42 79 20 74 6f   and pOrderBy to
8b20: 20 77 69 6e 64 6f 77 0a 2a 2a 20 70 57 69 6e 2e   window.** pWin.
8b30: 20 41 6c 73 6f 2c 20 69 66 20 70 61 72 61 6d 65   Also, if parame
8b40: 74 65 72 20 70 42 61 73 65 20 69 73 20 6e 6f 74  ter pBase is not
8b50: 20 4e 55 4c 4c 2c 20 73 65 74 20 70 57 69 6e 2d   NULL, set pWin-
8b60: 3e 7a 42 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a  >zBase to the.**
8b70: 20 65 71 75 69 76 61 6c 65 6e 74 20 6e 75 6c 2d   equivalent nul-
8b80: 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
8b90: 67 2e 0a 2a 2f 0a 57 69 6e 64 6f 77 20 2a 73 71  g..*/.Window *sq
8ba0: 6c 69 74 65 33 57 69 6e 64 6f 77 41 73 73 65 6d  lite3WindowAssem
8bb0: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
8bc0: 61 72 73 65 2c 20 0a 20 20 57 69 6e 64 6f 77 20  arse, .  Window 
8bd0: 2a 70 57 69 6e 2c 20 0a 20 20 45 78 70 72 4c 69  *pWin, .  ExprLi
8be0: 73 74 20 2a 70 50 61 72 74 69 74 69 6f 6e 2c 20  st *pPartition, 
8bf0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
8c00: 64 65 72 42 79 2c 20 0a 20 20 54 6f 6b 65 6e 20  derBy, .  Token 
8c10: 2a 70 42 61 73 65 0a 29 7b 0a 20 20 69 66 28 20  *pBase.){.  if( 
8c20: 70 57 69 6e 20 29 7b 0a 20 20 20 20 70 57 69 6e  pWin ){.    pWin
8c30: 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 3d 20 70  ->pPartition = p
8c40: 50 61 72 74 69 74 69 6f 6e 3b 0a 20 20 20 20 70  Partition;.    p
8c50: 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  Win->pOrderBy = 
8c60: 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 69 66  pOrderBy;.    if
8c70: 28 20 70 42 61 73 65 20 29 7b 0a 20 20 20 20 20  ( pBase ){.     
8c80: 20 70 57 69 6e 2d 3e 7a 42 61 73 65 20 3d 20 73   pWin->zBase = s
8c90: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
8ca0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 42 61 73  pParse->db, pBas
8cb0: 65 2d 3e 7a 2c 20 70 42 61 73 65 2d 3e 6e 29 3b  e->z, pBase->n);
8cc0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
8cd0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
8ce0: 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  istDelete(pParse
8cf0: 2d 3e 64 62 2c 20 70 50 61 72 74 69 74 69 6f 6e  ->db, pPartition
8d00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
8d10: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  prListDelete(pPa
8d20: 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42  rse->db, pOrderB
8d30: 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  y);.  }.  return
8d40: 20 70 57 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pWin;.}../*.** 
8d50: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 20 68 61 73  Window *pWin has
8d60: 20 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61 74   just been creat
8d70: 65 64 20 66 72 6f 6d 20 61 20 57 49 4e 44 4f 57  ed from a WINDOW
8d80: 20 63 6c 61 75 73 65 2e 20 54 6f 6b 6e 65 20 70   clause. Tokne p
8d90: 42 61 73 65 0a 2a 2a 20 69 73 20 74 68 65 20 62  Base.** is the b
8da0: 61 73 65 20 77 69 6e 64 6f 77 2e 20 45 61 72 6c  ase window. Earl
8db0: 69 65 72 20 77 69 6e 64 6f 77 73 20 66 72 6f 6d  ier windows from
8dc0: 20 74 68 65 20 73 61 6d 65 20 57 49 4e 44 4f 57   the same WINDOW
8dd0: 20 63 6c 61 75 73 65 20 61 72 65 0a 2a 2a 20 73   clause are.** s
8de0: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6c 69 6e  tored in the lin
8df0: 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e  ked list startin
8e00: 67 20 61 74 20 70 57 69 6e 2d 3e 70 4e 65 78 74  g at pWin->pNext
8e10: 57 69 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69  Win. This functi
8e20: 6f 6e 0a 2a 2a 20 65 69 74 68 65 72 20 75 70 64  on.** either upd
8e30: 61 74 65 73 20 2a 70 57 69 6e 20 61 63 63 6f 72  ates *pWin accor
8e40: 64 69 6e 67 20 74 6f 20 74 68 65 20 62 61 73 65  ding to the base
8e50: 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 2c 20   specification, 
8e60: 6f 72 20 65 6c 73 65 0a 2a 2a 20 6c 65 61 76 65  or else.** leave
8e70: 73 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50  s an error in pP
8e80: 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  arse..*/.void sq
8e90: 6c 69 74 65 33 57 69 6e 64 6f 77 43 68 61 69 6e  lite3WindowChain
8ea0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
8eb0: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 2c 20 57 69  Window *pWin, Wi
8ec0: 6e 64 6f 77 20 2a 70 4c 69 73 74 29 7b 0a 20 20  ndow *pList){.  
8ed0: 69 66 28 20 70 57 69 6e 2d 3e 7a 42 61 73 65 20  if( pWin->zBase 
8ee0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  ){.    sqlite3 *
8ef0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
8f00: 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a 70 45 78  .    Window *pEx
8f10: 69 73 74 20 3d 20 77 69 6e 64 6f 77 46 69 6e 64  ist = windowFind
8f20: 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20  (pParse, pList, 
8f30: 70 57 69 6e 2d 3e 7a 42 61 73 65 29 3b 0a 20 20  pWin->zBase);.  
8f40: 20 20 69 66 28 20 70 45 78 69 73 74 20 29 7b 0a    if( pExist ){.
8f50: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
8f60: 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 20 20   *zErr = 0;.    
8f70: 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65    /* Check for e
8f80: 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 69  rrors */.      i
8f90: 66 28 20 70 57 69 6e 2d 3e 70 50 61 72 74 69 74  f( pWin->pPartit
8fa0: 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ion ){.        z
8fb0: 45 72 72 20 3d 20 22 50 41 52 54 49 54 49 4f 4e  Err = "PARTITION
8fc0: 20 63 6c 61 75 73 65 22 3b 0a 20 20 20 20 20 20   clause";.      
8fd0: 7d 65 6c 73 65 20 69 66 28 20 70 45 78 69 73 74  }else if( pExist
8fe0: 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70 57  ->pOrderBy && pW
8ff0: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  in->pOrderBy ){.
9000: 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 22          zErr = "
9010: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 22  ORDER BY clause"
9020: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
9030: 28 20 70 45 78 69 73 74 2d 3e 62 49 6d 70 6c 69  ( pExist->bImpli
9040: 63 69 74 46 72 61 6d 65 3d 3d 30 20 29 7b 0a 20  citFrame==0 ){. 
9050: 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 22 66         zErr = "f
9060: 72 61 6d 65 20 73 70 65 63 69 66 69 63 61 74 69  rame specificati
9070: 6f 6e 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  on";.      }.   
9080: 20 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20     if( zErr ){. 
9090: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
90a0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
90b0: 20 20 20 20 20 20 20 20 20 20 20 20 22 63 61 6e              "can
90c0: 6e 6f 74 20 6f 76 65 72 72 69 64 65 20 25 73 20  not override %s 
90d0: 6f 66 20 77 69 6e 64 6f 77 3a 20 25 73 22 2c 20  of window: %s", 
90e0: 7a 45 72 72 2c 20 70 57 69 6e 2d 3e 7a 42 61 73  zErr, pWin->zBas
90f0: 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  e.        );.   
9100: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9110: 20 20 70 57 69 6e 2d 3e 70 50 61 72 74 69 74 69    pWin->pPartiti
9120: 6f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  on = sqlite3Expr
9130: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 45 78 69  ListDup(db, pExi
9140: 73 74 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20  st->pPartition, 
9150: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
9160: 70 45 78 69 73 74 2d 3e 70 4f 72 64 65 72 42 79  pExist->pOrderBy
9170: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
9180: 73 65 72 74 28 20 70 57 69 6e 2d 3e 70 4f 72 64  sert( pWin->pOrd
9190: 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  erBy==0 );.     
91a0: 20 20 20 20 20 70 57 69 6e 2d 3e 70 4f 72 64 65       pWin->pOrde
91b0: 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
91c0: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 45 78  rListDup(db, pEx
91d0: 69 73 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 30  ist->pOrderBy, 0
91e0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
91f0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
9200: 65 65 28 64 62 2c 20 70 57 69 6e 2d 3e 7a 42 61  ee(db, pWin->zBa
9210: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 70 57 69  se);.        pWi
9220: 6e 2d 3e 7a 42 61 73 65 20 3d 20 30 3b 0a 20 20  n->zBase = 0;.  
9230: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
9240: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20  }../*.** Attach 
9250: 77 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 70 57  window object pW
9260: 69 6e 20 74 6f 20 65 78 70 72 65 73 73 69 6f 6e  in to expression
9270: 20 70 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69   p..*/.void sqli
9280: 74 65 33 57 69 6e 64 6f 77 41 74 74 61 63 68 28  te3WindowAttach(
9290: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
92a0: 78 70 72 20 2a 70 2c 20 57 69 6e 64 6f 77 20 2a  xpr *p, Window *
92b0: 70 57 69 6e 29 7b 0a 20 20 69 66 28 20 70 20 29  pWin){.  if( p )
92c0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
92d0: 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e  >op==TK_FUNCTION
92e0: 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   );.    /* This 
92f0: 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
9300: 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 70  called for the p
9310: 61 72 73 65 72 2e 20 20 49 66 20 70 57 69 6e 20  arser.  If pWin 
9320: 77 61 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61  was not.    ** a
9330: 6c 6c 6f 63 61 74 65 64 20 64 75 65 20 74 6f 20  llocated due to 
9340: 61 6e 20 4f 4f 4d 2c 20 74 68 65 6e 20 74 68 65  an OOM, then the
9350: 20 70 61 72 73 65 72 20 77 6f 75 6c 64 20 66 61   parser would fa
9360: 69 6c 20 62 65 66 6f 72 65 20 65 76 65 72 0a 20  il before ever. 
9370: 20 20 20 2a 2a 20 69 6e 76 6f 6b 69 6e 67 20 74     ** invoking t
9380: 68 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  his routine */. 
9390: 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 57     if( ALWAYS(pW
93a0: 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  in) ){.      p->
93b0: 79 2e 70 57 69 6e 20 3d 20 70 57 69 6e 3b 0a 20  y.pWin = pWin;. 
93c0: 20 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70       ExprSetProp
93d0: 65 72 74 79 28 70 2c 20 45 50 5f 57 69 6e 46 75  erty(p, EP_WinFu
93e0: 6e 63 29 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d  nc);.      pWin-
93f0: 3e 70 4f 77 6e 65 72 20 3d 20 70 3b 0a 20 20 20  >pOwner = p;.   
9400: 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20     if( p->flags 
9410: 26 20 45 50 5f 44 69 73 74 69 6e 63 74 20 29 7b  & EP_Distinct ){
9420: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9430: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
9440: 0a 20 20 20 20 20 20 20 20 20 20 20 22 44 49 53  .           "DIS
9450: 54 49 4e 43 54 20 69 73 20 6e 6f 74 20 73 75 70  TINCT is not sup
9460: 70 6f 72 74 65 64 20 66 6f 72 20 77 69 6e 64 6f  ported for windo
9470: 77 20 66 75 6e 63 74 69 6f 6e 73 22 29 3b 0a 20  w functions");. 
9480: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
9490: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
94a0: 33 57 69 6e 64 6f 77 44 65 6c 65 74 65 28 70 50  3WindowDelete(pP
94b0: 61 72 73 65 2d 3e 64 62 2c 20 70 57 69 6e 29 3b  arse->db, pWin);
94c0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
94d0: 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77  turn 0 if the tw
94e0: 6f 20 77 69 6e 64 6f 77 20 6f 62 6a 65 63 74 73  o window objects
94f0: 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2c 20   are identical, 
9500: 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 74 68 65  or non-zero othe
9510: 72 77 69 73 65 2e 0a 2a 2a 20 49 64 65 6e 74 69  rwise..** Identi
9520: 63 61 6c 20 77 69 6e 64 6f 77 20 6f 62 6a 65 63  cal window objec
9530: 74 73 20 63 61 6e 20 62 65 20 70 72 6f 63 65 73  ts can be proces
9540: 73 65 64 20 69 6e 20 61 20 73 69 6e 67 6c 65 20  sed in a single 
9550: 73 63 61 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  scan..*/.int sql
9560: 69 74 65 33 57 69 6e 64 6f 77 43 6f 6d 70 61 72  ite3WindowCompar
9570: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
9580: 20 57 69 6e 64 6f 77 20 2a 70 31 2c 20 57 69 6e   Window *p1, Win
9590: 64 6f 77 20 2a 70 32 29 7b 0a 20 20 69 66 28 20  dow *p2){.  if( 
95a0: 70 31 2d 3e 65 54 79 70 65 21 3d 70 32 2d 3e 65  p1->eType!=p2->e
95b0: 54 79 70 65 20 29 20 72 65 74 75 72 6e 20 31 3b  Type ) return 1;
95c0: 0a 20 20 69 66 28 20 70 31 2d 3e 65 53 74 61 72  .  if( p1->eStar
95d0: 74 21 3d 70 32 2d 3e 65 53 74 61 72 74 20 29 20  t!=p2->eStart ) 
95e0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
95f0: 70 31 2d 3e 65 45 6e 64 21 3d 70 32 2d 3e 65 45  p1->eEnd!=p2->eE
9600: 6e 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  nd ) return 1;. 
9610: 20 69 66 28 20 70 31 2d 3e 65 45 78 63 6c 75 64   if( p1->eExclud
9620: 65 21 3d 70 32 2d 3e 65 45 78 63 6c 75 64 65 20  e!=p2->eExclude 
9630: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
9640: 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
9650: 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 31 2d  pare(pParse, p1-
9660: 3e 70 53 74 61 72 74 2c 20 70 32 2d 3e 70 53 74  >pStart, p2->pSt
9670: 61 72 74 2c 20 2d 31 29 20 29 20 72 65 74 75 72  art, -1) ) retur
9680: 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
9690: 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50  e3ExprCompare(pP
96a0: 61 72 73 65 2c 20 70 31 2d 3e 70 45 6e 64 2c 20  arse, p1->pEnd, 
96b0: 70 32 2d 3e 70 45 6e 64 2c 20 2d 31 29 20 29 20  p2->pEnd, -1) ) 
96c0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
96d0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
96e0: 6f 6d 70 61 72 65 28 70 31 2d 3e 70 50 61 72 74  ompare(p1->pPart
96f0: 69 74 69 6f 6e 2c 20 70 32 2d 3e 70 50 61 72 74  ition, p2->pPart
9700: 69 74 69 6f 6e 2c 20 2d 31 29 20 29 20 72 65 74  ition, -1) ) ret
9710: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c  urn 1;.  if( sql
9720: 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
9730: 61 72 65 28 70 31 2d 3e 70 4f 72 64 65 72 42 79  are(p1->pOrderBy
9740: 2c 20 70 32 2d 3e 70 4f 72 64 65 72 42 79 2c 20  , p2->pOrderBy, 
9750: 2d 31 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  -1) ) return 1;.
9760: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a    return 0;.}...
9770: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61  /*.** This is ca
9780: 6c 6c 65 64 20 62 79 20 63 6f 64 65 20 69 6e 20  lled by code in 
9790: 73 65 6c 65 63 74 2e 63 20 62 65 66 6f 72 65 20  select.c before 
97a0: 69 74 20 63 61 6c 6c 73 20 73 71 6c 69 74 65 33  it calls sqlite3
97b0: 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20  WhereBegin().** 
97c0: 74 6f 20 62 65 67 69 6e 20 69 74 65 72 61 74 69  to begin iterati
97d0: 6e 67 20 74 68 72 6f 75 67 68 20 74 68 65 20 73  ng through the s
97e0: 75 62 2d 71 75 65 72 79 20 72 65 73 75 6c 74 73  ub-query results
97f0: 2e 20 49 74 20 69 73 20 75 73 65 64 20 74 6f 20  . It is used to 
9800: 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 61 6e 64 20  allocate.** and 
9810: 69 6e 69 74 69 61 6c 69 7a 65 20 72 65 67 69 73  initialize regis
9820: 74 65 72 73 20 61 6e 64 20 63 75 72 73 6f 72 73  ters and cursors
9830: 20 75 73 65 64 20 62 79 20 73 71 6c 69 74 65 33   used by sqlite3
9840: 57 69 6e 64 6f 77 43 6f 64 65 53 74 65 70 28 29  WindowCodeStep()
9850: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
9860: 33 57 69 6e 64 6f 77 43 6f 64 65 49 6e 69 74 28  3WindowCodeInit(
9870: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 57  Parse *pParse, W
9880: 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 29 7b 0a 20  indow *pMWin){. 
9890: 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20   Window *pWin;. 
98a0: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
98b0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
98c0: 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
98d0: 65 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 75  e registers to u
98e0: 73 65 20 66 6f 72 20 50 41 52 54 49 54 49 4f 4e  se for PARTITION
98f0: 20 42 59 20 76 61 6c 75 65 73 2c 20 69 66 20 61   BY values, if a
9900: 6e 79 2e 20 49 6e 69 74 69 61 6c 69 7a 65 0a 20  ny. Initialize. 
9910: 20 2a 2a 20 73 61 69 64 20 72 65 67 69 73 74 65   ** said registe
9920: 72 73 20 74 6f 20 4e 55 4c 4c 2e 20 20 2a 2f 0a  rs to NULL.  */.
9930: 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70 50 61    if( pMWin->pPa
9940: 72 74 69 74 69 6f 6e 20 29 7b 0a 20 20 20 20 69  rtition ){.    i
9950: 6e 74 20 6e 45 78 70 72 20 3d 20 70 4d 57 69 6e  nt nExpr = pMWin
9960: 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2d 3e 6e 45  ->pPartition->nE
9970: 78 70 72 3b 0a 20 20 20 20 70 4d 57 69 6e 2d 3e  xpr;.    pMWin->
9980: 72 65 67 50 61 72 74 20 3d 20 70 50 61 72 73 65  regPart = pParse
9990: 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50  ->nMem+1;.    pP
99a0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45  arse->nMem += nE
99b0: 78 70 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  xpr;.    sqlite3
99c0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
99d0: 5f 4e 75 6c 6c 2c 20 30 2c 20 70 4d 57 69 6e 2d  _Null, 0, pMWin-
99e0: 3e 72 65 67 50 61 72 74 2c 20 70 4d 57 69 6e 2d  >regPart, pMWin-
99f0: 3e 72 65 67 50 61 72 74 2b 6e 45 78 70 72 2d 31  >regPart+nExpr-1
9a00: 29 3b 0a 20 20 7d 0a 0a 20 20 70 4d 57 69 6e 2d  );.  }..  pMWin-
9a10: 3e 72 65 67 4f 6e 65 20 3d 20 2b 2b 70 50 61 72  >regOne = ++pPar
9a20: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69  se->nMem;.  sqli
9a30: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
9a40: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
9a50: 70 4d 57 69 6e 2d 3e 72 65 67 4f 6e 65 29 3b 0a  pMWin->regOne);.
9a60: 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45  .  if( pMWin->eE
9a70: 78 63 6c 75 64 65 20 29 7b 0a 20 20 20 20 70 4d  xclude ){.    pM
9a80: 57 69 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f 77  Win->regStartRow
9a90: 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  id = ++pParse->n
9aa0: 4d 65 6d 3b 0a 20 20 20 20 70 4d 57 69 6e 2d 3e  Mem;.    pMWin->
9ab0: 72 65 67 45 6e 64 52 6f 77 69 64 20 3d 20 2b 2b  regEndRowid = ++
9ac0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
9ad0: 20 20 70 4d 57 69 6e 2d 3e 63 73 72 41 70 70 20    pMWin->csrApp 
9ae0: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
9af0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
9b00: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
9b10: 74 65 67 65 72 2c 20 31 2c 20 70 4d 57 69 6e 2d  teger, 1, pMWin-
9b20: 3e 72 65 67 53 74 61 72 74 52 6f 77 69 64 29 3b  >regStartRowid);
9b30: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9b40: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
9b50: 65 67 65 72 2c 20 30 2c 20 70 4d 57 69 6e 2d 3e  eger, 0, pMWin->
9b60: 72 65 67 45 6e 64 52 6f 77 69 64 29 3b 0a 20 20  regEndRowid);.  
9b70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9b80: 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75  Op2(v, OP_OpenDu
9b90: 70 2c 20 70 4d 57 69 6e 2d 3e 63 73 72 41 70 70  p, pMWin->csrApp
9ba0: 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
9bb0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
9bc0: 20 7d 0a 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70   }..  for(pWin=p
9bd0: 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e  MWin; pWin; pWin
9be0: 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29  =pWin->pNextWin)
9bf0: 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70  {.    FuncDef *p
9c00: 20 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a   = pWin->pFunc;.
9c10: 20 20 20 20 69 66 28 20 28 70 2d 3e 66 75 6e 63      if( (p->func
9c20: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
9c30: 55 4e 43 5f 4d 49 4e 4d 41 58 29 20 26 26 20 70  UNC_MINMAX) && p
9c40: 57 69 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b 5f  Win->eStart!=TK_
9c50: 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20  UNBOUNDED ){.   
9c60: 20 20 20 2f 2a 20 54 68 65 20 69 6e 6c 69 6e 65     /* The inline
9c70: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 6d 69 6e   versions of min
9c80: 28 29 20 61 6e 64 20 6d 61 78 28 29 20 72 65 71  () and max() req
9c90: 75 69 72 65 20 61 20 73 69 6e 67 6c 65 20 65 70  uire a single ep
9ca0: 68 65 6d 65 72 61 6c 0a 20 20 20 20 20 20 2a 2a  hemeral.      **
9cb0: 20 74 61 62 6c 65 20 61 6e 64 20 33 20 72 65 67   table and 3 reg
9cc0: 69 73 74 65 72 73 2e 20 54 68 65 20 72 65 67 69  isters. The regi
9cd0: 73 74 65 72 73 20 61 72 65 20 75 73 65 64 20 61  sters are used a
9ce0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20  s follows:.     
9cf0: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 72   **.      **   r
9d00: 65 67 41 70 70 2b 30 3a 20 73 6c 6f 74 20 74 6f  egApp+0: slot to
9d10: 20 63 6f 70 79 20 6d 69 6e 28 29 2f 6d 61 78 28   copy min()/max(
9d20: 29 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 66 6f  ) argument to fo
9d30: 72 20 4d 61 6b 65 52 65 63 6f 72 64 0a 20 20 20  r MakeRecord.   
9d40: 20 20 20 2a 2a 20 20 20 72 65 67 41 70 70 2b 31     **   regApp+1
9d50: 3a 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20  : integer value 
9d60: 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 6b  used to ensure k
9d70: 65 79 73 20 61 72 65 20 75 6e 69 71 75 65 0a 20  eys are unique. 
9d80: 20 20 20 20 20 2a 2a 20 20 20 72 65 67 41 70 70       **   regApp
9d90: 2b 32 3a 20 6f 75 74 70 75 74 20 6f 66 20 4d 61  +2: output of Ma
9da0: 6b 65 52 65 63 6f 72 64 0a 20 20 20 20 20 20 2a  keRecord.      *
9db0: 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  /.      ExprList
9dc0: 20 2a 70 4c 69 73 74 20 3d 20 70 57 69 6e 2d 3e   *pList = pWin->
9dd0: 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 3b  pOwner->x.pList;
9de0: 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
9df0: 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
9e00: 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  e3KeyInfoFromExp
9e10: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c  rList(pParse, pL
9e20: 69 73 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ist, 0, 0);.    
9e30: 20 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 20 3d    pWin->csrApp =
9e40: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
9e50: 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 72 65 67  .      pWin->reg
9e60: 41 70 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  App = pParse->nM
9e70: 65 6d 2b 31 3b 0a 20 20 20 20 20 20 70 50 61 72  em+1;.      pPar
9e80: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 33 3b 0a 20  se->nMem += 3;. 
9e90: 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
9ea0: 6f 20 26 26 20 70 57 69 6e 2d 3e 70 46 75 6e 63  o && pWin->pFunc
9eb0: 2d 3e 7a 4e 61 6d 65 5b 31 5d 3d 3d 27 69 27 20  ->zName[1]=='i' 
9ec0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
9ed0: 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  t( pKeyInfo->aSo
9ee0: 72 74 4f 72 64 65 72 5b 30 5d 3d 3d 30 20 29 3b  rtOrder[0]==0 );
9ef0: 0a 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66  .        pKeyInf
9f00: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d  o->aSortOrder[0]
9f10: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
9f20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9f30: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
9f40: 45 70 68 65 6d 65 72 61 6c 2c 20 70 57 69 6e 2d  Ephemeral, pWin-
9f50: 3e 63 73 72 41 70 70 2c 20 32 29 3b 0a 20 20 20  >csrApp, 2);.   
9f60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70     sqlite3VdbeAp
9f70: 70 65 6e 64 50 34 28 76 2c 20 70 4b 65 79 49 6e  pendP4(v, pKeyIn
9f80: 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
9f90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
9fa0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
9fb0: 6e 74 65 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d  nteger, 0, pWin-
9fc0: 3e 72 65 67 41 70 70 2b 31 29 3b 0a 20 20 20 20  >regApp+1);.    
9fd0: 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70  }.    else if( p
9fe0: 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c  ->zName==nth_val
9ff0: 75 65 4e 61 6d 65 20 7c 7c 20 70 2d 3e 7a 4e 61  ueName || p->zNa
a000: 6d 65 3d 3d 66 69 72 73 74 5f 76 61 6c 75 65 4e  me==first_valueN
a010: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ame ){.      /* 
a020: 41 6c 6c 6f 63 61 74 65 20 74 77 6f 20 72 65 67  Allocate two reg
a030: 69 73 74 65 72 73 20 61 74 20 70 57 69 6e 2d 3e  isters at pWin->
a040: 72 65 67 41 70 70 2e 20 54 68 65 73 65 20 77 69  regApp. These wi
a050: 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 0a 20 20  ll be used to.  
a060: 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65      ** store the
a070: 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 69   start and end i
a080: 6e 64 65 78 20 6f 66 20 74 68 65 20 63 75 72 72  ndex of the curr
a090: 65 6e 74 20 66 72 61 6d 65 2e 20 20 2a 2f 0a 20  ent frame.  */. 
a0a0: 20 20 20 20 20 70 57 69 6e 2d 3e 72 65 67 41 70       pWin->regAp
a0b0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  p = pParse->nMem
a0c0: 2b 31 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e  +1;.      pWin->
a0d0: 63 73 72 41 70 70 20 3d 20 70 50 61 72 73 65 2d  csrApp = pParse-
a0e0: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70  >nTab++;.      p
a0f0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 32  Parse->nMem += 2
a100: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
a110: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
a120: 4f 70 65 6e 44 75 70 2c 20 70 57 69 6e 2d 3e 63  OpenDup, pWin->c
a130: 73 72 41 70 70 2c 20 70 4d 57 69 6e 2d 3e 69 45  srApp, pMWin->iE
a140: 70 68 43 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20  phCsr);.    }.  
a150: 20 20 65 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4e    else if( p->zN
a160: 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65 20 7c 7c  ame==leadName ||
a170: 20 70 2d 3e 7a 4e 61 6d 65 3d 3d 6c 61 67 4e 61   p->zName==lagNa
a180: 6d 65 20 29 7b 0a 20 20 20 20 20 20 70 57 69 6e  me ){.      pWin
a190: 2d 3e 63 73 72 41 70 70 20 3d 20 70 50 61 72 73  ->csrApp = pPars
a1a0: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
a1b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a1c0: 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70  p2(v, OP_OpenDup
a1d0: 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20  , pWin->csrApp, 
a1e0: 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b  pMWin->iEphCsr);
a1f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 64  .    }.  }.}..#d
a200: 65 66 69 6e 65 20 57 49 4e 44 4f 57 5f 53 54 41  efine WINDOW_STA
a210: 52 54 49 4e 47 5f 49 4e 54 20 20 30 0a 23 64 65  RTING_INT  0.#de
a220: 66 69 6e 65 20 57 49 4e 44 4f 57 5f 45 4e 44 49  fine WINDOW_ENDI
a230: 4e 47 5f 49 4e 54 20 20 20 20 31 0a 23 64 65 66  NG_INT    1.#def
a240: 69 6e 65 20 57 49 4e 44 4f 57 5f 4e 54 48 5f 56  ine WINDOW_NTH_V
a250: 41 4c 55 45 5f 49 4e 54 20 32 0a 23 64 65 66 69  ALUE_INT 2.#defi
a260: 6e 65 20 57 49 4e 44 4f 57 5f 53 54 41 52 54 49  ne WINDOW_STARTI
a270: 4e 47 5f 4e 55 4d 20 20 33 0a 23 64 65 66 69 6e  NG_NUM  3.#defin
a280: 65 20 57 49 4e 44 4f 57 5f 45 4e 44 49 4e 47 5f  e WINDOW_ENDING_
a290: 4e 55 4d 20 20 20 20 34 0a 0a 2f 2a 0a 2a 2a 20  NUM    4../*.** 
a2a0: 41 20 22 50 52 45 43 45 44 49 4e 47 20 3c 65 78  A "PRECEDING <ex
a2b0: 70 72 3e 22 20 28 65 43 6f 6e 64 3d 3d 30 29 20  pr>" (eCond==0) 
a2c0: 6f 72 20 22 46 4f 4c 4c 4f 57 49 4e 47 20 3c 65  or "FOLLOWING <e
a2d0: 78 70 72 3e 22 20 28 65 43 6f 6e 64 3d 3d 31 29  xpr>" (eCond==1)
a2e0: 20 6f 72 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65   or the.** value
a2f0: 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   of the second a
a300: 72 67 75 6d 65 6e 74 20 74 6f 20 6e 74 68 5f 76  rgument to nth_v
a310: 61 6c 75 65 28 29 20 28 65 43 6f 6e 64 3d 3d 32  alue() (eCond==2
a320: 29 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 0a  ) has just been.
a330: 2a 2a 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  ** evaluated and
a340: 20 74 68 65 20 72 65 73 75 6c 74 20 6c 65 66 74   the result left
a350: 20 69 6e 20 72 65 67 69 73 74 65 72 20 72 65 67   in register reg
a360: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
a370: 67 65 6e 65 72 61 74 65 73 20 56 4d 0a 2a 2a 20  generates VM.** 
a380: 63 6f 64 65 20 74 6f 20 63 68 65 63 6b 20 74 68  code to check th
a390: 61 74 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  at the value is 
a3a0: 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69  a non-negative i
a3b0: 6e 74 65 67 65 72 20 61 6e 64 20 74 68 72 6f 77  nteger and throw
a3c0: 73 20 61 6e 0a 2a 2a 20 65 78 63 65 70 74 69 6f  s an.** exceptio
a3d0: 6e 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2e 0a  n if it is not..
a3e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
a3f0: 69 6e 64 6f 77 43 68 65 63 6b 56 61 6c 75 65 28  indowCheckValue(
a400: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
a410: 6e 74 20 72 65 67 2c 20 69 6e 74 20 65 43 6f 6e  nt reg, int eCon
a420: 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  d){.  static con
a430: 73 74 20 63 68 61 72 20 2a 61 7a 45 72 72 5b 5d  st char *azErr[]
a440: 20 3d 20 7b 0a 20 20 20 20 22 66 72 61 6d 65 20   = {.    "frame 
a450: 73 74 61 72 74 69 6e 67 20 6f 66 66 73 65 74 20  starting offset 
a460: 6d 75 73 74 20 62 65 20 61 20 6e 6f 6e 2d 6e 65  must be a non-ne
a470: 67 61 74 69 76 65 20 69 6e 74 65 67 65 72 22 2c  gative integer",
a480: 0a 20 20 20 20 22 66 72 61 6d 65 20 65 6e 64 69  .    "frame endi
a490: 6e 67 20 6f 66 66 73 65 74 20 6d 75 73 74 20 62  ng offset must b
a4a0: 65 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65  e a non-negative
a4b0: 20 69 6e 74 65 67 65 72 22 2c 0a 20 20 20 20 22   integer",.    "
a4c0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
a4d0: 74 6f 20 6e 74 68 5f 76 61 6c 75 65 20 6d 75 73  to nth_value mus
a4e0: 74 20 62 65 20 61 20 70 6f 73 69 74 69 76 65 20  t be a positive 
a4f0: 69 6e 74 65 67 65 72 22 2c 0a 20 20 20 20 22 66  integer",.    "f
a500: 72 61 6d 65 20 73 74 61 72 74 69 6e 67 20 6f 66  rame starting of
a510: 66 73 65 74 20 6d 75 73 74 20 62 65 20 61 20 6e  fset must be a n
a520: 6f 6e 2d 6e 65 67 61 74 69 76 65 20 6e 75 6d 62  on-negative numb
a530: 65 72 22 2c 0a 20 20 20 20 22 66 72 61 6d 65 20  er",.    "frame 
a540: 65 6e 64 69 6e 67 20 6f 66 66 73 65 74 20 6d 75  ending offset mu
a550: 73 74 20 62 65 20 61 20 6e 6f 6e 2d 6e 65 67 61  st be a non-nega
a560: 74 69 76 65 20 6e 75 6d 62 65 72 22 2c 0a 20 20  tive number",.  
a570: 7d 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  };.  static int 
a580: 61 4f 70 5b 5d 20 3d 20 7b 20 4f 50 5f 47 65 2c  aOp[] = { OP_Ge,
a590: 20 4f 50 5f 47 65 2c 20 4f 50 5f 47 74 2c 20 4f   OP_Ge, OP_Gt, O
a5a0: 50 5f 47 65 2c 20 4f 50 5f 47 65 20 7d 3b 0a 20  P_Ge, OP_Ge };. 
a5b0: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
a5c0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
a5d0: 29 3b 0a 20 20 69 6e 74 20 72 65 67 5a 65 72 6f  );.  int regZero
a5e0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
a5f0: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
a600: 61 73 73 65 72 74 28 20 65 43 6f 6e 64 3e 3d 30  assert( eCond>=0
a610: 20 26 26 20 65 43 6f 6e 64 3c 41 72 72 61 79 53   && eCond<ArrayS
a620: 69 7a 65 28 61 7a 45 72 72 29 20 29 3b 0a 20 20  ize(azErr) );.  
a630: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a640: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
a650: 20 30 2c 20 72 65 67 5a 65 72 6f 29 3b 0a 20 20   0, regZero);.  
a660: 69 66 28 20 65 43 6f 6e 64 3e 3d 57 49 4e 44 4f  if( eCond>=WINDO
a670: 57 5f 53 54 41 52 54 49 4e 47 5f 4e 55 4d 20 29  W_STARTING_NUM )
a680: 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 53 74 72  {.    int regStr
a690: 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ing = sqlite3Get
a6a0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
a6b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a6c0: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72  AddOp4(v, OP_Str
a6d0: 69 6e 67 38 2c 20 30 2c 20 72 65 67 53 74 72 69  ing8, 0, regStri
a6e0: 6e 67 2c 20 30 2c 20 22 22 2c 20 50 34 5f 53 54  ng, 0, "", P4_ST
a6f0: 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74  ATIC);.    sqlit
a700: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
a710: 4f 50 5f 47 65 2c 20 72 65 67 53 74 72 69 6e 67  OP_Ge, regString
a720: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
a730: 72 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 72  rentAddr(v)+2, r
a740: 65 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  eg);.    sqlite3
a750: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
a760: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
a770: 49 43 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  IC);.  }else{.  
a780: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a790: 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op2(v, OP_MustBe
a7a0: 49 6e 74 2c 20 72 65 67 2c 20 73 71 6c 69 74 65  Int, reg, sqlite
a7b0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
a7c0: 28 76 29 2b 32 29 3b 0a 20 20 7d 0a 20 20 56 64  (v)+2);.  }.  Vd
a7d0: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
a7e0: 65 43 6f 6e 64 3d 3d 30 29 3b 0a 20 20 56 64 62  eCond==0);.  Vdb
a7f0: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 65  eCoverageIf(v, e
a800: 43 6f 6e 64 3d 3d 31 29 3b 0a 20 20 56 64 62 65  Cond==1);.  Vdbe
a810: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 65 43  CoverageIf(v, eC
a820: 6f 6e 64 3d 3d 32 29 3b 0a 20 20 56 64 62 65 43  ond==2);.  VdbeC
a830: 6f 76 65 72 61 67 65 49 66 28 76 2c 20 65 43 6f  overageIf(v, eCo
a840: 6e 64 3d 3d 33 29 3b 0a 20 20 56 64 62 65 43 6f  nd==3);.  VdbeCo
a850: 76 65 72 61 67 65 49 66 28 76 2c 20 65 43 6f 6e  verageIf(v, eCon
a860: 64 3d 3d 34 29 3b 0a 20 20 73 71 6c 69 74 65 33  d==4);.  sqlite3
a870: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 61 4f  VdbeAddOp3(v, aO
a880: 70 5b 65 43 6f 6e 64 5d 2c 20 72 65 67 5a 65 72  p[eCond], regZer
a890: 6f 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  o, sqlite3VdbeCu
a8a0: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 20  rrentAddr(v)+2, 
a8b0: 72 65 67 29 3b 0a 20 20 56 64 62 65 43 6f 76 65  reg);.  VdbeCove
a8c0: 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c 49 66 28  rageNeverNullIf(
a8d0: 76 2c 20 65 43 6f 6e 64 3d 3d 30 29 3b 0a 20 20  v, eCond==0);.  
a8e0: 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65  VdbeCoverageNeve
a8f0: 72 4e 75 6c 6c 49 66 28 76 2c 20 65 43 6f 6e 64  rNullIf(v, eCond
a900: 3d 3d 31 29 3b 0a 20 20 56 64 62 65 43 6f 76 65  ==1);.  VdbeCove
a910: 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c 49 66 28  rageNeverNullIf(
a920: 76 2c 20 65 43 6f 6e 64 3d 3d 32 29 3b 0a 20 20  v, eCond==2);.  
a930: 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65  VdbeCoverageNeve
a940: 72 4e 75 6c 6c 49 66 28 76 2c 20 65 43 6f 6e 64  rNullIf(v, eCond
a950: 3d 3d 33 29 3b 0a 20 20 56 64 62 65 43 6f 76 65  ==3);.  VdbeCove
a960: 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c 49 66 28  rageNeverNullIf(
a970: 76 2c 20 65 43 6f 6e 64 3d 3d 34 29 3b 0a 20 20  v, eCond==4);.  
a980: 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28  sqlite3MayAbort(
a990: 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
a9a0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
a9b0: 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f  OP_Halt, SQLITE_
a9c0: 45 52 52 4f 52 2c 20 4f 45 5f 41 62 6f 72 74 29  ERROR, OE_Abort)
a9d0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
a9e0: 70 70 65 6e 64 50 34 28 76 2c 20 28 76 6f 69 64  ppendP4(v, (void
a9f0: 2a 29 61 7a 45 72 72 5b 65 43 6f 6e 64 5d 2c 20  *)azErr[eCond], 
aa00: 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 73 71  P4_STATIC);.  sq
aa10: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
aa20: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 5a  Reg(pParse, regZ
aa30: 65 72 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ero);.}../*.** R
aa40: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
aa50: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61   of arguments pa
aa60: 73 73 65 64 20 74 6f 20 74 68 65 20 77 69 6e 64  ssed to the wind
aa70: 6f 77 2d 66 75 6e 63 74 69 6f 6e 20 61 73 73 6f  ow-function asso
aa80: 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
aa90: 68 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  he object passed
aaa0: 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
aab0: 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
aac0: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
aad0: 63 20 69 6e 74 20 77 69 6e 64 6f 77 41 72 67 43  c int windowArgC
aae0: 6f 75 6e 74 28 57 69 6e 64 6f 77 20 2a 70 57 69  ount(Window *pWi
aaf0: 6e 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  n){.  ExprList *
ab00: 70 4c 69 73 74 20 3d 20 70 57 69 6e 2d 3e 70 4f  pList = pWin->pO
ab10: 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  wner->x.pList;. 
ab20: 20 72 65 74 75 72 6e 20 28 70 4c 69 73 74 20 3f   return (pList ?
ab30: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20   pList->nExpr : 
ab40: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  0);.}../*.** Gen
ab50: 65 72 61 74 65 20 56 4d 20 63 6f 64 65 20 74 6f  erate VM code to
ab60: 20 69 6e 76 6f 6b 65 20 65 69 74 68 65 72 20 78   invoke either x
ab70: 53 74 65 70 28 29 20 28 69 66 20 62 49 6e 76 65  Step() (if bInve
ab80: 72 73 65 20 69 73 20 30 29 20 6f 72 20 0a 2a 2a  rse is 0) or .**
ab90: 20 78 49 6e 76 65 72 73 65 20 28 69 66 20 62 49   xInverse (if bI
aba0: 6e 76 65 72 73 65 20 69 73 20 6e 6f 6e 2d 7a 65  nverse is non-ze
abb0: 72 6f 29 20 66 6f 72 20 65 61 63 68 20 77 69 6e  ro) for each win
abc0: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20  dow function in 
abd0: 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c  the .** linked l
abe0: 69 73 74 20 73 74 61 72 74 69 6e 67 20 61 74 20  ist starting at 
abf0: 70 4d 57 69 6e 2e 20 4f 72 2c 20 66 6f 72 20 62  pMWin. Or, for b
ac00: 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66  uilt-in window f
ac10: 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 74 68 61 74  unctions.** that
ac20: 20 64 6f 20 6e 6f 74 20 75 73 65 20 74 68 65 20   do not use the 
ac30: 73 74 61 6e 64 61 72 64 20 66 75 6e 63 74 69 6f  standard functio
ac40: 6e 20 41 50 49 2c 20 67 65 6e 65 72 61 74 65 20  n API, generate 
ac50: 74 68 65 20 72 65 71 75 69 72 65 64 0a 2a 2a 20  the required.** 
ac60: 69 6e 6c 69 6e 65 20 56 4d 20 63 6f 64 65 2e 0a  inline VM code..
ac70: 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  **.** If argumen
ac80: 74 20 63 73 72 20 69 73 20 67 72 65 61 74 65 72  t csr is greater
ac90: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
aca0: 6f 20 30 2c 20 74 68 65 6e 20 61 72 67 75 6d 65  o 0, then argume
acb0: 6e 74 20 72 65 67 20 69 73 0a 2a 2a 20 74 68 65  nt reg is.** the
acc0: 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20   first register 
acd0: 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72  in an array of r
ace0: 65 67 69 73 74 65 72 73 20 67 75 61 72 61 6e 74  egisters guarant
acf0: 65 65 64 20 74 6f 20 62 65 20 6c 61 72 67 65 0a  eed to be large.
ad00: 2a 2a 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ** enough to hol
ad10: 64 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 61  d the array of a
ad20: 72 67 75 6d 65 6e 74 73 20 66 6f 72 20 65 61 63  rguments for eac
ad30: 68 20 66 75 6e 63 74 69 6f 6e 2e 20 49 6e 20 74  h function. In t
ad40: 68 69 73 20 63 61 73 65 0a 2a 2a 20 74 68 65 20  his case.** the 
ad50: 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 65 78  arguments are ex
ad60: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
ad70: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
ad80: 63 73 72 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20  csr into the.** 
ad90: 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  array of registe
ada0: 72 73 20 62 65 66 6f 72 65 20 69 6e 76 6f 6b 69  rs before invoki
adb0: 6e 67 20 4f 50 5f 41 67 67 53 74 65 70 20 6f 72  ng OP_AggStep or
adc0: 20 4f 50 5f 41 67 67 49 6e 76 65 72 73 65 0a 2a   OP_AggInverse.*
add0: 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 63 73 72 20  *.** Or, if csr 
ade0: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
adf0: 6f 2c 20 74 68 65 6e 20 74 68 65 20 61 72 72 61  o, then the arra
ae00: 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 61  y of registers a
ae10: 74 20 72 65 67 20 69 73 0a 2a 2a 20 61 6c 72 65  t reg is.** alre
ae20: 61 64 79 20 70 6f 70 75 6c 61 74 65 64 20 77 69  ady populated wi
ae30: 74 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 66  th all columns f
ae40: 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20  rom the current 
ae50: 72 6f 77 20 6f 66 20 74 68 65 20 73 75 62 2d 71  row of the sub-q
ae60: 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  uery..**.** If a
ae70: 72 67 75 6d 65 6e 74 20 72 65 67 50 61 72 74 53  rgument regPartS
ae80: 69 7a 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ize is non-zero,
ae90: 20 74 68 65 6e 20 69 74 20 69 73 20 61 20 72 65   then it is a re
aea0: 67 69 73 74 65 72 20 63 6f 6e 74 61 69 6e 69 6e  gister containin
aeb0: 67 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  g the.** number 
aec0: 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 63  of rows in the c
aed0: 75 72 72 65 6e 74 20 70 61 72 74 69 74 69 6f 6e  urrent partition
aee0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
aef0: 20 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28 0a   windowAggStep(.
af00: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
af10: 20 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69   .  Window *pMWi
af20: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
af30: 20 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69      /* Linked li
af40: 73 74 20 6f 66 20 77 69 6e 64 6f 77 20 66 75 6e  st of window fun
af50: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ctions */.  int 
af60: 63 73 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  csr,            
af70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
af80: 65 61 64 20 61 72 67 75 6d 65 6e 74 73 20 66 72  ead arguments fr
af90: 6f 6d 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a  om this cursor *
afa0: 2f 0a 20 20 69 6e 74 20 62 49 6e 76 65 72 73 65  /.  int bInverse
afb0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
afc0: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69      /* True to i
afd0: 6e 76 6f 6b 65 20 78 49 6e 76 65 72 73 65 20 69  nvoke xInverse i
afe0: 6e 73 74 65 61 64 20 6f 66 20 78 53 74 65 70 20  nstead of xStep 
aff0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 20 20 20 20  */.  int reg    
b000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b010: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
b020: 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 29 7b   registers */.){
b030: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
b040: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
b050: 73 65 29 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70  se);.  Window *p
b060: 57 69 6e 3b 0a 20 20 66 6f 72 28 70 57 69 6e 3d  Win;.  for(pWin=
b070: 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69  pMWin; pWin; pWi
b080: 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e  n=pWin->pNextWin
b090: 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a  ){.    FuncDef *
b0a0: 70 46 75 6e 63 20 3d 20 70 57 69 6e 2d 3e 70 46  pFunc = pWin->pF
b0b0: 75 6e 63 3b 0a 20 20 20 20 69 6e 74 20 72 65 67  unc;.    int reg
b0c0: 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72  Arg;.    int nAr
b0d0: 67 20 3d 20 77 69 6e 64 6f 77 41 72 67 43 6f 75  g = windowArgCou
b0e0: 6e 74 28 70 57 69 6e 29 3b 0a 20 20 20 20 69 6e  nt(pWin);.    in
b0f0: 74 20 69 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d  t i;..    for(i=
b100: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
b110: 0a 20 20 20 20 20 20 69 66 28 20 69 21 3d 31 20  .      if( i!=1 
b120: 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 21  || pFunc->zName!
b130: 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 20 29  =nth_valueName )
b140: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
b150: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
b160: 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20 70  P_Column, csr, p
b170: 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 69 2c 20  Win->iArgCol+i, 
b180: 72 65 67 2b 69 29 3b 0a 20 20 20 20 20 20 7d 65  reg+i);.      }e
b190: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
b1a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
b1b0: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 4d 57  , OP_Column, pMW
b1c0: 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 70 57 69  in->iEphCsr, pWi
b1d0: 6e 2d 3e 69 41 72 67 43 6f 6c 2b 69 2c 20 72 65  n->iArgCol+i, re
b1e0: 67 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  g+i);.      }.  
b1f0: 20 20 7d 0a 20 20 20 20 72 65 67 41 72 67 20 3d    }.    regArg =
b200: 20 72 65 67 3b 0a 0a 20 20 20 20 69 66 28 20 70   reg;..    if( p
b210: 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f  MWin->regStartRo
b220: 77 69 64 3d 3d 30 0a 20 20 20 20 20 26 26 20 28  wid==0.     && (
b230: 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73  pFunc->funcFlags
b240: 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d   & SQLITE_FUNC_M
b250: 49 4e 4d 41 58 29 20 0a 20 20 20 20 20 26 26 20  INMAX) .     && 
b260: 28 70 57 69 6e 2d 3e 65 53 74 61 72 74 21 3d 54  (pWin->eStart!=T
b270: 4b 5f 55 4e 42 4f 55 4e 44 45 44 29 0a 20 20 20  K_UNBOUNDED).   
b280: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64   ){.      int ad
b290: 64 72 49 73 4e 75 6c 6c 20 3d 20 73 71 6c 69 74  drIsNull = sqlit
b2a0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
b2b0: 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 41 72  OP_IsNull, regAr
b2c0: 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
b2d0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
b2e0: 20 69 66 28 20 62 49 6e 76 65 72 73 65 3d 3d 30   if( bInverse==0
b2f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
b300: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
b310: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 57 69 6e   OP_AddImm, pWin
b320: 2d 3e 72 65 67 41 70 70 2b 31 2c 20 31 29 3b 0a  ->regApp+1, 1);.
b330: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b340: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b350: 53 43 6f 70 79 2c 20 72 65 67 41 72 67 2c 20 70  SCopy, regArg, p
b360: 57 69 6e 2d 3e 72 65 67 41 70 70 29 3b 0a 20 20  Win->regApp);.  
b370: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b380: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
b390: 6b 65 52 65 63 6f 72 64 2c 20 70 57 69 6e 2d 3e  keRecord, pWin->
b3a0: 72 65 67 41 70 70 2c 20 32 2c 20 70 57 69 6e 2d  regApp, 2, pWin-
b3b0: 3e 72 65 67 41 70 70 2b 32 29 3b 0a 20 20 20 20  >regApp+2);.    
b3c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b3d0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
b3e0: 6e 73 65 72 74 2c 20 70 57 69 6e 2d 3e 63 73 72  nsert, pWin->csr
b3f0: 41 70 70 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70  App, pWin->regAp
b400: 70 2b 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  p+2);.      }els
b410: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
b420: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
b430: 76 2c 20 4f 50 5f 53 65 65 6b 47 45 2c 20 70 57  v, OP_SeekGE, pW
b440: 69 6e 2d 3e 63 73 72 41 70 70 2c 20 30 2c 20 72  in->csrApp, 0, r
b450: 65 67 41 72 67 2c 20 31 29 3b 0a 20 20 20 20 20  egArg, 1);.     
b460: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e     VdbeCoverageN
b470: 65 76 65 72 54 61 6b 65 6e 28 76 29 3b 0a 20 20  everTaken(v);.  
b480: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b490: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65  eAddOp1(v, OP_De
b4a0: 6c 65 74 65 2c 20 70 57 69 6e 2d 3e 63 73 72 41  lete, pWin->csrA
b4b0: 70 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  pp);.        sql
b4c0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
b4d0: 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  (v, sqlite3VdbeC
b4e0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 32 29  urrentAddr(v)-2)
b4f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b500: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
b510: 65 72 65 28 76 2c 20 61 64 64 72 49 73 4e 75 6c  ere(v, addrIsNul
b520: 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  l);.    }else if
b530: 28 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 20 29  ( pWin->regApp )
b540: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
b550: 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74  pFunc->zName==nt
b560: 68 5f 76 61 6c 75 65 4e 61 6d 65 0a 20 20 20 20  h_valueName.    
b570: 20 20 20 20 20 20 20 7c 7c 20 70 46 75 6e 63 2d         || pFunc-
b580: 3e 7a 4e 61 6d 65 3d 3d 66 69 72 73 74 5f 76 61  >zName==first_va
b590: 6c 75 65 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b  lueName.      );
b5a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 62  .      assert( b
b5b0: 49 6e 76 65 72 73 65 3d 3d 30 20 7c 7c 20 62 49  Inverse==0 || bI
b5c0: 6e 76 65 72 73 65 3d 3d 31 20 29 3b 0a 20 20 20  nverse==1 );.   
b5d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b5e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
b5f0: 6d 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b  m, pWin->regApp+
b600: 31 2d 62 49 6e 76 65 72 73 65 2c 20 31 29 3b 0a  1-bInverse, 1);.
b610: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 46      }else if( pF
b620: 75 6e 63 2d 3e 78 53 46 75 6e 63 21 3d 6e 6f 6f  unc->xSFunc!=noo
b630: 70 53 74 65 70 46 75 6e 63 20 29 7b 0a 20 20 20  pStepFunc ){.   
b640: 20 20 20 69 6e 74 20 61 64 64 72 49 66 20 3d 20     int addrIf = 
b650: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 69  0;.      if( pWi
b660: 6e 2d 3e 70 46 69 6c 74 65 72 20 29 7b 0a 20 20  n->pFilter ){.  
b670: 20 20 20 20 20 20 69 6e 74 20 72 65 67 54 6d 70        int regTmp
b680: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
b690: 28 20 6e 41 72 67 3d 3d 30 20 7c 7c 20 6e 41 72  ( nArg==0 || nAr
b6a0: 67 3d 3d 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d  g==pWin->pOwner-
b6b0: 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  >x.pList->nExpr 
b6c0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
b6d0: 74 28 20 6e 41 72 67 20 7c 7c 20 70 57 69 6e 2d  t( nArg || pWin-
b6e0: 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74  >pOwner->x.pList
b6f0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ==0 );.        r
b700: 65 67 54 6d 70 20 3d 20 73 71 6c 69 74 65 33 47  egTmp = sqlite3G
b710: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
b720: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
b730: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
b740: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20  OP_Column, csr, 
b750: 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 6e 41  pWin->iArgCol+nA
b760: 72 67 2c 72 65 67 54 6d 70 29 3b 0a 20 20 20 20  rg,regTmp);.    
b770: 20 20 20 20 61 64 64 72 49 66 20 3d 20 73 71 6c      addrIf = sql
b780: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
b790: 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 54  , OP_IfNot, regT
b7a0: 6d 70 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 20  mp, 0, 1);.     
b7b0: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
b7c0: 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
b7d0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
b7e0: 67 28 70 50 61 72 73 65 2c 20 72 65 67 54 6d 70  g(pParse, regTmp
b7f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
b800: 20 69 66 28 20 70 46 75 6e 63 2d 3e 66 75 6e 63   if( pFunc->func
b810: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
b820: 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a  UNC_NEEDCOLL ){.
b830: 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
b840: 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  *pColl;.        
b850: 61 73 73 65 72 74 28 20 6e 41 72 67 3e 30 20 29  assert( nArg>0 )
b860: 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  ;.        pColl 
b870: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43  = sqlite3ExprNNC
b880: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
b890: 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70  Win->pOwner->x.p
b8a0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
b8b0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
b8c0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
b8d0: 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 30 2c  OP_CollSeq, 0,0,
b8e0: 30 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  0, (const char*)
b8f0: 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
b900: 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Q);.      }.    
b910: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b920: 4f 70 33 28 76 2c 20 62 49 6e 76 65 72 73 65 3f  Op3(v, bInverse?
b930: 20 4f 50 5f 41 67 67 49 6e 76 65 72 73 65 20 3a   OP_AggInverse :
b940: 20 4f 50 5f 41 67 67 53 74 65 70 2c 20 0a 20 20   OP_AggStep, .  
b950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b960: 20 20 20 20 20 20 62 49 6e 76 65 72 73 65 2c 20        bInverse, 
b970: 72 65 67 41 72 67 2c 20 70 57 69 6e 2d 3e 72 65  regArg, pWin->re
b980: 67 41 63 63 75 6d 29 3b 0a 20 20 20 20 20 20 73  gAccum);.      s
b990: 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64  qlite3VdbeAppend
b9a0: 50 34 28 76 2c 20 70 46 75 6e 63 2c 20 50 34 5f  P4(v, pFunc, P4_
b9b0: 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20  FUNCDEF);.      
b9c0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
b9d0: 65 50 35 28 76 2c 20 28 75 38 29 6e 41 72 67 29  eP5(v, (u8)nArg)
b9e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 61 64 64 72  ;.      if( addr
b9f0: 49 66 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  If ) sqlite3Vdbe
ba00: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
ba10: 49 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  If);.    }.  }.}
ba20: 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
ba30: 20 57 69 6e 64 6f 77 43 6f 64 65 41 72 67 20 57   WindowCodeArg W
ba40: 69 6e 64 6f 77 43 6f 64 65 41 72 67 3b 0a 74 79  indowCodeArg;.ty
ba50: 70 65 64 65 66 20 73 74 72 75 63 74 20 57 69 6e  pedef struct Win
ba60: 64 6f 77 43 73 72 41 6e 64 52 65 67 20 57 69 6e  dowCsrAndReg Win
ba70: 64 6f 77 43 73 72 41 6e 64 52 65 67 3b 0a 73 74  dowCsrAndReg;.st
ba80: 72 75 63 74 20 57 69 6e 64 6f 77 43 73 72 41 6e  ruct WindowCsrAn
ba90: 64 52 65 67 20 7b 0a 20 20 69 6e 74 20 63 73 72  dReg {.  int csr
baa0: 3b 0a 20 20 69 6e 74 20 72 65 67 3b 0a 7d 3b 0a  ;.  int reg;.};.
bab0: 0a 73 74 72 75 63 74 20 57 69 6e 64 6f 77 43 6f  .struct WindowCo
bac0: 64 65 41 72 67 20 7b 0a 20 20 50 61 72 73 65 20  deArg {.  Parse 
bad0: 2a 70 50 61 72 73 65 3b 0a 20 20 57 69 6e 64 6f  *pParse;.  Windo
bae0: 77 20 2a 70 4d 57 69 6e 3b 0a 20 20 56 64 62 65  w *pMWin;.  Vdbe
baf0: 20 2a 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 72   *pVdbe;.  int r
bb00: 65 67 47 6f 73 75 62 3b 0a 20 20 69 6e 74 20 61  egGosub;.  int a
bb10: 64 64 72 47 6f 73 75 62 3b 0a 20 20 69 6e 74 20  ddrGosub;.  int 
bb20: 72 65 67 41 72 67 3b 0a 20 20 69 6e 74 20 65 44  regArg;.  int eD
bb30: 65 6c 65 74 65 3b 0a 0a 20 20 57 69 6e 64 6f 77  elete;..  Window
bb40: 43 73 72 41 6e 64 52 65 67 20 73 74 61 72 74 3b  CsrAndReg start;
bb50: 0a 20 20 57 69 6e 64 6f 77 43 73 72 41 6e 64 52  .  WindowCsrAndR
bb60: 65 67 20 63 75 72 72 65 6e 74 3b 0a 20 20 57 69  eg current;.  Wi
bb70: 6e 64 6f 77 43 73 72 41 6e 64 52 65 67 20 65 6e  ndowCsrAndReg en
bb80: 64 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c  d;.};../*.** Val
bb90: 75 65 73 20 74 68 61 74 20 6d 61 79 20 62 65 20  ues that may be 
bba0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
bbb0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
bbc0: 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 29 2e   windowCodeOp().
bbd0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 44  .*/.#define WIND
bbe0: 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 20 31 0a  OW_RETURN_ROW 1.
bbf0: 23 64 65 66 69 6e 65 20 57 49 4e 44 4f 57 5f 41  #define WINDOW_A
bc00: 47 47 49 4e 56 45 52 53 45 20 32 0a 23 64 65 66  GGINVERSE 2.#def
bc10: 69 6e 65 20 57 49 4e 44 4f 57 5f 41 47 47 53 54  ine WINDOW_AGGST
bc20: 45 50 20 20 20 20 33 0a 0a 2f 2a 0a 2a 2a 20 47  EP    3../*.** G
bc30: 65 6e 65 72 61 74 65 20 56 4d 20 63 6f 64 65 20  enerate VM code 
bc40: 74 6f 20 72 65 61 64 20 74 68 65 20 77 69 6e 64  to read the wind
bc50: 6f 77 20 66 72 61 6d 65 73 20 70 65 65 72 20 76  ow frames peer v
bc60: 61 6c 75 65 73 20 66 72 6f 6d 20 63 75 72 73 6f  alues from curso
bc70: 72 20 63 73 72 20 69 6e 74 6f 0a 2a 2a 20 61 6e  r csr into.** an
bc80: 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   array of regist
bc90: 65 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  ers starting at 
bca0: 72 65 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  reg..*/.static v
bcb0: 6f 69 64 20 77 69 6e 64 6f 77 52 65 61 64 50 65  oid windowReadPe
bcc0: 65 72 56 61 6c 75 65 73 28 0a 20 20 57 69 6e 64  erValues(.  Wind
bcd0: 6f 77 43 6f 64 65 41 72 67 20 2a 70 2c 0a 20 20  owCodeArg *p,.  
bce0: 69 6e 74 20 63 73 72 2c 0a 20 20 69 6e 74 20 72  int csr,.  int r
bcf0: 65 67 0a 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a  eg.){.  Window *
bd00: 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 4d 57 69 6e  pMWin = p->pMWin
bd10: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  ;.  ExprList *pO
bd20: 72 64 65 72 42 79 20 3d 20 70 4d 57 69 6e 2d 3e  rderBy = pMWin->
bd30: 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20  pOrderBy;.  if( 
bd40: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
bd50: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
bd60: 33 47 65 74 56 64 62 65 28 70 2d 3e 70 50 61 72  3GetVdbe(p->pPar
bd70: 73 65 29 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  se);.    ExprLis
bd80: 74 20 2a 70 50 61 72 74 20 3d 20 70 4d 57 69 6e  t *pPart = pMWin
bd90: 2d 3e 70 50 61 72 74 69 74 69 6f 6e 3b 0a 20 20  ->pPartition;.  
bda0: 20 20 69 6e 74 20 69 43 6f 6c 4f 66 66 20 3d 20    int iColOff = 
bdb0: 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f  pMWin->nBufferCo
bdc0: 6c 20 2b 20 28 70 50 61 72 74 20 3f 20 70 50 61  l + (pPart ? pPa
bdd0: 72 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a  rt->nExpr : 0);.
bde0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
bdf0: 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72  or(i=0; i<pOrder
be00: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
be10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
be20: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
be30: 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20 69 43 6f 6c  olumn, csr, iCol
be40: 4f 66 66 2b 69 2c 20 72 65 67 2b 69 29 3b 0a 20  Off+i, reg+i);. 
be50: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
be60: 2a 20 47 65 6e 65 72 61 74 65 20 56 4d 20 63 6f  * Generate VM co
be70: 64 65 20 74 6f 20 69 6e 76 6f 6b 65 20 65 69 74  de to invoke eit
be80: 68 65 72 20 78 56 61 6c 75 65 28 29 20 28 62 46  her xValue() (bF
be90: 69 6e 3d 3d 30 29 20 6f 72 20 78 46 69 6e 61 6c  in==0) or xFinal
bea0: 69 7a 65 28 29 0a 2a 2a 20 28 62 46 69 6e 3d 3d  ize().** (bFin==
beb0: 31 29 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64  1) for each wind
bec0: 6f 77 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 74  ow function in t
bed0: 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73  he linked list s
bee0: 74 61 72 74 69 6e 67 20 61 74 0a 2a 2a 20 70 4d  tarting at.** pM
bef0: 57 69 6e 2e 20 4f 72 2c 20 66 6f 72 20 62 75 69  Win. Or, for bui
bf00: 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 2d 66 75 6e  lt-in window-fun
bf10: 63 74 69 6f 6e 73 20 74 68 61 74 20 64 6f 20 6e  ctions that do n
bf20: 6f 74 20 75 73 65 20 74 68 65 20 73 74 61 6e 64  ot use the stand
bf30: 61 72 64 0a 2a 2a 20 41 50 49 2c 20 67 65 6e 65  ard.** API, gene
bf40: 72 61 74 65 20 74 68 65 20 65 71 75 69 76 61 6c  rate the equival
bf50: 65 6e 74 20 56 4d 20 63 6f 64 65 2e 0a 2a 2f 0a  ent VM code..*/.
bf60: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64  static void wind
bf70: 6f 77 41 67 67 46 69 6e 61 6c 28 57 69 6e 64 6f  owAggFinal(Windo
bf80: 77 43 6f 64 65 41 72 67 20 2a 70 2c 20 69 6e 74  wCodeArg *p, int
bf90: 20 62 46 69 6e 29 7b 0a 20 20 50 61 72 73 65 20   bFin){.  Parse 
bfa0: 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61  *pParse = p->pPa
bfb0: 72 73 65 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70  rse;.  Window *p
bfc0: 4d 57 69 6e 20 3d 20 70 2d 3e 70 4d 57 69 6e 3b  MWin = p->pMWin;
bfd0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
bfe0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
bff0: 73 65 29 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70  se);.  Window *p
c000: 57 69 6e 3b 0a 0a 20 20 66 6f 72 28 70 57 69 6e  Win;..  for(pWin
c010: 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57  =pMWin; pWin; pW
c020: 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69  in=pWin->pNextWi
c030: 6e 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 57 69  n){.    if( pMWi
c040: 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f 77 69 64  n->regStartRowid
c050: 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 57 69  ==0.     && (pWi
c060: 6e 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c  n->pFunc->funcFl
c070: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
c080: 43 5f 4d 49 4e 4d 41 58 29 20 0a 20 20 20 20 20  C_MINMAX) .     
c090: 26 26 20 28 70 57 69 6e 2d 3e 65 53 74 61 72 74  && (pWin->eStart
c0a0: 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 29 0a  !=TK_UNBOUNDED).
c0b0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c      ){.      sql
c0c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
c0d0: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57  , OP_Null, 0, pW
c0e0: 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a  in->regResult);.
c0f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c100: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61  eAddOp1(v, OP_La
c110: 73 74 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70  st, pWin->csrApp
c120: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
c130: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
c140: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c150: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
c160: 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20 30 2c  pWin->csrApp, 0,
c170: 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74   pWin->regResult
c180: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c190: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
c1a0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
c1b0: 6e 74 41 64 64 72 28 76 29 2d 32 29 3b 0a 20 20  ntAddr(v)-2);.  
c1c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57 69 6e    }else if( pWin
c1d0: 2d 3e 72 65 67 41 70 70 20 29 7b 0a 20 20 20 20  ->regApp ){.    
c1e0: 20 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d    assert( pMWin-
c1f0: 3e 72 65 67 53 74 61 72 74 52 6f 77 69 64 3d 3d  >regStartRowid==
c200: 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  0 );.    }else{.
c210: 20 20 20 20 20 20 69 6e 74 20 6e 41 72 67 20 3d        int nArg =
c220: 20 77 69 6e 64 6f 77 41 72 67 43 6f 75 6e 74 28   windowArgCount(
c230: 70 57 69 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  pWin);.      if(
c240: 20 62 46 69 6e 20 29 7b 0a 20 20 20 20 20 20 20   bFin ){.       
c250: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c260: 70 32 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61  p2(v, OP_AggFina
c270: 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75  l, pWin->regAccu
c280: 6d 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 20 20  m, nArg);.      
c290: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70    sqlite3VdbeApp
c2a0: 65 6e 64 50 34 28 76 2c 20 70 57 69 6e 2d 3e 70  endP4(v, pWin->p
c2b0: 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46  Func, P4_FUNCDEF
c2c0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
c2d0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
c2e0: 4f 50 5f 43 6f 70 79 2c 20 70 57 69 6e 2d 3e 72  OP_Copy, pWin->r
c2f0: 65 67 41 63 63 75 6d 2c 20 70 57 69 6e 2d 3e 72  egAccum, pWin->r
c300: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
c310: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c320: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
c330: 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63   0, pWin->regAcc
c340: 75 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  um);.      }else
c350: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
c360: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
c370: 50 5f 41 67 67 56 61 6c 75 65 2c 70 57 69 6e 2d  P_AggValue,pWin-
c380: 3e 72 65 67 41 63 63 75 6d 2c 6e 41 72 67 2c 70  >regAccum,nArg,p
c390: 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b  Win->regResult);
c3a0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
c3b0: 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20  VdbeAppendP4(v, 
c3c0: 70 57 69 6e 2d 3e 70 46 75 6e 63 2c 20 50 34 5f  pWin->pFunc, P4_
c3d0: 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20  FUNCDEF);.      
c3e0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
c3f0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
c400: 64 65 20 74 6f 20 63 61 6c 63 75 6c 61 74 65 20  de to calculate 
c410: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
c420: 65 73 20 6f 66 20 61 6c 6c 20 77 69 6e 64 6f 77  es of all window
c430: 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 74 68   functions in th
c440: 65 0a 2a 2a 20 70 2d 3e 70 4d 57 69 6e 20 6c 69  e.** p->pMWin li
c450: 73 74 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75  st by doing a fu
c460: 6c 6c 20 73 63 61 6e 20 6f 66 20 74 68 65 20 63  ll scan of the c
c470: 75 72 72 65 6e 74 20 77 69 6e 64 6f 77 20 66 72  urrent window fr
c480: 61 6d 65 2e 20 53 74 6f 72 65 20 74 68 65 0a 2a  ame. Store the.*
c490: 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65  * results in the
c4a0: 20 57 69 6e 64 6f 77 2e 72 65 67 52 65 73 75 6c   Window.regResul
c4b0: 74 20 72 65 67 69 73 74 65 72 73 2c 20 72 65 61  t registers, rea
c4c0: 64 79 20 74 6f 20 72 65 74 75 72 6e 20 74 68 65  dy to return the
c4d0: 20 75 70 70 65 72 0a 2a 2a 20 6c 61 79 65 72 2e   upper.** layer.
c4e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c4f0: 77 69 6e 64 6f 77 46 75 6c 6c 53 63 61 6e 28 57  windowFullScan(W
c500: 69 6e 64 6f 77 43 6f 64 65 41 72 67 20 2a 70 29  indowCodeArg *p)
c510: 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e  {.  Window *pWin
c520: 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  ;.  Parse *pPars
c530: 65 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a 20  e = p->pParse;. 
c540: 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d   Window *pMWin =
c550: 20 70 2d 3e 70 4d 57 69 6e 3b 0a 20 20 56 64 62   p->pMWin;.  Vdb
c560: 65 20 2a 76 20 3d 20 70 2d 3e 70 56 64 62 65 3b  e *v = p->pVdbe;
c570: 0a 0a 20 20 69 6e 74 20 72 65 67 43 52 6f 77 69  ..  int regCRowi
c580: 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
c590: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72      /* Current r
c5a0: 6f 77 69 64 20 76 61 6c 75 65 20 2a 2f 0a 20 20  owid value */.  
c5b0: 69 6e 74 20 72 65 67 43 50 65 65 72 20 3d 20 30  int regCPeer = 0
c5c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c5d0: 2f 2a 20 43 75 72 72 65 6e 74 20 70 65 65 72 20  /* Current peer 
c5e0: 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20  values */.  int 
c5f0: 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 20 20 20  regRowid = 0;   
c600: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
c610: 67 67 53 74 65 70 20 72 6f 77 69 64 20 76 61 6c  ggStep rowid val
c620: 75 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50  ue */.  int regP
c630: 65 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  eer = 0;        
c640: 20 20 20 20 20 20 20 20 2f 2a 20 41 67 67 53 74          /* AggSt
c650: 65 70 20 70 65 65 72 20 76 61 6c 75 65 73 20 2a  ep peer values *
c660: 2f 0a 0a 20 20 69 6e 74 20 6e 50 65 65 72 3b 0a  /..  int nPeer;.
c670: 20 20 69 6e 74 20 6c 62 6c 4e 65 78 74 3b 0a 20    int lblNext;. 
c680: 20 69 6e 74 20 6c 62 6c 42 72 6b 3b 0a 20 20 69   int lblBrk;.  i
c690: 6e 74 20 61 64 64 72 4e 65 78 74 3b 0a 20 20 69  nt addrNext;.  i
c6a0: 6e 74 20 63 73 72 20 3d 20 70 4d 57 69 6e 2d 3e  nt csr = pMWin->
c6b0: 63 73 72 41 70 70 3b 0a 0a 20 20 6e 50 65 65 72  csrApp;..  nPeer
c6c0: 20 3d 20 28 70 4d 57 69 6e 2d 3e 70 4f 72 64 65   = (pMWin->pOrde
c6d0: 72 42 79 20 3f 20 70 4d 57 69 6e 2d 3e 70 4f 72  rBy ? pMWin->pOr
c6e0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30  derBy->nExpr : 0
c6f0: 29 3b 0a 0a 20 20 6c 62 6c 4e 65 78 74 20 3d 20  );..  lblNext = 
c700: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
c710: 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  abel(pParse);.  
c720: 6c 62 6c 42 72 6b 20 3d 20 73 71 6c 69 74 65 33  lblBrk = sqlite3
c730: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
c740: 61 72 73 65 29 3b 0a 0a 20 20 72 65 67 43 52 6f  arse);..  regCRo
c750: 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74  wid = sqlite3Get
c760: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
c770: 0a 20 20 72 65 67 52 6f 77 69 64 20 3d 20 73 71  .  regRowid = sq
c780: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
c790: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 6e  pParse);.  if( n
c7a0: 50 65 65 72 20 29 7b 0a 20 20 20 20 72 65 67 43  Peer ){.    regC
c7b0: 50 65 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65  Peer = sqlite3Ge
c7c0: 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
c7d0: 65 2c 20 6e 50 65 65 72 29 3b 0a 20 20 20 20 72  e, nPeer);.    r
c7e0: 65 67 50 65 65 72 20 3d 20 73 71 6c 69 74 65 33  egPeer = sqlite3
c7f0: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
c800: 72 73 65 2c 20 6e 50 65 65 72 29 3b 0a 20 20 7d  rse, nPeer);.  }
c810: 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ..  sqlite3VdbeA
c820: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69  ddOp2(v, OP_Rowi
c830: 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  d, pMWin->iEphCs
c840: 72 2c 20 72 65 67 43 52 6f 77 69 64 29 3b 0a 20  r, regCRowid);. 
c850: 20 77 69 6e 64 6f 77 52 65 61 64 50 65 65 72 56   windowReadPeerV
c860: 61 6c 75 65 73 28 70 2c 20 70 4d 57 69 6e 2d 3e  alues(p, pMWin->
c870: 69 45 70 68 43 73 72 2c 20 72 65 67 43 50 65 65  iEphCsr, regCPee
c880: 72 29 3b 0a 0a 20 20 66 6f 72 28 70 57 69 6e 3d  r);..  for(pWin=
c890: 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69  pMWin; pWin; pWi
c8a0: 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e  n=pWin->pNextWin
c8b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
c8c0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
c8d0: 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65  ull, 0, pWin->re
c8e0: 67 41 63 63 75 6d 29 3b 0a 20 20 7d 0a 0a 20 20  gAccum);.  }..  
c8f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c900: 33 28 76 2c 20 4f 50 5f 53 65 65 6b 47 45 2c 20  3(v, OP_SeekGE, 
c910: 63 73 72 2c 20 6c 62 6c 42 72 6b 2c 20 70 4d 57  csr, lblBrk, pMW
c920: 69 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f 77 69  in->regStartRowi
c930: 64 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61  d);.  VdbeCovera
c940: 67 65 28 76 29 3b 0a 20 20 61 64 64 72 4e 65 78  ge(v);.  addrNex
c950: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
c960: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
c970: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c980: 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20  p2(v, OP_Rowid, 
c990: 63 73 72 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  csr, regRowid);.
c9a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c9b0: 4f 70 33 28 76 2c 20 4f 50 5f 47 74 2c 20 70 4d  Op3(v, OP_Gt, pM
c9c0: 57 69 6e 2d 3e 72 65 67 45 6e 64 52 6f 77 69 64  Win->regEndRowid
c9d0: 2c 20 6c 62 6c 42 72 6b 2c 20 72 65 67 52 6f 77  , lblBrk, regRow
c9e0: 69 64 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72  id);.  VdbeCover
c9f0: 61 67 65 4e 65 76 65 72 4e 75 6c 6c 28 76 29 3b  ageNeverNull(v);
ca00: 0a 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65  ..  if( pMWin->e
ca10: 45 78 63 6c 75 64 65 3d 3d 54 4b 5f 43 55 52 52  Exclude==TK_CURR
ca20: 45 4e 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ENT ){.    sqlit
ca30: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
ca40: 4f 50 5f 45 71 2c 20 72 65 67 43 52 6f 77 69 64  OP_Eq, regCRowid
ca50: 2c 20 6c 62 6c 4e 65 78 74 2c 20 72 65 67 52 6f  , lblNext, regRo
ca60: 77 69 64 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  wid);.  }else if
ca70: 28 20 70 4d 57 69 6e 2d 3e 65 45 78 63 6c 75 64  ( pMWin->eExclud
ca80: 65 21 3d 54 4b 5f 4e 4f 20 29 7b 0a 20 20 20 20  e!=TK_NO ){.    
ca90: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 69 6e  int addr;.    in
caa0: 74 20 61 64 64 72 45 71 20 3d 20 30 3b 0a 20 20  t addrEq = 0;.  
cab0: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
cac0: 6e 66 6f 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  nfo = 0;..    if
cad0: 28 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42  ( pMWin->pOrderB
cae0: 79 20 29 7b 0a 20 20 20 20 20 20 70 4b 65 79 49  y ){.      pKeyI
caf0: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
cb00: 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
cb10: 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2d 3e  (pParse, pMWin->
cb20: 70 4f 72 64 65 72 42 79 2c 20 30 2c 20 30 29 3b  pOrderBy, 0, 0);
cb30: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
cb40: 4d 57 69 6e 2d 3e 65 45 78 63 6c 75 64 65 3d 3d  MWin->eExclude==
cb50: 54 4b 5f 54 49 45 53 20 29 7b 0a 20 20 20 20 20  TK_TIES ){.     
cb60: 20 61 64 64 72 45 71 20 3d 20 73 71 6c 69 74 65   addrEq = sqlite
cb70: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
cb80: 50 5f 45 71 2c 20 72 65 67 43 52 6f 77 69 64 2c  P_Eq, regCRowid,
cb90: 20 30 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20   0, regRowid);. 
cba0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4b 65     }.    if( pKe
cbb0: 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 77  yInfo ){.      w
cbc0: 69 6e 64 6f 77 52 65 61 64 50 65 65 72 56 61 6c  indowReadPeerVal
cbd0: 75 65 73 28 70 2c 20 63 73 72 2c 20 72 65 67 50  ues(p, csr, regP
cbe0: 65 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eer);.      sqli
cbf0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
cc00: 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67   OP_Compare, reg
cc10: 50 65 65 72 2c 20 72 65 67 43 50 65 65 72 2c 20  Peer, regCPeer, 
cc20: 6e 50 65 65 72 29 3b 0a 20 20 20 20 20 20 73 71  nPeer);.      sq
cc30: 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
cc40: 34 28 76 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79  4(v, (void*)pKey
cc50: 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
cc60: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
cc70: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
cc80: 6e 74 41 64 64 72 28 76 29 2b 31 3b 0a 20 20 20  ntAddr(v)+1;.   
cc90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cca0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
ccb0: 20 61 64 64 72 2c 20 6c 62 6c 4e 65 78 74 2c 20   addr, lblNext, 
ccc0: 61 64 64 72 29 3b 0a 20 20 20 20 20 20 56 64 62  addr);.      Vdb
ccd0: 65 43 6f 76 65 72 61 67 65 45 71 4e 65 28 76 29  eCoverageEqNe(v)
cce0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
ccf0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cd00: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
cd10: 20 30 2c 20 6c 62 6c 4e 65 78 74 29 3b 0a 20 20   0, lblNext);.  
cd20: 20 20 7d 0a 20 20 20 20 69 66 28 20 61 64 64 72    }.    if( addr
cd30: 45 71 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  Eq ) sqlite3Vdbe
cd40: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
cd50: 45 71 29 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 64  Eq);.  }..  wind
cd60: 6f 77 41 67 67 53 74 65 70 28 70 50 61 72 73 65  owAggStep(pParse
cd70: 2c 20 70 4d 57 69 6e 2c 20 63 73 72 2c 20 30 2c  , pMWin, csr, 0,
cd80: 20 70 2d 3e 72 65 67 41 72 67 29 3b 0a 0a 20 20   p->regArg);..  
cd90: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
cda0: 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 4e 65  veLabel(v, lblNe
cdb0: 78 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  xt);.  sqlite3Vd
cdc0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
cdd0: 65 78 74 2c 20 63 73 72 2c 20 61 64 64 72 4e 65  ext, csr, addrNe
cde0: 78 74 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72  xt);.  VdbeCover
cdf0: 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
ce00: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
ce10: 20 61 64 64 72 4e 65 78 74 2d 31 29 3b 0a 20 20   addrNext-1);.  
ce20: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
ce30: 65 72 65 28 76 2c 20 61 64 64 72 4e 65 78 74 2b  ere(v, addrNext+
ce40: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  1);.  sqlite3Rel
ce50: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
ce60: 73 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  se, regRowid);. 
ce70: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
ce80: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
ce90: 65 67 43 52 6f 77 69 64 29 3b 0a 20 20 69 66 28  egCRowid);.  if(
cea0: 20 6e 50 65 65 72 20 29 7b 0a 20 20 20 20 73 71   nPeer ){.    sq
ceb0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
cec0: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  Range(pParse, re
ced0: 67 50 65 65 72 2c 20 6e 50 65 65 72 29 3b 0a 20  gPeer, nPeer);. 
cee0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
cef0: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
cf00: 65 2c 20 72 65 67 43 50 65 65 72 2c 20 6e 50 65  e, regCPeer, nPe
cf10: 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 64  er);.  }..  wind
cf20: 6f 77 41 67 67 46 69 6e 61 6c 28 70 2c 20 31 29  owAggFinal(p, 1)
cf30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  ;.}../*.** Invok
cf40: 65 20 74 68 65 20 73 75 62 2d 72 6f 75 74 69 6e  e the sub-routin
cf50: 65 20 61 74 20 72 65 67 47 6f 73 75 62 20 28 67  e at regGosub (g
cf60: 65 6e 65 72 61 74 65 64 20 62 79 20 63 6f 64 65  enerated by code
cf70: 20 69 6e 20 73 65 6c 65 63 74 2e 63 29 20 74 6f   in select.c) to
cf80: 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 63  .** return the c
cf90: 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 57 69  urrent row of Wi
cfa0: 6e 64 6f 77 2e 69 45 70 68 43 73 72 2e 20 49 66  ndow.iEphCsr. If
cfb0: 20 61 6c 6c 20 77 69 6e 64 6f 77 20 66 75 6e 63   all window func
cfc0: 74 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 61 67 67  tions are.** agg
cfd0: 72 65 67 61 74 65 20 77 69 6e 64 6f 77 20 66 75  regate window fu
cfe0: 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 75 73 65  nctions that use
cff0: 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 41 50   the standard AP
d000: 49 2c 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 4f  I, a single.** O
d010: 50 5f 47 6f 73 75 62 20 69 6e 73 74 72 75 63 74  P_Gosub instruct
d020: 69 6f 6e 20 69 73 20 61 6c 6c 20 74 68 61 74 20  ion is all that 
d030: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  this routine gen
d040: 65 72 61 74 65 73 2e 20 45 78 74 72 61 20 56 4d  erates. Extra VM
d050: 20 63 6f 64 65 0a 2a 2a 20 66 6f 72 20 70 65 72   code.** for per
d060: 2d 72 6f 77 20 70 72 6f 63 65 73 73 69 6e 67 20  -row processing 
d070: 69 73 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65  is only generate
d080: 64 20 66 6f 72 20 74 68 65 20 66 6f 6c 6c 6f 77  d for the follow
d090: 69 6e 67 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e  ing built-in win
d0a0: 64 6f 77 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73  dow.** functions
d0b0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 6e 74 68 5f 76 61  :.**.**   nth_va
d0c0: 6c 75 65 28 29 0a 2a 2a 20 20 20 66 69 72 73 74  lue().**   first
d0d0: 5f 76 61 6c 75 65 28 29 0a 2a 2a 20 20 20 6c 61  _value().**   la
d0e0: 67 28 29 0a 2a 2a 20 20 20 6c 65 61 64 28 29 0a  g().**   lead().
d0f0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
d100: 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52 6f  indowReturnOneRo
d110: 77 28 57 69 6e 64 6f 77 43 6f 64 65 41 72 67 20  w(WindowCodeArg 
d120: 2a 70 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70  *p){.  Window *p
d130: 4d 57 69 6e 20 3d 20 70 2d 3e 70 4d 57 69 6e 3b  MWin = p->pMWin;
d140: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 2d 3e  .  Vdbe *v = p->
d150: 70 56 64 62 65 3b 0a 0a 20 20 69 66 28 20 70 4d  pVdbe;..  if( pM
d160: 57 69 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f 77  Win->regStartRow
d170: 69 64 20 29 7b 0a 20 20 20 20 77 69 6e 64 6f 77  id ){.    window
d180: 46 75 6c 6c 53 63 61 6e 28 70 29 3b 0a 20 20 7d  FullScan(p);.  }
d190: 65 6c 73 65 7b 0a 20 20 20 20 50 61 72 73 65 20  else{.    Parse 
d1a0: 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61  *pParse = p->pPa
d1b0: 72 73 65 3b 0a 20 20 20 20 57 69 6e 64 6f 77 20  rse;.    Window 
d1c0: 2a 70 57 69 6e 3b 0a 0a 20 20 20 20 66 6f 72 28  *pWin;..    for(
d1d0: 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e  pWin=pMWin; pWin
d1e0: 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65  ; pWin=pWin->pNe
d1f0: 78 74 57 69 6e 29 7b 0a 20 20 20 20 20 20 46 75  xtWin){.      Fu
d200: 6e 63 44 65 66 20 2a 70 46 75 6e 63 20 3d 20 70  ncDef *pFunc = p
d210: 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20  Win->pFunc;.    
d220: 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 7a 4e 61    if( pFunc->zNa
d230: 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d  me==nth_valueNam
d240: 65 0a 20 20 20 20 20 20 20 7c 7c 20 70 46 75 6e  e.       || pFun
d250: 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72 73 74 5f  c->zName==first_
d260: 76 61 6c 75 65 4e 61 6d 65 0a 20 20 20 20 20 20  valueName.      
d270: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63  ){.        int c
d280: 73 72 20 3d 20 70 57 69 6e 2d 3e 63 73 72 41 70  sr = pWin->csrAp
d290: 70 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c  p;.        int l
d2a0: 62 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  bl = sqlite3Vdbe
d2b0: 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65  MakeLabel(pParse
d2c0: 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74  );.        int t
d2d0: 6d 70 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47  mpReg = sqlite3G
d2e0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
d2f0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
d300: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
d310: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e  OP_Null, 0, pWin
d320: 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20  ->regResult);.  
d330: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46 75  .        if( pFu
d340: 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76  nc->zName==nth_v
d350: 61 6c 75 65 4e 61 6d 65 20 29 7b 0a 20 20 20 20  alueName ){.    
d360: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d370: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
d380: 6c 75 6d 6e 2c 70 4d 57 69 6e 2d 3e 69 45 70 68  lumn,pMWin->iEph
d390: 43 73 72 2c 70 57 69 6e 2d 3e 69 41 72 67 43 6f  Csr,pWin->iArgCo
d3a0: 6c 2b 31 2c 74 6d 70 52 65 67 29 3b 0a 20 20 20  l+1,tmpReg);.   
d3b0: 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43 68 65         windowChe
d3c0: 63 6b 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20  ckValue(pParse, 
d3d0: 74 6d 70 52 65 67 2c 20 32 29 3b 0a 20 20 20 20  tmpReg, 2);.    
d3e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d3f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d400: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
d410: 65 67 65 72 2c 20 31 2c 20 74 6d 70 52 65 67 29  eger, 1, tmpReg)
d420: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d430: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d440: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c  ddOp3(v, OP_Add,
d450: 20 74 6d 70 52 65 67 2c 20 70 57 69 6e 2d 3e 72   tmpReg, pWin->r
d460: 65 67 41 70 70 2c 20 74 6d 70 52 65 67 29 3b 0a  egApp, tmpReg);.
d470: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d480: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
d490: 47 74 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70  Gt, pWin->regApp
d4a0: 2b 31 2c 20 6c 62 6c 2c 20 74 6d 70 52 65 67 29  +1, lbl, tmpReg)
d4b0: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
d4c0: 76 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c 28  verageNeverNull(
d4d0: 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
d4e0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
d4f0: 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 63   OP_SeekRowid, c
d500: 73 72 2c 20 30 2c 20 74 6d 70 52 65 67 29 3b 0a  sr, 0, tmpReg);.
d510: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
d520: 72 61 67 65 4e 65 76 65 72 54 61 6b 65 6e 28 76  rageNeverTaken(v
d530: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
d540: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
d550: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20  OP_Column, csr, 
d560: 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2c 20 70  pWin->iArgCol, p
d570: 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b  Win->regResult);
d580: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d590: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
d5a0: 28 76 2c 20 6c 62 6c 29 3b 0a 20 20 20 20 20 20  (v, lbl);.      
d5b0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
d5c0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
d5d0: 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  tmpReg);.      }
d5e0: 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20  .      else if( 
d5f0: 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65  pFunc->zName==le
d600: 61 64 4e 61 6d 65 20 7c 7c 20 70 46 75 6e 63 2d  adName || pFunc-
d610: 3e 7a 4e 61 6d 65 3d 3d 6c 61 67 4e 61 6d 65 20  >zName==lagName 
d620: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
d630: 41 72 67 20 3d 20 70 57 69 6e 2d 3e 70 4f 77 6e  Arg = pWin->pOwn
d640: 65 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  er->x.pList->nEx
d650: 70 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  pr;.        int 
d660: 63 73 72 20 3d 20 70 57 69 6e 2d 3e 63 73 72 41  csr = pWin->csrA
d670: 70 70 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  pp;.        int 
d680: 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  lbl = sqlite3Vdb
d690: 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
d6a0: 65 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  e);.        int 
d6b0: 74 6d 70 52 65 67 20 3d 20 73 71 6c 69 74 65 33  tmpReg = sqlite3
d6c0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
d6d0: 65 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  e);.        int 
d6e0: 69 45 70 68 20 3d 20 70 4d 57 69 6e 2d 3e 69 45  iEph = pMWin->iE
d6f0: 70 68 43 73 72 3b 0a 20 20 0a 20 20 20 20 20 20  phCsr;.  .      
d700: 20 20 69 66 28 20 6e 41 72 67 3c 33 20 29 7b 0a    if( nArg<3 ){.
d710: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d720: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
d730: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d  P_Null, 0, pWin-
d740: 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20  >regResult);.   
d750: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d760: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d770: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
d780: 6c 75 6d 6e 2c 20 69 45 70 68 2c 70 57 69 6e 2d  lumn, iEph,pWin-
d790: 3e 69 41 72 67 43 6f 6c 2b 32 2c 70 57 69 6e 2d  >iArgCol+2,pWin-
d7a0: 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20  >regResult);.   
d7b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
d7c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d7d0: 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 45  (v, OP_Rowid, iE
d7e0: 70 68 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20  ph, tmpReg);.   
d7f0: 20 20 20 20 20 69 66 28 20 6e 41 72 67 3c 32 20       if( nArg<2 
d800: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
d810: 20 76 61 6c 20 3d 20 28 70 46 75 6e 63 2d 3e 7a   val = (pFunc->z
d820: 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65 20 3f  Name==leadName ?
d830: 20 31 20 3a 20 2d 31 29 3b 0a 20 20 20 20 20 20   1 : -1);.      
d840: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d850: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
d860: 6d 6d 2c 20 74 6d 70 52 65 67 2c 20 76 61 6c 29  mm, tmpReg, val)
d870: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
d880: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f  .          int o
d890: 70 20 3d 20 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d  p = (pFunc->zNam
d8a0: 65 3d 3d 6c 65 61 64 4e 61 6d 65 20 3f 20 4f 50  e==leadName ? OP
d8b0: 5f 41 64 64 20 3a 20 4f 50 5f 53 75 62 74 72 61  _Add : OP_Subtra
d8c0: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ct);.          i
d8d0: 6e 74 20 74 6d 70 52 65 67 32 20 3d 20 73 71 6c  nt tmpReg2 = sql
d8e0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
d8f0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
d900: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d910: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
d920: 2c 20 69 45 70 68 2c 20 70 57 69 6e 2d 3e 69 41  , iEph, pWin->iA
d930: 72 67 43 6f 6c 2b 31 2c 20 74 6d 70 52 65 67 32  rgCol+1, tmpReg2
d940: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
d950: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
d960: 2c 20 6f 70 2c 20 74 6d 70 52 65 67 32 2c 20 74  , op, tmpReg2, t
d970: 6d 70 52 65 67 2c 20 74 6d 70 52 65 67 29 3b 0a  mpReg, tmpReg);.
d980: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d990: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
d9a0: 70 50 61 72 73 65 2c 20 74 6d 70 52 65 67 32 29  pParse, tmpReg2)
d9b0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20  ;.        }.  . 
d9c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d9d0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
d9e0: 65 65 6b 52 6f 77 69 64 2c 20 63 73 72 2c 20 6c  eekRowid, csr, l
d9f0: 62 6c 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20  bl, tmpReg);.   
da00: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
da10: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  e(v);.        sq
da20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
da30: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73  v, OP_Column, cs
da40: 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c  r, pWin->iArgCol
da50: 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c  , pWin->regResul
da60: 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
da70: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
da80: 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20 20 20  bel(v, lbl);.   
da90: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
daa0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
dab0: 65 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20  e, tmpReg);.    
dac0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
dad0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dae0: 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70  2(v, OP_Gosub, p
daf0: 2d 3e 72 65 67 47 6f 73 75 62 2c 20 70 2d 3e 61  ->regGosub, p->a
db00: 64 64 72 47 6f 73 75 62 29 3b 0a 7d 0a 0a 2f 2a  ddrGosub);.}../*
db10: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
db20: 65 20 74 6f 20 73 65 74 20 74 68 65 20 61 63 63  e to set the acc
db30: 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65  umulator registe
db40: 72 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f  r for each windo
db50: 77 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e  w function.** in
db60: 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
db70: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
db80: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
db90: 6f 20 4e 55 4c 4c 2e 20 41 6e 64 20 70 65 72 66  o NULL. And perf
dba0: 6f 72 6d 0a 2a 2a 20 61 6e 79 20 65 71 75 69 76  orm.** any equiv
dbb0: 61 6c 65 6e 74 20 69 6e 69 74 69 61 6c 69 7a 61  alent initializa
dbc0: 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79  tion required by
dbd0: 20 61 6e 79 20 62 75 69 6c 74 2d 69 6e 20 77 69   any built-in wi
dbe0: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 0a 2a  ndow functions.*
dbf0: 2a 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a  * in the list..*
dc00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
dc10: 64 6f 77 49 6e 69 74 41 63 63 75 6d 28 50 61 72  dowInitAccum(Par
dc20: 73 65 20 2a 70 50 61 72 73 65 2c 20 57 69 6e 64  se *pParse, Wind
dc30: 6f 77 20 2a 70 4d 57 69 6e 29 7b 0a 20 20 56 64  ow *pMWin){.  Vd
dc40: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
dc50: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
dc60: 20 20 69 6e 74 20 72 65 67 41 72 67 3b 0a 20 20    int regArg;.  
dc70: 69 6e 74 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20  int nArg = 0;.  
dc80: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20  Window *pWin;.  
dc90: 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20  for(pWin=pMWin; 
dca0: 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d  pWin; pWin=pWin-
dcb0: 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20  >pNextWin){.    
dcc0: 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20 3d  FuncDef *pFunc =
dcd0: 20 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20   pWin->pFunc;.  
dce0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
dcf0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
dd00: 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75  0, pWin->regAccu
dd10: 6d 29 3b 0a 20 20 20 20 6e 41 72 67 20 3d 20 4d  m);.    nArg = M
dd20: 41 58 28 6e 41 72 67 2c 20 77 69 6e 64 6f 77 41  AX(nArg, windowA
dd30: 72 67 43 6f 75 6e 74 28 70 57 69 6e 29 29 3b 0a  rgCount(pWin));.
dd40: 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 72      if( pMWin->r
dd50: 65 67 53 74 61 72 74 52 6f 77 69 64 3d 3d 30 20  egStartRowid==0 
dd60: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46 75  ){.      if( pFu
dd70: 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76  nc->zName==nth_v
dd80: 61 6c 75 65 4e 61 6d 65 20 7c 7c 20 70 46 75 6e  alueName || pFun
dd90: 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72 73 74 5f  c->zName==first_
dda0: 76 61 6c 75 65 4e 61 6d 65 20 29 7b 0a 20 20 20  valueName ){.   
ddb0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ddc0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
ddd0: 65 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d 3e 72  eger, 0, pWin->r
dde0: 65 67 41 70 70 29 3b 0a 20 20 20 20 20 20 20 20  egApp);.        
ddf0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
de00: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
de10: 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70   0, pWin->regApp
de20: 2b 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  +1);.      }..  
de30: 20 20 20 20 69 66 28 20 28 70 46 75 6e 63 2d 3e      if( (pFunc->
de40: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
de50: 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 20  TE_FUNC_MINMAX) 
de60: 26 26 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 20  && pWin->csrApp 
de70: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
de80: 74 28 20 70 57 69 6e 2d 3e 65 53 74 61 72 74 21  t( pWin->eStart!
de90: 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 3b  =TK_UNBOUNDED );
dea0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
deb0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
dec0: 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20 70 57  _ResetSorter, pW
ded0: 69 6e 2d 3e 63 73 72 41 70 70 29 3b 0a 20 20 20  in->csrApp);.   
dee0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
def0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
df00: 65 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d 3e 72  eger, 0, pWin->r
df10: 65 67 41 70 70 2b 31 29 3b 0a 20 20 20 20 20 20  egApp+1);.      
df20: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
df30: 67 41 72 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e  gArg = pParse->n
df40: 4d 65 6d 2b 31 3b 0a 20 20 70 50 61 72 73 65 2d  Mem+1;.  pParse-
df50: 3e 6e 4d 65 6d 20 2b 3d 20 6e 41 72 67 3b 0a 20  >nMem += nArg;. 
df60: 20 72 65 74 75 72 6e 20 72 65 67 41 72 67 3b 0a   return regArg;.
df70: 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 74 75 72 6e  }../* .** Return
df80: 20 74 72 75 65 20 69 66 20 74 68 65 20 63 75 72   true if the cur
df90: 72 65 6e 74 20 66 72 61 6d 65 20 73 68 6f 75 6c  rent frame shoul
dfa0: 64 20 62 65 20 63 61 63 68 65 64 20 69 6e 20 74  d be cached in t
dfb0: 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  he ephemeral tab
dfc0: 6c 65 2c 0a 2a 2a 20 65 76 65 6e 20 69 66 20 74  le,.** even if t
dfd0: 68 65 72 65 20 61 72 65 20 6e 6f 20 78 49 6e 76  here are no xInv
dfe0: 65 72 73 65 28 29 20 63 61 6c 6c 73 20 72 65 71  erse() calls req
dff0: 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  uired..*/.static
e000: 20 69 6e 74 20 77 69 6e 64 6f 77 43 61 63 68 65   int windowCache
e010: 46 72 61 6d 65 28 57 69 6e 64 6f 77 20 2a 70 4d  Frame(Window *pM
e020: 57 69 6e 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a  Win){.  Window *
e030: 70 57 69 6e 3b 0a 20 20 69 66 28 20 70 4d 57 69  pWin;.  if( pMWi
e040: 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f 77 69 64  n->regStartRowid
e050: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 66   ) return 1;.  f
e060: 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70  or(pWin=pMWin; p
e070: 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e  Win; pWin=pWin->
e080: 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 46  pNextWin){.    F
e090: 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20 3d 20  uncDef *pFunc = 
e0a0: 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20 20  pWin->pFunc;.   
e0b0: 20 69 66 28 20 28 70 46 75 6e 63 2d 3e 7a 4e 61   if( (pFunc->zNa
e0c0: 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d  me==nth_valueNam
e0d0: 65 29 0a 20 20 20 20 20 7c 7c 20 28 70 46 75 6e  e).     || (pFun
e0e0: 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72 73 74 5f  c->zName==first_
e0f0: 76 61 6c 75 65 4e 61 6d 65 29 0a 20 20 20 20 20  valueName).     
e100: 7c 7c 20 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65  || (pFunc->zName
e110: 3d 3d 6c 65 61 64 4e 61 6d 65 29 0a 20 20 20 20  ==leadName).    
e120: 20 7c 7c 20 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d   || (pFunc->zNam
e130: 65 3d 3d 6c 61 67 4e 61 6d 65 29 0a 20 20 20 20  e==lagName).    
e140: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
e150: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
e160: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
e170: 2a 20 72 65 67 4f 6c 64 20 61 6e 64 20 72 65 67  * regOld and reg
e180: 4e 65 77 20 61 72 65 20 65 61 63 68 20 74 68 65  New are each the
e190: 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20   first register 
e1a0: 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 73  in an array of s
e1b0: 69 7a 65 0a 2a 2a 20 70 4f 72 64 65 72 42 79 2d  ize.** pOrderBy-
e1c0: 3e 6e 45 78 70 72 2e 20 54 68 69 73 20 66 75 6e  >nExpr. This fun
e1d0: 63 74 69 6f 6e 20 67 65 6e 65 72 61 74 65 73 20  ction generates 
e1e0: 63 6f 64 65 20 74 6f 20 63 6f 6d 70 61 72 65 20  code to compare 
e1f0: 74 68 65 20 74 77 6f 0a 2a 2a 20 61 72 72 61 79  the two.** array
e200: 73 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 75  s of registers u
e210: 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69  sing the collati
e220: 6f 6e 20 73 65 71 75 65 6e 63 65 73 20 61 6e 64  on sequences and
e230: 20 6f 74 68 65 72 20 63 6f 6d 70 61 72 69 73 6f   other compariso
e240: 6e 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 20  n.** parameters 
e250: 73 70 65 63 69 66 69 65 64 20 62 79 20 70 4f 72  specified by pOr
e260: 64 65 72 42 79 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  derBy. .**.** If
e270: 20 74 68 65 20 74 77 6f 20 61 72 72 61 79 73 20   the two arrays 
e280: 61 72 65 20 6e 6f 74 20 65 71 75 61 6c 2c 20 74  are not equal, t
e290: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 72  he contents of r
e2a0: 65 67 4e 65 77 20 69 73 20 63 6f 70 69 65 64 20  egNew is copied 
e2b0: 74 6f 20 0a 2a 2a 20 72 65 67 4f 6c 64 20 61 6e  to .** regOld an
e2c0: 64 20 63 6f 6e 74 72 6f 6c 20 66 61 6c 6c 73 20  d control falls 
e2d0: 74 68 72 6f 75 67 68 2e 20 4f 74 68 65 72 77 69  through. Otherwi
e2e0: 73 65 2c 20 69 66 20 74 68 65 20 63 6f 6e 74 65  se, if the conte
e2f0: 6e 74 73 20 6f 66 20 74 68 65 20 61 72 72 61 79  nts of the array
e300: 73 0a 2a 2a 20 61 72 65 20 65 71 75 61 6c 2c 20  s.** are equal, 
e310: 61 6e 20 4f 50 5f 47 6f 74 6f 20 69 73 20 65 78  an OP_Goto is ex
e320: 65 63 75 74 65 64 2e 20 54 68 65 20 61 64 64 72  ecuted. The addr
e330: 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 47 6f  ess of the OP_Go
e340: 74 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  to is returned..
e350: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
e360: 69 6e 64 6f 77 49 66 4e 65 77 50 65 65 72 28 0a  indowIfNewPeer(.
e370: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
e380: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
e390: 64 65 72 42 79 2c 0a 20 20 69 6e 74 20 72 65 67  derBy,.  int reg
e3a0: 4e 65 77 2c 20 20 20 20 20 20 20 20 20 20 20 20  New,            
e3b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
e3c0: 74 20 69 6e 20 61 72 72 61 79 20 6f 66 20 6e 65  t in array of ne
e3d0: 77 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e  w values */.  in
e3e0: 74 20 72 65 67 4f 6c 64 2c 20 20 20 20 20 20 20  t regOld,       
e3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e400: 20 46 69 72 73 74 20 69 6e 20 61 72 72 61 79 20   First in array 
e410: 6f 66 20 6f 6c 64 20 76 61 6c 75 65 73 20 2a 2f  of old values */
e420: 0a 20 20 69 6e 74 20 61 64 64 72 20 20 20 20 20  .  int addr     
e430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e440: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
e450: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
e460: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
e470: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
e480: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
e490: 69 6e 74 20 6e 56 61 6c 20 3d 20 70 4f 72 64 65  int nVal = pOrde
e4a0: 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  rBy->nExpr;.    
e4b0: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
e4c0: 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
e4d0: 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
e4e0: 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
e4f0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
e500: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
e510: 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67   OP_Compare, reg
e520: 4f 6c 64 2c 20 72 65 67 4e 65 77 2c 20 6e 56 61  Old, regNew, nVa
e530: 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  l);.    sqlite3V
e540: 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28  dbeAppendP4(v, (
e550: 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  void*)pKeyInfo, 
e560: 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
e570: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e580: 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 0a  p3(v, OP_Jump, .
e590: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e5a0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
e5b0: 31 2c 20 61 64 64 72 2c 20 73 71 6c 69 74 65 33  1, addr, sqlite3
e5c0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
e5d0: 76 29 2b 31 0a 20 20 20 20 29 3b 0a 20 20 20 20  v)+1.    );.    
e5e0: 56 64 62 65 43 6f 76 65 72 61 67 65 45 71 4e 65  VdbeCoverageEqNe
e5f0: 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
e600: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
e610: 5f 43 6f 70 79 2c 20 72 65 67 4e 65 77 2c 20 72  _Copy, regNew, r
e620: 65 67 4f 6c 64 2c 20 6e 56 61 6c 2d 31 29 3b 0a  egOld, nVal-1);.
e630: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
e640: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
e650: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
e660: 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  dr);.  }.}../*.*
e670: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
e680: 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72  is called as par
e690: 74 20 6f 66 20 67 65 6e 65 72 61 74 69 6e 67 20  t of generating 
e6a0: 56 4d 20 70 72 6f 67 72 61 6d 73 20 66 6f 72 20  VM programs for 
e6b0: 52 41 4e 47 45 0a 2a 2a 20 6f 66 66 73 65 74 20  RANGE.** offset 
e6c0: 50 52 45 43 45 44 49 4e 47 2f 46 4f 4c 4c 4f 57  PRECEDING/FOLLOW
e6d0: 49 4e 47 20 66 72 61 6d 65 20 62 6f 75 6e 64 61  ING frame bounda
e6e0: 72 69 65 73 2e 20 41 73 73 75 6d 69 6e 67 20 22  ries. Assuming "
e6f0: 41 53 43 22 20 6f 72 64 65 72 20 66 6f 72 0a 2a  ASC" order for.*
e700: 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 74  * the ORDER BY t
e710: 65 72 6d 20 69 6e 20 74 68 65 20 77 69 6e 64 6f  erm in the windo
e720: 77 2c 20 69 74 20 67 65 6e 65 72 61 74 65 73 20  w, it generates 
e730: 63 6f 64 65 20 65 71 75 69 76 61 6c 65 6e 74 20  code equivalent 
e740: 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20  to:.**.**   if( 
e750: 63 73 72 31 2e 70 65 65 72 56 61 6c 20 2b 20 72  csr1.peerVal + r
e760: 65 67 56 61 6c 20 3e 3d 20 63 73 72 32 2e 70 65  egVal >= csr2.pe
e770: 65 72 56 61 6c 20 29 20 67 6f 74 6f 20 6c 62 6c  erVal ) goto lbl
e780: 3b 0a 2a 2a 0a 2a 2a 20 41 20 73 70 65 63 69 61  ;.**.** A specia
e790: 6c 20 74 79 70 65 20 6f 66 20 61 72 69 74 68 6d  l type of arithm
e7a0: 65 74 69 63 20 69 73 20 75 73 65 64 20 73 75 63  etic is used suc
e7b0: 68 20 74 68 61 74 20 69 66 20 63 73 72 2e 70 65  h that if csr.pe
e7c0: 65 72 56 61 6c 20 69 73 20 6e 6f 74 0a 2a 2a 20  erVal is not.** 
e7d0: 61 20 6e 75 6d 65 72 69 63 20 74 79 70 65 20 28  a numeric type (
e7e0: 72 65 61 6c 20 6f 72 20 69 6e 74 65 67 65 72 29  real or integer)
e7f0: 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
e800: 74 20 6f 66 20 74 68 65 20 61 64 64 69 74 69 6f  t of the additio
e810: 6e 20 69 73 0a 2a 2a 20 61 20 63 6f 70 79 20 6f  n is.** a copy o
e820: 66 20 63 73 72 31 2e 70 65 65 72 56 61 6c 2e 0a  f csr1.peerVal..
e830: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
e840: 69 6e 64 6f 77 43 6f 64 65 52 61 6e 67 65 54 65  indowCodeRangeTe
e850: 73 74 28 0a 20 20 57 69 6e 64 6f 77 43 6f 64 65  st(.  WindowCode
e860: 41 72 67 20 2a 70 2c 20 0a 20 20 69 6e 74 20 6f  Arg *p, .  int o
e870: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
e880: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
e890: 50 5f 47 65 20 6f 72 20 4f 50 5f 47 74 20 2a 2f  P_Ge or OP_Gt */
e8a0: 0a 20 20 69 6e 74 20 63 73 72 31 2c 20 0a 20 20  .  int csr1, .  
e8b0: 69 6e 74 20 72 65 67 56 61 6c 2c 20 0a 20 20 69  int regVal, .  i
e8c0: 6e 74 20 63 73 72 32 2c 0a 20 20 69 6e 74 20 6c  nt csr2,.  int l
e8d0: 62 6c 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  bl.){.  Parse *p
e8e0: 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73  Parse = p->pPars
e8f0: 65 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  e;.  Vdbe *v = s
e900: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
e910: 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 65 67  arse);.  int reg
e920: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
e930: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
e940: 20 69 6e 74 20 72 65 67 32 20 3d 20 73 71 6c 69   int reg2 = sqli
e950: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
e960: 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 61 72 69  arse);.  int ari
e970: 74 68 20 3d 20 4f 50 5f 41 64 64 3b 0a 20 20 69  th = OP_Add;.  i
e980: 6e 74 20 61 64 64 72 47 65 3b 0a 0a 20 20 69 6e  nt addrGe;..  in
e990: 74 20 72 65 67 53 74 72 69 6e 67 20 3d 20 2b 2b  t regString = ++
e9a0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20  pParse->nMem;.. 
e9b0: 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 4f 50 5f   assert( op==OP_
e9c0: 47 65 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20  Ge || op==OP_Gt 
e9d0: 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a  || op==OP_Le );.
e9e0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4d 57    assert( p->pMW
e9f0: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20  in->pOrderBy && 
ea00: 70 2d 3e 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72  p->pMWin->pOrder
ea10: 42 79 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a  By->nExpr==1 );.
ea20: 20 20 69 66 28 20 70 2d 3e 70 4d 57 69 6e 2d 3e    if( p->pMWin->
ea30: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 73  pOrderBy->a[0].s
ea40: 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20 20 20 20  ortOrder ){.    
ea50: 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
ea60: 20 20 20 20 63 61 73 65 20 4f 50 5f 47 65 3a 20      case OP_Ge: 
ea70: 6f 70 20 3d 20 4f 50 5f 4c 65 3b 20 62 72 65 61  op = OP_Le; brea
ea80: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
ea90: 5f 47 74 3a 20 6f 70 20 3d 20 4f 50 5f 4c 74 3b  _Gt: op = OP_Lt;
eaa0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 64 65   break;.      de
eab0: 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20 6f  fault: assert( o
eac0: 70 3d 3d 4f 50 5f 4c 65 20 29 3b 20 6f 70 20 3d  p==OP_Le ); op =
ead0: 20 4f 50 5f 47 65 3b 20 62 72 65 61 6b 3b 0a 20   OP_Ge; break;. 
eae0: 20 20 20 7d 0a 20 20 20 20 61 72 69 74 68 20 3d     }.    arith =
eaf0: 20 4f 50 5f 53 75 62 74 72 61 63 74 3b 0a 20 20   OP_Subtract;.  
eb00: 7d 0a 0a 20 20 77 69 6e 64 6f 77 52 65 61 64 50  }..  windowReadP
eb10: 65 65 72 56 61 6c 75 65 73 28 70 2c 20 63 73 72  eerValues(p, csr
eb20: 31 2c 20 72 65 67 31 29 3b 0a 20 20 77 69 6e 64  1, reg1);.  wind
eb30: 6f 77 52 65 61 64 50 65 65 72 56 61 6c 75 65 73  owReadPeerValues
eb40: 28 70 2c 20 63 73 72 32 2c 20 72 65 67 32 29 3b  (p, csr2, reg2);
eb50: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
eb60: 74 68 65 20 70 65 65 72 20 76 61 6c 75 65 20 66  the peer value f
eb70: 6f 72 20 63 73 72 31 20 76 61 6c 75 65 20 69 73  or csr1 value is
eb80: 20 61 20 74 65 78 74 20 6f 72 20 62 6c 6f 62 20   a text or blob 
eb90: 62 79 20 63 6f 6d 70 61 72 69 6e 67 0a 20 20 2a  by comparing.  *
eba0: 2a 20 69 74 20 74 6f 20 74 68 65 20 73 6d 61 6c  * it to the smal
ebb0: 6c 65 73 74 20 70 6f 73 73 69 62 6c 65 20 73 74  lest possible st
ebc0: 72 69 6e 67 20 2d 20 27 27 2e 20 49 66 20 69 74  ring - ''. If it
ebd0: 20 69 73 2c 20 6a 75 6d 70 20 6f 76 65 72 20 74   is, jump over t
ebe0: 68 65 0a 20 20 2a 2a 20 4f 50 5f 41 64 64 20 6f  he.  ** OP_Add o
ebf0: 72 20 4f 50 5f 53 75 62 74 72 61 63 74 20 6f 70  r OP_Subtract op
ec00: 65 72 61 74 69 6f 6e 20 61 6e 64 20 70 72 6f 63  eration and proc
ec10: 65 65 64 20 64 69 72 65 63 74 6c 79 20 74 6f 20  eed directly to 
ec20: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20  the comparison. 
ec30: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
ec40: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72  AddOp4(v, OP_Str
ec50: 69 6e 67 38 2c 20 30 2c 20 72 65 67 53 74 72 69  ing8, 0, regStri
ec60: 6e 67 2c 20 30 2c 20 22 22 2c 20 50 34 5f 53 54  ng, 0, "", P4_ST
ec70: 41 54 49 43 29 3b 0a 20 20 61 64 64 72 47 65 20  ATIC);.  addrGe 
ec80: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
ec90: 4f 70 33 28 76 2c 20 4f 50 5f 47 65 2c 20 72 65  Op3(v, OP_Ge, re
eca0: 67 53 74 72 69 6e 67 2c 20 30 2c 20 72 65 67 31  gString, 0, reg1
ecb0: 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67  );.  VdbeCoverag
ecc0: 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
ecd0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 61 72 69  dbeAddOp3(v, ari
ece0: 74 68 2c 20 72 65 67 56 61 6c 2c 20 72 65 67 31  th, regVal, reg1
ecf0: 2c 20 72 65 67 31 29 3b 0a 20 20 73 71 6c 69 74  , reg1);.  sqlit
ed00: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
ed10: 2c 20 61 64 64 72 47 65 29 3b 0a 20 20 73 71 6c  , addrGe);.  sql
ed20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
ed30: 2c 20 6f 70 2c 20 72 65 67 32 2c 20 6c 62 6c 2c  , op, reg2, lbl,
ed40: 20 72 65 67 31 29 3b 0a 20 20 73 71 6c 69 74 65   reg1);.  sqlite
ed50: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
ed60: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b   SQLITE_NULLEQ);
ed70: 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  .  VdbeCoverage(
ed80: 76 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 52 65  v);..  sqlite3Re
ed90: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
eda0: 72 73 65 2c 20 72 65 67 31 29 3b 0a 20 20 73 71  rse, reg1);.  sq
edb0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
edc0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 32  Reg(pParse, reg2
edd0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70  );.}../*.** Help
ede0: 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  er function for 
edf0: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64  sqlite3WindowCod
ee00: 65 53 74 65 70 28 29 2e 20 45 61 63 68 20 63 61  eStep(). Each ca
ee10: 6c 6c 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ll to this funct
ee20: 69 6f 6e 0a 2a 2a 20 67 65 6e 65 72 61 74 65 73  ion.** generates
ee30: 20 56 4d 20 63 6f 64 65 20 66 6f 72 20 61 20 73   VM code for a s
ee40: 69 6e 67 6c 65 20 52 45 54 55 52 4e 5f 52 4f 57  ingle RETURN_ROW
ee50: 2c 20 41 47 47 53 54 45 50 20 6f 72 20 41 47 47  , AGGSTEP or AGG
ee60: 49 4e 56 45 52 53 45 20 0a 2a 2a 20 6f 70 65 72  INVERSE .** oper
ee70: 61 74 69 6f 6e 2e 20 52 65 66 65 72 20 74 6f 20  ation. Refer to 
ee80: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
ee90: 6e 74 20 66 6f 72 20 73 71 6c 69 74 65 33 57 69  nt for sqlite3Wi
eea0: 6e 64 6f 77 43 6f 64 65 53 74 65 70 28 29 20 66  ndowCodeStep() f
eeb0: 6f 72 0a 2a 2a 20 64 65 74 61 69 6c 73 2e 0a 2a  or.** details..*
eec0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
eed0: 64 6f 77 43 6f 64 65 4f 70 28 0a 20 57 69 6e 64  dowCodeOp(. Wind
eee0: 6f 77 43 6f 64 65 41 72 67 20 2a 70 2c 20 20 20  owCodeArg *p,   
eef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ef00: 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 2a  Context object *
ef10: 2f 0a 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  /. int op,      
ef20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef30: 20 20 20 20 2f 2a 20 57 49 4e 44 4f 57 5f 52 45      /* WINDOW_RE
ef40: 54 55 52 4e 5f 52 4f 57 2c 20 41 47 47 53 54 45  TURN_ROW, AGGSTE
ef50: 50 20 6f 72 20 41 47 47 49 4e 56 45 52 53 45 20  P or AGGINVERSE 
ef60: 2a 2f 0a 20 69 6e 74 20 72 65 67 43 6f 75 6e 74  */. int regCount
ef70: 64 6f 77 6e 2c 20 20 20 20 20 20 20 20 20 20 20  down,           
ef80: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
ef90: 20 66 6f 72 20 4f 50 5f 49 66 50 6f 73 20 63 6f   for OP_IfPos co
efa0: 75 6e 74 64 6f 77 6e 20 2a 2f 0a 20 69 6e 74 20  untdown */. int 
efb0: 6a 75 6d 70 4f 6e 45 6f 66 20 20 20 20 20 20 20  jumpOnEof       
efc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
efd0: 4a 75 6d 70 20 68 65 72 65 20 69 66 20 73 74 65  Jump here if ste
efe0: 70 70 65 64 20 63 75 72 73 6f 72 20 72 65 61 63  pped cursor reac
eff0: 68 65 73 20 45 4f 46 20 2a 2f 0a 29 7b 0a 20 20  hes EOF */.){.  
f000: 69 6e 74 20 63 73 72 2c 20 72 65 67 3b 0a 20 20  int csr, reg;.  
f010: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
f020: 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 57 69 6e  p->pParse;.  Win
f030: 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e  dow *pMWin = p->
f040: 70 4d 57 69 6e 3b 0a 20 20 69 6e 74 20 72 65 74  pMWin;.  int ret
f050: 20 3d 20 30 3b 0a 20 20 56 64 62 65 20 2a 76 20   = 0;.  Vdbe *v 
f060: 3d 20 70 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  = p->pVdbe;.  in
f070: 74 20 61 64 64 72 49 66 20 3d 20 30 3b 20 0a 20  t addrIf = 0; . 
f080: 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 69 6e 75   int addrContinu
f090: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 64 64  e = 0;.  int add
f0a0: 72 47 6f 74 6f 20 3d 20 30 3b 0a 20 20 69 6e 74  rGoto = 0;.  int
f0b0: 20 62 50 65 65 72 20 3d 20 28 70 4d 57 69 6e 2d   bPeer = (pMWin-
f0c0: 3e 65 54 79 70 65 21 3d 54 4b 5f 52 4f 57 53 29  >eType!=TK_ROWS)
f0d0: 3b 0a 0a 20 20 69 6e 74 20 6c 62 6c 44 6f 6e 65  ;..  int lblDone
f0e0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
f0f0: 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
f100: 0a 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 52  .  int addrNextR
f110: 61 6e 67 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  ange = 0;..  /* 
f120: 53 70 65 63 69 61 6c 20 63 61 73 65 20 2d 20 57  Special case - W
f130: 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45  INDOW_AGGINVERSE
f140: 20 69 73 20 61 6c 77 61 79 73 20 61 20 6e 6f 2d   is always a no-
f150: 6f 70 20 69 66 20 74 68 65 20 66 72 61 6d 65 0a  op if the frame.
f160: 20 20 2a 2a 20 73 74 61 72 74 73 20 77 69 74 68    ** starts with
f170: 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45   UNBOUNDED PRECE
f180: 44 49 4e 47 2e 20 2a 2f 0a 20 20 69 66 28 20 6f  DING. */.  if( o
f190: 70 3d 3d 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56  p==WINDOW_AGGINV
f1a0: 45 52 53 45 20 26 26 20 70 4d 57 69 6e 2d 3e 65  ERSE && pMWin->e
f1b0: 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e  Start==TK_UNBOUN
f1c0: 44 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72  DED ){.    asser
f1d0: 74 28 20 72 65 67 43 6f 75 6e 74 64 6f 77 6e 3d  t( regCountdown=
f1e0: 3d 30 20 26 26 20 6a 75 6d 70 4f 6e 45 6f 66 3d  =0 && jumpOnEof=
f1f0: 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
f200: 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72   0;.  }..  if( r
f210: 65 67 43 6f 75 6e 74 64 6f 77 6e 3e 30 20 29 7b  egCountdown>0 ){
f220: 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  .    if( pMWin->
f230: 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 20  eType==TK_RANGE 
f240: 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78  ){.      addrNex
f250: 74 52 61 6e 67 65 20 3d 20 73 71 6c 69 74 65 33  tRange = sqlite3
f260: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
f270: 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  v);.      assert
f280: 28 20 6f 70 3d 3d 57 49 4e 44 4f 57 5f 41 47 47  ( op==WINDOW_AGG
f290: 49 4e 56 45 52 53 45 20 7c 7c 20 6f 70 3d 3d 57  INVERSE || op==W
f2a0: 49 4e 44 4f 57 5f 41 47 47 53 54 45 50 20 29 3b  INDOW_AGGSTEP );
f2b0: 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 57  .      if( op==W
f2c0: 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45  INDOW_AGGINVERSE
f2d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
f2e0: 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
f2f0: 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20  K_FOLLOWING ){. 
f300: 20 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43           windowC
f310: 6f 64 65 52 61 6e 67 65 54 65 73 74 28 0a 20 20  odeRangeTest(.  
f320: 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 4f              p, O
f330: 50 5f 4c 65 2c 20 70 2d 3e 63 75 72 72 65 6e 74  P_Le, p->current
f340: 2e 63 73 72 2c 20 72 65 67 43 6f 75 6e 74 64 6f  .csr, regCountdo
f350: 77 6e 2c 20 70 2d 3e 73 74 61 72 74 2e 63 73 72  wn, p->start.csr
f360: 2c 20 6c 62 6c 44 6f 6e 65 0a 20 20 20 20 20 20  , lblDone.      
f370: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d      );.        }
f380: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
f390: 77 69 6e 64 6f 77 43 6f 64 65 52 61 6e 67 65 54  windowCodeRangeT
f3a0: 65 73 74 28 0a 20 20 20 20 20 20 20 20 20 20 20  est(.           
f3b0: 20 20 20 70 2c 20 4f 50 5f 47 65 2c 20 70 2d 3e     p, OP_Ge, p->
f3c0: 73 74 61 72 74 2e 63 73 72 2c 20 72 65 67 43 6f  start.csr, regCo
f3d0: 75 6e 74 64 6f 77 6e 2c 20 70 2d 3e 63 75 72 72  untdown, p->curr
f3e0: 65 6e 74 2e 63 73 72 2c 20 6c 62 6c 44 6f 6e 65  ent.csr, lblDone
f3f0: 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
f400: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
f410: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 77 69 6e  lse{.        win
f420: 64 6f 77 43 6f 64 65 52 61 6e 67 65 54 65 73 74  dowCodeRangeTest
f430: 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2c  (.            p,
f440: 20 4f 50 5f 47 74 2c 20 70 2d 3e 65 6e 64 2e 63   OP_Gt, p->end.c
f450: 73 72 2c 20 72 65 67 43 6f 75 6e 74 64 6f 77 6e  sr, regCountdown
f460: 2c 20 70 2d 3e 63 75 72 72 65 6e 74 2e 63 73 72  , p->current.csr
f470: 2c 20 6c 62 6c 44 6f 6e 65 0a 20 20 20 20 20 20  , lblDone.      
f480: 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20    );.      }.   
f490: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 64   }else{.      ad
f4a0: 64 72 49 66 20 3d 20 73 71 6c 69 74 65 33 56 64  drIf = sqlite3Vd
f4b0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
f4c0: 66 50 6f 73 2c 20 72 65 67 43 6f 75 6e 74 64 6f  fPos, regCountdo
f4d0: 77 6e 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 20  wn, 0, 1);.     
f4e0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
f4f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
f500: 66 28 20 6f 70 3d 3d 57 49 4e 44 4f 57 5f 52 45  f( op==WINDOW_RE
f510: 54 55 52 4e 5f 52 4f 57 20 26 26 20 70 4d 57 69  TURN_ROW && pMWi
f520: 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f 77 69 64  n->regStartRowid
f530: 3d 3d 30 20 29 7b 0a 20 20 20 20 77 69 6e 64 6f  ==0 ){.    windo
f540: 77 41 67 67 46 69 6e 61 6c 28 70 2c 20 30 29 3b  wAggFinal(p, 0);
f550: 0a 20 20 7d 0a 20 20 61 64 64 72 43 6f 6e 74 69  .  }.  addrConti
f560: 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nue = sqlite3Vdb
f570: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
f580: 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
f590: 0a 20 20 20 20 63 61 73 65 20 57 49 4e 44 4f 57  .    case WINDOW
f5a0: 5f 52 45 54 55 52 4e 5f 52 4f 57 3a 0a 20 20 20  _RETURN_ROW:.   
f5b0: 20 20 20 63 73 72 20 3d 20 70 2d 3e 63 75 72 72     csr = p->curr
f5c0: 65 6e 74 2e 63 73 72 3b 0a 20 20 20 20 20 20 72  ent.csr;.      r
f5d0: 65 67 20 3d 20 70 2d 3e 63 75 72 72 65 6e 74 2e  eg = p->current.
f5e0: 72 65 67 3b 0a 20 20 20 20 20 20 77 69 6e 64 6f  reg;.      windo
f5f0: 77 52 65 74 75 72 6e 4f 6e 65 52 6f 77 28 70 29  wReturnOneRow(p)
f600: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
f610: 20 20 20 20 63 61 73 65 20 57 49 4e 44 4f 57 5f      case WINDOW_
f620: 41 47 47 49 4e 56 45 52 53 45 3a 0a 20 20 20 20  AGGINVERSE:.    
f630: 20 20 63 73 72 20 3d 20 70 2d 3e 73 74 61 72 74    csr = p->start
f640: 2e 63 73 72 3b 0a 20 20 20 20 20 20 72 65 67 20  .csr;.      reg 
f650: 3d 20 70 2d 3e 73 74 61 72 74 2e 72 65 67 3b 0a  = p->start.reg;.
f660: 20 20 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d        if( pMWin-
f670: 3e 72 65 67 53 74 61 72 74 52 6f 77 69 64 20 29  >regStartRowid )
f680: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
f690: 28 20 70 4d 57 69 6e 2d 3e 72 65 67 45 6e 64 52  ( pMWin->regEndR
f6a0: 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20  owid );.        
f6b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f6c0: 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
f6d0: 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72 74 52  pMWin->regStartR
f6e0: 6f 77 69 64 2c 20 31 29 3b 0a 20 20 20 20 20 20  owid, 1);.      
f6f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 77  }else{.        w
f700: 69 6e 64 6f 77 41 67 67 53 74 65 70 28 70 50 61  indowAggStep(pPa
f710: 72 73 65 2c 20 70 4d 57 69 6e 2c 20 63 73 72 2c  rse, pMWin, csr,
f720: 20 31 2c 20 70 2d 3e 72 65 67 41 72 67 29 3b 0a   1, p->regArg);.
f730: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
f740: 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c  eak;..    defaul
f750: 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t:.      assert(
f760: 20 6f 70 3d 3d 57 49 4e 44 4f 57 5f 41 47 47 53   op==WINDOW_AGGS
f770: 54 45 50 20 29 3b 0a 20 20 20 20 20 20 63 73 72  TEP );.      csr
f780: 20 3d 20 70 2d 3e 65 6e 64 2e 63 73 72 3b 0a 20   = p->end.csr;. 
f790: 20 20 20 20 20 72 65 67 20 3d 20 70 2d 3e 65 6e       reg = p->en
f7a0: 64 2e 72 65 67 3b 0a 20 20 20 20 20 20 69 66 28  d.reg;.      if(
f7b0: 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72 74   pMWin->regStart
f7c0: 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Rowid ){.       
f7d0: 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e   assert( pMWin->
f7e0: 72 65 67 45 6e 64 52 6f 77 69 64 20 29 3b 0a 20  regEndRowid );. 
f7f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
f800: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
f810: 64 64 49 6d 6d 2c 20 70 4d 57 69 6e 2d 3e 72 65  ddImm, pMWin->re
f820: 67 45 6e 64 52 6f 77 69 64 2c 20 31 29 3b 0a 20  gEndRowid, 1);. 
f830: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f840: 20 20 20 20 77 69 6e 64 6f 77 41 67 67 53 74 65      windowAggSte
f850: 70 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c  p(pParse, pMWin,
f860: 20 63 73 72 2c 20 30 2c 20 70 2d 3e 72 65 67 41   csr, 0, p->regA
f870: 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rg);.      }.   
f880: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
f890: 20 69 66 28 20 6f 70 3d 3d 70 2d 3e 65 44 65 6c   if( op==p->eDel
f8a0: 65 74 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ete ){.    sqlit
f8b0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
f8c0: 4f 50 5f 44 65 6c 65 74 65 2c 20 63 73 72 29 3b  OP_Delete, csr);
f8d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
f8e0: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
f8f0: 41 47 5f 53 41 56 45 50 4f 53 49 54 49 4f 4e 29  AG_SAVEPOSITION)
f900: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6a 75 6d  ;.  }..  if( jum
f910: 70 4f 6e 45 6f 66 20 29 7b 0a 20 20 20 20 73 71  pOnEof ){.    sq
f920: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
f930: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 63 73 72 2c  v, OP_Next, csr,
f940: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
f950: 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20  entAddr(v)+2);. 
f960: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
f970: 76 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 73 71  v);.    ret = sq
f980: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
f990: 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 7d  v, OP_Goto);.  }
f9a0: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
f9b0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
f9c0: 50 5f 4e 65 78 74 2c 20 63 73 72 2c 20 73 71 6c  P_Next, csr, sql
f9d0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
f9e0: 64 64 72 28 76 29 2b 31 2b 62 50 65 65 72 29 3b  ddr(v)+1+bPeer);
f9f0: 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
fa00: 65 28 76 29 3b 0a 20 20 20 20 69 66 28 20 62 50  e(v);.    if( bP
fa10: 65 65 72 20 29 7b 0a 20 20 20 20 20 20 61 64 64  eer ){.      add
fa20: 72 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33 56  rGoto = sqlite3V
fa30: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
fa40: 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Goto);.    }.  }
fa50: 0a 0a 20 20 69 66 28 20 62 50 65 65 72 20 29 7b  ..  if( bPeer ){
fa60: 0a 20 20 20 20 69 6e 74 20 6e 52 65 67 20 3d 20  .    int nReg = 
fa70: 28 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79  (pMWin->pOrderBy
fa80: 20 3f 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72   ? pMWin->pOrder
fa90: 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a  By->nExpr : 0);.
faa0: 20 20 20 20 69 6e 74 20 72 65 67 54 6d 70 20 3d      int regTmp =
fab0: 20 28 6e 52 65 67 20 3f 20 73 71 6c 69 74 65 33   (nReg ? sqlite3
fac0: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
fad0: 72 73 65 2c 20 6e 52 65 67 29 20 3a 20 30 29 3b  rse, nReg) : 0);
fae0: 0a 20 20 20 20 77 69 6e 64 6f 77 52 65 61 64 50  .    windowReadP
faf0: 65 65 72 56 61 6c 75 65 73 28 70 2c 20 63 73 72  eerValues(p, csr
fb00: 2c 20 72 65 67 54 6d 70 29 3b 0a 20 20 20 20 77  , regTmp);.    w
fb10: 69 6e 64 6f 77 49 66 4e 65 77 50 65 65 72 28 70  indowIfNewPeer(p
fb20: 50 61 72 73 65 2c 20 70 4d 57 69 6e 2d 3e 70 4f  Parse, pMWin->pO
fb30: 72 64 65 72 42 79 2c 20 72 65 67 54 6d 70 2c 20  rderBy, regTmp, 
fb40: 72 65 67 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75  reg, addrContinu
fb50: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  e);.    sqlite3R
fb60: 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
fb70: 70 50 61 72 73 65 2c 20 72 65 67 54 6d 70 2c 20  pParse, regTmp, 
fb80: 6e 52 65 67 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  nReg);.  }..  if
fb90: 28 20 61 64 64 72 4e 65 78 74 52 61 6e 67 65 20  ( addrNextRange 
fba0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
fbb0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
fbc0: 6f 74 6f 2c 20 30 2c 20 61 64 64 72 4e 65 78 74  oto, 0, addrNext
fbd0: 52 61 6e 67 65 29 3b 0a 20 20 7d 0a 20 20 73 71  Range);.  }.  sq
fbe0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
fbf0: 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 44 6f 6e 65  Label(v, lblDone
fc00: 29 3b 0a 20 20 69 66 28 20 61 64 64 72 47 6f 74  );.  if( addrGot
fc10: 6f 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  o ) sqlite3VdbeJ
fc20: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 47  umpHere(v, addrG
fc30: 6f 74 6f 29 3b 0a 20 20 69 66 28 20 61 64 64 72  oto);.  if( addr
fc40: 49 66 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  If ) sqlite3Vdbe
fc50: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
fc60: 49 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  If);.  return re
fc70: 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  t;.}.../*.** All
fc80: 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e  ocate and return
fc90: 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20   a duplicate of 
fca0: 74 68 65 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63  the Window objec
fcb0: 74 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74  t indicated by t
fcc0: 68 65 0a 2a 2a 20 74 68 69 72 64 20 61 72 67 75  he.** third argu
fcd0: 6d 65 6e 74 2e 20 53 65 74 20 74 68 65 20 57 69  ment. Set the Wi
fce0: 6e 64 6f 77 2e 70 4f 77 6e 65 72 20 66 69 65 6c  ndow.pOwner fiel
fcf0: 64 20 6f 66 20 74 68 65 20 6e 65 77 20 6f 62 6a  d of the new obj
fd00: 65 63 74 20 74 6f 0a 2a 2a 20 70 4f 77 6e 65 72  ect to.** pOwner
fd10: 2e 0a 2a 2f 0a 57 69 6e 64 6f 77 20 2a 73 71 6c  ..*/.Window *sql
fd20: 69 74 65 33 57 69 6e 64 6f 77 44 75 70 28 73 71  ite3WindowDup(sq
fd30: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
fd40: 2a 70 4f 77 6e 65 72 2c 20 57 69 6e 64 6f 77 20  *pOwner, Window 
fd50: 2a 70 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70  *p){.  Window *p
fd60: 4e 65 77 20 3d 20 30 3b 0a 20 20 69 66 28 20 41  New = 0;.  if( A
fd70: 4c 57 41 59 53 28 70 29 20 29 7b 0a 20 20 20 20  LWAYS(p) ){.    
fd80: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
fd90: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
fda0: 69 7a 65 6f 66 28 57 69 6e 64 6f 77 29 29 3b 0a  izeof(Window));.
fdb0: 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
fdc0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d        pNew->zNam
fdd0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
fde0: 44 75 70 28 64 62 2c 20 70 2d 3e 7a 4e 61 6d 65  Dup(db, p->zName
fdf0: 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  );.      pNew->p
fe00: 46 69 6c 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Filter = sqlite3
fe10: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
fe20: 46 69 6c 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Filter, 0);.    
fe30: 20 20 70 4e 65 77 2d 3e 70 46 75 6e 63 20 3d 20    pNew->pFunc = 
fe40: 70 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20  p->pFunc;.      
fe50: 70 4e 65 77 2d 3e 70 50 61 72 74 69 74 69 6f 6e  pNew->pPartition
fe60: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
fe70: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 50 61  stDup(db, p->pPa
fe80: 72 74 69 74 69 6f 6e 2c 20 30 29 3b 0a 20 20 20  rtition, 0);.   
fe90: 20 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42     pNew->pOrderB
fea0: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
feb0: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f  istDup(db, p->pO
fec0: 72 64 65 72 42 79 2c 20 30 29 3b 0a 20 20 20 20  rderBy, 0);.    
fed0: 20 20 70 4e 65 77 2d 3e 65 54 79 70 65 20 3d 20    pNew->eType = 
fee0: 70 2d 3e 65 54 79 70 65 3b 0a 20 20 20 20 20 20  p->eType;.      
fef0: 70 4e 65 77 2d 3e 65 45 6e 64 20 3d 20 70 2d 3e  pNew->eEnd = p->
ff00: 65 45 6e 64 3b 0a 20 20 20 20 20 20 70 4e 65 77  eEnd;.      pNew
ff10: 2d 3e 65 53 74 61 72 74 20 3d 20 70 2d 3e 65 53  ->eStart = p->eS
ff20: 74 61 72 74 3b 0a 20 20 20 20 20 20 70 4e 65 77  tart;.      pNew
ff30: 2d 3e 65 45 78 63 6c 75 64 65 20 3d 20 70 2d 3e  ->eExclude = p->
ff40: 65 45 78 63 6c 75 64 65 3b 0a 20 20 20 20 20 20  eExclude;.      
ff50: 70 4e 65 77 2d 3e 70 53 74 61 72 74 20 3d 20 73  pNew->pStart = s
ff60: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
ff70: 2c 20 70 2d 3e 70 53 74 61 72 74 2c 20 30 29 3b  , p->pStart, 0);
ff80: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 45 6e  .      pNew->pEn
ff90: 64 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  d = sqlite3ExprD
ffa0: 75 70 28 64 62 2c 20 70 2d 3e 70 45 6e 64 2c 20  up(db, p->pEnd, 
ffb0: 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  0);.      pNew->
ffc0: 70 4f 77 6e 65 72 20 3d 20 70 4f 77 6e 65 72 3b  pOwner = pOwner;
ffd0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
ffe0: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
fff0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 63 6f 70 79  ** Return a copy
10000 20 6f 66 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   of the linked l
10010 69 73 74 20 6f 66 20 57 69 6e 64 6f 77 20 6f 62  ist of Window ob
10020 6a 65 63 74 73 20 70 61 73 73 65 64 20 61 73 20  jects passed as 
10030 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 61 72  the.** second ar
10040 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 57 69 6e 64 6f  gument..*/.Windo
10050 77 20 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  w *sqlite3Window
10060 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20  ListDup(sqlite3 
10070 2a 64 62 2c 20 57 69 6e 64 6f 77 20 2a 70 29 7b  *db, Window *p){
10080 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b  .  Window *pWin;
10090 0a 20 20 57 69 6e 64 6f 77 20 2a 70 52 65 74 20  .  Window *pRet 
100a0 3d 20 30 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 2a  = 0;.  Window **
100b0 70 70 20 3d 20 26 70 52 65 74 3b 0a 0a 20 20 66  pp = &pRet;..  f
100c0 6f 72 28 70 57 69 6e 3d 70 3b 20 70 57 69 6e 3b  or(pWin=p; pWin;
100d0 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78   pWin=pWin->pNex
100e0 74 57 69 6e 29 7b 0a 20 20 20 20 2a 70 70 20 3d  tWin){.    *pp =
100f0 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 75   sqlite3WindowDu
10100 70 28 64 62 2c 20 30 2c 20 70 57 69 6e 29 3b 0a  p(db, 0, pWin);.
10110 20 20 20 20 69 66 28 20 2a 70 70 3d 3d 30 20 29      if( *pp==0 )
10120 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 70 20 3d   break;.    pp =
10130 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 57   &((*pp)->pNextW
10140 69 6e 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  in);.  }..  retu
10150 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pRet;.}../*.*
10160 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
10170 20 69 74 20 63 61 6e 20 62 65 20 64 65 74 65 72   it can be deter
10180 6d 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  mined at compile
10190 20 74 69 6d 65 20 74 68 61 74 20 65 78 70 72 65   time that expre
101a0 73 73 69 6f 6e 20 0a 2a 2a 20 70 45 78 70 72 20  ssion .** pExpr 
101b0 65 76 61 6c 75 61 74 65 73 20 74 6f 20 61 20 76  evaluates to a v
101c0 61 6c 75 65 20 74 68 61 74 2c 20 77 68 65 6e 20  alue that, when 
101d0 63 61 73 74 20 74 6f 20 61 6e 20 69 6e 74 65 67  cast to an integ
101e0 65 72 2c 20 69 73 20 67 72 65 61 74 65 72 20 0a  er, is greater .
101f0 2a 2a 20 74 68 61 6e 20 7a 65 72 6f 2e 20 46 61  ** than zero. Fa
10200 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  lse otherwise..*
10210 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65  *.** If an OOM e
10220 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69  rror occurs, thi
10230 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20  s function sets 
10240 74 68 65 20 50 61 72 73 65 2e 64 62 2e 6d 61 6c  the Parse.db.mal
10250 6c 6f 63 46 61 69 6c 65 64 20 0a 2a 2a 20 66 6c  locFailed .** fl
10260 61 67 20 61 6e 64 20 72 65 74 75 72 6e 73 20 7a  ag and returns z
10270 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
10280 6e 74 20 77 69 6e 64 6f 77 45 78 70 72 47 74 5a  nt windowExprGtZ
10290 65 72 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73  ero(Parse *pPars
102a0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
102b0 0a 20 20 69 6e 74 20 72 65 74 20 3d 20 30 3b 0a  .  int ret = 0;.
102c0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
102d0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73 71  pParse->db;.  sq
102e0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
102f0 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  l = 0;.  sqlite3
10300 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 64 62  ValueFromExpr(db
10310 2c 20 70 45 78 70 72 2c 20 64 62 2d 3e 65 6e 63  , pExpr, db->enc
10320 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  , SQLITE_AFF_NUM
10330 45 52 49 43 2c 20 26 70 56 61 6c 29 3b 0a 20 20  ERIC, &pVal);.  
10340 69 66 28 20 70 56 61 6c 20 26 26 20 73 71 6c 69  if( pVal && sqli
10350 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 70 56  te3_value_int(pV
10360 61 6c 29 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  al)>0 ){.    ret
10370 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 1;.  }.  sqli
10380 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
10390 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 74  l);.  return ret
103a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74  ;.}../*.** sqlit
103b0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 68  e3WhereBegin() h
103c0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
103d0 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 53  called for the S
103e0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
103f0 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74 68  .** passed as th
10400 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
10410 74 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  t when this func
10420 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 2e  tion is invoked.
10430 20 49 74 20 67 65 6e 65 72 61 74 65 73 0a 2a 2a   It generates.**
10440 20 63 6f 64 65 20 74 6f 20 70 6f 70 75 6c 61 74   code to populat
10450 65 20 74 68 65 20 57 69 6e 64 6f 77 2e 72 65 67  e the Window.reg
10460 52 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 20  Result register 
10470 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77 20  for each window 
10480 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 6e 64  function .** and
10490 20 69 6e 76 6f 6b 65 20 74 68 65 20 73 75 62 2d   invoke the sub-
104a0 72 6f 75 74 69 6e 65 20 61 74 20 69 6e 73 74 72  routine at instr
104b0 75 63 74 69 6f 6e 20 61 64 64 72 47 6f 73 75 62  uction addrGosub
104c0 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 72   once for each r
104d0 6f 77 2e 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68  ow..** sqlite3Wh
104e0 65 72 65 45 6e 64 28 29 20 69 73 20 61 6c 77 61  ereEnd() is alwa
104f0 79 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  ys called before
10500 20 72 65 74 75 72 6e 69 6e 67 2e 20 0a 2a 2a 0a   returning. .**.
10510 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
10520 20 68 61 6e 64 6c 65 73 20 73 65 76 65 72 61 6c   handles several
10530 20 64 69 66 66 65 72 65 6e 74 20 74 79 70 65 73   different types
10540 20 6f 66 20 77 69 6e 64 6f 77 20 66 72 61 6d 65   of window frame
10550 73 2c 20 77 68 69 63 68 0a 2a 2a 20 72 65 71 75  s, which.** requ
10560 69 72 65 20 73 6c 69 67 68 74 6c 79 20 64 69 66  ire slightly dif
10570 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 69 6e  ferent processin
10580 67 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  g. The following
10590 20 70 73 65 75 64 6f 20 63 6f 64 65 20 69 73 0a   pseudo code is.
105a0 2a 2a 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  ** used to imple
105b0 6d 65 6e 74 20 77 69 6e 64 6f 77 20 66 72 61 6d  ment window fram
105c0 65 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  es of the form:.
105d0 2a 2a 0a 2a 2a 20 20 20 52 4f 57 53 20 42 45 54  **.**   ROWS BET
105e0 57 45 45 4e 20 3c 65 78 70 72 31 3e 20 50 52 45  WEEN <expr1> PRE
105f0 43 45 44 49 4e 47 20 41 4e 44 20 3c 65 78 70 72  CEDING AND <expr
10600 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a  2> FOLLOWING.**.
10610 2a 2a 20 4f 74 68 65 72 20 77 69 6e 64 6f 77 20  ** Other window 
10620 66 72 61 6d 65 20 74 79 70 65 73 20 75 73 65 20  frame types use 
10630 76 61 72 69 61 6e 74 73 20 6f 66 20 74 68 65 20  variants of the 
10640 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
10650 20 20 20 20 20 2e 2e 2e 20 6c 6f 6f 70 20 73 74       ... loop st
10660 61 72 74 65 64 20 62 79 20 73 71 6c 69 74 65 33  arted by sqlite3
10670 57 68 65 72 65 42 65 67 69 6e 28 29 20 2e 2e 2e  WhereBegin() ...
10680 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 6e 65  .**       if( ne
10690 77 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a  w partition ){.*
106a0 2a 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20  *         Gosub 
106b0 66 6c 75 73 68 0a 2a 2a 20 20 20 20 20 20 20 7d  flush.**       }
106c0 0a 2a 2a 20 20 20 20 20 20 20 49 6e 73 65 72 74  .**       Insert
106d0 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20 65 70   new row into ep
106e0 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20  h table..**     
106f0 20 20 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20    .**       if( 
10700 66 69 72 73 74 20 72 6f 77 20 6f 66 20 70 61 72  first row of par
10710 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20  tition ){.**    
10720 20 20 20 20 20 2f 2f 20 52 65 77 69 6e 64 20 74       // Rewind t
10730 68 72 65 65 20 63 75 72 73 6f 72 73 2c 20 61 6c  hree cursors, al
10740 6c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 65 70  l open on the ep
10750 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20  h table..**     
10760 20 20 20 20 52 65 77 69 6e 64 28 63 73 72 45 6e      Rewind(csrEn
10770 64 29 3b 0a 2a 2a 20 20 20 20 20 20 20 20 20 52  d);.**         R
10780 65 77 69 6e 64 28 63 73 72 53 74 61 72 74 29 3b  ewind(csrStart);
10790 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 65 77 69  .**         Rewi
107a0 6e 64 28 63 73 72 43 75 72 72 65 6e 74 29 3b 0a  nd(csrCurrent);.
107b0 2a 2a 20 20 20 20 20 20 20 0a 2a 2a 20 20 20 20  **       .**    
107c0 20 20 20 20 20 72 65 67 45 6e 64 20 3d 20 3c 65       regEnd = <e
107d0 78 70 72 32 3e 20 20 20 20 20 20 20 20 20 20 2f  xpr2>          /
107e0 2f 20 46 4f 4c 4c 4f 57 49 4e 47 20 65 78 70 72  / FOLLOWING expr
107f0 65 73 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20  ession.**       
10800 20 20 72 65 67 53 74 61 72 74 20 3d 20 3c 65 78    regStart = <ex
10810 70 72 31 3e 20 20 20 20 20 20 20 20 2f 2f 20 50  pr1>        // P
10820 52 45 43 45 44 49 4e 47 20 65 78 70 72 65 73 73  RECEDING express
10830 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 7d 65 6c  ion.**       }el
10840 73 65 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 2f  se{.**         /
10850 2f 20 46 69 72 73 74 20 74 69 6d 65 20 74 68 69  / First time thi
10860 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
10870 6e 2c 20 74 68 65 20 65 70 68 20 74 61 62 6c 65  n, the eph table
10880 20 63 6f 6e 74 61 69 6e 73 20 74 77 6f 20 0a 2a   contains two .*
10890 2a 20 20 20 20 20 20 20 20 20 2f 2f 20 72 6f 77  *         // row
108a0 73 2e 20 54 68 65 20 66 69 72 73 74 20 72 6f 77  s. The first row
108b0 20 69 6e 20 74 68 65 20 70 61 72 74 69 74 69 6f   in the partitio
108c0 6e 2c 20 77 68 69 63 68 20 61 6c 6c 20 74 68 72  n, which all thr
108d0 65 65 20 63 75 72 73 6f 72 73 0a 2a 2a 20 20 20  ee cursors.**   
108e0 20 20 20 20 20 20 2f 2f 20 63 75 72 72 65 6e 74        // current
108f0 6c 79 20 70 6f 69 6e 74 20 74 6f 2c 20 61 6e 64  ly point to, and
10900 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   the following r
10910 6f 77 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 41  ow..**         A
10920 47 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 20 20  GGSTEP.**       
10930 20 20 69 66 28 20 28 72 65 67 45 6e 64 2d 2d 29    if( (regEnd--)
10940 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  <=0 ){.**       
10950 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a      RETURN_ROW.*
10960 2a 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20  *           if( 
10970 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20  (regStart--)<=0 
10980 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ){.**           
10990 20 20 41 47 47 49 4e 56 45 52 53 45 0a 2a 2a 20    AGGINVERSE.** 
109a0 20 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20            }.**  
109b0 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
109c0 20 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20    }.**     }.** 
109d0 20 20 20 20 66 6c 75 73 68 3a 0a 2a 2a 20 20 20      flush:.**   
109e0 20 20 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20      AGGSTEP.**  
109f0 20 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b       while( 1 ){
10a00 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 45 54 55  .**         RETU
10a10 52 4e 20 52 4f 57 0a 2a 2a 20 20 20 20 20 20 20  RN ROW.**       
10a20 20 20 69 66 28 20 63 73 72 43 75 72 72 65 6e 74    if( csrCurrent
10a30 20 69 73 20 45 4f 46 20 29 20 62 72 65 61 6b 3b   is EOF ) break;
10a40 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 66 28 20  .**         if( 
10a50 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20  (regStart--)<=0 
10a60 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ){.**           
10a70 41 67 67 49 6e 76 65 72 73 65 28 63 73 72 53 74  AggInverse(csrSt
10a80 61 72 74 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  art).**         
10a90 20 20 4e 65 78 74 28 63 73 72 53 74 61 72 74 29    Next(csrStart)
10aa0 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a  .**         }.**
10ab0 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 54         }.**.** T
10ac0 68 65 20 70 73 65 75 64 6f 2d 63 6f 64 65 20 61  he pseudo-code a
10ad0 62 6f 76 65 20 75 73 65 73 20 74 68 65 20 66 6f  bove uses the fo
10ae0 6c 6c 6f 77 69 6e 67 20 73 68 6f 72 74 68 61 6e  llowing shorthan
10af0 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 41 47 47 53 54  d:.**.**   AGGST
10b00 45 50 3a 20 20 20 20 69 6e 76 6f 6b 65 20 74 68  EP:    invoke th
10b10 65 20 61 67 67 72 65 67 61 74 65 20 78 53 74 65  e aggregate xSte
10b20 70 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  p() function for
10b30 20 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e   each window fun
10b40 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20  ction.**        
10b50 20 20 20 20 20 20 20 77 69 74 68 20 61 72 67 75         with argu
10b60 6d 65 6e 74 73 20 72 65 61 64 20 66 72 6f 6d 20  ments read from 
10b70 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
10b80 6f 66 20 63 75 72 73 6f 72 20 63 73 72 45 6e 64  of cursor csrEnd
10b90 2c 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20  , then.**       
10ba0 20 20 20 20 20 20 20 20 73 74 65 70 20 63 75 72          step cur
10bb0 73 6f 72 20 63 73 72 45 6e 64 20 66 6f 72 77 61  sor csrEnd forwa
10bc0 72 64 20 6f 6e 65 20 72 6f 77 20 28 69 2e 65 2e  rd one row (i.e.
10bd0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
10be0 74 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 52 45  t())..**.**   RE
10bf0 54 55 52 4e 5f 52 4f 57 3a 20 72 65 74 75 72 6e  TURN_ROW: return
10c00 20 61 20 72 6f 77 20 74 6f 20 74 68 65 20 63 61   a row to the ca
10c10 6c 6c 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68  ller based on th
10c20 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
10c30 65 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  e .**           
10c40 20 20 20 20 63 75 72 72 65 6e 74 20 72 6f 77 20      current row 
10c50 6f 66 20 63 73 72 43 75 72 72 65 6e 74 20 61 6e  of csrCurrent an
10c60 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  d the current st
10c70 61 74 65 20 6f 66 20 61 6c 6c 20 0a 2a 2a 20 20  ate of all .**  
10c80 20 20 20 20 20 20 20 20 20 20 20 20 20 61 67 67               agg
10c90 72 65 67 61 74 65 73 2e 20 54 68 65 6e 20 73 74  regates. Then st
10ca0 65 70 20 63 75 72 73 6f 72 20 63 73 72 43 75 72  ep cursor csrCur
10cb0 72 65 6e 74 20 66 6f 72 77 61 72 64 20 6f 6e 65  rent forward one
10cc0 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 41 47   row..**.**   AG
10cd0 47 49 4e 56 45 52 53 45 3a 20 69 6e 76 6f 6b 65  GINVERSE: invoke
10ce0 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 78   the aggregate x
10cf0 49 6e 76 65 72 73 65 28 29 20 66 75 6e 63 74 69  Inverse() functi
10d00 6f 6e 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64  on for each wind
10d10 6f 77 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ow .**          
10d20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 73 20 77       functions w
10d30 69 74 68 20 61 72 67 75 6d 65 6e 74 73 20 72 65  ith arguments re
10d40 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72  ad from the curr
10d50 65 6e 74 20 72 6f 77 20 6f 66 20 63 75 72 73 6f  ent row of curso
10d60 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
10d70 20 20 20 63 73 72 53 74 61 72 74 2e 20 54 68 65     csrStart. The
10d80 6e 20 73 74 65 70 20 63 73 72 53 74 61 72 74 20  n step csrStart 
10d90 66 6f 72 77 61 72 64 20 6f 6e 65 20 72 6f 77 2e  forward one row.
10da0 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65  .**.** There are
10db0 20 74 77 6f 20 6f 74 68 65 72 20 52 4f 57 53 20   two other ROWS 
10dc0 77 69 6e 64 6f 77 20 66 72 61 6d 65 73 20 74 68  window frames th
10dd0 61 74 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73  at are handled s
10de0 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 2a 2a 20  ignificantly.** 
10df0 64 69 66 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d  differently from
10e00 20 74 68 65 20 61 62 6f 76 65 20 2d 20 22 42 45   the above - "BE
10e10 54 57 45 45 4e 20 3c 65 78 70 72 3e 20 50 52 45  TWEEN <expr> PRE
10e20 43 45 44 49 4e 47 20 41 4e 44 20 3c 65 78 70 72  CEDING AND <expr
10e30 3e 20 50 52 45 43 45 44 49 4e 47 22 0a 2a 2a 20  > PRECEDING".** 
10e40 61 6e 64 20 22 42 45 54 57 45 45 4e 20 3c 65 78  and "BETWEEN <ex
10e50 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e  pr> FOLLOWING AN
10e60 44 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49  D <expr> FOLLOWI
10e70 4e 47 22 2e 20 54 68 65 73 65 20 61 72 65 20 73  NG". These are s
10e80 70 65 63 69 61 6c 20 0a 2a 2a 20 63 61 73 65 73  pecial .** cases
10e90 20 62 65 63 61 75 73 65 20 74 68 65 79 20 63 68   because they ch
10ea0 61 6e 67 65 20 74 68 65 20 6f 72 64 65 72 20 69  ange the order i
10eb0 6e 20 77 68 69 63 68 20 74 68 65 20 74 68 72 65  n which the thre
10ec0 65 20 63 75 72 73 6f 72 73 20 28 63 73 72 53 74  e cursors (csrSt
10ed0 61 72 74 2c 0a 2a 2a 20 63 73 72 43 75 72 72 65  art,.** csrCurre
10ee0 6e 74 20 61 6e 64 20 63 73 72 45 6e 64 29 20 69  nt and csrEnd) i
10ef0 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
10f00 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  he ephemeral tab
10f10 6c 65 2e 20 43 61 73 65 73 20 74 68 61 74 0a 2a  le. Cases that.*
10f20 2a 20 75 73 65 20 55 4e 42 4f 55 4e 44 45 44 20  * use UNBOUNDED 
10f30 6f 72 20 43 55 52 52 45 4e 54 20 52 4f 57 20 61  or CURRENT ROW a
10f40 72 65 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20  re much simpler 
10f50 76 61 72 69 61 74 69 6f 6e 73 20 6f 6e 20 6f 6e  variations on on
10f60 65 20 6f 66 20 74 68 65 73 65 0a 2a 2a 20 74 68  e of these.** th
10f70 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57  ree..**.**   ROW
10f80 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31  S BETWEEN <expr1
10f90 3e 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20  > PRECEDING AND 
10fa0 3c 65 78 70 72 32 3e 20 50 52 45 43 45 44 49 4e  <expr2> PRECEDIN
10fb0 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20  G.**.**     ... 
10fc0 6c 6f 6f 70 20 73 74 61 72 74 65 64 20 62 79 20  loop started by 
10fd0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
10fe0 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20  n() ....**      
10ff0 20 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69   if( new partiti
11000 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  on ){.**        
11010 20 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20   Gosub flush.** 
11020 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20        }.**      
11030 20 49 6e 73 65 72 74 20 6e 65 77 20 72 6f 77 20   Insert new row 
11040 69 6e 74 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a  into eph table..
11050 2a 2a 20 20 20 20 20 20 20 69 66 28 20 66 69 72  **       if( fir
11060 73 74 20 72 6f 77 20 6f 66 20 70 61 72 74 69 74  st row of partit
11070 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  ion ){.**       
11080 20 20 52 65 77 69 6e 64 28 63 73 72 45 6e 64 29    Rewind(csrEnd)
11090 20 3b 20 52 65 77 69 6e 64 28 63 73 72 53 74 61   ; Rewind(csrSta
110a0 72 74 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72  rt) ; Rewind(csr
110b0 43 75 72 72 65 6e 74 29 0a 2a 2a 20 20 20 20 20  Current).**     
110c0 20 20 20 20 72 65 67 45 6e 64 20 3d 20 3c 65 78      regEnd = <ex
110d0 70 72 32 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20  pr2>.**         
110e0 72 65 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72  regStart = <expr
110f0 31 3e 0a 2a 2a 20 20 20 20 20 20 20 7d 65 6c 73  1>.**       }els
11100 65 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 66  e{.**         if
11110 28 20 28 72 65 67 45 6e 64 2d 2d 29 3c 3d 30 20  ( (regEnd--)<=0 
11120 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ){.**           
11130 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 20  AGGSTEP.**      
11140 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20     }.**         
11150 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20  RETURN_ROW.**   
11160 20 20 20 20 20 20 69 66 28 20 28 72 65 67 53 74        if( (regSt
11170 61 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20  art--)<=0 ){.** 
11180 20 20 20 20 20 20 20 20 20 20 41 47 47 49 4e 56            AGGINV
11190 45 52 53 45 0a 2a 2a 20 20 20 20 20 20 20 20 20  ERSE.**         
111a0 7d 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20  }.**       }.** 
111b0 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 66 6c 75      }.**     flu
111c0 73 68 3a 0a 2a 2a 20 20 20 20 20 20 20 69 66 28  sh:.**       if(
111d0 20 28 72 65 67 45 6e 64 2d 2d 29 3c 3d 30 20 29   (regEnd--)<=0 )
111e0 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 47 47  {.**         AGG
111f0 53 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 7d 0a  STEP.**       }.
11200 2a 2a 20 20 20 20 20 20 20 52 45 54 55 52 4e 5f  **       RETURN_
11210 52 4f 57 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 52  ROW.**.**.**   R
11220 4f 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70  OWS BETWEEN <exp
11230 72 31 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e  r1> FOLLOWING AN
11240 44 20 3c 65 78 70 72 32 3e 20 46 4f 4c 4c 4f 57  D <expr2> FOLLOW
11250 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e  ING.**.**     ..
11260 2e 20 6c 6f 6f 70 20 73 74 61 72 74 65 64 20 62  . loop started b
11270 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
11280 67 69 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20  gin() ....**    
11290 20 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69   if( new partiti
112a0 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 47  on ){.**       G
112b0 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20 20  osub flush.**   
112c0 20 20 7d 0a 2a 2a 20 20 20 20 20 49 6e 73 65 72    }.**     Inser
112d0 74 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20 65  t new row into e
112e0 70 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20  ph table..**    
112f0 20 69 66 28 20 66 69 72 73 74 20 72 6f 77 20 6f   if( first row o
11300 66 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a  f partition ){.*
11310 2a 20 20 20 20 20 20 20 52 65 77 69 6e 64 28 63  *       Rewind(c
11320 73 72 45 6e 64 29 20 3b 20 52 65 77 69 6e 64 28  srEnd) ; Rewind(
11330 63 73 72 53 74 61 72 74 29 20 3b 20 52 65 77 69  csrStart) ; Rewi
11340 6e 64 28 63 73 72 43 75 72 72 65 6e 74 29 0a 2a  nd(csrCurrent).*
11350 2a 20 20 20 20 20 20 20 72 65 67 45 6e 64 20 3d  *       regEnd =
11360 20 3c 65 78 70 72 32 3e 0a 2a 2a 20 20 20 20 20   <expr2>.**     
11370 20 20 72 65 67 53 74 61 72 74 20 3d 20 72 65 67    regStart = reg
11380 45 6e 64 20 2d 20 3c 65 78 70 72 31 3e 0a 2a 2a  End - <expr1>.**
11390 20 20 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20       }else{.**  
113a0 20 20 20 20 20 41 47 47 53 54 45 50 0a 2a 2a 20       AGGSTEP.** 
113b0 20 20 20 20 20 20 69 66 28 20 28 72 65 67 45 6e        if( (regEn
113c0 64 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20  d--)<=0 ){.**   
113d0 20 20 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57        RETURN_ROW
113e0 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  .**       }.**  
113f0 20 20 20 20 20 69 66 28 20 28 72 65 67 53 74 61       if( (regSta
11400 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20  rt--)<=0 ){.**  
11410 20 20 20 20 20 20 20 41 47 47 49 4e 56 45 52 53         AGGINVERS
11420 45 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20  E.**       }.** 
11430 20 20 20 20 7d 0a 2a 2a 20 20 20 7d 0a 2a 2a 20      }.**   }.** 
11440 20 20 66 6c 75 73 68 3a 0a 2a 2a 20 20 20 20 20    flush:.**     
11450 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 77  AGGSTEP.**     w
11460 68 69 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20  hile( 1 ){.**   
11470 20 20 20 20 69 66 28 20 28 72 65 67 45 6e 64 2d      if( (regEnd-
11480 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20  -)<=0 ){.**     
11490 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a      RETURN_ROW.*
114a0 2a 20 20 20 20 20 20 20 20 20 69 66 28 20 65 6f  *         if( eo
114b0 66 20 29 20 62 72 65 61 6b 3b 0a 2a 2a 20 20 20  f ) break;.**   
114c0 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 69      }.**       i
114d0 66 28 20 28 72 65 67 53 74 61 72 74 2d 2d 29 3c  f( (regStart--)<
114e0 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  =0 ){.**        
114f0 20 41 47 47 49 4e 56 45 52 53 45 0a 2a 2a 20 20   AGGINVERSE.**  
11500 20 20 20 20 20 20 20 69 66 28 20 65 6f 66 20 29         if( eof )
11510 20 62 72 65 61 6b 0a 2a 2a 20 20 20 20 20 20 20   break.**       
11520 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20  }.**     }.**   
11530 20 20 77 68 69 6c 65 28 20 21 65 6f 66 20 63 73    while( !eof cs
11540 72 43 75 72 72 65 6e 74 20 29 7b 0a 2a 2a 20 20  rCurrent ){.**  
11550 20 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a       RETURN_ROW.
11560 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 46  **     }.**.** F
11570 6f 72 20 74 68 65 20 6d 6f 73 74 20 70 61 72 74  or the most part
11580 2c 20 74 68 65 20 70 61 74 74 65 72 6e 73 20 61  , the patterns a
11590 62 6f 76 65 20 61 72 65 20 61 64 61 70 74 65 64  bove are adapted
115a0 20 74 6f 20 73 75 70 70 6f 72 74 20 55 4e 42 4f   to support UNBO
115b0 55 4e 44 45 44 20 62 79 0a 2a 2a 20 61 73 73 75  UNDED by.** assu
115c0 6d 69 6e 67 20 74 68 61 74 20 69 74 20 69 73 20  ming that it is 
115d0 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 22 69  equivalent to "i
115e0 6e 66 69 6e 69 74 79 20 50 52 45 43 45 44 49 4e  nfinity PRECEDIN
115f0 47 2f 46 4f 4c 4c 4f 57 49 4e 47 22 20 61 6e 64  G/FOLLOWING" and
11600 0a 2a 2a 20 43 55 52 52 45 4e 54 20 52 4f 57 20  .** CURRENT ROW 
11610 62 79 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  by assuming that
11620 20 69 74 20 69 73 20 65 71 75 69 76 69 6c 65 6e   it is equivilen
11630 74 20 74 6f 20 22 30 20 50 52 45 43 45 44 49 4e  t to "0 PRECEDIN
11640 47 2f 46 4f 4c 4c 4f 57 49 4e 47 22 2e 0a 2a 2a  G/FOLLOWING"..**
11650 20 54 68 69 73 20 69 73 20 6f 70 74 69 6d 69 7a   This is optimiz
11660 65 64 20 6f 66 20 63 6f 75 72 73 65 20 2d 20 62  ed of course - b
11670 72 61 6e 63 68 65 73 20 74 68 61 74 20 77 69 6c  ranches that wil
11680 6c 20 6e 65 76 65 72 20 62 65 20 74 61 6b 65 6e  l never be taken
11690 20 61 6e 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f   and.** conditio
116a0 6e 73 20 74 68 61 74 20 61 72 65 20 61 6c 77 61  ns that are alwa
116b0 79 73 20 74 72 75 65 20 61 72 65 20 6f 6d 69 74  ys true are omit
116c0 74 65 64 20 66 72 6f 6d 20 74 68 65 20 56 4d 20  ted from the VM 
116d0 63 6f 64 65 2e 20 54 68 65 20 6f 6e 6c 79 0a 2a  code. The only.*
116e0 2a 20 65 78 63 65 70 74 69 6f 6e 61 6c 20 63 61  * exceptional ca
116f0 73 65 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 52  se is:.**.**   R
11700 4f 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70  OWS BETWEEN <exp
11710 72 31 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e  r1> FOLLOWING AN
11720 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c  D UNBOUNDED FOLL
11730 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20  OWING.**.**     
11740 2e 2e 2e 20 6c 6f 6f 70 20 73 74 61 72 74 65 64  ... loop started
11750 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
11760 42 65 67 69 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20  Begin() ....**  
11770 20 20 20 69 66 28 20 6e 65 77 20 70 61 72 74 69     if( new parti
11780 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20  tion ){.**      
11790 20 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20   Gosub flush.** 
117a0 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 49 6e 73      }.**     Ins
117b0 65 72 74 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f  ert new row into
117c0 20 65 70 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20   eph table..**  
117d0 20 20 20 69 66 28 20 66 69 72 73 74 20 72 6f 77     if( first row
117e0 20 6f 66 20 70 61 72 74 69 74 69 6f 6e 20 29 7b   of partition ){
117f0 0a 2a 2a 20 20 20 20 20 20 20 52 65 77 69 6e 64  .**       Rewind
11800 28 63 73 72 45 6e 64 29 20 3b 20 52 65 77 69 6e  (csrEnd) ; Rewin
11810 64 28 63 73 72 53 74 61 72 74 29 20 3b 20 52 65  d(csrStart) ; Re
11820 77 69 6e 64 28 63 73 72 43 75 72 72 65 6e 74 29  wind(csrCurrent)
11830 0a 2a 2a 20 20 20 20 20 20 20 72 65 67 53 74 61  .**       regSta
11840 72 74 20 3d 20 3c 65 78 70 72 31 3e 0a 2a 2a 20  rt = <expr1>.** 
11850 20 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20      }else{.**   
11860 20 20 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20      AGGSTEP.**  
11870 20 20 20 7d 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20     }.**   }.**  
11880 20 66 6c 75 73 68 3a 0a 2a 2a 20 20 20 20 20 41   flush:.**     A
11890 47 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 77 68  GGSTEP.**     wh
118a0 69 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20  ile( 1 ){.**    
118b0 20 20 20 69 66 28 20 28 72 65 67 53 74 61 72 74     if( (regStart
118c0 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20  --)<=0 ){.**    
118d0 20 20 20 20 20 41 47 47 49 4e 56 45 52 53 45 0a       AGGINVERSE.
118e0 2a 2a 20 20 20 20 20 20 20 20 20 69 66 28 20 65  **         if( e
118f0 6f 66 20 29 20 62 72 65 61 6b 0a 2a 2a 20 20 20  of ) break.**   
11900 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 52      }.**       R
11910 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20  ETURN_ROW.**    
11920 20 7d 0a 2a 2a 20 20 20 20 20 77 68 69 6c 65 28   }.**     while(
11930 20 21 65 6f 66 20 63 73 72 43 75 72 72 65 6e 74   !eof csrCurrent
11940 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 52 45 54   ){.**       RET
11950 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 7d  URN_ROW.**     }
11960 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 71 75  .**.** Also requ
11970 69 72 69 6e 67 20 73 70 65 63 69 61 6c 20 68 61  iring special ha
11980 6e 64 6c 69 6e 67 20 61 72 65 20 74 68 65 20 63  ndling are the c
11990 61 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 4f  ases:.**.**   RO
119a0 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72  WS BETWEEN <expr
119b0 31 3e 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44  1> PRECEDING AND
119c0 20 3c 65 78 70 72 32 3e 20 50 52 45 43 45 44 49   <expr2> PRECEDI
119d0 4e 47 0a 2a 2a 20 20 20 52 4f 57 53 20 42 45 54  NG.**   ROWS BET
119e0 57 45 45 4e 20 3c 65 78 70 72 31 3e 20 46 4f 4c  WEEN <expr1> FOL
119f0 4c 4f 57 49 4e 47 20 41 4e 44 20 3c 65 78 70 72  LOWING AND <expr
11a00 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a  2> FOLLOWING.**.
11a10 2a 2a 20 77 68 65 6e 20 28 65 78 70 72 31 20 3c  ** when (expr1 <
11a20 20 65 78 70 72 32 29 2e 20 54 68 69 73 20 69 73   expr2). This is
11a30 20 64 65 74 65 63 74 65 64 20 61 74 20 72 75 6e   detected at run
11a40 74 69 6d 65 2c 20 6e 6f 74 20 62 79 20 74 68 69  time, not by thi
11a50 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 54  s function..** T
11a60 6f 20 68 61 6e 64 6c 65 20 74 68 69 73 20 63 61  o handle this ca
11a70 73 65 2c 20 74 68 65 20 70 73 65 75 64 6f 2d 63  se, the pseudo-c
11a80 6f 64 65 20 70 72 6f 67 72 61 6d 73 20 64 65 70  ode programs dep
11a90 69 63 74 65 64 20 61 62 6f 76 65 20 61 72 65 20  icted above are 
11aa0 6d 6f 64 69 66 69 65 64 0a 2a 2a 20 73 6c 69 67  modified.** slig
11ab0 68 74 6c 79 20 74 6f 20 62 65 3a 0a 2a 2a 0a 2a  htly to be:.**.*
11ac0 2a 20 20 20 20 20 2e 2e 2e 20 6c 6f 6f 70 20 73  *     ... loop s
11ad0 74 61 72 74 65 64 20 62 79 20 73 71 6c 69 74 65  tarted by sqlite
11ae0 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2e 2e  3WhereBegin() ..
11af0 2e 0a 2a 2a 20 20 20 20 20 69 66 28 20 6e 65 77  ..**     if( new
11b00 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a   partition ){.**
11b10 20 20 20 20 20 20 20 47 6f 73 75 62 20 66 6c 75         Gosub flu
11b20 73 68 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20  sh.**     }.**  
11b30 20 20 20 49 6e 73 65 72 74 20 6e 65 77 20 72 6f     Insert new ro
11b40 77 20 69 6e 74 6f 20 65 70 68 20 74 61 62 6c 65  w into eph table
11b50 2e 0a 2a 2a 20 20 20 20 20 69 66 28 20 66 69 72  ..**     if( fir
11b60 73 74 20 72 6f 77 20 6f 66 20 70 61 72 74 69 74  st row of partit
11b70 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  ion ){.**       
11b80 52 65 77 69 6e 64 28 63 73 72 45 6e 64 29 20 3b  Rewind(csrEnd) ;
11b90 20 52 65 77 69 6e 64 28 63 73 72 53 74 61 72 74   Rewind(csrStart
11ba0 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72 43 75  ) ; Rewind(csrCu
11bb0 72 72 65 6e 74 29 0a 2a 2a 20 20 20 20 20 20 20  rrent).**       
11bc0 72 65 67 45 6e 64 20 3d 20 3c 65 78 70 72 32 3e  regEnd = <expr2>
11bd0 0a 2a 2a 20 20 20 20 20 20 20 72 65 67 53 74 61  .**       regSta
11be0 72 74 20 3d 20 3c 65 78 70 72 31 3e 0a 2a 2a 20  rt = <expr1>.** 
11bf0 20 20 20 20 20 20 69 66 28 20 72 65 67 45 6e 64        if( regEnd
11c00 20 3c 20 72 65 67 53 74 61 72 74 20 29 7b 0a 2a   < regStart ){.*
11c10 2a 20 20 20 20 20 20 20 20 20 52 45 54 55 52 4e  *         RETURN
11c20 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 20 20 20 20  _ROW.**         
11c30 64 65 6c 65 74 65 20 65 70 68 20 74 61 62 6c 65  delete eph table
11c40 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 20 20 20   contents.**    
11c50 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a       continue.**
11c60 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
11c70 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  ....**.** The ne
11c80 77 20 22 63 6f 6e 74 69 6e 75 65 22 20 73 74 61  w "continue" sta
11c90 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 61 62  tement in the ab
11ca0 6f 76 65 20 6a 75 6d 70 73 20 74 6f 20 74 68 65  ove jumps to the
11cb0 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 0a   next iteration.
11cc0 2a 2a 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  ** of the outer 
11cd0 6c 6f 6f 70 20 2d 20 74 68 65 20 6f 6e 65 20 73  loop - the one s
11ce0 74 61 72 74 65 64 20 62 79 20 73 71 6c 69 74 65  tarted by sqlite
11cf0 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e 0a 2a  3WhereBegin()..*
11d00 2a 0a 2a 2a 20 54 68 65 20 76 61 72 69 6f 75 73  *.** The various
11d10 20 47 52 4f 55 50 53 20 63 61 73 65 73 20 61 72   GROUPS cases ar
11d20 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73  e implemented us
11d30 69 6e 67 20 74 68 65 20 73 61 6d 65 20 70 61 74  ing the same pat
11d40 74 65 72 6e 73 20 61 73 0a 2a 2a 20 52 4f 57 53  terns as.** ROWS
11d50 2e 20 54 68 65 20 56 4d 20 63 6f 64 65 20 69 73  . The VM code is
11d60 20 6d 6f 64 69 66 69 65 64 20 73 6c 69 67 68 74   modified slight
11d70 6c 79 20 73 6f 20 74 68 61 74 3a 0a 2a 2a 0a 2a  ly so that:.**.*
11d80 2a 20 20 20 31 2e 20 54 68 65 20 65 6c 73 65 20  *   1. The else 
11d90 62 72 61 6e 63 68 20 69 6e 20 74 68 65 20 6d 61  branch in the ma
11da0 69 6e 20 6c 6f 6f 70 20 69 73 20 6f 6e 6c 79 20  in loop is only 
11db0 74 61 6b 65 6e 20 69 66 20 74 68 65 20 72 6f 77  taken if the row
11dc0 20 6a 75 73 74 0a 2a 2a 20 20 20 20 20 20 61 64   just.**      ad
11dd0 64 65 64 20 74 6f 20 74 68 65 20 65 70 68 65 6d  ded to the ephem
11de0 65 72 61 6c 20 74 61 62 6c 65 20 69 73 20 74 68  eral table is th
11df0 65 20 73 74 61 72 74 20 6f 66 20 61 20 6e 65 77  e start of a new
11e00 20 67 72 6f 75 70 2e 20 49 6e 0a 2a 2a 20 20 20   group. In.**   
11e10 20 20 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20     other words, 
11e20 69 74 20 62 65 63 6f 6d 65 73 3a 0a 2a 2a 0a 2a  it becomes:.**.*
11e30 2a 20 20 20 20 20 20 20 20 20 2e 2e 2e 20 6c 6f  *         ... lo
11e40 6f 70 20 73 74 61 72 74 65 64 20 62 79 20 73 71  op started by sq
11e50 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
11e60 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20  ) ....**        
11e70 20 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69   if( new partiti
11e80 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  on ){.**        
11e90 20 20 20 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a     Gosub flush.*
11ea0 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  *         }.**  
11eb0 20 20 20 20 20 20 20 49 6e 73 65 72 74 20 6e 65         Insert ne
11ec0 77 20 72 6f 77 20 69 6e 74 6f 20 65 70 68 20 74  w row into eph t
11ed0 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20  able..**        
11ee0 20 69 66 28 20 66 69 72 73 74 20 72 6f 77 20 6f   if( first row o
11ef0 66 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a  f partition ){.*
11f00 2a 20 20 20 20 20 20 20 20 20 20 20 52 65 77 69  *           Rewi
11f10 6e 64 28 63 73 72 45 6e 64 29 20 3b 20 52 65 77  nd(csrEnd) ; Rew
11f20 69 6e 64 28 63 73 72 53 74 61 72 74 29 20 3b 20  ind(csrStart) ; 
11f30 52 65 77 69 6e 64 28 63 73 72 43 75 72 72 65 6e  Rewind(csrCurren
11f40 74 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  t).**           
11f50 72 65 67 45 6e 64 20 3d 20 3c 65 78 70 72 32 3e  regEnd = <expr2>
11f60 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 72 65  .**           re
11f70 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72 31 3e  gStart = <expr1>
11f80 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 65 6c 73  .**         }els
11f90 65 20 69 66 28 20 6e 65 77 20 67 72 6f 75 70 20  e if( new group 
11fa0 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ){.**           
11fb0 2e 2e 2e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ... .**         
11fc0 7d 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 0a  }.**       }.**.
11fd0 2a 2a 20 20 20 32 2e 20 49 6e 73 74 65 61 64 20  **   2. Instead 
11fe0 6f 66 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20  of processing a 
11ff0 73 69 6e 67 6c 65 20 72 6f 77 2c 20 65 61 63 68  single row, each
12000 20 52 45 54 55 52 4e 5f 52 4f 57 2c 20 41 47 47   RETURN_ROW, AGG
12010 53 54 45 50 20 6f 72 20 0a 2a 2a 20 20 20 20 20  STEP or .**     
12020 20 41 47 47 49 4e 56 45 52 53 45 20 73 74 65 70   AGGINVERSE step
12030 20 70 72 6f 63 65 73 73 65 73 20 74 68 65 20 63   processes the c
12040 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68  urrent row of th
12050 65 20 72 65 6c 65 76 61 6e 74 20 63 75 72 73 6f  e relevant curso
12060 72 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 61 6c  r and.**      al
12070 6c 20 73 75 62 73 65 71 75 65 6e 74 20 72 6f 77  l subsequent row
12080 73 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74  s belonging to t
12090 68 65 20 73 61 6d 65 20 67 72 6f 75 70 2e 0a 2a  he same group..*
120a0 2a 0a 2a 2a 20 52 41 4e 47 45 20 77 69 6e 64 6f  *.** RANGE windo
120b0 77 20 66 72 61 6d 65 73 20 61 72 65 20 61 20 6c  w frames are a l
120c0 69 74 74 6c 65 20 64 69 66 66 65 72 65 6e 74 20  ittle different 
120d0 61 67 61 69 6e 2e 20 41 73 20 66 6f 72 20 47 52  again. As for GR
120e0 4f 55 50 53 2c 20 74 68 65 20 0a 2a 2a 20 6d 61  OUPS, the .** ma
120f0 69 6e 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63  in loop runs onc
12100 65 20 70 65 72 20 67 72 6f 75 70 20 6f 6e 6c 79  e per group only
12110 2e 20 41 6e 64 20 52 45 54 55 52 4e 5f 52 4f 57  . And RETURN_ROW
12120 2c 20 41 47 47 53 54 45 50 20 61 6e 64 20 41 47  , AGGSTEP and AG
12130 47 49 4e 56 45 52 53 45 0a 2a 2a 20 64 65 61 6c  GINVERSE.** deal
12140 20 69 6e 20 67 72 6f 75 70 73 20 69 6e 73 74 65   in groups inste
12150 61 64 20 6f 66 20 72 6f 77 73 2e 20 41 73 20 66  ad of rows. As f
12160 6f 72 20 52 4f 57 53 20 61 6e 64 20 47 52 4f 55  or ROWS and GROU
12170 50 53 2c 20 74 68 65 72 65 20 61 72 65 20 74 68  PS, there are th
12180 72 65 65 0a 2a 2a 20 62 61 73 69 63 20 63 61 73  ree.** basic cas
12190 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e 47  es:.**.**   RANG
121a0 45 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31  E BETWEEN <expr1
121b0 3e 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20  > PRECEDING AND 
121c0 3c 65 78 70 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e  <expr2> FOLLOWIN
121d0 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20  G.**.**     ... 
121e0 6c 6f 6f 70 20 73 74 61 72 74 65 64 20 62 79 20  loop started by 
121f0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
12200 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20  n() ....**      
12210 20 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69   if( new partiti
12220 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  on ){.**        
12230 20 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20   Gosub flush.** 
12240 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20        }.**      
12250 20 49 6e 73 65 72 74 20 6e 65 77 20 72 6f 77 20   Insert new row 
12260 69 6e 74 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a  into eph table..
12270 2a 2a 20 20 20 20 20 20 20 69 66 28 20 66 69 72  **       if( fir
12280 73 74 20 72 6f 77 20 6f 66 20 70 61 72 74 69 74  st row of partit
12290 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  ion ){.**       
122a0 20 20 52 65 77 69 6e 64 28 63 73 72 45 6e 64 29    Rewind(csrEnd)
122b0 20 3b 20 52 65 77 69 6e 64 28 63 73 72 53 74 61   ; Rewind(csrSta
122c0 72 74 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72  rt) ; Rewind(csr
122d0 43 75 72 72 65 6e 74 29 0a 2a 2a 20 20 20 20 20  Current).**     
122e0 20 20 20 20 72 65 67 45 6e 64 20 3d 20 3c 65 78      regEnd = <ex
122f0 70 72 32 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20  pr2>.**         
12300 72 65 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72  regStart = <expr
12310 31 3e 0a 2a 2a 20 20 20 20 20 20 20 7d 65 6c 73  1>.**       }els
12320 65 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 47  e{.**         AG
12330 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 20  GSTEP.**        
12340 20 77 68 69 6c 65 28 20 28 63 73 72 43 75 72 72   while( (csrCurr
12350 65 6e 74 2e 6b 65 79 20 2b 20 72 65 67 45 6e 64  ent.key + regEnd
12360 29 20 3c 20 63 73 72 45 6e 64 2e 6b 65 79 20 29  ) < csrEnd.key )
12370 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 52  {.**           R
12380 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20  ETURN_ROW.**    
12390 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 63 73         while( cs
123a0 72 53 74 61 72 74 2e 6b 65 79 20 2b 20 72 65 67  rStart.key + reg
123b0 53 74 61 72 74 29 20 3c 20 63 73 72 43 75 72 72  Start) < csrCurr
123c0 65 6e 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20  ent.key ){.**   
123d0 20 20 20 20 20 20 20 20 20 20 41 47 47 49 4e 56            AGGINV
123e0 45 52 53 45 0a 2a 2a 20 20 20 20 20 20 20 20 20  ERSE.**         
123f0 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d    }.**         }
12400 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  .**       }.**  
12410 20 20 20 7d 0a 2a 2a 20 20 20 20 20 66 6c 75 73     }.**     flus
12420 68 3a 0a 2a 2a 20 20 20 20 20 20 20 41 47 47 53  h:.**       AGGS
12430 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 77 68 69  TEP.**       whi
12440 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20  le( 1 ){.**     
12450 20 20 20 20 52 45 54 55 52 4e 20 52 4f 57 0a 2a      RETURN ROW.*
12460 2a 20 20 20 20 20 20 20 20 20 69 66 28 20 63 73  *         if( cs
12470 72 43 75 72 72 65 6e 74 20 69 73 20 45 4f 46 20  rCurrent is EOF 
12480 29 20 62 72 65 61 6b 3b 0a 2a 2a 20 20 20 20 20  ) break;.**     
12490 20 20 20 20 20 20 77 68 69 6c 65 28 20 63 73 72        while( csr
124a0 53 74 61 72 74 2e 6b 65 79 20 2b 20 72 65 67 53  Start.key + regS
124b0 74 61 72 74 29 20 3c 20 63 73 72 43 75 72 72 65  tart) < csrCurre
124c0 6e 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20  nt.key ){.**    
124d0 20 20 20 20 20 20 20 20 20 41 47 47 49 4e 56 45           AGGINVE
124e0 52 53 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  RSE.**          
124f0 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a   }.**         }.
12500 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a  **       }.**.**
12510 20 49 6e 20 74 68 65 20 61 62 6f 76 65 20 6e 6f   In the above no
12520 74 61 74 69 6f 6e 2c 20 22 63 73 72 2e 6b 65 79  tation, "csr.key
12530 22 20 6d 65 61 6e 73 20 74 68 65 20 63 75 72 72  " means the curr
12540 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65  ent value of the
12550 20 4f 52 44 45 52 20 42 59 20 0a 2a 2a 20 65 78   ORDER BY .** ex
12560 70 72 65 73 73 69 6f 6e 20 28 74 68 65 72 65 20  pression (there 
12570 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 31 20 66  is only ever 1 f
12580 6f 72 20 61 20 52 41 4e 47 45 20 74 68 61 74 20  or a RANGE that 
12590 75 73 65 73 20 61 6e 20 3c 65 78 70 72 3e 20 46  uses an <expr> F
125a0 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 20 6f 72 20 3c  OLLOWING.** or <
125b0 65 78 70 72 20 50 52 45 43 45 44 49 4e 47 29 20  expr PRECEDING) 
125c0 72 65 61 64 20 66 72 6f 6d 20 63 75 72 73 6f 72  read from cursor
125d0 20 63 73 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 52 41   csr..**.**   RA
125e0 4e 47 45 20 42 45 54 57 45 45 4e 20 3c 65 78 70  NGE BETWEEN <exp
125f0 72 31 3e 20 50 52 45 43 45 44 49 4e 47 20 41 4e  r1> PRECEDING AN
12600 44 20 3c 65 78 70 72 32 3e 20 50 52 45 43 45 44  D <expr2> PRECED
12610 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e  ING.**.**     ..
12620 2e 20 6c 6f 6f 70 20 73 74 61 72 74 65 64 20 62  . loop started b
12630 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
12640 67 69 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20  gin() ....**    
12650 20 20 20 69 66 28 20 6e 65 77 20 70 61 72 74 69     if( new parti
12660 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20  tion ){.**      
12670 20 20 20 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a     Gosub flush.*
12680 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  *       }.**    
12690 20 20 20 49 6e 73 65 72 74 20 6e 65 77 20 72 6f     Insert new ro
126a0 77 20 69 6e 74 6f 20 65 70 68 20 74 61 62 6c 65  w into eph table
126b0 2e 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 66  ..**       if( f
126c0 69 72 73 74 20 72 6f 77 20 6f 66 20 70 61 72 74  irst row of part
126d0 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20  ition ){.**     
126e0 20 20 20 20 52 65 77 69 6e 64 28 63 73 72 45 6e      Rewind(csrEn
126f0 64 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72 53  d) ; Rewind(csrS
12700 74 61 72 74 29 20 3b 20 52 65 77 69 6e 64 28 63  tart) ; Rewind(c
12710 73 72 43 75 72 72 65 6e 74 29 0a 2a 2a 20 20 20  srCurrent).**   
12720 20 20 20 20 20 20 72 65 67 45 6e 64 20 3d 20 3c        regEnd = <
12730 65 78 70 72 32 3e 0a 2a 2a 20 20 20 20 20 20 20  expr2>.**       
12740 20 20 72 65 67 53 74 61 72 74 20 3d 20 3c 65 78    regStart = <ex
12750 70 72 31 3e 0a 2a 2a 20 20 20 20 20 20 20 7d 65  pr1>.**       }e
12760 6c 73 65 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  lse{.**         
12770 77 68 69 6c 65 28 20 28 63 73 72 45 6e 64 2e 6b  while( (csrEnd.k
12780 65 79 20 2b 20 72 65 67 45 6e 64 29 20 3c 3d 20  ey + regEnd) <= 
12790 63 73 72 43 75 72 72 65 6e 74 2e 6b 65 79 20 29  csrCurrent.key )
127a0 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41  {.**           A
127b0 47 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 20 20  GGSTEP.**       
127c0 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 52    }.**         R
127d0 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20  ETURN_ROW.**    
127e0 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 73 72       while( (csr
127f0 53 74 61 72 74 2e 6b 65 79 20 2b 20 72 65 67 53  Start.key + regS
12800 74 61 72 74 29 20 3c 20 63 73 72 43 75 72 72 65  tart) < csrCurre
12810 6e 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20  nt.key ){.**    
12820 20 20 20 20 20 20 20 41 47 47 49 4e 56 45 52 53         AGGINVERS
12830 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a  E.**         }.*
12840 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  *       }.**    
12850 20 7d 0a 2a 2a 20 20 20 20 20 66 6c 75 73 68 3a   }.**     flush:
12860 0a 2a 2a 20 20 20 20 20 20 20 77 68 69 6c 65 28  .**       while(
12870 20 28 63 73 72 45 6e 64 2e 6b 65 79 20 2b 20 72   (csrEnd.key + r
12880 65 67 45 6e 64 29 20 3c 3d 20 63 73 72 43 75 72  egEnd) <= csrCur
12890 72 65 6e 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20  rent.key ){.**  
128a0 20 20 20 20 20 20 20 41 47 47 53 54 45 50 0a 2a         AGGSTEP.*
128b0 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  *       }.**    
128c0 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a     RETURN_ROW.**
128d0 0a 2a 2a 20 20 20 52 41 4e 47 45 20 42 45 54 57  .**   RANGE BETW
128e0 45 45 4e 20 3c 65 78 70 72 31 3e 20 46 4f 4c 4c  EEN <expr1> FOLL
128f0 4f 57 49 4e 47 20 41 4e 44 20 3c 65 78 70 72 32  OWING AND <expr2
12900 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a  > FOLLOWING.**.*
12910 2a 20 20 20 20 20 2e 2e 2e 20 6c 6f 6f 70 20 73  *     ... loop s
12920 74 61 72 74 65 64 20 62 79 20 73 71 6c 69 74 65  tarted by sqlite
12930 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2e 2e  3WhereBegin() ..
12940 2e 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 6e  ..**       if( n
12950 65 77 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a  ew partition ){.
12960 2a 2a 20 20 20 20 20 20 20 20 20 47 6f 73 75 62  **         Gosub
12970 20 66 6c 75 73 68 0a 2a 2a 20 20 20 20 20 20 20   flush.**       
12980 7d 0a 2a 2a 20 20 20 20 20 20 20 49 6e 73 65 72  }.**       Inser
12990 74 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20 65  t new row into e
129a0 70 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20  ph table..**    
129b0 20 20 20 69 66 28 20 66 69 72 73 74 20 72 6f 77     if( first row
129c0 20 6f 66 20 70 61 72 74 69 74 69 6f 6e 20 29 7b   of partition ){
129d0 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 65 77 69  .**         Rewi
129e0 6e 64 28 63 73 72 45 6e 64 29 20 3b 20 52 65 77  nd(csrEnd) ; Rew
129f0 69 6e 64 28 63 73 72 53 74 61 72 74 29 20 3b 20  ind(csrStart) ; 
12a00 52 65 77 69 6e 64 28 63 73 72 43 75 72 72 65 6e  Rewind(csrCurren
12a10 74 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 72 65  t).**         re
12a20 67 45 6e 64 20 3d 20 3c 65 78 70 72 32 3e 0a 2a  gEnd = <expr2>.*
12a30 2a 20 20 20 20 20 20 20 20 20 72 65 67 53 74 61  *         regSta
12a40 72 74 20 3d 20 3c 65 78 70 72 31 3e 0a 2a 2a 20  rt = <expr1>.** 
12a50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20        }else{.** 
12a60 20 20 20 20 20 20 20 20 41 47 47 53 54 45 50 0a          AGGSTEP.
12a70 2a 2a 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  **         while
12a80 28 20 28 63 73 72 43 75 72 72 65 6e 74 2e 6b 65  ( (csrCurrent.ke
12a90 79 20 2b 20 72 65 67 45 6e 64 29 20 3c 20 63 73  y + regEnd) < cs
12aa0 72 45 6e 64 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20  rEnd.key ){.**  
12ab0 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
12ac0 28 63 73 72 43 75 72 72 65 6e 74 2e 6b 65 79 20  (csrCurrent.key 
12ad0 2b 20 72 65 67 53 74 61 72 74 29 20 3e 20 63 73  + regStart) > cs
12ae0 72 53 74 61 72 74 2e 6b 65 79 20 29 7b 0a 2a 2a  rStart.key ){.**
12af0 20 20 20 20 20 20 20 20 20 20 20 20 20 41 47 47               AGG
12b00 49 4e 56 45 52 53 45 0a 2a 2a 20 20 20 20 20 20  INVERSE.**      
12b10 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20       }.**       
12b20 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a      RETURN_ROW.*
12b30 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  *         }.**  
12b40 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a       }.**     }.
12b50 2a 2a 20 20 20 20 20 66 6c 75 73 68 3a 0a 2a 2a  **     flush:.**
12b60 20 20 20 20 20 20 20 41 47 47 53 54 45 50 0a 2a         AGGSTEP.*
12b70 2a 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 31  *       while( 1
12b80 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 77   ){.**         w
12b90 68 69 6c 65 28 20 28 63 73 72 43 75 72 72 65 6e  hile( (csrCurren
12ba0 74 2e 6b 65 79 20 2b 20 72 65 67 53 74 61 72 74  t.key + regStart
12bb0 29 20 3e 20 63 73 72 53 74 61 72 74 2e 6b 65 79  ) > csrStart.key
12bc0 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   ){.**          
12bd0 20 41 47 47 49 4e 56 45 52 53 45 0a 2a 2a 20 20   AGGINVERSE.**  
12be0 20 20 20 20 20 20 20 20 20 69 66 28 20 65 6f 66           if( eof
12bf0 20 29 20 62 72 65 61 6b 20 22 77 68 69 6c 65 28   ) break "while(
12c00 20 31 20 29 22 20 6c 6f 6f 70 2e 0a 2a 2a 20 20   1 )" loop..**  
12c10 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
12c20 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a      RETURN_ROW.*
12c30 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  *       }.**    
12c40 20 20 20 77 68 69 6c 65 28 20 21 65 6f 66 20 63     while( !eof c
12c50 73 72 43 75 72 72 65 6e 74 20 29 7b 0a 2a 2a 20  srCurrent ){.** 
12c60 20 20 20 20 20 20 20 20 52 45 54 55 52 4e 5f 52          RETURN_R
12c70 4f 57 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a  OW.**       }.**
12c80 0a 2a 2a 20 54 68 65 20 74 65 78 74 20 61 62 6f  .** The text abo
12c90 76 65 20 6c 65 61 76 65 73 20 6f 75 74 20 6d 61  ve leaves out ma
12ca0 6e 79 20 64 65 74 61 69 6c 73 2e 20 52 65 66 65  ny details. Refe
12cb0 72 20 74 6f 20 74 68 65 20 63 6f 64 65 20 61 6e  r to the code an
12cc0 64 20 63 6f 6d 6d 65 6e 74 73 0a 2a 2a 20 62 65  d comments.** be
12cd0 6c 6f 77 20 66 6f 72 20 61 20 6d 6f 72 65 20 63  low for a more c
12ce0 6f 6d 70 6c 65 74 65 20 70 69 63 74 75 72 65 2e  omplete picture.
12cf0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
12d00 57 69 6e 64 6f 77 43 6f 64 65 53 74 65 70 28 0a  WindowCodeStep(.
12d10 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
12d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d30 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
12d40 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
12d50 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
12d60 20 20 20 20 20 20 20 20 2f 2a 20 52 65 77 72 69          /* Rewri
12d70 74 74 65 6e 20 53 45 4c 45 43 54 20 73 74 61 74  tten SELECT stat
12d80 65 6d 65 6e 74 20 2a 2f 0a 20 20 57 68 65 72 65  ement */.  Where
12d90 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20  Info *pWInfo,   
12da0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
12db0 6e 74 65 78 74 20 72 65 74 75 72 6e 65 64 20 62  ntext returned b
12dc0 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
12dd0 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 72  gin() */.  int r
12de0 65 67 47 6f 73 75 62 2c 20 20 20 20 20 20 20 20  egGosub,        
12df0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
12e00 67 69 73 74 65 72 20 66 6f 72 20 4f 50 5f 47 6f  gister for OP_Go
12e10 73 75 62 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  sub */.  int add
12e20 72 47 6f 73 75 62 20 20 20 20 20 20 20 20 20 20  rGosub          
12e30 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 50 5f 47           /* OP_G
12e40 6f 73 75 62 20 68 65 72 65 20 74 6f 20 72 65 74  osub here to ret
12e50 75 72 6e 20 65 61 63 68 20 72 6f 77 20 2a 2f 0a  urn each row */.
12e60 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57  ){.  Window *pMW
12e70 69 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b 0a 20 20  in = p->pWin;.  
12e80 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
12e90 42 79 20 3d 20 70 4d 57 69 6e 2d 3e 70 4f 72 64  By = pMWin->pOrd
12ea0 65 72 42 79 3b 0a 20 20 56 64 62 65 20 2a 76 20  erBy;.  Vdbe *v 
12eb0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
12ec0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
12ed0 63 73 72 57 72 69 74 65 3b 20 20 20 20 20 20 20  csrWrite;       
12ee0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
12ef0 75 72 73 6f 72 20 75 73 65 64 20 74 6f 20 77 72  ursor used to wr
12f00 69 74 65 20 74 6f 20 65 70 68 2e 20 74 61 62 6c  ite to eph. tabl
12f10 65 20 2a 2f 0a 20 20 69 6e 74 20 63 73 72 49 6e  e */.  int csrIn
12f20 70 75 74 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  put = p->pSrc->a
12f30 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 20 20 20 20  [0].iCursor;    
12f40 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20 73 75   /* Cursor of su
12f50 62 2d 73 65 6c 65 63 74 20 2a 2f 0a 20 20 69 6e  b-select */.  in
12f60 74 20 6e 49 6e 70 75 74 20 3d 20 70 2d 3e 70 53  t nInput = p->pS
12f70 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 2d 3e 6e  rc->a[0].pTab->n
12f80 43 6f 6c 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65  Col;    /* Numbe
12f90 72 20 6f 66 20 63 6f 6c 73 20 72 65 74 75 72 6e  r of cols return
12fa0 65 64 20 62 79 20 73 75 62 20 2a 2f 0a 20 20 69  ed by sub */.  i
12fb0 6e 74 20 69 49 6e 70 75 74 3b 20 20 20 20 20 20  nt iInput;      
12fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fd0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 20 69           /* To i
12fe0 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 73  terate through s
12ff0 75 62 20 63 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74  ub cols */.  int
13000 20 61 64 64 72 4e 65 3b 20 20 20 20 20 20 20 20   addrNe;        
13010 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13020 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4e 65  Address of OP_Ne
13030 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 47 6f   */.  int addrGo
13040 73 75 62 46 6c 75 73 68 20 3d 20 30 3b 20 20 20  subFlush = 0;   
13050 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
13060 20 6f 66 20 4f 50 5f 47 6f 73 75 62 20 74 6f 20   of OP_Gosub to 
13070 66 6c 75 73 68 3a 20 2a 2f 0a 20 20 69 6e 74 20  flush: */.  int 
13080 61 64 64 72 49 6e 74 65 67 65 72 20 3d 20 30 3b  addrInteger = 0;
13090 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
130a0 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 49 6e 74  ddress of OP_Int
130b0 65 67 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 64  eger */.  int ad
130c0 64 72 45 6d 70 74 79 3b 20 20 20 20 20 20 20 20  drEmpty;        
130d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
130e0 72 65 73 73 20 6f 66 20 4f 50 5f 52 65 77 69 6e  ress of OP_Rewin
130f0 64 20 69 6e 20 66 6c 75 73 68 3a 20 2a 2f 0a 20  d in flush: */. 
13100 20 69 6e 74 20 72 65 67 53 74 61 72 74 20 3d 20   int regStart = 
13110 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
13120 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 3c 65 78   /* Value of <ex
13130 70 72 3e 20 50 52 45 43 45 44 49 4e 47 20 2a 2f  pr> PRECEDING */
13140 0a 20 20 69 6e 74 20 72 65 67 45 6e 64 20 3d 20  .  int regEnd = 
13150 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
13160 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 3c     /* Value of <
13170 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20  expr> FOLLOWING 
13180 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4e 65 77 3b  */.  int regNew;
13190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131a0 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
131b0 20 72 65 67 69 73 74 65 72 73 20 68 6f 6c 64 69   registers holdi
131c0 6e 67 20 6e 65 77 20 69 6e 70 75 74 20 72 6f 77  ng new input row
131d0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63   */.  int regRec
131e0 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ord;            
131f0 20 20 20 20 20 20 2f 2a 20 72 65 67 4e 65 77 20        /* regNew 
13200 61 72 72 61 79 20 69 6e 20 72 65 63 6f 72 64 20  array in record 
13210 66 6f 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 72 65  form */.  int re
13220 67 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20  gRowid;         
13230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77            /* Row
13240 69 64 20 66 6f 72 20 72 65 67 52 65 63 6f 72 64  id for regRecord
13250 20 69 6e 20 65 70 68 20 74 61 62 6c 65 20 2a 2f   in eph table */
13260 0a 20 20 69 6e 74 20 72 65 67 4e 65 77 50 65 65  .  int regNewPee
13270 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
13280 20 20 20 2f 2a 20 50 65 65 72 20 76 61 6c 75 65     /* Peer value
13290 73 20 66 6f 72 20 6e 65 77 20 72 6f 77 20 28 70  s for new row (p
132a0 61 72 74 20 6f 66 20 72 65 67 4e 65 77 29 20 2a  art of regNew) *
132b0 2f 0a 20 20 69 6e 74 20 72 65 67 50 65 65 72 20  /.  int regPeer 
132c0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
132d0 20 20 20 20 2f 2a 20 50 65 65 72 20 76 61 6c 75      /* Peer valu
132e0 65 73 20 66 6f 72 20 63 75 72 72 65 6e 74 20 72  es for current r
132f0 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46  ow */.  int regF
13300 6c 75 73 68 50 61 72 74 20 3d 20 30 3b 20 20 20  lushPart = 0;   
13310 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
13320 74 65 72 20 66 6f 72 20 22 47 6f 73 75 62 20 66  ter for "Gosub f
13330 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 20  lush_partition" 
13340 2a 2f 0a 20 20 57 69 6e 64 6f 77 43 6f 64 65 41  */.  WindowCodeA
13350 72 67 20 73 3b 20 20 20 20 20 20 20 20 20 20 20  rg s;           
13360 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20       /* Context 
13370 6f 62 6a 65 63 74 20 66 6f 72 20 73 75 62 2d 72  object for sub-r
13380 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20 69 6e 74  outines */.  int
13390 20 6c 62 6c 57 68 65 72 65 45 6e 64 3b 20 20 20   lblWhereEnd;   
133a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
133b0 4c 61 62 65 6c 20 6a 75 73 74 20 62 65 66 6f 72  Label just befor
133c0 65 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  e sqlite3WhereEn
133d0 64 28 29 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61  d() code */..  a
133e0 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 53  ssert( pMWin->eS
133f0 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49  tart==TK_PRECEDI
13400 4e 47 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74  NG || pMWin->eSt
13410 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20  art==TK_CURRENT 
13420 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e  .       || pMWin
13430 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c  ->eStart==TK_FOL
13440 4c 4f 57 49 4e 47 20 7c 7c 20 70 4d 57 69 6e 2d  LOWING || pMWin-
13450 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f  >eStart==TK_UNBO
13460 55 4e 44 45 44 20 0a 20 20 29 3b 0a 20 20 61 73  UNDED .  );.  as
13470 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 45 6e  sert( pMWin->eEn
13480 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  d==TK_FOLLOWING 
13490 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  || pMWin->eEnd==
134a0 54 4b 5f 43 55 52 52 45 4e 54 20 0a 20 20 20 20  TK_CURRENT .    
134b0 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e     || pMWin->eEn
134c0 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20  d==TK_UNBOUNDED 
134d0 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  || pMWin->eEnd==
134e0 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 0a 20 20  TK_PRECEDING .  
134f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 57  );.  assert( pMW
13500 69 6e 2d 3e 65 45 78 63 6c 75 64 65 3d 3d 30 20  in->eExclude==0 
13510 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 78 63 6c 75  || pMWin->eExclu
13520 64 65 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 0a 20  de==TK_CURRENT. 
13530 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e        || pMWin->
13540 65 45 78 63 6c 75 64 65 3d 3d 54 4b 5f 47 52 4f  eExclude==TK_GRO
13550 55 50 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 78  UP || pMWin->eEx
13560 63 6c 75 64 65 3d 3d 54 4b 5f 54 49 45 53 0a 20  clude==TK_TIES. 
13570 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e        || pMWin->
13580 65 45 78 63 6c 75 64 65 3d 3d 54 4b 5f 4e 4f 0a  eExclude==TK_NO.
13590 20 20 29 3b 0a 0a 20 20 6c 62 6c 57 68 65 72 65    );..  lblWhere
135a0 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
135b0 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
135c0 65 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69  e);..  /* Fill i
135d0 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 62  n the context ob
135e0 6a 65 63 74 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  ject */.  memset
135f0 28 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57  (&s, 0, sizeof(W
13600 69 6e 64 6f 77 43 6f 64 65 41 72 67 29 29 3b 0a  indowCodeArg));.
13610 20 20 73 2e 70 50 61 72 73 65 20 3d 20 70 50 61    s.pParse = pPa
13620 72 73 65 3b 0a 20 20 73 2e 70 4d 57 69 6e 20 3d  rse;.  s.pMWin =
13630 20 70 4d 57 69 6e 3b 0a 20 20 73 2e 70 56 64 62   pMWin;.  s.pVdb
13640 65 20 3d 20 76 3b 0a 20 20 73 2e 72 65 67 47 6f  e = v;.  s.regGo
13650 73 75 62 20 3d 20 72 65 67 47 6f 73 75 62 3b 0a  sub = regGosub;.
13660 20 20 73 2e 61 64 64 72 47 6f 73 75 62 20 3d 20    s.addrGosub = 
13670 61 64 64 72 47 6f 73 75 62 3b 0a 20 20 73 2e 63  addrGosub;.  s.c
13680 75 72 72 65 6e 74 2e 63 73 72 20 3d 20 70 4d 57  urrent.csr = pMW
13690 69 6e 2d 3e 69 45 70 68 43 73 72 3b 0a 20 20 63  in->iEphCsr;.  c
136a0 73 72 57 72 69 74 65 20 3d 20 73 2e 63 75 72 72  srWrite = s.curr
136b0 65 6e 74 2e 63 73 72 2b 31 3b 0a 20 20 73 2e 73  ent.csr+1;.  s.s
136c0 74 61 72 74 2e 63 73 72 20 3d 20 73 2e 63 75 72  tart.csr = s.cur
136d0 72 65 6e 74 2e 63 73 72 2b 32 3b 0a 20 20 73 2e  rent.csr+2;.  s.
136e0 65 6e 64 2e 63 73 72 20 3d 20 73 2e 63 75 72 72  end.csr = s.curr
136f0 65 6e 74 2e 63 73 72 2b 33 3b 0a 0a 20 20 2f 2a  ent.csr+3;..  /*
13700 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 6e   Figure out when
13710 20 72 6f 77 73 20 6d 61 79 20 62 65 20 64 65 6c   rows may be del
13720 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20 65 70  eted from the ep
13730 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20 54  hemeral table. T
13740 68 65 72 65 0a 20 20 2a 2a 20 61 72 65 20 66 6f  here.  ** are fo
13750 75 72 20 6f 70 74 69 6f 6e 73 20 2d 20 74 68 65  ur options - the
13760 79 20 6d 61 79 20 6e 65 76 65 72 20 62 65 20 64  y may never be d
13770 65 6c 65 74 65 64 20 28 65 44 65 6c 65 74 65 3d  eleted (eDelete=
13780 3d 30 29 2c 20 74 68 65 79 20 6d 61 79 20 0a 20  =0), they may . 
13790 20 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 61   ** be deleted a
137a0 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 79 20 61  s soon as they a
137b0 72 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 70 61 72  re no longer par
137c0 74 20 6f 66 20 74 68 65 20 77 69 6e 64 6f 77 20  t of the window 
137d0 66 72 61 6d 65 0a 20 20 2a 2a 20 28 65 44 65 6c  frame.  ** (eDel
137e0 65 74 65 3d 3d 57 49 4e 44 4f 57 5f 41 47 47 49  ete==WINDOW_AGGI
137f0 4e 56 45 52 53 45 29 2c 20 74 68 65 79 20 6d 61  NVERSE), they ma
13800 79 20 62 65 20 64 65 6c 65 74 65 64 20 61 73 20  y be deleted as 
13810 61 66 74 65 72 20 74 68 65 20 72 6f 77 20 0a 20  after the row . 
13820 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 65 74   ** has been ret
13830 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
13840 6c 65 72 20 28 57 49 4e 44 4f 57 5f 52 45 54 55  ler (WINDOW_RETU
13850 52 4e 5f 52 4f 57 29 2c 20 6f 72 20 74 68 65 79  RN_ROW), or they
13860 20 6d 61 79 0a 20 20 2a 2a 20 62 65 20 64 65 6c   may.  ** be del
13870 65 74 65 64 20 61 66 74 65 72 20 74 68 65 79 20  eted after they 
13880 65 6e 74 65 72 20 74 68 65 20 66 72 61 6d 65 20  enter the frame 
13890 28 57 49 4e 44 4f 57 5f 41 47 47 53 54 45 50 29  (WINDOW_AGGSTEP)
138a0 2e 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70  . */.  switch( p
138b0 4d 57 69 6e 2d 3e 65 53 74 61 72 74 20 29 7b 0a  MWin->eStart ){.
138c0 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4f 4c 4c      case TK_FOLL
138d0 4f 57 49 4e 47 3a 0a 20 20 20 20 20 20 69 66 28  OWING:.      if(
138e0 20 70 4d 57 69 6e 2d 3e 65 54 79 70 65 21 3d 54   pMWin->eType!=T
138f0 4b 5f 52 41 4e 47 45 20 26 26 20 77 69 6e 64 6f  K_RANGE && windo
13900 77 45 78 70 72 47 74 5a 65 72 6f 28 70 50 61 72  wExprGtZero(pPar
13910 73 65 2c 20 70 4d 57 69 6e 2d 3e 70 53 74 61 72  se, pMWin->pStar
13920 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 2e  t) ){.        s.
13930 65 44 65 6c 65 74 65 20 3d 20 57 49 4e 44 4f 57  eDelete = WINDOW
13940 5f 52 45 54 55 52 4e 5f 52 4f 57 3b 0a 20 20 20  _RETURN_ROW;.   
13950 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
13960 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e  ;.    case TK_UN
13970 42 4f 55 4e 44 45 44 3a 0a 20 20 20 20 20 20 69  BOUNDED:.      i
13980 66 28 20 77 69 6e 64 6f 77 43 61 63 68 65 46 72  f( windowCacheFr
13990 61 6d 65 28 70 4d 57 69 6e 29 3d 3d 30 20 29 7b  ame(pMWin)==0 ){
139a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 57  .        if( pMW
139b0 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52 45  in->eEnd==TK_PRE
139c0 43 45 44 49 4e 47 20 29 7b 0a 20 20 20 20 20 20  CEDING ){.      
139d0 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65      if( pMWin->e
139e0 54 79 70 65 21 3d 54 4b 5f 52 41 4e 47 45 20 26  Type!=TK_RANGE &
139f0 26 20 77 69 6e 64 6f 77 45 78 70 72 47 74 5a 65  & windowExprGtZe
13a00 72 6f 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  ro(pParse, pMWin
13a10 2d 3e 70 45 6e 64 29 20 29 7b 0a 20 20 20 20 20  ->pEnd) ){.     
13a20 20 20 20 20 20 20 20 73 2e 65 44 65 6c 65 74 65         s.eDelete
13a30 20 3d 20 57 49 4e 44 4f 57 5f 41 47 47 53 54 45   = WINDOW_AGGSTE
13a40 50 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  P;.          }. 
13a50 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
13a60 20 20 20 20 20 20 20 20 73 2e 65 44 65 6c 65 74          s.eDelet
13a70 65 20 3d 20 57 49 4e 44 4f 57 5f 52 45 54 55 52  e = WINDOW_RETUR
13a80 4e 5f 52 4f 57 3b 0a 20 20 20 20 20 20 20 20 7d  N_ROW;.        }
13a90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
13aa0 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
13ab0 74 3a 0a 20 20 20 20 20 20 73 2e 65 44 65 6c 65  t:.      s.eDele
13ac0 74 65 20 3d 20 57 49 4e 44 4f 57 5f 41 47 47 49  te = WINDOW_AGGI
13ad0 4e 56 45 52 53 45 3b 0a 20 20 20 20 20 20 62 72  NVERSE;.      br
13ae0 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  eak;.  }..  /* A
13af0 6c 6c 6f 63 61 74 65 20 72 65 67 69 73 74 65 72  llocate register
13b00 73 20 66 6f 72 20 74 68 65 20 61 72 72 61 79 20  s for the array 
13b10 6f 66 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 74  of values from t
13b20 68 65 20 73 75 62 2d 71 75 65 72 79 2c 20 74 68  he sub-query, th
13b30 65 0a 20 20 2a 2a 20 73 61 6d 76 65 20 76 61 6c  e.  ** samve val
13b40 75 65 73 20 69 6e 20 72 65 63 6f 72 64 20 66 6f  ues in record fo
13b50 72 6d 2c 20 61 6e 64 20 74 68 65 20 72 6f 77 69  rm, and the rowi
13b60 64 20 75 73 65 64 20 74 6f 20 69 6e 73 65 72 74  d used to insert
13b70 20 73 61 69 64 20 72 65 63 6f 72 64 0a 20 20 2a   said record.  *
13b80 2a 20 69 6e 74 6f 20 74 68 65 20 65 70 68 65 6d  * into the ephem
13b90 65 72 61 6c 20 74 61 62 6c 65 2e 20 20 2a 2f 0a  eral table.  */.
13ba0 20 20 72 65 67 4e 65 77 20 3d 20 70 50 61 72 73    regNew = pPars
13bb0 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 70 50 61  e->nMem+1;.  pPa
13bc0 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 49 6e  rse->nMem += nIn
13bd0 70 75 74 3b 0a 20 20 72 65 67 52 65 63 6f 72 64  put;.  regRecord
13be0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
13bf0 6d 3b 0a 20 20 72 65 67 52 6f 77 69 64 20 3d 20  m;.  regRowid = 
13c00 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
13c10 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 77 69 6e  .  /* If the win
13c20 64 6f 77 20 66 72 61 6d 65 20 63 6f 6e 74 61 69  dow frame contai
13c30 6e 73 20 61 6e 20 22 3c 65 78 70 72 3e 20 50 52  ns an "<expr> PR
13c40 45 43 45 44 49 4e 47 22 20 6f 72 20 22 3c 65 78  ECEDING" or "<ex
13c50 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 22 0a 20  pr> FOLLOWING". 
13c60 20 2a 2a 20 63 6c 61 75 73 65 2c 20 61 6c 6c 6f   ** clause, allo
13c70 63 61 74 65 20 72 65 67 69 73 74 65 72 73 20 74  cate registers t
13c80 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  o store the resu
13c90 6c 74 73 20 6f 66 20 65 76 61 6c 75 61 74 69 6e  lts of evaluatin
13ca0 67 20 65 61 63 68 0a 20 20 2a 2a 20 3c 65 78 70  g each.  ** <exp
13cb0 72 3e 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 4d  r>.  */.  if( pM
13cc0 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
13cd0 50 52 45 43 45 44 49 4e 47 20 7c 7c 20 70 4d 57  PRECEDING || pMW
13ce0 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46  in->eStart==TK_F
13cf0 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20  OLLOWING ){.    
13d00 72 65 67 53 74 61 72 74 20 3d 20 2b 2b 70 50 61  regStart = ++pPa
13d10 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20  rse->nMem;.  }. 
13d20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64   if( pMWin->eEnd
13d30 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 7c  ==TK_PRECEDING |
13d40 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54  | pMWin->eEnd==T
13d50 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20  K_FOLLOWING ){. 
13d60 20 20 20 72 65 67 45 6e 64 20 3d 20 2b 2b 70 50     regEnd = ++pP
13d70 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a  arse->nMem;.  }.
13d80 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
13d90 20 6e 6f 74 20 61 20 22 52 4f 57 53 20 42 45 54   not a "ROWS BET
13da0 57 45 45 4e 20 2e 2e 2e 22 20 66 72 61 6d 65 2c  WEEN ..." frame,
13db0 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61   then allocate a
13dc0 72 72 61 79 73 20 6f 66 0a 20 20 2a 2a 20 72 65  rrays of.  ** re
13dd0 67 69 73 74 65 72 73 20 74 6f 20 73 74 6f 72 65  gisters to store
13de0 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 4f   copies of the O
13df0 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69  RDER BY expressi
13e00 6f 6e 73 20 28 70 65 65 72 20 76 61 6c 75 65 73  ons (peer values
13e10 29 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  ) .  ** for the 
13e20 6d 61 69 6e 20 6c 6f 6f 70 2c 20 61 6e 64 20 66  main loop, and f
13e30 6f 72 20 65 61 63 68 20 63 75 72 73 6f 72 20 28  or each cursor (
13e40 73 74 61 72 74 2c 20 63 75 72 72 65 6e 74 20 61  start, current a
13e50 6e 64 20 65 6e 64 29 2e 20 2a 2f 0a 20 20 69 66  nd end). */.  if
13e60 28 20 70 4d 57 69 6e 2d 3e 65 54 79 70 65 21 3d  ( pMWin->eType!=
13e70 54 4b 5f 52 4f 57 53 20 29 7b 0a 20 20 20 20 69  TK_ROWS ){.    i
13e80 6e 74 20 6e 50 65 65 72 20 3d 20 28 70 4f 72 64  nt nPeer = (pOrd
13e90 65 72 42 79 20 3f 20 70 4f 72 64 65 72 42 79 2d  erBy ? pOrderBy-
13ea0 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20  >nExpr : 0);.   
13eb0 20 72 65 67 4e 65 77 50 65 65 72 20 3d 20 72 65   regNewPeer = re
13ec0 67 4e 65 77 20 2b 20 70 4d 57 69 6e 2d 3e 6e 42  gNew + pMWin->nB
13ed0 75 66 66 65 72 43 6f 6c 3b 0a 20 20 20 20 69 66  ufferCol;.    if
13ee0 28 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74  ( pMWin->pPartit
13ef0 69 6f 6e 20 29 20 72 65 67 4e 65 77 50 65 65 72  ion ) regNewPeer
13f00 20 2b 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74   += pMWin->pPart
13f10 69 74 69 6f 6e 2d 3e 6e 45 78 70 72 3b 0a 20 20  ition->nExpr;.  
13f20 20 20 72 65 67 50 65 65 72 20 3d 20 70 50 61 72    regPeer = pPar
13f30 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 20 20 20 20 20  se->nMem+1;     
13f40 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
13f50 3d 20 6e 50 65 65 72 3b 0a 20 20 20 20 73 2e 73  = nPeer;.    s.s
13f60 74 61 72 74 2e 72 65 67 20 3d 20 70 50 61 72 73  tart.reg = pPars
13f70 65 2d 3e 6e 4d 65 6d 2b 31 3b 20 20 20 70 50 61  e->nMem+1;   pPa
13f80 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 65  rse->nMem += nPe
13f90 65 72 3b 0a 20 20 20 20 73 2e 63 75 72 72 65 6e  er;.    s.curren
13fa0 74 2e 72 65 67 20 3d 20 70 50 61 72 73 65 2d 3e  t.reg = pParse->
13fb0 6e 4d 65 6d 2b 31 3b 20 70 50 61 72 73 65 2d 3e  nMem+1; pParse->
13fc0 6e 4d 65 6d 20 2b 3d 20 6e 50 65 65 72 3b 0a 20  nMem += nPeer;. 
13fd0 20 20 20 73 2e 65 6e 64 2e 72 65 67 20 3d 20 70     s.end.reg = p
13fe0 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 20 20  Parse->nMem+1;  
13ff0 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
14000 2b 3d 20 6e 50 65 65 72 3b 0a 20 20 7d 0a 0a 20  += nPeer;.  }.. 
14010 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 63 6f 6c   /* Load the col
14020 75 6d 6e 20 76 61 6c 75 65 73 20 66 6f 72 20 74  umn values for t
14030 68 65 20 72 6f 77 20 72 65 74 75 72 6e 65 64 20  he row returned 
14040 62 79 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63  by the sub-selec
14050 74 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 61  t.  ** into an a
14060 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
14070 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 72 65  s starting at re
14080 67 4e 65 77 2e 20 41 73 73 65 6d 62 6c 65 20 74  gNew. Assemble t
14090 68 65 6d 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 20  hem into.  ** a 
140a0 72 65 63 6f 72 64 20 69 6e 20 72 65 67 69 73 74  record in regist
140b0 65 72 20 72 65 67 52 65 63 6f 72 64 2e 20 2a 2f  er regRecord. */
140c0 0a 20 20 66 6f 72 28 69 49 6e 70 75 74 3d 30 3b  .  for(iInput=0;
140d0 20 69 49 6e 70 75 74 3c 6e 49 6e 70 75 74 3b 20   iInput<nInput; 
140e0 69 49 6e 70 75 74 2b 2b 29 7b 0a 20 20 20 20 73  iInput++){.    s
140f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
14100 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63  (v, OP_Column, c
14110 73 72 49 6e 70 75 74 2c 20 69 49 6e 70 75 74 2c  srInput, iInput,
14120 20 72 65 67 4e 65 77 2b 69 49 6e 70 75 74 29 3b   regNew+iInput);
14130 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
14140 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
14150 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 4e 65  akeRecord, regNe
14160 77 2c 20 6e 49 6e 70 75 74 2c 20 72 65 67 52 65  w, nInput, regRe
14170 63 6f 72 64 29 3b 0a 0a 20 20 2f 2a 20 41 6e 20  cord);..  /* An 
14180 69 6e 70 75 74 20 72 6f 77 20 68 61 73 20 6a 75  input row has ju
14190 73 74 20 62 65 65 6e 20 72 65 61 64 20 69 6e 74  st been read int
141a0 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65  o an array of re
141b0 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
141c0 0a 20 20 2a 2a 20 61 74 20 72 65 67 4e 65 77 2e  .  ** at regNew.
141d0 20 49 66 20 74 68 65 20 77 69 6e 64 6f 77 20 68   If the window h
141e0 61 73 20 61 20 50 41 52 54 49 54 49 4f 4e 20 63  as a PARTITION c
141f0 6c 61 75 73 65 2c 20 74 68 69 73 20 62 6c 6f 63  lause, this bloc
14200 6b 20 67 65 6e 65 72 61 74 65 73 20 0a 20 20 2a  k generates .  *
14210 2a 20 56 4d 20 63 6f 64 65 20 74 6f 20 63 68 65  * VM code to che
14220 63 6b 20 69 66 20 74 68 65 20 69 6e 70 75 74 20  ck if the input 
14230 72 6f 77 20 69 73 20 74 68 65 20 73 74 61 72 74  row is the start
14240 20 6f 66 20 61 20 6e 65 77 20 70 61 72 74 69 74   of a new partit
14250 69 6f 6e 2e 0a 20 20 2a 2a 20 49 66 20 73 6f 2c  ion..  ** If so,
14260 20 69 74 20 64 6f 65 73 20 61 6e 20 4f 50 5f 47   it does an OP_G
14270 6f 73 75 62 20 74 6f 20 61 6e 20 61 64 64 72 65  osub to an addre
14280 73 73 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20  ss to be filled 
14290 69 6e 20 6c 61 74 65 72 2e 20 54 68 65 0a 20 20  in later. The.  
142a0 2a 2a 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  ** address of th
142b0 65 20 4f 50 5f 47 6f 73 75 62 20 69 73 20 73 74  e OP_Gosub is st
142c0 6f 72 65 64 20 69 6e 20 6c 6f 63 61 6c 20 76 61  ored in local va
142d0 72 69 61 62 6c 65 20 61 64 64 72 47 6f 73 75 62  riable addrGosub
142e0 46 6c 75 73 68 2e 20 2a 2f 0a 20 20 69 66 28 20  Flush. */.  if( 
142f0 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f  pMWin->pPartitio
14300 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  n ){.    int add
14310 72 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  r;.    ExprList 
14320 2a 70 50 61 72 74 20 3d 20 70 4d 57 69 6e 2d 3e  *pPart = pMWin->
14330 70 50 61 72 74 69 74 69 6f 6e 3b 0a 20 20 20 20  pPartition;.    
14340 69 6e 74 20 6e 50 61 72 74 20 3d 20 70 50 61 72  int nPart = pPar
14350 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69 6e  t->nExpr;.    in
14360 74 20 72 65 67 4e 65 77 50 61 72 74 20 3d 20 72  t regNewPart = r
14370 65 67 4e 65 77 20 2b 20 70 4d 57 69 6e 2d 3e 6e  egNew + pMWin->n
14380 42 75 66 66 65 72 43 6f 6c 3b 0a 20 20 20 20 4b  BufferCol;.    K
14390 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
143a0 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
143b0 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
143c0 61 72 73 65 2c 20 70 50 61 72 74 2c 20 30 2c 20  arse, pPart, 0, 
143d0 30 29 3b 0a 0a 20 20 20 20 72 65 67 46 6c 75 73  0);..    regFlus
143e0 68 50 61 72 74 20 3d 20 2b 2b 70 50 61 72 73 65  hPart = ++pParse
143f0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 61 64 64 72  ->nMem;.    addr
14400 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
14410 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp3(v, OP_Compa
14420 72 65 2c 20 72 65 67 4e 65 77 50 61 72 74 2c 20  re, regNewPart, 
14430 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c 20  pMWin->regPart, 
14440 6e 50 61 72 74 29 3b 0a 20 20 20 20 73 71 6c 69  nPart);.    sqli
14450 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
14460 76 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e  v, (void*)pKeyIn
14470 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
14480 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14490 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
144a0 70 2c 20 61 64 64 72 2b 32 2c 20 61 64 64 72 2b  p, addr+2, addr+
144b0 34 2c 20 61 64 64 72 2b 32 29 3b 0a 20 20 20 20  4, addr+2);.    
144c0 56 64 62 65 43 6f 76 65 72 61 67 65 45 71 4e 65  VdbeCoverageEqNe
144d0 28 76 29 3b 0a 20 20 20 20 61 64 64 72 47 6f 73  (v);.    addrGos
144e0 75 62 46 6c 75 73 68 20 3d 20 73 71 6c 69 74 65  ubFlush = sqlite
144f0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
14500 50 5f 47 6f 73 75 62 2c 20 72 65 67 46 6c 75 73  P_Gosub, regFlus
14510 68 50 61 72 74 29 3b 0a 20 20 20 20 56 64 62 65  hPart);.    Vdbe
14520 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 61 6c  Comment((v, "cal
14530 6c 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f  l flush_partitio
14540 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  n"));.    sqlite
14550 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
14560 50 5f 43 6f 70 79 2c 20 72 65 67 4e 65 77 50 61  P_Copy, regNewPa
14570 72 74 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61  rt, pMWin->regPa
14580 72 74 2c 20 6e 50 61 72 74 2d 31 29 3b 0a 20 20  rt, nPart-1);.  
14590 7d 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74  }..  /* Insert t
145a0 68 65 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20  he new row into 
145b0 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61  the ephemeral ta
145c0 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ble */.  sqlite3
145d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
145e0 5f 4e 65 77 52 6f 77 69 64 2c 20 63 73 72 57 72  _NewRowid, csrWr
145f0 69 74 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  ite, regRowid);.
14600 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14610 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
14620 2c 20 63 73 72 57 72 69 74 65 2c 20 72 65 67 52  , csrWrite, regR
14630 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 69 64 29  ecord, regRowid)
14640 3b 0a 20 20 61 64 64 72 4e 65 20 3d 20 73 71 6c  ;.  addrNe = sql
14650 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
14660 2c 20 4f 50 5f 4e 65 2c 20 70 4d 57 69 6e 2d 3e  , OP_Ne, pMWin->
14670 72 65 67 4f 6e 65 2c 20 30 2c 20 72 65 67 52 6f  regOne, 0, regRo
14680 77 69 64 29 3b 0a 20 20 56 64 62 65 43 6f 76 65  wid);.  VdbeCove
14690 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 54  rage(v);..  /* T
146a0 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 72 75 6e  his block is run
146b0 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72   for the first r
146c0 6f 77 20 6f 66 20 65 61 63 68 20 70 61 72 74 69  ow of each parti
146d0 74 69 6f 6e 20 2a 2f 0a 20 20 73 2e 72 65 67 41  tion */.  s.regA
146e0 72 67 20 3d 20 77 69 6e 64 6f 77 49 6e 69 74 41  rg = windowInitA
146f0 63 63 75 6d 28 70 50 61 72 73 65 2c 20 70 4d 57  ccum(pParse, pMW
14700 69 6e 29 3b 0a 0a 20 20 69 66 28 20 72 65 67 53  in);..  if( regS
14710 74 61 72 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  tart ){.    sqli
14720 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
14730 73 65 2c 20 70 4d 57 69 6e 2d 3e 70 53 74 61 72  se, pMWin->pStar
14740 74 2c 20 72 65 67 53 74 61 72 74 29 3b 0a 20 20  t, regStart);.  
14750 20 20 77 69 6e 64 6f 77 43 68 65 63 6b 56 61 6c    windowCheckVal
14760 75 65 28 70 50 61 72 73 65 2c 20 72 65 67 53 74  ue(pParse, regSt
14770 61 72 74 2c 20 30 20 2b 20 28 70 4d 57 69 6e 2d  art, 0 + (pMWin-
14780 3e 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45  >eType==TK_RANGE
14790 20 3f 20 33 20 3a 20 30 29 29 3b 0a 20 20 7d 0a   ? 3 : 0));.  }.
147a0 20 20 69 66 28 20 72 65 67 45 6e 64 20 29 7b 0a    if( regEnd ){.
147b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
147c0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4d 57 69  ode(pParse, pMWi
147d0 6e 2d 3e 70 45 6e 64 2c 20 72 65 67 45 6e 64 29  n->pEnd, regEnd)
147e0 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43 68 65 63  ;.    windowChec
147f0 6b 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 72  kValue(pParse, r
14800 65 67 45 6e 64 2c 20 31 20 2b 20 28 70 4d 57 69  egEnd, 1 + (pMWi
14810 6e 2d 3e 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e  n->eType==TK_RAN
14820 47 45 20 3f 20 33 20 3a 20 30 29 29 3b 0a 20 20  GE ? 3 : 0));.  
14830 7d 0a 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  }..  if( pMWin->
14840 65 53 74 61 72 74 3d 3d 70 4d 57 69 6e 2d 3e 65  eStart==pMWin->e
14850 45 6e 64 20 26 26 20 72 65 67 53 74 61 72 74 20  End && regStart 
14860 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  ){.    int op = 
14870 28 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d  ((pMWin->eStart=
14880 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 29 20 3f  =TK_FOLLOWING) ?
14890 20 4f 50 5f 47 65 20 3a 20 4f 50 5f 4c 65 29 3b   OP_Ge : OP_Le);
148a0 0a 20 20 20 20 69 6e 74 20 61 64 64 72 47 65 20  .    int addrGe 
148b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
148c0 4f 70 33 28 76 2c 20 6f 70 2c 20 72 65 67 53 74  Op3(v, op, regSt
148d0 61 72 74 2c 20 30 2c 20 72 65 67 45 6e 64 29 3b  art, 0, regEnd);
148e0 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
148f0 65 28 76 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77  e(v);.    window
14900 41 67 67 46 69 6e 61 6c 28 26 73 2c 20 30 29 3b  AggFinal(&s, 0);
14910 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14920 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
14930 69 6e 64 2c 20 73 2e 63 75 72 72 65 6e 74 2e 63  ind, s.current.c
14940 73 72 2c 20 31 29 3b 0a 20 20 20 20 56 64 62 65  sr, 1);.    Vdbe
14950 43 6f 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b  CoverageNeverTak
14960 65 6e 28 76 29 3b 0a 20 20 20 20 77 69 6e 64 6f  en(v);.    windo
14970 77 52 65 74 75 72 6e 4f 6e 65 52 6f 77 28 26 73  wReturnOneRow(&s
14980 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
14990 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
149a0 65 73 65 74 53 6f 72 74 65 72 2c 20 73 2e 63 75  esetSorter, s.cu
149b0 72 72 65 6e 74 2e 63 73 72 29 3b 0a 20 20 20 20  rrent.csr);.    
149c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
149d0 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
149e0 20 6c 62 6c 57 68 65 72 65 45 6e 64 29 3b 0a 20   lblWhereEnd);. 
149f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
14a00 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 47 65  mpHere(v, addrGe
14a10 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d 57  );.  }.  if( pMW
14a20 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46  in->eStart==TK_F
14a30 4f 4c 4c 4f 57 49 4e 47 20 26 26 20 70 4d 57 69  OLLOWING && pMWi
14a40 6e 2d 3e 65 54 79 70 65 21 3d 54 4b 5f 52 41 4e  n->eType!=TK_RAN
14a50 47 45 20 26 26 20 72 65 67 45 6e 64 20 29 7b 0a  GE && regEnd ){.
14a60 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 57 69      assert( pMWi
14a70 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c  n->eEnd==TK_FOLL
14a80 4f 57 49 4e 47 20 29 3b 0a 20 20 20 20 73 71 6c  OWING );.    sql
14a90 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
14aa0 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72  , OP_Subtract, r
14ab0 65 67 53 74 61 72 74 2c 20 72 65 67 45 6e 64 2c  egStart, regEnd,
14ac0 20 72 65 67 53 74 61 72 74 29 3b 0a 20 20 7d 0a   regStart);.  }.
14ad0 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53  .  if( pMWin->eS
14ae0 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44  tart!=TK_UNBOUND
14af0 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ED ){.    sqlite
14b00 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14b10 50 5f 52 65 77 69 6e 64 2c 20 73 2e 73 74 61 72  P_Rewind, s.star
14b20 74 2e 63 73 72 2c 20 31 29 3b 0a 20 20 20 20 56  t.csr, 1);.    V
14b30 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72  dbeCoverageNever
14b40 54 61 6b 65 6e 28 76 29 3b 0a 20 20 7d 0a 20 20  Taken(v);.  }.  
14b50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14b60 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
14b70 73 2e 63 75 72 72 65 6e 74 2e 63 73 72 2c 20 31  s.current.csr, 1
14b80 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67  );.  VdbeCoverag
14b90 65 4e 65 76 65 72 54 61 6b 65 6e 28 76 29 3b 0a  eNeverTaken(v);.
14ba0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14bb0 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
14bc0 2c 20 73 2e 65 6e 64 2e 63 73 72 2c 20 31 29 3b  , s.end.csr, 1);
14bd0 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e  .  VdbeCoverageN
14be0 65 76 65 72 54 61 6b 65 6e 28 76 29 3b 0a 20 20  everTaken(v);.  
14bf0 69 66 28 20 72 65 67 50 65 65 72 20 26 26 20 70  if( regPeer && p
14c00 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73  OrderBy ){.    s
14c10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
14c20 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67  (v, OP_Copy, reg
14c30 4e 65 77 50 65 65 72 2c 20 72 65 67 50 65 65 72  NewPeer, regPeer
14c40 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
14c50 72 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  r-1);.    sqlite
14c60 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
14c70 50 5f 43 6f 70 79 2c 20 72 65 67 50 65 65 72 2c  P_Copy, regPeer,
14c80 20 73 2e 73 74 61 72 74 2e 72 65 67 2c 20 70 4f   s.start.reg, pO
14c90 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31 29  rderBy->nExpr-1)
14ca0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
14cb0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
14cc0 70 79 2c 20 72 65 67 50 65 65 72 2c 20 73 2e 63  py, regPeer, s.c
14cd0 75 72 72 65 6e 74 2e 72 65 67 2c 20 70 4f 72 64  urrent.reg, pOrd
14ce0 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a  erBy->nExpr-1);.
14cf0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14d00 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp3(v, OP_Copy
14d10 2c 20 72 65 67 50 65 65 72 2c 20 73 2e 65 6e 64  , regPeer, s.end
14d20 2e 72 65 67 2c 20 70 4f 72 64 65 72 42 79 2d 3e  .reg, pOrderBy->
14d30 6e 45 78 70 72 2d 31 29 3b 0a 20 20 7d 0a 0a 20  nExpr-1);.  }.. 
14d40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14d50 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
14d60 2c 20 6c 62 6c 57 68 65 72 65 45 6e 64 29 3b 0a  , lblWhereEnd);.
14d70 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
14d80 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4e 65  mpHere(v, addrNe
14d90 29 3b 0a 20 20 69 66 28 20 72 65 67 50 65 65 72  );.  if( regPeer
14da0 20 29 7b 0a 20 20 20 20 77 69 6e 64 6f 77 49 66   ){.    windowIf
14db0 4e 65 77 50 65 65 72 28 70 50 61 72 73 65 2c 20  NewPeer(pParse, 
14dc0 70 4f 72 64 65 72 42 79 2c 20 72 65 67 4e 65 77  pOrderBy, regNew
14dd0 50 65 65 72 2c 20 72 65 67 50 65 65 72 2c 20 6c  Peer, regPeer, l
14de0 62 6c 57 68 65 72 65 45 6e 64 29 3b 0a 20 20 7d  blWhereEnd);.  }
14df0 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53  .  if( pMWin->eS
14e00 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49  tart==TK_FOLLOWI
14e10 4e 47 20 29 7b 0a 20 20 20 20 77 69 6e 64 6f 77  NG ){.    window
14e20 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f  CodeOp(&s, WINDO
14e30 57 5f 41 47 47 53 54 45 50 2c 20 30 2c 20 30 29  W_AGGSTEP, 0, 0)
14e40 3b 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d  ;.    if( pMWin-
14e50 3e 65 45 6e 64 21 3d 54 4b 5f 55 4e 42 4f 55 4e  >eEnd!=TK_UNBOUN
14e60 44 45 44 20 29 7b 0a 20 20 20 20 20 20 69 66 28  DED ){.      if(
14e70 20 70 4d 57 69 6e 2d 3e 65 54 79 70 65 3d 3d 54   pMWin->eType==T
14e80 4b 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20  K_RANGE ){.     
14e90 20 20 20 69 6e 74 20 6c 62 6c 20 3d 20 73 71 6c     int lbl = sql
14ea0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
14eb0 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
14ec0 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 20     int addrNext 
14ed0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
14ee0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
14ef0 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 52       windowCodeR
14f00 61 6e 67 65 54 65 73 74 28 26 73 2c 20 4f 50 5f  angeTest(&s, OP_
14f10 47 65 2c 20 73 2e 63 75 72 72 65 6e 74 2e 63 73  Ge, s.current.cs
14f20 72 2c 20 72 65 67 45 6e 64 2c 20 73 2e 65 6e 64  r, regEnd, s.end
14f30 2e 63 73 72 2c 20 6c 62 6c 29 3b 0a 20 20 20 20  .csr, lbl);.    
14f40 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70      windowCodeOp
14f50 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49  (&s, WINDOW_AGGI
14f60 4e 56 45 52 53 45 2c 20 72 65 67 53 74 61 72 74  NVERSE, regStart
14f70 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 77 69  , 0);.        wi
14f80 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57  ndowCodeOp(&s, W
14f90 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57  INDOW_RETURN_ROW
14fa0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
14fb0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14fc0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
14fd0 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20  , addrNext);.   
14fe0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14ff0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
15000 6c 62 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  lbl);.      }els
15010 65 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f  e{.        windo
15020 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44  wCodeOp(&s, WIND
15030 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 72  OW_RETURN_ROW, r
15040 65 67 45 6e 64 2c 20 30 29 3b 0a 20 20 20 20 20  egEnd, 0);.     
15050 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28     windowCodeOp(
15060 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e  &s, WINDOW_AGGIN
15070 56 45 52 53 45 2c 20 72 65 67 53 74 61 72 74 2c  VERSE, regStart,
15080 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
15090 20 7d 0a 20 20 7d 65 6c 73 65 0a 20 20 69 66 28   }.  }else.  if(
150a0 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b   pMWin->eEnd==TK
150b0 5f 50 52 45 43 45 44 49 4e 47 20 29 7b 0a 20 20  _PRECEDING ){.  
150c0 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26    windowCodeOp(&
150d0 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 53 54 45  s, WINDOW_AGGSTE
150e0 50 2c 20 72 65 67 45 6e 64 2c 20 30 29 3b 0a 20  P, regEnd, 0);. 
150f0 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28     windowCodeOp(
15100 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55 52  &s, WINDOW_RETUR
15110 4e 5f 52 4f 57 2c 20 30 2c 20 30 29 3b 0a 20 20  N_ROW, 0, 0);.  
15120 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26    windowCodeOp(&
15130 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56  s, WINDOW_AGGINV
15140 45 52 53 45 2c 20 72 65 67 53 74 61 72 74 2c 20  ERSE, regStart, 
15150 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
15160 20 69 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20   int addr = 0;. 
15170 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28     windowCodeOp(
15180 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 53 54  &s, WINDOW_AGGST
15190 45 50 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  EP, 0, 0);.    i
151a0 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 21 3d  f( pMWin->eEnd!=
151b0 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a  TK_UNBOUNDED ){.
151c0 20 20 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d        if( pMWin-
151d0 3e 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45  >eType==TK_RANGE
151e0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
151f0 6c 62 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  lbl = 0;.       
15200 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
15210 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
15220 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
15230 65 67 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20  egEnd ){.       
15240 20 20 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33     lbl = sqlite3
15250 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
15260 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20  arse);.         
15270 20 77 69 6e 64 6f 77 43 6f 64 65 52 61 6e 67 65   windowCodeRange
15280 54 65 73 74 28 26 73 2c 20 4f 50 5f 47 65 2c 20  Test(&s, OP_Ge, 
15290 73 2e 63 75 72 72 65 6e 74 2e 63 73 72 2c 20 72  s.current.csr, r
152a0 65 67 45 6e 64 2c 20 73 2e 65 6e 64 2e 63 73 72  egEnd, s.end.csr
152b0 2c 20 6c 62 6c 29 3b 0a 20 20 20 20 20 20 20 20  , lbl);.        
152c0 7d 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77  }.        window
152d0 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f  CodeOp(&s, WINDO
152e0 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 30 2c  W_RETURN_ROW, 0,
152f0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e   0);.        win
15300 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49  dowCodeOp(&s, WI
15310 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 2c  NDOW_AGGINVERSE,
15320 20 72 65 67 53 74 61 72 74 2c 20 30 29 3b 0a 20   regStart, 0);. 
15330 20 20 20 20 20 20 20 69 66 28 20 72 65 67 45 6e         if( regEn
15340 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  d ){.          s
15350 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15360 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
15370 61 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20  addr);.         
15380 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
15390 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29  lveLabel(v, lbl)
153a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
153b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
153c0 20 69 66 28 20 72 65 67 45 6e 64 20 29 7b 0a 20   if( regEnd ){. 
153d0 20 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20           addr = 
153e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
153f0 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 72  3(v, OP_IfPos, r
15400 65 67 45 6e 64 2c 20 30 2c 20 31 29 3b 0a 20 20  egEnd, 0, 1);.  
15410 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
15420 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
15430 20 7d 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f   }.        windo
15440 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44  wCodeOp(&s, WIND
15450 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 30  OW_RETURN_ROW, 0
15460 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 77 69  , 0);.        wi
15470 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57  ndowCodeOp(&s, W
15480 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45  INDOW_AGGINVERSE
15490 2c 20 72 65 67 53 74 61 72 74 2c 20 30 29 3b 0a  , regStart, 0);.
154a0 20 20 20 20 20 20 20 20 69 66 28 20 72 65 67 45          if( regE
154b0 6e 64 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  nd ) sqlite3Vdbe
154c0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
154d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
154e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 6e 64 20 6f  .  }..  /* End o
154f0 66 20 74 68 65 20 6d 61 69 6e 20 69 6e 70 75 74  f the main input
15500 20 6c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c 69 74   loop */.  sqlit
15510 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
15520 65 6c 28 76 2c 20 6c 62 6c 57 68 65 72 65 45 6e  el(v, lblWhereEn
15530 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 68 65  d);.  sqlite3Whe
15540 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a  reEnd(pWInfo);..
15550 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67    /* Fall throug
15560 68 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e  h */.  if( pMWin
15570 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 29 7b 0a  ->pPartition ){.
15580 20 20 20 20 61 64 64 72 49 6e 74 65 67 65 72 20      addrInteger 
15590 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
155a0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
155b0 72 2c 20 30 2c 20 72 65 67 46 6c 75 73 68 50 61  r, 0, regFlushPa
155c0 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rt);.    sqlite3
155d0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
155e0 61 64 64 72 47 6f 73 75 62 46 6c 75 73 68 29 3b  addrGosubFlush);
155f0 0a 20 20 7d 0a 0a 20 20 61 64 64 72 45 6d 70 74  .  }..  addrEmpt
15600 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  y = sqlite3VdbeA
15610 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp1(v, OP_Rewi
15620 6e 64 2c 20 63 73 72 57 72 69 74 65 29 3b 0a 20  nd, csrWrite);. 
15630 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
15640 3b 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65  ;.  if( pMWin->e
15650 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e  End==TK_PRECEDIN
15660 47 20 29 7b 0a 20 20 20 20 77 69 6e 64 6f 77 43  G ){.    windowC
15670 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57  odeOp(&s, WINDOW
15680 5f 41 47 47 53 54 45 50 2c 20 72 65 67 45 6e 64  _AGGSTEP, regEnd
15690 2c 20 30 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77  , 0);.    window
156a0 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f  CodeOp(&s, WINDO
156b0 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 30 2c  W_RETURN_ROW, 0,
156c0 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   0);.  }else if(
156d0 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d   pMWin->eStart==
156e0 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a  TK_FOLLOWING ){.
156f0 20 20 20 20 69 6e 74 20 61 64 64 72 53 74 61 72      int addrStar
15700 74 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 42  t;.    int addrB
15710 72 65 61 6b 31 3b 0a 20 20 20 20 69 6e 74 20 61  reak1;.    int a
15720 64 64 72 42 72 65 61 6b 32 3b 0a 20 20 20 20 69  ddrBreak2;.    i
15730 6e 74 20 61 64 64 72 42 72 65 61 6b 33 3b 0a 20  nt addrBreak3;. 
15740 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28     windowCodeOp(
15750 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 53 54  &s, WINDOW_AGGST
15760 45 50 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  EP, 0, 0);.    i
15770 66 28 20 70 4d 57 69 6e 2d 3e 65 54 79 70 65 3d  f( pMWin->eType=
15780 3d 54 4b 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20  =TK_RANGE ){.   
15790 20 20 20 61 64 64 72 53 74 61 72 74 20 3d 20 73     addrStart = s
157a0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
157b0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
157c0 61 64 64 72 42 72 65 61 6b 32 20 3d 20 77 69 6e  addrBreak2 = win
157d0 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49  dowCodeOp(&s, WI
157e0 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 2c  NDOW_AGGINVERSE,
157f0 20 72 65 67 53 74 61 72 74 2c 20 31 29 3b 0a 20   regStart, 1);. 
15800 20 20 20 20 20 61 64 64 72 42 72 65 61 6b 31 20       addrBreak1 
15810 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26  = windowCodeOp(&
15820 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e  s, WINDOW_RETURN
15830 5f 52 4f 57 2c 20 30 2c 20 31 29 3b 0a 20 20 20  _ROW, 0, 1);.   
15840 20 7d 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70   }else.    if( p
15850 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55  MWin->eEnd==TK_U
15860 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20 20  NBOUNDED ){.    
15870 20 20 61 64 64 72 53 74 61 72 74 20 3d 20 73 71    addrStart = sq
15880 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
15890 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 61  Addr(v);.      a
158a0 64 64 72 42 72 65 61 6b 31 20 3d 20 77 69 6e 64  ddrBreak1 = wind
158b0 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e  owCodeOp(&s, WIN
158c0 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20  DOW_RETURN_ROW, 
158d0 72 65 67 53 74 61 72 74 2c 20 31 29 3b 0a 20 20  regStart, 1);.  
158e0 20 20 20 20 61 64 64 72 42 72 65 61 6b 32 20 3d      addrBreak2 =
158f0 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73   windowCodeOp(&s
15900 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45  , WINDOW_AGGINVE
15910 52 53 45 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20  RSE, 0, 1);.    
15920 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
15930 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64  ert( pMWin->eEnd
15940 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29  ==TK_FOLLOWING )
15950 3b 0a 20 20 20 20 20 20 61 64 64 72 53 74 61 72  ;.      addrStar
15960 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
15970 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
15980 20 20 20 20 20 61 64 64 72 42 72 65 61 6b 31 20       addrBreak1 
15990 3d 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 52 45 54 55 52 4e  s, WINDOW_RETURN
159b0 5f 52 4f 57 2c 20 72 65 67 45 6e 64 2c 20 31 29  _ROW, regEnd, 1)
159c0 3b 0a 20 20 20 20 20 20 61 64 64 72 42 72 65 61  ;.      addrBrea
159d0 6b 32 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f  k2 = windowCodeO
159e0 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47  p(&s, WINDOW_AGG
159f0 49 4e 56 45 52 53 45 2c 20 72 65 67 53 74 61 72  INVERSE, regStar
15a00 74 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  t, 1);.    }.   
15a10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15a20 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
15a30 2c 20 61 64 64 72 53 74 61 72 74 29 3b 0a 20 20  , addrStart);.  
15a40 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
15a50 70 48 65 72 65 28 76 2c 20 61 64 64 72 42 72 65  pHere(v, addrBre
15a60 61 6b 32 29 3b 0a 20 20 20 20 61 64 64 72 53 74  ak2);.    addrSt
15a70 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
15a80 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
15a90 0a 20 20 20 20 61 64 64 72 42 72 65 61 6b 33 20  .    addrBreak3 
15aa0 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26  = windowCodeOp(&
15ab0 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e  s, WINDOW_RETURN
15ac0 5f 52 4f 57 2c 20 30 2c 20 31 29 3b 0a 20 20 20  _ROW, 0, 1);.   
15ad0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15ae0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
15af0 2c 20 61 64 64 72 53 74 61 72 74 29 3b 0a 20 20  , addrStart);.  
15b00 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
15b10 70 48 65 72 65 28 76 2c 20 61 64 64 72 42 72 65  pHere(v, addrBre
15b20 61 6b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ak1);.    sqlite
15b30 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
15b40 20 61 64 64 72 42 72 65 61 6b 33 29 3b 0a 20 20   addrBreak3);.  
15b50 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 61  }else{.    int a
15b60 64 64 72 42 72 65 61 6b 3b 0a 20 20 20 20 69 6e  ddrBreak;.    in
15b70 74 20 61 64 64 72 53 74 61 72 74 3b 0a 20 20 20  t addrStart;.   
15b80 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73   windowCodeOp(&s
15b90 2c 20 57 49 4e 44 4f 57 5f 41 47 47 53 54 45 50  , WINDOW_AGGSTEP
15ba0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 61 64 64  , 0, 0);.    add
15bb0 72 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  rStart = sqlite3
15bc0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
15bd0 76 29 3b 0a 20 20 20 20 61 64 64 72 42 72 65 61  v);.    addrBrea
15be0 6b 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70  k = 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 30 2c 20 31 29 3b 0a 20  RN_ROW, 0, 1);. 
15c10 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28     windowCodeOp(
15c20 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e  &s, WINDOW_AGGIN
15c30 56 45 52 53 45 2c 20 72 65 67 53 74 61 72 74 2c  VERSE, regStart,
15c40 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
15c50 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15c60 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 53 74  _Goto, 0, addrSt
15c70 61 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  art);.    sqlite
15c80 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
15c90 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 7d   addrBreak);.  }
15ca0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
15cb0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 45 6d  mpHere(v, addrEm
15cc0 70 74 79 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  pty);..  sqlite3
15cd0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
15ce0 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20 73 2e  _ResetSorter, s.
15cf0 63 75 72 72 65 6e 74 2e 63 73 72 29 3b 0a 20 20  current.csr);.  
15d00 69 66 28 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74  if( pMWin->pPart
15d10 69 74 69 6f 6e 20 29 7b 0a 20 20 20 20 69 66 28  ition ){.    if(
15d20 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72 74   pMWin->regStart
15d30 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 73  Rowid ){.      s
15d40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15d50 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
15d60 31 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61  1, pMWin->regSta
15d70 72 74 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  rtRowid);.      
15d80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15d90 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
15da0 20 30 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 45 6e   0, pMWin->regEn
15db0 64 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 20  dRowid);.    }. 
15dc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
15dd0 61 6e 67 65 50 31 28 76 2c 20 61 64 64 72 49 6e  angeP1(v, addrIn
15de0 74 65 67 65 72 2c 20 73 71 6c 69 74 65 33 56 64  teger, sqlite3Vd
15df0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
15e00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
15e10 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
15e20 65 74 75 72 6e 2c 20 72 65 67 46 6c 75 73 68 50  eturn, regFlushP
15e30 61 72 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 65 6e  art);.  }.}..#en
15e40 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
15e50 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f  IT_WINDOWFUNC */
15e60 0a                                               .