/ Hex Artifact Content
Login

Artifact bbdf43afee5bb4178170baae8111d68dd4d6499610028d49c86979a377ac365c:


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 72 61 6e 6b 28 29 2e 20 41 73 73 75 6d  on rank(). Assum
1b60: 65 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 77  es that.** the w
1b70: 69 6e 64 6f 77 20 66 72 61 6d 65 20 68 61 73 20  indow frame has 
1b80: 62 65 65 6e 20 73 65 74 20 74 6f 3a 0a 2a 2a 0a  been set to:.**.
1b90: 2a 2a 20 20 20 52 41 4e 47 45 20 42 45 54 57 45  **   RANGE BETWE
1ba0: 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  EN UNBOUNDED PRE
1bb0: 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45  CEDING AND CURRE
1bc0: 4e 54 20 52 4f 57 20 0a 2a 2f 0a 73 74 61 74 69  NT ROW .*/.stati
1bd0: 63 20 76 6f 69 64 20 72 61 6e 6b 53 74 65 70 46  c void rankStepF
1be0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
1bf0: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
1c00: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
1c10: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41  ite3_value **apA
1c20: 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 43  rg.){.  struct C
1c30: 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70  allCount *p;.  p
1c40: 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43   = (struct CallC
1c50: 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67  ount*)sqlite3_ag
1c60: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
1c70: 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29  pCtx, sizeof(*p)
1c80: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
1c90: 20 20 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 20 20    p->nStep++;.  
1ca0: 20 20 69 66 28 20 70 2d 3e 6e 56 61 6c 75 65 3d    if( p->nValue=
1cb0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  =0 ){.      p->n
1cc0: 56 61 6c 75 65 20 3d 20 70 2d 3e 6e 53 74 65 70  Value = p->nStep
1cd0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 55 4e  ;.    }.  }.  UN
1ce0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
1cf0: 41 72 67 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  Arg);.  UNUSED_P
1d00: 41 52 41 4d 45 54 45 52 28 61 70 41 72 67 29 3b  ARAMETER(apArg);
1d10: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  .}.static void r
1d20: 61 6e 6b 56 61 6c 75 65 46 75 6e 63 28 73 71 6c  ankValueFunc(sql
1d30: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
1d40: 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61  tx){.  struct Ca
1d50: 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70 20  llCount *p;.  p 
1d60: 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  = (struct CallCo
1d70: 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67  unt*)sqlite3_agg
1d80: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70  regate_context(p
1d90: 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  Ctx, sizeof(*p))
1da0: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
1db0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1dc0: 69 6e 74 36 34 28 70 43 74 78 2c 20 70 2d 3e 6e  int64(pCtx, p->n
1dd0: 56 61 6c 75 65 29 3b 0a 20 20 20 20 70 2d 3e 6e  Value);.    p->n
1de0: 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d  Value = 0;.  }.}
1df0: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
1e00: 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74 2d  tation of built-
1e10: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
1e20: 6f 6e 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b 28  on percent_rank(
1e30: 29 2e 20 41 73 73 75 6d 65 73 20 74 68 61 74 0a  ). Assumes that.
1e40: 2a 2a 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72  ** the window fr
1e50: 61 6d 65 20 68 61 73 20 62 65 65 6e 20 73 65 74  ame has been set
1e60: 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e   to:.**.**   RAN
1e70: 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55  GE BETWEEN UNBOU
1e80: 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41  NDED PRECEDING A
1e90: 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 20 0a  ND CURRENT ROW .
1ea0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
1eb0: 65 72 63 65 6e 74 5f 72 61 6e 6b 53 74 65 70 46  ercent_rankStepF
1ec0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
1ed0: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
1ee0: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
1ef0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41  ite3_value **apA
1f00: 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 43  rg.){.  struct C
1f10: 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 55  allCount *p;.  U
1f20: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1f30: 6e 41 72 67 29 3b 20 61 73 73 65 72 74 28 20 6e  nArg); assert( n
1f40: 41 72 67 3d 3d 31 20 29 3b 0a 0a 20 20 70 20 3d  Arg==1 );..  p =
1f50: 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75   (struct CallCou
1f60: 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72  nt*)sqlite3_aggr
1f70: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43  egate_context(pC
1f80: 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b  tx, sizeof(*p));
1f90: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
1fa0: 69 66 28 20 70 2d 3e 6e 54 6f 74 61 6c 3d 3d 30  if( p->nTotal==0
1fb0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 54 6f   ){.      p->nTo
1fc0: 74 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  tal = sqlite3_va
1fd0: 6c 75 65 5f 69 6e 74 36 34 28 61 70 41 72 67 5b  lue_int64(apArg[
1fe0: 30 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  0]);.    }.    p
1ff0: 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 20 20 20 20 69  ->nStep++;.    i
2000: 66 28 20 70 2d 3e 6e 56 61 6c 75 65 3d 3d 30 20  f( p->nValue==0 
2010: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61 6c  ){.      p->nVal
2020: 75 65 20 3d 20 70 2d 3e 6e 53 74 65 70 3b 0a 20  ue = p->nStep;. 
2030: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69     }.  }.}.stati
2040: 63 20 76 6f 69 64 20 70 65 72 63 65 6e 74 5f 72  c void percent_r
2050: 61 6e 6b 56 61 6c 75 65 46 75 6e 63 28 73 71 6c  ankValueFunc(sql
2060: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
2070: 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61  tx){.  struct Ca
2080: 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70 20  llCount *p;.  p 
2090: 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  = (struct CallCo
20a0: 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67  unt*)sqlite3_agg
20b0: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70  regate_context(p
20c0: 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  Ctx, sizeof(*p))
20d0: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
20e0: 20 69 66 28 20 70 2d 3e 6e 54 6f 74 61 6c 3e 31   if( p->nTotal>1
20f0: 20 29 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65   ){.      double
2100: 20 72 20 3d 20 28 64 6f 75 62 6c 65 29 28 70 2d   r = (double)(p-
2110: 3e 6e 56 61 6c 75 65 2d 31 29 20 2f 20 28 64 6f  >nValue-1) / (do
2120: 75 62 6c 65 29 28 70 2d 3e 6e 54 6f 74 61 6c 2d  uble)(p->nTotal-
2130: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
2140: 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28  3_result_double(
2150: 70 43 74 78 2c 20 72 29 3b 0a 20 20 20 20 7d 65  pCtx, r);.    }e
2160: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
2170: 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65  e3_result_double
2180: 28 70 43 74 78 2c 20 30 2e 30 29 3b 0a 20 20 20  (pCtx, 0.0);.   
2190: 20 7d 0a 20 20 20 20 70 2d 3e 6e 56 61 6c 75 65   }.    p->nValue
21a0: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
21b0: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
21c0: 6e 20 6f 66 20 62 75 69 6c 74 2d 69 6e 20 77 69  n of built-in wi
21d0: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 63 75  ndow function cu
21e0: 6d 65 5f 64 69 73 74 28 29 2e 20 41 73 73 75 6d  me_dist(). Assum
21f0: 65 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 77  es that.** the w
2200: 69 6e 64 6f 77 20 66 72 61 6d 65 20 68 61 73 20  indow frame has 
2210: 62 65 65 6e 20 73 65 74 20 74 6f 3a 0a 2a 2a 0a  been set to:.**.
2220: 2a 2a 20 20 20 52 41 4e 47 45 20 42 45 54 57 45  **   RANGE BETWE
2230: 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  EN UNBOUNDED PRE
2240: 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45  CEDING AND CURRE
2250: 4e 54 20 52 4f 57 20 0a 2a 2f 0a 73 74 61 74 69  NT ROW .*/.stati
2260: 63 20 76 6f 69 64 20 63 75 6d 65 5f 64 69 73 74  c void cume_dist
2270: 53 74 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69  StepFunc(.  sqli
2280: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
2290: 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  x, .  int nArg,.
22a0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
22b0: 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72  **apArg.){.  str
22c0: 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 20 2a 70  uct CallCount *p
22d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 41 72 67  ;.  assert( nArg
22e0: 3d 3d 31 20 29 3b 20 55 4e 55 53 45 44 5f 50 41  ==1 ); UNUSED_PA
22f0: 52 41 4d 45 54 45 52 28 6e 41 72 67 29 3b 0a 0a  RAMETER(nArg);..
2300: 20 20 70 20 3d 20 28 73 74 72 75 63 74 20 43 61    p = (struct Ca
2310: 6c 6c 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33  llCount*)sqlite3
2320: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
2330: 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28  xt(pCtx, sizeof(
2340: 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b  *p));.  if( p ){
2350: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 54 6f 74  .    if( p->nTot
2360: 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  al==0 ){.      p
2370: 2d 3e 6e 54 6f 74 61 6c 20 3d 20 73 71 6c 69 74  ->nTotal = sqlit
2380: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61  e3_value_int64(a
2390: 70 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 7d 0a  pArg[0]);.    }.
23a0: 20 20 20 20 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a      p->nStep++;.
23b0: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
23c0: 64 20 63 75 6d 65 5f 64 69 73 74 56 61 6c 75 65  d cume_distValue
23d0: 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Func(sqlite3_con
23e0: 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20 20 73  text *pCtx){.  s
23f0: 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 20  truct CallCount 
2400: 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63  *p;.  p = (struc
2410: 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29 73 71 6c  t CallCount*)sql
2420: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
2430: 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a  ontext(pCtx, siz
2440: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20  eof(*p));.  if( 
2450: 70 20 26 26 20 70 2d 3e 6e 54 6f 74 61 6c 20 29  p && p->nTotal )
2460: 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d  {.    double r =
2470: 20 28 64 6f 75 62 6c 65 29 28 70 2d 3e 6e 53 74   (double)(p->nSt
2480: 65 70 29 20 2f 20 28 64 6f 75 62 6c 65 29 28 70  ep) / (double)(p
2490: 2d 3e 6e 54 6f 74 61 6c 29 3b 0a 20 20 20 20 73  ->nTotal);.    s
24a0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f  qlite3_result_do
24b0: 75 62 6c 65 28 70 43 74 78 2c 20 72 29 3b 0a 20  uble(pCtx, r);. 
24c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74   }.}../*.** Cont
24d0: 65 78 74 20 6f 62 6a 65 63 74 20 66 6f 72 20 6e  ext object for n
24e0: 74 69 6c 65 28 29 20 77 69 6e 64 6f 77 20 66 75  tile() window fu
24f0: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 72 75 63  nction..*/.struc
2500: 74 20 4e 74 69 6c 65 43 74 78 20 7b 0a 20 20 69  t NtileCtx {.  i
2510: 36 34 20 6e 54 6f 74 61 6c 3b 20 20 20 20 20 20  64 nTotal;      
2520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2530: 2a 20 54 6f 74 61 6c 20 72 6f 77 73 20 69 6e 20  * Total rows in 
2540: 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 20 20 69  partition */.  i
2550: 36 34 20 6e 50 61 72 61 6d 3b 20 20 20 20 20 20  64 nParam;      
2560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2570: 2a 20 50 61 72 61 6d 65 74 65 72 20 70 61 73 73  * Parameter pass
2580: 65 64 20 74 6f 20 6e 74 69 6c 65 28 4e 29 20 2a  ed to ntile(N) *
2590: 2f 0a 20 20 69 36 34 20 69 52 6f 77 3b 20 20 20  /.  i64 iRow;   
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72      /* Current r
25c0: 6f 77 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ow */.};../*.** 
25d0: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
25e0: 66 20 6e 74 69 6c 65 28 29 2e 20 54 68 69 73 20  f ntile(). This 
25f0: 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65  assumes that the
2600: 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 20 68 61   window frame ha
2610: 73 0a 2a 2a 20 62 65 65 6e 20 63 6f 65 72 63 65  s.** been coerce
2620: 64 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 4f  d to:.**.**   RO
2630: 57 53 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  WS UNBOUNDED PRE
2640: 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45  CEDING AND CURRE
2650: 4e 54 20 52 4f 57 0a 2a 2f 0a 73 74 61 74 69 63  NT ROW.*/.static
2660: 20 76 6f 69 64 20 6e 74 69 6c 65 53 74 65 70 46   void ntileStepF
2670: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
2680: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
2690: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
26a0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41  ite3_value **apA
26b0: 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 4e  rg.){.  struct N
26c0: 74 69 6c 65 43 74 78 20 2a 70 3b 0a 20 20 61 73  tileCtx *p;.  as
26d0: 73 65 72 74 28 20 6e 41 72 67 3d 3d 32 20 29 3b  sert( nArg==2 );
26e0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
26f0: 52 28 6e 41 72 67 29 3b 0a 20 20 70 20 3d 20 28  R(nArg);.  p = (
2700: 73 74 72 75 63 74 20 4e 74 69 6c 65 43 74 78 2a  struct NtileCtx*
2710: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
2720: 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c  te_context(pCtx,
2730: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
2740: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  if( p ){.    if(
2750: 20 70 2d 3e 6e 54 6f 74 61 6c 3d 3d 30 20 29 7b   p->nTotal==0 ){
2760: 0a 20 20 20 20 20 20 70 2d 3e 6e 50 61 72 61 6d  .      p->nParam
2770: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
2780: 5f 69 6e 74 36 34 28 61 70 41 72 67 5b 30 5d 29  _int64(apArg[0])
2790: 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 54 6f 74 61  ;.      p->nTota
27a0: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  l = sqlite3_valu
27b0: 65 5f 69 6e 74 36 34 28 61 70 41 72 67 5b 31 5d  e_int64(apArg[1]
27c0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
27d0: 6e 50 61 72 61 6d 3c 3d 30 20 29 7b 0a 20 20 20  nParam<=0 ){.   
27e0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
27f0: 75 6c 74 5f 65 72 72 6f 72 28 0a 20 20 20 20 20  ult_error(.     
2800: 20 20 20 20 20 20 20 70 43 74 78 2c 20 22 61 72         pCtx, "ar
2810: 67 75 6d 65 6e 74 20 6f 66 20 6e 74 69 6c 65 20  gument of ntile 
2820: 6d 75 73 74 20 62 65 20 61 20 70 6f 73 69 74 69  must be a positi
2830: 76 65 20 69 6e 74 65 67 65 72 22 2c 20 2d 31 0a  ve integer", -1.
2840: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
2850: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e   }.    }.    p->
2860: 69 52 6f 77 2b 2b 3b 0a 20 20 7d 0a 7d 0a 73 74  iRow++;.  }.}.st
2870: 61 74 69 63 20 76 6f 69 64 20 6e 74 69 6c 65 56  atic void ntileV
2880: 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33  alueFunc(sqlite3
2890: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b  _context *pCtx){
28a0: 0a 20 20 73 74 72 75 63 74 20 4e 74 69 6c 65 43  .  struct NtileC
28b0: 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74  tx *p;.  p = (st
28c0: 72 75 63 74 20 4e 74 69 6c 65 43 74 78 2a 29 73  ruct NtileCtx*)s
28d0: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
28e0: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
28f0: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
2900: 28 20 70 20 26 26 20 70 2d 3e 6e 50 61 72 61 6d  ( p && p->nParam
2910: 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53  >0 ){.    int nS
2920: 69 7a 65 20 3d 20 28 70 2d 3e 6e 54 6f 74 61 6c  ize = (p->nTotal
2930: 20 2f 20 70 2d 3e 6e 50 61 72 61 6d 29 3b 0a 20   / p->nParam);. 
2940: 20 20 20 69 66 28 20 6e 53 69 7a 65 3d 3d 30 20     if( nSize==0 
2950: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2960: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43  _result_int64(pC
2970: 74 78 2c 20 70 2d 3e 69 52 6f 77 29 3b 0a 20 20  tx, p->iRow);.  
2980: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
2990: 36 34 20 6e 4c 61 72 67 65 20 3d 20 70 2d 3e 6e  64 nLarge = p->n
29a0: 54 6f 74 61 6c 20 2d 20 70 2d 3e 6e 50 61 72 61  Total - p->nPara
29b0: 6d 2a 6e 53 69 7a 65 3b 0a 20 20 20 20 20 20 69  m*nSize;.      i
29c0: 36 34 20 69 53 6d 61 6c 6c 20 3d 20 6e 4c 61 72  64 iSmall = nLar
29d0: 67 65 2a 28 6e 53 69 7a 65 2b 31 29 3b 0a 20 20  ge*(nSize+1);.  
29e0: 20 20 20 20 69 36 34 20 69 52 6f 77 20 3d 20 70      i64 iRow = p
29f0: 2d 3e 69 52 6f 77 2d 31 3b 0a 0a 20 20 20 20 20  ->iRow-1;..     
2a00: 20 61 73 73 65 72 74 28 20 28 6e 4c 61 72 67 65   assert( (nLarge
2a10: 2a 28 6e 53 69 7a 65 2b 31 29 20 2b 20 28 70 2d  *(nSize+1) + (p-
2a20: 3e 6e 50 61 72 61 6d 2d 6e 4c 61 72 67 65 29 2a  >nParam-nLarge)*
2a30: 6e 53 69 7a 65 29 3d 3d 70 2d 3e 6e 54 6f 74 61  nSize)==p->nTota
2a40: 6c 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  l );..      if( 
2a50: 69 52 6f 77 3c 69 53 6d 61 6c 6c 20 29 7b 0a 20  iRow<iSmall ){. 
2a60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
2a70: 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78  esult_int64(pCtx
2a80: 2c 20 31 20 2b 20 69 52 6f 77 2f 28 6e 53 69 7a  , 1 + iRow/(nSiz
2a90: 65 2b 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  e+1));.      }el
2aa0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
2ab0: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
2ac0: 28 70 43 74 78 2c 20 31 20 2b 20 6e 4c 61 72 67  (pCtx, 1 + nLarg
2ad0: 65 20 2b 20 28 69 52 6f 77 2d 69 53 6d 61 6c 6c  e + (iRow-iSmall
2ae0: 29 2f 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  )/nSize);.      
2af0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
2b00: 2a 0a 2a 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a  *.** Context obj
2b10: 65 63 74 20 66 6f 72 20 6c 61 73 74 5f 76 61 6c  ect for last_val
2b20: 75 65 28 29 20 77 69 6e 64 6f 77 20 66 75 6e 63  ue() window func
2b30: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  tion..*/.struct 
2b40: 4c 61 73 74 56 61 6c 75 65 43 74 78 20 7b 0a 20  LastValueCtx {. 
2b50: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
2b60: 70 56 61 6c 3b 0a 20 20 69 6e 74 20 6e 56 61 6c  pVal;.  int nVal
2b70: 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  ;.};../*.** Impl
2b80: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6c 61  ementation of la
2b90: 73 74 5f 76 61 6c 75 65 28 29 2e 0a 2a 2f 0a 73  st_value()..*/.s
2ba0: 74 61 74 69 63 20 76 6f 69 64 20 6c 61 73 74 5f  tatic void last_
2bb0: 76 61 6c 75 65 53 74 65 70 46 75 6e 63 28 0a 20  valueStepFunc(. 
2bc0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
2bd0: 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
2be0: 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
2bf0: 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a  alue **apArg.){.
2c00: 20 20 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c    struct LastVal
2c10: 75 65 43 74 78 20 2a 70 3b 0a 20 20 55 4e 55 53  ueCtx *p;.  UNUS
2c20: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72  ED_PARAMETER(nAr
2c30: 67 29 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63  g);.  p = (struc
2c40: 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 2a 29  t LastValueCtx*)
2c50: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
2c60: 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20  e_context(pCtx, 
2c70: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69  sizeof(*p));.  i
2c80: 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( p ){.    sqli
2c90: 74 65 33 5f 76 61 6c 75 65 5f 66 72 65 65 28 70  te3_value_free(p
2ca0: 2d 3e 70 56 61 6c 29 3b 0a 20 20 20 20 70 2d 3e  ->pVal);.    p->
2cb0: 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76  pVal = sqlite3_v
2cc0: 61 6c 75 65 5f 64 75 70 28 61 70 41 72 67 5b 30  alue_dup(apArg[0
2cd0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  ]);.    if( p->p
2ce0: 56 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Val==0 ){.      
2cf0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
2d00: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29  rror_nomem(pCtx)
2d10: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2d20: 20 20 20 70 2d 3e 6e 56 61 6c 2b 2b 3b 0a 20 20     p->nVal++;.  
2d30: 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63    }.  }.}.static
2d40: 20 76 6f 69 64 20 6c 61 73 74 5f 76 61 6c 75 65   void last_value
2d50: 49 6e 76 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  InvFunc(.  sqlit
2d60: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
2d70: 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  , .  int nArg,. 
2d80: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
2d90: 2a 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72 75  *apArg.){.  stru
2da0: 63 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 20  ct LastValueCtx 
2db0: 2a 70 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  *p;.  UNUSED_PAR
2dc0: 41 4d 45 54 45 52 28 6e 41 72 67 29 3b 0a 20 20  AMETER(nArg);.  
2dd0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2de0: 28 61 70 41 72 67 29 3b 0a 20 20 70 20 3d 20 28  (apArg);.  p = (
2df0: 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75 65  struct LastValue
2e00: 43 74 78 2a 29 73 71 6c 69 74 65 33 5f 61 67 67  Ctx*)sqlite3_agg
2e10: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70  regate_context(p
2e20: 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  Ctx, sizeof(*p))
2e30: 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
2e40: 29 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 6c  ) ){.    p->nVal
2e50: 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  --;.    if( p->n
2e60: 56 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Val==0 ){.      
2e70: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 66 72  sqlite3_value_fr
2e80: 65 65 28 70 2d 3e 70 56 61 6c 29 3b 0a 20 20 20  ee(p->pVal);.   
2e90: 20 20 20 70 2d 3e 70 56 61 6c 20 3d 20 30 3b 0a     p->pVal = 0;.
2ea0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74      }.  }.}.stat
2eb0: 69 63 20 76 6f 69 64 20 6c 61 73 74 5f 76 61 6c  ic void last_val
2ec0: 75 65 56 61 6c 75 65 46 75 6e 63 28 73 71 6c 69  ueValueFunc(sqli
2ed0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
2ee0: 78 29 7b 0a 20 20 73 74 72 75 63 74 20 4c 61 73  x){.  struct Las
2ef0: 74 56 61 6c 75 65 43 74 78 20 2a 70 3b 0a 20 20  tValueCtx *p;.  
2f00: 70 20 3d 20 28 73 74 72 75 63 74 20 4c 61 73 74  p = (struct Last
2f10: 56 61 6c 75 65 43 74 78 2a 29 73 71 6c 69 74 65  ValueCtx*)sqlite
2f20: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
2f30: 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66  ext(pCtx, sizeof
2f40: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 26  (*p));.  if( p &
2f50: 26 20 70 2d 3e 70 56 61 6c 20 29 7b 0a 20 20 20  & p->pVal ){.   
2f60: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2f70: 76 61 6c 75 65 28 70 43 74 78 2c 20 70 2d 3e 70  value(pCtx, p->p
2f80: 56 61 6c 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  Val);.  }.}.stat
2f90: 69 63 20 76 6f 69 64 20 6c 61 73 74 5f 76 61 6c  ic void last_val
2fa0: 75 65 46 69 6e 61 6c 69 7a 65 46 75 6e 63 28 73  ueFinalizeFunc(s
2fb0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
2fc0: 70 43 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20  pCtx){.  struct 
2fd0: 4c 61 73 74 56 61 6c 75 65 43 74 78 20 2a 70 3b  LastValueCtx *p;
2fe0: 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74 20 4c  .  p = (struct L
2ff0: 61 73 74 56 61 6c 75 65 43 74 78 2a 29 73 71 6c  astValueCtx*)sql
3000: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
3010: 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a  ontext(pCtx, siz
3020: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20  eof(*p));.  if( 
3030: 70 20 26 26 20 70 2d 3e 70 56 61 6c 20 29 7b 0a  p && p->pVal ){.
3040: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
3050: 6c 74 5f 76 61 6c 75 65 28 70 43 74 78 2c 20 70  lt_value(pCtx, p
3060: 2d 3e 70 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c  ->pVal);.    sql
3070: 69 74 65 33 5f 76 61 6c 75 65 5f 66 72 65 65 28  ite3_value_free(
3080: 70 2d 3e 70 56 61 6c 29 3b 0a 20 20 20 20 70 2d  p->pVal);.    p-
3090: 3e 70 56 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 7d  >pVal = 0;.  }.}
30a0: 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 74 69 63 20 6e  ../*.** Static n
30b0: 61 6d 65 73 20 66 6f 72 20 74 68 65 20 62 75 69  ames for the bui
30c0: 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e  lt-in window fun
30d0: 63 74 69 6f 6e 20 6e 61 6d 65 73 2e 20 20 54 68  ction names.  Th
30e0: 65 73 65 20 73 74 61 74 69 63 0a 2a 2a 20 6e 61  ese static.** na
30f0: 6d 65 73 20 61 72 65 20 75 73 65 64 2c 20 72 61  mes are used, ra
3100: 74 68 65 72 20 74 68 61 6e 20 73 74 72 69 6e 67  ther than string
3110: 20 6c 69 74 65 72 61 6c 73 2c 20 73 6f 20 74 68   literals, so th
3120: 61 74 20 46 75 6e 63 44 65 66 20 6f 62 6a 65 63  at FuncDef objec
3130: 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 61 73 73  ts.** can be ass
3140: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 70  ociated with a p
3150: 61 72 74 69 63 75 6c 61 72 20 77 69 6e 64 6f 77  articular window
3160: 20 66 75 6e 63 74 69 6f 6e 20 62 79 20 64 69 72   function by dir
3170: 65 63 74 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f  ect.** compariso
3180: 6e 20 6f 66 20 74 68 65 20 7a 4e 61 6d 65 20 70  n of the zName p
3190: 6f 69 6e 74 65 72 2e 20 20 45 78 61 6d 70 6c 65  ointer.  Example
31a0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 66  :.**.**       if
31b0: 28 20 70 46 75 6e 63 44 65 66 2d 3e 7a 4e 61 6d  ( pFuncDef->zNam
31c0: 65 3d 3d 72 6f 77 5f 76 61 6c 75 65 4e 61 6d 65  e==row_valueName
31d0: 20 29 7b 20 2e 2e 2e 20 7d 0a 2a 2f 0a 73 74 61   ){ ... }.*/.sta
31e0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 72  tic const char r
31f0: 6f 77 5f 6e 75 6d 62 65 72 4e 61 6d 65 5b 5d 20  ow_numberName[] 
3200: 3d 20 20 20 22 72 6f 77 5f 6e 75 6d 62 65 72 22  =   "row_number"
3210: 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  ;.static const c
3220: 68 61 72 20 64 65 6e 73 65 5f 72 61 6e 6b 4e 61  har dense_rankNa
3230: 6d 65 5b 5d 20 3d 20 20 20 22 64 65 6e 73 65 5f  me[] =   "dense_
3240: 72 61 6e 6b 22 3b 0a 73 74 61 74 69 63 20 63 6f  rank";.static co
3250: 6e 73 74 20 63 68 61 72 20 72 61 6e 6b 4e 61 6d  nst char rankNam
3260: 65 5b 5d 20 3d 20 20 20 20 20 20 20 20 20 22 72  e[] =         "r
3270: 61 6e 6b 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e  ank";.static con
3280: 73 74 20 63 68 61 72 20 70 65 72 63 65 6e 74 5f  st char percent_
3290: 72 61 6e 6b 4e 61 6d 65 5b 5d 20 3d 20 22 70 65  rankName[] = "pe
32a0: 72 63 65 6e 74 5f 72 61 6e 6b 22 3b 0a 73 74 61  rcent_rank";.sta
32b0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 63  tic const char c
32c0: 75 6d 65 5f 64 69 73 74 4e 61 6d 65 5b 5d 20 3d  ume_distName[] =
32d0: 20 20 20 20 22 63 75 6d 65 5f 64 69 73 74 22 3b      "cume_dist";
32e0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
32f0: 61 72 20 6e 74 69 6c 65 4e 61 6d 65 5b 5d 20 3d  ar ntileName[] =
3300: 20 20 20 20 20 20 20 20 22 6e 74 69 6c 65 22 3b          "ntile";
3310: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
3320: 61 72 20 6c 61 73 74 5f 76 61 6c 75 65 4e 61 6d  ar last_valueNam
3330: 65 5b 5d 20 3d 20 20 20 22 6c 61 73 74 5f 76 61  e[] =   "last_va
3340: 6c 75 65 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e  lue";.static con
3350: 73 74 20 63 68 61 72 20 6e 74 68 5f 76 61 6c 75  st char nth_valu
3360: 65 4e 61 6d 65 5b 5d 20 3d 20 20 20 20 22 6e 74  eName[] =    "nt
3370: 68 5f 76 61 6c 75 65 22 3b 0a 73 74 61 74 69 63  h_value";.static
3380: 20 63 6f 6e 73 74 20 63 68 61 72 20 66 69 72 73   const char firs
3390: 74 5f 76 61 6c 75 65 4e 61 6d 65 5b 5d 20 3d 20  t_valueName[] = 
33a0: 20 22 66 69 72 73 74 5f 76 61 6c 75 65 22 3b 0a   "first_value";.
33b0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
33c0: 72 20 6c 65 61 64 4e 61 6d 65 5b 5d 20 3d 20 20  r leadName[] =  
33d0: 20 20 20 20 20 20 20 22 6c 65 61 64 22 3b 0a 73         "lead";.s
33e0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
33f0: 20 6c 61 67 4e 61 6d 65 5b 5d 20 3d 20 20 20 20   lagName[] =    
3400: 20 20 20 20 20 20 22 6c 61 67 22 3b 0a 0a 2f 2a        "lag";../*
3410: 0a 2a 2a 20 4e 6f 2d 6f 70 20 69 6d 70 6c 65 6d  .** No-op implem
3420: 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 78 53 74  entations of xSt
3430: 65 70 28 29 20 61 6e 64 20 78 46 69 6e 61 6c 69  ep() and xFinali
3440: 7a 65 28 29 2e 20 20 55 73 65 64 20 61 73 20 70  ze().  Used as p
3450: 6c 61 63 65 2d 68 6f 6c 64 65 72 73 0a 2a 2a 20  lace-holders.** 
3460: 66 6f 72 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e  for built-in win
3470: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  dow functions th
3480: 61 74 20 6e 65 76 65 72 20 63 61 6c 6c 20 74 68  at never call th
3490: 6f 73 65 20 69 6e 74 65 72 66 61 63 65 73 2e 0a  ose interfaces..
34a0: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 6f 6f 70 56 61  **.** The noopVa
34b0: 6c 75 65 46 75 6e 63 28 29 20 69 73 20 63 61 6c  lueFunc() is cal
34c0: 6c 65 64 20 62 75 74 20 69 73 20 65 78 70 65 63  led but is expec
34d0: 74 65 64 20 74 6f 20 64 6f 20 6e 6f 74 68 69 6e  ted to do nothin
34e0: 67 2e 20 20 54 68 65 0a 2a 2a 20 6e 6f 6f 70 53  g.  The.** noopS
34f0: 74 65 70 46 75 6e 63 28 29 20 69 73 20 6e 65 76  tepFunc() is nev
3500: 65 72 20 63 61 6c 6c 65 64 2c 20 61 6e 64 20 73  er called, and s
3510: 6f 20 69 74 20 69 73 20 6d 61 72 6b 65 64 20 77  o it is marked w
3520: 69 74 68 20 4e 4f 5f 54 45 53 54 20 74 6f 0a 2a  ith NO_TEST to.*
3530: 2a 20 6c 65 74 20 74 68 65 20 74 65 73 74 20 63  * let the test c
3540: 6f 76 65 72 61 67 65 20 72 6f 75 74 69 6e 65 20  overage routine 
3550: 6b 6e 6f 77 20 6e 6f 74 20 74 6f 20 65 78 70 65  know not to expe
3560: 63 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ct this function
3570: 20 74 6f 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65   to be.** invoke
3580: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
3590: 64 20 6e 6f 6f 70 53 74 65 70 46 75 6e 63 28 20  d noopStepFunc( 
35a0: 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20     /*NO_TEST*/. 
35b0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
35c0: 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 4e 4f   *p,        /*NO
35d0: 5f 54 45 53 54 2a 2f 0a 20 20 69 6e 74 20 6e 2c  _TEST*/.  int n,
35e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35f0: 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f       /*NO_TEST*/
3600: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
3610: 20 2a 2a 61 20 20 20 20 20 20 20 20 20 20 2f 2a   **a          /*
3620: 4e 4f 5f 54 45 53 54 2a 2f 0a 29 7b 20 20 20 20  NO_TEST*/.){    
3630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3640: 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54         /*NO_TEST
3650: 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  */.  UNUSED_PARA
3660: 4d 45 54 45 52 28 70 29 3b 20 20 20 20 20 20 20  METER(p);       
3670: 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 55 4e  /*NO_TEST*/.  UN
3680: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
3690: 29 3b 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45  );       /*NO_TE
36a0: 53 54 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41  ST*/.  UNUSED_PA
36b0: 52 41 4d 45 54 45 52 28 61 29 3b 20 20 20 20 20  RAMETER(a);     
36c0: 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20    /*NO_TEST*/.  
36d0: 61 73 73 65 72 74 28 30 29 3b 20 20 20 20 20 20  assert(0);      
36e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f             /*NO_
36f0: 54 45 53 54 2a 2f 0a 7d 20 20 20 20 20 20 20 20  TEST*/.}        
3700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3710: 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a      /*NO_TEST*/.
3720: 73 74 61 74 69 63 20 76 6f 69 64 20 6e 6f 6f 70  static void noop
3730: 56 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74 65  ValueFunc(sqlite
3740: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 29 7b 20 55  3_context *p){ U
3750: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
3760: 70 29 3b 20 2f 2a 6e 6f 2d 6f 70 2a 2f 20 7d 0a  p); /*no-op*/ }.
3770: 0a 2f 2a 20 57 69 6e 64 6f 77 20 66 75 6e 63 74  ./* Window funct
3780: 69 6f 6e 73 20 74 68 61 74 20 75 73 65 20 61 6c  ions that use al
3790: 6c 20 77 69 6e 64 6f 77 20 69 6e 74 65 72 66 61  l window interfa
37a0: 63 65 73 3a 20 78 53 74 65 70 2c 20 78 46 69 6e  ces: xStep, xFin
37b0: 61 6c 2c 0a 2a 2a 20 78 56 61 6c 75 65 2c 20 61  al,.** xValue, a
37c0: 6e 64 20 78 49 6e 76 65 72 73 65 20 2a 2f 0a 23  nd xInverse */.#
37d0: 64 65 66 69 6e 65 20 57 49 4e 44 4f 57 46 55 4e  define WINDOWFUN
37e0: 43 41 4c 4c 28 6e 61 6d 65 2c 6e 41 72 67 2c 65  CALL(name,nArg,e
37f0: 78 74 72 61 29 20 7b 20 20 20 20 20 20 20 20 20  xtra) {         
3800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3810: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6e 41            \.  nA
3820: 72 67 2c 20 28 53 51 4c 49 54 45 5f 55 54 46 38  rg, (SQLITE_UTF8
3830: 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e  |SQLITE_FUNC_WIN
3840: 44 4f 57 7c 65 78 74 72 61 29 2c 20 30 2c 20 30  DOW|extra), 0, 0
3850: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3860: 20 20 20 20 20 20 20 5c 0a 20 20 6e 61 6d 65 20         \.  name 
3870: 23 23 20 53 74 65 70 46 75 6e 63 2c 20 6e 61 6d  ## StepFunc, nam
3880: 65 20 23 23 20 46 69 6e 61 6c 69 7a 65 46 75 6e  e ## FinalizeFun
3890: 63 2c 20 6e 61 6d 65 20 23 23 20 56 61 6c 75 65  c, name ## Value
38a0: 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Func,           
38b0: 20 20 20 20 5c 0a 20 20 6e 61 6d 65 20 23 23 20      \.  name ## 
38c0: 49 6e 76 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23  InvFunc, name ##
38d0: 20 4e 61 6d 65 2c 20 7b 30 7d 20 20 20 20 20 20   Name, {0}      
38e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3900: 20 5c 0a 7d 0a 0a 2f 2a 20 57 69 6e 64 6f 77 20   \.}../* Window 
3910: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 61  functions that a
3920: 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75  re implemented u
3930: 73 69 6e 67 20 62 79 74 65 63 6f 64 65 20 61 6e  sing bytecode an
3940: 64 20 74 68 75 73 20 68 61 76 65 0a 2a 2a 20 6e  d thus have.** n
3950: 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 73 20 66 6f  o-op routines fo
3960: 72 20 74 68 65 69 72 20 6d 65 74 68 6f 64 73 20  r their methods 
3970: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 44 4f  */.#define WINDO
3980: 57 46 55 4e 43 4e 4f 4f 50 28 6e 61 6d 65 2c 6e  WFUNCNOOP(name,n
3990: 41 72 67 2c 65 78 74 72 61 29 20 7b 20 20 20 20  Arg,extra) {    
39a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
39c0: 20 20 6e 41 72 67 2c 20 28 53 51 4c 49 54 45 5f    nArg, (SQLITE_
39d0: 55 54 46 38 7c 53 51 4c 49 54 45 5f 46 55 4e 43  UTF8|SQLITE_FUNC
39e0: 5f 57 49 4e 44 4f 57 7c 65 78 74 72 61 29 2c 20  _WINDOW|extra), 
39f0: 30 2c 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  0, 0,           
3a00: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6e             \.  n
3a10: 6f 6f 70 53 74 65 70 46 75 6e 63 2c 20 6e 6f 6f  oopStepFunc, noo
3a20: 70 56 61 6c 75 65 46 75 6e 63 2c 20 6e 6f 6f 70  pValueFunc, noop
3a30: 56 61 6c 75 65 46 75 6e 63 2c 20 20 20 20 20 20  ValueFunc,      
3a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a50: 20 20 20 20 20 20 20 20 5c 0a 20 20 6e 6f 6f 70          \.  noop
3a60: 53 74 65 70 46 75 6e 63 2c 20 6e 61 6d 65 20 23  StepFunc, name #
3a70: 23 20 4e 61 6d 65 2c 20 7b 30 7d 20 20 20 20 20  # Name, {0}     
3a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3aa0: 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 20 57 69 6e       \.}../* Win
3ab0: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  dow functions th
3ac0: 61 74 20 75 73 65 20 61 6c 6c 20 77 69 6e 64 6f  at use all windo
3ad0: 77 20 69 6e 74 65 72 66 61 63 65 73 3a 20 78 53  w interfaces: xS
3ae0: 74 65 70 2c 20 74 68 65 0a 2a 2a 20 73 61 6d 65  tep, the.** same
3af0: 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 78 46 69   routine for xFi
3b00: 6e 61 6c 69 7a 65 20 61 6e 64 20 78 56 61 6c 75  nalize and xValu
3b10: 65 20 61 6e 64 20 77 68 69 63 68 20 6e 65 76 65  e and which neve
3b20: 72 20 63 61 6c 6c 0a 2a 2a 20 78 49 6e 76 65 72  r call.** xInver
3b30: 73 65 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  se. */.#define W
3b40: 49 4e 44 4f 57 46 55 4e 43 58 28 6e 61 6d 65 2c  INDOWFUNCX(name,
3b50: 6e 41 72 67 2c 65 78 74 72 61 29 20 7b 20 20 20  nArg,extra) {   
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b80: 20 20 5c 0a 20 20 6e 41 72 67 2c 20 28 53 51 4c    \.  nArg, (SQL
3b90: 49 54 45 5f 55 54 46 38 7c 53 51 4c 49 54 45 5f  ITE_UTF8|SQLITE_
3ba0: 46 55 4e 43 5f 57 49 4e 44 4f 57 7c 65 78 74 72  FUNC_WINDOW|extr
3bb0: 61 29 2c 20 30 2c 20 30 2c 20 20 20 20 20 20 20  a), 0, 0,       
3bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
3bd0: 0a 20 20 6e 61 6d 65 20 23 23 20 53 74 65 70 46  .  name ## StepF
3be0: 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20 56 61 6c  unc, name ## Val
3bf0: 75 65 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20  ueFunc, name ## 
3c00: 56 61 6c 75 65 46 75 6e 63 2c 20 20 20 20 20 20  ValueFunc,      
3c10: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
3c20: 6e 6f 6f 70 53 74 65 70 46 75 6e 63 2c 20 6e 61  noopStepFunc, na
3c30: 6d 65 20 23 23 20 4e 61 6d 65 2c 20 7b 30 7d 20  me ## Name, {0} 
3c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c60: 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 0a 2f           \.}.../
3c70: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 74 68  *.** Register th
3c80: 6f 73 65 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e  ose built-in win
3c90: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  dow functions th
3ca0: 61 74 20 61 72 65 20 6e 6f 74 20 61 6c 73 6f 20  at are not also 
3cb0: 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2f 0a 76  aggregates..*/.v
3cc0: 6f 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f  oid sqlite3Windo
3cd0: 77 46 75 6e 63 74 69 6f 6e 73 28 76 6f 69 64 29  wFunctions(void)
3ce0: 7b 0a 20 20 73 74 61 74 69 63 20 46 75 6e 63 44  {.  static FuncD
3cf0: 65 66 20 61 57 69 6e 64 6f 77 46 75 6e 63 73 5b  ef aWindowFuncs[
3d00: 5d 20 3d 20 7b 0a 20 20 20 20 57 49 4e 44 4f 57  ] = {.    WINDOW
3d10: 46 55 4e 43 58 28 72 6f 77 5f 6e 75 6d 62 65 72  FUNCX(row_number
3d20: 2c 20 30 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e  , 0, 0),.    WIN
3d30: 44 4f 57 46 55 4e 43 58 28 64 65 6e 73 65 5f 72  DOWFUNCX(dense_r
3d40: 61 6e 6b 2c 20 30 2c 20 30 29 2c 0a 20 20 20 20  ank, 0, 0),.    
3d50: 57 49 4e 44 4f 57 46 55 4e 43 58 28 72 61 6e 6b  WINDOWFUNCX(rank
3d60: 2c 20 30 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e  , 0, 0),.    WIN
3d70: 44 4f 57 46 55 4e 43 58 28 70 65 72 63 65 6e 74  DOWFUNCX(percent
3d80: 5f 72 61 6e 6b 2c 20 30 2c 20 53 51 4c 49 54 45  _rank, 0, SQLITE
3d90: 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 5f 53 49 5a  _FUNC_WINDOW_SIZ
3da0: 45 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46 55  E),.    WINDOWFU
3db0: 4e 43 58 28 63 75 6d 65 5f 64 69 73 74 2c 20 30  NCX(cume_dist, 0
3dc0: 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49  , SQLITE_FUNC_WI
3dd0: 4e 44 4f 57 5f 53 49 5a 45 29 2c 0a 20 20 20 20  NDOW_SIZE),.    
3de0: 57 49 4e 44 4f 57 46 55 4e 43 58 28 6e 74 69 6c  WINDOWFUNCX(ntil
3df0: 65 2c 20 31 2c 20 53 51 4c 49 54 45 5f 46 55 4e  e, 1, SQLITE_FUN
3e00: 43 5f 57 49 4e 44 4f 57 5f 53 49 5a 45 29 2c 0a  C_WINDOW_SIZE),.
3e10: 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 41 4c      WINDOWFUNCAL
3e20: 4c 28 6c 61 73 74 5f 76 61 6c 75 65 2c 20 31 2c  L(last_value, 1,
3e30: 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46   0),.    WINDOWF
3e40: 55 4e 43 4e 4f 4f 50 28 6e 74 68 5f 76 61 6c 75  UNCNOOP(nth_valu
3e50: 65 2c 20 32 2c 20 30 29 2c 0a 20 20 20 20 57 49  e, 2, 0),.    WI
3e60: 4e 44 4f 57 46 55 4e 43 4e 4f 4f 50 28 66 69 72  NDOWFUNCNOOP(fir
3e70: 73 74 5f 76 61 6c 75 65 2c 20 31 2c 20 30 29 2c  st_value, 1, 0),
3e80: 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e  .    WINDOWFUNCN
3e90: 4f 4f 50 28 6c 65 61 64 2c 20 31 2c 20 30 29 2c  OOP(lead, 1, 0),
3ea0: 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e  .    WINDOWFUNCN
3eb0: 4f 4f 50 28 6c 65 61 64 2c 20 32 2c 20 30 29 2c  OOP(lead, 2, 0),
3ec0: 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e  .    WINDOWFUNCN
3ed0: 4f 4f 50 28 6c 65 61 64 2c 20 33 2c 20 30 29 2c  OOP(lead, 3, 0),
3ee0: 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e  .    WINDOWFUNCN
3ef0: 4f 4f 50 28 6c 61 67 2c 20 31 2c 20 30 29 2c 0a  OOP(lag, 1, 0),.
3f00: 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f      WINDOWFUNCNO
3f10: 4f 50 28 6c 61 67 2c 20 32 2c 20 30 29 2c 0a 20  OP(lag, 2, 0),. 
3f20: 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f 4f     WINDOWFUNCNOO
3f30: 50 28 6c 61 67 2c 20 33 2c 20 30 29 2c 0a 20 20  P(lag, 3, 0),.  
3f40: 7d 3b 0a 20 20 73 71 6c 69 74 65 33 49 6e 73 65  };.  sqlite3Inse
3f50: 72 74 42 75 69 6c 74 69 6e 46 75 6e 63 73 28 61  rtBuiltinFuncs(a
3f60: 57 69 6e 64 6f 77 46 75 6e 63 73 2c 20 41 72 72  WindowFuncs, Arr
3f70: 61 79 53 69 7a 65 28 61 57 69 6e 64 6f 77 46 75  aySize(aWindowFu
3f80: 6e 63 73 29 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  ncs));.}..static
3f90: 20 57 69 6e 64 6f 77 20 2a 77 69 6e 64 6f 77 46   Window *windowF
3fa0: 69 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72 73  ind(Parse *pPars
3fb0: 65 2c 20 57 69 6e 64 6f 77 20 2a 70 4c 69 73 74  e, Window *pList
3fc0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
3fd0: 61 6d 65 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a  ame){.  Window *
3fe0: 70 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  p;.  for(p=pList
3ff0: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 57  ; p; p=p->pNextW
4000: 69 6e 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  in){.    if( sql
4010: 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 7a  ite3StrICmp(p->z
4020: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20  Name, zName)==0 
4030: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69  ) break;.  }.  i
4040: 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73  f( p==0 ){.    s
4050: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
4060: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
4070: 77 69 6e 64 6f 77 3a 20 25 73 22 2c 20 7a 4e 61  window: %s", zNa
4080: 6d 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  me);.  }.  retur
4090: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n p;.}../*.** Th
40a0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
40b0: 61 6c 6c 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  alled immediatel
40c0: 79 20 61 66 74 65 72 20 72 65 73 6f 6c 76 69 6e  y after resolvin
40d0: 67 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e  g the function n
40e0: 61 6d 65 0a 2a 2a 20 66 6f 72 20 61 20 77 69 6e  ame.** for a win
40f0: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  dow function wit
4100: 68 69 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61  hin a SELECT sta
4110: 74 65 6d 65 6e 74 2e 20 41 72 67 75 6d 65 6e 74  tement. Argument
4120: 20 70 4c 69 73 74 20 69 73 20 61 0a 2a 2a 20 6c   pList is a.** l
4130: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 57 49  inked list of WI
4140: 4e 44 4f 57 20 64 65 66 69 6e 69 74 69 6f 6e 73  NDOW definitions
4150: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
4160: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
4170: 74 2e 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  t..** Argument p
4180: 46 75 6e 63 20 69 73 20 74 68 65 20 66 75 6e 63  Func is the func
4190: 74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20  tion definition 
41a0: 6a 75 73 74 20 72 65 73 6f 6c 76 65 64 20 61 6e  just resolved an
41b0: 64 20 70 57 69 6e 0a 2a 2a 20 69 73 20 74 68 65  d pWin.** is the
41c0: 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 72   Window object r
41d0: 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20  epresenting the 
41e0: 61 73 73 6f 63 69 61 74 65 64 20 4f 56 45 52 20  associated OVER 
41f0: 63 6c 61 75 73 65 2e 20 54 68 69 73 0a 2a 2a 20  clause. This.** 
4200: 66 75 6e 63 74 69 6f 6e 20 75 70 64 61 74 65 73  function updates
4210: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
4220: 20 70 57 69 6e 20 61 73 20 66 6f 6c 6c 6f 77 73   pWin as follows
4230: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74  :.**.**   * If t
4240: 68 65 20 4f 56 45 52 20 63 6c 61 75 73 65 20 72  he OVER clause r
4250: 65 66 65 72 65 64 20 74 6f 20 61 20 6e 61 6d 65  efered to a name
4260: 64 20 77 69 6e 64 6f 77 20 28 61 73 20 69 6e 20  d window (as in 
4270: 22 6d 61 78 28 78 29 20 4f 56 45 52 20 77 69 6e  "max(x) OVER win
4280: 22 29 2c 0a 2a 2a 20 20 20 20 20 73 65 61 72 63  "),.**     searc
4290: 68 20 6c 69 73 74 20 70 4c 69 73 74 20 66 6f 72  h list pList for
42a0: 20 61 20 6d 61 74 63 68 69 6e 67 20 57 49 4e 44   a matching WIND
42b0: 4f 57 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 61  OW definition, a
42c0: 6e 64 20 75 70 64 61 74 65 20 70 57 69 6e 0a 2a  nd update pWin.*
42d0: 2a 20 20 20 20 20 61 63 63 6f 72 64 69 6e 67 6c  *     accordingl
42e0: 79 2e 20 49 66 20 6e 6f 20 73 75 63 68 20 57 49  y. If no such WI
42f0: 4e 44 4f 57 20 63 6c 61 75 73 65 20 63 61 6e 20  NDOW clause can 
4300: 62 65 20 66 6f 75 6e 64 2c 20 6c 65 61 76 65 20  be found, leave 
4310: 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 20 20 20 20  an error.**     
4320: 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a  in pParse..**.**
4330: 20 20 20 2a 20 49 66 20 74 68 65 20 66 75 6e 63     * If the func
4340: 74 69 6f 6e 20 69 73 20 61 20 62 75 69 6c 74 2d  tion is a built-
4350: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
4360: 6f 6e 20 74 68 61 74 20 72 65 71 75 69 72 65 73  on that requires
4370: 20 74 68 65 0a 2a 2a 20 20 20 20 20 77 69 6e 64   the.**     wind
4380: 6f 77 20 74 6f 20 62 65 20 63 6f 65 72 63 65 64  ow to be coerced
4390: 20 28 73 65 65 20 22 42 55 49 4c 54 2d 49 4e 20   (see "BUILT-IN 
43a0: 57 49 4e 44 4f 57 20 46 55 4e 43 54 49 4f 4e 53  WINDOW FUNCTIONS
43b0: 22 20 61 74 20 74 68 65 20 74 6f 70 0a 2a 2a 20  " at the top.** 
43c0: 20 20 20 20 6f 66 20 74 68 69 73 20 66 69 6c 65      of this file
43d0: 29 2c 20 70 57 69 6e 20 69 73 20 75 70 64 61 74  ), pWin is updat
43e0: 65 64 20 68 65 72 65 2e 0a 2a 2f 0a 76 6f 69 64  ed here..*/.void
43f0: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 55 70   sqlite3WindowUp
4400: 64 61 74 65 28 0a 20 20 50 61 72 73 65 20 2a 70  date(.  Parse *p
4410: 50 61 72 73 65 2c 20 0a 20 20 57 69 6e 64 6f 77  Parse, .  Window
4420: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
4430: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
4440: 74 20 6f 66 20 6e 61 6d 65 64 20 77 69 6e 64 6f  t of named windo
4450: 77 73 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45  ws for this SELE
4460: 43 54 20 2a 2f 0a 20 20 57 69 6e 64 6f 77 20 2a  CT */.  Window *
4470: 70 57 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20  pWin,           
4480: 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6e 64 6f          /* Windo
4490: 77 20 66 72 61 6d 65 20 74 6f 20 75 70 64 61 74  w frame to updat
44a0: 65 20 2a 2f 0a 20 20 46 75 6e 63 44 65 66 20 2a  e */.  FuncDef *
44b0: 70 46 75 6e 63 20 20 20 20 20 20 20 20 20 20 20  pFunc           
44c0: 20 20 20 20 20 20 20 2f 2a 20 57 69 6e 64 6f 77         /* Window
44d0: 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69   function defini
44e0: 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  tion */.){.  if(
44f0: 20 70 57 69 6e 2d 3e 7a 4e 61 6d 65 20 26 26 20   pWin->zName && 
4500: 70 57 69 6e 2d 3e 65 54 79 70 65 3d 3d 30 20 29  pWin->eType==0 )
4510: 7b 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a 70 20  {.    Window *p 
4520: 3d 20 77 69 6e 64 6f 77 46 69 6e 64 28 70 50 61  = windowFind(pPa
4530: 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 57 69 6e  rse, pList, pWin
4540: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ->zName);.    if
4550: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
4560: 0a 20 20 20 20 70 57 69 6e 2d 3e 70 50 61 72 74  .    pWin->pPart
4570: 69 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 45  ition = sqlite3E
4580: 78 70 72 4c 69 73 74 44 75 70 28 70 50 61 72 73  xprListDup(pPars
4590: 65 2d 3e 64 62 2c 20 70 2d 3e 70 50 61 72 74 69  e->db, p->pParti
45a0: 74 69 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 70 57  tion, 0);.    pW
45b0: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73  in->pOrderBy = s
45c0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
45d0: 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d  p(pParse->db, p-
45e0: 3e 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 20  >pOrderBy, 0);. 
45f0: 20 20 20 70 57 69 6e 2d 3e 70 53 74 61 72 74 20     pWin->pStart 
4600: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
4610: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e  (pParse->db, p->
4620: 70 53 74 61 72 74 2c 20 30 29 3b 0a 20 20 20 20  pStart, 0);.    
4630: 70 57 69 6e 2d 3e 70 45 6e 64 20 3d 20 73 71 6c  pWin->pEnd = sql
4640: 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72  ite3ExprDup(pPar
4650: 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 45 6e 64 2c  se->db, p->pEnd,
4660: 20 30 29 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 65   0);.    pWin->e
4670: 53 74 61 72 74 20 3d 20 70 2d 3e 65 53 74 61 72  Start = p->eStar
4680: 74 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 65 45 6e  t;.    pWin->eEn
4690: 64 20 3d 20 70 2d 3e 65 45 6e 64 3b 0a 20 20 20  d = p->eEnd;.   
46a0: 20 70 57 69 6e 2d 3e 65 54 79 70 65 20 3d 20 70   pWin->eType = p
46b0: 2d 3e 65 54 79 70 65 3b 0a 20 20 7d 65 6c 73 65  ->eType;.  }else
46c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e  {.    sqlite3Win
46d0: 64 6f 77 43 68 61 69 6e 28 70 50 61 72 73 65 2c  dowChain(pParse,
46e0: 20 70 57 69 6e 2c 20 70 4c 69 73 74 29 3b 0a 20   pWin, pList);. 
46f0: 20 7d 0a 20 20 69 66 28 20 28 70 57 69 6e 2d 3e   }.  if( (pWin->
4700: 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 29  eType==TK_RANGE)
4710: 0a 20 20 20 26 26 20 28 70 57 69 6e 2d 3e 70 53  .   && (pWin->pS
4720: 74 61 72 74 20 7c 7c 20 70 57 69 6e 2d 3e 70 45  tart || pWin->pE
4730: 6e 64 29 20 0a 20 20 20 26 26 20 28 70 57 69 6e  nd) .   && (pWin
4740: 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c  ->pOrderBy==0 ||
4750: 20 70 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 2d   pWin->pOrderBy-
4760: 3e 6e 45 78 70 72 21 3d 31 29 0a 20 20 29 7b 0a  >nExpr!=1).  ){.
4770: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
4780: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
4790: 20 20 20 22 52 41 4e 47 45 20 77 69 74 68 20 6f     "RANGE with o
47a0: 66 66 73 65 74 20 50 52 45 43 45 44 49 4e 47 2f  ffset PRECEDING/
47b0: 46 4f 4c 4c 4f 57 49 4e 47 20 72 65 71 75 69 72  FOLLOWING requir
47c0: 65 73 20 6f 6e 65 20 4f 52 44 45 52 20 42 59 20  es one ORDER BY 
47d0: 65 78 70 72 65 73 73 69 6f 6e 22 0a 20 20 20 20  expression".    
47e0: 29 3b 0a 20 20 7d 65 6c 73 65 0a 20 20 69 66 28  );.  }else.  if(
47f0: 20 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67   pFunc->funcFlag
4800: 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
4810: 57 49 4e 44 4f 57 20 29 7b 0a 20 20 20 20 73 71  WINDOW ){.    sq
4820: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
4830: 73 65 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28 20  se->db;.    if( 
4840: 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72 20 29 7b  pWin->pFilter ){
4850: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
4860: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
4870: 20 20 20 20 20 20 20 20 20 20 22 46 49 4c 54 45            "FILTE
4880: 52 20 63 6c 61 75 73 65 20 6d 61 79 20 6f 6e 6c  R clause may onl
4890: 79 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61  y be used with a
48a0: 67 67 72 65 67 61 74 65 20 77 69 6e 64 6f 77 20  ggregate window 
48b0: 66 75 6e 63 74 69 6f 6e 73 22 0a 20 20 20 20 20  functions".     
48c0: 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 20 20   );.    }else.  
48d0: 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 7a 4e 61    if( pFunc->zNa
48e0: 6d 65 3d 3d 72 6f 77 5f 6e 75 6d 62 65 72 4e 61  me==row_numberNa
48f0: 6d 65 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61  me || pFunc->zNa
4900: 6d 65 3d 3d 6e 74 69 6c 65 4e 61 6d 65 20 29 7b  me==ntileName ){
4910: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
4920: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 57 69  prDelete(db, pWi
4930: 6e 2d 3e 70 53 74 61 72 74 29 3b 0a 20 20 20 20  n->pStart);.    
4940: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
4950: 65 74 65 28 64 62 2c 20 70 57 69 6e 2d 3e 70 45  ete(db, pWin->pE
4960: 6e 64 29 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d  nd);.      pWin-
4970: 3e 70 53 74 61 72 74 20 3d 20 70 57 69 6e 2d 3e  >pStart = pWin->
4980: 70 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  pEnd = 0;.      
4990: 70 57 69 6e 2d 3e 65 54 79 70 65 20 3d 20 54 4b  pWin->eType = TK
49a0: 5f 52 4f 57 53 3b 0a 20 20 20 20 20 20 70 57 69  _ROWS;.      pWi
49b0: 6e 2d 3e 65 53 74 61 72 74 20 3d 20 54 4b 5f 55  n->eStart = TK_U
49c0: 4e 42 4f 55 4e 44 45 44 3b 0a 20 20 20 20 20 20  NBOUNDED;.      
49d0: 70 57 69 6e 2d 3e 65 45 6e 64 20 3d 20 54 4b 5f  pWin->eEnd = TK_
49e0: 43 55 52 52 45 4e 54 3b 0a 20 20 20 20 7d 65 6c  CURRENT;.    }el
49f0: 73 65 0a 0a 20 20 20 20 69 66 28 20 70 46 75 6e  se..    if( pFun
4a00: 63 2d 3e 7a 4e 61 6d 65 3d 3d 64 65 6e 73 65 5f  c->zName==dense_
4a10: 72 61 6e 6b 4e 61 6d 65 20 7c 7c 20 70 46 75 6e  rankName || pFun
4a20: 63 2d 3e 7a 4e 61 6d 65 3d 3d 72 61 6e 6b 4e 61  c->zName==rankNa
4a30: 6d 65 0a 20 20 20 20 20 7c 7c 20 70 46 75 6e 63  me.     || pFunc
4a40: 2d 3e 7a 4e 61 6d 65 3d 3d 70 65 72 63 65 6e 74  ->zName==percent
4a50: 5f 72 61 6e 6b 4e 61 6d 65 20 7c 7c 20 70 46 75  _rankName || pFu
4a60: 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 63 75 6d 65 5f  nc->zName==cume_
4a70: 64 69 73 74 4e 61 6d 65 0a 20 20 20 20 29 7b 0a  distName.    ){.
4a80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
4a90: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 57 69 6e  rDelete(db, pWin
4aa0: 2d 3e 70 53 74 61 72 74 29 3b 0a 20 20 20 20 20  ->pStart);.     
4ab0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
4ac0: 74 65 28 64 62 2c 20 70 57 69 6e 2d 3e 70 45 6e  te(db, pWin->pEn
4ad0: 64 29 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e  d);.      pWin->
4ae0: 70 53 74 61 72 74 20 3d 20 70 57 69 6e 2d 3e 70  pStart = pWin->p
4af0: 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  End = 0;.      p
4b00: 57 69 6e 2d 3e 65 54 79 70 65 20 3d 20 54 4b 5f  Win->eType = TK_
4b10: 52 41 4e 47 45 3b 0a 20 20 20 20 20 20 70 57 69  RANGE;.      pWi
4b20: 6e 2d 3e 65 53 74 61 72 74 20 3d 20 54 4b 5f 55  n->eStart = TK_U
4b30: 4e 42 4f 55 4e 44 45 44 3b 0a 20 20 20 20 20 20  NBOUNDED;.      
4b40: 70 57 69 6e 2d 3e 65 45 6e 64 20 3d 20 54 4b 5f  pWin->eEnd = TK_
4b50: 43 55 52 52 45 4e 54 3b 0a 20 20 20 20 7d 0a 20  CURRENT;.    }. 
4b60: 20 7d 0a 20 20 70 57 69 6e 2d 3e 70 46 75 6e 63   }.  pWin->pFunc
4b70: 20 3d 20 70 46 75 6e 63 3b 0a 7d 0a 0a 2f 2a 0a   = pFunc;.}../*.
4b80: 2a 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63  ** Context objec
4b90: 74 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  t passed through
4ba0: 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
4bb0: 4c 69 73 74 28 29 20 74 6f 0a 2a 2a 20 73 65 6c  List() to.** sel
4bc0: 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65  ectWindowRewrite
4bd0: 45 78 70 72 43 62 28 29 20 62 79 20 73 65 6c 65  ExprCb() by sele
4be0: 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65 45  ctWindowRewriteE
4bf0: 4c 69 73 74 28 29 2e 0a 2a 2f 0a 74 79 70 65 64  List()..*/.typed
4c00: 65 66 20 73 74 72 75 63 74 20 57 69 6e 64 6f 77  ef struct Window
4c10: 52 65 77 72 69 74 65 20 57 69 6e 64 6f 77 52 65  Rewrite WindowRe
4c20: 77 72 69 74 65 3b 0a 73 74 72 75 63 74 20 57 69  write;.struct Wi
4c30: 6e 64 6f 77 52 65 77 72 69 74 65 20 7b 0a 20 20  ndowRewrite {.  
4c40: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20  Window *pWin;.  
4c50: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20  SrcList *pSrc;. 
4c60: 20 45 78 70 72 4c 69 73 74 20 2a 70 53 75 62 3b   ExprList *pSub;
4c70: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 53  .  Select *pSubS
4c80: 65 6c 65 63 74 3b 20 20 20 20 20 20 20 20 20 20  elect;          
4c90: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 75     /* Current su
4ca0: 62 2d 73 65 6c 65 63 74 2c 20 69 66 20 61 6e 79  b-select, if any
4cb0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61   */.};../*.** Ca
4cc0: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
4cd0: 75 73 65 64 20 62 79 20 73 65 6c 65 63 74 57 69  used by selectWi
4ce0: 6e 64 6f 77 52 65 77 72 69 74 65 45 4c 69 73 74  ndowRewriteEList
4cf0: 28 29 2e 20 49 66 20 6e 65 63 65 73 73 61 72 79  (). If necessary
4d00: 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  ,.** this functi
4d10: 6f 6e 20 61 70 70 65 6e 64 73 20 74 6f 20 74 68  on appends to th
4d20: 65 20 6f 75 74 70 75 74 20 65 78 70 72 65 73 73  e output express
4d30: 69 6f 6e 2d 6c 69 73 74 20 61 6e 64 20 75 70 64  ion-list and upd
4d40: 61 74 65 73 20 0a 2a 2a 20 65 78 70 72 65 73 73  ates .** express
4d50: 69 6f 6e 20 28 2a 70 70 45 78 70 72 29 20 69 6e  ion (*ppExpr) in
4d60: 20 70 6c 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69   place..*/.stati
4d70: 63 20 69 6e 74 20 73 65 6c 65 63 74 57 69 6e 64  c int selectWind
4d80: 6f 77 52 65 77 72 69 74 65 45 78 70 72 43 62 28  owRewriteExprCb(
4d90: 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
4da0: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
4db0: 20 73 74 72 75 63 74 20 57 69 6e 64 6f 77 52 65   struct WindowRe
4dc0: 77 72 69 74 65 20 2a 70 20 3d 20 70 57 61 6c 6b  write *p = pWalk
4dd0: 65 72 2d 3e 75 2e 70 52 65 77 72 69 74 65 3b 0a  er->u.pRewrite;.
4de0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
4df0: 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
4e00: 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  e;..  /* If this
4e10: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69   function is bei
4e20: 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77  ng called from w
4e30: 69 74 68 69 6e 20 61 20 73 63 61 6c 61 72 20 73  ithin a scalar s
4e40: 75 62 2d 73 65 6c 65 63 74 0a 20 20 2a 2a 20 74  ub-select.  ** t
4e50: 68 61 74 20 75 73 65 64 20 62 79 20 74 68 65 20  hat used by the 
4e60: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
4e70: 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64   being processed
4e80: 2c 20 6f 6e 6c 79 20 70 72 6f 63 65 73 73 0a 20  , only process. 
4e90: 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 20 65 78   ** TK_COLUMN ex
4ea0: 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72  pressions that r
4eb0: 65 66 65 72 20 74 6f 20 69 74 20 28 74 68 65 20  efer to it (the 
4ec0: 6f 75 74 65 72 20 53 45 4c 45 43 54 29 2e 20 44  outer SELECT). D
4ed0: 6f 0a 20 20 2a 2a 20 6e 6f 74 20 70 72 6f 63 65  o.  ** not proce
4ee0: 73 73 20 61 67 67 72 65 67 61 74 65 73 20 6f 72  ss aggregates or
4ef0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
4f00: 73 20 61 74 20 61 6c 6c 2c 20 61 73 20 74 68 65  s at all, as the
4f10: 79 20 62 65 6c 6f 6e 67 0a 20 20 2a 2a 20 74 6f  y belong.  ** to
4f20: 20 74 68 65 20 73 63 61 6c 61 72 20 73 75 62 2d   the scalar sub-
4f30: 73 65 6c 65 63 74 2e 20 20 2a 2f 0a 20 20 69 66  select.  */.  if
4f40: 28 20 70 2d 3e 70 53 75 62 53 65 6c 65 63 74 20  ( p->pSubSelect 
4f50: 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  ){.    if( pExpr
4f60: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
4f70: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
4f80: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
4f90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
4fa0: 6e 74 20 6e 53 72 63 20 3d 20 70 2d 3e 70 53 72  nt nSrc = p->pSr
4fb0: 63 2d 3e 6e 53 72 63 3b 0a 20 20 20 20 20 20 69  c->nSrc;.      i
4fc0: 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
4fd0: 69 3d 30 3b 20 69 3c 6e 53 72 63 3b 20 69 2b 2b  i=0; i<nSrc; i++
4fe0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
4ff0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 2d  Expr->iTable==p-
5000: 3e 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72  >pSrc->a[i].iCur
5010: 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  sor ) break;.   
5020: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
5030: 3d 3d 6e 53 72 63 20 29 20 72 65 74 75 72 6e 20  ==nSrc ) return 
5040: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
5050: 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63    }.  }..  switc
5060: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
5070: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
5080: 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28  CTION:.      if(
5090: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
50a0: 79 28 70 45 78 70 72 2c 20 45 50 5f 57 69 6e 46  y(pExpr, EP_WinF
50b0: 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  unc) ){.        
50c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c  break;.      }el
50d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 57 69 6e 64  se{.        Wind
50e0: 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 20 20 20 20  ow *pWin;.      
50f0: 20 20 66 6f 72 28 70 57 69 6e 3d 70 2d 3e 70 57    for(pWin=p->pW
5100: 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70  in; pWin; pWin=p
5110: 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a  Win->pNextWin){.
5120: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
5130: 78 70 72 2d 3e 79 2e 70 57 69 6e 3d 3d 70 57 69  xpr->y.pWin==pWi
5140: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
5150: 20 61 73 73 65 72 74 28 20 70 57 69 6e 2d 3e 70   assert( pWin->p
5160: 4f 77 6e 65 72 3d 3d 70 45 78 70 72 20 29 3b 0a  Owner==pExpr );.
5170: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
5180: 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
5190: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
51a0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
51b0: 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67    /* Fall throug
51c0: 68 2e 20 20 2a 2f 0a 0a 20 20 20 20 63 61 73 65  h.  */..    case
51d0: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
51e0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
51f0: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78  LUMN: {.      Ex
5200: 70 72 20 2a 70 44 75 70 20 3d 20 73 71 6c 69 74  pr *pDup = sqlit
5210: 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65  e3ExprDup(pParse
5220: 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b  ->db, pExpr, 0);
5230: 0a 20 20 20 20 20 20 70 2d 3e 70 53 75 62 20 3d  .      p->pSub =
5240: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
5250: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
5260: 2d 3e 70 53 75 62 2c 20 70 44 75 70 29 3b 0a 20  ->pSub, pDup);. 
5270: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 53 75 62       if( p->pSub
5280: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
5290: 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  rt( ExprHasPrope
52a0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 74  rty(pExpr, EP_St
52b0: 61 74 69 63 29 3d 3d 30 20 29 3b 0a 20 20 20 20  atic)==0 );.    
52c0: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
52d0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 74  rty(pExpr, EP_St
52e0: 61 74 69 63 29 3b 0a 20 20 20 20 20 20 20 20 73  atic);.        s
52f0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
5300: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78  (pParse->db, pEx
5310: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70  pr);.        Exp
5320: 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 70  rClearProperty(p
5330: 45 78 70 72 2c 20 45 50 5f 53 74 61 74 69 63 29  Expr, EP_Static)
5340: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ;.        memset
5350: 28 70 45 78 70 72 2c 20 30 2c 20 73 69 7a 65 6f  (pExpr, 0, sizeo
5360: 66 28 45 78 70 72 29 29 3b 0a 0a 20 20 20 20 20  f(Expr));..     
5370: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
5380: 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20  K_COLUMN;.      
5390: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
53a0: 20 3d 20 70 2d 3e 70 53 75 62 2d 3e 6e 45 78 70   = p->pSub->nExp
53b0: 72 2d 31 3b 0a 20 20 20 20 20 20 20 20 70 45 78  r-1;.        pEx
53c0: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 2d 3e  pr->iTable = p->
53d0: 70 57 69 6e 2d 3e 69 45 70 68 43 73 72 3b 0a 20  pWin->iEphCsr;. 
53e0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62 72       }..      br
53f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
5400: 64 65 66 61 75 6c 74 3a 20 2f 2a 20 6e 6f 2d 6f  default: /* no-o
5410: 70 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  p */.      break
5420: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
5430: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
5440: 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63  static int selec
5450: 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65 53 65  tWindowRewriteSe
5460: 6c 65 63 74 43 62 28 57 61 6c 6b 65 72 20 2a 70  lectCb(Walker *p
5470: 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
5480: 70 53 65 6c 65 63 74 29 7b 0a 20 20 73 74 72 75  pSelect){.  stru
5490: 63 74 20 57 69 6e 64 6f 77 52 65 77 72 69 74 65  ct WindowRewrite
54a0: 20 2a 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75   *p = pWalker->u
54b0: 2e 70 52 65 77 72 69 74 65 3b 0a 20 20 53 65 6c  .pRewrite;.  Sel
54c0: 65 63 74 20 2a 70 53 61 76 65 20 3d 20 70 2d 3e  ect *pSave = p->
54d0: 70 53 75 62 53 65 6c 65 63 74 3b 0a 20 20 69 66  pSubSelect;.  if
54e0: 28 20 70 53 61 76 65 3d 3d 70 53 65 6c 65 63 74  ( pSave==pSelect
54f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   ){.    return W
5500: 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d  RC_Continue;.  }
5510: 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 70 53 75  else{.    p->pSu
5520: 62 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63  bSelect = pSelec
5530: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61  t;.    sqlite3Wa
5540: 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
5550: 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  , pSelect);.    
5560: 70 2d 3e 70 53 75 62 53 65 6c 65 63 74 20 3d 20  p->pSubSelect = 
5570: 70 53 61 76 65 3b 0a 20 20 7d 0a 20 20 72 65 74  pSave;.  }.  ret
5580: 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 7d  urn WRC_Prune;.}
5590: 0a 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 65  .../*.** Iterate
55a0: 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78   through each ex
55b0: 70 72 65 73 73 69 6f 6e 20 69 6e 20 65 78 70 72  pression in expr
55c0: 65 73 73 69 6f 6e 2d 6c 69 73 74 20 70 45 4c 69  ession-list pELi
55d0: 73 74 2e 20 46 6f 72 20 65 61 63 68 3a 0a 2a 2a  st. For each:.**
55e0: 0a 2a 2a 20 20 20 2a 20 54 4b 5f 43 4f 4c 55 4d  .**   * TK_COLUM
55f0: 4e 2c 0a 2a 2a 20 20 20 2a 20 61 67 67 72 65 67  N,.**   * aggreg
5600: 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 72  ate function, or
5610: 0a 2a 2a 20 20 20 2a 20 77 69 6e 64 6f 77 20 66  .**   * window f
5620: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 61 20 57  unction with a W
5630: 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 74 68 61  indow object tha
5640: 74 20 69 73 20 6e 6f 74 20 61 20 6d 65 6d 62 65  t is not a membe
5650: 72 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20 20  r of the .**    
5660: 20 57 69 6e 64 6f 77 20 6c 69 73 74 20 70 61 73   Window list pas
5670: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
5680: 64 20 61 72 67 75 6d 65 6e 74 20 28 70 57 69 6e  d argument (pWin
5690: 29 2e 0a 2a 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  )..**.** Append 
56a0: 74 68 65 20 6e 6f 64 65 20 74 6f 20 6f 75 74 70  the node to outp
56b0: 75 74 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69  ut expression-li
56c0: 73 74 20 28 2a 70 70 53 75 62 29 2e 20 41 6e 64  st (*ppSub). And
56d0: 20 72 65 70 6c 61 63 65 20 69 74 0a 2a 2a 20 77   replace it.** w
56e0: 69 74 68 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20  ith a TK_COLUMN 
56f0: 74 68 61 74 20 72 65 61 64 73 20 74 68 65 20 28  that reads the (
5700: 4e 2d 31 29 74 68 20 65 6c 65 6d 65 6e 74 20 6f  N-1)th element o
5710: 66 20 74 61 62 6c 65 20 0a 2a 2a 20 70 57 69 6e  f table .** pWin
5720: 2d 3e 69 45 70 68 43 73 72 2c 20 77 68 65 72 65  ->iEphCsr, where
5730: 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   N is the number
5740: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
5750: 28 2a 70 70 53 75 62 29 20 61 66 74 65 72 0a 2a  (*ppSub) after.*
5760: 2a 20 61 70 70 65 6e 64 69 6e 67 20 74 68 65 20  * appending the 
5770: 6e 65 77 20 6f 6e 65 2e 0a 2a 2f 0a 73 74 61 74  new one..*/.stat
5780: 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 57 69  ic void selectWi
5790: 6e 64 6f 77 52 65 77 72 69 74 65 45 4c 69 73 74  ndowRewriteEList
57a0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
57b0: 65 2c 20 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57  e, .  Window *pW
57c0: 69 6e 2c 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  in,.  SrcList *p
57d0: 53 72 63 2c 0a 20 20 45 78 70 72 4c 69 73 74 20  Src,.  ExprList 
57e0: 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 20  *pEList,        
57f0: 20 20 20 20 20 20 20 2f 2a 20 52 65 77 72 69 74         /* Rewrit
5800: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  e expressions in
5810: 20 74 68 69 73 20 6c 69 73 74 20 2a 2f 0a 20 20   this list */.  
5820: 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 53 75 62  ExprList **ppSub
5830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5840: 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 75 62 2d 73  /* IN/OUT: Sub-s
5850: 65 6c 65 63 74 20 65 78 70 72 65 73 73 69 6f 6e  elect expression
5860: 2d 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 57 61  -list */.){.  Wa
5870: 6c 6b 65 72 20 73 57 61 6c 6b 65 72 3b 0a 20 20  lker sWalker;.  
5880: 57 69 6e 64 6f 77 52 65 77 72 69 74 65 20 73 52  WindowRewrite sR
5890: 65 77 72 69 74 65 3b 0a 0a 20 20 6d 65 6d 73 65  ewrite;..  memse
58a0: 74 28 26 73 57 61 6c 6b 65 72 2c 20 30 2c 20 73  t(&sWalker, 0, s
58b0: 69 7a 65 6f 66 28 57 61 6c 6b 65 72 29 29 3b 0a  izeof(Walker));.
58c0: 20 20 6d 65 6d 73 65 74 28 26 73 52 65 77 72 69    memset(&sRewri
58d0: 74 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57 69  te, 0, sizeof(Wi
58e0: 6e 64 6f 77 52 65 77 72 69 74 65 29 29 3b 0a 0a  ndowRewrite));..
58f0: 20 20 73 52 65 77 72 69 74 65 2e 70 53 75 62 20    sRewrite.pSub 
5900: 3d 20 2a 70 70 53 75 62 3b 0a 20 20 73 52 65 77  = *ppSub;.  sRew
5910: 72 69 74 65 2e 70 57 69 6e 20 3d 20 70 57 69 6e  rite.pWin = pWin
5920: 3b 0a 20 20 73 52 65 77 72 69 74 65 2e 70 53 72  ;.  sRewrite.pSr
5930: 63 20 3d 20 70 53 72 63 3b 0a 0a 20 20 73 57 61  c = pSrc;..  sWa
5940: 6c 6b 65 72 2e 70 50 61 72 73 65 20 3d 20 70 50  lker.pParse = pP
5950: 61 72 73 65 3b 0a 20 20 73 57 61 6c 6b 65 72 2e  arse;.  sWalker.
5960: 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
5970: 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72  selectWindowRewr
5980: 69 74 65 45 78 70 72 43 62 3b 0a 20 20 73 57 61  iteExprCb;.  sWa
5990: 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c  lker.xSelectCall
59a0: 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 57 69 6e  back = selectWin
59b0: 64 6f 77 52 65 77 72 69 74 65 53 65 6c 65 63 74  dowRewriteSelect
59c0: 43 62 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 75 2e  Cb;.  sWalker.u.
59d0: 70 52 65 77 72 69 74 65 20 3d 20 26 73 52 65 77  pRewrite = &sRew
59e0: 72 69 74 65 3b 0a 0a 20 20 28 76 6f 69 64 29 73  rite;..  (void)s
59f0: 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69  qlite3WalkExprLi
5a00: 73 74 28 26 73 57 61 6c 6b 65 72 2c 20 70 45 4c  st(&sWalker, pEL
5a10: 69 73 74 29 3b 0a 0a 20 20 2a 70 70 53 75 62 20  ist);..  *ppSub 
5a20: 3d 20 73 52 65 77 72 69 74 65 2e 70 53 75 62 3b  = sRewrite.pSub;
5a30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
5a40: 20 61 20 63 6f 70 79 20 6f 66 20 65 61 63 68 20   a copy of each 
5a50: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 65 78  expression in ex
5a60: 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 70 41  pression-list pA
5a70: 70 70 65 6e 64 20 74 6f 0a 2a 2a 20 65 78 70 72  ppend to.** expr
5a80: 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 4c 69 73  ession list pLis
5a90: 74 2e 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  t. Return a poin
5aa0: 74 65 72 20 74 6f 20 74 68 65 20 72 65 73 75 6c  ter to the resul
5ab0: 74 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  t list..*/.stati
5ac0: 63 20 45 78 70 72 4c 69 73 74 20 2a 65 78 70 72  c ExprList *expr
5ad0: 4c 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28 0a  ListAppendList(.
5ae0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
5af0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
5b00: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
5b10: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
5b20: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  t,        /* Lis
5b30: 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70  t to which to ap
5b40: 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e  pend. Might be N
5b50: 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
5b60: 74 20 2a 70 41 70 70 65 6e 64 20 20 20 20 20 20  t *pAppend      
5b70: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75   /* List of valu
5b80: 65 73 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69  es to append. Mi
5b90: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29  ght be NULL */.)
5ba0: 7b 0a 20 20 69 66 28 20 70 41 70 70 65 6e 64 20  {.  if( pAppend 
5bb0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
5bc0: 20 20 69 6e 74 20 6e 49 6e 69 74 20 3d 20 70 4c    int nInit = pL
5bd0: 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78  ist ? pList->nEx
5be0: 70 72 20 3a 20 30 3b 0a 20 20 20 20 66 6f 72 28  pr : 0;.    for(
5bf0: 69 3d 30 3b 20 69 3c 70 41 70 70 65 6e 64 2d 3e  i=0; i<pAppend->
5c00: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
5c10: 20 20 20 45 78 70 72 20 2a 70 44 75 70 20 3d 20     Expr *pDup = 
5c20: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
5c30: 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 70 70 65  Parse->db, pAppe
5c40: 6e 64 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  nd->a[i].pExpr, 
5c50: 30 29 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 20  0);.      pList 
5c60: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
5c70: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
5c80: 70 4c 69 73 74 2c 20 70 44 75 70 29 3b 0a 20 20  pList, pDup);.  
5c90: 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 20      if( pList ) 
5ca0: 70 4c 69 73 74 2d 3e 61 5b 6e 49 6e 69 74 2b 69  pList->a[nInit+i
5cb0: 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 41  ].sortOrder = pA
5cc0: 70 70 65 6e 64 2d 3e 61 5b 69 5d 2e 73 6f 72 74  ppend->a[i].sort
5cd0: 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  Order;.    }.  }
5ce0: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
5cf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
5d00: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
5d10: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
5d20: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
5d30: 64 6f 65 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 0a  does not invoke.
5d40: 2a 2a 20 61 6e 79 20 53 51 4c 20 77 69 6e 64 6f  ** any SQL windo
5d50: 77 20 66 75 6e 63 74 69 6f 6e 73 2c 20 74 68 69  w functions, thi
5d60: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
5d70: 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
5d80: 2c 20 69 74 20 0a 2a 2a 20 72 65 77 72 69 74 65  , it .** rewrite
5d90: 73 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  s the SELECT sta
5da0: 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77  tement so that w
5db0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 78  indow function x
5dc0: 53 74 65 70 20 66 75 6e 63 74 69 6f 6e 73 0a 2a  Step functions.*
5dd0: 2a 20 61 72 65 20 69 6e 76 6f 6b 65 64 20 69 6e  * are invoked in
5de0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64   the correct ord
5df0: 65 72 20 61 73 20 64 65 73 63 72 69 62 65 64 20  er as described 
5e00: 75 6e 64 65 72 20 22 53 45 4c 45 43 54 20 52 45  under "SELECT RE
5e10: 57 52 49 54 49 4e 47 22 0a 2a 2a 20 61 74 20 74  WRITING".** at t
5e20: 68 65 20 74 6f 70 20 6f 66 20 74 68 69 73 20 66  he top of this f
5e30: 69 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ile..*/.int sqli
5e40: 74 65 33 57 69 6e 64 6f 77 52 65 77 72 69 74 65  te3WindowRewrite
5e50: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
5e60: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e  Select *p){.  in
5e70: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
5e80: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 57 69 6e 20  ;.  if( p->pWin 
5e90: 26 26 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  && p->pPrior==0 
5ea0: 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  ){.    Vdbe *v =
5eb0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
5ec0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 73 71 6c  pParse);.    sql
5ed0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
5ee0: 65 2d 3e 64 62 3b 0a 20 20 20 20 53 65 6c 65 63  e->db;.    Selec
5ef0: 74 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20  t *pSub = 0;    
5f00: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
5f10: 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  subquery */.    
5f20: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20  SrcList *pSrc = 
5f30: 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 45 78 70  p->pSrc;.    Exp
5f40: 72 20 2a 70 57 68 65 72 65 20 3d 20 70 2d 3e 70  r *pWhere = p->p
5f50: 57 68 65 72 65 3b 0a 20 20 20 20 45 78 70 72 4c  Where;.    ExprL
5f60: 69 73 74 20 2a 70 47 72 6f 75 70 42 79 20 3d 20  ist *pGroupBy = 
5f70: 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  p->pGroupBy;.   
5f80: 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 20 3d   Expr *pHaving =
5f90: 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 20   p->pHaving;.   
5fa0: 20 45 78 70 72 4c 69 73 74 20 2a 70 53 6f 72 74   ExprList *pSort
5fb0: 20 3d 20 30 3b 0a 0a 20 20 20 20 45 78 70 72 4c   = 0;..    ExprL
5fc0: 69 73 74 20 2a 70 53 75 62 6c 69 73 74 20 3d 20  ist *pSublist = 
5fd0: 30 3b 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72  0;       /* Expr
5fe0: 65 73 73 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20  ession list for 
5ff0: 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 20  sub-query */.   
6000: 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d   Window *pMWin =
6010: 20 70 2d 3e 70 57 69 6e 3b 20 20 20 20 20 20 2f   p->pWin;      /
6020: 2a 20 4d 61 73 74 65 72 20 77 69 6e 64 6f 77 20  * Master window 
6030: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 57 69  object */.    Wi
6040: 6e 64 6f 77 20 2a 70 57 69 6e 3b 20 20 20 20 20  ndow *pWin;     
6050: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
6060: 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 69 74 65  indow object ite
6070: 72 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 70 2d  rator */..    p-
6080: 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 70  >pSrc = 0;.    p
6090: 2d 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20  ->pWhere = 0;.  
60a0: 20 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20    p->pGroupBy = 
60b0: 30 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e  0;.    p->pHavin
60c0: 67 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43  g = 0;..    /* C
60d0: 72 65 61 74 65 20 74 68 65 20 4f 52 44 45 52 20  reate the ORDER 
60e0: 42 59 20 63 6c 61 75 73 65 20 66 6f 72 20 74 68  BY clause for th
60f0: 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 54 68  e sub-select. Th
6100: 69 73 20 69 73 20 74 68 65 20 63 6f 6e 63 61 74  is is the concat
6110: 65 6e 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6f  enation.    ** o
6120: 66 20 74 68 65 20 77 69 6e 64 6f 77 20 50 41 52  f the window PAR
6130: 54 49 54 49 4f 4e 20 61 6e 64 20 4f 52 44 45 52  TITION and ORDER
6140: 20 42 59 20 63 6c 61 75 73 65 73 2e 20 54 68 65   BY clauses. The
6150: 6e 2c 20 69 66 20 74 68 69 73 20 6d 61 6b 65 73  n, if this makes
6160: 20 69 74 0a 20 20 20 20 2a 2a 20 72 65 64 75 6e   it.    ** redun
6170: 64 61 6e 74 2c 20 72 65 6d 6f 76 65 20 74 68 65  dant, remove the
6180: 20 4f 52 44 45 52 20 42 59 20 66 72 6f 6d 20 74   ORDER BY from t
6190: 68 65 20 70 61 72 65 6e 74 20 53 45 4c 45 43 54  he parent SELECT
61a0: 2e 20 20 2a 2f 0a 20 20 20 20 70 53 6f 72 74 20  .  */.    pSort 
61b0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
61c0: 74 44 75 70 28 64 62 2c 20 70 4d 57 69 6e 2d 3e  tDup(db, pMWin->
61d0: 70 50 61 72 74 69 74 69 6f 6e 2c 20 30 29 3b 0a  pPartition, 0);.
61e0: 20 20 20 20 70 53 6f 72 74 20 3d 20 65 78 70 72      pSort = expr
61f0: 4c 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28 70  ListAppendList(p
6200: 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 4d  Parse, pSort, pM
6210: 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  Win->pOrderBy);.
6220: 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 26 26      if( pSort &&
6230: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
6240: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
6250: 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65  3ExprListCompare
6260: 28 70 53 6f 72 74 2c 20 70 2d 3e 70 4f 72 64 65  (pSort, p->pOrde
6270: 72 42 79 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20  rBy, -1)==0 ){. 
6280: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
6290: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
62a0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
62b0: 20 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72         p->pOrder
62c0: 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  By = 0;.      }.
62d0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 73      }..    /* As
62e0: 73 69 67 6e 20 61 20 63 75 72 73 6f 72 20 6e 75  sign a cursor nu
62f0: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 65 70 68  mber for the eph
6300: 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 75 73 65  emeral table use
6310: 64 20 74 6f 20 62 75 66 66 65 72 20 72 6f 77 73  d to buffer rows
6320: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 4f 70 65  ..    ** The Ope
6330: 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72  nEphemeral instr
6340: 75 63 74 69 6f 6e 20 69 73 20 63 6f 64 65 64 20  uction is coded 
6350: 6c 61 74 65 72 2c 20 61 66 74 65 72 20 69 74 20  later, after it 
6360: 69 73 20 6b 6e 6f 77 6e 20 68 6f 77 0a 20 20 20  is known how.   
6370: 20 2a 2a 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73   ** many columns
6380: 20 74 68 65 20 74 61 62 6c 65 20 77 69 6c 6c 20   the table will 
6390: 68 61 76 65 2e 20 20 2a 2f 0a 20 20 20 20 70 4d  have.  */.    pM
63a0: 57 69 6e 2d 3e 69 45 70 68 43 73 72 20 3d 20 70  Win->iEphCsr = p
63b0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
63c0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20     pParse->nTab 
63d0: 2b 3d 20 33 3b 0a 0a 20 20 20 20 73 65 6c 65 63  += 3;..    selec
63e0: 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65 45 4c  tWindowRewriteEL
63f0: 69 73 74 28 70 50 61 72 73 65 2c 20 70 4d 57 69  ist(pParse, pMWi
6400: 6e 2c 20 70 53 72 63 2c 20 70 2d 3e 70 45 4c 69  n, pSrc, p->pELi
6410: 73 74 2c 20 26 70 53 75 62 6c 69 73 74 29 3b 0a  st, &pSublist);.
6420: 20 20 20 20 73 65 6c 65 63 74 57 69 6e 64 6f 77      selectWindow
6430: 52 65 77 72 69 74 65 45 4c 69 73 74 28 70 50 61  RewriteEList(pPa
6440: 72 73 65 2c 20 70 4d 57 69 6e 2c 20 70 53 72 63  rse, pMWin, pSrc
6450: 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 26  , p->pOrderBy, &
6460: 70 53 75 62 6c 69 73 74 29 3b 0a 20 20 20 20 70  pSublist);.    p
6470: 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c  MWin->nBufferCol
6480: 20 3d 20 28 70 53 75 62 6c 69 73 74 20 3f 20 70   = (pSublist ? p
6490: 53 75 62 6c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  Sublist->nExpr :
64a0: 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 70 70   0);..    /* App
64b0: 65 6e 64 20 74 68 65 20 50 41 52 54 49 54 49 4f  end the PARTITIO
64c0: 4e 20 42 59 20 61 6e 64 20 4f 52 44 45 52 20 42  N BY and ORDER B
64d0: 59 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 6f  Y expressions to
64e0: 20 74 68 65 20 74 6f 20 74 68 65 20 0a 20 20 20   the to the .   
64f0: 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 20 65   ** sub-select e
6500: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20  xpression list. 
6510: 54 68 65 79 20 61 72 65 20 72 65 71 75 69 72 65  They are require
6520: 64 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20  d to figure out 
6530: 77 68 65 72 65 20 0a 20 20 20 20 2a 2a 20 62 6f  where .    ** bo
6540: 75 6e 64 61 72 69 65 73 20 66 6f 72 20 70 61 72  undaries for par
6550: 74 69 74 69 6f 6e 73 20 61 6e 64 20 73 65 74 73  titions and sets
6560: 20 6f 66 20 70 65 65 72 20 72 6f 77 73 20 6c 69   of peer rows li
6570: 65 2e 20 20 2a 2f 0a 20 20 20 20 70 53 75 62 6c  e.  */.    pSubl
6580: 69 73 74 20 3d 20 65 78 70 72 4c 69 73 74 41 70  ist = exprListAp
6590: 70 65 6e 64 4c 69 73 74 28 70 50 61 72 73 65 2c  pendList(pParse,
65a0: 20 70 53 75 62 6c 69 73 74 2c 20 70 4d 57 69 6e   pSublist, pMWin
65b0: 2d 3e 70 50 61 72 74 69 74 69 6f 6e 29 3b 0a 20  ->pPartition);. 
65c0: 20 20 20 70 53 75 62 6c 69 73 74 20 3d 20 65 78     pSublist = ex
65d0: 70 72 4c 69 73 74 41 70 70 65 6e 64 4c 69 73 74  prListAppendList
65e0: 28 70 50 61 72 73 65 2c 20 70 53 75 62 6c 69 73  (pParse, pSublis
65f0: 74 2c 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72  t, pMWin->pOrder
6600: 42 79 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 70 70  By);..    /* App
6610: 65 6e 64 20 74 68 65 20 61 72 67 75 6d 65 6e 74  end the argument
6620: 73 20 70 61 73 73 65 64 20 74 6f 20 65 61 63 68  s passed to each
6630: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
6640: 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 73   to the.    ** s
6650: 75 62 2d 73 65 6c 65 63 74 20 65 78 70 72 65 73  ub-select expres
6660: 73 69 6f 6e 20 6c 69 73 74 2e 20 41 6c 73 6f 20  sion list. Also 
6670: 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 72 65 67  allocate two reg
6680: 69 73 74 65 72 73 20 66 6f 72 20 65 61 63 68 0a  isters for each.
6690: 20 20 20 20 2a 2a 20 77 69 6e 64 6f 77 20 66 75      ** window fu
66a0: 6e 63 74 69 6f 6e 20 2d 20 6f 6e 65 20 66 6f 72  nction - one for
66b0: 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72   the accumulator
66c0: 2c 20 61 6e 6f 74 68 65 72 20 66 6f 72 20 69 6e  , another for in
66d0: 74 65 72 69 6d 0a 20 20 20 20 2a 2a 20 72 65 73  terim.    ** res
66e0: 75 6c 74 73 2e 20 20 2a 2f 0a 20 20 20 20 66 6f  ults.  */.    fo
66f0: 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57  r(pWin=pMWin; pW
6700: 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70  in; pWin=pWin->p
6710: 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 20 20  NextWin){.      
6720: 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 20 3d 20  pWin->iArgCol = 
6730: 28 70 53 75 62 6c 69 73 74 20 3f 20 70 53 75 62  (pSublist ? pSub
6740: 6c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29  list->nExpr : 0)
6750: 3b 0a 20 20 20 20 20 20 70 53 75 62 6c 69 73 74  ;.      pSublist
6760: 20 3d 20 65 78 70 72 4c 69 73 74 41 70 70 65 6e   = exprListAppen
6770: 64 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53  dList(pParse, pS
6780: 75 62 6c 69 73 74 2c 20 70 57 69 6e 2d 3e 70 4f  ublist, pWin->pO
6790: 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  wner->x.pList);.
67a0: 20 20 20 20 20 20 69 66 28 20 70 57 69 6e 2d 3e        if( pWin->
67b0: 70 46 69 6c 74 65 72 20 29 7b 0a 20 20 20 20 20  pFilter ){.     
67c0: 20 20 20 45 78 70 72 20 2a 70 46 69 6c 74 65 72     Expr *pFilter
67d0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
67e0: 70 28 64 62 2c 20 70 57 69 6e 2d 3e 70 46 69 6c  p(db, pWin->pFil
67f0: 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ter, 0);.       
6800: 20 70 53 75 62 6c 69 73 74 20 3d 20 73 71 6c 69   pSublist = sqli
6810: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
6820: 64 28 70 50 61 72 73 65 2c 20 70 53 75 62 6c 69  d(pParse, pSubli
6830: 73 74 2c 20 70 46 69 6c 74 65 72 29 3b 0a 20 20  st, pFilter);.  
6840: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 57 69 6e      }.      pWin
6850: 2d 3e 72 65 67 41 63 63 75 6d 20 3d 20 2b 2b 70  ->regAccum = ++p
6860: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
6870: 20 20 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75     pWin->regResu
6880: 6c 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  lt = ++pParse->n
6890: 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Mem;.      sqlit
68a0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
68b0: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e  OP_Null, 0, pWin
68c0: 2d 3e 72 65 67 41 63 63 75 6d 29 3b 0a 20 20 20  ->regAccum);.   
68d0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
68e0: 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
68f0: 42 59 20 6f 72 20 50 41 52 54 49 54 49 4f 4e 20  BY or PARTITION 
6900: 42 59 20 63 6c 61 75 73 65 2c 20 61 6e 64 20 74  BY clause, and t
6910: 68 65 20 77 69 6e 64 6f 77 0a 20 20 20 20 2a 2a  he window.    **
6920: 20 66 75 6e 63 74 69 6f 6e 20 61 63 63 65 70 74   function accept
6930: 73 20 7a 65 72 6f 20 61 72 67 75 6d 65 6e 74 73  s zero arguments
6940: 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  , and there are 
6950: 6e 6f 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 73  no other columns
6960: 0a 20 20 20 20 2a 2a 20 73 65 6c 65 63 74 65 64  .    ** selected
6970: 20 28 65 2e 67 2e 20 22 53 45 4c 45 43 54 20 72   (e.g. "SELECT r
6980: 6f 77 5f 6e 75 6d 62 65 72 28 29 20 4f 56 45 52  ow_number() OVER
6990: 20 28 29 20 46 52 4f 4d 20 74 31 22 29 2c 20 69   () FROM t1"), i
69a0: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 0a 20 20  t is possible.  
69b0: 20 20 2a 2a 20 74 68 61 74 20 70 53 75 62 6c 69    ** that pSubli
69c0: 73 74 20 69 73 20 73 74 69 6c 6c 20 4e 55 4c 4c  st is still NULL
69d0: 20 68 65 72 65 2e 20 41 64 64 20 61 20 63 6f 6e   here. Add a con
69e0: 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  stant expression
69f0: 20 68 65 72 65 20 74 6f 20 0a 20 20 20 20 2a 2a   here to .    **
6a00: 20 6b 65 65 70 20 65 76 65 72 79 74 68 69 6e 67   keep everything
6a10: 20 6c 65 67 61 6c 20 69 6e 20 74 68 69 73 20 63   legal in this c
6a20: 61 73 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  ase. .    */.   
6a30: 20 69 66 28 20 70 53 75 62 6c 69 73 74 3d 3d 30   if( pSublist==0
6a40: 20 29 7b 0a 20 20 20 20 20 20 70 53 75 62 6c 69   ){.      pSubli
6a50: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
6a60: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
6a70: 65 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  e, 0, .         
6a80: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
6a90: 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52  c(db, TK_INTEGER
6aa0: 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b  , &sqlite3IntTok
6ab0: 65 6e 73 5b 30 5d 2c 20 30 29 0a 20 20 20 20 20  ens[0], 0).     
6ac0: 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70   );.    }..    p
6ad0: 53 75 62 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  Sub = sqlite3Sel
6ae0: 65 63 74 4e 65 77 28 0a 20 20 20 20 20 20 20 20  ectNew(.        
6af0: 70 50 61 72 73 65 2c 20 70 53 75 62 6c 69 73 74  pParse, pSublist
6b00: 2c 20 70 53 72 63 2c 20 70 57 68 65 72 65 2c 20  , pSrc, pWhere, 
6b10: 70 47 72 6f 75 70 42 79 2c 20 70 48 61 76 69 6e  pGroupBy, pHavin
6b20: 67 2c 20 70 53 6f 72 74 2c 20 30 2c 20 30 0a 20  g, pSort, 0, 0. 
6b30: 20 20 20 29 3b 0a 20 20 20 20 70 2d 3e 70 53 72     );.    p->pSr
6b40: 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
6b50: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
6b60: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69   0, 0, 0);.    i
6b70: 66 28 20 70 2d 3e 70 53 72 63 20 29 7b 0a 20 20  f( p->pSrc ){.  
6b80: 20 20 20 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30      p->pSrc->a[0
6b90: 5d 2e 70 53 65 6c 65 63 74 20 3d 20 70 53 75 62  ].pSelect = pSub
6ba0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
6bb0: 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
6bc0: 6f 72 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ors(pParse, p->p
6bd0: 53 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Src);.      if( 
6be0: 73 71 6c 69 74 65 33 45 78 70 61 6e 64 53 75 62  sqlite3ExpandSub
6bf0: 71 75 65 72 79 28 70 50 61 72 73 65 2c 20 26 70  query(pParse, &p
6c00: 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 29 20 29 7b  ->pSrc->a[0]) ){
6c10: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
6c20: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
6c30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6c40: 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
6c50: 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a  |= SF_Expanded;.
6c60: 20 20 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c          p->selFl
6c70: 61 67 73 20 26 3d 20 7e 53 46 5f 41 67 67 72 65  ags &= ~SF_Aggre
6c80: 67 61 74 65 3b 0a 20 20 20 20 20 20 20 20 73 71  gate;.        sq
6c90: 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28  lite3SelectPrep(
6ca0: 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 30 29  pParse, pSub, 0)
6cb0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
6cc0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6cd0: 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
6ce0: 65 6d 65 72 61 6c 2c 20 70 4d 57 69 6e 2d 3e 69  emeral, pMWin->i
6cf0: 45 70 68 43 73 72 2c 20 70 53 75 62 6c 69 73 74  EphCsr, pSublist
6d00: 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
6d10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6d20: 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c  2(v, OP_OpenDup,
6d30: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2b   pMWin->iEphCsr+
6d40: 31 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  1, pMWin->iEphCs
6d50: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
6d60: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6d70: 50 5f 4f 70 65 6e 44 75 70 2c 20 70 4d 57 69 6e  P_OpenDup, pMWin
6d80: 2d 3e 69 45 70 68 43 73 72 2b 32 2c 20 70 4d 57  ->iEphCsr+2, pMW
6d90: 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20  in->iEphCsr);.  
6da0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6db0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
6dc0: 44 75 70 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  Dup, pMWin->iEph
6dd0: 43 73 72 2b 33 2c 20 70 4d 57 69 6e 2d 3e 69 45  Csr+3, pMWin->iE
6de0: 70 68 43 73 72 29 3b 0a 20 20 20 20 7d 65 6c 73  phCsr);.    }els
6df0: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
6e00: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
6e10: 20 70 53 75 62 29 3b 0a 20 20 20 20 7d 0a 20 20   pSub);.    }.  
6e20: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
6e30: 46 61 69 6c 65 64 20 29 20 72 63 20 3d 20 53 51  Failed ) rc = SQ
6e40: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
6e50: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
6e60: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
6e70: 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 70 61  Window object pa
6e80: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
6e90: 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  nd argument..*/.
6ea0: 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64  void sqlite3Wind
6eb0: 6f 77 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  owDelete(sqlite3
6ec0: 20 2a 64 62 2c 20 57 69 6e 64 6f 77 20 2a 70 29   *db, Window *p)
6ed0: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
6ee0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
6ef0: 74 65 28 64 62 2c 20 70 2d 3e 70 46 69 6c 74 65  te(db, p->pFilte
6f00: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  r);.    sqlite3E
6f10: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
6f20: 2c 20 70 2d 3e 70 50 61 72 74 69 74 69 6f 6e 29  , p->pPartition)
6f30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
6f40: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
6f50: 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
6f60: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
6f70: 65 74 65 28 64 62 2c 20 70 2d 3e 70 45 6e 64 29  ete(db, p->pEnd)
6f80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
6f90: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
6fa0: 53 74 61 72 74 29 3b 0a 20 20 20 20 73 71 6c 69  Start);.    sqli
6fb0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
6fc0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
6fd0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
6fe0: 2d 3e 7a 42 61 73 65 29 3b 0a 20 20 20 20 73 71  ->zBase);.    sq
6ff0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
7000: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
7010: 20 46 72 65 65 20 74 68 65 20 6c 69 6e 6b 65 64   Free the linked
7020: 20 6c 69 73 74 20 6f 66 20 57 69 6e 64 6f 77 20   list of Window 
7030: 6f 62 6a 65 63 74 73 20 73 74 61 72 74 69 6e 67  objects starting
7040: 20 61 74 20 74 68 65 20 73 65 63 6f 6e 64 20 61   at the second a
7050: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  rgument..*/.void
7060: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4c 69   sqlite3WindowLi
7070: 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  stDelete(sqlite3
7080: 20 2a 64 62 2c 20 57 69 6e 64 6f 77 20 2a 70 29   *db, Window *p)
7090: 7b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  {.  while( p ){.
70a0: 20 20 20 20 57 69 6e 64 6f 77 20 2a 70 4e 65 78      Window *pNex
70b0: 74 20 3d 20 70 2d 3e 70 4e 65 78 74 57 69 6e 3b  t = p->pNextWin;
70c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64  .    sqlite3Wind
70d0: 6f 77 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b  owDelete(db, p);
70e0: 0a 20 20 20 20 70 20 3d 20 70 4e 65 78 74 3b 0a  .    p = pNext;.
70f0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65    }.}../*.** The
7100: 20 61 72 67 75 6d 65 6e 74 20 65 78 70 72 65 73   argument expres
7110: 73 69 6f 6e 20 69 73 20 61 6e 20 50 52 45 43 45  sion is an PRECE
7120: 44 49 4e 47 20 6f 72 20 46 4f 4c 4c 4f 57 49 4e  DING or FOLLOWIN
7130: 47 20 6f 66 66 73 65 74 2e 20 20 54 68 65 0a 2a  G offset.  The.*
7140: 2a 20 76 61 6c 75 65 20 73 68 6f 75 6c 64 20 62  * value should b
7150: 65 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65  e a non-negative
7160: 20 69 6e 74 65 67 65 72 2e 20 20 49 66 20 74 68   integer.  If th
7170: 65 20 76 61 6c 75 65 20 69 73 20 6e 6f 74 20 61  e value is not a
7180: 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 2c 20 63 68  .** constant, ch
7190: 61 6e 67 65 20 69 74 20 74 6f 20 4e 55 4c 4c 2e  ange it to NULL.
71a0: 20 20 54 68 65 20 66 61 63 74 20 74 68 61 74 20    The fact that 
71b0: 69 74 20 69 73 20 74 68 65 6e 20 61 20 6e 6f 6e  it is then a non
71c0: 2d 6e 65 67 61 74 69 76 65 0a 2a 2a 20 69 6e 74  -negative.** int
71d0: 65 67 65 72 20 77 69 6c 6c 20 62 65 20 63 61 75  eger will be cau
71e0: 67 68 74 20 6c 61 74 65 72 2e 20 20 42 75 74 20  ght later.  But 
71f0: 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  it is important 
7200: 6e 6f 74 20 74 6f 20 6c 65 61 76 65 0a 2a 2a 20  not to leave.** 
7210: 76 61 72 69 61 62 6c 65 20 76 61 6c 75 65 73 20  variable values 
7220: 69 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  in the expressio
7230: 6e 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69  n tree..*/.stati
7240: 63 20 45 78 70 72 20 2a 73 71 6c 69 74 65 33 57  c Expr *sqlite3W
7250: 69 6e 64 6f 77 4f 66 66 73 65 74 45 78 70 72 28  indowOffsetExpr(
7260: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
7270: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69  xpr *pExpr){.  i
7280: 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 45 78 70  f( 0==sqlite3Exp
7290: 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 78 70  rIsConstant(pExp
72a0: 72 29 20 29 7b 0a 20 20 20 20 69 66 28 20 49 4e  r) ){.    if( IN
72b0: 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29  _RENAME_OBJECT )
72c0: 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 45 78   sqlite3RenameEx
72d0: 70 72 55 6e 6d 61 70 28 70 50 61 72 73 65 2c 20  prUnmap(pParse, 
72e0: 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69  pExpr);.    sqli
72f0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50  te3ExprDelete(pP
7300: 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 29  arse->db, pExpr)
7310: 3b 0a 20 20 20 20 70 45 78 70 72 20 3d 20 73 71  ;.    pExpr = sq
7320: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70  lite3ExprAlloc(p
7330: 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 4e 55  Parse->db, TK_NU
7340: 4c 4c 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  LL, 0, 0);.  }. 
7350: 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d   return pExpr;.}
7360: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
7370: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 6e 65   and return a ne
7380: 77 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20  w Window object 
7390: 64 65 73 63 72 69 62 69 6e 67 20 61 20 57 69 6e  describing a Win
73a0: 64 6f 77 20 44 65 66 69 6e 69 74 69 6f 6e 2e 0a  dow Definition..
73b0: 2a 2f 0a 57 69 6e 64 6f 77 20 2a 73 71 6c 69 74  */.Window *sqlit
73c0: 65 33 57 69 6e 64 6f 77 41 6c 6c 6f 63 28 0a 20  e3WindowAlloc(. 
73d0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
73e0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
73f0: 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 65  ntext */.  int e
7400: 54 79 70 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Type,        /* 
7410: 46 72 61 6d 65 20 74 79 70 65 2e 20 54 4b 5f 52  Frame type. TK_R
7420: 41 4e 47 45 20 6f 72 20 54 4b 5f 52 4f 57 53 20  ANGE or TK_ROWS 
7430: 2a 2f 0a 20 20 69 6e 74 20 65 53 74 61 72 74 2c  */.  int eStart,
7440: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20         /* Start 
7450: 74 79 70 65 3a 20 43 55 52 52 45 4e 54 2c 20 50  type: CURRENT, P
7460: 52 45 43 45 44 49 4e 47 2c 20 46 4f 4c 4c 4f 57  RECEDING, FOLLOW
7470: 49 4e 47 2c 20 55 4e 42 4f 55 4e 44 45 44 20 2a  ING, UNBOUNDED *
7480: 2f 0a 20 20 45 78 70 72 20 2a 70 53 74 61 72 74  /.  Expr *pStart
7490: 2c 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 77  ,     /* Start w
74a0: 69 6e 64 6f 77 20 73 69 7a 65 20 69 66 20 54 4b  indow size if TK
74b0: 5f 50 52 45 43 45 44 49 4e 47 20 6f 72 20 46 4f  _PRECEDING or FO
74c0: 4c 4c 4f 57 49 4e 47 20 2a 2f 0a 20 20 69 6e 74  LLOWING */.  int
74d0: 20 65 45 6e 64 2c 20 20 20 20 20 20 20 20 20 2f   eEnd,         /
74e0: 2a 20 45 6e 64 20 74 79 70 65 3a 20 43 55 52 52  * End type: CURR
74f0: 45 4e 54 2c 20 46 4f 4c 4c 4f 57 49 4e 47 2c 20  ENT, FOLLOWING, 
7500: 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 2c 20 50 52  TK_UNBOUNDED, PR
7510: 45 43 45 44 49 4e 47 20 2a 2f 0a 20 20 45 78 70  ECEDING */.  Exp
7520: 72 20 2a 70 45 6e 64 20 20 20 20 20 20 20 20 2f  r *pEnd        /
7530: 2a 20 45 6e 64 20 77 69 6e 64 6f 77 20 73 69 7a  * End window siz
7540: 65 20 69 66 20 54 4b 5f 46 4f 4c 4c 4f 57 49 4e  e if TK_FOLLOWIN
7550: 47 20 6f 72 20 50 52 45 43 45 44 49 4e 47 20 2a  G or PRECEDING *
7560: 2f 0a 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70  /.){.  Window *p
7570: 57 69 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 62  Win = 0;.  int b
7580: 49 6d 70 6c 69 63 69 74 46 72 61 6d 65 20 3d 20  ImplicitFrame = 
7590: 30 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 72 20  0;..  /* Parser 
75a0: 61 73 73 75 72 65 73 20 74 68 65 20 66 6f 6c 6c  assures the foll
75b0: 6f 77 69 6e 67 3a 20 2a 2f 0a 20 20 61 73 73 65  owing: */.  asse
75c0: 72 74 28 20 65 54 79 70 65 3d 3d 30 20 7c 7c 20  rt( eType==0 || 
75d0: 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 20  eType==TK_RANGE 
75e0: 7c 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 52 4f 57  || eType==TK_ROW
75f0: 53 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 47  S || eType==TK_G
7600: 52 4f 55 50 53 20 29 3b 0a 20 20 61 73 73 65 72  ROUPS );.  asser
7610: 74 28 20 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55  t( eStart==TK_CU
7620: 52 52 45 4e 54 20 7c 7c 20 65 53 74 61 72 74 3d  RRENT || eStart=
7630: 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 0a 20 20  =TK_PRECEDING.  
7640: 20 20 20 20 20 20 20 20 20 7c 7c 20 65 53 74 61           || eSta
7650: 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  rt==TK_UNBOUNDED
7660: 20 7c 7c 20 65 53 74 61 72 74 3d 3d 54 4b 5f 46   || eStart==TK_F
7670: 4f 4c 4c 4f 57 49 4e 47 20 29 3b 0a 20 20 61 73  OLLOWING );.  as
7680: 73 65 72 74 28 20 65 45 6e 64 3d 3d 54 4b 5f 43  sert( eEnd==TK_C
7690: 55 52 52 45 4e 54 20 7c 7c 20 65 45 6e 64 3d 3d  URRENT || eEnd==
76a0: 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20 20  TK_FOLLOWING.   
76b0: 20 20 20 20 20 20 20 20 7c 7c 20 65 45 6e 64 3d          || eEnd=
76c0: 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 7c 7c  =TK_UNBOUNDED ||
76d0: 20 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44   eEnd==TK_PRECED
76e0: 49 4e 47 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ING );.  assert(
76f0: 20 28 65 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45   (eStart==TK_PRE
7700: 43 45 44 49 4e 47 20 7c 7c 20 65 53 74 61 72 74  CEDING || eStart
7710: 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 29 3d  ==TK_FOLLOWING)=
7720: 3d 28 70 53 74 61 72 74 21 3d 30 29 20 29 3b 0a  =(pStart!=0) );.
7730: 20 20 61 73 73 65 72 74 28 20 28 65 45 6e 64 3d    assert( (eEnd=
7740: 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 7c 7c  =TK_FOLLOWING ||
7750: 20 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44   eEnd==TK_PRECED
7760: 49 4e 47 29 3d 3d 28 70 45 6e 64 21 3d 30 29 20  ING)==(pEnd!=0) 
7770: 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d  );..  if( eType=
7780: 3d 30 20 29 7b 0a 20 20 20 20 62 49 6d 70 6c 69  =0 ){.    bImpli
7790: 63 69 74 46 72 61 6d 65 20 3d 20 31 3b 0a 20 20  citFrame = 1;.  
77a0: 20 20 65 54 79 70 65 20 3d 20 54 4b 5f 52 41 4e    eType = TK_RAN
77b0: 47 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64  GE;.  }..  /* Ad
77c0: 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 0a  ditionally, the.
77d0: 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 62 6f    ** starting bo
77e0: 75 6e 64 61 72 79 20 74 79 70 65 20 6d 61 79 20  undary type may 
77f0: 6e 6f 74 20 6f 63 63 75 72 20 65 61 72 6c 69 65  not occur earlie
7800: 72 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  r in the followi
7810: 6e 67 20 6c 69 73 74 20 74 68 61 6e 0a 20 20 2a  ng list than.  *
7820: 2a 20 74 68 65 20 65 6e 64 69 6e 67 20 62 6f 75  * the ending bou
7830: 6e 64 61 72 79 20 74 79 70 65 3a 0a 20 20 2a 2a  ndary type:.  **
7840: 0a 20 20 2a 2a 20 20 20 55 4e 42 4f 55 4e 44 45  .  **   UNBOUNDE
7850: 44 20 50 52 45 43 45 44 49 4e 47 0a 20 20 2a 2a  D PRECEDING.  **
7860: 20 20 20 3c 65 78 70 72 3e 20 50 52 45 43 45 44     <expr> PRECED
7870: 49 4e 47 0a 20 20 2a 2a 20 20 20 43 55 52 52 45  ING.  **   CURRE
7880: 4e 54 20 52 4f 57 0a 20 20 2a 2a 20 20 20 3c 65  NT ROW.  **   <e
7890: 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 20  xpr> FOLLOWING. 
78a0: 20 2a 2a 20 20 20 55 4e 42 4f 55 4e 44 45 44 20   **   UNBOUNDED 
78b0: 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20 2a 2a 0a 20  FOLLOWING.  **. 
78c0: 20 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 65   ** The parser e
78d0: 6e 73 75 72 65 73 20 74 68 61 74 20 22 55 4e 42  nsures that "UNB
78e0: 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47  OUNDED PRECEDING
78f0: 22 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  " cannot be used
7900: 20 61 73 20 61 6e 20 65 6e 64 69 6e 67 0a 20 20   as an ending.  
7910: 2a 2a 20 62 6f 75 6e 64 61 72 79 2c 20 61 6e 64  ** boundary, and
7920: 20 74 68 61 6e 20 22 55 4e 42 4f 55 4e 44 45 44   than "UNBOUNDED
7930: 20 46 4f 4c 4c 4f 57 49 4e 47 22 20 63 61 6e 6e   FOLLOWING" cann
7940: 6f 74 20 62 65 20 75 73 65 64 20 61 73 20 61 20  ot be used as a 
7950: 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 66 72  starting.  ** fr
7960: 61 6d 65 20 62 6f 75 6e 64 61 72 79 2e 0a 20 20  ame boundary..  
7970: 2a 2f 0a 20 20 69 66 28 20 28 65 53 74 61 72 74  */.  if( (eStart
7980: 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 26 26 20  ==TK_CURRENT && 
7990: 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49  eEnd==TK_PRECEDI
79a0: 4e 47 29 0a 20 20 20 7c 7c 20 28 65 53 74 61 72  NG).   || (eStar
79b0: 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  t==TK_FOLLOWING 
79c0: 26 26 20 28 65 45 6e 64 3d 3d 54 4b 5f 50 52 45  && (eEnd==TK_PRE
79d0: 43 45 44 49 4e 47 20 7c 7c 20 65 45 6e 64 3d 3d  CEDING || eEnd==
79e0: 54 4b 5f 43 55 52 52 45 4e 54 29 29 0a 20 20 29  TK_CURRENT)).  )
79f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
7a00: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
7a10: 6e 73 75 70 70 6f 72 74 65 64 20 66 72 61 6d 65  nsupported frame
7a20: 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 22 29   specification")
7a30: 3b 0a 20 20 20 20 67 6f 74 6f 20 77 69 6e 64 6f  ;.    goto windo
7a40: 77 41 6c 6c 6f 63 45 72 72 3b 0a 20 20 7d 0a 0a  wAllocErr;.  }..
7a50: 20 20 70 57 69 6e 20 3d 20 28 57 69 6e 64 6f 77    pWin = (Window
7a60: 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  *)sqlite3DbMallo
7a70: 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62  cZero(pParse->db
7a80: 2c 20 73 69 7a 65 6f 66 28 57 69 6e 64 6f 77 29  , sizeof(Window)
7a90: 29 3b 0a 20 20 69 66 28 20 70 57 69 6e 3d 3d 30  );.  if( pWin==0
7aa0: 20 29 20 67 6f 74 6f 20 77 69 6e 64 6f 77 41 6c   ) goto windowAl
7ab0: 6c 6f 63 45 72 72 3b 0a 20 20 70 57 69 6e 2d 3e  locErr;.  pWin->
7ac0: 65 54 79 70 65 20 3d 20 65 54 79 70 65 3b 0a 20  eType = eType;. 
7ad0: 20 70 57 69 6e 2d 3e 65 53 74 61 72 74 20 3d 20   pWin->eStart = 
7ae0: 65 53 74 61 72 74 3b 0a 20 20 70 57 69 6e 2d 3e  eStart;.  pWin->
7af0: 65 45 6e 64 20 3d 20 65 45 6e 64 3b 0a 20 20 70  eEnd = eEnd;.  p
7b00: 57 69 6e 2d 3e 62 49 6d 70 6c 69 63 69 74 46 72  Win->bImplicitFr
7b10: 61 6d 65 20 3d 20 62 49 6d 70 6c 69 63 69 74 46  ame = bImplicitF
7b20: 72 61 6d 65 3b 0a 20 20 70 57 69 6e 2d 3e 70 45  rame;.  pWin->pE
7b30: 6e 64 20 3d 20 73 71 6c 69 74 65 33 57 69 6e 64  nd = sqlite3Wind
7b40: 6f 77 4f 66 66 73 65 74 45 78 70 72 28 70 50 61  owOffsetExpr(pPa
7b50: 72 73 65 2c 20 70 45 6e 64 29 3b 0a 20 20 70 57  rse, pEnd);.  pW
7b60: 69 6e 2d 3e 70 53 74 61 72 74 20 3d 20 73 71 6c  in->pStart = sql
7b70: 69 74 65 33 57 69 6e 64 6f 77 4f 66 66 73 65 74  ite3WindowOffset
7b80: 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 53 74  Expr(pParse, pSt
7b90: 61 72 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  art);.  return p
7ba0: 57 69 6e 3b 0a 0a 77 69 6e 64 6f 77 41 6c 6c 6f  Win;..windowAllo
7bb0: 63 45 72 72 3a 0a 20 20 73 71 6c 69 74 65 33 45  cErr:.  sqlite3E
7bc0: 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65  xprDelete(pParse
7bd0: 2d 3e 64 62 2c 20 70 45 6e 64 29 3b 0a 20 20 73  ->db, pEnd);.  s
7be0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
7bf0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 74  (pParse->db, pSt
7c00: 61 72 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  art);.  return 0
7c10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63  ;.}../*.** Attac
7c20: 68 20 50 41 52 54 49 54 49 4f 4e 20 61 6e 64 20  h PARTITION and 
7c30: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73  ORDER BY clauses
7c40: 20 70 50 61 72 74 69 74 69 6f 6e 20 61 6e 64 20   pPartition and 
7c50: 70 4f 72 64 65 72 42 79 20 74 6f 20 77 69 6e 64  pOrderBy to wind
7c60: 6f 77 0a 2a 2a 20 70 57 69 6e 2e 20 41 6c 73 6f  ow.** pWin. Also
7c70: 2c 20 69 66 20 70 61 72 61 6d 65 74 65 72 20 70  , if parameter p
7c80: 42 61 73 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Base is not NULL
7c90: 2c 20 73 65 74 20 70 57 69 6e 2d 3e 7a 42 61 73  , set pWin->zBas
7ca0: 65 20 74 6f 20 74 68 65 0a 2a 2a 20 65 71 75 69  e to the.** equi
7cb0: 76 61 6c 65 6e 74 20 6e 75 6c 2d 74 65 72 6d 69  valent nul-termi
7cc0: 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2f  nated string..*/
7cd0: 0a 57 69 6e 64 6f 77 20 2a 73 71 6c 69 74 65 33  .Window *sqlite3
7ce0: 57 69 6e 64 6f 77 41 73 73 65 6d 62 6c 65 28 0a  WindowAssemble(.
7cf0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
7d00: 20 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e   .  Window *pWin
7d10: 2c 20 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  , .  ExprList *p
7d20: 50 61 72 74 69 74 69 6f 6e 2c 20 0a 20 20 45 78  Partition, .  Ex
7d30: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
7d40: 2c 20 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 61 73  , .  Token *pBas
7d50: 65 0a 29 7b 0a 20 20 69 66 28 20 70 57 69 6e 20  e.){.  if( pWin 
7d60: 29 7b 0a 20 20 20 20 70 57 69 6e 2d 3e 70 50 61  ){.    pWin->pPa
7d70: 72 74 69 74 69 6f 6e 20 3d 20 70 50 61 72 74 69  rtition = pParti
7d80: 74 69 6f 6e 3b 0a 20 20 20 20 70 57 69 6e 2d 3e  tion;.    pWin->
7d90: 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
7da0: 72 42 79 3b 0a 20 20 20 20 69 66 28 20 70 42 61  rBy;.    if( pBa
7db0: 73 65 20 29 7b 0a 20 20 20 20 20 20 70 57 69 6e  se ){.      pWin
7dc0: 2d 3e 7a 42 61 73 65 20 3d 20 73 71 6c 69 74 65  ->zBase = sqlite
7dd0: 33 44 62 53 74 72 4e 44 75 70 28 70 50 61 72 73  3DbStrNDup(pPars
7de0: 65 2d 3e 64 62 2c 20 70 42 61 73 65 2d 3e 7a 2c  e->db, pBase->z,
7df0: 20 70 42 61 73 65 2d 3e 6e 29 3b 0a 20 20 20 20   pBase->n);.    
7e00: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  }.  }else{.    s
7e10: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
7e20: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
7e30: 20 70 50 61 72 74 69 74 69 6f 6e 29 3b 0a 20 20   pPartition);.  
7e40: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
7e50: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
7e60: 64 62 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20  db, pOrderBy);. 
7e70: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 57 69 6e   }.  return pWin
7e80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e 64 6f  ;.}../*.** Windo
7e90: 77 20 2a 70 57 69 6e 20 68 61 73 20 6a 75 73 74  w *pWin has just
7ea0: 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 66 72   been created fr
7eb0: 6f 6d 20 61 20 57 49 4e 44 4f 57 20 63 6c 61 75  om a WINDOW clau
7ec0: 73 65 2e 20 54 6f 6b 6e 65 20 70 42 61 73 65 0a  se. Tokne pBase.
7ed0: 2a 2a 20 69 73 20 74 68 65 20 62 61 73 65 20 77  ** is the base w
7ee0: 69 6e 64 6f 77 2e 20 45 61 72 6c 69 65 72 20 77  indow. Earlier w
7ef0: 69 6e 64 6f 77 73 20 66 72 6f 6d 20 74 68 65 20  indows from the 
7f00: 73 61 6d 65 20 57 49 4e 44 4f 57 20 63 6c 61 75  same WINDOW clau
7f10: 73 65 20 61 72 65 0a 2a 2a 20 73 74 6f 72 65 64  se are.** stored
7f20: 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   in the linked l
7f30: 69 73 74 20 73 74 61 72 74 69 6e 67 20 61 74 20  ist starting at 
7f40: 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 2e 20  pWin->pNextWin. 
7f50: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  This function.**
7f60: 20 65 69 74 68 65 72 20 75 70 64 61 74 65 73 20   either updates 
7f70: 2a 70 57 69 6e 20 61 63 63 6f 72 64 69 6e 67 20  *pWin according 
7f80: 74 6f 20 74 68 65 20 62 61 73 65 20 73 70 65 63  to the base spec
7f90: 69 66 69 63 61 74 69 6f 6e 2c 20 6f 72 20 65 6c  ification, or el
7fa0: 73 65 0a 2a 2a 20 6c 65 61 76 65 73 20 61 6e 20  se.** leaves an 
7fb0: 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e  error in pParse.
7fc0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7fd0: 57 69 6e 64 6f 77 43 68 61 69 6e 28 50 61 72 73  WindowChain(Pars
7fe0: 65 20 2a 70 50 61 72 73 65 2c 20 57 69 6e 64 6f  e *pParse, Windo
7ff0: 77 20 2a 70 57 69 6e 2c 20 57 69 6e 64 6f 77 20  w *pWin, Window 
8000: 2a 70 4c 69 73 74 29 7b 0a 20 20 69 66 28 20 70  *pList){.  if( p
8010: 57 69 6e 2d 3e 7a 42 61 73 65 20 29 7b 0a 20 20  Win->zBase ){.  
8020: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
8030: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20  pParse->db;.    
8040: 57 69 6e 64 6f 77 20 2a 70 45 78 69 73 74 20 3d  Window *pExist =
8050: 20 77 69 6e 64 6f 77 46 69 6e 64 28 70 50 61 72   windowFind(pPar
8060: 73 65 2c 20 70 4c 69 73 74 2c 20 70 57 69 6e 2d  se, pList, pWin-
8070: 3e 7a 42 61 73 65 29 3b 0a 20 20 20 20 69 66 28  >zBase);.    if(
8080: 20 70 45 78 69 73 74 20 29 7b 0a 20 20 20 20 20   pExist ){.     
8090: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72   const char *zEr
80a0: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20  r = 0;.      /* 
80b0: 43 68 65 63 6b 20 66 6f 72 20 65 72 72 6f 72 73  Check for errors
80c0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 57   */.      if( pW
80d0: 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 29  in->pPartition )
80e0: 7b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d  {.        zErr =
80f0: 20 22 50 41 52 54 49 54 49 4f 4e 20 63 6c 61 75   "PARTITION clau
8100: 73 65 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  se";.      }else
8110: 20 69 66 28 20 70 45 78 69 73 74 2d 3e 70 4f 72   if( pExist->pOr
8120: 64 65 72 42 79 20 26 26 20 70 57 69 6e 2d 3e 70  derBy && pWin->p
8130: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
8140: 20 20 20 7a 45 72 72 20 3d 20 22 4f 52 44 45 52     zErr = "ORDER
8150: 20 42 59 20 63 6c 61 75 73 65 22 3b 0a 20 20 20   BY clause";.   
8160: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78     }else if( pEx
8170: 69 73 74 2d 3e 62 49 6d 70 6c 69 63 69 74 46 72  ist->bImplicitFr
8180: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
8190: 20 20 7a 45 72 72 20 3d 20 22 66 72 61 6d 65 20    zErr = "frame 
81a0: 73 70 65 63 69 66 69 63 61 74 69 6f 6e 22 3b 0a  specification";.
81b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
81c0: 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 20 20  ( zErr ){.      
81d0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
81e0: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
81f0: 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 6f         "cannot o
8200: 76 65 72 72 69 64 65 20 25 73 20 6f 66 20 77 69  verride %s of wi
8210: 6e 64 6f 77 3a 20 25 73 22 2c 20 7a 45 72 72 2c  ndow: %s", zErr,
8220: 20 70 57 69 6e 2d 3e 7a 42 61 73 65 0a 20 20 20   pWin->zBase.   
8230: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 65       );.      }e
8240: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 57 69  lse{.        pWi
8250: 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 3d 20  n->pPartition = 
8260: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
8270: 75 70 28 64 62 2c 20 70 45 78 69 73 74 2d 3e 70  up(db, pExist->p
8280: 50 61 72 74 69 74 69 6f 6e 2c 20 30 29 3b 0a 20  Partition, 0);. 
8290: 20 20 20 20 20 20 20 69 66 28 20 70 45 78 69 73         if( pExis
82a0: 74 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  t->pOrderBy ){. 
82b0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
82c0: 20 70 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 3d   pWin->pOrderBy=
82d0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
82e0: 70 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pWin->pOrderBy =
82f0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
8300: 44 75 70 28 64 62 2c 20 70 45 78 69 73 74 2d 3e  Dup(db, pExist->
8310: 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 20 20  pOrderBy, 0);.  
8320: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8330: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
8340: 2c 20 70 57 69 6e 2d 3e 7a 42 61 73 65 29 3b 0a  , pWin->zBase);.
8350: 20 20 20 20 20 20 20 20 70 57 69 6e 2d 3e 7a 42          pWin->zB
8360: 61 73 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ase = 0;.      }
8370: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
8380: 0a 2a 2a 20 41 74 74 61 63 68 20 77 69 6e 64 6f  .** Attach windo
8390: 77 20 6f 62 6a 65 63 74 20 70 57 69 6e 20 74 6f  w object pWin to
83a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 2e 0a 2a   expression p..*
83b0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69  /.void sqlite3Wi
83c0: 6e 64 6f 77 41 74 74 61 63 68 28 50 61 72 73 65  ndowAttach(Parse
83d0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
83e0: 70 2c 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 29  p, Window *pWin)
83f0: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
8400: 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d   assert( p->op==
8410: 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  TK_FUNCTION );. 
8420: 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69     /* This routi
8430: 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  ne is only calle
8440: 64 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 72  d for the parser
8450: 2e 20 20 49 66 20 70 57 69 6e 20 77 61 73 20 6e  .  If pWin was n
8460: 6f 74 0a 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61  ot.    ** alloca
8470: 74 65 64 20 64 75 65 20 74 6f 20 61 6e 20 4f 4f  ted due to an OO
8480: 4d 2c 20 74 68 65 6e 20 74 68 65 20 70 61 72 73  M, then the pars
8490: 65 72 20 77 6f 75 6c 64 20 66 61 69 6c 20 62 65  er would fail be
84a0: 66 6f 72 65 20 65 76 65 72 0a 20 20 20 20 2a 2a  fore ever.    **
84b0: 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72   invoking this r
84c0: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 69 66  outine */.    if
84d0: 28 20 41 4c 57 41 59 53 28 70 57 69 6e 29 20 29  ( ALWAYS(pWin) )
84e0: 7b 0a 20 20 20 20 20 20 70 2d 3e 79 2e 70 57 69  {.      p->y.pWi
84f0: 6e 20 3d 20 70 57 69 6e 3b 0a 20 20 20 20 20 20  n = pWin;.      
8500: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
8510: 70 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 3b 0a  p, EP_WinFunc);.
8520: 20 20 20 20 20 20 70 57 69 6e 2d 3e 70 4f 77 6e        pWin->pOwn
8530: 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 69 66  er = p;.      if
8540: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ( p->flags & EP_
8550: 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
8560: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8570: 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
8580: 20 20 20 20 20 20 20 22 44 49 53 54 49 4e 43 54         "DISTINCT
8590: 20 69 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 65   is not supporte
85a0: 64 20 66 6f 72 20 77 69 6e 64 6f 77 20 66 75 6e  d for window fun
85b0: 63 74 69 6f 6e 73 22 29 3b 0a 20 20 20 20 20 20  ctions");.      
85c0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
85d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64  .    sqlite3Wind
85e0: 6f 77 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  owDelete(pParse-
85f0: 3e 64 62 2c 20 70 57 69 6e 29 3b 0a 20 20 7d 0a  >db, pWin);.  }.
8600: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
8610: 30 20 69 66 20 74 68 65 20 74 77 6f 20 77 69 6e  0 if the two win
8620: 64 6f 77 20 6f 62 6a 65 63 74 73 20 61 72 65 20  dow objects are 
8630: 69 64 65 6e 74 69 63 61 6c 2c 20 6f 72 20 6e 6f  identical, or no
8640: 6e 2d 7a 65 72 6f 20 6f 74 68 65 72 77 69 73 65  n-zero otherwise
8650: 2e 0a 2a 2a 20 49 64 65 6e 74 69 63 61 6c 20 77  ..** Identical w
8660: 69 6e 64 6f 77 20 6f 62 6a 65 63 74 73 20 63 61  indow objects ca
8670: 6e 20 62 65 20 70 72 6f 63 65 73 73 65 64 20 69  n be processed i
8680: 6e 20 61 20 73 69 6e 67 6c 65 20 73 63 61 6e 2e  n a single scan.
8690: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57  .*/.int sqlite3W
86a0: 69 6e 64 6f 77 43 6f 6d 70 61 72 65 28 50 61 72  indowCompare(Par
86b0: 73 65 20 2a 70 50 61 72 73 65 2c 20 57 69 6e 64  se *pParse, Wind
86c0: 6f 77 20 2a 70 31 2c 20 57 69 6e 64 6f 77 20 2a  ow *p1, Window *
86d0: 70 32 29 7b 0a 20 20 69 66 28 20 70 31 2d 3e 65  p2){.  if( p1->e
86e0: 54 79 70 65 21 3d 70 32 2d 3e 65 54 79 70 65 20  Type!=p2->eType 
86f0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
8700: 28 20 70 31 2d 3e 65 53 74 61 72 74 21 3d 70 32  ( p1->eStart!=p2
8710: 2d 3e 65 53 74 61 72 74 20 29 20 72 65 74 75 72  ->eStart ) retur
8720: 6e 20 31 3b 0a 20 20 69 66 28 20 70 31 2d 3e 65  n 1;.  if( p1->e
8730: 45 6e 64 21 3d 70 32 2d 3e 65 45 6e 64 20 29 20  End!=p2->eEnd ) 
8740: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
8750: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
8760: 72 65 28 70 50 61 72 73 65 2c 20 70 31 2d 3e 70  re(pParse, p1->p
8770: 53 74 61 72 74 2c 20 70 32 2d 3e 70 53 74 61 72  Start, p2->pStar
8780: 74 2c 20 2d 31 29 20 29 20 72 65 74 75 72 6e 20  t, -1) ) return 
8790: 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
87a0: 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72  ExprCompare(pPar
87b0: 73 65 2c 20 70 31 2d 3e 70 45 6e 64 2c 20 70 32  se, p1->pEnd, p2
87c0: 2d 3e 70 45 6e 64 2c 20 2d 31 29 20 29 20 72 65  ->pEnd, -1) ) re
87d0: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
87e0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d  lite3ExprListCom
87f0: 70 61 72 65 28 70 31 2d 3e 70 50 61 72 74 69 74  pare(p1->pPartit
8800: 69 6f 6e 2c 20 70 32 2d 3e 70 50 61 72 74 69 74  ion, p2->pPartit
8810: 69 6f 6e 2c 20 2d 31 29 20 29 20 72 65 74 75 72  ion, -1) ) retur
8820: 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
8830: 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
8840: 65 28 70 31 2d 3e 70 4f 72 64 65 72 42 79 2c 20  e(p1->pOrderBy, 
8850: 70 32 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31  p2->pOrderBy, -1
8860: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
8870: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a  return 0;.}.../*
8880: 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c  .** This is call
8890: 65 64 20 62 79 20 63 6f 64 65 20 69 6e 20 73 65  ed by code in se
88a0: 6c 65 63 74 2e 63 20 62 65 66 6f 72 65 20 69 74  lect.c before it
88b0: 20 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 57 68   calls sqlite3Wh
88c0: 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20 74 6f  ereBegin().** to
88d0: 20 62 65 67 69 6e 20 69 74 65 72 61 74 69 6e 67   begin iterating
88e0: 20 74 68 72 6f 75 67 68 20 74 68 65 20 73 75 62   through the sub
88f0: 2d 71 75 65 72 79 20 72 65 73 75 6c 74 73 2e 20  -query results. 
8900: 49 74 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c  It is used to al
8910: 6c 6f 63 61 74 65 0a 2a 2a 20 61 6e 64 20 69 6e  locate.** and in
8920: 69 74 69 61 6c 69 7a 65 20 72 65 67 69 73 74 65  itialize registe
8930: 72 73 20 61 6e 64 20 63 75 72 73 6f 72 73 20 75  rs and cursors u
8940: 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 69  sed by sqlite3Wi
8950: 6e 64 6f 77 43 6f 64 65 53 74 65 70 28 29 2e 0a  ndowCodeStep()..
8960: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57  */.void sqlite3W
8970: 69 6e 64 6f 77 43 6f 64 65 49 6e 69 74 28 50 61  indowCodeInit(Pa
8980: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 57 69 6e  rse *pParse, Win
8990: 64 6f 77 20 2a 70 4d 57 69 6e 29 7b 0a 20 20 57  dow *pMWin){.  W
89a0: 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 56  indow *pWin;.  V
89b0: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
89c0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
89d0: 0a 20 20 69 6e 74 20 6e 50 61 72 74 20 3d 20 28  .  int nPart = (
89e0: 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f  pMWin->pPartitio
89f0: 6e 20 3f 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74  n ? pMWin->pPart
8a00: 69 74 69 6f 6e 2d 3e 6e 45 78 70 72 20 3a 20 30  ition->nExpr : 0
8a10: 29 3b 0a 20 20 6e 50 61 72 74 20 2b 3d 20 28 70  );.  nPart += (p
8a20: 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20 3f  MWin->pOrderBy ?
8a30: 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79   pMWin->pOrderBy
8a40: 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20  ->nExpr : 0);.  
8a50: 69 66 28 20 6e 50 61 72 74 20 29 7b 0a 20 20 20  if( nPart ){.   
8a60: 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 20   pMWin->regPart 
8a70: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
8a80: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
8a90: 65 6d 20 2b 3d 20 6e 50 61 72 74 3b 0a 20 20 20  em += nPart;.   
8aa0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8ab0: 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p3(v, OP_Null, 0
8ac0: 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74  , pMWin->regPart
8ad0: 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74  , pMWin->regPart
8ae0: 2b 6e 50 61 72 74 2d 31 29 3b 0a 20 20 7d 0a 0a  +nPart-1);.  }..
8af0: 20 20 70 4d 57 69 6e 2d 3e 72 65 67 46 69 72 73    pMWin->regFirs
8b00: 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
8b10: 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  em;.  sqlite3Vdb
8b20: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
8b30: 74 65 67 65 72 2c 20 31 2c 20 70 4d 57 69 6e 2d  teger, 1, pMWin-
8b40: 3e 72 65 67 46 69 72 73 74 29 3b 0a 20 20 70 4d  >regFirst);.  pM
8b50: 57 69 6e 2d 3e 72 65 67 53 69 7a 65 20 3d 20 2b  Win->regSize = +
8b60: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
8b70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8b80: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
8b90: 2c 20 30 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 53  , 0, pMWin->regS
8ba0: 69 7a 65 29 3b 0a 0a 20 20 66 6f 72 28 70 57 69  ize);..  for(pWi
8bb0: 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70  n=pMWin; pWin; p
8bc0: 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57  Win=pWin->pNextW
8bd0: 69 6e 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66  in){.    FuncDef
8be0: 20 2a 70 20 3d 20 70 57 69 6e 2d 3e 70 46 75 6e   *p = pWin->pFun
8bf0: 63 3b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 66  c;.    if( (p->f
8c00: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
8c10: 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 20 26  E_FUNC_MINMAX) &
8c20: 26 20 70 57 69 6e 2d 3e 65 53 74 61 72 74 21 3d  & pWin->eStart!=
8c30: 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a  TK_UNBOUNDED ){.
8c40: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6c        /* The inl
8c50: 69 6e 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ine versions of 
8c60: 6d 69 6e 28 29 20 61 6e 64 20 6d 61 78 28 29 20  min() and max() 
8c70: 72 65 71 75 69 72 65 20 61 20 73 69 6e 67 6c 65  require a single
8c80: 20 65 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 20   ephemeral.     
8c90: 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 33 20   ** table and 3 
8ca0: 72 65 67 69 73 74 65 72 73 2e 20 54 68 65 20 72  registers. The r
8cb0: 65 67 69 73 74 65 72 73 20 61 72 65 20 75 73 65  egisters are use
8cc0: 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  d as follows:.  
8cd0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
8ce0: 20 20 72 65 67 41 70 70 2b 30 3a 20 73 6c 6f 74    regApp+0: slot
8cf0: 20 74 6f 20 63 6f 70 79 20 6d 69 6e 28 29 2f 6d   to copy min()/m
8d00: 61 78 28 29 20 61 72 67 75 6d 65 6e 74 20 74 6f  ax() argument to
8d10: 20 66 6f 72 20 4d 61 6b 65 52 65 63 6f 72 64 0a   for MakeRecord.
8d20: 20 20 20 20 20 20 2a 2a 20 20 20 72 65 67 41 70        **   regAp
8d30: 70 2b 31 3a 20 69 6e 74 65 67 65 72 20 76 61 6c  p+1: integer val
8d40: 75 65 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72  ue used to ensur
8d50: 65 20 6b 65 79 73 20 61 72 65 20 75 6e 69 71 75  e keys are uniqu
8d60: 65 0a 20 20 20 20 20 20 2a 2a 20 20 20 72 65 67  e.      **   reg
8d70: 41 70 70 2b 32 3a 20 6f 75 74 70 75 74 20 6f 66  App+2: output of
8d80: 20 4d 61 6b 65 52 65 63 6f 72 64 0a 20 20 20 20   MakeRecord.    
8d90: 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c    */.      ExprL
8da0: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 57 69  ist *pList = pWi
8db0: 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69  n->pOwner->x.pLi
8dc0: 73 74 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66  st;.      KeyInf
8dd0: 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71  o *pKeyInfo = sq
8de0: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d  lite3KeyInfoFrom
8df0: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
8e00: 20 70 4c 69 73 74 2c 20 30 2c 20 30 29 3b 0a 20   pList, 0, 0);. 
8e10: 20 20 20 20 20 70 57 69 6e 2d 3e 63 73 72 41 70       pWin->csrAp
8e20: 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  p = pParse->nTab
8e30: 2b 2b 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e  ++;.      pWin->
8e40: 72 65 67 41 70 70 20 3d 20 70 50 61 72 73 65 2d  regApp = pParse-
8e50: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 70  >nMem+1;.      p
8e60: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 33  Parse->nMem += 3
8e70: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79  ;.      if( pKey
8e80: 49 6e 66 6f 20 26 26 20 70 57 69 6e 2d 3e 70 46  Info && pWin->pF
8e90: 75 6e 63 2d 3e 7a 4e 61 6d 65 5b 31 5d 3d 3d 27  unc->zName[1]=='
8ea0: 69 27 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  i' ){.        as
8eb0: 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  sert( pKeyInfo->
8ec0: 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 3d 3d 30  aSortOrder[0]==0
8ed0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79   );.        pKey
8ee0: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
8ef0: 5b 30 5d 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  [0] = 1;.      }
8f00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8f10: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
8f20: 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 57  penEphemeral, pW
8f30: 69 6e 2d 3e 63 73 72 41 70 70 2c 20 32 29 3b 0a  in->csrApp, 2);.
8f40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8f50: 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 4b 65  eAppendP4(v, pKe
8f60: 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
8f70: 4f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  O);.      sqlite
8f80: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8f90: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 57  P_Integer, 0, pW
8fa0: 69 6e 2d 3e 72 65 67 41 70 70 2b 31 29 3b 0a 20  in->regApp+1);. 
8fb0: 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66     }.    else if
8fc0: 28 20 70 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f  ( p->zName==nth_
8fd0: 76 61 6c 75 65 4e 61 6d 65 20 7c 7c 20 70 2d 3e  valueName || p->
8fe0: 7a 4e 61 6d 65 3d 3d 66 69 72 73 74 5f 76 61 6c  zName==first_val
8ff0: 75 65 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  ueName ){.      
9000: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 77 6f 20  /* Allocate two 
9010: 72 65 67 69 73 74 65 72 73 20 61 74 20 70 57 69  registers at pWi
9020: 6e 2d 3e 72 65 67 41 70 70 2e 20 54 68 65 73 65  n->regApp. These
9030: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
9040: 0a 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 20  .      ** store 
9050: 74 68 65 20 73 74 61 72 74 20 61 6e 64 20 65 6e  the start and en
9060: 64 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63  d index of the c
9070: 75 72 72 65 6e 74 20 66 72 61 6d 65 2e 20 20 2a  urrent frame.  *
9080: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
9090: 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 20 29  pMWin->iEphCsr )
90a0: 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 72 65  ;.      pWin->re
90b0: 67 41 70 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e  gApp = pParse->n
90c0: 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 70 57 69  Mem+1;.      pWi
90d0: 6e 2d 3e 63 73 72 41 70 70 20 3d 20 70 50 61 72  n->csrApp = pPar
90e0: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
90f0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
9100: 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 2;.      sqlit
9110: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
9120: 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70 57 69 6e  OP_OpenDup, pWin
9130: 2d 3e 63 73 72 41 70 70 2c 20 70 4d 57 69 6e 2d  ->csrApp, pMWin-
9140: 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 20 20 7d  >iEphCsr);.    }
9150: 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 2d  .    else if( p-
9160: 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65  >zName==leadName
9170: 20 7c 7c 20 70 2d 3e 7a 4e 61 6d 65 3d 3d 6c 61   || p->zName==la
9180: 67 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 61  gName ){.      a
9190: 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 69 45  ssert( pMWin->iE
91a0: 70 68 43 73 72 20 29 3b 0a 20 20 20 20 20 20 70  phCsr );.      p
91b0: 57 69 6e 2d 3e 63 73 72 41 70 70 20 3d 20 70 50  Win->csrApp = pP
91c0: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
91d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
91e0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
91f0: 44 75 70 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70  Dup, pWin->csrAp
9200: 70 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  p, pMWin->iEphCs
9210: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  r);.    }.  }.}.
9220: 0a 2f 2a 0a 2a 2a 20 41 20 22 50 52 45 43 45 44  ./*.** A "PRECED
9230: 49 4e 47 20 3c 65 78 70 72 3e 22 20 28 65 43 6f  ING <expr>" (eCo
9240: 6e 64 3d 3d 30 29 20 6f 72 20 22 46 4f 4c 4c 4f  nd==0) or "FOLLO
9250: 57 49 4e 47 20 3c 65 78 70 72 3e 22 20 28 65 43  WING <expr>" (eC
9260: 6f 6e 64 3d 3d 31 29 20 6f 72 20 74 68 65 0a 2a  ond==1) or the.*
9270: 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73  * value of the s
9280: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
9290: 6f 20 6e 74 68 5f 76 61 6c 75 65 28 29 20 28 65  o nth_value() (e
92a0: 43 6f 6e 64 3d 3d 32 29 20 68 61 73 20 6a 75 73  Cond==2) has jus
92b0: 74 20 62 65 65 6e 0a 2a 2a 20 65 76 61 6c 75 61  t been.** evalua
92c0: 74 65 64 20 61 6e 64 20 74 68 65 20 72 65 73 75  ted and the resu
92d0: 6c 74 20 6c 65 66 74 20 69 6e 20 72 65 67 69 73  lt left in regis
92e0: 74 65 72 20 72 65 67 2e 20 54 68 69 73 20 66 75  ter reg. This fu
92f0: 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61 74 65 73  nction generates
9300: 20 56 4d 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 63   VM.** code to c
9310: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76 61  heck that the va
9320: 6c 75 65 20 69 73 20 61 20 6e 6f 6e 2d 6e 65 67  lue is a non-neg
9330: 61 74 69 76 65 20 69 6e 74 65 67 65 72 20 61 6e  ative integer an
9340: 64 20 74 68 72 6f 77 73 20 61 6e 0a 2a 2a 20 65  d throws an.** e
9350: 78 63 65 70 74 69 6f 6e 20 69 66 20 69 74 20 69  xception if it i
9360: 73 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  s not..*/.static
9370: 20 76 6f 69 64 20 77 69 6e 64 6f 77 43 68 65 63   void windowChec
9380: 6b 49 6e 74 56 61 6c 75 65 28 50 61 72 73 65 20  kIntValue(Parse 
9390: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 72 65 67  *pParse, int reg
93a0: 2c 20 69 6e 74 20 65 43 6f 6e 64 29 7b 0a 20 20  , int eCond){.  
93b0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
93c0: 72 20 2a 61 7a 45 72 72 5b 5d 20 3d 20 7b 0a 20  r *azErr[] = {. 
93d0: 20 20 20 22 66 72 61 6d 65 20 73 74 61 72 74 69     "frame starti
93e0: 6e 67 20 6f 66 66 73 65 74 20 6d 75 73 74 20 62  ng offset must b
93f0: 65 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65  e a non-negative
9400: 20 69 6e 74 65 67 65 72 22 2c 0a 20 20 20 20 22   integer",.    "
9410: 66 72 61 6d 65 20 65 6e 64 69 6e 67 20 6f 66 66  frame ending off
9420: 73 65 74 20 6d 75 73 74 20 62 65 20 61 20 6e 6f  set must be a no
9430: 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67  n-negative integ
9440: 65 72 22 2c 0a 20 20 20 20 22 73 65 63 6f 6e 64  er",.    "second
9450: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6e 74 68   argument to nth
9460: 5f 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20 61  _value must be a
9470: 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65   positive intege
9480: 72 22 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63  r".  };.  static
9490: 20 69 6e 74 20 61 4f 70 5b 5d 20 3d 20 7b 20 4f   int aOp[] = { O
94a0: 50 5f 47 65 2c 20 4f 50 5f 47 65 2c 20 4f 50 5f  P_Ge, OP_Ge, OP_
94b0: 47 74 20 7d 3b 0a 20 20 56 64 62 65 20 2a 76 20  Gt };.  Vdbe *v 
94c0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
94d0: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
94e0: 72 65 67 5a 65 72 6f 20 3d 20 73 71 6c 69 74 65  regZero = sqlite
94f0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
9500: 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  se);.  assert( e
9510: 43 6f 6e 64 3d 3d 30 20 7c 7c 20 65 43 6f 6e 64  Cond==0 || eCond
9520: 3d 3d 31 20 7c 7c 20 65 43 6f 6e 64 3d 3d 32 20  ==1 || eCond==2 
9530: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
9540: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
9550: 65 67 65 72 2c 20 30 2c 20 72 65 67 5a 65 72 6f  eger, 0, regZero
9560: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
9570: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73  AddOp2(v, OP_Mus
9580: 74 42 65 49 6e 74 2c 20 72 65 67 2c 20 73 71 6c  tBeInt, reg, sql
9590: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
95a0: 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 56 64 62  ddr(v)+2);.  Vdb
95b0: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 65  eCoverageIf(v, e
95c0: 43 6f 6e 64 3d 3d 30 29 3b 0a 20 20 56 64 62 65  Cond==0);.  Vdbe
95d0: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 65 43  CoverageIf(v, eC
95e0: 6f 6e 64 3d 3d 31 29 3b 0a 20 20 56 64 62 65 43  ond==1);.  VdbeC
95f0: 6f 76 65 72 61 67 65 49 66 28 76 2c 20 65 43 6f  overageIf(v, eCo
9600: 6e 64 3d 3d 32 29 3b 0a 20 20 73 71 6c 69 74 65  nd==2);.  sqlite
9610: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 61  3VdbeAddOp3(v, a
9620: 4f 70 5b 65 43 6f 6e 64 5d 2c 20 72 65 67 5a 65  Op[eCond], regZe
9630: 72 6f 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  ro, sqlite3VdbeC
9640: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 2c  urrentAddr(v)+2,
9650: 20 72 65 67 29 3b 0a 20 20 56 64 62 65 43 6f 76   reg);.  VdbeCov
9660: 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c 49 66  erageNeverNullIf
9670: 28 76 2c 20 65 43 6f 6e 64 3d 3d 30 29 3b 0a 20  (v, eCond==0);. 
9680: 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76   VdbeCoverageNev
9690: 65 72 4e 75 6c 6c 49 66 28 76 2c 20 65 43 6f 6e  erNullIf(v, eCon
96a0: 64 3d 3d 31 29 3b 0a 20 20 56 64 62 65 43 6f 76  d==1);.  VdbeCov
96b0: 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c 49 66  erageNeverNullIf
96c0: 28 76 2c 20 65 43 6f 6e 64 3d 3d 32 29 3b 0a 20  (v, eCond==2);. 
96d0: 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74   sqlite3MayAbort
96e0: 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
96f0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
9700: 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45   OP_Halt, SQLITE
9710: 5f 45 52 52 4f 52 2c 20 4f 45 5f 41 62 6f 72 74  _ERROR, OE_Abort
9720: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
9730: 41 70 70 65 6e 64 50 34 28 76 2c 20 28 76 6f 69  AppendP4(v, (voi
9740: 64 2a 29 61 7a 45 72 72 5b 65 43 6f 6e 64 5d 2c  d*)azErr[eCond],
9750: 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 73   P4_STATIC);.  s
9760: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
9770: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
9780: 5a 65 72 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Zero);.}../*.** 
9790: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
97a0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70  r of arguments p
97b0: 61 73 73 65 64 20 74 6f 20 74 68 65 20 77 69 6e  assed to the win
97c0: 64 6f 77 2d 66 75 6e 63 74 69 6f 6e 20 61 73 73  dow-function ass
97d0: 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
97e0: 74 68 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65  the object passe
97f0: 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
9800: 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
9810: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
9820: 69 63 20 69 6e 74 20 77 69 6e 64 6f 77 41 72 67  ic int windowArg
9830: 43 6f 75 6e 74 28 57 69 6e 64 6f 77 20 2a 70 57  Count(Window *pW
9840: 69 6e 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  in){.  ExprList 
9850: 2a 70 4c 69 73 74 20 3d 20 70 57 69 6e 2d 3e 70  *pList = pWin->p
9860: 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  Owner->x.pList;.
9870: 20 20 72 65 74 75 72 6e 20 28 70 4c 69 73 74 20    return (pList 
9880: 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  ? pList->nExpr :
9890: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65   0);.}../*.** Ge
98a0: 6e 65 72 61 74 65 20 56 4d 20 63 6f 64 65 20 74  nerate VM code t
98b0: 6f 20 69 6e 76 6f 6b 65 20 65 69 74 68 65 72 20  o invoke either 
98c0: 78 53 74 65 70 28 29 20 28 69 66 20 62 49 6e 76  xStep() (if bInv
98d0: 65 72 73 65 20 69 73 20 30 29 20 6f 72 20 0a 2a  erse is 0) or .*
98e0: 2a 20 78 49 6e 76 65 72 73 65 20 28 69 66 20 62  * xInverse (if b
98f0: 49 6e 76 65 72 73 65 20 69 73 20 6e 6f 6e 2d 7a  Inverse is non-z
9900: 65 72 6f 29 20 66 6f 72 20 65 61 63 68 20 77 69  ero) for each wi
9910: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 69 6e  ndow function in
9920: 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20   the .** linked 
9930: 6c 69 73 74 20 73 74 61 72 74 69 6e 67 20 61 74  list starting at
9940: 20 70 4d 57 69 6e 2e 20 4f 72 2c 20 66 6f 72 20   pMWin. Or, for 
9950: 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20  built-in window 
9960: 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 74 68 61  functions.** tha
9970: 74 20 64 6f 20 6e 6f 74 20 75 73 65 20 74 68 65  t do not use the
9980: 20 73 74 61 6e 64 61 72 64 20 66 75 6e 63 74 69   standard functi
9990: 6f 6e 20 41 50 49 2c 20 67 65 6e 65 72 61 74 65  on API, generate
99a0: 20 74 68 65 20 72 65 71 75 69 72 65 64 0a 2a 2a   the required.**
99b0: 20 69 6e 6c 69 6e 65 20 56 4d 20 63 6f 64 65 2e   inline VM code.
99c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  .**.** If argume
99d0: 6e 74 20 63 73 72 20 69 73 20 67 72 65 61 74 65  nt csr is greate
99e0: 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
99f0: 74 6f 20 30 2c 20 74 68 65 6e 20 61 72 67 75 6d  to 0, then argum
9a00: 65 6e 74 20 72 65 67 20 69 73 0a 2a 2a 20 74 68  ent reg is.** th
9a10: 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72  e first register
9a20: 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20   in an array of 
9a30: 72 65 67 69 73 74 65 72 73 20 67 75 61 72 61 6e  registers guaran
9a40: 74 65 65 64 20 74 6f 20 62 65 20 6c 61 72 67 65  teed to be large
9a50: 0a 2a 2a 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  .** enough to ho
9a60: 6c 64 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  ld the array of 
9a70: 61 72 67 75 6d 65 6e 74 73 20 66 6f 72 20 65 61  arguments for ea
9a80: 63 68 20 66 75 6e 63 74 69 6f 6e 2e 20 49 6e 20  ch function. In 
9a90: 74 68 69 73 20 63 61 73 65 0a 2a 2a 20 74 68 65  this case.** the
9aa0: 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 65   arguments are e
9ab0: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
9ac0: 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66  e current row of
9ad0: 20 63 73 72 20 69 6e 74 6f 20 74 68 65 0a 2a 2a   csr into the.**
9ae0: 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   array of regist
9af0: 65 72 73 20 62 65 66 6f 72 65 20 69 6e 76 6f 6b  ers before invok
9b00: 69 6e 67 20 4f 50 5f 41 67 67 53 74 65 70 20 6f  ing OP_AggStep o
9b10: 72 20 4f 50 5f 41 67 67 49 6e 76 65 72 73 65 0a  r OP_AggInverse.
9b20: 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 63 73 72  **.** Or, if csr
9b30: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65   is less than ze
9b40: 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 61 72 72  ro, then the arr
9b50: 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ay of registers 
9b60: 61 74 20 72 65 67 20 69 73 0a 2a 2a 20 61 6c 72  at reg is.** alr
9b70: 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64 20 77  eady populated w
9b80: 69 74 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20  ith all columns 
9b90: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
9ba0: 20 72 6f 77 20 6f 66 20 74 68 65 20 73 75 62 2d   row of the sub-
9bb0: 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  query..**.** If 
9bc0: 61 72 67 75 6d 65 6e 74 20 72 65 67 50 61 72 74  argument regPart
9bd0: 53 69 7a 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Size is non-zero
9be0: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61 20 72  , then it is a r
9bf0: 65 67 69 73 74 65 72 20 63 6f 6e 74 61 69 6e 69  egister containi
9c00: 6e 67 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72  ng the.** number
9c10: 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
9c20: 63 75 72 72 65 6e 74 20 70 61 72 74 69 74 69 6f  current partitio
9c30: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
9c40: 64 20 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28  d windowAggStep(
9c50: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9c60: 2c 20 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57  , .  Window *pMW
9c70: 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  in,             
9c80: 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c       /* Linked l
9c90: 69 73 74 20 6f 66 20 77 69 6e 64 6f 77 20 66 75  ist of window fu
9ca0: 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  nctions */.  int
9cb0: 20 63 73 72 2c 20 20 20 20 20 20 20 20 20 20 20   csr,           
9cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9cd0: 52 65 61 64 20 61 72 67 75 6d 65 6e 74 73 20 66  Read arguments f
9ce0: 72 6f 6d 20 74 68 69 73 20 63 75 72 73 6f 72 20  rom this cursor 
9cf0: 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 76 65 72 73  */.  int bInvers
9d00: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
9d10: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
9d20: 69 6e 76 6f 6b 65 20 78 49 6e 76 65 72 73 65 20  invoke xInverse 
9d30: 69 6e 73 74 65 61 64 20 6f 66 20 78 53 74 65 70  instead of xStep
9d40: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 2c 20 20   */.  int reg,  
9d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d60: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
9d70: 66 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20  f registers */. 
9d80: 20 69 6e 74 20 72 65 67 50 61 72 74 53 69 7a 65   int regPartSize
9d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9da0: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 63 6f 6e   /* Register con
9db0: 74 61 69 6e 69 6e 67 20 73 69 7a 65 20 6f 66 20  taining size of 
9dc0: 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 29 7b 0a  partition */.){.
9dd0: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
9de0: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
9df0: 65 29 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57  e);.  Window *pW
9e00: 69 6e 3b 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70  in;.  for(pWin=p
9e10: 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e  MWin; pWin; pWin
9e20: 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29  =pWin->pNextWin)
9e30: 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20  {.    int flags 
9e40: 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66  = pWin->pFunc->f
9e50: 75 6e 63 46 6c 61 67 73 3b 0a 20 20 20 20 69 6e  uncFlags;.    in
9e60: 74 20 72 65 67 41 72 67 3b 0a 20 20 20 20 69 6e  t regArg;.    in
9e70: 74 20 6e 41 72 67 20 3d 20 77 69 6e 64 6f 77 41  t nArg = windowA
9e80: 72 67 43 6f 75 6e 74 28 70 57 69 6e 29 3b 0a 0a  rgCount(pWin);..
9e90: 20 20 20 20 69 66 28 20 63 73 72 3e 3d 30 20 29      if( csr>=0 )
9ea0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
9eb0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
9ec0: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
9ed0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9ee0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
9ef0: 6d 6e 2c 20 63 73 72 2c 20 70 57 69 6e 2d 3e 69  mn, csr, pWin->i
9f00: 41 72 67 43 6f 6c 2b 69 2c 20 72 65 67 2b 69 29  ArgCol+i, reg+i)
9f10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9f20: 72 65 67 41 72 67 20 3d 20 72 65 67 3b 0a 20 20  regArg = reg;.  
9f30: 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20      if( flags & 
9f40: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44  SQLITE_FUNC_WIND
9f50: 4f 57 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20  OW_SIZE ){.     
9f60: 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 30 20 29     if( nArg==0 )
9f70: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 67 41  {.          regA
9f80: 72 67 20 3d 20 72 65 67 50 61 72 74 53 69 7a 65  rg = regPartSize
9f90: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
9fa0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
9fb0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
9fc0: 4f 50 5f 53 43 6f 70 79 2c 20 72 65 67 50 61 72  OP_SCopy, regPar
9fd0: 74 53 69 7a 65 2c 20 72 65 67 2b 6e 41 72 67 29  tSize, reg+nArg)
9fe0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9ff0: 20 20 20 20 6e 41 72 67 2b 2b 3b 0a 20 20 20 20      nArg++;.    
a000: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
a010: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28 66       assert( !(f
a020: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
a030: 4e 43 5f 57 49 4e 44 4f 57 5f 53 49 5a 45 29 20  NC_WINDOW_SIZE) 
a040: 29 3b 0a 20 20 20 20 20 20 72 65 67 41 72 67 20  );.      regArg 
a050: 3d 20 72 65 67 20 2b 20 70 57 69 6e 2d 3e 69 41  = reg + pWin->iA
a060: 72 67 43 6f 6c 3b 0a 20 20 20 20 7d 0a 0a 20 20  rgCol;.    }..  
a070: 20 20 69 66 28 20 28 70 57 69 6e 2d 3e 70 46 75    if( (pWin->pFu
a080: 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  nc->funcFlags & 
a090: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d  SQLITE_FUNC_MINM
a0a0: 41 58 29 20 0a 20 20 20 20 20 20 26 26 20 70 57  AX) .      && pW
a0b0: 69 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b 5f 55  in->eStart!=TK_U
a0c0: 4e 42 4f 55 4e 44 45 44 20 0a 20 20 20 20 29 7b  NBOUNDED .    ){
a0d0: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 49  .      int addrI
a0e0: 73 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56  sNull = sqlite3V
a0f0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
a100: 49 73 4e 75 6c 6c 2c 20 72 65 67 41 72 67 29 3b  IsNull, regArg);
a110: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
a120: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 69 66  age(v);.      if
a130: 28 20 62 49 6e 76 65 72 73 65 3d 3d 30 20 29 7b  ( bInverse==0 ){
a140: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a150: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
a160: 5f 41 64 64 49 6d 6d 2c 20 70 57 69 6e 2d 3e 72  _AddImm, pWin->r
a170: 65 67 41 70 70 2b 31 2c 20 31 29 3b 0a 20 20 20  egApp+1, 1);.   
a180: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a190: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
a1a0: 70 79 2c 20 72 65 67 41 72 67 2c 20 70 57 69 6e  py, regArg, pWin
a1b0: 2d 3e 72 65 67 41 70 70 29 3b 0a 20 20 20 20 20  ->regApp);.     
a1c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a1d0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
a1e0: 65 63 6f 72 64 2c 20 70 57 69 6e 2d 3e 72 65 67  ecord, pWin->reg
a1f0: 41 70 70 2c 20 32 2c 20 70 57 69 6e 2d 3e 72 65  App, 2, pWin->re
a200: 67 41 70 70 2b 32 29 3b 0a 20 20 20 20 20 20 20  gApp+2);.       
a210: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a220: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
a230: 72 74 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70  rt, pWin->csrApp
a240: 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 32  , pWin->regApp+2
a250: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
a260: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
a270: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
a280: 4f 50 5f 53 65 65 6b 47 45 2c 20 70 57 69 6e 2d  OP_SeekGE, pWin-
a290: 3e 63 73 72 41 70 70 2c 20 30 2c 20 72 65 67 41  >csrApp, 0, regA
a2a0: 72 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  rg, 1);.        
a2b0: 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65  VdbeCoverageNeve
a2c0: 72 54 61 6b 65 6e 28 76 29 3b 0a 20 20 20 20 20  rTaken(v);.     
a2d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a2e0: 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74  dOp1(v, OP_Delet
a2f0: 65 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 29  e, pWin->csrApp)
a300: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
a310: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
a320: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
a330: 65 6e 74 41 64 64 72 28 76 29 2d 32 29 3b 0a 20  entAddr(v)-2);. 
a340: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
a350: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
a360: 28 76 2c 20 61 64 64 72 49 73 4e 75 6c 6c 29 3b  (v, addrIsNull);
a370: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
a380: 57 69 6e 2d 3e 72 65 67 41 70 70 20 29 7b 0a 20  Win->regApp ){. 
a390: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69       assert( pWi
a3a0: 6e 2d 3e 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d  n->pFunc->zName=
a3b0: 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 0a 20  =nth_valueName. 
a3c0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 57 69            || pWi
a3d0: 6e 2d 3e 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d  n->pFunc->zName=
a3e0: 3d 66 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65  =first_valueName
a3f0: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
a400: 61 73 73 65 72 74 28 20 62 49 6e 76 65 72 73 65  assert( bInverse
a410: 3d 3d 30 20 7c 7c 20 62 49 6e 76 65 72 73 65 3d  ==0 || bInverse=
a420: 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
a430: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
a440: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 57 69 6e   OP_AddImm, pWin
a450: 2d 3e 72 65 67 41 70 70 2b 31 2d 62 49 6e 76 65  ->regApp+1-bInve
a460: 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c  rse, 1);.    }el
a470: 73 65 20 69 66 28 20 70 57 69 6e 2d 3e 70 46 75  se if( pWin->pFu
a480: 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e  nc->zName==leadN
a490: 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ame.           |
a4a0: 7c 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 7a  | pWin->pFunc->z
a4b0: 4e 61 6d 65 3d 3d 6c 61 67 4e 61 6d 65 0a 20 20  Name==lagName.  
a4c0: 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f    ){.      /* no
a4d0: 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  -op */.    }else
a4e0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
a4f0: 49 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  If = 0;.      if
a500: 28 20 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72 20  ( pWin->pFilter 
a510: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
a520: 65 67 54 6d 70 3b 0a 20 20 20 20 20 20 20 20 61  egTmp;.        a
a530: 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 30 20 7c  ssert( nArg==0 |
a540: 7c 20 6e 41 72 67 3d 3d 70 57 69 6e 2d 3e 70 4f  | nArg==pWin->pO
a550: 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  wner->x.pList->n
a560: 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 20 20  Expr );.        
a570: 61 73 73 65 72 74 28 20 6e 41 72 67 20 7c 7c 20  assert( nArg || 
a580: 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e  pWin->pOwner->x.
a590: 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pList==0 );.    
a5a0: 20 20 20 20 69 66 28 20 63 73 72 3e 30 20 29 7b      if( csr>0 ){
a5b0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 67 54 6d  .          regTm
a5c0: 70 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  p = sqlite3GetTe
a5d0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
a5e0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
a5f0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
a600: 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20 70 57  _Column, csr, pW
a610: 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 6e 41 72 67  in->iArgCol+nArg
a620: 2c 72 65 67 54 6d 70 29 3b 0a 20 20 20 20 20 20  ,regTmp);.      
a630: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a640: 20 20 20 72 65 67 54 6d 70 20 3d 20 72 65 67 41     regTmp = regA
a650: 72 67 20 2b 20 6e 41 72 67 3b 0a 20 20 20 20 20  rg + nArg;.     
a660: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64     }.        add
a670: 72 49 66 20 3d 20 73 71 6c 69 74 65 33 56 64 62  rIf = sqlite3Vdb
a680: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
a690: 4e 6f 74 2c 20 72 65 67 54 6d 70 2c 20 30 2c 20  Not, regTmp, 0, 
a6a0: 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  1);.        Vdbe
a6b0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
a6c0: 20 20 20 20 20 69 66 28 20 63 73 72 3e 30 20 29       if( csr>0 )
a6d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
a6e0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
a6f0: 67 28 70 50 61 72 73 65 2c 20 72 65 67 54 6d 70  g(pParse, regTmp
a700: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
a710: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
a720: 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63  Win->pFunc->func
a730: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
a740: 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a  UNC_NEEDCOLL ){.
a750: 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
a760: 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  *pColl;.        
a770: 61 73 73 65 72 74 28 20 6e 41 72 67 3e 30 20 29  assert( nArg>0 )
a780: 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  ;.        pColl 
a790: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43  = sqlite3ExprNNC
a7a0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
a7b0: 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70  Win->pOwner->x.p
a7c0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
a7d0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
a7e0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
a7f0: 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 30 2c  OP_CollSeq, 0,0,
a800: 30 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  0, (const char*)
a810: 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
a820: 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Q);.      }.    
a830: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a840: 4f 70 33 28 76 2c 20 62 49 6e 76 65 72 73 65 3f  Op3(v, bInverse?
a850: 20 4f 50 5f 41 67 67 49 6e 76 65 72 73 65 20 3a   OP_AggInverse :
a860: 20 4f 50 5f 41 67 67 53 74 65 70 2c 20 0a 20 20   OP_AggStep, .  
a870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a880: 20 20 20 20 20 20 62 49 6e 76 65 72 73 65 2c 20        bInverse, 
a890: 72 65 67 41 72 67 2c 20 70 57 69 6e 2d 3e 72 65  regArg, pWin->re
a8a0: 67 41 63 63 75 6d 29 3b 0a 20 20 20 20 20 20 73  gAccum);.      s
a8b0: 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64  qlite3VdbeAppend
a8c0: 50 34 28 76 2c 20 70 57 69 6e 2d 3e 70 46 75 6e  P4(v, pWin->pFun
a8d0: 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P4_FUNCDEF);.
a8e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a8f0: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38  eChangeP5(v, (u8
a900: 29 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 69 66  )nArg);.      if
a910: 28 20 61 64 64 72 49 66 20 29 20 73 71 6c 69 74  ( addrIf ) sqlit
a920: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
a930: 2c 20 61 64 64 72 49 66 29 3b 0a 20 20 20 20 7d  , addrIf);.    }
a940: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
a950: 6e 65 72 61 74 65 20 56 4d 20 63 6f 64 65 20 74  nerate VM code t
a960: 6f 20 69 6e 76 6f 6b 65 20 65 69 74 68 65 72 20  o invoke either 
a970: 78 56 61 6c 75 65 28 29 20 28 62 46 69 6e 61 6c  xValue() (bFinal
a980: 3d 3d 30 29 20 6f 72 20 78 46 69 6e 61 6c 69 7a  ==0) or xFinaliz
a990: 65 28 29 0a 2a 2a 20 28 62 46 69 6e 61 6c 3d 3d  e().** (bFinal==
a9a0: 31 29 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64  1) for each wind
a9b0: 6f 77 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 74  ow function in t
a9c0: 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73  he linked list s
a9d0: 74 61 72 74 69 6e 67 20 61 74 0a 2a 2a 20 70 4d  tarting at.** pM
a9e0: 57 69 6e 2e 20 4f 72 2c 20 66 6f 72 20 62 75 69  Win. Or, for bui
a9f0: 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 2d 66 75 6e  lt-in window-fun
aa00: 63 74 69 6f 6e 73 20 74 68 61 74 20 64 6f 20 6e  ctions that do n
aa10: 6f 74 20 75 73 65 20 74 68 65 20 73 74 61 6e 64  ot use the stand
aa20: 61 72 64 0a 2a 2a 20 41 50 49 2c 20 67 65 6e 65  ard.** API, gene
aa30: 72 61 74 65 20 74 68 65 20 65 71 75 69 76 61 6c  rate the equival
aa40: 65 6e 74 20 56 4d 20 63 6f 64 65 2e 0a 2a 2f 0a  ent VM code..*/.
aa50: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64  static void wind
aa60: 6f 77 41 67 67 46 69 6e 61 6c 28 50 61 72 73 65  owAggFinal(Parse
aa70: 20 2a 70 50 61 72 73 65 2c 20 57 69 6e 64 6f 77   *pParse, Window
aa80: 20 2a 70 4d 57 69 6e 2c 20 69 6e 74 20 62 46 69   *pMWin, int bFi
aa90: 6e 61 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  nal){.  Vdbe *v 
aaa0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
aab0: 28 70 50 61 72 73 65 29 3b 0a 20 20 57 69 6e 64  (pParse);.  Wind
aac0: 6f 77 20 2a 70 57 69 6e 3b 0a 0a 20 20 66 6f 72  ow *pWin;..  for
aad0: 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69  (pWin=pMWin; pWi
aae0: 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e  n; pWin=pWin->pN
aaf0: 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 69 66 28  extWin){.    if(
ab00: 20 28 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66   (pWin->pFunc->f
ab10: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
ab20: 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 20 0a  E_FUNC_MINMAX) .
ab30: 20 20 20 20 20 26 26 20 70 57 69 6e 2d 3e 65 53       && pWin->eS
ab40: 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44  tart!=TK_UNBOUND
ab50: 45 44 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ED .    ){.     
ab60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ab70: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
ab80: 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c  , pWin->regResul
ab90: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
aba0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
abb0: 50 5f 4c 61 73 74 2c 20 70 57 69 6e 2d 3e 63 73  P_Last, pWin->cs
abc0: 72 41 70 70 29 3b 0a 20 20 20 20 20 20 56 64 62  rApp);.      Vdb
abd0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
abe0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
abf0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
ac00: 6d 6e 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70  mn, pWin->csrApp
ac10: 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65  , 0, pWin->regRe
ac20: 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  sult);.      sql
ac30: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
ac40: 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  (v, sqlite3VdbeC
ac50: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 32 29  urrentAddr(v)-2)
ac60: 3b 0a 20 20 20 20 20 20 69 66 28 20 62 46 69 6e  ;.      if( bFin
ac70: 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  al ){.        sq
ac80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
ac90: 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74 65  v, OP_ResetSorte
aca0: 72 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 29  r, pWin->csrApp)
acb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
acc0: 6c 73 65 20 69 66 28 20 70 57 69 6e 2d 3e 72 65  lse if( pWin->re
acd0: 67 41 70 70 20 29 7b 0a 20 20 20 20 7d 65 6c 73  gApp ){.    }els
ace0: 65 7b 0a 20 20 20 20 20 20 69 66 28 20 62 46 69  e{.      if( bFi
acf0: 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  nal ){.        s
ad00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
ad10: 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c  (v, OP_AggFinal,
ad20: 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 2c   pWin->regAccum,
ad30: 20 77 69 6e 64 6f 77 41 72 67 43 6f 75 6e 74 28   windowArgCount(
ad40: 70 57 69 6e 29 29 3b 0a 20 20 20 20 20 20 20 20  pWin));.        
ad50: 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e  sqlite3VdbeAppen
ad60: 64 50 34 28 76 2c 20 70 57 69 6e 2d 3e 70 46 75  dP4(v, pWin->pFu
ad70: 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  nc, P4_FUNCDEF);
ad80: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ad90: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
ada0: 5f 43 6f 70 79 2c 20 70 57 69 6e 2d 3e 72 65 67  _Copy, pWin->reg
adb0: 41 63 63 75 6d 2c 20 70 57 69 6e 2d 3e 72 65 67  Accum, pWin->reg
adc0: 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 20  Result);.       
add0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ade0: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
adf0: 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d  , pWin->regAccum
ae00: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
ae10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ae20: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
ae30: 41 67 67 56 61 6c 75 65 2c 20 70 57 69 6e 2d 3e  AggValue, pWin->
ae40: 72 65 67 41 63 63 75 6d 2c 20 77 69 6e 64 6f 77  regAccum, window
ae50: 41 72 67 43 6f 75 6e 74 28 70 57 69 6e 29 2c 0a  ArgCount(pWin),.
ae60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae70: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 69               pWi
ae80: 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20  n->regResult);. 
ae90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
aea0: 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 57  beAppendP4(v, pW
aeb0: 69 6e 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55  in->pFunc, P4_FU
aec0: 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 7d 0a  NCDEF);.      }.
aed0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
aee0: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 75  ** Invoke the su
aef0: 62 2d 72 6f 75 74 69 6e 65 20 61 74 20 72 65 67  b-routine at reg
af00: 47 6f 73 75 62 20 28 67 65 6e 65 72 61 74 65 64  Gosub (generated
af10: 20 62 79 20 63 6f 64 65 20 69 6e 20 73 65 6c 65   by code in sele
af20: 63 74 2e 63 29 20 74 6f 0a 2a 2a 20 72 65 74 75  ct.c) to.** retu
af30: 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  rn the current r
af40: 6f 77 20 6f 66 20 57 69 6e 64 6f 77 2e 69 45 70  ow of Window.iEp
af50: 68 43 73 72 2e 20 49 66 20 61 6c 6c 20 77 69 6e  hCsr. If all win
af60: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 61 72  dow functions ar
af70: 65 0a 2a 2a 20 61 67 67 72 65 67 61 74 65 20 77  e.** aggregate w
af80: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
af90: 74 68 61 74 20 75 73 65 20 74 68 65 20 73 74 61  that use the sta
afa0: 6e 64 61 72 64 20 41 50 49 2c 20 61 20 73 69 6e  ndard API, a sin
afb0: 67 6c 65 0a 2a 2a 20 4f 50 5f 47 6f 73 75 62 20  gle.** OP_Gosub 
afc0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 61  instruction is a
afd0: 6c 6c 20 74 68 61 74 20 74 68 69 73 20 72 6f 75  ll that this rou
afe0: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 2e 20  tine generates. 
aff0: 45 78 74 72 61 20 56 4d 20 63 6f 64 65 0a 2a 2a  Extra VM code.**
b000: 20 66 6f 72 20 70 65 72 2d 72 6f 77 20 70 72 6f   for per-row pro
b010: 63 65 73 73 69 6e 67 20 69 73 20 6f 6e 6c 79 20  cessing is only 
b020: 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68  generated for th
b030: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 75 69 6c  e following buil
b040: 74 2d 69 6e 20 77 69 6e 64 6f 77 0a 2a 2a 20 66  t-in window.** f
b050: 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  unctions:.**.** 
b060: 20 20 6e 74 68 5f 76 61 6c 75 65 28 29 0a 2a 2a    nth_value().**
b070: 20 20 20 66 69 72 73 74 5f 76 61 6c 75 65 28 29     first_value()
b080: 0a 2a 2a 20 20 20 6c 61 67 28 29 0a 2a 2a 20 20  .**   lag().**  
b090: 20 6c 65 61 64 28 29 0a 2a 2f 0a 73 74 61 74 69   lead().*/.stati
b0a0: 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 52 65 74  c void windowRet
b0b0: 75 72 6e 4f 6e 65 52 6f 77 28 0a 20 20 50 61 72  urnOneRow(.  Par
b0c0: 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 57 69  se *pParse,.  Wi
b0d0: 6e 64 6f 77 20 2a 70 4d 57 69 6e 2c 0a 20 20 69  ndow *pMWin,.  i
b0e0: 6e 74 20 72 65 67 47 6f 73 75 62 2c 0a 20 20 69  nt regGosub,.  i
b0f0: 6e 74 20 61 64 64 72 47 6f 73 75 62 0a 29 7b 0a  nt addrGosub.){.
b100: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
b110: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
b120: 65 29 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57  e);.  Window *pW
b130: 69 6e 3b 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70  in;.  for(pWin=p
b140: 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e  MWin; pWin; pWin
b150: 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29  =pWin->pNextWin)
b160: 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70  {.    FuncDef *p
b170: 46 75 6e 63 20 3d 20 70 57 69 6e 2d 3e 70 46 75  Func = pWin->pFu
b180: 6e 63 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e  nc;.    if( pFun
b190: 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61  c->zName==nth_va
b1a0: 6c 75 65 4e 61 6d 65 0a 20 20 20 20 20 7c 7c 20  lueName.     || 
b1b0: 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69  pFunc->zName==fi
b1c0: 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65 0a 20 20  rst_valueName.  
b1d0: 20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 63    ){.      int c
b1e0: 73 72 20 3d 20 70 57 69 6e 2d 3e 63 73 72 41 70  sr = pWin->csrAp
b1f0: 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 62 6c  p;.      int lbl
b200: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
b210: 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
b220: 0a 20 20 20 20 20 20 69 6e 74 20 74 6d 70 52 65  .      int tmpRe
b230: 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
b240: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
b250: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b260: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
b270: 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 52  l, 0, pWin->regR
b280: 65 73 75 6c 74 29 3b 0a 0a 20 20 20 20 20 20 69  esult);..      i
b290: 66 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d  f( pFunc->zName=
b2a0: 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 20 29  =nth_valueName )
b2b0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
b2c0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
b2d0: 50 5f 43 6f 6c 75 6d 6e 2c 20 70 4d 57 69 6e 2d  P_Column, pMWin-
b2e0: 3e 69 45 70 68 43 73 72 2c 20 70 57 69 6e 2d 3e  >iEphCsr, pWin->
b2f0: 69 41 72 67 43 6f 6c 2b 31 2c 74 6d 70 52 65 67  iArgCol+1,tmpReg
b300: 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f  );.        windo
b310: 77 43 68 65 63 6b 49 6e 74 56 61 6c 75 65 28 70  wCheckIntValue(p
b320: 50 61 72 73 65 2c 20 74 6d 70 52 65 67 2c 20 32  Parse, tmpReg, 2
b330: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
b340: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b350: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b360: 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 6d 70 52  Integer, 1, tmpR
b370: 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eg);.      }.   
b380: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b390: 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20  dOp3(v, OP_Add, 
b3a0: 74 6d 70 52 65 67 2c 20 70 57 69 6e 2d 3e 72 65  tmpReg, pWin->re
b3b0: 67 41 70 70 2c 20 74 6d 70 52 65 67 29 3b 0a 20  gApp, tmpReg);. 
b3c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b3d0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 47 74 2c  AddOp3(v, OP_Gt,
b3e0: 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31 2c   pWin->regApp+1,
b3f0: 20 6c 62 6c 2c 20 74 6d 70 52 65 67 29 3b 0a 20   lbl, tmpReg);. 
b400: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
b410: 65 4e 65 76 65 72 4e 75 6c 6c 28 76 29 3b 0a 20  eNeverNull(v);. 
b420: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b430: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65  AddOp3(v, OP_See
b440: 6b 52 6f 77 69 64 2c 20 63 73 72 2c 20 30 2c 20  kRowid, csr, 0, 
b450: 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20 20 56  tmpReg);.      V
b460: 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72  dbeCoverageNever
b470: 54 61 6b 65 6e 28 76 29 3b 0a 20 20 20 20 20 20  Taken(v);.      
b480: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b490: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
b4a0: 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43  csr, pWin->iArgC
b4b0: 6f 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73  ol, pWin->regRes
b4c0: 75 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ult);.      sqli
b4d0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
b4e0: 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20 20 20  bel(v, lbl);.   
b4f0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
b500: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
b510: 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 7d 0a   tmpReg);.    }.
b520: 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 46 75      else if( pFu
b530: 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e  nc->zName==leadN
b540: 61 6d 65 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e  ame || pFunc->zN
b550: 61 6d 65 3d 3d 6c 61 67 4e 61 6d 65 20 29 7b 0a  ame==lagName ){.
b560: 20 20 20 20 20 20 69 6e 74 20 6e 41 72 67 20 3d        int nArg =
b570: 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78   pWin->pOwner->x
b580: 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  .pList->nExpr;. 
b590: 20 20 20 20 20 69 6e 74 20 63 73 72 20 3d 20 70       int csr = p
b5a0: 57 69 6e 2d 3e 63 73 72 41 70 70 3b 0a 20 20 20  Win->csrApp;.   
b5b0: 20 20 20 69 6e 74 20 6c 62 6c 20 3d 20 73 71 6c     int lbl = sql
b5c0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
b5d0: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
b5e0: 20 69 6e 74 20 74 6d 70 52 65 67 20 3d 20 73 71   int tmpReg = sq
b5f0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
b600: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
b610: 6e 74 20 69 45 70 68 20 3d 20 70 4d 57 69 6e 2d  nt iEph = pMWin-
b620: 3e 69 45 70 68 43 73 72 3b 0a 0a 20 20 20 20 20  >iEphCsr;..     
b630: 20 69 66 28 20 6e 41 72 67 3c 33 20 29 7b 0a 20   if( nArg<3 ){. 
b640: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b650: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
b660: 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65  ull, 0, pWin->re
b670: 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20  gResult);.      
b680: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
b690: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
b6a0: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
b6b0: 45 70 68 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43  Eph, pWin->iArgC
b6c0: 6f 6c 2b 32 2c 20 70 57 69 6e 2d 3e 72 65 67 52  ol+2, pWin->regR
b6d0: 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 0a  esult);.      }.
b6e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b6f0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
b700: 77 69 64 2c 20 69 45 70 68 2c 20 74 6d 70 52 65  wid, iEph, tmpRe
b710: 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 41  g);.      if( nA
b720: 72 67 3c 32 20 29 7b 0a 20 20 20 20 20 20 20 20  rg<2 ){.        
b730: 69 6e 74 20 76 61 6c 20 3d 20 28 70 46 75 6e 63  int val = (pFunc
b740: 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d  ->zName==leadNam
b750: 65 20 3f 20 31 20 3a 20 2d 31 29 3b 0a 20 20 20  e ? 1 : -1);.   
b760: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b770: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
b780: 49 6d 6d 2c 20 74 6d 70 52 65 67 2c 20 76 61 6c  Imm, tmpReg, val
b790: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
b7a0: 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d          int op =
b7b0: 20 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d   (pFunc->zName==
b7c0: 6c 65 61 64 4e 61 6d 65 20 3f 20 4f 50 5f 41 64  leadName ? OP_Ad
b7d0: 64 20 3a 20 4f 50 5f 53 75 62 74 72 61 63 74 29  d : OP_Subtract)
b7e0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 6d  ;.        int tm
b7f0: 70 52 65 67 32 20 3d 20 73 71 6c 69 74 65 33 47  pReg2 = sqlite3G
b800: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
b810: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
b820: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
b830: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 45 70 68 2c  OP_Column, iEph,
b840: 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 31   pWin->iArgCol+1
b850: 2c 20 74 6d 70 52 65 67 32 29 3b 0a 20 20 20 20  , tmpReg2);.    
b860: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b870: 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 74 6d 70  ddOp3(v, op, tmp
b880: 52 65 67 32 2c 20 74 6d 70 52 65 67 2c 20 74 6d  Reg2, tmpReg, tm
b890: 70 52 65 67 29 3b 0a 20 20 20 20 20 20 20 20 73  pReg);.        s
b8a0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
b8b0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 74 6d 70  pReg(pParse, tmp
b8c0: 52 65 67 32 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  Reg2);.      }..
b8d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b8e0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65  eAddOp3(v, OP_Se
b8f0: 65 6b 52 6f 77 69 64 2c 20 63 73 72 2c 20 6c 62  ekRowid, csr, lb
b900: 6c 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20  l, tmpReg);.    
b910: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
b920: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b930: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
b940: 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20 70 57  _Column, csr, pW
b950: 69 6e 2d 3e 69 41 72 67 43 6f 6c 2c 20 70 57 69  in->iArgCol, pWi
b960: 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20  n->regResult);. 
b970: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b980: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
b990: 6c 62 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lbl);.      sqli
b9a0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
b9b0: 67 28 70 50 61 72 73 65 2c 20 74 6d 70 52 65 67  g(pParse, tmpReg
b9c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
b9d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
b9e0: 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
b9f0: 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75  gGosub, addrGosu
ba00: 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  b);.}../*.** Gen
ba10: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 65  erate code to se
ba20: 74 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  t the accumulato
ba30: 72 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 65  r register for e
ba40: 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  ach window funct
ba50: 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 6c 69  ion.** in the li
ba60: 6e 6b 65 64 20 6c 69 73 74 20 70 61 73 73 65 64  nked list passed
ba70: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
ba80: 72 67 75 6d 65 6e 74 20 74 6f 20 4e 55 4c 4c 2e  rgument to NULL.
ba90: 20 41 6e 64 20 70 65 72 66 6f 72 6d 0a 2a 2a 20   And perform.** 
baa0: 61 6e 79 20 65 71 75 69 76 61 6c 65 6e 74 20 69  any equivalent i
bab0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 72 65  nitialization re
bac0: 71 75 69 72 65 64 20 62 79 20 61 6e 79 20 62 75  quired by any bu
bad0: 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75  ilt-in window fu
bae0: 6e 63 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 74 68  nctions.** in th
baf0: 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
bb00: 63 20 69 6e 74 20 77 69 6e 64 6f 77 49 6e 69 74  c int windowInit
bb10: 41 63 63 75 6d 28 50 61 72 73 65 20 2a 70 50 61  Accum(Parse *pPa
bb20: 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70 4d 57  rse, Window *pMW
bb30: 69 6e 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  in){.  Vdbe *v =
bb40: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
bb50: 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72  pParse);.  int r
bb60: 65 67 41 72 67 3b 0a 20 20 69 6e 74 20 6e 41 72  egArg;.  int nAr
bb70: 67 20 3d 20 30 3b 0a 20 20 57 69 6e 64 6f 77 20  g = 0;.  Window 
bb80: 2a 70 57 69 6e 3b 0a 20 20 66 6f 72 28 70 57 69  *pWin;.  for(pWi
bb90: 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70  n=pMWin; pWin; p
bba0: 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57  Win=pWin->pNextW
bbb0: 69 6e 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66  in){.    FuncDef
bbc0: 20 2a 70 46 75 6e 63 20 3d 20 70 57 69 6e 2d 3e   *pFunc = pWin->
bbd0: 70 46 75 6e 63 3b 0a 20 20 20 20 73 71 6c 69 74  pFunc;.    sqlit
bbe0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
bbf0: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e  OP_Null, 0, pWin
bc00: 2d 3e 72 65 67 41 63 63 75 6d 29 3b 0a 20 20 20  ->regAccum);.   
bc10: 20 6e 41 72 67 20 3d 20 4d 41 58 28 6e 41 72 67   nArg = MAX(nArg
bc20: 2c 20 77 69 6e 64 6f 77 41 72 67 43 6f 75 6e 74  , windowArgCount
bc30: 28 70 57 69 6e 29 29 3b 0a 20 20 20 20 69 66 28  (pWin));.    if(
bc40: 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e   pFunc->zName==n
bc50: 74 68 5f 76 61 6c 75 65 4e 61 6d 65 0a 20 20 20  th_valueName.   
bc60: 20 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d    || pFunc->zNam
bc70: 65 3d 3d 66 69 72 73 74 5f 76 61 6c 75 65 4e 61  e==first_valueNa
bc80: 6d 65 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  me.    ){.      
bc90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
bca0: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
bcb0: 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70   0, pWin->regApp
bcc0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
bcd0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
bce0: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 57 69  _Integer, 0, pWi
bcf0: 6e 2d 3e 72 65 67 41 70 70 2b 31 29 3b 0a 20 20  n->regApp+1);.  
bd00: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 46    }..    if( (pF
bd10: 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  unc->funcFlags &
bd20: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e   SQLITE_FUNC_MIN
bd30: 4d 41 58 29 20 26 26 20 70 57 69 6e 2d 3e 63 73  MAX) && pWin->cs
bd40: 72 41 70 70 20 29 7b 0a 20 20 20 20 20 20 61 73  rApp ){.      as
bd50: 73 65 72 74 28 20 70 57 69 6e 2d 3e 65 53 74 61  sert( pWin->eSta
bd60: 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  rt!=TK_UNBOUNDED
bd70: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
bd80: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
bd90: 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20 70  P_ResetSorter, p
bda0: 57 69 6e 2d 3e 63 73 72 41 70 70 29 3b 0a 20 20  Win->csrApp);.  
bdb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
bdc0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
bdd0: 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65  ger, 0, pWin->re
bde0: 67 41 70 70 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  gApp+1);.    }. 
bdf0: 20 7d 0a 20 20 72 65 67 41 72 67 20 3d 20 70 50   }.  regArg = pP
be00: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
be10: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
be20: 6e 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20 72  nArg;.  return r
be30: 65 67 41 72 67 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  egArg;.}../* .**
be40: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
be50: 74 68 65 20 65 6e 74 69 72 65 20 70 61 72 74 69  the entire parti
be60: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 63  tion should be c
be70: 61 63 68 65 64 20 69 6e 20 74 68 65 20 65 70 68  ached in the eph
be80: 65 6d 65 72 61 6c 0a 2a 2a 20 74 61 62 6c 65 20  emeral.** table 
be90: 62 65 66 6f 72 65 20 70 72 6f 63 65 73 73 69 6e  before processin
bea0: 67 20 61 6e 79 20 72 6f 77 73 2e 0a 2a 2f 0a 73  g any rows..*/.s
beb0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 64 6f 77  tatic int window
bec0: 43 61 63 68 65 50 61 72 74 69 74 69 6f 6e 28 57  CachePartition(W
bed0: 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 29 7b 0a 20  indow *pMWin){. 
bee0: 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20   Window *pWin;. 
bef0: 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b   for(pWin=pMWin;
bf00: 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e   pWin; pWin=pWin
bf10: 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20  ->pNextWin){.   
bf20: 20 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20   FuncDef *pFunc 
bf30: 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20  = pWin->pFunc;. 
bf40: 20 20 20 69 66 28 20 28 70 46 75 6e 63 2d 3e 66     if( (pFunc->f
bf50: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
bf60: 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 5f 53 49  E_FUNC_WINDOW_SI
bf70: 5a 45 29 0a 20 20 20 20 20 7c 7c 20 28 70 46 75  ZE).     || (pFu
bf80: 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76  nc->zName==nth_v
bf90: 61 6c 75 65 4e 61 6d 65 29 0a 20 20 20 20 20 7c  alueName).     |
bfa0: 7c 20 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d  | (pFunc->zName=
bfb0: 3d 66 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65  =first_valueName
bfc0: 29 0a 20 20 20 20 20 7c 7c 20 28 70 46 75 6e 63  ).     || (pFunc
bfd0: 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d  ->zName==leadNam
bfe0: 65 29 0a 20 20 20 20 20 7c 7c 20 28 70 46 75 6e  e).     || (pFun
bff0: 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 61 67 4e 61 6d  c->zName==lagNam
c000: 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  e).    ){.      
c010: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
c020: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
c030: 7d 0a 0a 2f 2a 0a 2a 2a 20 72 65 67 4f 6c 64 20  }../*.** regOld 
c040: 61 6e 64 20 72 65 67 4e 65 77 20 61 72 65 20 65  and regNew are e
c050: 61 63 68 20 74 68 65 20 66 69 72 73 74 20 72 65  ach the first re
c060: 67 69 73 74 65 72 20 69 6e 20 61 6e 20 61 72 72  gister in an arr
c070: 61 79 20 6f 66 20 73 69 7a 65 0a 2a 2a 20 70 4f  ay of size.** pO
c080: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2e 20 54  rderBy->nExpr. T
c090: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 67 65 6e  his function gen
c0a0: 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20 63  erates code to c
c0b0: 6f 6d 70 61 72 65 20 74 68 65 20 74 77 6f 0a 2a  ompare the two.*
c0c0: 2a 20 61 72 72 61 79 73 20 6f 66 20 72 65 67 69  * arrays of regi
c0d0: 73 74 65 72 73 20 75 73 69 6e 67 20 74 68 65 20  sters using the 
c0e0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
c0f0: 63 65 73 20 61 6e 64 20 6f 74 68 65 72 20 63 6f  ces and other co
c100: 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 70 61 72 61  mparison.** para
c110: 6d 65 74 65 72 73 20 73 70 65 63 69 66 69 65 64  meters specified
c120: 20 62 79 20 70 4f 72 64 65 72 42 79 2e 20 0a 2a   by pOrderBy. .*
c130: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 77 6f 20  *.** If the two 
c140: 61 72 72 61 79 73 20 61 72 65 20 6e 6f 74 20 65  arrays are not e
c150: 71 75 61 6c 2c 20 74 68 65 20 63 6f 6e 74 65 6e  qual, the conten
c160: 74 73 20 6f 66 20 72 65 67 4e 65 77 20 69 73 20  ts of regNew is 
c170: 63 6f 70 69 65 64 20 74 6f 20 0a 2a 2a 20 72 65  copied to .** re
c180: 67 4f 6c 64 20 61 6e 64 20 63 6f 6e 74 72 6f 6c  gOld and control
c190: 20 66 61 6c 6c 73 20 74 68 72 6f 75 67 68 2e 20   falls through. 
c1a0: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
c1b0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
c1c0: 65 20 61 72 72 61 79 73 0a 2a 2a 20 61 72 65 20  e arrays.** are 
c1d0: 65 71 75 61 6c 2c 20 61 6e 20 4f 50 5f 47 6f 74  equal, an OP_Got
c1e0: 6f 20 69 73 20 65 78 65 63 75 74 65 64 2e 20 54  o is executed. T
c1f0: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
c200: 65 20 4f 50 5f 47 6f 74 6f 20 69 73 20 72 65 74  e OP_Goto is ret
c210: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
c220: 20 69 6e 74 20 77 69 6e 64 6f 77 49 66 4e 65 77   int windowIfNew
c230: 50 65 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70  Peer(.  Parse *p
c240: 50 61 72 73 65 2c 0a 20 20 45 78 70 72 4c 69 73  Parse,.  ExprLis
c250: 74 20 2a 70 4f 72 64 65 72 42 79 2c 0a 20 20 69  t *pOrderBy,.  i
c260: 6e 74 20 72 65 67 4e 65 77 2c 20 20 20 20 20 20  nt regNew,      
c270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c280: 2a 20 46 69 72 73 74 20 69 6e 20 61 72 72 61 79  * First in array
c290: 20 6f 66 20 6e 65 77 20 76 61 6c 75 65 73 20 2a   of new values *
c2a0: 2f 0a 20 20 69 6e 74 20 72 65 67 4f 6c 64 20 20  /.  int regOld  
c2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2c0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 69 6e 20      /* First in 
c2d0: 61 72 72 61 79 20 6f 66 20 6f 6c 64 20 76 61 6c  array of old val
c2e0: 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  ues */.){.  Vdbe
c2f0: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
c300: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
c310: 69 6e 74 20 61 64 64 72 3b 0a 20 20 69 66 28 20  int addr;.  if( 
c320: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
c330: 69 6e 74 20 6e 56 61 6c 20 3d 20 70 4f 72 64 65  int nVal = pOrde
c340: 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  rBy->nExpr;.    
c350: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
c360: 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
c370: 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
c380: 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
c390: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
c3a0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
c3b0: 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67   OP_Compare, reg
c3c0: 4f 6c 64 2c 20 72 65 67 4e 65 77 2c 20 6e 56 61  Old, regNew, nVa
c3d0: 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  l);.    sqlite3V
c3e0: 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28  dbeAppendP4(v, (
c3f0: 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  void*)pKeyInfo, 
c400: 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
c410: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
c420: 64 62 65 41 64 64 4f 70 33 28 0a 20 20 20 20 20  dbeAddOp3(.     
c430: 20 20 20 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 73     v, OP_Jump, s
c440: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
c450: 74 41 64 64 72 28 76 29 2b 31 2c 20 30 2c 20 73  tAddr(v)+1, 0, s
c460: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
c470: 74 41 64 64 72 28 76 29 2b 31 0a 20 20 20 20 29  tAddr(v)+1.    )
c480: 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
c490: 67 65 45 71 4e 65 28 76 29 3b 0a 20 20 20 20 73  geEqNe(v);.    s
c4a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
c4b0: 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67  (v, OP_Copy, reg
c4c0: 4e 65 77 2c 20 72 65 67 4f 6c 64 2c 20 6e 56 61  New, regOld, nVa
c4d0: 6c 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  l-1);.  }else{. 
c4e0: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
c4f0: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
c500: 50 5f 47 6f 74 6f 29 3b 0a 20 20 7d 0a 20 20 72  P_Goto);.  }.  r
c510: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 74  eturn addr;.}..t
c520: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57 69  ypedef struct Wi
c530: 6e 64 6f 77 43 6f 64 65 41 72 67 20 57 69 6e 64  ndowCodeArg Wind
c540: 6f 77 43 6f 64 65 41 72 67 3b 0a 74 79 70 65 64  owCodeArg;.typed
c550: 65 66 20 73 74 72 75 63 74 20 57 69 6e 64 6f 77  ef struct Window
c560: 43 73 72 41 6e 64 52 65 67 20 57 69 6e 64 6f 77  CsrAndReg Window
c570: 43 73 72 41 6e 64 52 65 67 3b 0a 73 74 72 75 63  CsrAndReg;.struc
c580: 74 20 57 69 6e 64 6f 77 43 73 72 41 6e 64 52 65  t WindowCsrAndRe
c590: 67 20 7b 0a 20 20 69 6e 74 20 63 73 72 3b 0a 20  g {.  int csr;. 
c5a0: 20 69 6e 74 20 72 65 67 3b 0a 7d 3b 0a 73 74 72   int reg;.};.str
c5b0: 75 63 74 20 57 69 6e 64 6f 77 43 6f 64 65 41 72  uct WindowCodeAr
c5c0: 67 20 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  g {.  Parse *pPa
c5d0: 72 73 65 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70  rse;.  Window *p
c5e0: 4d 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 70 56  MWin;.  Vdbe *pV
c5f0: 64 62 65 3b 0a 20 20 69 6e 74 20 72 65 67 47 6f  dbe;.  int regGo
c600: 73 75 62 3b 0a 20 20 69 6e 74 20 61 64 64 72 47  sub;.  int addrG
c610: 6f 73 75 62 3b 0a 20 20 69 6e 74 20 72 65 67 41  osub;.  int regA
c620: 72 67 3b 0a 0a 20 20 57 69 6e 64 6f 77 43 73 72  rg;..  WindowCsr
c630: 41 6e 64 52 65 67 20 73 74 61 72 74 3b 0a 20 20  AndReg start;.  
c640: 57 69 6e 64 6f 77 43 73 72 41 6e 64 52 65 67 20  WindowCsrAndReg 
c650: 63 75 72 72 65 6e 74 3b 0a 20 20 57 69 6e 64 6f  current;.  Windo
c660: 77 43 73 72 41 6e 64 52 65 67 20 65 6e 64 3b 0a  wCsrAndReg end;.
c670: 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 57 49 4e 44  };..#define WIND
c680: 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 20 31 0a  OW_RETURN_ROW 1.
c690: 23 64 65 66 69 6e 65 20 57 49 4e 44 4f 57 5f 41  #define WINDOW_A
c6a0: 47 47 49 4e 56 45 52 53 45 20 32 0a 23 64 65 66  GGINVERSE 2.#def
c6b0: 69 6e 65 20 57 49 4e 44 4f 57 5f 41 47 47 53 54  ine WINDOW_AGGST
c6c0: 45 50 20 20 20 20 33 0a 0a 2f 2a 0a 2a 2a 20 47  EP    3../*.** G
c6d0: 65 6e 65 72 61 74 65 20 56 4d 20 63 6f 64 65 20  enerate VM code 
c6e0: 74 6f 20 72 65 61 64 20 74 68 65 20 77 69 6e 64  to read the wind
c6f0: 6f 77 20 66 72 61 6d 65 73 20 70 65 65 72 20 76  ow frames peer v
c700: 61 6c 75 65 73 20 66 72 6f 6d 20 63 75 72 73 6f  alues from curso
c710: 72 20 63 73 72 20 69 6e 74 6f 0a 2a 2a 20 61 6e  r csr into.** an
c720: 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   array of regist
c730: 65 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  ers starting at 
c740: 72 65 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  reg..*/.static v
c750: 6f 69 64 20 77 69 6e 64 6f 77 52 65 61 64 50 65  oid windowReadPe
c760: 65 72 56 61 6c 75 65 73 28 0a 20 20 57 69 6e 64  erValues(.  Wind
c770: 6f 77 43 6f 64 65 41 72 67 20 2a 70 2c 0a 20 20  owCodeArg *p,.  
c780: 69 6e 74 20 63 73 72 2c 0a 20 20 69 6e 74 20 72  int csr,.  int r
c790: 65 67 0a 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a  eg.){.  Window *
c7a0: 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 4d 57 69 6e  pMWin = p->pMWin
c7b0: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  ;.  ExprList *pO
c7c0: 72 64 65 72 42 79 20 3d 20 70 4d 57 69 6e 2d 3e  rderBy = pMWin->
c7d0: 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20  pOrderBy;.  if( 
c7e0: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
c7f0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
c800: 33 47 65 74 56 64 62 65 28 70 2d 3e 70 50 61 72  3GetVdbe(p->pPar
c810: 73 65 29 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  se);.    ExprLis
c820: 74 20 2a 70 50 61 72 74 20 3d 20 70 4d 57 69 6e  t *pPart = pMWin
c830: 2d 3e 70 50 61 72 74 69 74 69 6f 6e 3b 0a 20 20  ->pPartition;.  
c840: 20 20 69 6e 74 20 69 43 6f 6c 4f 66 66 20 3d 20    int iColOff = 
c850: 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f  pMWin->nBufferCo
c860: 6c 20 2b 20 28 70 50 61 72 74 20 3f 20 70 50 61  l + (pPart ? pPa
c870: 72 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a  rt->nExpr : 0);.
c880: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
c890: 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72  or(i=0; i<pOrder
c8a0: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
c8b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c8c0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
c8d0: 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20 69 43 6f 6c  olumn, csr, iCol
c8e0: 4f 66 66 2b 69 2c 20 72 65 67 2b 69 29 3b 0a 20  Off+i, reg+i);. 
c8f0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
c900: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
c910: 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72  is called as par
c920: 74 20 6f 66 20 67 65 6e 65 72 61 74 69 6e 67 20  t of generating 
c930: 56 4d 20 70 72 6f 67 72 61 6d 73 20 66 6f 72 20  VM programs for 
c940: 52 41 4e 47 45 0a 2a 2a 20 6f 66 66 73 65 74 20  RANGE.** offset 
c950: 50 52 45 43 45 44 49 4e 47 2f 46 4f 4c 4c 4f 57  PRECEDING/FOLLOW
c960: 49 4e 47 20 66 72 61 6d 65 20 62 6f 75 6e 64 61  ING frame bounda
c970: 72 69 65 73 2e 20 49 74 20 67 65 6e 65 72 61 74  ries. It generat
c980: 65 73 20 63 6f 64 65 20 65 71 75 69 76 61 6c 65  es code equivale
c990: 6e 74 0a 2a 2a 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20  nt.** to:.**.** 
c9a0: 20 20 69 66 28 20 63 73 72 31 2e 70 65 65 72 56    if( csr1.peerV
c9b0: 61 6c 20 2b 20 72 65 67 56 61 6c 20 3e 3d 20 63  al + regVal >= c
c9c0: 73 72 32 2e 70 65 65 72 56 61 6c 20 29 20 67 6f  sr2.peerVal ) go
c9d0: 74 6f 20 6c 62 6c 3b 0a 2a 2a 20 20 20 69 66 28  to lbl;.**   if(
c9e0: 20 63 73 72 31 2e 72 6f 77 69 64 20 3e 3d 20 63   csr1.rowid >= c
c9f0: 73 72 32 2e 72 6f 77 69 64 20 29 20 67 6f 74 6f  sr2.rowid ) goto
ca00: 20 6c 62 6c 3b 0a 2a 2f 0a 73 74 61 74 69 63 20   lbl;.*/.static 
ca10: 76 6f 69 64 20 77 69 6e 64 6f 77 43 6f 64 65 52  void windowCodeR
ca20: 61 6e 67 65 54 65 73 74 28 0a 20 20 57 69 6e 64  angeTest(.  Wind
ca30: 6f 77 43 6f 64 65 41 72 67 20 2a 70 2c 20 0a 20  owCodeArg *p, . 
ca40: 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20   int op,        
ca50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca60: 20 20 2f 2a 20 4f 50 5f 47 65 20 6f 72 20 4f 50    /* OP_Ge or OP
ca70: 5f 47 74 20 2a 2f 0a 20 20 69 6e 74 20 63 73 72  _Gt */.  int csr
ca80: 31 2c 20 0a 20 20 69 6e 74 20 72 65 67 56 61 6c  1, .  int regVal
ca90: 2c 20 0a 20 20 69 6e 74 20 63 73 72 32 2c 0a 20  , .  int csr2,. 
caa0: 20 69 6e 74 20 6c 62 6c 0a 29 7b 0a 20 20 50 61   int lbl.){.  Pa
cab0: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d  rse *pParse = p-
cac0: 3e 70 50 61 72 73 65 3b 0a 20 20 56 64 62 65 20  >pParse;.  Vdbe 
cad0: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
cae0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
caf0: 6e 74 20 72 65 67 31 20 3d 20 73 71 6c 69 74 65  nt reg1 = sqlite
cb00: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
cb10: 73 65 29 3b 0a 20 20 69 6e 74 20 72 65 67 32 20  se);.  int reg2 
cb20: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
cb30: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 77  Reg(pParse);.  w
cb40: 69 6e 64 6f 77 52 65 61 64 50 65 65 72 56 61 6c  indowReadPeerVal
cb50: 75 65 73 28 70 2c 20 63 73 72 31 2c 20 72 65 67  ues(p, csr1, reg
cb60: 31 29 3b 0a 20 20 77 69 6e 64 6f 77 52 65 61 64  1);.  windowRead
cb70: 50 65 65 72 56 61 6c 75 65 73 28 70 2c 20 63 73  PeerValues(p, cs
cb80: 72 32 2c 20 72 65 67 32 29 3b 0a 20 20 73 71 6c  r2, reg2);.  sql
cb90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
cba0: 2c 20 4f 50 5f 41 64 64 2c 20 72 65 67 31 2c 20  , OP_Add, reg1, 
cbb0: 72 65 67 56 61 6c 2c 20 72 65 67 31 29 3b 0a 20  regVal, reg1);. 
cbc0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
cbd0: 70 33 28 76 2c 20 6f 70 2c 20 72 65 67 32 2c 20  p3(v, op, reg2, 
cbe0: 6c 62 6c 2c 20 72 65 67 31 29 3b 0a 20 20 73 71  lbl, reg1);.  sq
cbf0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
cc00: 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 63 73 72  v, OP_Rowid, csr
cc10: 31 2c 20 72 65 67 31 29 3b 0a 20 20 73 71 6c 69  1, reg1);.  sqli
cc20: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
cc30: 20 4f 50 5f 52 6f 77 69 64 2c 20 63 73 72 32 2c   OP_Rowid, csr2,
cc40: 20 72 65 67 32 29 3b 0a 20 20 73 71 6c 69 74 65   reg2);.  sqlite
cc50: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
cc60: 50 5f 47 74 2c 20 72 65 67 32 2c 20 6c 62 6c 2c  P_Gt, reg2, lbl,
cc70: 20 72 65 67 31 29 3b 0a 20 20 73 71 6c 69 74 65   reg1);.  sqlite
cc80: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
cc90: 70 50 61 72 73 65 2c 20 72 65 67 31 29 3b 0a 20  pParse, reg1);. 
cca0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
ccb0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
ccc0: 65 67 32 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  eg2);..  assert(
ccd0: 20 6f 70 3d 3d 4f 50 5f 47 65 20 7c 7c 20 6f 70   op==OP_Ge || op
cce0: 3d 3d 4f 50 5f 47 74 20 7c 7c 20 6f 70 3d 3d 4f  ==OP_Gt || op==O
ccf0: 50 5f 4c 74 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c  P_Lt || op==OP_L
cd00: 65 20 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  e );.}..static i
cd10: 6e 74 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28  nt windowCodeOp(
cd20: 0a 20 57 69 6e 64 6f 77 43 6f 64 65 41 72 67 20  . WindowCodeArg 
cd30: 2a 70 2c 0a 20 69 6e 74 20 6f 70 2c 0a 20 69 6e  *p,. int op,. in
cd40: 74 20 72 65 67 43 6f 75 6e 74 64 6f 77 6e 2c 0a  t regCountdown,.
cd50: 20 69 6e 74 20 6a 75 6d 70 4f 6e 45 6f 66 0a 29   int jumpOnEof.)
cd60: 7b 0a 20 20 69 6e 74 20 63 73 72 2c 20 72 65 67  {.  int csr, reg
cd70: 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  ;.  Parse *pPars
cd80: 65 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a 20  e = p->pParse;. 
cd90: 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d   Window *pMWin =
cda0: 20 70 2d 3e 70 4d 57 69 6e 3b 0a 20 20 69 6e 74   p->pMWin;.  int
cdb0: 20 72 65 74 20 3d 20 30 3b 0a 20 20 56 64 62 65   ret = 0;.  Vdbe
cdc0: 20 2a 76 20 3d 20 70 2d 3e 70 56 64 62 65 3b 0a   *v = p->pVdbe;.
cdd0: 20 20 69 6e 74 20 61 64 64 72 49 66 20 3d 20 30    int addrIf = 0
cde0: 3b 20 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e  ; .  int addrCon
cdf0: 74 69 6e 75 65 20 3d 20 30 3b 0a 20 20 69 6e 74  tinue = 0;.  int
ce00: 20 61 64 64 72 47 6f 74 6f 20 3d 20 30 3b 0a 20   addrGoto = 0;. 
ce10: 20 69 6e 74 20 62 50 65 65 72 20 3d 20 28 70 4d   int bPeer = (pM
ce20: 57 69 6e 2d 3e 65 54 79 70 65 21 3d 54 4b 5f 52  Win->eType!=TK_R
ce30: 4f 57 53 29 3b 0a 0a 20 20 69 6e 74 20 6c 62 6c  OWS);..  int lbl
ce40: 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Done = sqlite3Vd
ce50: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
ce60: 73 65 29 3b 0a 20 20 69 6e 74 20 61 64 64 72 4e  se);.  int addrN
ce70: 65 78 74 52 61 6e 67 65 20 3d 20 30 3b 0a 0a 20  extRange = 0;.. 
ce80: 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65   /* Special case
ce90: 20 2d 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56   - WINDOW_AGGINV
cea0: 45 52 53 45 20 69 73 20 61 6c 77 61 79 73 20 61  ERSE is always a
ceb0: 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 66 72   no-op if the fr
cec0: 61 6d 65 0a 20 20 2a 2a 20 73 74 61 72 74 73 20  ame.  ** starts 
ced0: 77 69 74 68 20 55 4e 42 4f 55 4e 44 45 44 20 50  with UNBOUNDED P
cee0: 52 45 43 45 44 49 4e 47 2e 20 2a 2f 0a 20 20 69  RECEDING. */.  i
cef0: 66 28 20 6f 70 3d 3d 57 49 4e 44 4f 57 5f 41 47  f( op==WINDOW_AG
cf00: 47 49 4e 56 45 52 53 45 20 26 26 20 70 4d 57 69  GINVERSE && pMWi
cf10: 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e  n->eStart==TK_UN
cf20: 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20 20 61  BOUNDED ){.    a
cf30: 73 73 65 72 74 28 20 72 65 67 43 6f 75 6e 74 64  ssert( regCountd
cf40: 6f 77 6e 3d 3d 30 20 26 26 20 6a 75 6d 70 4f 6e  own==0 && jumpOn
cf50: 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  Eof==0 );.    re
cf60: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69  turn 0;.  }..  i
cf70: 66 28 20 72 65 67 43 6f 75 6e 74 64 6f 77 6e 3e  f( regCountdown>
cf80: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 57  0 ){.    if( pMW
cf90: 69 6e 2d 3e 65 54 79 70 65 3d 3d 54 4b 5f 52 41  in->eType==TK_RA
cfa0: 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 61 64 64  NGE ){.      add
cfb0: 72 4e 65 78 74 52 61 6e 67 65 20 3d 20 73 71 6c  rNextRange = sql
cfc0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
cfd0: 64 64 72 28 76 29 3b 0a 0a 20 20 20 20 20 20 73  ddr(v);..      s
cfe0: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
cff0: 20 20 20 20 20 63 61 73 65 20 57 49 4e 44 4f 57       case WINDOW
d000: 5f 52 45 54 55 52 4e 5f 52 4f 57 3a 20 7b 0a 20  _RETURN_ROW: {. 
d010: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
d020: 20 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20   0 );.          
d030: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
d040: 0a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 57  ..        case W
d050: 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45  INDOW_AGGINVERSE
d060: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  : {.          if
d070: 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d  ( pMWin->eStart=
d080: 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b  =TK_FOLLOWING ){
d090: 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e  .            win
d0a0: 64 6f 77 43 6f 64 65 52 61 6e 67 65 54 65 73 74  dowCodeRangeTest
d0b0: 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
d0c0: 20 20 70 2c 20 4f 50 5f 4c 65 2c 20 70 2d 3e 63    p, OP_Le, p->c
d0d0: 75 72 72 65 6e 74 2e 63 73 72 2c 20 72 65 67 43  urrent.csr, regC
d0e0: 6f 75 6e 74 64 6f 77 6e 2c 20 70 2d 3e 73 74 61  ountdown, p->sta
d0f0: 72 74 2e 63 73 72 2c 20 6c 62 6c 44 6f 6e 65 0a  rt.csr, lblDone.
d100: 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20              );. 
d110: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
d120: 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 64              wind
d130: 6f 77 43 6f 64 65 52 61 6e 67 65 54 65 73 74 28  owCodeRangeTest(
d140: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d150: 20 70 2c 20 4f 50 5f 47 65 2c 20 70 2d 3e 73 74   p, OP_Ge, p->st
d160: 61 72 74 2e 63 73 72 2c 20 72 65 67 43 6f 75 6e  art.csr, regCoun
d170: 74 64 6f 77 6e 2c 20 70 2d 3e 63 75 72 72 65 6e  tdown, p->curren
d180: 74 2e 63 73 72 2c 20 6c 62 6c 44 6f 6e 65 0a 20  t.csr, lblDone. 
d190: 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20             );.  
d1a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d1b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
d1c0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 61     }..        ca
d1d0: 73 65 20 57 49 4e 44 4f 57 5f 41 47 47 53 54 45  se WINDOW_AGGSTE
d1e0: 50 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 77  P: {.          w
d1f0: 69 6e 64 6f 77 43 6f 64 65 52 61 6e 67 65 54 65  indowCodeRangeTe
d200: 73 74 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  st(.            
d210: 70 2c 20 4f 50 5f 47 74 2c 20 70 2d 3e 65 6e 64  p, OP_Gt, p->end
d220: 2e 63 73 72 2c 20 72 65 67 43 6f 75 6e 74 64 6f  .csr, regCountdo
d230: 77 6e 2c 20 70 2d 3e 63 75 72 72 65 6e 74 2e 63  wn, p->current.c
d240: 73 72 2c 20 6c 62 6c 44 6f 6e 65 0a 20 20 20 20  sr, lblDone.    
d250: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
d260: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
d270: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
d280: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 64   }else{.      ad
d290: 64 72 49 66 20 3d 20 73 71 6c 69 74 65 33 56 64  drIf = sqlite3Vd
d2a0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
d2b0: 66 50 6f 73 2c 20 72 65 67 43 6f 75 6e 74 64 6f  fPos, regCountdo
d2c0: 77 6e 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d  wn, 0, 1);.    }
d2d0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f 70 3d 3d  .  }..  if( op==
d2e0: 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f  WINDOW_RETURN_RO
d2f0: 57 20 29 7b 0a 20 20 20 20 77 69 6e 64 6f 77 41  W ){.    windowA
d300: 67 67 46 69 6e 61 6c 28 70 50 61 72 73 65 2c 20  ggFinal(pParse, 
d310: 70 4d 57 69 6e 2c 20 30 29 3b 0a 20 20 7d 0a 20  pMWin, 0);.  }. 
d320: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 20 3d 20   addrContinue = 
d330: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
d340: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 73 77 69  ntAddr(v);.  swi
d350: 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
d360: 61 73 65 20 57 49 4e 44 4f 57 5f 52 45 54 55 52  ase WINDOW_RETUR
d370: 4e 5f 52 4f 57 3a 0a 20 20 20 20 20 20 63 73 72  N_ROW:.      csr
d380: 20 3d 20 70 2d 3e 63 75 72 72 65 6e 74 2e 63 73   = p->current.cs
d390: 72 3b 0a 20 20 20 20 20 20 72 65 67 20 3d 20 70  r;.      reg = p
d3a0: 2d 3e 63 75 72 72 65 6e 74 2e 72 65 67 3b 0a 20  ->current.reg;. 
d3b0: 20 20 20 20 20 77 69 6e 64 6f 77 52 65 74 75 72       windowRetur
d3c0: 6e 4f 6e 65 52 6f 77 28 70 50 61 72 73 65 2c 20  nOneRow(pParse, 
d3d0: 70 4d 57 69 6e 2c 20 70 2d 3e 72 65 67 47 6f 73  pMWin, p->regGos
d3e0: 75 62 2c 20 70 2d 3e 61 64 64 72 47 6f 73 75 62  ub, p->addrGosub
d3f0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
d400: 0a 20 20 20 20 63 61 73 65 20 57 49 4e 44 4f 57  .    case WINDOW
d410: 5f 41 47 47 49 4e 56 45 52 53 45 3a 0a 20 20 20  _AGGINVERSE:.   
d420: 20 20 20 63 73 72 20 3d 20 70 2d 3e 73 74 61 72     csr = p->star
d430: 74 2e 63 73 72 3b 0a 20 20 20 20 20 20 72 65 67  t.csr;.      reg
d440: 20 3d 20 70 2d 3e 73 74 61 72 74 2e 72 65 67 3b   = p->start.reg;
d450: 0a 20 20 20 20 20 20 77 69 6e 64 6f 77 41 67 67  .      windowAgg
d460: 53 74 65 70 28 70 50 61 72 73 65 2c 20 70 4d 57  Step(pParse, pMW
d470: 69 6e 2c 20 63 73 72 2c 20 31 2c 20 70 2d 3e 72  in, csr, 1, p->r
d480: 65 67 41 72 67 2c 20 70 4d 57 69 6e 2d 3e 72 65  egArg, pMWin->re
d490: 67 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 62 72  gSize);.      br
d4a0: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 57  eak;..    case W
d4b0: 49 4e 44 4f 57 5f 41 47 47 53 54 45 50 3a 0a 20  INDOW_AGGSTEP:. 
d4c0: 20 20 20 20 20 63 73 72 20 3d 20 70 2d 3e 65 6e       csr = p->en
d4d0: 64 2e 63 73 72 3b 0a 20 20 20 20 20 20 72 65 67  d.csr;.      reg
d4e0: 20 3d 20 70 2d 3e 65 6e 64 2e 72 65 67 3b 0a 20   = p->end.reg;. 
d4f0: 20 20 20 20 20 77 69 6e 64 6f 77 41 67 67 53 74       windowAggSt
d500: 65 70 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  ep(pParse, pMWin
d510: 2c 20 63 73 72 2c 20 30 2c 20 70 2d 3e 72 65 67  , csr, 0, p->reg
d520: 41 72 67 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 53  Arg, pMWin->regS
d530: 69 7a 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ize);.      brea
d540: 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6a 75  k;.  }..  if( ju
d550: 6d 70 4f 6e 45 6f 66 20 29 7b 0a 20 20 20 20 73  mpOnEof ){.    s
d560: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d570: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 63 73 72  (v, OP_Next, csr
d580: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
d590: 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a  rentAddr(v)+2);.
d5a0: 20 20 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65      ret = sqlite
d5b0: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
d5c0: 50 5f 47 6f 74 6f 29 3b 0a 20 20 7d 65 6c 73 65  P_Goto);.  }else
d5d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
d5e0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
d5f0: 78 74 2c 20 63 73 72 2c 20 73 71 6c 69 74 65 33  xt, csr, sqlite3
d600: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
d610: 76 29 2b 31 2b 62 50 65 65 72 29 3b 0a 20 20 20  v)+1+bPeer);.   
d620: 20 69 66 28 20 62 50 65 65 72 20 29 7b 0a 20 20   if( bPeer ){.  
d630: 20 20 20 20 61 64 64 72 47 6f 74 6f 20 3d 20 73      addrGoto = s
d640: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
d650: 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20  (v, OP_Goto);.  
d660: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62    }.  }..  if( b
d670: 50 65 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20  Peer ){.    int 
d680: 61 64 64 72 3b 0a 20 20 20 20 69 6e 74 20 6e 52  addr;.    int nR
d690: 65 67 20 3d 20 28 70 4d 57 69 6e 2d 3e 70 4f 72  eg = (pMWin->pOr
d6a0: 64 65 72 42 79 20 3f 20 70 4d 57 69 6e 2d 3e 70  derBy ? pMWin->p
d6b0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 3a  OrderBy->nExpr :
d6c0: 20 30 29 3b 0a 20 20 20 20 69 6e 74 20 72 65 67   0);.    int reg
d6d0: 54 6d 70 20 3d 20 28 6e 52 65 67 20 3f 20 73 71  Tmp = (nReg ? sq
d6e0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
d6f0: 65 28 70 50 61 72 73 65 2c 20 6e 52 65 67 29 20  e(pParse, nReg) 
d700: 3a 20 30 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77  : 0);.    window
d710: 52 65 61 64 50 65 65 72 56 61 6c 75 65 73 28 70  ReadPeerValues(p
d720: 2c 20 63 73 72 2c 20 72 65 67 54 6d 70 29 3b 0a  , csr, regTmp);.
d730: 20 20 20 20 61 64 64 72 20 3d 20 77 69 6e 64 6f      addr = windo
d740: 77 49 66 4e 65 77 50 65 65 72 28 70 50 61 72 73  wIfNewPeer(pPars
d750: 65 2c 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72  e, pMWin->pOrder
d760: 42 79 2c 20 72 65 67 54 6d 70 2c 20 72 65 67 29  By, regTmp, reg)
d770: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
d780: 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64  eChangeP2(v, add
d790: 72 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29  r, addrContinue)
d7a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
d7b0: 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
d7c0: 61 72 73 65 2c 20 72 65 67 54 6d 70 2c 20 6e 52  arse, regTmp, nR
d7d0: 65 67 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  eg);.  }..  if( 
d7e0: 61 64 64 72 4e 65 78 74 52 61 6e 67 65 20 29 7b  addrNextRange ){
d7f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
d800: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
d810: 6f 2c 20 30 2c 20 61 64 64 72 4e 65 78 74 52 61  o, 0, addrNextRa
d820: 6e 67 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  nge);.  }.  sqli
d830: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
d840: 62 65 6c 28 76 2c 20 6c 62 6c 44 6f 6e 65 29 3b  bel(v, lblDone);
d850: 0a 20 20 69 66 28 20 61 64 64 72 47 6f 74 6f 20  .  if( addrGoto 
d860: 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
d870: 70 48 65 72 65 28 76 2c 20 61 64 64 72 47 6f 74  pHere(v, addrGot
d880: 6f 29 3b 0a 20 20 69 66 28 20 61 64 64 72 49 66  o);.  if( addrIf
d890: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75   ) sqlite3VdbeJu
d8a0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 66  mpHere(v, addrIf
d8b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b  );.  return ret;
d8c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
d8d0: 75 6e 63 74 69 6f 6e 20 2d 20 77 69 6e 64 6f 77  unction - window
d8e0: 43 6f 64 65 53 74 65 70 28 29 20 2d 20 67 65 6e  CodeStep() - gen
d8f0: 65 72 61 74 65 73 20 74 68 65 20 56 4d 20 63 6f  erates the VM co
d900: 64 65 20 74 68 61 74 20 72 65 61 64 73 20 64 61  de that reads da
d910: 74 61 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73  ta.** from the s
d920: 75 62 2d 73 65 6c 65 63 74 20 61 6e 64 20 72 65  ub-select and re
d930: 74 75 72 6e 73 20 72 6f 77 73 20 74 6f 20 74 68  turns rows to th
d940: 65 20 63 6f 6e 73 75 6d 65 72 2e 20 46 6f 72 20  e consumer. For 
d950: 74 68 65 20 73 69 6d 70 6c 65 73 74 0a 2a 2a 20  the simplest.** 
d960: 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  case:.**.**     
d970: 52 4f 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78  ROWS BETWEEN <ex
d980: 70 72 31 3e 20 50 52 45 43 45 44 49 4e 47 20 41  pr1> PRECEDING A
d990: 4e 44 20 3c 65 78 70 72 32 3e 20 46 4f 4c 4c 4f  ND <expr2> FOLLO
d9a0: 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56  WING.**.** The V
d9b0: 4d 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  M code generated
d9c0: 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 69   is equivalent i
d9d0: 6e 20 73 70 69 72 69 74 20 74 6f 20 74 68 65 20  n spirit to the 
d9e0: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
d9f0: 20 20 20 20 20 77 68 69 6c 65 28 20 21 65 6f 66       while( !eof
da00: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28   ){.**       if(
da10: 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 20 29   new partition )
da20: 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 47 6f 73  {.**         Gos
da30: 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20 20 20 20  ub flush.**     
da40: 20 20 7d 20 20 20 20 0a 2a 2a 20 20 20 20 20 20    }    .**      
da50: 20 49 6e 73 65 72 74 20 6e 65 77 20 72 6f 77 20   Insert new row 
da60: 69 6e 74 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a  into eph table..
da70: 2a 2a 20 20 20 20 20 0a 2a 2a 20 20 20 20 20 20  **     .**      
da80: 20 69 66 28 20 66 69 72 73 74 20 72 6f 77 20 6f   if( first row o
da90: 66 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a  f partition ){.*
daa0: 2a 20 20 20 20 20 20 20 20 20 52 65 77 69 6e 64  *         Rewind
dab0: 28 63 73 72 45 6e 64 2c 20 73 6b 69 70 4e 65 78  (csrEnd, skipNex
dac0: 74 3d 31 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  t=1).**         
dad0: 52 65 77 69 6e 64 28 73 74 61 72 74 2e 63 73 72  Rewind(start.csr
dae0: 2c 20 73 6b 69 70 4e 65 78 74 3d 31 29 0a 2a 2a  , skipNext=1).**
daf0: 20 20 20 20 20 20 20 20 20 52 65 77 69 6e 64 28           Rewind(
db00: 63 73 72 43 75 72 72 65 6e 74 2c 20 73 6b 69 70  csrCurrent, skip
db10: 4e 65 78 74 3d 31 29 0a 2a 2a 20 20 20 20 20 0a  Next=1).**     .
db20: 2a 2a 20 20 20 20 20 20 20 20 20 72 65 67 45 6e  **         regEn
db30: 64 20 3d 20 3c 65 78 70 72 32 3e 20 20 20 20 20  d = <expr2>     
db40: 20 20 20 20 20 2f 2f 20 46 4f 4c 4c 4f 57 49 4e       // FOLLOWIN
db50: 47 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  G expression.** 
db60: 20 20 20 20 20 20 20 20 72 65 67 53 74 61 72 74          regStart
db70: 20 3d 20 3c 65 78 70 72 31 3e 20 20 20 20 20 20   = <expr1>      
db80: 20 20 2f 2f 20 50 52 45 43 45 44 49 4e 47 20 65    // PRECEDING e
db90: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 20 20 20  xpression.**    
dba0: 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20 20     }else{.**    
dbb0: 20 20 20 20 20 69 66 28 20 28 72 65 67 45 6e 64       if( (regEnd
dbc0: 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20  --)<=0 ){.**    
dbd0: 20 20 20 20 20 20 20 4e 65 78 74 28 63 73 72 43         Next(csrC
dbe0: 75 72 72 65 6e 74 29 0a 2a 2a 20 20 20 20 20 20  urrent).**      
dbf0: 20 20 20 20 20 52 65 74 75 72 6e 20 6f 6e 65 20       Return one 
dc00: 72 6f 77 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  row..**         
dc10: 20 20 69 66 28 20 28 72 65 67 53 74 61 72 74 2d    if( (regStart-
dc20: 2d 29 3c 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20  -)<0 ){.**      
dc30: 20 20 20 20 20 20 20 4e 65 78 74 28 73 74 61 72         Next(star
dc40: 74 2e 63 73 72 29 0a 2a 2a 20 20 20 20 20 20 20  t.csr).**       
dc50: 20 20 20 20 20 20 41 67 67 49 6e 76 65 72 73 65        AggInverse
dc60: 28 73 74 61 72 74 2e 63 73 72 29 0a 2a 2a 20 20  (start.csr).**  
dc70: 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20           }.**   
dc80: 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20        }.**      
dc90: 20 7d 20 20 20 20 0a 2a 2a 20 20 20 20 20 0a 2a   }    .**     .*
dca0: 2a 20 20 20 20 20 20 20 4e 65 78 74 28 63 73 72  *       Next(csr
dcb0: 45 6e 64 29 0a 2a 2a 20 20 20 20 20 20 20 41 67  End).**       Ag
dcc0: 67 53 74 65 70 28 63 73 72 45 6e 64 29 0a 2a 2a  gStep(csrEnd).**
dcd0: 20 20 20 20 20 7d 20 20 20 20 0a 2a 2a 20 20 20       }    .**   
dce0: 20 20 66 6c 75 73 68 3a 0a 2a 2a 20 20 20 20 20    flush:.**     
dcf0: 20 20 77 68 69 6c 65 28 20 31 20 29 7b 20 0a 2a    while( 1 ){ .*
dd00: 2a 20 20 20 20 20 20 20 20 20 4e 65 78 74 28 63  *         Next(c
dd10: 73 72 43 75 72 72 65 6e 74 29 0a 2a 2a 20 20 20  srCurrent).**   
dd20: 20 20 20 20 20 20 69 66 28 20 65 6f 66 20 29 20        if( eof ) 
dd30: 62 72 65 61 6b 0a 2a 2a 20 20 20 20 20 20 20 20  break.**        
dd40: 20 52 65 74 75 72 6e 20 6f 6e 65 20 72 6f 77 2e   Return one row.
dd50: 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 66 28 20  .**         if( 
dd60: 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 30 20 29  (regStart--)<0 )
dd70: 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 4e  {.**           N
dd80: 65 78 74 28 73 74 61 72 74 2e 63 73 72 29 0a 2a  ext(start.csr).*
dd90: 2a 20 20 20 20 20 20 20 20 20 20 20 41 67 67 49  *           AggI
dda0: 6e 76 65 72 73 65 28 73 74 61 72 74 2e 63 73 72  nverse(start.csr
ddb0: 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a  ).**         }.*
ddc0: 2a 20 20 20 20 20 20 20 7d 20 20 20 20 0a 2a 2a  *       }    .**
ddd0: 20 20 20 20 20 20 20 45 6d 70 74 79 20 65 70 68         Empty eph
dde0: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f   table..**.** Mo
ddf0: 72 65 20 67 65 6e 65 72 61 6c 6c 79 2c 20 74 68  re generally, th
de00: 65 20 70 61 74 74 65 72 6e 20 75 73 65 64 20 66  e pattern used f
de10: 6f 72 20 61 6c 6c 20 77 69 6e 64 6f 77 20 74 79  or all window ty
de20: 70 65 73 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  pes is:.**.**   
de30: 20 20 77 68 69 6c 65 28 20 21 65 6f 66 20 29 7b    while( !eof ){
de40: 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 6e 65  .**       if( ne
de50: 77 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a  w partition ){.*
de60: 2a 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20  *         Gosub 
de70: 66 6c 75 73 68 0a 2a 2a 20 20 20 20 20 20 20 7d  flush.**       }
de80: 20 20 20 20 0a 2a 2a 20 20 20 20 20 20 20 49 6e      .**       In
de90: 73 65 72 74 20 6e 65 77 20 72 6f 77 20 69 6e 74  sert new row int
dea0: 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a 2a 2a 20  o eph table..** 
deb0: 20 20 20 20 20 20 69 66 28 20 66 69 72 73 74 20        if( first 
dec0: 72 6f 77 20 6f 66 20 70 61 72 74 69 74 69 6f 6e  row of partition
ded0: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 46   ){.**         F
dee0: 49 52 53 54 5f 52 4f 57 5f 43 4f 44 45 0a 2a 2a  IRST_ROW_CODE.**
def0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a         }else{.**
df00: 20 20 20 20 20 20 20 20 20 53 45 43 4f 4e 44 5f           SECOND_
df10: 52 4f 57 5f 43 4f 44 45 0a 2a 2a 20 20 20 20 20  ROW_CODE.**     
df20: 20 20 7d 20 20 20 20 0a 2a 2a 20 20 20 20 20 20    }    .**      
df30: 20 41 4c 4c 5f 52 4f 57 5f 43 4f 44 45 0a 2a 2a   ALL_ROW_CODE.**
df40: 20 20 20 20 20 7d 20 20 20 20 0a 2a 2a 20 20 20       }    .**   
df50: 20 20 66 6c 75 73 68 3a 0a 2a 2a 20 20 20 20 20    flush:.**     
df60: 20 20 46 4c 55 53 48 5f 43 4f 44 45 0a 2a 2a 20    FLUSH_CODE.** 
df70: 20 20 20 20 20 20 45 6d 70 74 79 20 65 70 68 20        Empty eph 
df80: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61  table..**.*/.sta
df90: 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 43  tic void windowC
dfa0: 6f 64 65 53 74 65 70 28 0a 20 20 50 61 72 73 65  odeStep(.  Parse
dfb0: 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 53 65 6c   *pParse, .  Sel
dfc0: 65 63 74 20 2a 70 2c 0a 20 20 57 68 65 72 65 49  ect *p,.  WhereI
dfd0: 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20 20 69  nfo *pWInfo,.  i
dfe0: 6e 74 20 72 65 67 47 6f 73 75 62 2c 20 0a 20 20  nt regGosub, .  
dff0: 69 6e 74 20 61 64 64 72 47 6f 73 75 62 0a 29 7b  int addrGosub.){
e000: 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e  .  Window *pMWin
e010: 20 3d 20 70 2d 3e 70 57 69 6e 3b 0a 20 20 45 78   = p->pWin;.  Ex
e020: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
e030: 20 3d 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72   = pMWin->pOrder
e040: 42 79 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  By;.  Vdbe *v = 
e050: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
e060: 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 65  Parse);.  int re
e070: 67 46 6c 75 73 68 50 61 72 74 3b 20 20 20 20 20  gFlushPart;     
e080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
e090: 69 73 74 65 72 20 66 6f 72 20 22 47 6f 73 75 62  ister for "Gosub
e0a0: 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e   flush_partition
e0b0: 22 20 2a 2f 0a 0a 20 20 69 6e 74 20 72 65 67 41  " */..  int regA
e0c0: 72 67 3b 0a 20 20 69 6e 74 20 63 73 72 57 72 69  rg;.  int csrWri
e0d0: 74 65 20 3d 20 70 4d 57 69 6e 2d 3e 69 45 70 68  te = pMWin->iEph
e0e0: 43 73 72 2b 31 3b 0a 0a 20 20 69 6e 74 20 69 53  Csr+1;..  int iS
e0f0: 75 62 43 73 72 20 3d 20 70 2d 3e 70 53 72 63 2d  ubCsr = p->pSrc-
e100: 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 20 20  >a[0].iCursor;  
e110: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66      /* Cursor of
e120: 20 73 75 62 2d 73 65 6c 65 63 74 20 2a 2f 0a 20   sub-select */. 
e130: 20 69 6e 74 20 6e 53 75 62 20 3d 20 70 2d 3e 70   int nSub = p->p
e140: 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 2d 3e  Src->a[0].pTab->
e150: 6e 43 6f 6c 3b 20 20 20 20 20 20 2f 2a 20 4e 75  nCol;      /* Nu
e160: 6d 62 65 72 20 6f 66 20 63 6f 6c 73 20 72 65 74  mber of cols ret
e170: 75 72 6e 65 64 20 62 79 20 73 75 62 20 2a 2f 0a  urned by sub */.
e180: 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20    int iCol;     
e190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e1b0: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
e1c0: 68 20 73 75 62 20 63 6f 6c 73 20 2a 2f 0a 0a 20  h sub cols */.. 
e1d0: 20 69 6e 74 20 61 64 64 72 47 6f 74 6f 3b 0a 20   int addrGoto;. 
e1e0: 20 69 6e 74 20 61 64 64 72 49 66 3b 0a 20 20 69   int addrIf;.  i
e1f0: 6e 74 20 61 64 64 72 47 6f 73 75 62 46 6c 75 73  nt addrGosubFlus
e200: 68 3b 0a 20 20 69 6e 74 20 61 64 64 72 49 6e 74  h;.  int addrInt
e210: 65 67 65 72 3b 0a 20 20 69 6e 74 20 61 64 64 72  eger;.  int addr
e220: 43 61 63 68 65 52 65 77 69 6e 64 3b 0a 20 20 69  CacheRewind;.  i
e230: 6e 74 20 61 64 64 72 43 61 63 68 65 4e 65 78 74  nt addrCacheNext
e240: 3b 0a 0a 20 20 69 6e 74 20 61 64 64 72 53 68 6f  ;..  int addrSho
e250: 72 74 63 75 74 20 3d 20 30 3b 0a 20 20 69 6e 74  rtcut = 0;.  int
e260: 20 61 64 64 72 45 6d 70 74 79 20 3d 20 30 3b 0a   addrEmpty = 0;.
e270: 20 20 69 6e 74 20 61 64 64 72 50 65 65 72 4a 75    int addrPeerJu
e280: 6d 70 20 3d 20 30 3b 0a 0a 20 20 69 6e 74 20 62  mp = 0;..  int b
e290: 43 61 63 68 65 20 3d 20 77 69 6e 64 6f 77 43 61  Cache = windowCa
e2a0: 63 68 65 50 61 72 74 69 74 69 6f 6e 28 70 4d 57  chePartition(pMW
e2b0: 69 6e 29 3b 0a 0a 20 20 69 6e 74 20 72 65 67 53  in);..  int regS
e2c0: 74 61 72 74 20 3d 20 30 3b 20 20 20 20 20 20 20  tart = 0;       
e2d0: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
e2e0: 20 6f 66 20 3c 65 78 70 72 3e 20 50 52 45 43 45   of <expr> PRECE
e2f0: 44 49 4e 47 20 2a 2f 0a 20 20 69 6e 74 20 72 65  DING */.  int re
e300: 67 45 6e 64 20 3d 20 30 3b 20 20 20 20 20 20 20  gEnd = 0;       
e310: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
e320: 75 65 20 6f 66 20 3c 65 78 70 72 3e 20 46 4f 4c  ue of <expr> FOL
e330: 4c 4f 57 49 4e 47 20 2a 2f 0a 0a 20 20 69 6e 74  LOWING */..  int
e340: 20 72 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e   reg = pParse->n
e350: 4d 65 6d 2b 31 3b 0a 20 20 69 6e 74 20 72 65 67  Mem+1;.  int reg
e360: 52 65 63 6f 72 64 20 3d 20 72 65 67 2b 6e 53 75  Record = reg+nSu
e370: 62 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69  b;.  int regRowi
e380: 64 20 3d 20 72 65 67 52 65 63 6f 72 64 2b 31 3b  d = regRecord+1;
e390: 0a 20 20 69 6e 74 20 72 65 67 50 65 65 72 20 3d  .  int regPeer =
e3a0: 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 4e 65 77   0;.  int regNew
e3b0: 50 65 65 72 20 3d 20 30 3b 0a 20 20 57 69 6e 64  Peer = 0;.  Wind
e3c0: 6f 77 43 6f 64 65 41 72 67 20 73 3b 0a 0a 20 20  owCodeArg s;..  
e3d0: 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65  assert( pMWin->e
e3e0: 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44  Start==TK_PRECED
e3f0: 49 4e 47 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53  ING || pMWin->eS
e400: 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54  tart==TK_CURRENT
e410: 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69   .       || pMWi
e420: 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f  n->eStart==TK_FO
e430: 4c 4c 4f 57 49 4e 47 20 7c 7c 20 70 4d 57 69 6e  LLOWING || pMWin
e440: 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42  ->eStart==TK_UNB
e450: 4f 55 4e 44 45 44 20 0a 20 20 29 3b 0a 20 20 61  OUNDED .  );.  a
e460: 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 45  ssert( pMWin->eE
e470: 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  nd==TK_FOLLOWING
e480: 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d   || pMWin->eEnd=
e490: 3d 54 4b 5f 43 55 52 52 45 4e 54 20 0a 20 20 20  =TK_CURRENT .   
e4a0: 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45      || pMWin->eE
e4b0: 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  nd==TK_UNBOUNDED
e4c0: 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d   || pMWin->eEnd=
e4d0: 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 0a 20  =TK_PRECEDING . 
e4e0: 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 73   );..  memset(&s
e4f0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57 69 6e 64  , 0, sizeof(Wind
e500: 6f 77 43 6f 64 65 41 72 67 29 29 3b 0a 20 20 73  owCodeArg));.  s
e510: 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
e520: 3b 0a 20 20 73 2e 70 4d 57 69 6e 20 3d 20 70 4d  ;.  s.pMWin = pM
e530: 57 69 6e 3b 0a 20 20 73 2e 70 56 64 62 65 20 3d  Win;.  s.pVdbe =
e540: 20 76 3b 0a 20 20 73 2e 72 65 67 47 6f 73 75 62   v;.  s.regGosub
e550: 20 3d 20 72 65 67 47 6f 73 75 62 3b 0a 20 20 73   = regGosub;.  s
e560: 2e 61 64 64 72 47 6f 73 75 62 20 3d 20 61 64 64  .addrGosub = add
e570: 72 47 6f 73 75 62 3b 0a 20 20 73 2e 63 75 72 72  rGosub;.  s.curr
e580: 65 6e 74 2e 63 73 72 20 3d 20 70 4d 57 69 6e 2d  ent.csr = pMWin-
e590: 3e 69 45 70 68 43 73 72 3b 0a 20 20 73 2e 73 74  >iEphCsr;.  s.st
e5a0: 61 72 74 2e 63 73 72 20 3d 20 73 2e 63 75 72 72  art.csr = s.curr
e5b0: 65 6e 74 2e 63 73 72 2b 32 3b 0a 20 20 73 2e 65  ent.csr+2;.  s.e
e5c0: 6e 64 2e 63 73 72 20 3d 20 73 2e 63 75 72 72 65  nd.csr = s.curre
e5d0: 6e 74 2e 63 73 72 2b 33 3b 0a 0a 20 20 70 50 61  nt.csr+3;..  pPa
e5e0: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 31 20 2b  rse->nMem += 1 +
e5f0: 20 6e 53 75 62 20 2b 20 31 3b 0a 0a 20 20 72 65   nSub + 1;..  re
e600: 67 46 6c 75 73 68 50 61 72 74 20 3d 20 2b 2b 70  gFlushPart = ++p
e610: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20  Parse->nMem;..  
e620: 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72  if( pMWin->eStar
e630: 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20  t==TK_PRECEDING 
e640: 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  || pMWin->eStart
e650: 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29  ==TK_FOLLOWING )
e660: 7b 0a 20 20 20 20 72 65 67 53 74 61 72 74 20 3d  {.    regStart =
e670: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
e680: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d 57 69 6e  .  }.  if( pMWin
e690: 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45  ->eEnd==TK_PRECE
e6a0: 44 49 4e 47 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65  DING || pMWin->e
e6b0: 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e  End==TK_FOLLOWIN
e6c0: 47 20 29 7b 0a 20 20 20 20 72 65 67 45 6e 64 20  G ){.    regEnd 
e6d0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
e6e0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
e6f0: 68 69 73 20 69 73 20 6e 6f 74 20 61 20 22 52 4f  his is not a "RO
e700: 57 53 20 42 45 54 57 45 45 4e 20 2e 2e 2e 22 20  WS BETWEEN ..." 
e710: 66 72 61 6d 65 2c 20 74 68 65 6e 20 61 6c 6c 6f  frame, then allo
e720: 63 61 74 65 20 61 72 72 61 79 73 20 6f 66 0a 20  cate arrays of. 
e730: 20 2a 2a 20 72 65 67 69 73 74 65 72 73 20 74 6f   ** registers to
e740: 20 73 74 6f 72 65 20 61 20 63 6f 70 69 65 73 20   store a copies 
e750: 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
e760: 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20  expressions for 
e770: 74 68 65 0a 20 20 2a 2a 20 6d 61 69 6e 20 6c 6f  the.  ** main lo
e780: 6f 70 2c 20 61 6e 64 20 66 6f 72 20 65 61 63 68  op, and for each
e790: 20 63 75 72 73 6f 72 20 28 73 74 61 72 74 2c 20   cursor (start, 
e7a0: 63 75 72 72 65 6e 74 20 61 6e 64 20 65 6e 64 29  current and end)
e7b0: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e  . */.  if( pMWin
e7c0: 2d 3e 65 54 79 70 65 21 3d 54 4b 5f 52 4f 57 53  ->eType!=TK_ROWS
e7d0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 50 65 65   ){.    int nPee
e7e0: 72 20 3d 20 28 70 4f 72 64 65 72 42 79 20 3f 20  r = (pOrderBy ? 
e7f0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
e800: 3a 20 30 29 3b 0a 20 20 20 20 72 65 67 4e 65 77  : 0);.    regNew
e810: 50 65 65 72 20 3d 20 72 65 67 20 2b 20 70 4d 57  Peer = reg + pMW
e820: 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 3b 0a  in->nBufferCol;.
e830: 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70      if( pMWin->p
e840: 50 61 72 74 69 74 69 6f 6e 20 29 20 72 65 67 4e  Partition ) regN
e850: 65 77 50 65 65 72 20 2b 3d 20 70 4d 57 69 6e 2d  ewPeer += pMWin-
e860: 3e 70 50 61 72 74 69 74 69 6f 6e 2d 3e 6e 45 78  >pPartition->nEx
e870: 70 72 3b 0a 0a 20 20 20 20 72 65 67 50 65 65 72  pr;..    regPeer
e880: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
e890: 31 3b 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  1;       pParse-
e8a0: 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 65 65 72 3b 0a  >nMem += nPeer;.
e8b0: 20 20 20 20 73 2e 73 74 61 72 74 2e 72 65 67 20      s.start.reg 
e8c0: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
e8d0: 3b 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  ;   pParse->nMem
e8e0: 20 2b 3d 20 6e 50 65 65 72 3b 0a 20 20 20 20 73   += nPeer;.    s
e8f0: 2e 63 75 72 72 65 6e 74 2e 72 65 67 20 3d 20 70  .current.reg = p
e900: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 20 70  Parse->nMem+1; p
e910: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
e920: 50 65 65 72 3b 0a 20 20 20 20 73 2e 65 6e 64 2e  Peer;.    s.end.
e930: 72 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  reg = pParse->nM
e940: 65 6d 2b 31 3b 20 20 20 20 20 70 50 61 72 73 65  em+1;     pParse
e950: 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 65 65 72 3b  ->nMem += nPeer;
e960: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20  .  }..  /* Load 
e970: 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  the column value
e980: 73 20 66 6f 72 20 74 68 65 20 72 6f 77 20 72 65  s for the row re
e990: 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 73 75  turned by the su
e9a0: 62 2d 73 65 6c 65 63 74 0a 20 20 2a 2a 20 69 6e  b-select.  ** in
e9b0: 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72  to an array of r
e9c0: 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
e9d0: 67 20 61 74 20 72 65 67 2e 20 41 73 73 65 6d 62  g at reg. Assemb
e9e0: 6c 65 20 74 68 65 6d 20 69 6e 74 6f 0a 20 20 2a  le them into.  *
e9f0: 2a 20 61 20 72 65 63 6f 72 64 20 69 6e 20 72 65  * a record in re
ea00: 67 69 73 74 65 72 20 72 65 67 52 65 63 6f 72 64  gister regRecord
ea10: 2e 20 54 4f 44 4f 3a 20 41 6e 20 6f 70 74 69 6d  . TODO: An optim
ea20: 69 7a 61 74 69 6f 6e 20 68 65 72 65 3f 20 2a 2f  ization here? */
ea30: 0a 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69  .  for(iCol=0; i
ea40: 43 6f 6c 3c 6e 53 75 62 3b 20 69 43 6f 6c 2b 2b  Col<nSub; iCol++
ea50: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
ea60: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
ea70: 6f 6c 75 6d 6e 2c 20 69 53 75 62 43 73 72 2c 20  olumn, iSubCsr, 
ea80: 69 43 6f 6c 2c 20 72 65 67 2b 69 43 6f 6c 29 3b  iCol, reg+iCol);
ea90: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
eaa0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
eab0: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 2c 20  akeRecord, reg, 
eac0: 6e 53 75 62 2c 20 72 65 67 52 65 63 6f 72 64 29  nSub, regRecord)
ead0: 3b 0a 0a 20 20 2f 2a 20 41 6e 20 69 6e 70 75 74  ;..  /* An input
eae0: 20 72 6f 77 20 68 61 73 20 6a 75 73 74 20 62 65   row has just be
eaf0: 65 6e 20 72 65 61 64 20 69 6e 74 6f 20 61 6e 20  en read into an 
eb00: 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  array of registe
eb10: 72 73 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a  rs starting.  **
eb20: 20 61 74 20 72 65 67 2e 20 49 66 20 74 68 65 20   at reg. If the 
eb30: 77 69 6e 64 6f 77 20 68 61 73 20 61 20 50 41 52  window has a PAR
eb40: 54 49 54 49 4f 4e 20 63 6c 61 75 73 65 2c 20 74  TITION clause, t
eb50: 68 69 73 20 62 6c 6f 63 6b 20 67 65 6e 65 72 61  his block genera
eb60: 74 65 73 20 0a 20 20 2a 2a 20 56 4d 20 63 6f 64  tes .  ** VM cod
eb70: 65 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68  e to check if th
eb80: 65 20 69 6e 70 75 74 20 72 6f 77 20 69 73 20 74  e input row is t
eb90: 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 6e 65  he start of a ne
eba0: 77 20 70 61 72 74 69 74 69 6f 6e 2e 0a 20 20 2a  w partition..  *
ebb0: 2a 20 49 66 20 73 6f 2c 20 69 74 20 64 6f 65 73  * If so, it does
ebc0: 20 61 6e 20 4f 50 5f 47 6f 73 75 62 20 74 6f 20   an OP_Gosub to 
ebd0: 61 6e 20 61 64 64 72 65 73 73 20 74 6f 20 62 65  an address to be
ebe0: 20 66 69 6c 6c 65 64 20 69 6e 20 6c 61 74 65 72   filled in later
ebf0: 2e 20 54 68 65 0a 20 20 2a 2a 20 61 64 64 72 65  . The.  ** addre
ec00: 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 47 6f 73  ss of the OP_Gos
ec10: 75 62 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ub is stored in 
ec20: 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 20 61  local variable a
ec30: 64 64 72 47 6f 73 75 62 46 6c 75 73 68 2e 0a 20  ddrGosubFlush.. 
ec40: 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d   */.  if( pMWin-
ec50: 3e 70 50 61 72 74 69 74 69 6f 6e 20 29 7b 0a 20  >pPartition ){. 
ec60: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
ec70: 20 45 78 70 72 4c 69 73 74 20 2a 70 50 61 72 74   ExprList *pPart
ec80: 20 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69   = pMWin->pParti
ec90: 74 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 50  tion;.    int nP
eca0: 61 72 74 20 3d 20 70 50 61 72 74 2d 3e 6e 45 78  art = pPart->nEx
ecb0: 70 72 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 4e  pr;.    int regN
ecc0: 65 77 50 61 72 74 20 3d 20 72 65 67 20 2b 20 70  ewPart = reg + p
ecd0: 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c  MWin->nBufferCol
ece0: 3b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  ;.    KeyInfo *p
ecf0: 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
ed00: 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  3KeyInfoFromExpr
ed10: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 50 61  List(pParse, pPa
ed20: 72 74 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20  rt, 0, 0);..    
ed30: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
ed40: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
ed50: 6f 6d 70 61 72 65 2c 20 72 65 67 4e 65 77 50 61  ompare, regNewPa
ed60: 72 74 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61  rt, pMWin->regPa
ed70: 72 74 2c 20 6e 50 61 72 74 29 3b 0a 20 20 20 20  rt, nPart);.    
ed80: 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e  sqlite3VdbeAppen
ed90: 64 50 34 28 76 2c 20 28 76 6f 69 64 2a 29 70 4b  dP4(v, (void*)pK
eda0: 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
edb0: 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  FO);.    sqlite3
edc0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
edd0: 5f 4a 75 6d 70 2c 20 61 64 64 72 2b 32 2c 20 61  _Jump, addr+2, a
ede0: 64 64 72 2b 34 2c 20 61 64 64 72 2b 32 29 3b 0a  ddr+4, addr+2);.
edf0: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
ee00: 45 71 4e 65 28 76 29 3b 0a 20 20 20 20 61 64 64  EqNe(v);.    add
ee10: 72 47 6f 73 75 62 46 6c 75 73 68 20 3d 20 73 71  rGosubFlush = sq
ee20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
ee30: 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
ee40: 46 6c 75 73 68 50 61 72 74 29 3b 0a 20 20 20 20  FlushPart);.    
ee50: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
ee60: 22 63 61 6c 6c 20 66 6c 75 73 68 5f 70 61 72 74  "call flush_part
ee70: 69 74 69 6f 6e 22 29 29 3b 0a 20 20 20 20 73 71  ition"));.    sq
ee80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
ee90: 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4e  v, OP_Copy, regN
eea0: 65 77 50 61 72 74 2c 20 70 4d 57 69 6e 2d 3e 72  ewPart, pMWin->r
eeb0: 65 67 50 61 72 74 2c 20 6e 50 61 72 74 2d 31 29  egPart, nPart-1)
eec0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73 65  ;.  }..  /* Inse
eed0: 72 74 20 74 68 65 20 6e 65 77 20 72 6f 77 20 69  rt the new row i
eee0: 6e 74 6f 20 74 68 65 20 65 70 68 65 6d 65 72 61  nto the ephemera
eef0: 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c  l table */.  sql
ef00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
ef10: 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 63  , OP_NewRowid, c
ef20: 73 72 57 72 69 74 65 2c 20 72 65 67 52 6f 77 69  srWrite, regRowi
ef30: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  d);.  sqlite3Vdb
ef40: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
ef50: 73 65 72 74 2c 20 63 73 72 57 72 69 74 65 2c 20  sert, csrWrite, 
ef60: 72 65 67 52 65 63 6f 72 64 2c 20 72 65 67 52 6f  regRecord, regRo
ef70: 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  wid);.  sqlite3V
ef80: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
ef90: 41 64 64 49 6d 6d 2c 20 70 4d 57 69 6e 2d 3e 72  AddImm, pMWin->r
efa0: 65 67 53 69 7a 65 2c 20 31 29 3b 0a 0a 20 20 69  egSize, 1);..  i
efb0: 66 28 20 62 43 61 63 68 65 20 29 7b 0a 20 20 20  f( bCache ){.   
efc0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
efd0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
efe0: 2c 20 30 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 46  , 0, pMWin->regF
eff0: 69 72 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  irst);.    sqlit
f000: 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
f010: 6f 29 3b 0a 20 20 20 20 61 64 64 72 49 6e 74 65  o);.    addrInte
f020: 67 65 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ger = sqlite3Vdb
f030: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
f040: 74 65 67 65 72 2c 20 30 2c 20 72 65 67 46 6c 75  teger, 0, regFlu
f050: 73 68 50 61 72 74 29 3b 0a 20 20 20 20 69 66 28  shPart);.    if(
f060: 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69   pMWin->pPartiti
f070: 6f 6e 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  on ){.      sqli
f080: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
f090: 76 2c 20 61 64 64 72 47 6f 73 75 62 46 6c 75 73  v, addrGosubFlus
f0a0: 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 64  h);.    }.    ad
f0b0: 64 72 43 61 63 68 65 52 65 77 69 6e 64 20 3d 20  drCacheRewind = 
f0c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f0d0: 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  1(v, OP_Rewind, 
f0e0: 63 73 72 57 72 69 74 65 29 3b 0a 20 20 7d 65 6c  csrWrite);.  }el
f0f0: 73 65 7b 0a 20 20 20 20 61 64 64 72 49 66 20 3d  se{.    addrIf =
f100: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f110: 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p1(v, OP_IfNot, 
f120: 70 4d 57 69 6e 2d 3e 72 65 67 46 69 72 73 74 29  pMWin->regFirst)
f130: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73  ;.  }..  /* This
f140: 20 62 6c 6f 63 6b 20 69 73 20 72 75 6e 20 66 6f   block is run fo
f150: 72 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 20  r the first row 
f160: 6f 66 20 65 61 63 68 20 70 61 72 74 69 74 69 6f  of each partitio
f170: 6e 20 2a 2f 0a 20 20 73 2e 72 65 67 41 72 67 20  n */.  s.regArg 
f180: 3d 20 72 65 67 41 72 67 20 3d 20 77 69 6e 64 6f  = regArg = windo
f190: 77 49 6e 69 74 41 63 63 75 6d 28 70 50 61 72 73  wInitAccum(pPars
f1a0: 65 2c 20 70 4d 57 69 6e 29 3b 0a 0a 20 20 69 66  e, pMWin);..  if
f1b0: 28 20 72 65 67 53 74 61 72 74 20 29 7b 0a 20 20  ( regStart ){.  
f1c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
f1d0: 65 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2d  e(pParse, pMWin-
f1e0: 3e 70 53 74 61 72 74 2c 20 72 65 67 53 74 61 72  >pStart, regStar
f1f0: 74 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43 68  t);.    windowCh
f200: 65 63 6b 49 6e 74 56 61 6c 75 65 28 70 50 61 72  eckIntValue(pPar
f210: 73 65 2c 20 72 65 67 53 74 61 72 74 2c 20 30 29  se, regStart, 0)
f220: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 67 45  ;.  }.  if( regE
f230: 6e 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  nd ){.    sqlite
f240: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
f250: 2c 20 70 4d 57 69 6e 2d 3e 70 45 6e 64 2c 20 72  , pMWin->pEnd, r
f260: 65 67 45 6e 64 29 3b 0a 20 20 20 20 77 69 6e 64  egEnd);.    wind
f270: 6f 77 43 68 65 63 6b 49 6e 74 56 61 6c 75 65 28  owCheckIntValue(
f280: 70 50 61 72 73 65 2c 20 72 65 67 45 6e 64 2c 20  pParse, regEnd, 
f290: 31 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  1);.  }..  if( p
f2a0: 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 70 4d  MWin->eStart==pM
f2b0: 57 69 6e 2d 3e 65 45 6e 64 20 26 26 20 72 65 67  Win->eEnd && reg
f2c0: 53 74 61 72 74 20 26 26 20 72 65 67 45 6e 64 20  Start && regEnd 
f2d0: 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  ){.    int op = 
f2e0: 28 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d  ((pMWin->eStart=
f2f0: 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 29 20 3f  =TK_FOLLOWING) ?
f300: 20 4f 50 5f 47 65 20 3a 20 4f 50 5f 4c 65 29 3b   OP_Ge : OP_Le);
f310: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 47 65 20  .    int addrGe 
f320: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
f330: 4f 70 33 28 76 2c 20 6f 70 2c 20 72 65 67 53 74  Op3(v, op, regSt
f340: 61 72 74 2c 20 30 2c 20 72 65 67 45 6e 64 29 3b  art, 0, regEnd);
f350: 0a 20 20 20 20 77 69 6e 64 6f 77 41 67 67 46 69  .    windowAggFi
f360: 6e 61 6c 28 70 50 61 72 73 65 2c 20 70 4d 57 69  nal(pParse, pMWi
f370: 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 62  n, 0);.    if( b
f380: 43 61 63 68 65 20 29 7b 0a 20 20 20 20 20 20 73  Cache ){.      s
f390: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
f3a0: 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 63 73  (v, OP_Rowid, cs
f3b0: 72 57 72 69 74 65 2c 20 72 65 67 52 6f 77 69 64  rWrite, regRowid
f3c0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f3d0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
f3e0: 5f 4e 6f 74 45 78 69 73 74 73 2c 20 73 2e 63 75  _NotExists, s.cu
f3f0: 72 72 65 6e 74 2e 63 73 72 2c 20 30 2c 20 72 65  rrent.csr, 0, re
f400: 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 77  gRowid);.      w
f410: 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52 6f  indowReturnOneRo
f420: 77 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c  w(pParse, pMWin,
f430: 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47   regGosub, addrG
f440: 6f 73 75 62 29 3b 0a 20 20 20 20 20 20 73 71 6c  osub);.      sql
f450: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f460: 2c 20 4f 50 5f 4e 65 78 74 2c 20 63 73 72 57 72  , OP_Next, csrWr
f470: 69 74 65 2c 20 61 64 64 72 43 61 63 68 65 52 65  ite, addrCacheRe
f480: 77 69 6e 64 2b 31 29 3b 0a 20 20 20 20 7d 65 6c  wind+1);.    }el
f490: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
f4a0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
f4b0: 50 5f 52 65 77 69 6e 64 2c 20 73 2e 63 75 72 72  P_Rewind, s.curr
f4c0: 65 6e 74 2e 63 73 72 2c 20 31 29 3b 0a 20 20 20  ent.csr, 1);.   
f4d0: 20 20 20 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f     windowReturnO
f4e0: 6e 65 52 6f 77 28 70 50 61 72 73 65 2c 20 70 4d  neRow(pParse, pM
f4f0: 57 69 6e 2c 20 72 65 67 47 6f 73 75 62 2c 20 61  Win, regGosub, a
f500: 64 64 72 47 6f 73 75 62 29 3b 0a 20 20 20 20 20  ddrGosub);.     
f510: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f520: 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f  p1(v, OP_ResetSo
f530: 72 74 65 72 2c 20 73 2e 63 75 72 72 65 6e 74 2e  rter, s.current.
f540: 63 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  csr);.    }.    
f550: 61 64 64 72 53 68 6f 72 74 63 75 74 20 3d 20 73  addrShortcut = s
f560: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
f570: 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20  (v, OP_Goto);.  
f580: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
f590: 70 48 65 72 65 28 76 2c 20 61 64 64 72 47 65 29  pHere(v, addrGe)
f5a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d 57 69  ;.  }.  if( pMWi
f5b0: 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f  n->eStart==TK_FO
f5c0: 4c 4c 4f 57 49 4e 47 20 26 26 20 70 4d 57 69 6e  LLOWING && pMWin
f5d0: 2d 3e 65 54 79 70 65 21 3d 54 4b 5f 52 41 4e 47  ->eType!=TK_RANG
f5e0: 45 20 26 26 20 72 65 67 45 6e 64 20 29 7b 0a 20  E && regEnd ){. 
f5f0: 20 20 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e     assert( pMWin
f600: 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f  ->eEnd==TK_FOLLO
f610: 57 49 4e 47 20 29 3b 0a 20 20 20 20 73 71 6c 69  WING );.    sqli
f620: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
f630: 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72 65   OP_Subtract, re
f640: 67 53 74 61 72 74 2c 20 72 65 67 45 6e 64 2c 20  gStart, regEnd, 
f650: 72 65 67 53 74 61 72 74 29 3b 0a 20 20 7d 0a 0a  regStart);.  }..
f660: 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74    if( pMWin->eSt
f670: 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  art!=TK_UNBOUNDE
f680: 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  D ){.    sqlite3
f690: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
f6a0: 5f 52 65 77 69 6e 64 2c 20 73 2e 73 74 61 72 74  _Rewind, s.start
f6b0: 2e 63 73 72 2c 20 31 29 3b 0a 20 20 7d 0a 20 20  .csr, 1);.  }.  
f6c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f6d0: 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
f6e0: 73 2e 63 75 72 72 65 6e 74 2e 63 73 72 2c 20 31  s.current.csr, 1
f6f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
f700: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
f710: 69 6e 64 2c 20 73 2e 65 6e 64 2e 63 73 72 2c 20  ind, s.end.csr, 
f720: 31 29 3b 0a 20 20 69 66 28 20 72 65 67 50 65 65  1);.  if( regPee
f730: 72 20 26 26 20 70 4f 72 64 65 72 42 79 20 29 7b  r && pOrderBy ){
f740: 0a 20 20 20 20 69 66 28 20 62 43 61 63 68 65 20  .    if( bCache 
f750: 29 7b 0a 20 20 20 20 20 20 77 69 6e 64 6f 77 52  ){.      windowR
f760: 65 61 64 50 65 65 72 56 61 6c 75 65 73 28 26 73  eadPeerValues(&s
f770: 2c 20 63 73 72 57 72 69 74 65 2c 20 72 65 67 50  , csrWrite, regP
f780: 65 65 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  eer);.    }else{
f790: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f7a0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
f7b0: 6f 70 79 2c 20 72 65 67 4e 65 77 50 65 65 72 2c  opy, regNewPeer,
f7c0: 20 72 65 67 50 65 65 72 2c 20 70 4f 72 64 65 72   regPeer, pOrder
f7d0: 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20  By->nExpr-1);.  
f7e0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
f7f0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
f800: 43 6f 70 79 2c 20 72 65 67 50 65 65 72 2c 20 73  Copy, regPeer, s
f810: 2e 73 74 61 72 74 2e 72 65 67 2c 20 70 4f 72 64  .start.reg, pOrd
f820: 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a  erBy->nExpr-1);.
f830: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f840: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp3(v, OP_Copy
f850: 2c 20 72 65 67 50 65 65 72 2c 20 73 2e 63 75 72  , regPeer, s.cur
f860: 72 65 6e 74 2e 72 65 67 2c 20 70 4f 72 64 65 72  rent.reg, pOrder
f870: 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20  By->nExpr-1);.  
f880: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f890: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op3(v, OP_Copy, 
f8a0: 72 65 67 50 65 65 72 2c 20 73 2e 65 6e 64 2e 72  regPeer, s.end.r
f8b0: 65 67 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  eg, pOrderBy->nE
f8c0: 78 70 72 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 73  xpr-1);.  }..  s
f8d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
f8e0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
f8f0: 30 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 46 69 72  0, pMWin->regFir
f900: 73 74 29 3b 0a 20 20 61 64 64 72 47 6f 74 6f 20  st);.  addrGoto 
f910: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
f920: 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b  Op0(v, OP_Goto);
f930: 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e  ..  /* Begin gen
f940: 65 72 61 74 69 6e 67 20 53 45 43 4f 4e 44 5f 52  erating SECOND_R
f950: 4f 57 5f 43 4f 44 45 20 2a 2f 0a 20 20 56 64 62  OW_CODE */.  Vdb
f960: 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28  eModuleComment((
f970: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 22  pParse->pVdbe, "
f980: 42 65 67 69 6e 20 77 69 6e 64 6f 77 43 6f 64 65  Begin windowCode
f990: 53 74 65 70 2e 53 45 43 4f 4e 44 5f 52 4f 57 5f  Step.SECOND_ROW_
f9a0: 43 4f 44 45 22 29 29 3b 0a 20 20 69 66 28 20 62  CODE"));.  if( b
f9b0: 43 61 63 68 65 20 29 7b 0a 20 20 20 20 61 64 64  Cache ){.    add
f9c0: 72 43 61 63 68 65 4e 65 78 74 20 3d 20 73 71 6c  rCacheNext = 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 3b 0a 20 20 20 20 69 66 28 20  ddr(v);.    if( 
f9f0: 70 4d 57 69 6e 2d 3e 65 54 79 70 65 21 3d 54 4b  pMWin->eType!=TK
fa00: 5f 52 4f 57 53 20 29 7b 0a 20 20 20 20 20 20 77  _ROWS ){.      w
fa10: 69 6e 64 6f 77 52 65 61 64 50 65 65 72 56 61 6c  indowReadPeerVal
fa20: 75 65 73 28 26 73 2c 20 63 73 72 57 72 69 74 65  ues(&s, csrWrite
fa30: 2c 20 72 65 67 4e 65 77 50 65 65 72 29 3b 0a 20  , regNewPeer);. 
fa40: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
fa50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
fa60: 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 66 29  pHere(v, addrIf)
fa70: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 67 50  ;.  }.  if( regP
fa80: 65 65 72 20 29 7b 0a 20 20 20 20 61 64 64 72 50  eer ){.    addrP
fa90: 65 65 72 4a 75 6d 70 20 3d 20 77 69 6e 64 6f 77  eerJump = window
faa0: 49 66 4e 65 77 50 65 65 72 28 70 50 61 72 73 65  IfNewPeer(pParse
fab0: 2c 20 70 4f 72 64 65 72 42 79 2c 20 72 65 67 4e  , pOrderBy, regN
fac0: 65 77 50 65 65 72 2c 20 72 65 67 50 65 65 72 29  ewPeer, regPeer)
fad0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d 57 69  ;.  }.  if( pMWi
fae0: 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f  n->eStart==TK_FO
faf0: 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 77  LLOWING ){.    w
fb00: 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20  indowCodeOp(&s, 
fb10: 57 49 4e 44 4f 57 5f 41 47 47 53 54 45 50 2c 20  WINDOW_AGGSTEP, 
fb20: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
fb30: 4d 57 69 6e 2d 3e 65 45 6e 64 21 3d 54 4b 5f 55  MWin->eEnd!=TK_U
fb40: 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20 20  NBOUNDED ){.    
fb50: 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 54 79    if( pMWin->eTy
fb60: 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 29 7b 0a  pe==TK_RANGE ){.
fb70: 20 20 20 20 20 20 20 20 69 6e 74 20 6c 62 6c 20          int lbl 
fb80: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
fb90: 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
fba0: 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
fbb0: 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Next = sqlite3Vd
fbc0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
fbd0: 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77  ;.        window
fbe0: 43 6f 64 65 52 61 6e 67 65 54 65 73 74 28 26 73  CodeRangeTest(&s
fbf0: 2c 20 4f 50 5f 47 65 2c 20 73 2e 63 75 72 72 65  , OP_Ge, s.curre
fc00: 6e 74 2e 63 73 72 2c 20 72 65 67 45 6e 64 2c 20  nt.csr, regEnd, 
fc10: 73 2e 65 6e 64 2e 63 73 72 2c 20 6c 62 6c 29 3b  s.end.csr, lbl);
fc20: 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43  .        windowC
fc30: 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57  odeOp(&s, WINDOW
fc40: 5f 41 47 47 49 4e 56 45 52 53 45 2c 20 72 65 67  _AGGINVERSE, reg
fc50: 53 74 61 72 74 2c 20 30 29 3b 0a 20 20 20 20 20  Start, 0);.     
fc60: 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28     windowCodeOp(
fc70: 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55 52  &s, WINDOW_RETUR
fc80: 4e 5f 52 4f 57 2c 20 30 2c 20 30 29 3b 0a 20 20  N_ROW, 0, 0);.  
fc90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fca0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
fcb0: 74 6f 2c 20 30 2c 20 61 64 64 72 4e 65 78 74 29  to, 0, addrNext)
fcc0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
fcd0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
fce0: 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20 20 20 20 20  l(v, lbl);.     
fcf0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
fd00: 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c  windowCodeOp(&s,
fd10: 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52   WINDOW_RETURN_R
fd20: 4f 57 2c 20 72 65 67 45 6e 64 2c 20 30 29 3b 0a  OW, regEnd, 0);.
fd30: 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f          windowCo
fd40: 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f  deOp(&s, WINDOW_
fd50: 41 47 47 49 4e 56 45 52 53 45 2c 20 72 65 67 53  AGGINVERSE, regS
fd60: 74 61 72 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  tart, 0);.      
fd70: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  }.    }.  }else.
fd80: 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e    if( pMWin->eEn
fd90: 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20  d==TK_PRECEDING 
fda0: 29 7b 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f 64  ){.    windowCod
fdb0: 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41  eOp(&s, WINDOW_A
fdc0: 47 47 53 54 45 50 2c 20 72 65 67 45 6e 64 2c 20  GGSTEP, regEnd, 
fdd0: 30 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f  0);.    windowCo
fde0: 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f  deOp(&s, WINDOW_
fdf0: 52 45 54 55 52 4e 5f 52 4f 57 2c 20 30 2c 20 30  RETURN_ROW, 0, 0
fe00: 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f 64  );.    windowCod
fe10: 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41  eOp(&s, WINDOW_A
fe20: 47 47 49 4e 56 45 52 53 45 2c 20 72 65 67 53 74  GGINVERSE, regSt
fe30: 61 72 74 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  art, 0);.  }else
fe40: 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a  {.    int addr;.
fe50: 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70      windowCodeOp
fe60: 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 53  (&s, WINDOW_AGGS
fe70: 54 45 50 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  TEP, 0, 0);.    
fe80: 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 21  if( pMWin->eEnd!
fe90: 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b  =TK_UNBOUNDED ){
fea0: 0a 20 20 20 20 20 20 69 66 28 20 70 4d 57 69 6e  .      if( pMWin
feb0: 2d 3e 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47  ->eType==TK_RANG
fec0: 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  E ){.        int
fed0: 20 6c 62 6c 3b 0a 20 20 20 20 20 20 20 20 61 64   lbl;.        ad
fee0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
fef0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
ff00: 20 20 20 20 20 20 20 20 69 66 28 20 72 65 67 45          if( regE
ff10: 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nd ){.          
ff20: 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  lbl = sqlite3Vdb
ff30: 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
ff40: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 77 69  e);.          wi
ff50: 6e 64 6f 77 43 6f 64 65 52 61 6e 67 65 54 65 73  ndowCodeRangeTes
ff60: 74 28 26 73 2c 20 4f 50 5f 47 65 2c 20 73 2e 63  t(&s, OP_Ge, s.c
ff70: 75 72 72 65 6e 74 2e 63 73 72 2c 20 72 65 67 45  urrent.csr, regE
ff80: 6e 64 2c 20 73 2e 65 6e 64 2e 63 73 72 2c 20 6c  nd, s.end.csr, l
ff90: 62 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  bl);.        }. 
ffa0: 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64         windowCod
ffb0: 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52  eOp(&s, WINDOW_R
ffc0: 45 54 55 52 4e 5f 52 4f 57 2c 20 30 2c 20 30 29  ETURN_ROW, 0, 0)
ffd0: 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77  ;.        window
ffe0: 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f  CodeOp(&s, WINDO
fff0: 57 5f 41 47 47 49 4e 56 45 52 53 45 2c 20 72 65  W_AGGINVERSE, re
10000 67 53 74 61 72 74 2c 20 30 29 3b 0a 20 20 20 20  gStart, 0);.    
10010 20 20 20 20 69 66 28 20 72 65 67 45 6e 64 20 29      if( regEnd )
10020 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
10030 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10040 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
10050 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  r);.          sq
10060 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
10070 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20  Label(v, lbl);. 
10080 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
10090 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
100a0 28 20 72 65 67 45 6e 64 20 29 20 61 64 64 72 20  ( regEnd ) addr 
100b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
100c0 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op3(v, OP_IfPos,
100d0 20 72 65 67 45 6e 64 2c 20 30 2c 20 31 29 3b 0a   regEnd, 0, 1);.
100e0 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f          windowCo
100f0 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f  deOp(&s, WINDOW_
10100 52 45 54 55 52 4e 5f 52 4f 57 2c 20 30 2c 20 30  RETURN_ROW, 0, 0
10110 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f  );.        windo
10120 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44  wCodeOp(&s, WIND
10130 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 2c 20 72  OW_AGGINVERSE, r
10140 65 67 53 74 61 72 74 2c 20 30 29 3b 0a 20 20 20  egStart, 0);.   
10150 20 20 20 20 20 69 66 28 20 72 65 67 45 6e 64 20       if( regEnd 
10160 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
10170 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
10180 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10190 7d 0a 20 20 69 66 28 20 61 64 64 72 50 65 65 72  }.  if( addrPeer
101a0 4a 75 6d 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  Jump ){.    sqli
101b0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
101c0 76 2c 20 61 64 64 72 50 65 65 72 4a 75 6d 70 29  v, addrPeerJump)
101d0 3b 0a 20 20 7d 0a 20 20 56 64 62 65 4d 6f 64 75  ;.  }.  VdbeModu
101e0 6c 65 43 6f 6d 6d 65 6e 74 28 28 70 50 61 72 73  leComment((pPars
101f0 65 2d 3e 70 56 64 62 65 2c 20 22 45 6e 64 20 77  e->pVdbe, "End w
10200 69 6e 64 6f 77 43 6f 64 65 53 74 65 70 2e 53 45  indowCodeStep.SE
10210 43 4f 4e 44 5f 52 4f 57 5f 43 4f 44 45 22 29 29  COND_ROW_CODE"))
10220 3b 0a 0a 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74  ;..  /* End of t
10230 68 65 20 6d 61 69 6e 20 69 6e 70 75 74 20 6c 6f  he main input lo
10240 6f 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  op */.  sqlite3V
10250 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
10260 64 64 72 47 6f 74 6f 29 3b 0a 20 20 69 66 28 20  ddrGoto);.  if( 
10270 62 43 61 63 68 65 20 29 7b 0a 20 20 20 20 73 71  bCache ){.    sq
10280 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
10290 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 63 73 72 57  v, OP_Next, csrW
102a0 72 69 74 65 2c 20 61 64 64 72 43 61 63 68 65 4e  rite, addrCacheN
102b0 65 78 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ext);.    sqlite
102c0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
102d0 20 61 64 64 72 43 61 63 68 65 52 65 77 69 6e 64   addrCacheRewind
102e0 29 3b 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ); .  }else{.   
102f0 20 69 66 28 20 61 64 64 72 53 68 6f 72 74 63 75   if( addrShortcu
10300 74 3e 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  t>0 ) sqlite3Vdb
10310 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
10320 72 53 68 6f 72 74 63 75 74 29 3b 0a 20 20 20 20  rShortcut);.    
10330 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
10340 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 20 20  pWInfo);.  }..  
10350 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20  /* Fall through 
10360 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  */.  if( pMWin->
10370 70 50 61 72 74 69 74 69 6f 6e 20 26 26 20 62 43  pPartition && bC
10380 61 63 68 65 3d 3d 30 20 29 7b 0a 20 20 20 20 61  ache==0 ){.    a
10390 64 64 72 49 6e 74 65 67 65 72 20 3d 20 73 71 6c  ddrInteger = sql
103a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
103b0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
103c0 20 72 65 67 46 6c 75 73 68 50 61 72 74 29 3b 0a   regFlushPart);.
103d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
103e0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 47  umpHere(v, addrG
103f0 6f 73 75 62 46 6c 75 73 68 29 3b 0a 20 20 7d 0a  osubFlush);.  }.
10400 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d  .  VdbeModuleCom
10410 6d 65 6e 74 28 28 70 50 61 72 73 65 2d 3e 70 56  ment((pParse->pV
10420 64 62 65 2c 20 22 42 65 67 69 6e 20 77 69 6e 64  dbe, "Begin wind
10430 6f 77 43 6f 64 65 53 74 65 70 2e 46 4c 55 53 48  owCodeStep.FLUSH
10440 5f 43 4f 44 45 22 29 29 3b 0a 20 20 61 64 64 72  _CODE"));.  addr
10450 45 6d 70 74 79 20 3d 20 73 71 6c 69 74 65 33 56  Empty = sqlite3V
10460 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
10470 52 65 77 69 6e 64 2c 20 63 73 72 57 72 69 74 65  Rewind, csrWrite
10480 29 3b 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  );.  if( pMWin->
10490 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49  eEnd==TK_PRECEDI
104a0 4e 47 20 29 7b 0a 20 20 20 20 77 69 6e 64 6f 77  NG ){.    window
104b0 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f  CodeOp(&s, WINDO
104c0 57 5f 41 47 47 53 54 45 50 2c 20 72 65 67 45 6e  W_AGGSTEP, regEn
104d0 64 2c 20 30 29 3b 0a 20 20 20 20 77 69 6e 64 6f  d, 0);.    windo
104e0 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44  wCodeOp(&s, WIND
104f0 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 30  OW_RETURN_ROW, 0
10500 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  , 0);.  }else if
10510 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d  ( pMWin->eStart=
10520 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b  =TK_FOLLOWING ){
10530 0a 20 20 20 20 69 6e 74 20 61 64 64 72 53 74 61  .    int addrSta
10540 72 74 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72  rt;.    int addr
10550 42 72 65 61 6b 31 3b 0a 20 20 20 20 69 6e 74 20  Break1;.    int 
10560 61 64 64 72 42 72 65 61 6b 32 3b 0a 20 20 20 20  addrBreak2;.    
10570 69 6e 74 20 61 64 64 72 42 72 65 61 6b 33 3b 0a  int addrBreak3;.
10580 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70      windowCodeOp
10590 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 53  (&s, WINDOW_AGGS
105a0 54 45 50 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  TEP, 0, 0);.    
105b0 69 66 28 20 70 4d 57 69 6e 2d 3e 65 54 79 70 65  if( pMWin->eType
105c0 3d 3d 54 4b 5f 52 41 4e 47 45 20 29 7b 0a 20 20  ==TK_RANGE ){.  
105d0 20 20 20 20 61 64 64 72 53 74 61 72 74 20 3d 20      addrStart = 
105e0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
105f0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
10600 20 61 64 64 72 42 72 65 61 6b 32 20 3d 20 77 69   addrBreak2 = wi
10610 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57  ndowCodeOp(&s, W
10620 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45  INDOW_AGGINVERSE
10630 2c 20 72 65 67 53 74 61 72 74 2c 20 31 29 3b 0a  , regStart, 1);.
10640 20 20 20 20 20 20 61 64 64 72 42 72 65 61 6b 31        addrBreak1
10650 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28   = windowCodeOp(
10660 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55 52  &s, WINDOW_RETUR
10670 4e 5f 52 4f 57 2c 20 30 2c 20 31 29 3b 0a 20 20  N_ROW, 0, 1);.  
10680 20 20 7d 65 6c 73 65 0a 20 20 20 20 69 66 28 20    }else.    if( 
10690 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f  pMWin->eEnd==TK_
106a0 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20  UNBOUNDED ){.   
106b0 20 20 20 61 64 64 72 53 74 61 72 74 20 3d 20 73     addrStart = s
106c0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
106d0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
106e0 61 64 64 72 42 72 65 61 6b 31 20 3d 20 77 69 6e  addrBreak1 = win
106f0 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49  dowCodeOp(&s, WI
10700 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c  NDOW_RETURN_ROW,
10710 20 72 65 67 53 74 61 72 74 2c 20 31 29 3b 0a 20   regStart, 1);. 
10720 20 20 20 20 20 61 64 64 72 42 72 65 61 6b 32 20       addrBreak2 
10730 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26  = windowCodeOp(&
10740 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56  s, WINDOW_AGGINV
10750 45 52 53 45 2c 20 30 2c 20 31 29 3b 0a 20 20 20  ERSE, 0, 1);.   
10760 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
10770 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 45 6e  sert( pMWin->eEn
10780 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  d==TK_FOLLOWING 
10790 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53 74 61  );.      addrSta
107a0 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
107b0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
107c0 20 20 20 20 20 20 61 64 64 72 42 72 65 61 6b 31        addrBreak1
107d0 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28   = windowCodeOp(
107e0 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55 52  &s, WINDOW_RETUR
107f0 4e 5f 52 4f 57 2c 20 72 65 67 45 6e 64 2c 20 31  N_ROW, regEnd, 1
10800 29 3b 0a 20 20 20 20 20 20 61 64 64 72 42 72 65  );.      addrBre
10810 61 6b 32 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65  ak2 = windowCode
10820 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47  Op(&s, WINDOW_AG
10830 47 49 4e 56 45 52 53 45 2c 20 72 65 67 53 74 61  GINVERSE, regSta
10840 72 74 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  rt, 1);.    }.  
10850 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10860 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
10870 30 2c 20 61 64 64 72 53 74 61 72 74 29 3b 0a 20  0, addrStart);. 
10880 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
10890 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 42 72  mpHere(v, addrBr
108a0 65 61 6b 32 29 3b 0a 20 20 20 20 61 64 64 72 53  eak2);.    addrS
108b0 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
108c0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
108d0 3b 0a 20 20 20 20 61 64 64 72 42 72 65 61 6b 33  ;.    addrBreak3
108e0 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28   = windowCodeOp(
108f0 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55 52  &s, WINDOW_RETUR
10900 4e 5f 52 4f 57 2c 20 30 2c 20 31 29 3b 0a 20 20  N_ROW, 0, 1);.  
10910 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10920 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
10930 30 2c 20 61 64 64 72 53 74 61 72 74 29 3b 0a 20  0, addrStart);. 
10940 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
10950 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 42 72  mpHere(v, addrBr
10960 65 61 6b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  eak1);.    sqlit
10970 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
10980 2c 20 61 64 64 72 42 72 65 61 6b 33 29 3b 0a 20  , addrBreak3);. 
10990 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
109a0 61 64 64 72 42 72 65 61 6b 3b 0a 20 20 20 20 69  addrBreak;.    i
109b0 6e 74 20 61 64 64 72 53 74 61 72 74 3b 0a 20 20  nt addrStart;.  
109c0 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26    windowCodeOp(&
109d0 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 53 54 45  s, WINDOW_AGGSTE
109e0 50 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 61 64  P, 0, 0);.    ad
109f0 64 72 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65  drStart = sqlite
10a00 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
10a10 28 76 29 3b 0a 20 20 20 20 61 64 64 72 42 72 65  (v);.    addrBre
10a20 61 6b 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f  ak = windowCodeO
10a30 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54  p(&s, WINDOW_RET
10a40 55 52 4e 5f 52 4f 57 2c 20 30 2c 20 31 29 3b 0a  URN_ROW, 0, 1);.
10a50 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70      windowCodeOp
10a60 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49  (&s, WINDOW_AGGI
10a70 4e 56 45 52 53 45 2c 20 72 65 67 53 74 61 72 74  NVERSE, regStart
10a80 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
10a90 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10aa0 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 53  P_Goto, 0, addrS
10ab0 74 61 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  tart);.    sqlit
10ac0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
10ad0 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
10ae0 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  }..  sqlite3Vdbe
10af0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
10b00 45 6d 70 74 79 29 3b 0a 0a 20 20 69 66 28 20 62  Empty);..  if( b
10b10 43 61 63 68 65 20 26 26 20 61 64 64 72 53 68 6f  Cache && addrSho
10b20 72 74 63 75 74 3e 30 20 29 20 73 71 6c 69 74 65  rtcut>0 ) sqlite
10b30 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
10b40 20 61 64 64 72 53 68 6f 72 74 63 75 74 29 3b 0a   addrShortcut);.
10b50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10b60 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53  Op1(v, OP_ResetS
10b70 6f 72 74 65 72 2c 20 73 2e 63 75 72 72 65 6e 74  orter, s.current
10b80 2e 63 73 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  .csr);.  sqlite3
10b90 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10ba0 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 4d 57  _Integer, 0, pMW
10bb0 69 6e 2d 3e 72 65 67 53 69 7a 65 29 3b 0a 20 20  in->regSize);.  
10bc0 69 66 28 20 62 43 61 63 68 65 3d 3d 30 20 29 20  if( bCache==0 ) 
10bd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10be0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
10bf0 20 31 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 46 69   1, pMWin->regFi
10c00 72 73 74 29 3b 0a 20 20 56 64 62 65 4d 6f 64 75  rst);.  VdbeModu
10c10 6c 65 43 6f 6d 6d 65 6e 74 28 28 70 50 61 72 73  leComment((pPars
10c20 65 2d 3e 70 56 64 62 65 2c 20 22 45 6e 64 20 77  e->pVdbe, "End w
10c30 69 6e 64 6f 77 43 6f 64 65 53 74 65 70 2e 46 4c  indowCodeStep.FL
10c40 55 53 48 5f 43 4f 44 45 22 29 29 3b 0a 20 20 69  USH_CODE"));.  i
10c50 66 28 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69  f( pMWin->pParti
10c60 74 69 6f 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  tion ){.    sqli
10c70 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28  te3VdbeChangeP1(
10c80 76 2c 20 61 64 64 72 49 6e 74 65 67 65 72 2c 20  v, addrInteger, 
10c90 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
10ca0 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20  ntAddr(v));.    
10cb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10cc0 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
10cd0 72 65 67 46 6c 75 73 68 50 61 72 74 29 3b 0a 20  regFlushPart);. 
10ce0 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c   }.}.../*.** All
10cf0 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e  ocate and return
10d00 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20   a duplicate of 
10d10 74 68 65 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63  the Window objec
10d20 74 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74  t indicated by t
10d30 68 65 0a 2a 2a 20 74 68 69 72 64 20 61 72 67 75  he.** third argu
10d40 6d 65 6e 74 2e 20 53 65 74 20 74 68 65 20 57 69  ment. Set the Wi
10d50 6e 64 6f 77 2e 70 4f 77 6e 65 72 20 66 69 65 6c  ndow.pOwner fiel
10d60 64 20 6f 66 20 74 68 65 20 6e 65 77 20 6f 62 6a  d of the new obj
10d70 65 63 74 20 74 6f 0a 2a 2a 20 70 4f 77 6e 65 72  ect to.** pOwner
10d80 2e 0a 2a 2f 0a 57 69 6e 64 6f 77 20 2a 73 71 6c  ..*/.Window *sql
10d90 69 74 65 33 57 69 6e 64 6f 77 44 75 70 28 73 71  ite3WindowDup(sq
10da0 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
10db0 2a 70 4f 77 6e 65 72 2c 20 57 69 6e 64 6f 77 20  *pOwner, Window 
10dc0 2a 70 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70  *p){.  Window *p
10dd0 4e 65 77 20 3d 20 30 3b 0a 20 20 69 66 28 20 41  New = 0;.  if( A
10de0 4c 57 41 59 53 28 70 29 20 29 7b 0a 20 20 20 20  LWAYS(p) ){.    
10df0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
10e00 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
10e10 69 7a 65 6f 66 28 57 69 6e 64 6f 77 29 29 3b 0a  izeof(Window));.
10e20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
10e30 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d        pNew->zNam
10e40 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
10e50 44 75 70 28 64 62 2c 20 70 2d 3e 7a 4e 61 6d 65  Dup(db, p->zName
10e60 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  );.      pNew->p
10e70 46 69 6c 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Filter = sqlite3
10e80 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
10e90 46 69 6c 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Filter, 0);.    
10ea0 20 20 70 4e 65 77 2d 3e 70 46 75 6e 63 20 3d 20    pNew->pFunc = 
10eb0 70 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20  p->pFunc;.      
10ec0 70 4e 65 77 2d 3e 70 50 61 72 74 69 74 69 6f 6e  pNew->pPartition
10ed0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
10ee0 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 50 61  stDup(db, p->pPa
10ef0 72 74 69 74 69 6f 6e 2c 20 30 29 3b 0a 20 20 20  rtition, 0);.   
10f00 20 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42     pNew->pOrderB
10f10 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
10f20 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f  istDup(db, p->pO
10f30 72 64 65 72 42 79 2c 20 30 29 3b 0a 20 20 20 20  rderBy, 0);.    
10f40 20 20 70 4e 65 77 2d 3e 65 54 79 70 65 20 3d 20    pNew->eType = 
10f50 70 2d 3e 65 54 79 70 65 3b 0a 20 20 20 20 20 20  p->eType;.      
10f60 70 4e 65 77 2d 3e 65 45 6e 64 20 3d 20 70 2d 3e  pNew->eEnd = p->
10f70 65 45 6e 64 3b 0a 20 20 20 20 20 20 70 4e 65 77  eEnd;.      pNew
10f80 2d 3e 65 53 74 61 72 74 20 3d 20 70 2d 3e 65 53  ->eStart = p->eS
10f90 74 61 72 74 3b 0a 20 20 20 20 20 20 70 4e 65 77  tart;.      pNew
10fa0 2d 3e 70 53 74 61 72 74 20 3d 20 73 71 6c 69 74  ->pStart = sqlit
10fb0 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
10fc0 3e 70 53 74 61 72 74 2c 20 30 29 3b 0a 20 20 20  >pStart, 0);.   
10fd0 20 20 20 70 4e 65 77 2d 3e 70 45 6e 64 20 3d 20     pNew->pEnd = 
10fe0 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
10ff0 62 2c 20 70 2d 3e 70 45 6e 64 2c 20 30 29 3b 0a  b, p->pEnd, 0);.
11000 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4f 77 6e        pNew->pOwn
11010 65 72 20 3d 20 70 4f 77 6e 65 72 3b 0a 20 20 20  er = pOwner;.   
11020 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
11030 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pNew;.}../*.** R
11040 65 74 75 72 6e 20 61 20 63 6f 70 79 20 6f 66 20  eturn a copy of 
11050 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
11060 6f 66 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74  of Window object
11070 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 0a  s passed as the.
11080 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  ** second argume
11090 6e 74 2e 0a 2a 2f 0a 57 69 6e 64 6f 77 20 2a 73  nt..*/.Window *s
110a0 71 6c 69 74 65 33 57 69 6e 64 6f 77 4c 69 73 74  qlite3WindowList
110b0 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
110c0 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 57   Window *p){.  W
110d0 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 57  indow *pWin;.  W
110e0 69 6e 64 6f 77 20 2a 70 52 65 74 20 3d 20 30 3b  indow *pRet = 0;
110f0 0a 20 20 57 69 6e 64 6f 77 20 2a 2a 70 70 20 3d  .  Window **pp =
11100 20 26 70 52 65 74 3b 0a 0a 20 20 66 6f 72 28 70   &pRet;..  for(p
11110 57 69 6e 3d 70 3b 20 70 57 69 6e 3b 20 70 57 69  Win=p; pWin; pWi
11120 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e  n=pWin->pNextWin
11130 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20 73 71 6c  ){.    *pp = sql
11140 69 74 65 33 57 69 6e 64 6f 77 44 75 70 28 64 62  ite3WindowDup(db
11150 2c 20 30 2c 20 70 57 69 6e 29 3b 0a 20 20 20 20  , 0, pWin);.    
11160 69 66 28 20 2a 70 70 3d 3d 30 20 29 20 62 72 65  if( *pp==0 ) bre
11170 61 6b 3b 0a 20 20 20 20 70 70 20 3d 20 26 28 28  ak;.    pp = &((
11180 2a 70 70 29 2d 3e 70 4e 65 78 74 57 69 6e 29 3b  *pp)->pNextWin);
11190 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
111a0 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71  Ret;.}../*.** sq
111b0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
111c0 29 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  ) has already be
111d0 65 6e 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68  en called for th
111e0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
111f0 6e 74 20 0a 2a 2a 20 70 61 73 73 65 64 20 61 73  nt .** passed as
11200 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
11210 6d 65 6e 74 20 77 68 65 6e 20 74 68 69 73 20 66  ment when this f
11220 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b  unction is invok
11230 65 64 2e 20 49 74 20 67 65 6e 65 72 61 74 65 73  ed. It generates
11240 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 70 6f 70 75  .** code to popu
11250 6c 61 74 65 20 74 68 65 20 57 69 6e 64 6f 77 2e  late the Window.
11260 72 65 67 52 65 73 75 6c 74 20 72 65 67 69 73 74  regResult regist
11270 65 72 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64  er for each wind
11280 6f 77 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 0a  ow function and.
11290 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 73 75  ** invoke the su
112a0 62 2d 72 6f 75 74 69 6e 65 20 61 74 20 69 6e 73  b-routine at ins
112b0 74 72 75 63 74 69 6f 6e 20 61 64 64 72 47 6f 73  truction addrGos
112c0 75 62 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ub once for each
112d0 20 72 6f 77 2e 0a 2a 2a 20 54 68 69 73 20 66 75   row..** This fu
112e0 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c  nction calls sql
112f0 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 62  ite3WhereEnd() b
11300 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
11310 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
11320 33 57 69 6e 64 6f 77 43 6f 64 65 53 74 65 70 28  3WindowCodeStep(
11330 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
11340 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11350 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
11360 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
11370 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
11380 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 77 72           /* Rewr
11390 69 74 74 65 6e 20 53 45 4c 45 43 54 20 73 74 61  itten SELECT sta
113a0 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 57 68 65 72  tement */.  Wher
113b0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20  eInfo *pWInfo,  
113c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
113d0 6f 6e 74 65 78 74 20 72 65 74 75 72 6e 65 64 20  ontext returned 
113e0 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  by sqlite3WhereB
113f0 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  egin() */.  int 
11400 72 65 67 47 6f 73 75 62 2c 20 20 20 20 20 20 20  regGosub,       
11410 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
11420 65 67 69 73 74 65 72 20 66 6f 72 20 4f 50 5f 47  egister for OP_G
11430 6f 73 75 62 20 2a 2f 0a 20 20 69 6e 74 20 61 64  osub */.  int ad
11440 64 72 47 6f 73 75 62 20 20 20 20 20 20 20 20 20  drGosub         
11450 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 50 5f            /* OP_
11460 47 6f 73 75 62 20 68 65 72 65 20 74 6f 20 72 65  Gosub here to re
11470 74 75 72 6e 20 65 61 63 68 20 72 6f 77 20 2a 2f  turn each row */
11480 0a 29 7b 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65  .){.  VdbeModule
11490 43 6f 6d 6d 65 6e 74 28 28 70 50 61 72 73 65 2d  Comment((pParse-
114a0 3e 70 56 64 62 65 2c 20 22 42 65 67 69 6e 20 77  >pVdbe, "Begin w
114b0 69 6e 64 6f 77 43 6f 64 65 53 74 65 70 28 29 22  indowCodeStep()"
114c0 29 29 3b 0a 20 20 77 69 6e 64 6f 77 43 6f 64 65  ));.  windowCode
114d0 53 74 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Step(pParse, p, 
114e0 70 57 49 6e 66 6f 2c 20 72 65 67 47 6f 73 75 62  pWInfo, regGosub
114f0 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a 20 20  , addrGosub);.  
11500 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e  VdbeModuleCommen
11510 74 28 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  t((pParse->pVdbe
11520 2c 20 22 45 6e 64 20 77 69 6e 64 6f 77 43 6f 64  , "End windowCod
11530 65 53 74 65 70 28 29 22 29 29 3b 0a 7d 0a 0a 23  eStep()"));.}..#
11540 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
11550 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20  OMIT_WINDOWFUNC 
11560 2a 2f 0a                                         */.