/ Hex Artifact Content
Login

Artifact e2e56938f05c93795bcfa6088e6c1799c9113dc62991e8f79665a37d92f69f21:


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 70 46 75 6e 63 2d 3e   }.  if( pFunc->
4700: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
4710: 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 20 29  TE_FUNC_WINDOW )
4720: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
4730: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
4740: 20 20 20 20 69 66 28 20 70 57 69 6e 2d 3e 70 46      if( pWin->pF
4750: 69 6c 74 65 72 20 29 7b 0a 20 20 20 20 20 20 73  ilter ){.      s
4760: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
4770: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
4780: 20 20 22 46 49 4c 54 45 52 20 63 6c 61 75 73 65    "FILTER clause
4790: 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65   may only be use
47a0: 64 20 77 69 74 68 20 61 67 67 72 65 67 61 74 65  d with aggregate
47b0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
47c0: 73 22 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  s".      );.    
47d0: 7d 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 46  }else.    if( pF
47e0: 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 72 6f 77 5f  unc->zName==row_
47f0: 6e 75 6d 62 65 72 4e 61 6d 65 20 7c 7c 20 70 46  numberName || pF
4800: 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 69 6c  unc->zName==ntil
4810: 65 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73  eName ){.      s
4820: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
4830: 28 64 62 2c 20 70 57 69 6e 2d 3e 70 53 74 61 72  (db, pWin->pStar
4840: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
4850: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
4860: 70 57 69 6e 2d 3e 70 45 6e 64 29 3b 0a 20 20 20  pWin->pEnd);.   
4870: 20 20 20 70 57 69 6e 2d 3e 70 53 74 61 72 74 20     pWin->pStart 
4880: 3d 20 70 57 69 6e 2d 3e 70 45 6e 64 20 3d 20 30  = pWin->pEnd = 0
4890: 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 65 54  ;.      pWin->eT
48a0: 79 70 65 20 3d 20 54 4b 5f 52 4f 57 53 3b 0a 20  ype = TK_ROWS;. 
48b0: 20 20 20 20 20 70 57 69 6e 2d 3e 65 53 74 61 72       pWin->eStar
48c0: 74 20 3d 20 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  t = TK_UNBOUNDED
48d0: 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 65 45  ;.      pWin->eE
48e0: 6e 64 20 3d 20 54 4b 5f 43 55 52 52 45 4e 54 3b  nd = TK_CURRENT;
48f0: 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20  .    }else..    
4900: 69 66 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65  if( pFunc->zName
4910: 3d 3d 64 65 6e 73 65 5f 72 61 6e 6b 4e 61 6d 65  ==dense_rankName
4920: 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65   || pFunc->zName
4930: 3d 3d 72 61 6e 6b 4e 61 6d 65 0a 20 20 20 20 20  ==rankName.     
4940: 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d  || pFunc->zName=
4950: 3d 70 65 72 63 65 6e 74 5f 72 61 6e 6b 4e 61 6d  =percent_rankNam
4960: 65 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d  e || pFunc->zNam
4970: 65 3d 3d 63 75 6d 65 5f 64 69 73 74 4e 61 6d 65  e==cume_distName
4980: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71  .    ){.      sq
4990: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
49a0: 64 62 2c 20 70 57 69 6e 2d 3e 70 53 74 61 72 74  db, pWin->pStart
49b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
49c0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
49d0: 57 69 6e 2d 3e 70 45 6e 64 29 3b 0a 20 20 20 20  Win->pEnd);.    
49e0: 20 20 70 57 69 6e 2d 3e 70 53 74 61 72 74 20 3d    pWin->pStart =
49f0: 20 70 57 69 6e 2d 3e 70 45 6e 64 20 3d 20 30 3b   pWin->pEnd = 0;
4a00: 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 65 54 79  .      pWin->eTy
4a10: 70 65 20 3d 20 54 4b 5f 52 41 4e 47 45 3b 0a 20  pe = TK_RANGE;. 
4a20: 20 20 20 20 20 70 57 69 6e 2d 3e 65 53 74 61 72       pWin->eStar
4a30: 74 20 3d 20 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  t = TK_UNBOUNDED
4a40: 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 65 45  ;.      pWin->eE
4a50: 6e 64 20 3d 20 54 4b 5f 43 55 52 52 45 4e 54 3b  nd = TK_CURRENT;
4a60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 57 69  .    }.  }.  pWi
4a70: 6e 2d 3e 70 46 75 6e 63 20 3d 20 70 46 75 6e 63  n->pFunc = pFunc
4a80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65  ;.}../*.** Conte
4a90: 78 74 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  xt object passed
4aa0: 20 74 68 72 6f 75 67 68 20 73 71 6c 69 74 65 33   through sqlite3
4ab0: 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 29 20 74  WalkExprList() t
4ac0: 6f 0a 2a 2a 20 73 65 6c 65 63 74 57 69 6e 64 6f  o.** selectWindo
4ad0: 77 52 65 77 72 69 74 65 45 78 70 72 43 62 28 29  wRewriteExprCb()
4ae0: 20 62 79 20 73 65 6c 65 63 74 57 69 6e 64 6f 77   by selectWindow
4af0: 52 65 77 72 69 74 65 45 4c 69 73 74 28 29 2e 0a  RewriteEList()..
4b00: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
4b10: 74 20 57 69 6e 64 6f 77 52 65 77 72 69 74 65 20  t WindowRewrite 
4b20: 57 69 6e 64 6f 77 52 65 77 72 69 74 65 3b 0a 73  WindowRewrite;.s
4b30: 74 72 75 63 74 20 57 69 6e 64 6f 77 52 65 77 72  truct WindowRewr
4b40: 69 74 65 20 7b 0a 20 20 57 69 6e 64 6f 77 20 2a  ite {.  Window *
4b50: 70 57 69 6e 3b 0a 20 20 53 72 63 4c 69 73 74 20  pWin;.  SrcList 
4b60: 2a 70 53 72 63 3b 0a 20 20 45 78 70 72 4c 69 73  *pSrc;.  ExprLis
4b70: 74 20 2a 70 53 75 62 3b 0a 20 20 53 65 6c 65 63  t *pSub;.  Selec
4b80: 74 20 2a 70 53 75 62 53 65 6c 65 63 74 3b 20 20  t *pSubSelect;  
4b90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
4ba0: 72 72 65 6e 74 20 73 75 62 2d 73 65 6c 65 63 74  rrent sub-select
4bb0: 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 7d 3b 0a 0a  , if any */.};..
4bc0: 2f 2a 0a 2a 2a 20 43 61 6c 6c 62 61 63 6b 20 66  /*.** Callback f
4bd0: 75 6e 63 74 69 6f 6e 20 75 73 65 64 20 62 79 20  unction used by 
4be0: 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72  selectWindowRewr
4bf0: 69 74 65 45 4c 69 73 74 28 29 2e 20 49 66 20 6e  iteEList(). If n
4c00: 65 63 65 73 73 61 72 79 2c 0a 2a 2a 20 74 68 69  ecessary,.** thi
4c10: 73 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e  s function appen
4c20: 64 73 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  ds to the output
4c30: 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74   expression-list
4c40: 20 61 6e 64 20 75 70 64 61 74 65 73 20 0a 2a 2a   and updates .**
4c50: 20 65 78 70 72 65 73 73 69 6f 6e 20 28 2a 70 70   expression (*pp
4c60: 45 78 70 72 29 20 69 6e 20 70 6c 61 63 65 2e 0a  Expr) in place..
4c70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
4c80: 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74  lectWindowRewrit
4c90: 65 45 78 70 72 43 62 28 57 61 6c 6b 65 72 20 2a  eExprCb(Walker *
4ca0: 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
4cb0: 45 78 70 72 29 7b 0a 20 20 73 74 72 75 63 74 20  Expr){.  struct 
4cc0: 57 69 6e 64 6f 77 52 65 77 72 69 74 65 20 2a 70  WindowRewrite *p
4cd0: 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 52   = pWalker->u.pR
4ce0: 65 77 72 69 74 65 3b 0a 20 20 50 61 72 73 65 20  ewrite;.  Parse 
4cf0: 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65  *pParse = pWalke
4d00: 72 2d 3e 70 50 61 72 73 65 3b 0a 0a 20 20 2f 2a  r->pParse;..  /*
4d10: 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   If this functio
4d20: 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  n is being calle
4d30: 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20  d from within a 
4d40: 73 63 61 6c 61 72 20 73 75 62 2d 73 65 6c 65 63  scalar sub-selec
4d50: 74 0a 20 20 2a 2a 20 74 68 61 74 20 75 73 65 64  t.  ** that used
4d60: 20 62 79 20 74 68 65 20 53 45 4c 45 43 54 20 73   by the SELECT s
4d70: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 70  tatement being p
4d80: 72 6f 63 65 73 73 65 64 2c 20 6f 6e 6c 79 20 70  rocessed, only p
4d90: 72 6f 63 65 73 73 0a 20 20 2a 2a 20 54 4b 5f 43  rocess.  ** TK_C
4da0: 4f 4c 55 4d 4e 20 65 78 70 72 65 73 73 69 6f 6e  OLUMN expression
4db0: 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  s that refer to 
4dc0: 69 74 20 28 74 68 65 20 6f 75 74 65 72 20 53 45  it (the outer SE
4dd0: 4c 45 43 54 29 2e 20 44 6f 0a 20 20 2a 2a 20 6e  LECT). Do.  ** n
4de0: 6f 74 20 70 72 6f 63 65 73 73 20 61 67 67 72 65  ot process aggre
4df0: 67 61 74 65 73 20 6f 72 20 77 69 6e 64 6f 77 20  gates or window 
4e00: 66 75 6e 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c  functions at all
4e10: 2c 20 61 73 20 74 68 65 79 20 62 65 6c 6f 6e 67  , as they belong
4e20: 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 73 63 61  .  ** to the sca
4e30: 6c 61 72 20 73 75 62 2d 73 65 6c 65 63 74 2e 20  lar sub-select. 
4e40: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 53 75   */.  if( p->pSu
4e50: 62 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 69  bSelect ){.    i
4e60: 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
4e70: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
4e80: 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
4e90: 69 6e 75 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  inue;.    }else{
4ea0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 72 63 20  .      int nSrc 
4eb0: 3d 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3b  = p->pSrc->nSrc;
4ec0: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
4ed0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
4ee0: 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
4ef0: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
4f00: 61 62 6c 65 3d 3d 70 2d 3e 70 53 72 63 2d 3e 61  able==p->pSrc->a
4f10: 5b 69 5d 2e 69 43 75 72 73 6f 72 20 29 20 62 72  [i].iCursor ) br
4f20: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
4f30: 20 20 20 69 66 28 20 69 3d 3d 6e 53 72 63 20 29     if( i==nSrc )
4f40: 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
4f50: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  inue;.    }.  }.
4f60: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
4f70: 2d 3e 6f 70 20 29 7b 0a 0a 20 20 20 20 63 61 73  ->op ){..    cas
4f80: 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20  e TK_FUNCTION:. 
4f90: 20 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61       if( !ExprHa
4fa0: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
4fb0: 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a   EP_WinFunc) ){.
4fc0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4fd0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4fe0: 20 20 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e      Window *pWin
4ff0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 57  ;.        for(pW
5000: 69 6e 3d 70 2d 3e 70 57 69 6e 3b 20 70 57 69 6e  in=p->pWin; pWin
5010: 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65  ; pWin=pWin->pNe
5020: 78 74 57 69 6e 29 7b 0a 20 20 20 20 20 20 20 20  xtWin){.        
5030: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 79 2e 70    if( pExpr->y.p
5040: 57 69 6e 3d 3d 70 57 69 6e 20 29 7b 0a 20 20 20  Win==pWin ){.   
5050: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
5060: 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 3d 3d 70   pWin->pOwner==p
5070: 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 20 20  Expr );.        
5080: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
5090: 72 75 6e 65 3b 0a 20 20 20 20 20 20 20 20 20 20  rune;.          
50a0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
50b0: 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c    }.      /* Fal
50c0: 6c 20 74 68 72 6f 75 67 68 2e 20 20 2a 2f 0a 0a  l through.  */..
50d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
50e0: 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61  FUNCTION:.    ca
50f0: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
5100: 20 20 20 20 20 20 45 78 70 72 20 2a 70 44 75 70        Expr *pDup
5110: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
5120: 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45  p(pParse->db, pE
5130: 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  xpr, 0);.      p
5140: 2d 3e 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33  ->pSub = sqlite3
5150: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
5160: 50 61 72 73 65 2c 20 70 2d 3e 70 53 75 62 2c 20  Parse, p->pSub, 
5170: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 69 66 28  pDup);.      if(
5180: 20 70 2d 3e 70 53 75 62 20 29 7b 0a 20 20 20 20   p->pSub ){.    
5190: 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72      assert( Expr
51a0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
51b0: 72 2c 20 45 50 5f 53 74 61 74 69 63 29 3d 3d 30  r, EP_Static)==0
51c0: 20 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72   );.        Expr
51d0: 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70  SetProperty(pExp
51e0: 72 2c 20 45 50 5f 53 74 61 74 69 63 29 3b 0a 20  r, EP_Static);. 
51f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
5200: 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  prDelete(pParse-
5210: 3e 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  >db, pExpr);.   
5220: 20 20 20 20 20 45 78 70 72 43 6c 65 61 72 50 72       ExprClearPr
5230: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
5240: 5f 53 74 61 74 69 63 29 3b 0a 20 20 20 20 20 20  _Static);.      
5250: 20 20 6d 65 6d 73 65 74 28 70 45 78 70 72 2c 20    memset(pExpr, 
5260: 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29  0, sizeof(Expr))
5270: 3b 0a 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  ;..        pExpr
5280: 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e  ->op = TK_COLUMN
5290: 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
52a0: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 2d 3e 70 53  >iColumn = p->pS
52b0: 75 62 2d 3e 6e 45 78 70 72 2d 31 3b 0a 20 20 20  ub->nExpr-1;.   
52c0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
52d0: 6c 65 20 3d 20 70 2d 3e 70 57 69 6e 2d 3e 69 45  le = p->pWin->iE
52e0: 70 68 43 73 72 3b 0a 20 20 20 20 20 20 7d 0a 0a  phCsr;.      }..
52f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5300: 20 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   }..    default:
5310: 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20   /* no-op */.   
5320: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
5330: 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
5340: 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69  inue;.}.static i
5350: 6e 74 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52  nt selectWindowR
5360: 65 77 72 69 74 65 53 65 6c 65 63 74 43 62 28 57  ewriteSelectCb(W
5370: 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
5380: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
5390: 7b 0a 20 20 73 74 72 75 63 74 20 57 69 6e 64 6f  {.  struct Windo
53a0: 77 52 65 77 72 69 74 65 20 2a 70 20 3d 20 70 57  wRewrite *p = pW
53b0: 61 6c 6b 65 72 2d 3e 75 2e 70 52 65 77 72 69 74  alker->u.pRewrit
53c0: 65 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 61  e;.  Select *pSa
53d0: 76 65 20 3d 20 70 2d 3e 70 53 75 62 53 65 6c 65  ve = p->pSubSele
53e0: 63 74 3b 0a 20 20 69 66 28 20 70 53 61 76 65 3d  ct;.  if( pSave=
53f0: 3d 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  =pSelect ){.    
5400: 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
5410: 6e 75 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  nue;.  }else{.  
5420: 20 20 70 2d 3e 70 53 75 62 53 65 6c 65 63 74 20    p->pSubSelect 
5430: 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 73  = pSelect;.    s
5440: 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
5450: 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 65 63  (pWalker, pSelec
5460: 74 29 3b 0a 20 20 20 20 70 2d 3e 70 53 75 62 53  t);.    p->pSubS
5470: 65 6c 65 63 74 20 3d 20 70 53 61 76 65 3b 0a 20  elect = pSave;. 
5480: 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
5490: 50 72 75 6e 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  Prune;.}.../*.**
54a0: 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   Iterate through
54b0: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
54c0: 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c   in expression-l
54d0: 69 73 74 20 70 45 4c 69 73 74 2e 20 46 6f 72 20  ist pEList. For 
54e0: 65 61 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  each:.**.**   * 
54f0: 54 4b 5f 43 4f 4c 55 4d 4e 2c 0a 2a 2a 20 20 20  TK_COLUMN,.**   
5500: 2a 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  * aggregate func
5510: 74 69 6f 6e 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20  tion, or.**   * 
5520: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
5530: 77 69 74 68 20 61 20 57 69 6e 64 6f 77 20 6f 62  with a Window ob
5540: 6a 65 63 74 20 74 68 61 74 20 69 73 20 6e 6f 74  ject that is not
5550: 20 61 20 6d 65 6d 62 65 72 20 6f 66 20 74 68 65   a member of the
5560: 20 0a 2a 2a 20 20 20 20 20 57 69 6e 64 6f 77 20   .**     Window 
5570: 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74  list passed as t
5580: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
5590: 6e 74 20 28 70 57 69 6e 29 2e 0a 2a 2a 0a 2a 2a  nt (pWin)..**.**
55a0: 20 41 70 70 65 6e 64 20 74 68 65 20 6e 6f 64 65   Append the node
55b0: 20 74 6f 20 6f 75 74 70 75 74 20 65 78 70 72 65   to output expre
55c0: 73 73 69 6f 6e 2d 6c 69 73 74 20 28 2a 70 70 53  ssion-list (*ppS
55d0: 75 62 29 2e 20 41 6e 64 20 72 65 70 6c 61 63 65  ub). And replace
55e0: 20 69 74 0a 2a 2a 20 77 69 74 68 20 61 20 54 4b   it.** with a TK
55f0: 5f 43 4f 4c 55 4d 4e 20 74 68 61 74 20 72 65 61  _COLUMN that rea
5600: 64 73 20 74 68 65 20 28 4e 2d 31 29 74 68 20 65  ds the (N-1)th e
5610: 6c 65 6d 65 6e 74 20 6f 66 20 74 61 62 6c 65 20  lement of table 
5620: 0a 2a 2a 20 70 57 69 6e 2d 3e 69 45 70 68 43 73  .** pWin->iEphCs
5630: 72 2c 20 77 68 65 72 65 20 4e 20 69 73 20 74 68  r, where N is th
5640: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
5650: 65 6e 74 73 20 69 6e 20 28 2a 70 70 53 75 62 29  ents in (*ppSub)
5660: 20 61 66 74 65 72 0a 2a 2a 20 61 70 70 65 6e 64   after.** append
5670: 69 6e 67 20 74 68 65 20 6e 65 77 20 6f 6e 65 2e  ing the new one.
5680: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5690: 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72  selectWindowRewr
56a0: 69 74 65 45 4c 69 73 74 28 0a 20 20 50 61 72 73  iteEList(.  Pars
56b0: 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 57 69  e *pParse, .  Wi
56c0: 6e 64 6f 77 20 2a 70 57 69 6e 2c 0a 20 20 53 72  ndow *pWin,.  Sr
56d0: 63 4c 69 73 74 20 2a 70 53 72 63 2c 0a 20 20 45  cList *pSrc,.  E
56e0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
56f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5700: 2a 20 52 65 77 72 69 74 65 20 65 78 70 72 65 73  * Rewrite expres
5710: 73 69 6f 6e 73 20 69 6e 20 74 68 69 73 20 6c 69  sions in this li
5720: 73 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  st */.  ExprList
5730: 20 2a 2a 70 70 53 75 62 20 20 20 20 20 20 20 20   **ppSub        
5740: 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
5750: 54 3a 20 53 75 62 2d 73 65 6c 65 63 74 20 65 78  T: Sub-select ex
5760: 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 2a 2f  pression-list */
5770: 0a 29 7b 0a 20 20 57 61 6c 6b 65 72 20 73 57 61  .){.  Walker sWa
5780: 6c 6b 65 72 3b 0a 20 20 57 69 6e 64 6f 77 52 65  lker;.  WindowRe
5790: 77 72 69 74 65 20 73 52 65 77 72 69 74 65 3b 0a  write sRewrite;.
57a0: 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 61 6c 6b  .  memset(&sWalk
57b0: 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57 61  er, 0, sizeof(Wa
57c0: 6c 6b 65 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74  lker));.  memset
57d0: 28 26 73 52 65 77 72 69 74 65 2c 20 30 2c 20 73  (&sRewrite, 0, s
57e0: 69 7a 65 6f 66 28 57 69 6e 64 6f 77 52 65 77 72  izeof(WindowRewr
57f0: 69 74 65 29 29 3b 0a 0a 20 20 73 52 65 77 72 69  ite));..  sRewri
5800: 74 65 2e 70 53 75 62 20 3d 20 2a 70 70 53 75 62  te.pSub = *ppSub
5810: 3b 0a 20 20 73 52 65 77 72 69 74 65 2e 70 57 69  ;.  sRewrite.pWi
5820: 6e 20 3d 20 70 57 69 6e 3b 0a 20 20 73 52 65 77  n = pWin;.  sRew
5830: 72 69 74 65 2e 70 53 72 63 20 3d 20 70 53 72 63  rite.pSrc = pSrc
5840: 3b 0a 0a 20 20 73 57 61 6c 6b 65 72 2e 70 50 61  ;..  sWalker.pPa
5850: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
5860: 73 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c  sWalker.xExprCal
5870: 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 57 69  lback = selectWi
5880: 6e 64 6f 77 52 65 77 72 69 74 65 45 78 70 72 43  ndowRewriteExprC
5890: 62 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 78 53 65  b;.  sWalker.xSe
58a0: 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73  lectCallback = s
58b0: 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69  electWindowRewri
58c0: 74 65 53 65 6c 65 63 74 43 62 3b 0a 20 20 73 57  teSelectCb;.  sW
58d0: 61 6c 6b 65 72 2e 75 2e 70 52 65 77 72 69 74 65  alker.u.pRewrite
58e0: 20 3d 20 26 73 52 65 77 72 69 74 65 3b 0a 0a 20   = &sRewrite;.. 
58f0: 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 57 61   (void)sqlite3Wa
5900: 6c 6b 45 78 70 72 4c 69 73 74 28 26 73 57 61 6c  lkExprList(&sWal
5910: 6b 65 72 2c 20 70 45 4c 69 73 74 29 3b 0a 0a 20  ker, pEList);.. 
5920: 20 2a 70 70 53 75 62 20 3d 20 73 52 65 77 72 69   *ppSub = sRewri
5930: 74 65 2e 70 53 75 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  te.pSub;.}../*.*
5940: 2a 20 41 70 70 65 6e 64 20 61 20 63 6f 70 79 20  * Append a copy 
5950: 6f 66 20 65 61 63 68 20 65 78 70 72 65 73 73 69  of each expressi
5960: 6f 6e 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  on in expression
5970: 2d 6c 69 73 74 20 70 41 70 70 65 6e 64 20 74 6f  -list pAppend to
5980: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
5990: 69 73 74 20 70 4c 69 73 74 2e 20 52 65 74 75 72  ist pList. Retur
59a0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
59b0: 68 65 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a  he result list..
59c0: 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 4c 69  */.static ExprLi
59d0: 73 74 20 2a 65 78 70 72 4c 69 73 74 41 70 70 65  st *exprListAppe
59e0: 6e 64 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  ndList(.  Parse 
59f0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
5a00: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
5a10: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
5a20: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
5a30: 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69    /* List to whi
5a40: 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69  ch to append. Mi
5a50: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
5a60: 20 45 78 70 72 4c 69 73 74 20 2a 70 41 70 70 65   ExprList *pAppe
5a70: 6e 64 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  nd       /* List
5a80: 20 6f 66 20 76 61 6c 75 65 73 20 74 6f 20 61 70   of values to ap
5a90: 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e  pend. Might be N
5aa0: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ULL */.){.  if( 
5ab0: 70 41 70 70 65 6e 64 20 29 7b 0a 20 20 20 20 69  pAppend ){.    i
5ac0: 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 49  nt i;.    int nI
5ad0: 6e 69 74 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c  nit = pList ? pL
5ae0: 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a  ist->nExpr : 0;.
5af0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
5b00: 41 70 70 65 6e 64 2d 3e 6e 45 78 70 72 3b 20 69  Append->nExpr; i
5b10: 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
5b20: 2a 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45  *pDup = sqlite3E
5b30: 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64  xprDup(pParse->d
5b40: 62 2c 20 70 41 70 70 65 6e 64 2d 3e 61 5b 69 5d  b, pAppend->a[i]
5b50: 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20  .pExpr, 0);.    
5b60: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
5b70: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
5b80: 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70  pParse, pList, p
5b90: 44 75 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Dup);.      if( 
5ba0: 70 4c 69 73 74 20 29 20 70 4c 69 73 74 2d 3e 61  pList ) pList->a
5bb0: 5b 6e 49 6e 69 74 2b 69 5d 2e 73 6f 72 74 4f 72  [nInit+i].sortOr
5bc0: 64 65 72 20 3d 20 70 41 70 70 65 6e 64 2d 3e 61  der = pAppend->a
5bd0: 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  [i].sortOrder;. 
5be0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
5bf0: 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
5c00: 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43 54 20  * If the SELECT 
5c10: 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
5c20: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
5c30: 72 67 75 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74  rgument does not
5c40: 20 69 6e 76 6f 6b 65 0a 2a 2a 20 61 6e 79 20 53   invoke.** any S
5c50: 51 4c 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  QL window functi
5c60: 6f 6e 73 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ons, this functi
5c70: 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f  on is a no-op. O
5c80: 74 68 65 72 77 69 73 65 2c 20 69 74 20 0a 2a 2a  therwise, it .**
5c90: 20 72 65 77 72 69 74 65 73 20 74 68 65 20 53 45   rewrites the SE
5ca0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 73  LECT statement s
5cb0: 6f 20 74 68 61 74 20 77 69 6e 64 6f 77 20 66 75  o that window fu
5cc0: 6e 63 74 69 6f 6e 20 78 53 74 65 70 20 66 75 6e  nction xStep fun
5cd0: 63 74 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 69 6e  ctions.** are in
5ce0: 76 6f 6b 65 64 20 69 6e 20 74 68 65 20 63 6f 72  voked in the cor
5cf0: 72 65 63 74 20 6f 72 64 65 72 20 61 73 20 64 65  rect order as de
5d00: 73 63 72 69 62 65 64 20 75 6e 64 65 72 20 22 53  scribed under "S
5d10: 45 4c 45 43 54 20 52 45 57 52 49 54 49 4e 47 22  ELECT REWRITING"
5d20: 0a 2a 2a 20 61 74 20 74 68 65 20 74 6f 70 20 6f  .** at the top o
5d30: 66 20 74 68 69 73 20 66 69 6c 65 2e 0a 2a 2f 0a  f this file..*/.
5d40: 69 6e 74 20 73 71 6c 69 74 65 33 57 69 6e 64 6f  int sqlite3Windo
5d50: 77 52 65 77 72 69 74 65 28 50 61 72 73 65 20 2a  wRewrite(Parse *
5d60: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
5d70: 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  p){.  int rc = S
5d80: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
5d90: 70 2d 3e 70 57 69 6e 20 26 26 20 70 2d 3e 70 50  p->pWin && p->pP
5da0: 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 56  rior==0 ){.    V
5db0: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
5dc0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
5dd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
5de0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
5df0: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20     Select *pSub 
5e00: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
5e10: 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79   /* The subquery
5e20: 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74 20   */.    SrcList 
5e30: 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b  *pSrc = p->pSrc;
5e40: 0a 20 20 20 20 45 78 70 72 20 2a 70 57 68 65 72  .    Expr *pWher
5e50: 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20  e = p->pWhere;. 
5e60: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72     ExprList *pGr
5e70: 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
5e80: 70 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  pBy;.    Expr *p
5e90: 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76  Having = p->pHav
5ea0: 69 6e 67 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  ing;.    ExprLis
5eb0: 74 20 2a 70 53 6f 72 74 20 3d 20 30 3b 0a 0a 20  t *pSort = 0;.. 
5ec0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 53 75     ExprList *pSu
5ed0: 62 6c 69 73 74 20 3d 20 30 3b 20 20 20 20 20 20  blist = 0;      
5ee0: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6c   /* Expression l
5ef0: 69 73 74 20 66 6f 72 20 73 75 62 2d 71 75 65 72  ist for sub-quer
5f00: 79 20 2a 2f 0a 20 20 20 20 57 69 6e 64 6f 77 20  y */.    Window 
5f10: 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e  *pMWin = p->pWin
5f20: 3b 20 20 20 20 20 20 2f 2a 20 4d 61 73 74 65 72  ;      /* Master
5f30: 20 77 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 2a   window object *
5f40: 2f 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a 70 57  /.    Window *pW
5f50: 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  in;             
5f60: 20 20 20 20 2f 2a 20 57 69 6e 64 6f 77 20 6f 62      /* Window ob
5f70: 6a 65 63 74 20 69 74 65 72 61 74 6f 72 20 2a 2f  ject iterator */
5f80: 0a 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20  ..    p->pSrc = 
5f90: 30 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65  0;.    p->pWhere
5fa0: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 47 72   = 0;.    p->pGr
5fb0: 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20 20 20 70  oupBy = 0;.    p
5fc0: 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a 0a  ->pHaving = 0;..
5fd0: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68      /* Create th
5fe0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
5ff0: 65 20 66 6f 72 20 74 68 65 20 73 75 62 2d 73 65  e for the sub-se
6000: 6c 65 63 74 2e 20 54 68 69 73 20 69 73 20 74 68  lect. This is th
6010: 65 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 0a  e concatenation.
6020: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 77 69      ** of the wi
6030: 6e 64 6f 77 20 50 41 52 54 49 54 49 4f 4e 20 61  ndow PARTITION a
6040: 6e 64 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  nd ORDER BY clau
6050: 73 65 73 2e 20 54 68 65 6e 2c 20 69 66 20 74 68  ses. Then, if th
6060: 69 73 20 6d 61 6b 65 73 20 69 74 0a 20 20 20 20  is makes it.    
6070: 2a 2a 20 72 65 64 75 6e 64 61 6e 74 2c 20 72 65  ** redundant, re
6080: 6d 6f 76 65 20 74 68 65 20 4f 52 44 45 52 20 42  move the ORDER B
6090: 59 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e  Y from the paren
60a0: 74 20 53 45 4c 45 43 54 2e 20 20 2a 2f 0a 20 20  t SELECT.  */.  
60b0: 20 20 70 53 6f 72 74 20 3d 20 73 71 6c 69 74 65    pSort = sqlite
60c0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
60d0: 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69   pMWin->pPartiti
60e0: 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 70 53 6f 72  on, 0);.    pSor
60f0: 74 20 3d 20 65 78 70 72 4c 69 73 74 41 70 70 65  t = exprListAppe
6100: 6e 64 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  ndList(pParse, p
6110: 53 6f 72 74 2c 20 70 4d 57 69 6e 2d 3e 70 4f 72  Sort, pMWin->pOr
6120: 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20  derBy);.    if( 
6130: 70 53 6f 72 74 20 26 26 20 70 2d 3e 70 4f 72 64  pSort && p->pOrd
6140: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69 66  erBy ){.      if
6150: 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  ( sqlite3ExprLis
6160: 74 43 6f 6d 70 61 72 65 28 70 53 6f 72 74 2c 20  tCompare(pSort, 
6170: 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31 29  p->pOrderBy, -1)
6180: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
6190: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
61a0: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64  lete(db, p->pOrd
61b0: 65 72 42 79 29 3b 0a 20 20 20 20 20 20 20 20 70  erBy);.        p
61c0: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
61d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
61e0: 20 20 20 2f 2a 20 41 73 73 69 67 6e 20 61 20 63     /* Assign a c
61f0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
6200: 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74   the ephemeral t
6210: 61 62 6c 65 20 75 73 65 64 20 74 6f 20 62 75 66  able used to buf
6220: 66 65 72 20 72 6f 77 73 2e 0a 20 20 20 20 2a 2a  fer rows..    **
6230: 20 54 68 65 20 4f 70 65 6e 45 70 68 65 6d 65 72   The OpenEphemer
6240: 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  al instruction i
6250: 73 20 63 6f 64 65 64 20 6c 61 74 65 72 2c 20 61  s coded later, a
6260: 66 74 65 72 20 69 74 20 69 73 20 6b 6e 6f 77 6e  fter it is known
6270: 20 68 6f 77 0a 20 20 20 20 2a 2a 20 6d 61 6e 79   how.    ** many
6280: 20 63 6f 6c 75 6d 6e 73 20 74 68 65 20 74 61 62   columns the tab
6290: 6c 65 20 77 69 6c 6c 20 68 61 76 65 2e 20 20 2a  le will have.  *
62a0: 2f 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 69 45 70  /.    pMWin->iEp
62b0: 68 43 73 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  hCsr = pParse->n
62c0: 54 61 62 2b 2b 3b 0a 20 20 20 20 70 50 61 72 73  Tab++;.    pPars
62d0: 65 2d 3e 6e 54 61 62 20 2b 3d 20 33 3b 0a 0a 20  e->nTab += 3;.. 
62e0: 20 20 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52     selectWindowR
62f0: 65 77 72 69 74 65 45 4c 69 73 74 28 70 50 61 72  ewriteEList(pPar
6300: 73 65 2c 20 70 4d 57 69 6e 2c 20 70 53 72 63 2c  se, pMWin, pSrc,
6310: 20 70 2d 3e 70 45 4c 69 73 74 2c 20 26 70 53 75   p->pEList, &pSu
6320: 62 6c 69 73 74 29 3b 0a 20 20 20 20 73 65 6c 65  blist);.    sele
6330: 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65 45  ctWindowRewriteE
6340: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4d 57  List(pParse, pMW
6350: 69 6e 2c 20 70 53 72 63 2c 20 70 2d 3e 70 4f 72  in, pSrc, p->pOr
6360: 64 65 72 42 79 2c 20 26 70 53 75 62 6c 69 73 74  derBy, &pSublist
6370: 29 3b 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 6e 42  );.    pMWin->nB
6380: 75 66 66 65 72 43 6f 6c 20 3d 20 28 70 53 75 62  ufferCol = (pSub
6390: 6c 69 73 74 20 3f 20 70 53 75 62 6c 69 73 74 2d  list ? pSublist-
63a0: 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 0a 20 20  >nExpr : 0);..  
63b0: 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
63c0: 50 41 52 54 49 54 49 4f 4e 20 42 59 20 61 6e 64  PARTITION BY and
63d0: 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73   ORDER BY expres
63e0: 73 69 6f 6e 73 20 74 6f 20 74 68 65 20 74 6f 20  sions to the to 
63f0: 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 75 62 2d  the .    ** sub-
6400: 73 65 6c 65 63 74 20 65 78 70 72 65 73 73 69 6f  select expressio
6410: 6e 20 6c 69 73 74 2e 20 54 68 65 79 20 61 72 65  n list. They are
6420: 20 72 65 71 75 69 72 65 64 20 74 6f 20 66 69 67   required to fig
6430: 75 72 65 20 6f 75 74 20 77 68 65 72 65 20 0a 20  ure out where . 
6440: 20 20 20 2a 2a 20 62 6f 75 6e 64 61 72 69 65 73     ** boundaries
6450: 20 66 6f 72 20 70 61 72 74 69 74 69 6f 6e 73 20   for partitions 
6460: 61 6e 64 20 73 65 74 73 20 6f 66 20 70 65 65 72  and sets of peer
6470: 20 72 6f 77 73 20 6c 69 65 2e 20 20 2a 2f 0a 20   rows lie.  */. 
6480: 20 20 20 70 53 75 62 6c 69 73 74 20 3d 20 65 78     pSublist = ex
6490: 70 72 4c 69 73 74 41 70 70 65 6e 64 4c 69 73 74  prListAppendList
64a0: 28 70 50 61 72 73 65 2c 20 70 53 75 62 6c 69 73  (pParse, pSublis
64b0: 74 2c 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69  t, pMWin->pParti
64c0: 74 69 6f 6e 29 3b 0a 20 20 20 20 70 53 75 62 6c  tion);.    pSubl
64d0: 69 73 74 20 3d 20 65 78 70 72 4c 69 73 74 41 70  ist = exprListAp
64e0: 70 65 6e 64 4c 69 73 74 28 70 50 61 72 73 65 2c  pendList(pParse,
64f0: 20 70 53 75 62 6c 69 73 74 2c 20 70 4d 57 69 6e   pSublist, pMWin
6500: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 0a 20 20  ->pOrderBy);..  
6510: 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
6520: 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64  arguments passed
6530: 20 74 6f 20 65 61 63 68 20 77 69 6e 64 6f 77 20   to each window 
6540: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 74 68 65 0a  function to the.
6550: 20 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63      ** sub-selec
6560: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  t expression lis
6570: 74 2e 20 41 6c 73 6f 20 61 6c 6c 6f 63 61 74 65  t. Also allocate
6580: 20 74 77 6f 20 72 65 67 69 73 74 65 72 73 20 66   two registers f
6590: 6f 72 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 77  or each.    ** w
65a0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 2d  indow function -
65b0: 20 6f 6e 65 20 66 6f 72 20 74 68 65 20 61 63 63   one for the acc
65c0: 75 6d 75 6c 61 74 6f 72 2c 20 61 6e 6f 74 68 65  umulator, anothe
65d0: 72 20 66 6f 72 20 69 6e 74 65 72 69 6d 0a 20 20  r for interim.  
65e0: 20 20 2a 2a 20 72 65 73 75 6c 74 73 2e 20 20 2a    ** results.  *
65f0: 2f 0a 20 20 20 20 66 6f 72 28 70 57 69 6e 3d 70  /.    for(pWin=p
6600: 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e  MWin; pWin; pWin
6610: 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29  =pWin->pNextWin)
6620: 7b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 69 41  {.      pWin->iA
6630: 72 67 43 6f 6c 20 3d 20 28 70 53 75 62 6c 69 73  rgCol = (pSublis
6640: 74 20 3f 20 70 53 75 62 6c 69 73 74 2d 3e 6e 45  t ? pSublist->nE
6650: 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  xpr : 0);.      
6660: 70 53 75 62 6c 69 73 74 20 3d 20 65 78 70 72 4c  pSublist = exprL
6670: 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28 70 50  istAppendList(pP
6680: 61 72 73 65 2c 20 70 53 75 62 6c 69 73 74 2c 20  arse, pSublist, 
6690: 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e  pWin->pOwner->x.
66a0: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 69 66  pList);.      if
66b0: 28 20 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72 20  ( pWin->pFilter 
66c0: 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
66d0: 2a 70 46 69 6c 74 65 72 20 3d 20 73 71 6c 69 74  *pFilter = sqlit
66e0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 57  e3ExprDup(db, pW
66f0: 69 6e 2d 3e 70 46 69 6c 74 65 72 2c 20 30 29 3b  in->pFilter, 0);
6700: 0a 20 20 20 20 20 20 20 20 70 53 75 62 6c 69 73  .        pSublis
6710: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
6720: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
6730: 2c 20 70 53 75 62 6c 69 73 74 2c 20 70 46 69 6c  , pSublist, pFil
6740: 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
6750: 20 20 20 20 70 57 69 6e 2d 3e 72 65 67 41 63 63      pWin->regAcc
6760: 75 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  um = ++pParse->n
6770: 4d 65 6d 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d  Mem;.      pWin-
6780: 3e 72 65 67 52 65 73 75 6c 74 20 3d 20 2b 2b 70  >regResult = ++p
6790: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
67a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
67b0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
67c0: 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63   0, pWin->regAcc
67d0: 75 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  um);.    }..    
67e0: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  /* If there is n
67f0: 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20 50 41  o ORDER BY or PA
6800: 52 54 49 54 49 4f 4e 20 42 59 20 63 6c 61 75 73  RTITION BY claus
6810: 65 2c 20 61 6e 64 20 74 68 65 20 77 69 6e 64 6f  e, and the windo
6820: 77 0a 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f  w.    ** functio
6830: 6e 20 61 63 63 65 70 74 73 20 7a 65 72 6f 20 61  n accepts zero a
6840: 72 67 75 6d 65 6e 74 73 2c 20 61 6e 64 20 74 68  rguments, and th
6850: 65 72 65 20 61 72 65 20 6e 6f 20 6f 74 68 65 72  ere are no other
6860: 20 63 6f 6c 75 6d 6e 73 0a 20 20 20 20 2a 2a 20   columns.    ** 
6870: 73 65 6c 65 63 74 65 64 20 28 65 2e 67 2e 20 22  selected (e.g. "
6880: 53 45 4c 45 43 54 20 72 6f 77 5f 6e 75 6d 62 65  SELECT row_numbe
6890: 72 28 29 20 4f 56 45 52 20 28 29 20 46 52 4f 4d  r() OVER () FROM
68a0: 20 74 31 22 29 2c 20 69 74 20 69 73 20 70 6f 73   t1"), it is pos
68b0: 73 69 62 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61  sible.    ** tha
68c0: 74 20 70 53 75 62 6c 69 73 74 20 69 73 20 73 74  t pSublist is st
68d0: 69 6c 6c 20 4e 55 4c 4c 20 68 65 72 65 2e 20 41  ill NULL here. A
68e0: 64 64 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78  dd a constant ex
68f0: 70 72 65 73 73 69 6f 6e 20 68 65 72 65 20 74 6f  pression here to
6900: 20 0a 20 20 20 20 2a 2a 20 6b 65 65 70 20 65 76   .    ** keep ev
6910: 65 72 79 74 68 69 6e 67 20 6c 65 67 61 6c 20 69  erything legal i
6920: 6e 20 74 68 69 73 20 63 61 73 65 2e 20 0a 20 20  n this case. .  
6930: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75    */.    if( pSu
6940: 62 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  blist==0 ){.    
6950: 20 20 70 53 75 62 6c 69 73 74 20 3d 20 73 71 6c    pSublist = sql
6960: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
6970: 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 0a 20  nd(pParse, 0, . 
6980: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
6990: 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
69a0: 5f 49 4e 54 45 47 45 52 2c 20 26 73 71 6c 69 74  _INTEGER, &sqlit
69b0: 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 30 5d 2c 20  e3IntTokens[0], 
69c0: 30 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  0).      );.    
69d0: 7d 0a 0a 20 20 20 20 70 53 75 62 20 3d 20 73 71  }..    pSub = sq
69e0: 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a  lite3SelectNew(.
69f0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
6a00: 70 53 75 62 6c 69 73 74 2c 20 70 53 72 63 2c 20  pSublist, pSrc, 
6a10: 70 57 68 65 72 65 2c 20 70 47 72 6f 75 70 42 79  pWhere, pGroupBy
6a20: 2c 20 70 48 61 76 69 6e 67 2c 20 70 53 6f 72 74  , pHaving, pSort
6a30: 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20  , 0, 0.    );.  
6a40: 20 20 70 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69    p->pSrc = sqli
6a50: 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
6a60: 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30  (pParse, 0, 0, 0
6a70: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53  );.    if( p->pS
6a80: 72 63 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70  rc ){.      p->p
6a90: 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
6aa0: 74 20 3d 20 70 53 75 62 3b 0a 20 20 20 20 20 20  t = pSub;.      
6ab0: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
6ac0: 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
6ad0: 73 65 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20  se, p->pSrc);.  
6ae0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
6af0: 78 70 61 6e 64 53 75 62 71 75 65 72 79 28 70 50  xpandSubquery(pP
6b00: 61 72 73 65 2c 20 26 70 2d 3e 70 53 72 63 2d 3e  arse, &p->pSrc->
6b10: 61 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  a[0]) ){.       
6b20: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
6b30: 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EM;.      }else{
6b40: 0a 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 73  .        pSub->s
6b50: 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78  elFlags |= SF_Ex
6b60: 70 61 6e 64 65 64 3b 0a 20 20 20 20 20 20 20 20  panded;.        
6b70: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e  p->selFlags &= ~
6b80: 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20  SF_Aggregate;.  
6b90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
6ba0: 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c 20  ectPrep(pParse, 
6bb0: 70 53 75 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  pSub, 0);.      
6bc0: 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  }..      sqlite3
6bd0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6be0: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
6bf0: 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20  pMWin->iEphCsr, 
6c00: 70 53 75 62 6c 69 73 74 2d 3e 6e 45 78 70 72 29  pSublist->nExpr)
6c10: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
6c20: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
6c30: 4f 70 65 6e 44 75 70 2c 20 70 4d 57 69 6e 2d 3e  OpenDup, pMWin->
6c40: 69 45 70 68 43 73 72 2b 31 2c 20 70 4d 57 69 6e  iEphCsr+1, pMWin
6c50: 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 20 20  ->iEphCsr);.    
6c60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6c70: 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75  Op2(v, OP_OpenDu
6c80: 70 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  p, pMWin->iEphCs
6c90: 72 2b 32 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  r+2, pMWin->iEph
6ca0: 43 73 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Csr);.      sqli
6cb0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6cc0: 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70 4d 57   OP_OpenDup, pMW
6cd0: 69 6e 2d 3e 69 45 70 68 43 73 72 2b 33 2c 20 70  in->iEphCsr+3, p
6ce0: 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a  MWin->iEphCsr);.
6cf0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6d00: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
6d10: 6c 65 74 65 28 64 62 2c 20 70 53 75 62 29 3b 0a  lete(db, pSub);.
6d20: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62      }.    if( db
6d30: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
6d40: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
6d50: 45 4d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  EM;.  }..  retur
6d60: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n rc;.}../*.** F
6d70: 72 65 65 20 74 68 65 20 57 69 6e 64 6f 77 20 6f  ree the Window o
6d80: 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
6d90: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
6da0: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
6db0: 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65 74 65  ite3WindowDelete
6dc0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69  (sqlite3 *db, Wi
6dd0: 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 69 66 28 20  ndow *p){.  if( 
6de0: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
6df0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
6e00: 2d 3e 70 46 69 6c 74 65 72 29 3b 0a 20 20 20 20  ->pFilter);.    
6e10: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
6e20: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 61  elete(db, p->pPa
6e30: 72 74 69 74 69 6f 6e 29 3b 0a 20 20 20 20 73 71  rtition);.    sq
6e40: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
6e50: 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  ete(db, p->pOrde
6e60: 72 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rBy);.    sqlite
6e70: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
6e80: 70 2d 3e 70 45 6e 64 29 3b 0a 20 20 20 20 73 71  p->pEnd);.    sq
6e90: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
6ea0: 64 62 2c 20 70 2d 3e 70 53 74 61 72 74 29 3b 0a  db, p->pStart);.
6eb0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
6ec0: 65 28 64 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b  e(db, p->zName);
6ed0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
6ee0: 65 65 28 64 62 2c 20 70 2d 3e 7a 42 61 73 65 29  ee(db, p->zBase)
6ef0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
6f00: 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a  ree(db, p);.  }.
6f10: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  }../*.** Free th
6f20: 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  e linked list of
6f30: 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 73 20   Window objects 
6f40: 73 74 61 72 74 69 6e 67 20 61 74 20 74 68 65 20  starting at the 
6f50: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
6f60: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
6f70: 57 69 6e 64 6f 77 4c 69 73 74 44 65 6c 65 74 65  WindowListDelete
6f80: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69  (sqlite3 *db, Wi
6f90: 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 77 68 69 6c  ndow *p){.  whil
6fa0: 65 28 20 70 20 29 7b 0a 20 20 20 20 57 69 6e 64  e( p ){.    Wind
6fb0: 6f 77 20 2a 70 4e 65 78 74 20 3d 20 70 2d 3e 70  ow *pNext = p->p
6fc0: 4e 65 78 74 57 69 6e 3b 0a 20 20 20 20 73 71 6c  NextWin;.    sql
6fd0: 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65 74 65  ite3WindowDelete
6fe0: 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 70 20 3d  (db, p);.    p =
6ff0: 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f   pNext;.  }.}../
7000: 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  *.** The argumen
7010: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  t expression is 
7020: 61 6e 20 50 52 45 43 45 44 49 4e 47 20 6f 72 20  an PRECEDING or 
7030: 46 4f 4c 4c 4f 57 49 4e 47 20 6f 66 66 73 65 74  FOLLOWING offset
7040: 2e 20 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20  .  The.** value 
7050: 73 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f 6e 2d  should be a non-
7060: 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72  negative integer
7070: 2e 20 20 49 66 20 74 68 65 20 76 61 6c 75 65 20  .  If the value 
7080: 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 63 6f 6e 73  is not a.** cons
7090: 74 61 6e 74 2c 20 63 68 61 6e 67 65 20 69 74 20  tant, change it 
70a0: 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 65 20 66 61  to NULL.  The fa
70b0: 63 74 20 74 68 61 74 20 69 74 20 69 73 20 74 68  ct that it is th
70c0: 65 6e 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  en a non-negativ
70d0: 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 77 69 6c  e.** integer wil
70e0: 6c 20 62 65 20 63 61 75 67 68 74 20 6c 61 74 65  l be caught late
70f0: 72 2e 20 20 42 75 74 20 69 74 20 69 73 20 69 6d  r.  But it is im
7100: 70 6f 72 74 61 6e 74 20 6e 6f 74 20 74 6f 20 6c  portant not to l
7110: 65 61 76 65 0a 2a 2a 20 76 61 72 69 61 62 6c 65  eave.** variable
7120: 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 65   values in the e
7130: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a  xpression tree..
7140: 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a  */.static Expr *
7150: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4f 66 66  sqlite3WindowOff
7160: 73 65 74 45 78 70 72 28 50 61 72 73 65 20 2a 70  setExpr(Parse *p
7170: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
7180: 70 72 29 7b 0a 20 20 69 66 28 20 30 3d 3d 73 71  pr){.  if( 0==sq
7190: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
71a0: 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a 20 20  ant(pExpr) ){.  
71b0: 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f    if( IN_RENAME_
71c0: 4f 42 4a 45 43 54 20 29 20 73 71 6c 69 74 65 33  OBJECT ) sqlite3
71d0: 52 65 6e 61 6d 65 45 78 70 72 55 6e 6d 61 70 28  RenameExprUnmap(
71e0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a  pParse, pExpr);.
71f0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
7200: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
7210: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 70 45  , pExpr);.    pE
7220: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
7230: 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64  rAlloc(pParse->d
7240: 62 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30  b, TK_NULL, 0, 0
7250: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
7260: 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pExpr;.}../*.** 
7270: 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74  Allocate and ret
7280: 75 72 6e 20 61 20 6e 65 77 20 57 69 6e 64 6f 77  urn a new Window
7290: 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69 62 69   object describi
72a0: 6e 67 20 61 20 57 69 6e 64 6f 77 20 44 65 66 69  ng a Window Defi
72b0: 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 57 69 6e 64 6f  nition..*/.Windo
72c0: 77 20 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  w *sqlite3Window
72d0: 41 6c 6c 6f 63 28 0a 20 20 50 61 72 73 65 20 2a  Alloc(.  Parse *
72e0: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
72f0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
7300: 0a 20 20 69 6e 74 20 65 54 79 70 65 2c 20 20 20  .  int eType,   
7310: 20 20 20 20 20 2f 2a 20 46 72 61 6d 65 20 74 79       /* Frame ty
7320: 70 65 2e 20 54 4b 5f 52 41 4e 47 45 20 6f 72 20  pe. TK_RANGE or 
7330: 54 4b 5f 52 4f 57 53 20 2a 2f 0a 20 20 69 6e 74  TK_ROWS */.  int
7340: 20 65 53 74 61 72 74 2c 20 20 20 20 20 20 20 2f   eStart,       /
7350: 2a 20 53 74 61 72 74 20 74 79 70 65 3a 20 43 55  * Start type: CU
7360: 52 52 45 4e 54 2c 20 50 52 45 43 45 44 49 4e 47  RRENT, PRECEDING
7370: 2c 20 46 4f 4c 4c 4f 57 49 4e 47 2c 20 55 4e 42  , FOLLOWING, UNB
7380: 4f 55 4e 44 45 44 20 2a 2f 0a 20 20 45 78 70 72  OUNDED */.  Expr
7390: 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20 2f 2a   *pStart,     /*
73a0: 20 53 74 61 72 74 20 77 69 6e 64 6f 77 20 73 69   Start window si
73b0: 7a 65 20 69 66 20 54 4b 5f 50 52 45 43 45 44 49  ze if TK_PRECEDI
73c0: 4e 47 20 6f 72 20 46 4f 4c 4c 4f 57 49 4e 47 20  NG or FOLLOWING 
73d0: 2a 2f 0a 20 20 69 6e 74 20 65 45 6e 64 2c 20 20  */.  int eEnd,  
73e0: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 74 79         /* End ty
73f0: 70 65 3a 20 43 55 52 52 45 4e 54 2c 20 46 4f 4c  pe: CURRENT, FOL
7400: 4c 4f 57 49 4e 47 2c 20 54 4b 5f 55 4e 42 4f 55  LOWING, TK_UNBOU
7410: 4e 44 45 44 2c 20 50 52 45 43 45 44 49 4e 47 20  NDED, PRECEDING 
7420: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 6e 64 20  */.  Expr *pEnd 
7430: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 77 69         /* End wi
7440: 6e 64 6f 77 20 73 69 7a 65 20 69 66 20 54 4b 5f  ndow size if TK_
7450: 46 4f 4c 4c 4f 57 49 4e 47 20 6f 72 20 50 52 45  FOLLOWING or PRE
7460: 43 45 44 49 4e 47 20 2a 2f 0a 29 7b 0a 20 20 57  CEDING */.){.  W
7470: 69 6e 64 6f 77 20 2a 70 57 69 6e 20 3d 20 30 3b  indow *pWin = 0;
7480: 0a 20 20 69 6e 74 20 62 49 6d 70 6c 69 63 69 74  .  int bImplicit
7490: 46 72 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a  Frame = 0;..  /*
74a0: 20 50 61 72 73 65 72 20 61 73 73 75 72 65 73 20   Parser assures 
74b0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20 2a  the following: *
74c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  /.  assert( eTyp
74d0: 65 3d 3d 30 20 7c 7c 20 65 54 79 70 65 3d 3d 54  e==0 || eType==T
74e0: 4b 5f 52 41 4e 47 45 20 7c 7c 20 65 54 79 70 65  K_RANGE || eType
74f0: 3d 3d 54 4b 5f 52 4f 57 53 20 7c 7c 20 65 54 79  ==TK_ROWS || eTy
7500: 70 65 3d 3d 54 4b 5f 47 52 4f 55 50 53 20 29 3b  pe==TK_GROUPS );
7510: 0a 20 20 61 73 73 65 72 74 28 20 65 53 74 61 72  .  assert( eStar
7520: 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 7c 7c  t==TK_CURRENT ||
7530: 20 65 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43   eStart==TK_PREC
7540: 45 44 49 4e 47 0a 20 20 20 20 20 20 20 20 20 20  EDING.          
7550: 20 7c 7c 20 65 53 74 61 72 74 3d 3d 54 4b 5f 55   || eStart==TK_U
7560: 4e 42 4f 55 4e 44 45 44 20 7c 7c 20 65 53 74 61  NBOUNDED || eSta
7570: 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  rt==TK_FOLLOWING
7580: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 45   );.  assert( eE
7590: 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 7c  nd==TK_CURRENT |
75a0: 7c 20 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f  | eEnd==TK_FOLLO
75b0: 57 49 4e 47 0a 20 20 20 20 20 20 20 20 20 20 20  WING.           
75c0: 7c 7c 20 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f  || eEnd==TK_UNBO
75d0: 55 4e 44 45 44 20 7c 7c 20 65 45 6e 64 3d 3d 54  UNDED || eEnd==T
75e0: 4b 5f 50 52 45 43 45 44 49 4e 47 20 29 3b 0a 20  K_PRECEDING );. 
75f0: 20 61 73 73 65 72 74 28 20 28 65 53 74 61 72 74   assert( (eStart
7600: 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 7c  ==TK_PRECEDING |
7610: 7c 20 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c  | eStart==TK_FOL
7620: 4c 4f 57 49 4e 47 29 3d 3d 28 70 53 74 61 72 74  LOWING)==(pStart
7630: 21 3d 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74  !=0) );.  assert
7640: 28 20 28 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c  ( (eEnd==TK_FOLL
7650: 4f 57 49 4e 47 20 7c 7c 20 65 45 6e 64 3d 3d 54  OWING || eEnd==T
7660: 4b 5f 50 52 45 43 45 44 49 4e 47 29 3d 3d 28 70  K_PRECEDING)==(p
7670: 45 6e 64 21 3d 30 29 20 29 3b 0a 0a 20 20 69 66  End!=0) );..  if
7680: 28 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20  ( eType==0 ){.  
7690: 20 20 62 49 6d 70 6c 69 63 69 74 46 72 61 6d 65    bImplicitFrame
76a0: 20 3d 20 31 3b 0a 20 20 20 20 65 54 79 70 65 20   = 1;.    eType 
76b0: 3d 20 54 4b 5f 52 41 4e 47 45 3b 0a 20 20 7d 0a  = TK_RANGE;.  }.
76c0: 0a 20 20 2f 2a 20 49 66 20 61 20 66 72 61 6d 65  .  /* If a frame
76d0: 20 69 73 20 64 65 63 6c 61 72 65 64 20 22 52 41   is declared "RA
76e0: 4e 47 45 22 20 28 6e 6f 74 20 22 52 4f 57 53 22  NGE" (not "ROWS"
76f0: 29 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 6e  ), then it may n
7700: 6f 74 20 75 73 65 0a 20 20 2a 2a 20 65 69 74 68  ot use.  ** eith
7710: 65 72 20 22 3c 65 78 70 72 3e 20 50 52 45 43 45  er "<expr> PRECE
7720: 44 49 4e 47 22 20 6f 72 20 22 3c 65 78 70 72 3e  DING" or "<expr>
7730: 20 46 4f 4c 4c 4f 57 49 4e 47 22 2e 0a 20 20 2a   FOLLOWING"..  *
7740: 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 54  /.  if( eType==T
7750: 4b 5f 52 41 4e 47 45 20 26 26 20 28 70 53 74 61  K_RANGE && (pSta
7760: 72 74 21 3d 30 20 7c 7c 20 70 45 6e 64 21 3d 30  rt!=0 || pEnd!=0
7770: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
7780: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
7790: 20 22 52 41 4e 47 45 20 6d 75 73 74 20 75 73 65   "RANGE must use
77a0: 20 6f 6e 6c 79 20 55 4e 42 4f 55 4e 44 45 44 20   only UNBOUNDED 
77b0: 6f 72 20 43 55 52 52 45 4e 54 20 52 4f 57 22 29  or CURRENT ROW")
77c0: 3b 0a 20 20 20 20 67 6f 74 6f 20 77 69 6e 64 6f  ;.    goto windo
77d0: 77 41 6c 6c 6f 63 45 72 72 3b 0a 20 20 7d 0a 0a  wAllocErr;.  }..
77e0: 20 20 2f 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c    /* Additionall
77f0: 79 2c 20 74 68 65 0a 20 20 2a 2a 20 73 74 61 72  y, the.  ** star
7800: 74 69 6e 67 20 62 6f 75 6e 64 61 72 79 20 74 79  ting boundary ty
7810: 70 65 20 6d 61 79 20 6e 6f 74 20 6f 63 63 75 72  pe may not occur
7820: 20 65 61 72 6c 69 65 72 20 69 6e 20 74 68 65 20   earlier in the 
7830: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 69 73 74 20 74  following list t
7840: 68 61 6e 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64  han.  ** the end
7850: 69 6e 67 20 62 6f 75 6e 64 61 72 79 20 74 79 70  ing boundary typ
7860: 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 55  e:.  **.  **   U
7870: 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49  NBOUNDED PRECEDI
7880: 4e 47 0a 20 20 2a 2a 20 20 20 3c 65 78 70 72 3e  NG.  **   <expr>
7890: 20 50 52 45 43 45 44 49 4e 47 0a 20 20 2a 2a 20   PRECEDING.  ** 
78a0: 20 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 20 20    CURRENT ROW.  
78b0: 2a 2a 20 20 20 3c 65 78 70 72 3e 20 46 4f 4c 4c  **   <expr> FOLL
78c0: 4f 57 49 4e 47 0a 20 20 2a 2a 20 20 20 55 4e 42  OWING.  **   UNB
78d0: 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47  OUNDED FOLLOWING
78e0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 70  .  **.  ** The p
78f0: 61 72 73 65 72 20 65 6e 73 75 72 65 73 20 74 68  arser ensures th
7900: 61 74 20 22 55 4e 42 4f 55 4e 44 45 44 20 50 52  at "UNBOUNDED PR
7910: 45 43 45 44 49 4e 47 22 20 63 61 6e 6e 6f 74 20  ECEDING" cannot 
7920: 62 65 20 75 73 65 64 20 61 73 20 61 6e 20 65 6e  be used as an en
7930: 64 69 6e 67 0a 20 20 2a 2a 20 62 6f 75 6e 64 61  ding.  ** bounda
7940: 72 79 2c 20 61 6e 64 20 74 68 61 6e 20 22 55 4e  ry, and than "UN
7950: 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e  BOUNDED FOLLOWIN
7960: 47 22 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  G" cannot be use
7970: 64 20 61 73 20 61 20 73 74 61 72 74 69 6e 67 0a  d as a starting.
7980: 20 20 2a 2a 20 66 72 61 6d 65 20 62 6f 75 6e 64    ** frame bound
7990: 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ary..  */.  if( 
79a0: 28 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52  (eStart==TK_CURR
79b0: 45 4e 54 20 26 26 20 65 45 6e 64 3d 3d 54 4b 5f  ENT && eEnd==TK_
79c0: 50 52 45 43 45 44 49 4e 47 29 0a 20 20 20 7c 7c  PRECEDING).   ||
79d0: 20 28 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c   (eStart==TK_FOL
79e0: 4c 4f 57 49 4e 47 20 26 26 20 28 65 45 6e 64 3d  LOWING && (eEnd=
79f0: 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 7c 7c  =TK_PRECEDING ||
7a00: 20 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e   eEnd==TK_CURREN
7a10: 54 29 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c  T)).  ){.    sql
7a20: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7a30: 72 73 65 2c 20 22 75 6e 73 75 70 70 6f 72 74 65  rse, "unsupporte
7a40: 64 20 66 72 61 6d 65 20 64 65 6c 69 6d 69 74 65  d frame delimite
7a50: 72 20 66 6f 72 20 52 4f 57 53 22 29 3b 0a 20 20  r for ROWS");.  
7a60: 20 20 67 6f 74 6f 20 77 69 6e 64 6f 77 41 6c 6c    goto windowAll
7a70: 6f 63 45 72 72 3b 0a 20 20 7d 0a 0a 20 20 70 57  ocErr;.  }..  pW
7a80: 69 6e 20 3d 20 28 57 69 6e 64 6f 77 2a 29 73 71  in = (Window*)sq
7a90: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
7aa0: 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69  o(pParse->db, si
7ab0: 7a 65 6f 66 28 57 69 6e 64 6f 77 29 29 3b 0a 20  zeof(Window));. 
7ac0: 20 69 66 28 20 70 57 69 6e 3d 3d 30 20 29 20 67   if( pWin==0 ) g
7ad0: 6f 74 6f 20 77 69 6e 64 6f 77 41 6c 6c 6f 63 45  oto windowAllocE
7ae0: 72 72 3b 0a 20 20 70 57 69 6e 2d 3e 65 54 79 70  rr;.  pWin->eTyp
7af0: 65 20 3d 20 65 54 79 70 65 3b 0a 20 20 70 57 69  e = eType;.  pWi
7b00: 6e 2d 3e 65 53 74 61 72 74 20 3d 20 65 53 74 61  n->eStart = eSta
7b10: 72 74 3b 0a 20 20 70 57 69 6e 2d 3e 65 45 6e 64  rt;.  pWin->eEnd
7b20: 20 3d 20 65 45 6e 64 3b 0a 20 20 70 57 69 6e 2d   = eEnd;.  pWin-
7b30: 3e 62 49 6d 70 6c 69 63 69 74 46 72 61 6d 65 20  >bImplicitFrame 
7b40: 3d 20 62 49 6d 70 6c 69 63 69 74 46 72 61 6d 65  = bImplicitFrame
7b50: 3b 0a 20 20 70 57 69 6e 2d 3e 70 45 6e 64 20 3d  ;.  pWin->pEnd =
7b60: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4f 66   sqlite3WindowOf
7b70: 66 73 65 74 45 78 70 72 28 70 50 61 72 73 65 2c  fsetExpr(pParse,
7b80: 20 70 45 6e 64 29 3b 0a 20 20 70 57 69 6e 2d 3e   pEnd);.  pWin->
7b90: 70 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  pStart = sqlite3
7ba0: 57 69 6e 64 6f 77 4f 66 66 73 65 74 45 78 70 72  WindowOffsetExpr
7bb0: 28 70 50 61 72 73 65 2c 20 70 53 74 61 72 74 29  (pParse, pStart)
7bc0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 69 6e 3b  ;.  return pWin;
7bd0: 0a 0a 77 69 6e 64 6f 77 41 6c 6c 6f 63 45 72 72  ..windowAllocErr
7be0: 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  :.  sqlite3ExprD
7bf0: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
7c00: 2c 20 70 45 6e 64 29 3b 0a 20 20 73 71 6c 69 74  , pEnd);.  sqlit
7c10: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61  e3ExprDelete(pPa
7c20: 72 73 65 2d 3e 64 62 2c 20 70 53 74 61 72 74 29  rse->db, pStart)
7c30: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
7c40: 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20 50 41  ./*.** Attach PA
7c50: 52 54 49 54 49 4f 4e 20 61 6e 64 20 4f 52 44 45  RTITION and ORDE
7c60: 52 20 42 59 20 63 6c 61 75 73 65 73 20 70 50 61  R BY clauses pPa
7c70: 72 74 69 74 69 6f 6e 20 61 6e 64 20 70 4f 72 64  rtition and pOrd
7c80: 65 72 42 79 20 74 6f 20 77 69 6e 64 6f 77 0a 2a  erBy to window.*
7c90: 2a 20 70 57 69 6e 2e 20 41 6c 73 6f 2c 20 69 66  * pWin. Also, if
7ca0: 20 70 61 72 61 6d 65 74 65 72 20 70 42 61 73 65   parameter pBase
7cb0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 65   is not NULL, se
7cc0: 74 20 70 57 69 6e 2d 3e 7a 42 61 73 65 20 74 6f  t pWin->zBase to
7cd0: 20 74 68 65 0a 2a 2a 20 65 71 75 69 76 61 6c 65   the.** equivale
7ce0: 6e 74 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65  nt nul-terminate
7cf0: 64 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 57 69 6e  d string..*/.Win
7d00: 64 6f 77 20 2a 73 71 6c 69 74 65 33 57 69 6e 64  dow *sqlite3Wind
7d10: 6f 77 41 73 73 65 6d 62 6c 65 28 0a 20 20 50 61  owAssemble(.  Pa
7d20: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20  rse *pParse, .  
7d30: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 2c 20 0a 20  Window *pWin, . 
7d40: 20 45 78 70 72 4c 69 73 74 20 2a 70 50 61 72 74   ExprList *pPart
7d50: 69 74 69 6f 6e 2c 20 0a 20 20 45 78 70 72 4c 69  ition, .  ExprLi
7d60: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 0a 20  st *pOrderBy, . 
7d70: 20 54 6f 6b 65 6e 20 2a 70 42 61 73 65 0a 29 7b   Token *pBase.){
7d80: 0a 20 20 69 66 28 20 70 57 69 6e 20 29 7b 0a 20  .  if( pWin ){. 
7d90: 20 20 20 70 57 69 6e 2d 3e 70 50 61 72 74 69 74     pWin->pPartit
7da0: 69 6f 6e 20 3d 20 70 50 61 72 74 69 74 69 6f 6e  ion = pPartition
7db0: 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70 4f 72 64  ;.    pWin->pOrd
7dc0: 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
7dd0: 0a 20 20 20 20 69 66 28 20 70 42 61 73 65 20 29  .    if( pBase )
7de0: 7b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 7a 42  {.      pWin->zB
7df0: 61 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ase = sqlite3DbS
7e00: 74 72 4e 44 75 70 28 70 50 61 72 73 65 2d 3e 64  trNDup(pParse->d
7e10: 62 2c 20 70 42 61 73 65 2d 3e 7a 2c 20 70 42 61  b, pBase->z, pBa
7e20: 73 65 2d 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  se->n);.    }.  
7e30: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
7e40: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
7e50: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 50 61  (pParse->db, pPa
7e60: 72 74 69 74 69 6f 6e 29 3b 0a 20 20 20 20 73 71  rtition);.    sq
7e70: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
7e80: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
7e90: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d 0a 20  pOrderBy);.  }. 
7ea0: 20 72 65 74 75 72 6e 20 70 57 69 6e 3b 0a 7d 0a   return pWin;.}.
7eb0: 0a 2f 2a 0a 2a 2a 20 57 69 6e 64 6f 77 20 2a 70  ./*.** Window *p
7ec0: 57 69 6e 20 68 61 73 20 6a 75 73 74 20 62 65 65  Win has just bee
7ed0: 6e 20 63 72 65 61 74 65 64 20 66 72 6f 6d 20 61  n created from a
7ee0: 20 57 49 4e 44 4f 57 20 63 6c 61 75 73 65 2e 20   WINDOW clause. 
7ef0: 54 6f 6b 6e 65 20 70 42 61 73 65 0a 2a 2a 20 69  Tokne pBase.** i
7f00: 73 20 74 68 65 20 62 61 73 65 20 77 69 6e 64 6f  s the base windo
7f10: 77 2e 20 45 61 72 6c 69 65 72 20 77 69 6e 64 6f  w. Earlier windo
7f20: 77 73 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65  ws from the same
7f30: 20 57 49 4e 44 4f 57 20 63 6c 61 75 73 65 20 61   WINDOW clause a
7f40: 72 65 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  re.** stored in 
7f50: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
7f60: 73 74 61 72 74 69 6e 67 20 61 74 20 70 57 69 6e  starting at pWin
7f70: 2d 3e 70 4e 65 78 74 57 69 6e 2e 20 54 68 69 73  ->pNextWin. This
7f80: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 65 69 74   function.** eit
7f90: 68 65 72 20 75 70 64 61 74 65 73 20 2a 70 57 69  her updates *pWi
7fa0: 6e 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  n according to t
7fb0: 68 65 20 62 61 73 65 20 73 70 65 63 69 66 69 63  he base specific
7fc0: 61 74 69 6f 6e 2c 20 6f 72 20 65 6c 73 65 0a 2a  ation, or else.*
7fd0: 2a 20 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f  * leaves an erro
7fe0: 72 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  r in pParse..*/.
7ff0: 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64  void sqlite3Wind
8000: 6f 77 43 68 61 69 6e 28 50 61 72 73 65 20 2a 70  owChain(Parse *p
8010: 50 61 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70  Parse, Window *p
8020: 57 69 6e 2c 20 57 69 6e 64 6f 77 20 2a 70 4c 69  Win, Window *pLi
8030: 73 74 29 7b 0a 20 20 69 66 28 20 70 57 69 6e 2d  st){.  if( pWin-
8040: 3e 7a 42 61 73 65 20 29 7b 0a 20 20 20 20 73 71  >zBase ){.    sq
8050: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
8060: 73 65 2d 3e 64 62 3b 0a 20 20 20 20 57 69 6e 64  se->db;.    Wind
8070: 6f 77 20 2a 70 45 78 69 73 74 20 3d 20 77 69 6e  ow *pExist = win
8080: 64 6f 77 46 69 6e 64 28 70 50 61 72 73 65 2c 20  dowFind(pParse, 
8090: 70 4c 69 73 74 2c 20 70 57 69 6e 2d 3e 7a 42 61  pList, pWin->zBa
80a0: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78  se);.    if( pEx
80b0: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  ist ){.      con
80c0: 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20  st char *zErr = 
80d0: 30 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63  0;.      /* Chec
80e0: 6b 20 66 6f 72 20 65 72 72 6f 72 73 20 2a 2f 0a  k for errors */.
80f0: 20 20 20 20 20 20 69 66 28 20 70 57 69 6e 2d 3e        if( pWin->
8100: 70 50 61 72 74 69 74 69 6f 6e 20 29 7b 0a 20 20  pPartition ){.  
8110: 20 20 20 20 20 20 7a 45 72 72 20 3d 20 22 50 41        zErr = "PA
8120: 52 54 49 54 49 4f 4e 20 63 6c 61 75 73 65 22 3b  RTITION clause";
8130: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
8140: 20 70 45 78 69 73 74 2d 3e 70 4f 72 64 65 72 42   pExist->pOrderB
8150: 79 20 26 26 20 70 57 69 6e 2d 3e 70 4f 72 64 65  y && pWin->pOrde
8160: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  rBy ){.        z
8170: 45 72 72 20 3d 20 22 4f 52 44 45 52 20 42 59 20  Err = "ORDER BY 
8180: 63 6c 61 75 73 65 22 3b 0a 20 20 20 20 20 20 7d  clause";.      }
8190: 65 6c 73 65 20 69 66 28 20 70 45 78 69 73 74 2d  else if( pExist-
81a0: 3e 62 49 6d 70 6c 69 63 69 74 46 72 61 6d 65 3d  >bImplicitFrame=
81b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 45  =0 ){.        zE
81c0: 72 72 20 3d 20 22 66 72 61 6d 65 20 73 70 65 63  rr = "frame spec
81d0: 69 66 69 63 61 74 69 6f 6e 22 3b 0a 20 20 20 20  ification";.    
81e0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 45    }.      if( zE
81f0: 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rr ){.        sq
8200: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8210: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
8220: 20 20 20 22 63 61 6e 6e 6f 74 20 6f 76 65 72 72     "cannot overr
8230: 69 64 65 20 25 73 20 6f 66 20 77 69 6e 64 6f 77  ide %s of window
8240: 3a 20 25 73 22 2c 20 7a 45 72 72 2c 20 70 57 69  : %s", zErr, pWi
8250: 6e 2d 3e 7a 42 61 73 65 0a 20 20 20 20 20 20 20  n->zBase.       
8260: 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   );.      }else{
8270: 0a 20 20 20 20 20 20 20 20 70 57 69 6e 2d 3e 70  .        pWin->p
8280: 50 61 72 74 69 74 69 6f 6e 20 3d 20 73 71 6c 69  Partition = sqli
8290: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
82a0: 62 2c 20 70 45 78 69 73 74 2d 3e 70 50 61 72 74  b, pExist->pPart
82b0: 69 74 69 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 20  ition, 0);.     
82c0: 20 20 20 69 66 28 20 70 45 78 69 73 74 2d 3e 70     if( pExist->p
82d0: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
82e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69       assert( pWi
82f0: 6e 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  n->pOrderBy==0 )
8300: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 57 69 6e  ;.          pWin
8310: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c  ->pOrderBy = sql
8320: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
8330: 64 62 2c 20 70 45 78 69 73 74 2d 3e 70 4f 72 64  db, pExist->pOrd
8340: 65 72 42 79 2c 20 30 29 3b 0a 20 20 20 20 20 20  erBy, 0);.      
8350: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
8360: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57  te3DbFree(db, pW
8370: 69 6e 2d 3e 7a 42 61 73 65 29 3b 0a 20 20 20 20  in->zBase);.    
8380: 20 20 20 20 70 57 69 6e 2d 3e 7a 42 61 73 65 20      pWin->zBase 
8390: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
83a0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
83b0: 41 74 74 61 63 68 20 77 69 6e 64 6f 77 20 6f 62  Attach window ob
83c0: 6a 65 63 74 20 70 57 69 6e 20 74 6f 20 65 78 70  ject pWin to exp
83d0: 72 65 73 73 69 6f 6e 20 70 2e 0a 2a 2f 0a 76 6f  ression p..*/.vo
83e0: 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  id sqlite3Window
83f0: 41 74 74 61 63 68 28 50 61 72 73 65 20 2a 70 50  Attach(Parse *pP
8400: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 2c 20 57  arse, Expr *p, W
8410: 69 6e 64 6f 77 20 2a 70 57 69 6e 29 7b 0a 20 20  indow *pWin){.  
8420: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73  if( p ){.    ass
8430: 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46  ert( p->op==TK_F
8440: 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 2f  UNCTION );.    /
8450: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
8460: 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f  s only called fo
8470: 72 20 74 68 65 20 70 61 72 73 65 72 2e 20 20 49  r the parser.  I
8480: 66 20 70 57 69 6e 20 77 61 73 20 6e 6f 74 0a 20  f pWin was not. 
8490: 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20     ** allocated 
84a0: 64 75 65 20 74 6f 20 61 6e 20 4f 4f 4d 2c 20 74  due to an OOM, t
84b0: 68 65 6e 20 74 68 65 20 70 61 72 73 65 72 20 77  hen the parser w
84c0: 6f 75 6c 64 20 66 61 69 6c 20 62 65 66 6f 72 65  ould fail before
84d0: 20 65 76 65 72 0a 20 20 20 20 2a 2a 20 69 6e 76   ever.    ** inv
84e0: 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  oking this routi
84f0: 6e 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 41 4c  ne */.    if( AL
8500: 57 41 59 53 28 70 57 69 6e 29 20 29 7b 0a 20 20  WAYS(pWin) ){.  
8510: 20 20 20 20 70 2d 3e 79 2e 70 57 69 6e 20 3d 20      p->y.pWin = 
8520: 70 57 69 6e 3b 0a 20 20 20 20 20 20 45 78 70 72  pWin;.      Expr
8530: 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45  SetProperty(p, E
8540: 50 5f 57 69 6e 46 75 6e 63 29 3b 0a 20 20 20 20  P_WinFunc);.    
8550: 20 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 20 3d    pWin->pOwner =
8560: 20 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   p;.      if( p-
8570: 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74  >flags & EP_Dist
8580: 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  inct ){.        
8590: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
85a0: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
85b0: 20 20 20 22 44 49 53 54 49 4e 43 54 20 69 73 20     "DISTINCT is 
85c0: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 66 6f  not supported fo
85d0: 72 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  r window functio
85e0: 6e 73 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ns");.      }.  
85f0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
8600: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 65   sqlite3WindowDe
8610: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
8620: 20 70 57 69 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   pWin);.  }.}../
8630: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66  *.** Return 0 if
8640: 20 74 68 65 20 74 77 6f 20 77 69 6e 64 6f 77 20   the two window 
8650: 6f 62 6a 65 63 74 73 20 61 72 65 20 69 64 65 6e  objects are iden
8660: 74 69 63 61 6c 2c 20 6f 72 20 6e 6f 6e 2d 7a 65  tical, or non-ze
8670: 72 6f 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a  ro otherwise..**
8680: 20 49 64 65 6e 74 69 63 61 6c 20 77 69 6e 64 6f   Identical windo
8690: 77 20 6f 62 6a 65 63 74 73 20 63 61 6e 20 62 65  w objects can be
86a0: 20 70 72 6f 63 65 73 73 65 64 20 69 6e 20 61 20   processed in a 
86b0: 73 69 6e 67 6c 65 20 73 63 61 6e 2e 0a 2a 2f 0a  single scan..*/.
86c0: 69 6e 74 20 73 71 6c 69 74 65 33 57 69 6e 64 6f  int sqlite3Windo
86d0: 77 43 6f 6d 70 61 72 65 28 50 61 72 73 65 20 2a  wCompare(Parse *
86e0: 70 50 61 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a  pParse, Window *
86f0: 70 31 2c 20 57 69 6e 64 6f 77 20 2a 70 32 29 7b  p1, Window *p2){
8700: 0a 20 20 69 66 28 20 70 31 2d 3e 65 54 79 70 65  .  if( p1->eType
8710: 21 3d 70 32 2d 3e 65 54 79 70 65 20 29 20 72 65  !=p2->eType ) re
8720: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 31  turn 1;.  if( p1
8730: 2d 3e 65 53 74 61 72 74 21 3d 70 32 2d 3e 65 53  ->eStart!=p2->eS
8740: 74 61 72 74 20 29 20 72 65 74 75 72 6e 20 31 3b  tart ) return 1;
8750: 0a 20 20 69 66 28 20 70 31 2d 3e 65 45 6e 64 21  .  if( p1->eEnd!
8760: 3d 70 32 2d 3e 65 45 6e 64 20 29 20 72 65 74 75  =p2->eEnd ) retu
8770: 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 1;.  if( sqli
8780: 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
8790: 50 61 72 73 65 2c 20 70 31 2d 3e 70 53 74 61 72  Parse, p1->pStar
87a0: 74 2c 20 70 32 2d 3e 70 53 74 61 72 74 2c 20 2d  t, p2->pStart, -
87b0: 31 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  1) ) return 1;. 
87c0: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
87d0: 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
87e0: 70 31 2d 3e 70 45 6e 64 2c 20 70 32 2d 3e 70 45  p1->pEnd, p2->pE
87f0: 6e 64 2c 20 2d 31 29 20 29 20 72 65 74 75 72 6e  nd, -1) ) return
8800: 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   1;.  if( sqlite
8810: 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65  3ExprListCompare
8820: 28 70 31 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c  (p1->pPartition,
8830: 20 70 32 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c   p2->pPartition,
8840: 20 2d 31 29 20 29 20 72 65 74 75 72 6e 20 31 3b   -1) ) return 1;
8850: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
8860: 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 31  prListCompare(p1
8870: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 32 2d 3e  ->pOrderBy, p2->
8880: 70 4f 72 64 65 72 42 79 2c 20 2d 31 29 20 29 20  pOrderBy, -1) ) 
8890: 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75  return 1;.  retu
88a0: 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn 0;.}.../*.** 
88b0: 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 62  This is called b
88c0: 79 20 63 6f 64 65 20 69 6e 20 73 65 6c 65 63 74  y code in select
88d0: 2e 63 20 62 65 66 6f 72 65 20 69 74 20 63 61 6c  .c before it cal
88e0: 6c 73 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  ls sqlite3WhereB
88f0: 65 67 69 6e 28 29 0a 2a 2a 20 74 6f 20 62 65 67  egin().** to beg
8900: 69 6e 20 69 74 65 72 61 74 69 6e 67 20 74 68 72  in iterating thr
8910: 6f 75 67 68 20 74 68 65 20 73 75 62 2d 71 75 65  ough the sub-que
8920: 72 79 20 72 65 73 75 6c 74 73 2e 20 49 74 20 69  ry results. It i
8930: 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61  s used to alloca
8940: 74 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61  te.** and initia
8950: 6c 69 7a 65 20 72 65 67 69 73 74 65 72 73 20 61  lize registers a
8960: 6e 64 20 63 75 72 73 6f 72 73 20 75 73 65 64 20  nd cursors used 
8970: 62 79 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  by sqlite3Window
8980: 43 6f 64 65 53 74 65 70 28 29 2e 0a 2a 2f 0a 76  CodeStep()..*/.v
8990: 6f 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f  oid sqlite3Windo
89a0: 77 43 6f 64 65 49 6e 69 74 28 50 61 72 73 65 20  wCodeInit(Parse 
89b0: 2a 70 50 61 72 73 65 2c 20 57 69 6e 64 6f 77 20  *pParse, Window 
89c0: 2a 70 4d 57 69 6e 29 7b 0a 20 20 57 69 6e 64 6f  *pMWin){.  Windo
89d0: 77 20 2a 70 57 69 6e 3b 0a 20 20 56 64 62 65 20  w *pWin;.  Vdbe 
89e0: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
89f0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
8a00: 6e 74 20 6e 50 61 72 74 20 3d 20 28 70 4d 57 69  nt nPart = (pMWi
8a10: 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 3f 20  n->pPartition ? 
8a20: 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f  pMWin->pPartitio
8a30: 6e 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20  n->nExpr : 0);. 
8a40: 20 6e 50 61 72 74 20 2b 3d 20 28 70 4d 57 69 6e   nPart += (pMWin
8a50: 2d 3e 70 4f 72 64 65 72 42 79 20 3f 20 70 4d 57  ->pOrderBy ? pMW
8a60: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  in->pOrderBy->nE
8a70: 78 70 72 20 3a 20 30 29 3b 0a 20 20 69 66 28 20  xpr : 0);.  if( 
8a80: 6e 50 61 72 74 20 29 7b 0a 20 20 20 20 70 4d 57  nPart ){.    pMW
8a90: 69 6e 2d 3e 72 65 67 50 61 72 74 20 3d 20 70 50  in->regPart = pP
8aa0: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
8ab0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
8ac0: 3d 20 6e 50 61 72 74 3b 0a 20 20 20 20 73 71 6c  = nPart;.    sql
8ad0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
8ae0: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 4d  , OP_Null, 0, pM
8af0: 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c 20 70 4d  Win->regPart, pM
8b00: 57 69 6e 2d 3e 72 65 67 50 61 72 74 2b 6e 50 61  Win->regPart+nPa
8b10: 72 74 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 70 4d  rt-1);.  }..  pM
8b20: 57 69 6e 2d 3e 72 65 67 46 69 72 73 74 20 3d 20  Win->regFirst = 
8b30: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
8b40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8b50: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
8b60: 72 2c 20 31 2c 20 70 4d 57 69 6e 2d 3e 72 65 67  r, 1, pMWin->reg
8b70: 46 69 72 73 74 29 3b 0a 20 20 70 4d 57 69 6e 2d  First);.  pMWin-
8b80: 3e 72 65 67 53 69 7a 65 20 3d 20 2b 2b 70 50 61  >regSize = ++pPa
8b90: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c  rse->nMem;.  sql
8ba0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
8bb0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
8bc0: 20 70 4d 57 69 6e 2d 3e 72 65 67 53 69 7a 65 29   pMWin->regSize)
8bd0: 3b 0a 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d  ;..  for(pWin=pM
8be0: 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d  Win; pWin; pWin=
8bf0: 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b  pWin->pNextWin){
8c00: 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 20  .    FuncDef *p 
8c10: 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20  = pWin->pFunc;. 
8c20: 20 20 20 69 66 28 20 28 70 2d 3e 66 75 6e 63 46     if( (p->funcF
8c30: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
8c40: 4e 43 5f 4d 49 4e 4d 41 58 29 20 26 26 20 70 57  NC_MINMAX) && pW
8c50: 69 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b 5f 55  in->eStart!=TK_U
8c60: 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20 20  NBOUNDED ){.    
8c70: 20 20 2f 2a 20 54 68 65 20 69 6e 6c 69 6e 65 20    /* The inline 
8c80: 76 65 72 73 69 6f 6e 73 20 6f 66 20 6d 69 6e 28  versions of min(
8c90: 29 20 61 6e 64 20 6d 61 78 28 29 20 72 65 71 75  ) and max() requ
8ca0: 69 72 65 20 61 20 73 69 6e 67 6c 65 20 65 70 68  ire a single eph
8cb0: 65 6d 65 72 61 6c 0a 20 20 20 20 20 20 2a 2a 20  emeral.      ** 
8cc0: 74 61 62 6c 65 20 61 6e 64 20 33 20 72 65 67 69  table and 3 regi
8cd0: 73 74 65 72 73 2e 20 54 68 65 20 72 65 67 69 73  sters. The regis
8ce0: 74 65 72 73 20 61 72 65 20 75 73 65 64 20 61 73  ters are used as
8cf0: 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20   follows:.      
8d00: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 72 65  **.      **   re
8d10: 67 41 70 70 2b 30 3a 20 73 6c 6f 74 20 74 6f 20  gApp+0: slot to 
8d20: 63 6f 70 79 20 6d 69 6e 28 29 2f 6d 61 78 28 29  copy min()/max()
8d30: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 66 6f 72   argument to for
8d40: 20 4d 61 6b 65 52 65 63 6f 72 64 0a 20 20 20 20   MakeRecord.    
8d50: 20 20 2a 2a 20 20 20 72 65 67 41 70 70 2b 31 3a    **   regApp+1:
8d60: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 75   integer value u
8d70: 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 6b 65  sed to ensure ke
8d80: 79 73 20 61 72 65 20 75 6e 69 71 75 65 0a 20 20  ys are unique.  
8d90: 20 20 20 20 2a 2a 20 20 20 72 65 67 41 70 70 2b      **   regApp+
8da0: 32 3a 20 6f 75 74 70 75 74 20 6f 66 20 4d 61 6b  2: output of Mak
8db0: 65 52 65 63 6f 72 64 0a 20 20 20 20 20 20 2a 2f  eRecord.      */
8dc0: 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
8dd0: 2a 70 4c 69 73 74 20 3d 20 70 57 69 6e 2d 3e 70  *pList = pWin->p
8de0: 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  Owner->x.pList;.
8df0: 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
8e00: 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
8e10: 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  3KeyInfoFromExpr
8e20: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69  List(pParse, pLi
8e30: 73 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  st, 0, 0);.     
8e40: 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 20 3d 20   pWin->csrApp = 
8e50: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
8e60: 20 20 20 20 20 20 70 57 69 6e 2d 3e 72 65 67 41        pWin->regA
8e70: 70 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  pp = pParse->nMe
8e80: 6d 2b 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73  m+1;.      pPars
8e90: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 33 3b 0a 20 20  e->nMem += 3;.  
8ea0: 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
8eb0: 20 26 26 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2d   && pWin->pFunc-
8ec0: 3e 7a 4e 61 6d 65 5b 31 5d 3d 3d 27 69 27 20 29  >zName[1]=='i' )
8ed0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
8ee0: 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
8ef0: 74 4f 72 64 65 72 5b 30 5d 3d 3d 30 20 29 3b 0a  tOrder[0]==0 );.
8f00: 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f          pKeyInfo
8f10: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 20  ->aSortOrder[0] 
8f20: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
8f30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8f40: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
8f50: 70 68 65 6d 65 72 61 6c 2c 20 70 57 69 6e 2d 3e  phemeral, pWin->
8f60: 63 73 72 41 70 70 2c 20 32 29 3b 0a 20 20 20 20  csrApp, 2);.    
8f70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70    sqlite3VdbeApp
8f80: 65 6e 64 50 34 28 76 2c 20 70 4b 65 79 49 6e 66  endP4(v, pKeyInf
8f90: 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
8fa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8fb0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
8fc0: 74 65 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d 3e  teger, 0, pWin->
8fd0: 72 65 67 41 70 70 2b 31 29 3b 0a 20 20 20 20 7d  regApp+1);.    }
8fe0: 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 2d  .    else if( p-
8ff0: 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75  >zName==nth_valu
9000: 65 4e 61 6d 65 20 7c 7c 20 70 2d 3e 7a 4e 61 6d  eName || p->zNam
9010: 65 3d 3d 66 69 72 73 74 5f 76 61 6c 75 65 4e 61  e==first_valueNa
9020: 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  me ){.      /* A
9030: 6c 6c 6f 63 61 74 65 20 74 77 6f 20 72 65 67 69  llocate two regi
9040: 73 74 65 72 73 20 61 74 20 70 57 69 6e 2d 3e 72  sters at pWin->r
9050: 65 67 41 70 70 2e 20 54 68 65 73 65 20 77 69 6c  egApp. These wil
9060: 6c 20 62 65 20 75 73 65 64 20 74 6f 0a 20 20 20  l be used to.   
9070: 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20     ** store the 
9080: 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 69 6e  start and end in
9090: 64 65 78 20 6f 66 20 74 68 65 20 63 75 72 72 65  dex of the curre
90a0: 6e 74 20 66 72 61 6d 65 2e 20 20 2a 2f 0a 20 20  nt frame.  */.  
90b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 57 69      assert( pMWi
90c0: 6e 2d 3e 69 45 70 68 43 73 72 20 29 3b 0a 20 20  n->iEphCsr );.  
90d0: 20 20 20 20 70 57 69 6e 2d 3e 72 65 67 41 70 70      pWin->regApp
90e0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
90f0: 31 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 63  1;.      pWin->c
9100: 73 72 41 70 70 20 3d 20 70 50 61 72 73 65 2d 3e  srApp = pParse->
9110: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 50  nTab++;.      pP
9120: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 32 3b  arse->nMem += 2;
9130: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
9140: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
9150: 70 65 6e 44 75 70 2c 20 70 57 69 6e 2d 3e 63 73  penDup, pWin->cs
9160: 72 41 70 70 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  rApp, pMWin->iEp
9170: 68 43 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hCsr);.    }.   
9180: 20 65 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4e 61   else if( p->zNa
9190: 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65 20 7c 7c 20  me==leadName || 
91a0: 70 2d 3e 7a 4e 61 6d 65 3d 3d 6c 61 67 4e 61 6d  p->zName==lagNam
91b0: 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e ){.      asser
91c0: 74 28 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  t( pMWin->iEphCs
91d0: 72 20 29 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d  r );.      pWin-
91e0: 3e 63 73 72 41 70 70 20 3d 20 70 50 61 72 73 65  >csrApp = pParse
91f0: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
9200: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9210: 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c  2(v, OP_OpenDup,
9220: 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20 70   pWin->csrApp, p
9230: 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a  MWin->iEphCsr);.
9240: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
9250: 2a 2a 20 41 20 22 50 52 45 43 45 44 49 4e 47 20  ** A "PRECEDING 
9260: 3c 65 78 70 72 3e 22 20 28 65 43 6f 6e 64 3d 3d  <expr>" (eCond==
9270: 30 29 20 6f 72 20 22 46 4f 4c 4c 4f 57 49 4e 47  0) or "FOLLOWING
9280: 20 3c 65 78 70 72 3e 22 20 28 65 43 6f 6e 64 3d   <expr>" (eCond=
9290: 3d 31 29 20 6f 72 20 74 68 65 0a 2a 2a 20 76 61  =1) or the.** va
92a0: 6c 75 65 20 6f 66 20 74 68 65 20 73 65 63 6f 6e  lue of the secon
92b0: 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6e 74  d argument to nt
92c0: 68 5f 76 61 6c 75 65 28 29 20 28 65 43 6f 6e 64  h_value() (eCond
92d0: 3d 3d 32 29 20 68 61 73 20 6a 75 73 74 20 62 65  ==2) has just be
92e0: 65 6e 0a 2a 2a 20 65 76 61 6c 75 61 74 65 64 20  en.** evaluated 
92f0: 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 20 6c  and the result l
9300: 65 66 74 20 69 6e 20 72 65 67 69 73 74 65 72 20  eft in register 
9310: 72 65 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69  reg. This functi
9320: 6f 6e 20 67 65 6e 65 72 61 74 65 73 20 56 4d 0a  on generates VM.
9330: 2a 2a 20 63 6f 64 65 20 74 6f 20 63 68 65 63 6b  ** code to check
9340: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20   that the value 
9350: 69 73 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  is a non-negativ
9360: 65 20 69 6e 74 65 67 65 72 20 61 6e 64 20 74 68  e integer and th
9370: 72 6f 77 73 20 61 6e 0a 2a 2a 20 65 78 63 65 70  rows an.** excep
9380: 74 69 6f 6e 20 69 66 20 69 74 20 69 73 20 6e 6f  tion if it is no
9390: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
93a0: 64 20 77 69 6e 64 6f 77 43 68 65 63 6b 49 6e 74  d windowCheckInt
93b0: 56 61 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61  Value(Parse *pPa
93c0: 72 73 65 2c 20 69 6e 74 20 72 65 67 2c 20 69 6e  rse, int reg, in
93d0: 74 20 65 43 6f 6e 64 29 7b 0a 20 20 73 74 61 74  t eCond){.  stat
93e0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  ic const char *a
93f0: 7a 45 72 72 5b 5d 20 3d 20 7b 0a 20 20 20 20 22  zErr[] = {.    "
9400: 66 72 61 6d 65 20 73 74 61 72 74 69 6e 67 20 6f  frame starting o
9410: 66 66 73 65 74 20 6d 75 73 74 20 62 65 20 61 20  ffset must be a 
9420: 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74  non-negative int
9430: 65 67 65 72 22 2c 0a 20 20 20 20 22 66 72 61 6d  eger",.    "fram
9440: 65 20 65 6e 64 69 6e 67 20 6f 66 66 73 65 74 20  e ending offset 
9450: 6d 75 73 74 20 62 65 20 61 20 6e 6f 6e 2d 6e 65  must be a non-ne
9460: 67 61 74 69 76 65 20 69 6e 74 65 67 65 72 22 2c  gative integer",
9470: 0a 20 20 20 20 22 73 65 63 6f 6e 64 20 61 72 67  .    "second arg
9480: 75 6d 65 6e 74 20 74 6f 20 6e 74 68 5f 76 61 6c  ument to nth_val
9490: 75 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 73  ue must be a pos
94a0: 69 74 69 76 65 20 69 6e 74 65 67 65 72 22 0a 20  itive integer". 
94b0: 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74   };.  static int
94c0: 20 61 4f 70 5b 5d 20 3d 20 7b 20 4f 50 5f 47 65   aOp[] = { OP_Ge
94d0: 2c 20 4f 50 5f 47 65 2c 20 4f 50 5f 47 74 20 7d  , OP_Ge, OP_Gt }
94e0: 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  ;.  Vdbe *v = sq
94f0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
9500: 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 65 67 5a  rse);.  int regZ
9510: 65 72 6f 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ero = sqlite3Get
9520: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
9530: 0a 20 20 61 73 73 65 72 74 28 20 65 43 6f 6e 64  .  assert( eCond
9540: 3d 3d 30 20 7c 7c 20 65 43 6f 6e 64 3d 3d 31 20  ==0 || eCond==1 
9550: 7c 7c 20 65 43 6f 6e 64 3d 3d 32 20 29 3b 0a 20  || eCond==2 );. 
9560: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9570: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
9580: 2c 20 30 2c 20 72 65 67 5a 65 72 6f 29 3b 0a 20  , 0, regZero);. 
9590: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
95a0: 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p2(v, OP_MustBeI
95b0: 6e 74 2c 20 72 65 67 2c 20 73 71 6c 69 74 65 33  nt, reg, sqlite3
95c0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
95d0: 76 29 2b 32 29 3b 0a 20 20 56 64 62 65 43 6f 76  v)+2);.  VdbeCov
95e0: 65 72 61 67 65 49 66 28 76 2c 20 65 43 6f 6e 64  erageIf(v, eCond
95f0: 3d 3d 30 29 3b 0a 20 20 56 64 62 65 43 6f 76 65  ==0);.  VdbeCove
9600: 72 61 67 65 49 66 28 76 2c 20 65 43 6f 6e 64 3d  rageIf(v, eCond=
9610: 3d 31 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72  =1);.  VdbeCover
9620: 61 67 65 49 66 28 76 2c 20 65 43 6f 6e 64 3d 3d  ageIf(v, eCond==
9630: 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  2);.  sqlite3Vdb
9640: 65 41 64 64 4f 70 33 28 76 2c 20 61 4f 70 5b 65  eAddOp3(v, aOp[e
9650: 43 6f 6e 64 5d 2c 20 72 65 67 5a 65 72 6f 2c 20  Cond], regZero, 
9660: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
9670: 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 72 65 67  ntAddr(v)+2, reg
9680: 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67  );.  VdbeCoverag
9690: 65 4e 65 76 65 72 4e 75 6c 6c 49 66 28 76 2c 20  eNeverNullIf(v, 
96a0: 65 43 6f 6e 64 3d 3d 30 29 3b 0a 20 20 56 64 62  eCond==0);.  Vdb
96b0: 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72 4e 75  eCoverageNeverNu
96c0: 6c 6c 49 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 31  llIf(v, eCond==1
96d0: 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67  );.  VdbeCoverag
96e0: 65 4e 65 76 65 72 4e 75 6c 6c 49 66 28 76 2c 20  eNeverNullIf(v, 
96f0: 65 43 6f 6e 64 3d 3d 32 29 3b 0a 20 20 73 71 6c  eCond==2);.  sql
9700: 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61  ite3MayAbort(pPa
9710: 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  rse);.  sqlite3V
9720: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
9730: 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 45 52 52  Halt, SQLITE_ERR
9740: 4f 52 2c 20 4f 45 5f 41 62 6f 72 74 29 3b 0a 20  OR, OE_Abort);. 
9750: 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65   sqlite3VdbeAppe
9760: 6e 64 50 34 28 76 2c 20 28 76 6f 69 64 2a 29 61  ndP4(v, (void*)a
9770: 7a 45 72 72 5b 65 43 6f 6e 64 5d 2c 20 50 34 5f  zErr[eCond], P4_
9780: 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74  STATIC);.  sqlit
9790: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
97a0: 28 70 50 61 72 73 65 2c 20 72 65 67 5a 65 72 6f  (pParse, regZero
97b0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
97c0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
97d0: 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65   arguments passe
97e0: 64 20 74 6f 20 74 68 65 20 77 69 6e 64 6f 77 2d  d to the window-
97f0: 66 75 6e 63 74 69 6f 6e 20 61 73 73 6f 63 69 61  function associa
9800: 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ted.** with the 
9810: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
9820: 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
9830: 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
9840: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
9850: 6e 74 20 77 69 6e 64 6f 77 41 72 67 43 6f 75 6e  nt windowArgCoun
9860: 74 28 57 69 6e 64 6f 77 20 2a 70 57 69 6e 29 7b  t(Window *pWin){
9870: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
9880: 73 74 20 3d 20 70 57 69 6e 2d 3e 70 4f 77 6e 65  st = pWin->pOwne
9890: 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 72 65  r->x.pList;.  re
98a0: 74 75 72 6e 20 28 70 4c 69 73 74 20 3f 20 70 4c  turn (pList ? pL
98b0: 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b  ist->nExpr : 0);
98c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
98d0: 74 65 20 56 4d 20 63 6f 64 65 20 74 6f 20 69 6e  te VM code to in
98e0: 76 6f 6b 65 20 65 69 74 68 65 72 20 78 53 74 65  voke either xSte
98f0: 70 28 29 20 28 69 66 20 62 49 6e 76 65 72 73 65  p() (if bInverse
9900: 20 69 73 20 30 29 20 6f 72 20 0a 2a 2a 20 78 49   is 0) or .** xI
9910: 6e 76 65 72 73 65 20 28 69 66 20 62 49 6e 76 65  nverse (if bInve
9920: 72 73 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 29  rse is non-zero)
9930: 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77   for each window
9940: 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 74 68 65   function in the
9950: 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74   .** linked list
9960: 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 4d 57   starting at pMW
9970: 69 6e 2e 20 4f 72 2c 20 66 6f 72 20 62 75 69 6c  in. Or, for buil
9980: 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63  t-in window func
9990: 74 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 64 6f  tions.** that do
99a0: 20 6e 6f 74 20 75 73 65 20 74 68 65 20 73 74 61   not use the sta
99b0: 6e 64 61 72 64 20 66 75 6e 63 74 69 6f 6e 20 41  ndard function A
99c0: 50 49 2c 20 67 65 6e 65 72 61 74 65 20 74 68 65  PI, generate the
99d0: 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 69 6e 6c   required.** inl
99e0: 69 6e 65 20 56 4d 20 63 6f 64 65 2e 0a 2a 2a 0a  ine VM code..**.
99f0: 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 63  ** If argument c
9a00: 73 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68  sr is greater th
9a10: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 30  an or equal to 0
9a20: 2c 20 74 68 65 6e 20 61 72 67 75 6d 65 6e 74 20  , then argument 
9a30: 72 65 67 20 69 73 0a 2a 2a 20 74 68 65 20 66 69  reg is.** the fi
9a40: 72 73 74 20 72 65 67 69 73 74 65 72 20 69 6e 20  rst register in 
9a50: 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69  an array of regi
9a60: 73 74 65 72 73 20 67 75 61 72 61 6e 74 65 65 64  sters guaranteed
9a70: 20 74 6f 20 62 65 20 6c 61 72 67 65 0a 2a 2a 20   to be large.** 
9a80: 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74  enough to hold t
9a90: 68 65 20 61 72 72 61 79 20 6f 66 20 61 72 67 75  he array of argu
9aa0: 6d 65 6e 74 73 20 66 6f 72 20 65 61 63 68 20 66  ments for each f
9ab0: 75 6e 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73  unction. In this
9ac0: 20 63 61 73 65 0a 2a 2a 20 74 68 65 20 61 72 67   case.** the arg
9ad0: 75 6d 65 6e 74 73 20 61 72 65 20 65 78 74 72 61  uments are extra
9ae0: 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 63 75  cted from the cu
9af0: 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 63 73 72  rrent row of csr
9b00: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 61 72 72   into the.** arr
9b10: 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ay of registers 
9b20: 62 65 66 6f 72 65 20 69 6e 76 6f 6b 69 6e 67 20  before invoking 
9b30: 4f 50 5f 41 67 67 53 74 65 70 20 6f 72 20 4f 50  OP_AggStep or OP
9b40: 5f 41 67 67 49 6e 76 65 72 73 65 0a 2a 2a 0a 2a  _AggInverse.**.*
9b50: 2a 20 4f 72 2c 20 69 66 20 63 73 72 20 69 73 20  * Or, if csr is 
9b60: 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
9b70: 74 68 65 6e 20 74 68 65 20 61 72 72 61 79 20 6f  then the array o
9b80: 66 20 72 65 67 69 73 74 65 72 73 20 61 74 20 72  f registers at r
9b90: 65 67 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64 79  eg is.** already
9ba0: 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
9bb0: 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d  all columns from
9bc0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
9bd0: 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   of the sub-quer
9be0: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75  y..**.** If argu
9bf0: 6d 65 6e 74 20 72 65 67 50 61 72 74 53 69 7a 65  ment regPartSize
9c00: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
9c10: 65 6e 20 69 74 20 69 73 20 61 20 72 65 67 69 73  en it is a regis
9c20: 74 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ter containing t
9c30: 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
9c40: 72 6f 77 73 20 69 6e 20 74 68 65 20 63 75 72 72  rows in the curr
9c50: 65 6e 74 20 70 61 72 74 69 74 69 6f 6e 2e 0a 2a  ent partition..*
9c60: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
9c70: 6e 64 6f 77 41 67 67 53 74 65 70 28 0a 20 20 50  ndowAggStep(.  P
9c80: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20  arse *pParse, . 
9c90: 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 2c 20   Window *pMWin, 
9ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cb0: 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20   /* Linked list 
9cc0: 6f 66 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  of window functi
9cd0: 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 63 73 72  ons */.  int csr
9ce0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9cf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
9d00: 20 61 72 67 75 6d 65 6e 74 73 20 66 72 6f 6d 20   arguments from 
9d10: 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20  this cursor */. 
9d20: 20 69 6e 74 20 62 49 6e 76 65 72 73 65 2c 20 20   int bInverse,  
9d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d40: 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 76 6f   /* True to invo
9d50: 6b 65 20 78 49 6e 76 65 72 73 65 20 69 6e 73 74  ke xInverse inst
9d60: 65 61 64 20 6f 66 20 78 53 74 65 70 20 2a 2f 0a  ead of xStep */.
9d70: 20 20 69 6e 74 20 72 65 67 2c 20 20 20 20 20 20    int reg,      
9d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d90: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 72 65    /* Array of re
9da0: 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  gisters */.  int
9db0: 20 72 65 67 50 61 72 74 53 69 7a 65 20 20 20 20   regPartSize    
9dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9dd0: 52 65 67 69 73 74 65 72 20 63 6f 6e 74 61 69 6e  Register contain
9de0: 69 6e 67 20 73 69 7a 65 20 6f 66 20 70 61 72 74  ing size of part
9df0: 69 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 56 64  ition */.){.  Vd
9e00: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
9e10: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
9e20: 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a    Window *pWin;.
9e30: 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e    for(pWin=pMWin
9e40: 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69  ; pWin; pWin=pWi
9e50: 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20  n->pNextWin){.  
9e60: 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 57    int flags = pW
9e70: 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46  in->pFunc->funcF
9e80: 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 72 65  lags;.    int re
9e90: 67 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 6e 41  gArg;.    int nA
9ea0: 72 67 20 3d 20 77 69 6e 64 6f 77 41 72 67 43 6f  rg = windowArgCo
9eb0: 75 6e 74 28 70 57 69 6e 29 3b 0a 0a 20 20 20 20  unt(pWin);..    
9ec0: 69 66 28 20 63 73 72 3e 3d 30 20 29 7b 0a 20 20  if( csr>=0 ){.  
9ed0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
9ee0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
9ef0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
9f00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9f10: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
9f20: 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43  csr, pWin->iArgC
9f30: 6f 6c 2b 69 2c 20 72 65 67 2b 69 29 3b 0a 20 20  ol+i, reg+i);.  
9f40: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 67 41      }.      regA
9f50: 72 67 20 3d 20 72 65 67 3b 0a 20 20 20 20 20 20  rg = reg;.      
9f60: 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
9f70: 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 5f 53  TE_FUNC_WINDOW_S
9f80: 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69  IZE ){.        i
9f90: 66 28 20 6e 41 72 67 3d 3d 30 20 29 7b 0a 20 20  f( nArg==0 ){.  
9fa0: 20 20 20 20 20 20 20 20 72 65 67 41 72 67 20 3d          regArg =
9fb0: 20 72 65 67 50 61 72 74 53 69 7a 65 3b 0a 20 20   regPartSize;.  
9fc0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9fd0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
9fe0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
9ff0: 43 6f 70 79 2c 20 72 65 67 50 61 72 74 53 69 7a  Copy, regPartSiz
a000: 65 2c 20 72 65 67 2b 6e 41 72 67 29 3b 0a 20 20  e, reg+nArg);.  
a010: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a020: 6e 41 72 67 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  nArg++;.      }.
a030: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a040: 20 61 73 73 65 72 74 28 20 21 28 66 6c 61 67 73   assert( !(flags
a050: 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57   & SQLITE_FUNC_W
a060: 49 4e 44 4f 57 5f 53 49 5a 45 29 20 29 3b 0a 20  INDOW_SIZE) );. 
a070: 20 20 20 20 20 72 65 67 41 72 67 20 3d 20 72 65       regArg = re
a080: 67 20 2b 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f  g + pWin->iArgCo
a090: 6c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  l;.    }..    if
a0a0: 28 20 28 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e  ( (pWin->pFunc->
a0b0: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
a0c0: 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 20  TE_FUNC_MINMAX) 
a0d0: 0a 20 20 20 20 20 20 26 26 20 70 57 69 6e 2d 3e  .      && pWin->
a0e0: 65 53 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55  eStart!=TK_UNBOU
a0f0: 4e 44 45 44 20 0a 20 20 20 20 29 7b 0a 20 20 20  NDED .    ){.   
a100: 20 20 20 69 6e 74 20 61 64 64 72 49 73 4e 75 6c     int addrIsNul
a110: 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  l = sqlite3VdbeA
a120: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp1(v, OP_IsNu
a130: 6c 6c 2c 20 72 65 67 41 72 67 29 3b 0a 20 20 20  ll, regArg);.   
a140: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
a150: 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 49  v);.      if( bI
a160: 6e 76 65 72 73 65 3d 3d 30 20 29 7b 0a 20 20 20  nverse==0 ){.   
a170: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a180: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
a190: 49 6d 6d 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70  Imm, pWin->regAp
a1a0: 70 2b 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  p+1, 1);.       
a1b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a1c0: 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  p2(v, OP_SCopy, 
a1d0: 72 65 67 41 72 67 2c 20 70 57 69 6e 2d 3e 72 65  regArg, pWin->re
a1e0: 67 41 70 70 29 3b 0a 20 20 20 20 20 20 20 20 73  gApp);.        s
a1f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
a200: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
a210: 64 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2c  d, pWin->regApp,
a220: 20 32 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70   2, pWin->regApp
a230: 2b 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  +2);.        sql
a240: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
a250: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
a260: 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20 70 57  pWin->csrApp, pW
a270: 69 6e 2d 3e 72 65 67 41 70 70 2b 32 29 3b 0a 20  in->regApp+2);. 
a280: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a290: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a2a0: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 53  ddOp4Int(v, OP_S
a2b0: 65 65 6b 47 45 2c 20 70 57 69 6e 2d 3e 63 73 72  eekGE, pWin->csr
a2c0: 41 70 70 2c 20 30 2c 20 72 65 67 41 72 67 2c 20  App, 0, regArg, 
a2d0: 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  1);.        Vdbe
a2e0: 43 6f 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b  CoverageNeverTak
a2f0: 65 6e 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  en(v);.        s
a300: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
a310: 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 70  (v, OP_Delete, p
a320: 57 69 6e 2d 3e 63 73 72 41 70 70 29 3b 0a 20 20  Win->csrApp);.  
a330: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a340: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 73 71 6c  eJumpHere(v, sql
a350: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
a360: 64 64 72 28 76 29 2d 32 29 3b 0a 20 20 20 20 20  ddr(v)-2);.     
a370: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
a380: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
a390: 61 64 64 72 49 73 4e 75 6c 6c 29 3b 0a 20 20 20  addrIsNull);.   
a3a0: 20 7d 65 6c 73 65 20 69 66 28 20 70 57 69 6e 2d   }else if( pWin-
a3b0: 3e 72 65 67 41 70 70 20 29 7b 0a 20 20 20 20 20  >regApp ){.     
a3c0: 20 61 73 73 65 72 74 28 20 70 57 69 6e 2d 3e 70   assert( pWin->p
a3d0: 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68  Func->zName==nth
a3e0: 5f 76 61 6c 75 65 4e 61 6d 65 0a 20 20 20 20 20  _valueName.     
a3f0: 20 20 20 20 20 20 7c 7c 20 70 57 69 6e 2d 3e 70        || pWin->p
a400: 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72  Func->zName==fir
a410: 73 74 5f 76 61 6c 75 65 4e 61 6d 65 0a 20 20 20  st_valueName.   
a420: 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65     );.      asse
a430: 72 74 28 20 62 49 6e 76 65 72 73 65 3d 3d 30 20  rt( bInverse==0 
a440: 7c 7c 20 62 49 6e 76 65 72 73 65 3d 3d 31 20 29  || bInverse==1 )
a450: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
a460: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
a470: 41 64 64 49 6d 6d 2c 20 70 57 69 6e 2d 3e 72 65  AddImm, pWin->re
a480: 67 41 70 70 2b 31 2d 62 49 6e 76 65 72 73 65 2c  gApp+1-bInverse,
a490: 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69   1);.    }else i
a4a0: 66 28 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e  f( pWin->pFunc->
a4b0: 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65 0a  zName==leadName.
a4c0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 57             || pW
a4d0: 69 6e 2d 3e 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65  in->pFunc->zName
a4e0: 3d 3d 6c 61 67 4e 61 6d 65 0a 20 20 20 20 29 7b  ==lagName.    ){
a4f0: 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20  .      /* no-op 
a500: 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
a510: 20 20 20 20 69 6e 74 20 61 64 64 72 49 66 20 3d      int addrIf =
a520: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57   0;.      if( pW
a530: 69 6e 2d 3e 70 46 69 6c 74 65 72 20 29 7b 0a 20  in->pFilter ){. 
a540: 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 54 6d         int regTm
a550: 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  p;.        asser
a560: 74 28 20 6e 41 72 67 3d 3d 30 20 7c 7c 20 6e 41  t( nArg==0 || nA
a570: 72 67 3d 3d 70 57 69 6e 2d 3e 70 4f 77 6e 65 72  rg==pWin->pOwner
a580: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
a590: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
a5a0: 72 74 28 20 6e 41 72 67 20 7c 7c 20 70 57 69 6e  rt( nArg || pWin
a5b0: 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73  ->pOwner->x.pLis
a5c0: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
a5d0: 69 66 28 20 63 73 72 3e 30 20 29 7b 0a 20 20 20  if( csr>0 ){.   
a5e0: 20 20 20 20 20 20 20 72 65 67 54 6d 70 20 3d 20         regTmp = 
a5f0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
a600: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
a610: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a620: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
a630: 75 6d 6e 2c 20 63 73 72 2c 20 70 57 69 6e 2d 3e  umn, csr, pWin->
a640: 69 41 72 67 43 6f 6c 2b 6e 41 72 67 2c 72 65 67  iArgCol+nArg,reg
a650: 54 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Tmp);.        }e
a660: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
a670: 65 67 54 6d 70 20 3d 20 72 65 67 41 72 67 20 2b  egTmp = regArg +
a680: 20 6e 41 72 67 3b 0a 20 20 20 20 20 20 20 20 7d   nArg;.        }
a690: 0a 20 20 20 20 20 20 20 20 61 64 64 72 49 66 20  .        addrIf 
a6a0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
a6b0: 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op3(v, OP_IfNot,
a6c0: 20 72 65 67 54 6d 70 2c 20 30 2c 20 31 29 3b 0a   regTmp, 0, 1);.
a6d0: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
a6e0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
a6f0: 20 69 66 28 20 63 73 72 3e 30 20 29 7b 0a 20 20   if( csr>0 ){.  
a700: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
a710: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
a720: 61 72 73 65 2c 20 72 65 67 54 6d 70 29 3b 0a 20  arse, regTmp);. 
a730: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
a740: 0a 20 20 20 20 20 20 69 66 28 20 70 57 69 6e 2d  .      if( pWin-
a750: 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67  >pFunc->funcFlag
a760: 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
a770: 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20  NEEDCOLL ){.    
a780: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
a790: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ll;.        asse
a7a0: 72 74 28 20 6e 41 72 67 3e 30 20 29 3b 0a 20 20  rt( nArg>0 );.  
a7b0: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
a7c0: 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53  lite3ExprNNCollS
a7d0: 65 71 28 70 50 61 72 73 65 2c 20 70 57 69 6e 2d  eq(pParse, pWin-
a7e0: 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74  >pOwner->x.pList
a7f0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
a800: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a810: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
a820: 6f 6c 6c 53 65 71 2c 20 30 2c 30 2c 30 2c 20 28  ollSeq, 0,0,0, (
a830: 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 43 6f 6c  const char*)pCol
a840: 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
a850: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
a860: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
a870: 76 2c 20 62 49 6e 76 65 72 73 65 3f 20 4f 50 5f  v, bInverse? OP_
a880: 41 67 67 49 6e 76 65 72 73 65 20 3a 20 4f 50 5f  AggInverse : OP_
a890: 41 67 67 53 74 65 70 2c 20 0a 20 20 20 20 20 20  AggStep, .      
a8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8b0: 20 20 62 49 6e 76 65 72 73 65 2c 20 72 65 67 41    bInverse, regA
a8c0: 72 67 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63  rg, pWin->regAcc
a8d0: 75 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  um);.      sqlit
a8e0: 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76  e3VdbeAppendP4(v
a8f0: 2c 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2c 20 50  , pWin->pFunc, P
a900: 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20  4_FUNCDEF);.    
a910: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
a920: 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 41 72  ngeP5(v, (u8)nAr
a930: 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 64  g);.      if( ad
a940: 64 72 49 66 20 29 20 73 71 6c 69 74 65 33 56 64  drIf ) sqlite3Vd
a950: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
a960: 64 72 49 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  drIf);.    }.  }
a970: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
a980: 74 65 20 56 4d 20 63 6f 64 65 20 74 6f 20 69 6e  te VM code to in
a990: 76 6f 6b 65 20 65 69 74 68 65 72 20 78 56 61 6c  voke either xVal
a9a0: 75 65 28 29 20 28 62 46 69 6e 61 6c 3d 3d 30 29  ue() (bFinal==0)
a9b0: 20 6f 72 20 78 46 69 6e 61 6c 69 7a 65 28 29 0a   or xFinalize().
a9c0: 2a 2a 20 28 62 46 69 6e 61 6c 3d 3d 31 29 20 66  ** (bFinal==1) f
a9d0: 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77 20 66  or each window f
a9e0: 75 6e 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 6c  unction in the l
a9f0: 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74  inked list start
aa00: 69 6e 67 20 61 74 0a 2a 2a 20 70 4d 57 69 6e 2e  ing at.** pMWin.
aa10: 20 4f 72 2c 20 66 6f 72 20 62 75 69 6c 74 2d 69   Or, for built-i
aa20: 6e 20 77 69 6e 64 6f 77 2d 66 75 6e 63 74 69 6f  n window-functio
aa30: 6e 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 75  ns that do not u
aa40: 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 0a  se the standard.
aa50: 2a 2a 20 41 50 49 2c 20 67 65 6e 65 72 61 74 65  ** API, generate
aa60: 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   the equivalent 
aa70: 56 4d 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  VM code..*/.stat
aa80: 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 41 67  ic void windowAg
aa90: 67 46 69 6e 61 6c 28 50 61 72 73 65 20 2a 70 50  gFinal(Parse *pP
aaa0: 61 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70 4d  arse, Window *pM
aab0: 57 69 6e 2c 20 69 6e 74 20 62 46 69 6e 61 6c 29  Win, int bFinal)
aac0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
aad0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
aae0: 72 73 65 29 3b 0a 20 20 57 69 6e 64 6f 77 20 2a  rse);.  Window *
aaf0: 70 57 69 6e 3b 0a 0a 20 20 66 6f 72 28 70 57 69  pWin;..  for(pWi
ab00: 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70  n=pMWin; pWin; p
ab10: 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57  Win=pWin->pNextW
ab20: 69 6e 29 7b 0a 20 20 20 20 69 66 28 20 28 70 57  in){.    if( (pW
ab30: 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46  in->pFunc->funcF
ab40: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
ab50: 4e 43 5f 4d 49 4e 4d 41 58 29 20 0a 20 20 20 20  NC_MINMAX) .    
ab60: 20 26 26 20 70 57 69 6e 2d 3e 65 53 74 61 72 74   && pWin->eStart
ab70: 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 0a  !=TK_UNBOUNDED .
ab80: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c      ){.      sql
ab90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
aba0: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57  , OP_Null, 0, pW
abb0: 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a  in->regResult);.
abc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
abd0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61  eAddOp1(v, OP_La
abe0: 73 74 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70  st, pWin->csrApp
abf0: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
ac00: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
ac10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ac20: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
ac30: 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20 30 2c  pWin->csrApp, 0,
ac40: 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74   pWin->regResult
ac50: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ac60: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
ac70: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
ac80: 6e 74 41 64 64 72 28 76 29 2d 32 29 3b 0a 20 20  ntAddr(v)-2);.  
ac90: 20 20 20 20 69 66 28 20 62 46 69 6e 61 6c 20 29      if( bFinal )
aca0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
acb0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
acc0: 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20 70  P_ResetSorter, p
acd0: 57 69 6e 2d 3e 63 73 72 41 70 70 29 3b 0a 20 20  Win->csrApp);.  
ace0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
acf0: 69 66 28 20 70 57 69 6e 2d 3e 72 65 67 41 70 70  if( pWin->regApp
ad00: 20 29 7b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   ){.    }else{. 
ad10: 20 20 20 20 20 69 66 28 20 62 46 69 6e 61 6c 20       if( bFinal 
ad20: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
ad30: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
ad40: 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 57 69  OP_AggFinal, pWi
ad50: 6e 2d 3e 72 65 67 41 63 63 75 6d 2c 20 77 69 6e  n->regAccum, win
ad60: 64 6f 77 41 72 67 43 6f 75 6e 74 28 70 57 69 6e  dowArgCount(pWin
ad70: 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ));.        sqli
ad80: 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
ad90: 76 2c 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2c 20  v, pWin->pFunc, 
ada0: 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P4_FUNCDEF);.   
adb0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
adc0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70  AddOp2(v, OP_Cop
add0: 79 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75  y, pWin->regAccu
ade0: 6d 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75  m, pWin->regResu
adf0: 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  lt);.        sql
ae00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
ae10: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57  , OP_Null, 0, pW
ae20: 69 6e 2d 3e 72 65 67 41 63 63 75 6d 29 3b 0a 20  in->regAccum);. 
ae30: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ae40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ae50: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67 56  ddOp3(v, OP_AggV
ae60: 61 6c 75 65 2c 20 70 57 69 6e 2d 3e 72 65 67 41  alue, pWin->regA
ae70: 63 63 75 6d 2c 20 77 69 6e 64 6f 77 41 72 67 43  ccum, windowArgC
ae80: 6f 75 6e 74 28 70 57 69 6e 29 2c 0a 20 20 20 20  ount(pWin),.    
ae90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aea0: 20 20 20 20 20 20 20 20 20 70 57 69 6e 2d 3e 72           pWin->r
aeb0: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
aec0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70     sqlite3VdbeAp
aed0: 70 65 6e 64 50 34 28 76 2c 20 70 57 69 6e 2d 3e  pendP4(v, pWin->
aee0: 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45  pFunc, P4_FUNCDE
aef0: 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  F);.      }.    
af00: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
af10: 6e 76 6f 6b 65 20 74 68 65 20 73 75 62 2d 72 6f  nvoke the sub-ro
af20: 75 74 69 6e 65 20 61 74 20 72 65 67 47 6f 73 75  utine at regGosu
af30: 62 20 28 67 65 6e 65 72 61 74 65 64 20 62 79 20  b (generated by 
af40: 63 6f 64 65 20 69 6e 20 73 65 6c 65 63 74 2e 63  code in select.c
af50: 29 20 74 6f 0a 2a 2a 20 72 65 74 75 72 6e 20 74  ) to.** return t
af60: 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f  he current row o
af70: 66 20 57 69 6e 64 6f 77 2e 69 45 70 68 43 73 72  f Window.iEphCsr
af80: 2e 20 49 66 20 61 6c 6c 20 77 69 6e 64 6f 77 20  . If all window 
af90: 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 0a 2a 2a  functions are.**
afa0: 20 61 67 67 72 65 67 61 74 65 20 77 69 6e 64 6f   aggregate windo
afb0: 77 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74  w functions that
afc0: 20 75 73 65 20 74 68 65 20 73 74 61 6e 64 61 72   use the standar
afd0: 64 20 41 50 49 2c 20 61 20 73 69 6e 67 6c 65 0a  d API, a single.
afe0: 2a 2a 20 4f 50 5f 47 6f 73 75 62 20 69 6e 73 74  ** OP_Gosub inst
aff0: 72 75 63 74 69 6f 6e 20 69 73 20 61 6c 6c 20 74  ruction is all t
b000: 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hat this routine
b010: 20 67 65 6e 65 72 61 74 65 73 2e 20 45 78 74 72   generates. Extr
b020: 61 20 56 4d 20 63 6f 64 65 0a 2a 2a 20 66 6f 72  a VM code.** for
b030: 20 70 65 72 2d 72 6f 77 20 70 72 6f 63 65 73 73   per-row process
b040: 69 6e 67 20 69 73 20 6f 6e 6c 79 20 67 65 6e 65  ing is only gene
b050: 72 61 74 65 64 20 66 6f 72 20 74 68 65 20 66 6f  rated for the fo
b060: 6c 6c 6f 77 69 6e 67 20 62 75 69 6c 74 2d 69 6e  llowing built-in
b070: 20 77 69 6e 64 6f 77 0a 2a 2a 20 66 75 6e 63 74   window.** funct
b080: 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6e 74  ions:.**.**   nt
b090: 68 5f 76 61 6c 75 65 28 29 0a 2a 2a 20 20 20 66  h_value().**   f
b0a0: 69 72 73 74 5f 76 61 6c 75 65 28 29 0a 2a 2a 20  irst_value().** 
b0b0: 20 20 6c 61 67 28 29 0a 2a 2a 20 20 20 6c 65 61    lag().**   lea
b0c0: 64 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  d().*/.static vo
b0d0: 69 64 20 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f  id windowReturnO
b0e0: 6e 65 52 6f 77 28 0a 20 20 50 61 72 73 65 20 2a  neRow(.  Parse *
b0f0: 70 50 61 72 73 65 2c 0a 20 20 57 69 6e 64 6f 77  pParse,.  Window
b100: 20 2a 70 4d 57 69 6e 2c 0a 20 20 69 6e 74 20 72   *pMWin,.  int r
b110: 65 67 47 6f 73 75 62 2c 0a 20 20 69 6e 74 20 61  egGosub,.  int a
b120: 64 64 72 47 6f 73 75 62 0a 29 7b 0a 20 20 56 64  ddrGosub.){.  Vd
b130: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
b140: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
b150: 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a    Window *pWin;.
b160: 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e    for(pWin=pMWin
b170: 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69  ; pWin; pWin=pWi
b180: 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20  n->pNextWin){.  
b190: 20 20 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63    FuncDef *pFunc
b1a0: 20 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a   = pWin->pFunc;.
b1b0: 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 7a      if( pFunc->z
b1c0: 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e  Name==nth_valueN
b1d0: 61 6d 65 0a 20 20 20 20 20 7c 7c 20 70 46 75 6e  ame.     || pFun
b1e0: 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72 73 74 5f  c->zName==first_
b1f0: 76 61 6c 75 65 4e 61 6d 65 0a 20 20 20 20 29 7b  valueName.    ){
b200: 0a 20 20 20 20 20 20 69 6e 74 20 63 73 72 20 3d  .      int csr =
b210: 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 3b 0a 20   pWin->csrApp;. 
b220: 20 20 20 20 20 69 6e 74 20 6c 62 6c 20 3d 20 73       int lbl = s
b230: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
b240: 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20  bel(pParse);.   
b250: 20 20 20 69 6e 74 20 74 6d 70 52 65 67 20 3d 20     int tmpReg = 
b260: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
b270: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
b280: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b290: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
b2a0: 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c  , pWin->regResul
b2b0: 74 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70  t);..      if( p
b2c0: 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68  Func->zName==nth
b2d0: 5f 76 61 6c 75 65 4e 61 6d 65 20 29 7b 0a 20 20  _valueName ){.  
b2e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b2f0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
b300: 6c 75 6d 6e 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  lumn, pMWin->iEp
b310: 68 43 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67  hCsr, pWin->iArg
b320: 43 6f 6c 2b 31 2c 74 6d 70 52 65 67 29 3b 0a 20  Col+1,tmpReg);. 
b330: 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43 68 65         windowChe
b340: 63 6b 49 6e 74 56 61 6c 75 65 28 70 50 61 72 73  ckIntValue(pPars
b350: 65 2c 20 74 6d 70 52 65 67 2c 20 32 29 3b 0a 20  e, tmpReg, 2);. 
b360: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b370: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b380: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
b390: 67 65 72 2c 20 31 2c 20 74 6d 70 52 65 67 29 3b  ger, 1, tmpReg);
b3a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
b3b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
b3c0: 28 76 2c 20 4f 50 5f 41 64 64 2c 20 74 6d 70 52  (v, OP_Add, tmpR
b3d0: 65 67 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70  eg, pWin->regApp
b3e0: 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20  , tmpReg);.     
b3f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b400: 70 33 28 76 2c 20 4f 50 5f 47 74 2c 20 70 57 69  p3(v, OP_Gt, pWi
b410: 6e 2d 3e 72 65 67 41 70 70 2b 31 2c 20 6c 62 6c  n->regApp+1, lbl
b420: 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20  , tmpReg);.     
b430: 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76   VdbeCoverageNev
b440: 65 72 4e 75 6c 6c 28 76 29 3b 0a 20 20 20 20 20  erNull(v);.     
b450: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b460: 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77  p3(v, OP_SeekRow
b470: 69 64 2c 20 63 73 72 2c 20 30 2c 20 74 6d 70 52  id, csr, 0, tmpR
b480: 65 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  eg);.      VdbeC
b490: 6f 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b 65  overageNeverTake
b4a0: 6e 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  n(v);.      sqli
b4b0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
b4c0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c   OP_Column, csr,
b4d0: 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2c 20   pWin->iArgCol, 
b4e0: 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29  pWin->regResult)
b4f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b500: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
b510: 76 2c 20 6c 62 6c 29 3b 0a 20 20 20 20 20 20 73  v, lbl);.      s
b520: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
b530: 70 52 65 67 28 70 50 61 72 73 65 2c 20 74 6d 70  pReg(pParse, tmp
b540: 52 65 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Reg);.    }.    
b550: 65 6c 73 65 20 69 66 28 20 70 46 75 6e 63 2d 3e  else if( pFunc->
b560: 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65 20  zName==leadName 
b570: 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d  || pFunc->zName=
b580: 3d 6c 61 67 4e 61 6d 65 20 29 7b 0a 20 20 20 20  =lagName ){.    
b590: 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 70 57 69    int nArg = pWi
b5a0: 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69  n->pOwner->x.pLi
b5b0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  st->nExpr;.     
b5c0: 20 69 6e 74 20 63 73 72 20 3d 20 70 57 69 6e 2d   int csr = pWin-
b5d0: 3e 63 73 72 41 70 70 3b 0a 20 20 20 20 20 20 69  >csrApp;.      i
b5e0: 6e 74 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33  nt lbl = sqlite3
b5f0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
b600: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74  arse);.      int
b610: 20 74 6d 70 52 65 67 20 3d 20 73 71 6c 69 74 65   tmpReg = sqlite
b620: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
b630: 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  se);.      int i
b640: 45 70 68 20 3d 20 70 4d 57 69 6e 2d 3e 69 45 70  Eph = pMWin->iEp
b650: 68 43 73 72 3b 0a 0a 20 20 20 20 20 20 69 66 28  hCsr;..      if(
b660: 20 6e 41 72 67 3c 33 20 29 7b 0a 20 20 20 20 20   nArg<3 ){.     
b670: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b680: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
b690: 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73   0, pWin->regRes
b6a0: 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ult);.      }els
b6b0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
b6c0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
b6d0: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 45 70 68 2c  OP_Column, iEph,
b6e0: 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 32   pWin->iArgCol+2
b6f0: 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c  , pWin->regResul
b700: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
b710: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b720: 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c  Op2(v, OP_Rowid,
b730: 20 69 45 70 68 2c 20 74 6d 70 52 65 67 29 3b 0a   iEph, tmpReg);.
b740: 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3c 32        if( nArg<2
b750: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
b760: 76 61 6c 20 3d 20 28 70 46 75 6e 63 2d 3e 7a 4e  val = (pFunc->zN
b770: 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65 20 3f 20  ame==leadName ? 
b780: 31 20 3a 20 2d 31 29 3b 0a 20 20 20 20 20 20 20  1 : -1);.       
b790: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b7a0: 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
b7b0: 20 74 6d 70 52 65 67 2c 20 76 61 6c 29 3b 0a 20   tmpReg, val);. 
b7c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b7d0: 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 28 70 46      int op = (pF
b7e0: 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64  unc->zName==lead
b7f0: 4e 61 6d 65 20 3f 20 4f 50 5f 41 64 64 20 3a 20  Name ? OP_Add : 
b800: 4f 50 5f 53 75 62 74 72 61 63 74 29 3b 0a 20 20  OP_Subtract);.  
b810: 20 20 20 20 20 20 69 6e 74 20 74 6d 70 52 65 67        int tmpReg
b820: 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  2 = sqlite3GetTe
b830: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
b840: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b850: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
b860: 6f 6c 75 6d 6e 2c 20 69 45 70 68 2c 20 70 57 69  olumn, iEph, pWi
b870: 6e 2d 3e 69 41 72 67 43 6f 6c 2b 31 2c 20 74 6d  n->iArgCol+1, tm
b880: 70 52 65 67 32 29 3b 0a 20 20 20 20 20 20 20 20  pReg2);.        
b890: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b8a0: 33 28 76 2c 20 6f 70 2c 20 74 6d 70 52 65 67 32  3(v, op, tmpReg2
b8b0: 2c 20 74 6d 70 52 65 67 2c 20 74 6d 70 52 65 67  , tmpReg, tmpReg
b8c0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
b8d0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
b8e0: 28 70 50 61 72 73 65 2c 20 74 6d 70 52 65 67 32  (pParse, tmpReg2
b8f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
b900: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b910: 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f  Op3(v, OP_SeekRo
b920: 77 69 64 2c 20 63 73 72 2c 20 6c 62 6c 2c 20 74  wid, csr, lbl, t
b930: 6d 70 52 65 67 29 3b 0a 20 20 20 20 20 20 56 64  mpReg);.      Vd
b940: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
b950: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b960: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
b970: 75 6d 6e 2c 20 63 73 72 2c 20 70 57 69 6e 2d 3e  umn, csr, pWin->
b980: 69 41 72 67 43 6f 6c 2c 20 70 57 69 6e 2d 3e 72  iArgCol, pWin->r
b990: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
b9a0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
b9b0: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29  lveLabel(v, lbl)
b9c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
b9d0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
b9e0: 61 72 73 65 2c 20 74 6d 70 52 65 67 29 3b 0a 20  arse, tmpReg);. 
b9f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
ba00: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
ba10: 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 47 6f 73  OP_Gosub, regGos
ba20: 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a  ub, addrGosub);.
ba30: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
ba40: 65 20 63 6f 64 65 20 74 6f 20 73 65 74 20 74 68  e code to set th
ba50: 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65  e accumulator re
ba60: 67 69 73 74 65 72 20 66 6f 72 20 65 61 63 68 20  gister for each 
ba70: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 0a  window function.
ba80: 2a 2a 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64  ** in the linked
ba90: 20 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20   list passed as 
baa0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
bab0: 65 6e 74 20 74 6f 20 4e 55 4c 4c 2e 20 41 6e 64  ent to NULL. And
bac0: 20 70 65 72 66 6f 72 6d 0a 2a 2a 20 61 6e 79 20   perform.** any 
bad0: 65 71 75 69 76 61 6c 65 6e 74 20 69 6e 69 74 69  equivalent initi
bae0: 61 6c 69 7a 61 74 69 6f 6e 20 72 65 71 75 69 72  alization requir
baf0: 65 64 20 62 79 20 61 6e 79 20 62 75 69 6c 74 2d  ed by any built-
bb00: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
bb10: 6f 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 6c 69  ons.** in the li
bb20: 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
bb30: 74 20 77 69 6e 64 6f 77 49 6e 69 74 41 63 63 75  t windowInitAccu
bb40: 6d 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  m(Parse *pParse,
bb50: 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 29 7b   Window *pMWin){
bb60: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
bb70: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
bb80: 73 65 29 3b 0a 20 20 69 6e 74 20 72 65 67 41 72  se);.  int regAr
bb90: 67 3b 0a 20 20 69 6e 74 20 6e 41 72 67 20 3d 20  g;.  int nArg = 
bba0: 30 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69  0;.  Window *pWi
bbb0: 6e 3b 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d  n;.  for(pWin=pM
bbc0: 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d  Win; pWin; pWin=
bbd0: 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b  pWin->pNextWin){
bbe0: 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 46  .    FuncDef *pF
bbf0: 75 6e 63 20 3d 20 70 57 69 6e 2d 3e 70 46 75 6e  unc = pWin->pFun
bc00: 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  c;.    sqlite3Vd
bc10: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
bc20: 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65  ull, 0, pWin->re
bc30: 67 41 63 63 75 6d 29 3b 0a 20 20 20 20 6e 41 72  gAccum);.    nAr
bc40: 67 20 3d 20 4d 41 58 28 6e 41 72 67 2c 20 77 69  g = MAX(nArg, wi
bc50: 6e 64 6f 77 41 72 67 43 6f 75 6e 74 28 70 57 69  ndowArgCount(pWi
bc60: 6e 29 29 3b 0a 20 20 20 20 69 66 28 20 70 46 75  n));.    if( pFu
bc70: 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76  nc->zName==nth_v
bc80: 61 6c 75 65 4e 61 6d 65 0a 20 20 20 20 20 7c 7c  alueName.     ||
bc90: 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66   pFunc->zName==f
bca0: 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65 0a 20  irst_valueName. 
bcb0: 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69     ){.      sqli
bcc0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
bcd0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
bce0: 70 57 69 6e 2d 3e 72 65 67 41 70 70 29 3b 0a 20  pWin->regApp);. 
bcf0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bd00: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
bd10: 65 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d 3e 72  eger, 0, pWin->r
bd20: 65 67 41 70 70 2b 31 29 3b 0a 20 20 20 20 7d 0a  egApp+1);.    }.
bd30: 0a 20 20 20 20 69 66 28 20 28 70 46 75 6e 63 2d  .    if( (pFunc-
bd40: 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
bd50: 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29  ITE_FUNC_MINMAX)
bd60: 20 26 26 20 70 57 69 6e 2d 3e 63 73 72 41 70 70   && pWin->csrApp
bd70: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
bd80: 28 20 70 57 69 6e 2d 3e 65 53 74 61 72 74 21 3d  ( pWin->eStart!=
bd90: 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 3b 0a  TK_UNBOUNDED );.
bda0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
bdb0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
bdc0: 73 65 74 53 6f 72 74 65 72 2c 20 70 57 69 6e 2d  setSorter, pWin-
bdd0: 3e 63 73 72 41 70 70 29 3b 0a 20 20 20 20 20 20  >csrApp);.      
bde0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
bdf0: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
be00: 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70   0, pWin->regApp
be10: 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  +1);.    }.  }. 
be20: 20 72 65 67 41 72 67 20 3d 20 70 50 61 72 73 65   regArg = pParse
be30: 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 70 50 61 72  ->nMem+1;.  pPar
be40: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 41 72 67  se->nMem += nArg
be50: 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 67 41 72  ;.  return regAr
be60: 67 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 74  g;.}../* .** Ret
be70: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
be80: 65 6e 74 69 72 65 20 70 61 72 74 69 74 69 6f 6e  entire partition
be90: 20 73 68 6f 75 6c 64 20 62 65 20 63 61 63 68 65   should be cache
bea0: 64 20 69 6e 20 74 68 65 20 65 70 68 65 6d 65 72  d in the ephemer
beb0: 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 62 65 66 6f  al.** table befo
bec0: 72 65 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e  re processing an
bed0: 79 20 72 6f 77 73 2e 0a 2a 2f 0a 73 74 61 74 69  y rows..*/.stati
bee0: 63 20 69 6e 74 20 77 69 6e 64 6f 77 43 61 63 68  c int windowCach
bef0: 65 50 61 72 74 69 74 69 6f 6e 28 57 69 6e 64 6f  ePartition(Windo
bf00: 77 20 2a 70 4d 57 69 6e 29 7b 0a 20 20 57 69 6e  w *pMWin){.  Win
bf10: 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 66 6f 72  dow *pWin;.  for
bf20: 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69  (pWin=pMWin; pWi
bf30: 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e  n; pWin=pWin->pN
bf40: 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 46 75 6e  extWin){.    Fun
bf50: 63 44 65 66 20 2a 70 46 75 6e 63 20 3d 20 70 57  cDef *pFunc = pW
bf60: 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 69  in->pFunc;.    i
bf70: 66 28 20 28 70 46 75 6e 63 2d 3e 66 75 6e 63 46  f( (pFunc->funcF
bf80: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
bf90: 4e 43 5f 57 49 4e 44 4f 57 5f 53 49 5a 45 29 0a  NC_WINDOW_SIZE).
bfa0: 20 20 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d 3e       || (pFunc->
bfb0: 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65  zName==nth_value
bfc0: 4e 61 6d 65 29 0a 20 20 20 20 20 7c 7c 20 28 70  Name).     || (p
bfd0: 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72  Func->zName==fir
bfe0: 73 74 5f 76 61 6c 75 65 4e 61 6d 65 29 0a 20 20  st_valueName).  
bff0: 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d 3e 7a 4e     || (pFunc->zN
c000: 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65 29 0a 20  ame==leadName). 
c010: 20 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d 3e 7a      || (pFunc->z
c020: 4e 61 6d 65 3d 3d 6c 61 67 4e 61 6d 65 29 0a 20  Name==lagName). 
c030: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
c040: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
c050: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
c060: 2a 0a 2a 2a 20 72 65 67 4f 6c 64 20 61 6e 64 20  *.** regOld and 
c070: 72 65 67 4e 65 77 20 61 72 65 20 65 61 63 68 20  regNew are each 
c080: 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74  the first regist
c090: 65 72 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f  er in an array o
c0a0: 66 20 73 69 7a 65 0a 2a 2a 20 70 4f 72 64 65 72  f size.** pOrder
c0b0: 42 79 2d 3e 6e 45 78 70 72 2e 20 54 68 69 73 20  By->nExpr. This 
c0c0: 66 75 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61 74  function generat
c0d0: 65 73 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70 61  es code to compa
c0e0: 72 65 20 74 68 65 20 74 77 6f 0a 2a 2a 20 61 72  re the two.** ar
c0f0: 72 61 79 73 20 6f 66 20 72 65 67 69 73 74 65 72  rays of register
c100: 73 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c  s using the coll
c110: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20  ation sequences 
c120: 61 6e 64 20 6f 74 68 65 72 20 63 6f 6d 70 61 72  and other compar
c130: 69 73 6f 6e 0a 2a 2a 20 70 61 72 61 6d 65 74 65  ison.** paramete
c140: 72 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20  rs specified by 
c150: 70 4f 72 64 65 72 42 79 2e 20 0a 2a 2a 0a 2a 2a  pOrderBy. .**.**
c160: 20 49 66 20 74 68 65 20 74 77 6f 20 61 72 72 61   If the two arra
c170: 79 73 20 61 72 65 20 6e 6f 74 20 65 71 75 61 6c  ys are not equal
c180: 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
c190: 66 20 72 65 67 4e 65 77 20 69 73 20 63 6f 70 69  f regNew is copi
c1a0: 65 64 20 74 6f 20 0a 2a 2a 20 72 65 67 4f 6c 64  ed to .** regOld
c1b0: 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 66 61 6c   and control fal
c1c0: 6c 73 20 74 68 72 6f 75 67 68 2e 20 4f 74 68 65  ls through. Othe
c1d0: 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 63 6f  rwise, if the co
c1e0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 61 72  ntents of the ar
c1f0: 72 61 79 73 0a 2a 2a 20 61 72 65 20 65 71 75 61  rays.** are equa
c200: 6c 2c 20 61 6e 20 4f 50 5f 47 6f 74 6f 20 69 73  l, an OP_Goto is
c210: 20 65 78 65 63 75 74 65 64 2e 20 54 68 65 20 61   executed. The a
c220: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50  ddress of the OP
c230: 5f 47 6f 74 6f 20 69 73 20 72 65 74 75 72 6e 65  _Goto is returne
c240: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
c250: 20 77 69 6e 64 6f 77 49 66 4e 65 77 50 65 65 72   windowIfNewPeer
c260: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
c270: 65 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  e,.  ExprList *p
c280: 4f 72 64 65 72 42 79 2c 0a 20 20 69 6e 74 20 72  OrderBy,.  int r
c290: 65 67 4e 65 77 2c 20 20 20 20 20 20 20 20 20 20  egNew,          
c2a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
c2b0: 72 73 74 20 69 6e 20 61 72 72 61 79 20 6f 66 20  rst in array of 
c2c0: 6e 65 77 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  new values */.  
c2d0: 69 6e 74 20 72 65 67 4f 6c 64 20 20 20 20 20 20  int regOld      
c2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2f0: 2f 2a 20 46 69 72 73 74 20 69 6e 20 61 72 72 61  /* First in arra
c300: 79 20 6f 66 20 6f 6c 64 20 76 61 6c 75 65 73 20  y of old values 
c310: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
c320: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
c330: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
c340: 61 64 64 72 3b 0a 20 20 69 66 28 20 70 4f 72 64  addr;.  if( pOrd
c350: 65 72 42 79 20 29 7b 0a 20 20 20 20 69 6e 74 20  erBy ){.    int 
c360: 6e 56 61 6c 20 3d 20 70 4f 72 64 65 72 42 79 2d  nVal = pOrderBy-
c370: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 4b 65 79 49  >nExpr;.    KeyI
c380: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
c390: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72  sqlite3KeyInfoFr
c3a0: 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
c3b0: 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 2c 20  e, pOrderBy, 0, 
c3c0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
c3d0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
c3e0: 43 6f 6d 70 61 72 65 2c 20 72 65 67 4f 6c 64 2c  Compare, regOld,
c3f0: 20 72 65 67 4e 65 77 2c 20 6e 56 61 6c 29 3b 0a   regNew, nVal);.
c400: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c410: 70 70 65 6e 64 50 34 28 76 2c 20 28 76 6f 69 64  ppendP4(v, (void
c420: 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
c430: 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 61 64 64  EYINFO);.    add
c440: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
c450: 64 64 4f 70 33 28 0a 20 20 20 20 20 20 20 20 76  ddOp3(.        v
c460: 2c 20 4f 50 5f 4a 75 6d 70 2c 20 73 71 6c 69 74  , OP_Jump, sqlit
c470: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
c480: 72 28 76 29 2b 31 2c 20 30 2c 20 73 71 6c 69 74  r(v)+1, 0, sqlit
c490: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
c4a0: 72 28 76 29 2b 31 0a 20 20 20 20 20 20 20 20 29  r(v)+1.        )
c4b0: 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
c4c0: 67 65 45 71 4e 65 28 76 29 3b 0a 20 20 20 20 73  geEqNe(v);.    s
c4d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
c4e0: 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67  (v, OP_Copy, reg
c4f0: 4e 65 77 2c 20 72 65 67 4f 6c 64 2c 20 6e 56 61  New, regOld, nVa
c500: 6c 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  l-1);.  }else{. 
c510: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
c520: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
c530: 50 5f 47 6f 74 6f 29 3b 0a 20 20 7d 0a 20 20 72  P_Goto);.  }.  r
c540: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 74  eturn addr;.}..t
c550: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57 69  ypedef struct Wi
c560: 6e 64 6f 77 43 6f 64 65 41 72 67 20 57 69 6e 64  ndowCodeArg Wind
c570: 6f 77 43 6f 64 65 41 72 67 3b 0a 74 79 70 65 64  owCodeArg;.typed
c580: 65 66 20 73 74 72 75 63 74 20 57 69 6e 64 6f 77  ef struct Window
c590: 43 73 72 41 6e 64 52 65 67 20 57 69 6e 64 6f 77  CsrAndReg Window
c5a0: 43 73 72 41 6e 64 52 65 67 3b 0a 73 74 72 75 63  CsrAndReg;.struc
c5b0: 74 20 57 69 6e 64 6f 77 43 73 72 41 6e 64 52 65  t WindowCsrAndRe
c5c0: 67 20 7b 0a 20 20 69 6e 74 20 63 73 72 3b 0a 20  g {.  int csr;. 
c5d0: 20 69 6e 74 20 72 65 67 3b 0a 7d 3b 0a 73 74 72   int reg;.};.str
c5e0: 75 63 74 20 57 69 6e 64 6f 77 43 6f 64 65 41 72  uct WindowCodeAr
c5f0: 67 20 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  g {.  Parse *pPa
c600: 72 73 65 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70  rse;.  Window *p
c610: 4d 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 70 56  MWin;.  Vdbe *pV
c620: 64 62 65 3b 0a 20 20 69 6e 74 20 72 65 67 47 6f  dbe;.  int regGo
c630: 73 75 62 3b 0a 20 20 69 6e 74 20 61 64 64 72 47  sub;.  int addrG
c640: 6f 73 75 62 3b 0a 20 20 69 6e 74 20 72 65 67 41  osub;.  int regA
c650: 72 67 3b 0a 0a 20 20 57 69 6e 64 6f 77 43 73 72  rg;..  WindowCsr
c660: 41 6e 64 52 65 67 20 73 74 61 72 74 3b 0a 20 20  AndReg start;.  
c670: 57 69 6e 64 6f 77 43 73 72 41 6e 64 52 65 67 20  WindowCsrAndReg 
c680: 63 75 72 72 65 6e 74 3b 0a 20 20 57 69 6e 64 6f  current;.  Windo
c690: 77 43 73 72 41 6e 64 52 65 67 20 65 6e 64 3b 0a  wCsrAndReg end;.
c6a0: 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 57 49 4e 44  };..#define WIND
c6b0: 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 20 31 0a  OW_RETURN_ROW 1.
c6c0: 23 64 65 66 69 6e 65 20 57 49 4e 44 4f 57 5f 41  #define WINDOW_A
c6d0: 47 47 49 4e 56 45 52 53 45 20 32 0a 23 64 65 66  GGINVERSE 2.#def
c6e0: 69 6e 65 20 57 49 4e 44 4f 57 5f 41 47 47 53 54  ine WINDOW_AGGST
c6f0: 45 50 20 20 20 20 33 0a 0a 2f 2a 0a 2a 2a 20 47  EP    3../*.** G
c700: 65 6e 65 72 61 74 65 20 56 4d 20 63 6f 64 65 20  enerate VM code 
c710: 74 6f 20 72 65 61 64 20 74 68 65 20 77 69 6e 64  to read the wind
c720: 6f 77 20 66 72 61 6d 65 73 20 70 65 65 72 20 76  ow frames peer v
c730: 61 6c 75 65 73 20 66 72 6f 6d 20 63 75 72 73 6f  alues from curso
c740: 72 20 63 73 72 20 69 6e 74 6f 0a 2a 2a 20 61 6e  r csr into.** an
c750: 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   array of regist
c760: 65 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  ers starting at 
c770: 72 65 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  reg..*/.static v
c780: 6f 69 64 20 77 69 6e 64 6f 77 52 65 61 64 50 65  oid windowReadPe
c790: 65 72 56 61 6c 75 65 73 28 0a 20 20 57 69 6e 64  erValues(.  Wind
c7a0: 6f 77 43 6f 64 65 41 72 67 20 2a 70 2c 0a 20 20  owCodeArg *p,.  
c7b0: 69 6e 74 20 63 73 72 2c 0a 20 20 69 6e 74 20 72  int csr,.  int r
c7c0: 65 67 0a 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a  eg.){.  Window *
c7d0: 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 4d 57 69 6e  pMWin = p->pMWin
c7e0: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  ;.  ExprList *pO
c7f0: 72 64 65 72 42 79 20 3d 20 70 4d 57 69 6e 2d 3e  rderBy = pMWin->
c800: 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20  pOrderBy;.  if( 
c810: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
c820: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
c830: 33 47 65 74 56 64 62 65 28 70 2d 3e 70 50 61 72  3GetVdbe(p->pPar
c840: 73 65 29 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  se);.    ExprLis
c850: 74 20 2a 70 50 61 72 74 20 3d 20 70 4d 57 69 6e  t *pPart = pMWin
c860: 2d 3e 70 50 61 72 74 69 74 69 6f 6e 3b 0a 20 20  ->pPartition;.  
c870: 20 20 69 6e 74 20 69 43 6f 6c 4f 66 66 20 3d 20    int iColOff = 
c880: 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f  pMWin->nBufferCo
c890: 6c 20 2b 20 28 70 50 61 72 74 20 3f 20 70 50 61  l + (pPart ? pPa
c8a0: 72 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a  rt->nExpr : 0);.
c8b0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
c8c0: 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72  or(i=0; i<pOrder
c8d0: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
c8e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c8f0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
c900: 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20 69 43 6f 6c  olumn, csr, iCol
c910: 4f 66 66 2b 69 2c 20 72 65 67 2b 69 29 3b 0a 20  Off+i, reg+i);. 
c920: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74     }.  }.}..stat
c930: 69 63 20 69 6e 74 20 77 69 6e 64 6f 77 43 6f 64  ic int windowCod
c940: 65 4f 70 28 0a 20 57 69 6e 64 6f 77 43 6f 64 65  eOp(. WindowCode
c950: 41 72 67 20 2a 70 2c 0a 20 69 6e 74 20 6f 70 2c  Arg *p,. int op,
c960: 0a 20 69 6e 74 20 72 65 67 43 6f 75 6e 74 64 6f  . int regCountdo
c970: 77 6e 2c 0a 20 69 6e 74 20 6a 75 6d 70 4f 6e 45  wn,. int jumpOnE
c980: 6f 66 0a 29 7b 0a 20 20 69 6e 74 20 63 73 72 2c  of.){.  int csr,
c990: 20 72 65 67 3b 0a 20 20 50 61 72 73 65 20 2a 70   reg;.  Parse *p
c9a0: 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73  Parse = p->pPars
c9b0: 65 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57  e;.  Window *pMW
c9c0: 69 6e 20 3d 20 70 2d 3e 70 4d 57 69 6e 3b 0a 20  in = p->pMWin;. 
c9d0: 20 69 6e 74 20 72 65 74 20 3d 20 30 3b 0a 20 20   int ret = 0;.  
c9e0: 56 64 62 65 20 2a 76 20 3d 20 70 2d 3e 70 56 64  Vdbe *v = p->pVd
c9f0: 62 65 3b 0a 20 20 69 6e 74 20 61 64 64 72 49 66  be;.  int addrIf
ca00: 20 3d 20 30 3b 20 0a 20 20 69 6e 74 20 61 64 64   = 0; .  int add
ca10: 72 43 6f 6e 74 69 6e 75 65 20 3d 20 30 3b 0a 20  rContinue = 0;. 
ca20: 20 69 6e 74 20 61 64 64 72 47 6f 74 6f 20 3d 20   int addrGoto = 
ca30: 30 3b 0a 20 20 69 6e 74 20 62 50 65 65 72 20 3d  0;.  int bPeer =
ca40: 20 28 70 4d 57 69 6e 2d 3e 65 54 79 70 65 21 3d   (pMWin->eType!=
ca50: 54 4b 5f 52 4f 57 53 29 3b 0a 0a 20 20 2f 2a 20  TK_ROWS);..  /* 
ca60: 53 70 65 63 69 61 6c 20 63 61 73 65 20 2d 20 57  Special case - W
ca70: 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45  INDOW_AGGINVERSE
ca80: 20 69 73 20 61 6c 77 61 79 73 20 61 20 6e 6f 2d   is always a no-
ca90: 6f 70 20 69 66 20 74 68 65 20 66 72 61 6d 65 0a  op if the frame.
caa0: 20 20 2a 2a 20 73 74 61 72 74 73 20 77 69 74 68    ** starts with
cab0: 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45   UNBOUNDED PRECE
cac0: 44 49 4e 47 2e 20 2a 2f 0a 20 20 69 66 28 20 6f  DING. */.  if( o
cad0: 70 3d 3d 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56  p==WINDOW_AGGINV
cae0: 45 52 53 45 20 26 26 20 70 4d 57 69 6e 2d 3e 65  ERSE && pMWin->e
caf0: 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e  Start==TK_UNBOUN
cb00: 44 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72  DED ){.    asser
cb10: 74 28 20 72 65 67 43 6f 75 6e 74 64 6f 77 6e 3d  t( regCountdown=
cb20: 3d 30 20 26 26 20 6a 75 6d 70 4f 6e 45 6f 66 3d  =0 && jumpOnEof=
cb30: 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
cb40: 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72   0;.  }..  if( r
cb50: 65 67 43 6f 75 6e 74 64 6f 77 6e 3e 30 20 29 7b  egCountdown>0 ){
cb60: 0a 20 20 20 20 61 64 64 72 49 66 20 3d 20 73 71  .    addrIf = sq
cb70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
cb80: 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 72 65 67  v, OP_IfPos, reg
cb90: 43 6f 75 6e 74 64 6f 77 6e 2c 20 30 2c 20 31 29  Countdown, 0, 1)
cba0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f 70 3d  ;.  }..  if( op=
cbb0: 3d 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52  =WINDOW_RETURN_R
cbc0: 4f 57 20 29 7b 0a 20 20 20 20 77 69 6e 64 6f 77  OW ){.    window
cbd0: 41 67 67 46 69 6e 61 6c 28 70 50 61 72 73 65 2c  AggFinal(pParse,
cbe0: 20 70 4d 57 69 6e 2c 20 30 29 3b 0a 20 20 7d 0a   pMWin, 0);.  }.
cbf0: 20 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 20 3d    addrContinue =
cc00: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
cc10: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 73 77  entAddr(v);.  sw
cc20: 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
cc30: 63 61 73 65 20 57 49 4e 44 4f 57 5f 52 45 54 55  case WINDOW_RETU
cc40: 52 4e 5f 52 4f 57 3a 0a 20 20 20 20 20 20 63 73  RN_ROW:.      cs
cc50: 72 20 3d 20 70 2d 3e 63 75 72 72 65 6e 74 2e 63  r = p->current.c
cc60: 73 72 3b 0a 20 20 20 20 20 20 72 65 67 20 3d 20  sr;.      reg = 
cc70: 70 2d 3e 63 75 72 72 65 6e 74 2e 72 65 67 3b 0a  p->current.reg;.
cc80: 20 20 20 20 20 20 77 69 6e 64 6f 77 52 65 74 75        windowRetu
cc90: 72 6e 4f 6e 65 52 6f 77 28 70 50 61 72 73 65 2c  rnOneRow(pParse,
cca0: 20 70 4d 57 69 6e 2c 20 70 2d 3e 72 65 67 47 6f   pMWin, p->regGo
ccb0: 73 75 62 2c 20 70 2d 3e 61 64 64 72 47 6f 73 75  sub, p->addrGosu
ccc0: 62 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  b);.      break;
ccd0: 0a 0a 20 20 20 20 63 61 73 65 20 57 49 4e 44 4f  ..    case WINDO
cce0: 57 5f 41 47 47 49 4e 56 45 52 53 45 3a 0a 20 20  W_AGGINVERSE:.  
ccf0: 20 20 20 20 63 73 72 20 3d 20 70 2d 3e 73 74 61      csr = p->sta
cd00: 72 74 2e 63 73 72 3b 0a 20 20 20 20 20 20 72 65  rt.csr;.      re
cd10: 67 20 3d 20 70 2d 3e 73 74 61 72 74 2e 72 65 67  g = p->start.reg
cd20: 3b 0a 20 20 20 20 20 20 77 69 6e 64 6f 77 41 67  ;.      windowAg
cd30: 67 53 74 65 70 28 70 50 61 72 73 65 2c 20 70 4d  gStep(pParse, pM
cd40: 57 69 6e 2c 20 63 73 72 2c 20 31 2c 20 70 2d 3e  Win, csr, 1, p->
cd50: 72 65 67 41 72 67 2c 20 70 4d 57 69 6e 2d 3e 72  regArg, pMWin->r
cd60: 65 67 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 62  egSize);.      b
cd70: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
cd80: 57 49 4e 44 4f 57 5f 41 47 47 53 54 45 50 3a 0a  WINDOW_AGGSTEP:.
cd90: 20 20 20 20 20 20 63 73 72 20 3d 20 70 2d 3e 65        csr = p->e
cda0: 6e 64 2e 63 73 72 3b 0a 20 20 20 20 20 20 72 65  nd.csr;.      re
cdb0: 67 20 3d 20 70 2d 3e 65 6e 64 2e 72 65 67 3b 0a  g = p->end.reg;.
cdc0: 20 20 20 20 20 20 77 69 6e 64 6f 77 41 67 67 53        windowAggS
cdd0: 74 65 70 28 70 50 61 72 73 65 2c 20 70 4d 57 69  tep(pParse, pMWi
cde0: 6e 2c 20 63 73 72 2c 20 30 2c 20 70 2d 3e 72 65  n, csr, 0, p->re
cdf0: 67 41 72 67 2c 20 70 4d 57 69 6e 2d 3e 72 65 67  gArg, pMWin->reg
ce00: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 62 72 65  Size);.      bre
ce10: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6a  ak;.  }..  if( j
ce20: 75 6d 70 4f 6e 45 6f 66 20 29 7b 0a 20 20 20 20  umpOnEof ){.    
ce30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ce40: 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 63 73  2(v, OP_Next, cs
ce50: 72 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  r, sqlite3VdbeCu
ce60: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b  rrentAddr(v)+2);
ce70: 0a 20 20 20 20 72 65 74 20 3d 20 73 71 6c 69 74  .    ret = sqlit
ce80: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
ce90: 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 7d 65 6c 73  OP_Goto);.  }els
cea0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e{.    sqlite3Vd
ceb0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
cec0: 65 78 74 2c 20 63 73 72 2c 20 73 71 6c 69 74 65  ext, csr, sqlite
ced0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
cee0: 28 76 29 2b 31 2b 62 50 65 65 72 29 3b 0a 20 20  (v)+1+bPeer);.  
cef0: 20 20 69 66 28 20 62 50 65 65 72 20 29 7b 0a 20    if( bPeer ){. 
cf00: 20 20 20 20 20 61 64 64 72 47 6f 74 6f 20 3d 20       addrGoto = 
cf10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cf20: 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20  0(v, OP_Goto);. 
cf30: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
cf40: 62 50 65 65 72 20 29 7b 0a 20 20 20 20 69 6e 74  bPeer ){.    int
cf50: 20 61 64 64 72 3b 0a 20 20 20 20 69 6e 74 20 6e   addr;.    int n
cf60: 52 65 67 20 3d 20 28 70 4d 57 69 6e 2d 3e 70 4f  Reg = (pMWin->pO
cf70: 72 64 65 72 42 79 20 3f 20 70 4d 57 69 6e 2d 3e  rderBy ? pMWin->
cf80: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
cf90: 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74 20 72 65  : 0);.    int re
cfa0: 67 54 6d 70 20 3d 20 28 6e 52 65 67 20 3f 20 73  gTmp = (nReg ? s
cfb0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
cfc0: 67 65 28 70 50 61 72 73 65 2c 20 6e 52 65 67 29  ge(pParse, nReg)
cfd0: 20 3a 20 30 29 3b 0a 20 20 20 20 77 69 6e 64 6f   : 0);.    windo
cfe0: 77 52 65 61 64 50 65 65 72 56 61 6c 75 65 73 28  wReadPeerValues(
cff0: 70 2c 20 63 73 72 2c 20 72 65 67 54 6d 70 29 3b  p, csr, regTmp);
d000: 0a 20 20 20 20 61 64 64 72 20 3d 20 77 69 6e 64  .    addr = wind
d010: 6f 77 49 66 4e 65 77 50 65 65 72 28 70 50 61 72  owIfNewPeer(pPar
d020: 73 65 2c 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65  se, pMWin->pOrde
d030: 72 42 79 2c 20 72 65 67 54 6d 70 2c 20 72 65 67  rBy, regTmp, reg
d040: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
d050: 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64  beChangeP2(v, ad
d060: 64 72 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65  dr, addrContinue
d070: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
d080: 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
d090: 50 61 72 73 65 2c 20 72 65 67 54 6d 70 2c 20 6e  Parse, regTmp, n
d0a0: 52 65 67 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  Reg);.  }..  if(
d0b0: 20 61 64 64 72 47 6f 74 6f 20 29 20 73 71 6c 69   addrGoto ) sqli
d0c0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
d0d0: 76 2c 20 61 64 64 72 47 6f 74 6f 29 3b 0a 20 20  v, addrGoto);.  
d0e0: 69 66 28 20 61 64 64 72 49 66 20 29 20 73 71 6c  if( addrIf ) sql
d0f0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
d100: 28 76 2c 20 61 64 64 72 49 66 29 3b 0a 20 20 72  (v, addrIf);.  r
d110: 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a  eturn ret;.}../*
d120: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
d130: 6e 20 2d 20 77 69 6e 64 6f 77 43 6f 64 65 53 74  n - windowCodeSt
d140: 65 70 28 29 20 2d 20 67 65 6e 65 72 61 74 65 73  ep() - generates
d150: 20 74 68 65 20 56 4d 20 63 6f 64 65 20 74 68 61   the VM code tha
d160: 74 20 72 65 61 64 73 20 64 61 74 61 0a 2a 2a 20  t reads data.** 
d170: 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 73 65 6c  from the sub-sel
d180: 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e 73 20  ect and returns 
d190: 72 6f 77 73 20 74 6f 20 74 68 65 20 63 6f 6e 73  rows to the cons
d1a0: 75 6d 65 72 2e 20 46 6f 72 20 74 68 65 20 73 69  umer. For the si
d1b0: 6d 70 6c 65 73 74 0a 2a 2a 20 63 61 73 65 3a 0a  mplest.** case:.
d1c0: 2a 2a 0a 2a 2a 20 20 20 20 20 52 4f 57 53 20 42  **.**     ROWS B
d1d0: 45 54 57 45 45 4e 20 3c 65 78 70 72 31 3e 20 50  ETWEEN <expr1> P
d1e0: 52 45 43 45 44 49 4e 47 20 41 4e 44 20 3c 65 78  RECEDING AND <ex
d1f0: 70 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a  pr2> FOLLOWING.*
d200: 2a 0a 2a 2a 20 54 68 65 20 56 4d 20 63 6f 64 65  *.** The VM code
d210: 20 67 65 6e 65 72 61 74 65 64 20 69 73 20 65 71   generated is eq
d220: 75 69 76 61 6c 65 6e 74 20 69 6e 20 73 70 69 72  uivalent in spir
d230: 69 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  it to the follow
d240: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 77  ing:.**.**     w
d250: 68 69 6c 65 28 20 21 65 6f 66 20 29 7b 0a 2a 2a  hile( !eof ){.**
d260: 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 20 70         if( new p
d270: 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20  artition ){.**  
d280: 20 20 20 20 20 20 20 47 6f 73 75 62 20 66 6c 75         Gosub flu
d290: 73 68 0a 2a 2a 20 20 20 20 20 20 20 7d 20 20 20  sh.**       }   
d2a0: 20 0a 2a 2a 20 20 20 20 20 20 20 49 6e 73 65 72   .**       Inser
d2b0: 74 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20 65  t new row into e
d2c0: 70 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20  ph table..**    
d2d0: 20 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 66   .**       if( f
d2e0: 69 72 73 74 20 72 6f 77 20 6f 66 20 70 61 72 74  irst row of part
d2f0: 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20  ition ){.**     
d300: 20 20 20 20 52 65 77 69 6e 64 28 63 73 72 45 6e      Rewind(csrEn
d310: 64 2c 20 73 6b 69 70 4e 65 78 74 3d 31 29 0a 2a  d, skipNext=1).*
d320: 2a 20 20 20 20 20 20 20 20 20 52 65 77 69 6e 64  *         Rewind
d330: 28 73 74 61 72 74 2e 63 73 72 2c 20 73 6b 69 70  (start.csr, skip
d340: 4e 65 78 74 3d 31 29 0a 2a 2a 20 20 20 20 20 20  Next=1).**      
d350: 20 20 20 52 65 77 69 6e 64 28 63 73 72 43 75 72     Rewind(csrCur
d360: 72 65 6e 74 2c 20 73 6b 69 70 4e 65 78 74 3d 31  rent, skipNext=1
d370: 29 0a 2a 2a 20 20 20 20 20 0a 2a 2a 20 20 20 20  ).**     .**    
d380: 20 20 20 20 20 72 65 67 45 6e 64 20 3d 20 3c 65       regEnd = <e
d390: 78 70 72 32 3e 20 20 20 20 20 20 20 20 20 20 2f  xpr2>          /
d3a0: 2f 20 46 4f 4c 4c 4f 57 49 4e 47 20 65 78 70 72  / FOLLOWING expr
d3b0: 65 73 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20  ession.**       
d3c0: 20 20 72 65 67 53 74 61 72 74 20 3d 20 3c 65 78    regStart = <ex
d3d0: 70 72 31 3e 20 20 20 20 20 20 20 20 2f 2f 20 50  pr1>        // P
d3e0: 52 45 43 45 44 49 4e 47 20 65 78 70 72 65 73 73  RECEDING express
d3f0: 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 7d 65 6c  ion.**       }el
d400: 73 65 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 69  se{.**         i
d410: 66 28 20 28 72 65 67 45 6e 64 2d 2d 29 3c 3d 30  f( (regEnd--)<=0
d420: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   ){.**          
d430: 20 4e 65 78 74 28 63 73 72 43 75 72 72 65 6e 74   Next(csrCurrent
d440: 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 52  ).**           R
d450: 65 74 75 72 6e 20 6f 6e 65 20 72 6f 77 2e 0a 2a  eturn one row..*
d460: 2a 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20  *           if( 
d470: 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 30 20 29  (regStart--)<0 )
d480: 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  {.**            
d490: 20 4e 65 78 74 28 73 74 61 72 74 2e 63 73 72 29   Next(start.csr)
d4a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
d4b0: 41 67 67 49 6e 76 65 72 73 65 28 73 74 61 72 74  AggInverse(start
d4c0: 2e 63 73 72 29 0a 2a 2a 20 20 20 20 20 20 20 20  .csr).**        
d4d0: 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20     }.**         
d4e0: 7d 0a 2a 2a 20 20 20 20 20 20 20 7d 20 20 20 20  }.**       }    
d4f0: 0a 2a 2a 20 20 20 20 20 0a 2a 2a 20 20 20 20 20  .**     .**     
d500: 20 20 4e 65 78 74 28 63 73 72 45 6e 64 29 0a 2a    Next(csrEnd).*
d510: 2a 20 20 20 20 20 20 20 41 67 67 53 74 65 70 28  *       AggStep(
d520: 63 73 72 45 6e 64 29 0a 2a 2a 20 20 20 20 20 7d  csrEnd).**     }
d530: 20 20 20 20 0a 2a 2a 20 20 20 20 20 66 6c 75 73      .**     flus
d540: 68 3a 0a 2a 2a 20 20 20 20 20 20 20 77 68 69 6c  h:.**       whil
d550: 65 28 20 31 20 29 7b 20 0a 2a 2a 20 20 20 20 20  e( 1 ){ .**     
d560: 20 20 20 20 4e 65 78 74 28 63 73 72 43 75 72 72      Next(csrCurr
d570: 65 6e 74 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  ent).**         
d580: 69 66 28 20 65 6f 66 20 29 20 62 72 65 61 6b 0a  if( eof ) break.
d590: 2a 2a 20 20 20 20 20 20 20 20 20 52 65 74 75 72  **         Retur
d5a0: 6e 20 6f 6e 65 20 72 6f 77 2e 0a 2a 2a 20 20 20  n one row..**   
d5b0: 20 20 20 20 20 20 69 66 28 20 28 72 65 67 53 74        if( (regSt
d5c0: 61 72 74 2d 2d 29 3c 30 20 29 7b 0a 2a 2a 20 20  art--)<0 ){.**  
d5d0: 20 20 20 20 20 20 20 20 20 4e 65 78 74 28 73 74           Next(st
d5e0: 61 72 74 2e 63 73 72 29 0a 2a 2a 20 20 20 20 20  art.csr).**     
d5f0: 20 20 20 20 20 20 41 67 67 49 6e 76 65 72 73 65        AggInverse
d600: 28 73 74 61 72 74 2e 63 73 72 29 0a 2a 2a 20 20  (start.csr).**  
d610: 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
d620: 20 20 7d 20 20 20 20 0a 2a 2a 20 20 20 20 20 20    }    .**      
d630: 20 45 6d 70 74 79 20 65 70 68 20 74 61 62 6c 65   Empty eph table
d640: 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 67 65 6e  ..**.** More gen
d650: 65 72 61 6c 6c 79 2c 20 74 68 65 20 70 61 74 74  erally, the patt
d660: 65 72 6e 20 75 73 65 64 20 66 6f 72 20 61 6c 6c  ern used for all
d670: 20 77 69 6e 64 6f 77 20 74 79 70 65 73 20 69 73   window types is
d680: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 77 68 69 6c  :.**.**     whil
d690: 65 28 20 21 65 6f 66 20 29 7b 0a 2a 2a 20 20 20  e( !eof ){.**   
d6a0: 20 20 20 20 69 66 28 20 6e 65 77 20 70 61 72 74      if( new part
d6b0: 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20  ition ){.**     
d6c0: 20 20 20 20 47 6f 73 75 62 20 66 6c 75 73 68 0a      Gosub flush.
d6d0: 2a 2a 20 20 20 20 20 20 20 7d 20 20 20 20 0a 2a  **       }    .*
d6e0: 2a 20 20 20 20 20 20 20 49 6e 73 65 72 74 20 6e  *       Insert n
d6f0: 65 77 20 72 6f 77 20 69 6e 74 6f 20 65 70 68 20  ew row into eph 
d700: 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 20 20  table..**       
d710: 69 66 28 20 66 69 72 73 74 20 72 6f 77 20 6f 66  if( first row of
d720: 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a   partition ){.**
d730: 20 20 20 20 20 20 20 20 20 46 49 52 53 54 5f 52           FIRST_R
d740: 4f 57 5f 43 4f 44 45 0a 2a 2a 20 20 20 20 20 20  OW_CODE.**      
d750: 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20 20 20 20   }else{.**      
d760: 20 20 20 53 45 43 4f 4e 44 5f 52 4f 57 5f 43 4f     SECOND_ROW_CO
d770: 44 45 0a 2a 2a 20 20 20 20 20 20 20 7d 20 20 20  DE.**       }   
d780: 20 0a 2a 2a 20 20 20 20 20 20 20 41 4c 4c 5f 52   .**       ALL_R
d790: 4f 57 5f 43 4f 44 45 0a 2a 2a 20 20 20 20 20 7d  OW_CODE.**     }
d7a0: 20 20 20 20 0a 2a 2a 20 20 20 20 20 66 6c 75 73      .**     flus
d7b0: 68 3a 0a 2a 2a 20 20 20 20 20 20 20 46 4c 55 53  h:.**       FLUS
d7c0: 48 5f 43 4f 44 45 0a 2a 2a 20 20 20 20 20 20 20  H_CODE.**       
d7d0: 45 6d 70 74 79 20 65 70 68 20 74 61 62 6c 65 2e  Empty eph table.
d7e0: 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  .**.*/.static vo
d7f0: 69 64 20 77 69 6e 64 6f 77 43 6f 64 65 53 74 65  id windowCodeSte
d800: 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  p(.  Parse *pPar
d810: 73 65 2c 20 0a 20 20 53 65 6c 65 63 74 20 2a 70  se, .  Select *p
d820: 2c 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  ,.  WhereInfo *p
d830: 57 49 6e 66 6f 2c 0a 20 20 69 6e 74 20 72 65 67  WInfo,.  int reg
d840: 47 6f 73 75 62 2c 20 0a 20 20 69 6e 74 20 61 64  Gosub, .  int ad
d850: 64 72 47 6f 73 75 62 0a 29 7b 0a 20 20 57 69 6e  drGosub.){.  Win
d860: 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e  dow *pMWin = p->
d870: 70 57 69 6e 3b 0a 20 20 45 78 70 72 4c 69 73 74  pWin;.  ExprList
d880: 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 4d 57   *pOrderBy = pMW
d890: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  in->pOrderBy;.  
d8a0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
d8b0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
d8c0: 3b 0a 20 20 69 6e 74 20 72 65 67 46 6c 75 73 68  ;.  int regFlush
d8d0: 50 61 72 74 3b 20 20 20 20 20 20 20 20 20 20 20  Part;           
d8e0: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
d8f0: 66 6f 72 20 22 47 6f 73 75 62 20 66 6c 75 73 68  for "Gosub flush
d900: 5f 70 61 72 74 69 74 69 6f 6e 22 20 2a 2f 0a 0a  _partition" */..
d910: 20 20 69 6e 74 20 72 65 67 41 72 67 3b 0a 20 20    int regArg;.  
d920: 69 6e 74 20 63 73 72 57 72 69 74 65 20 3d 20 70  int csrWrite = p
d930: 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2b 31 3b  MWin->iEphCsr+1;
d940: 0a 0a 20 20 69 6e 74 20 69 53 75 62 43 73 72 20  ..  int iSubCsr 
d950: 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  = p->pSrc->a[0].
d960: 69 43 75 72 73 6f 72 3b 20 20 20 20 20 20 2f 2a  iCursor;      /*
d970: 20 43 75 72 73 6f 72 20 6f 66 20 73 75 62 2d 73   Cursor of sub-s
d980: 65 6c 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  elect */.  int n
d990: 53 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  Sub = p->pSrc->a
d9a0: 5b 30 5d 2e 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  [0].pTab->nCol; 
d9b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
d9c0: 66 20 63 6f 6c 73 20 72 65 74 75 72 6e 65 64 20  f cols returned 
d9d0: 62 79 20 73 75 62 20 2a 2f 0a 20 20 69 6e 74 20  by sub */.  int 
d9e0: 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  iCol;           
d9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da00: 20 20 20 20 20 20 2f 2a 20 54 6f 20 69 74 65 72        /* To iter
da10: 61 74 65 20 74 68 72 6f 75 67 68 20 73 75 62 20  ate through sub 
da20: 63 6f 6c 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 61  cols */..  int a
da30: 64 64 72 47 6f 74 6f 3b 0a 20 20 69 6e 74 20 61  ddrGoto;.  int a
da40: 64 64 72 49 66 3b 0a 20 20 69 6e 74 20 61 64 64  ddrIf;.  int add
da50: 72 47 6f 73 75 62 46 6c 75 73 68 3b 0a 20 20 69  rGosubFlush;.  i
da60: 6e 74 20 61 64 64 72 49 6e 74 65 67 65 72 3b 0a  nt addrInteger;.
da70: 20 20 69 6e 74 20 61 64 64 72 43 61 63 68 65 52    int addrCacheR
da80: 65 77 69 6e 64 3b 0a 20 20 69 6e 74 20 61 64 64  ewind;.  int add
da90: 72 43 61 63 68 65 4e 65 78 74 3b 0a 0a 20 20 69  rCacheNext;..  i
daa0: 6e 74 20 61 64 64 72 53 68 6f 72 74 63 75 74 20  nt addrShortcut 
dab0: 3d 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72 45  = 0;.  int addrE
dac0: 6d 70 74 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  mpty = 0;.  int 
dad0: 61 64 64 72 50 65 65 72 4a 75 6d 70 20 3d 20 30  addrPeerJump = 0
dae0: 3b 0a 0a 20 20 69 6e 74 20 62 43 61 63 68 65 20  ;..  int bCache 
daf0: 3d 20 77 69 6e 64 6f 77 43 61 63 68 65 50 61 72  = windowCachePar
db00: 74 69 74 69 6f 6e 28 70 4d 57 69 6e 29 3b 0a 0a  tition(pMWin);..
db10: 20 20 69 6e 74 20 72 65 67 53 74 61 72 74 20 3d    int regStart =
db20: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
db30: 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 3c 65    /* Value of <e
db40: 78 70 72 3e 20 50 52 45 43 45 44 49 4e 47 20 2a  xpr> PRECEDING *
db50: 2f 0a 20 20 69 6e 74 20 72 65 67 45 6e 64 20 3d  /.  int regEnd =
db60: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
db70: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20      /* Value of 
db80: 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47  <expr> FOLLOWING
db90: 20 2a 2f 0a 0a 20 20 69 6e 74 20 72 65 67 20 3d   */..  int reg =
dba0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
dbb0: 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64  .  int regRecord
dbc0: 20 3d 20 72 65 67 2b 6e 53 75 62 3b 0a 20 20 69   = reg+nSub;.  i
dbd0: 6e 74 20 72 65 67 52 6f 77 69 64 20 3d 20 72 65  nt regRowid = re
dbe0: 67 52 65 63 6f 72 64 2b 31 3b 0a 20 20 69 6e 74  gRecord+1;.  int
dbf0: 20 72 65 67 50 65 65 72 20 3d 20 30 3b 0a 20 20   regPeer = 0;.  
dc00: 69 6e 74 20 72 65 67 4e 65 77 50 65 65 72 20 3d  int regNewPeer =
dc10: 20 30 3b 0a 20 20 57 69 6e 64 6f 77 43 6f 64 65   0;.  WindowCode
dc20: 41 72 67 20 73 3b 0a 0a 20 20 6d 65 6d 73 65 74  Arg s;..  memset
dc30: 28 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57  (&s, 0, sizeof(W
dc40: 69 6e 64 6f 77 43 6f 64 65 41 72 67 29 29 3b 0a  indowCodeArg));.
dc50: 20 20 73 2e 70 50 61 72 73 65 20 3d 20 70 50 61    s.pParse = pPa
dc60: 72 73 65 3b 0a 20 20 73 2e 70 4d 57 69 6e 20 3d  rse;.  s.pMWin =
dc70: 20 70 4d 57 69 6e 3b 0a 20 20 73 2e 70 56 64 62   pMWin;.  s.pVdb
dc80: 65 20 3d 20 76 3b 0a 20 20 73 2e 72 65 67 47 6f  e = v;.  s.regGo
dc90: 73 75 62 20 3d 20 72 65 67 47 6f 73 75 62 3b 0a  sub = regGosub;.
dca0: 20 20 73 2e 61 64 64 72 47 6f 73 75 62 20 3d 20    s.addrGosub = 
dcb0: 61 64 64 72 47 6f 73 75 62 3b 0a 20 20 73 2e 63  addrGosub;.  s.c
dcc0: 75 72 72 65 6e 74 2e 63 73 72 20 3d 20 70 4d 57  urrent.csr = pMW
dcd0: 69 6e 2d 3e 69 45 70 68 43 73 72 3b 0a 20 20 73  in->iEphCsr;.  s
dce0: 2e 73 74 61 72 74 2e 63 73 72 20 3d 20 73 2e 63  .start.csr = s.c
dcf0: 75 72 72 65 6e 74 2e 63 73 72 2b 32 3b 0a 20 20  urrent.csr+2;.  
dd00: 73 2e 65 6e 64 2e 63 73 72 20 3d 20 73 2e 63 75  s.end.csr = s.cu
dd10: 72 72 65 6e 74 2e 63 73 72 2b 33 3b 0a 0a 20 20  rrent.csr+3;..  
dd20: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
dd30: 31 20 2b 20 6e 53 75 62 20 2b 20 31 3b 0a 0a 20  1 + nSub + 1;.. 
dd40: 20 72 65 67 46 6c 75 73 68 50 61 72 74 20 3d 20   regFlushPart = 
dd50: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
dd60: 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53  .  if( pMWin->eS
dd70: 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49  tart==TK_PRECEDI
dd80: 4e 47 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74  NG || pMWin->eSt
dd90: 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e  art==TK_FOLLOWIN
dda0: 47 20 29 7b 0a 20 20 20 20 72 65 67 53 74 61 72  G ){.    regStar
ddb0: 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
ddc0: 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d  em;.  }.  if( pM
ddd0: 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52  Win->eEnd==TK_PR
dde0: 45 43 45 44 49 4e 47 20 7c 7c 20 70 4d 57 69 6e  ECEDING || pMWin
ddf0: 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f  ->eEnd==TK_FOLLO
de00: 57 49 4e 47 20 29 7b 0a 20 20 20 20 72 65 67 45  WING ){.    regE
de10: 6e 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  nd = ++pParse->n
de20: 4d 65 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  Mem;.  }..  /* I
de30: 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  f this is not a 
de40: 22 52 4f 57 53 20 42 45 54 57 45 45 4e 20 2e 2e  "ROWS BETWEEN ..
de50: 2e 22 20 66 72 61 6d 65 2c 20 74 68 65 6e 20 61  ." frame, then a
de60: 6c 6c 6f 63 61 74 65 20 72 65 67 69 73 74 65 72  llocate register
de70: 73 20 74 6f 0a 20 20 2a 2a 20 73 74 6f 72 65 20  s to.  ** store 
de80: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 75  a copy of the cu
de90: 72 72 65 6e 74 20 4f 52 44 45 52 20 42 59 20 65  rrent ORDER BY e
dea0: 78 70 72 65 73 73 69 6f 6e 73 2e 20 2a 2f 0a 20  xpressions. */. 
deb0: 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 54 79 70   if( pMWin->eTyp
dec0: 65 21 3d 54 4b 5f 52 4f 57 53 20 29 7b 0a 20 20  e!=TK_ROWS ){.  
ded0: 20 20 69 6e 74 20 6e 50 65 65 72 20 3d 20 28 70    int nPeer = (p
dee0: 4f 72 64 65 72 42 79 20 3f 20 70 4f 72 64 65 72  OrderBy ? pOrder
def0: 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a  By->nExpr : 0);.
df00: 20 20 20 20 72 65 67 4e 65 77 50 65 65 72 20 3d      regNewPeer =
df10: 20 72 65 67 20 2b 20 70 4d 57 69 6e 2d 3e 6e 42   reg + pMWin->nB
df20: 75 66 66 65 72 43 6f 6c 3b 0a 20 20 20 20 69 66  ufferCol;.    if
df30: 28 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74  ( pMWin->pPartit
df40: 69 6f 6e 20 29 20 72 65 67 4e 65 77 50 65 65 72  ion ) regNewPeer
df50: 20 2b 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74   += pMWin->pPart
df60: 69 74 69 6f 6e 2d 3e 6e 45 78 70 72 3b 0a 0a 20  ition->nExpr;.. 
df70: 20 20 20 72 65 67 50 65 65 72 20 3d 20 70 50 61     regPeer = pPa
df80: 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 20 20 20 20  rse->nMem+1;    
df90: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
dfa0: 2b 3d 20 6e 50 65 65 72 3b 0a 20 20 20 20 73 2e  += nPeer;.    s.
dfb0: 73 74 61 72 74 2e 72 65 67 20 3d 20 70 50 61 72  start.reg = pPar
dfc0: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 20 20 20 70 50  se->nMem+1;   pP
dfd0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50  arse->nMem += nP
dfe0: 65 65 72 3b 0a 20 20 20 20 73 2e 63 75 72 72 65  eer;.    s.curre
dff0: 6e 74 2e 72 65 67 20 3d 20 70 50 61 72 73 65 2d  nt.reg = pParse-
e000: 3e 6e 4d 65 6d 2b 31 3b 20 70 50 61 72 73 65 2d  >nMem+1; pParse-
e010: 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 65 65 72 3b 0a  >nMem += nPeer;.
e020: 20 20 20 20 73 2e 65 6e 64 2e 72 65 67 20 3d 20      s.end.reg = 
e030: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 20  pParse->nMem+1; 
e040: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
e050: 20 2b 3d 20 6e 50 65 65 72 3b 0a 20 20 7d 0a 0a   += nPeer;.  }..
e060: 20 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d    assert( pMWin-
e070: 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43  >eStart==TK_PREC
e080: 45 44 49 4e 47 20 0a 20 20 20 20 20 20 20 7c 7c  EDING .       ||
e090: 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d   pMWin->eStart==
e0a0: 54 4b 5f 43 55 52 52 45 4e 54 20 0a 20 20 20 20  TK_CURRENT .    
e0b0: 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74     || pMWin->eSt
e0c0: 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e  art==TK_FOLLOWIN
e0d0: 47 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d 57  G .       || pMW
e0e0: 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55  in->eStart==TK_U
e0f0: 4e 42 4f 55 4e 44 45 44 20 0a 20 20 29 3b 0a 20  NBOUNDED .  );. 
e100: 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e   assert( pMWin->
e110: 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49  eEnd==TK_FOLLOWI
e120: 4e 47 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d  NG .       || pM
e130: 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55  Win->eEnd==TK_CU
e140: 52 52 45 4e 54 20 0a 20 20 20 20 20 20 20 7c 7c  RRENT .       ||
e150: 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b   pMWin->eEnd==TK
e160: 5f 55 4e 42 4f 55 4e 44 45 44 20 0a 20 20 20 20  _UNBOUNDED .    
e170: 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e     || pMWin->eEn
e180: 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20  d==TK_PRECEDING 
e190: 0a 20 20 29 3b 0a 0a 0a 20 20 2f 2a 20 4c 6f 61  .  );...  /* Loa
e1a0: 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c  d the column val
e1b0: 75 65 73 20 66 6f 72 20 74 68 65 20 72 6f 77 20  ues for the row 
e1c0: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
e1d0: 73 75 62 2d 73 65 6c 65 63 74 0a 20 20 2a 2a 20  sub-select.  ** 
e1e0: 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66  into an array of
e1f0: 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74   registers start
e200: 69 6e 67 20 61 74 20 72 65 67 2e 20 41 73 73 65  ing at reg. Asse
e210: 6d 62 6c 65 20 74 68 65 6d 20 69 6e 74 6f 0a 20  mble them into. 
e220: 20 2a 2a 20 61 20 72 65 63 6f 72 64 20 69 6e 20   ** a record in 
e230: 72 65 67 69 73 74 65 72 20 72 65 67 52 65 63 6f  register regReco
e240: 72 64 2e 20 54 4f 44 4f 3a 20 41 6e 20 6f 70 74  rd. TODO: An opt
e250: 69 6d 69 7a 61 74 69 6f 6e 20 68 65 72 65 3f 20  imization here? 
e260: 2a 2f 0a 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b  */.  for(iCol=0;
e270: 20 69 43 6f 6c 3c 6e 53 75 62 3b 20 69 43 6f 6c   iCol<nSub; iCol
e280: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
e290: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
e2a0: 5f 43 6f 6c 75 6d 6e 2c 20 69 53 75 62 43 73 72  _Column, iSubCsr
e2b0: 2c 20 69 43 6f 6c 2c 20 72 65 67 2b 69 43 6f 6c  , iCol, reg+iCol
e2c0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
e2d0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
e2e0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
e2f0: 2c 20 6e 53 75 62 2c 20 72 65 67 52 65 63 6f 72  , nSub, regRecor
e300: 64 29 3b 0a 0a 20 20 2f 2a 20 41 6e 20 69 6e 70  d);..  /* An inp
e310: 75 74 20 72 6f 77 20 68 61 73 20 6a 75 73 74 20  ut row has just 
e320: 62 65 65 6e 20 72 65 61 64 20 69 6e 74 6f 20 61  been read into a
e330: 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73  n array of regis
e340: 74 65 72 73 20 73 74 61 72 74 69 6e 67 0a 20 20  ters starting.  
e350: 2a 2a 20 61 74 20 72 65 67 2e 20 49 66 20 74 68  ** at reg. If th
e360: 65 20 77 69 6e 64 6f 77 20 68 61 73 20 61 20 50  e window has a P
e370: 41 52 54 49 54 49 4f 4e 20 63 6c 61 75 73 65 2c  ARTITION clause,
e380: 20 74 68 69 73 20 62 6c 6f 63 6b 20 67 65 6e 65   this block gene
e390: 72 61 74 65 73 20 0a 20 20 2a 2a 20 56 4d 20 63  rates .  ** VM c
e3a0: 6f 64 65 20 74 6f 20 63 68 65 63 6b 20 69 66 20  ode to check if 
e3b0: 74 68 65 20 69 6e 70 75 74 20 72 6f 77 20 69 73  the input row is
e3c0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20   the start of a 
e3d0: 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 2e 0a 20  new partition.. 
e3e0: 20 2a 2a 20 49 66 20 73 6f 2c 20 69 74 20 64 6f   ** If so, it do
e3f0: 65 73 20 61 6e 20 4f 50 5f 47 6f 73 75 62 20 74  es an OP_Gosub t
e400: 6f 20 61 6e 20 61 64 64 72 65 73 73 20 74 6f 20  o an address to 
e410: 62 65 20 66 69 6c 6c 65 64 20 69 6e 20 6c 61 74  be filled in lat
e420: 65 72 2e 20 54 68 65 0a 20 20 2a 2a 20 61 64 64  er. The.  ** add
e430: 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 47  ress of the OP_G
e440: 6f 73 75 62 20 69 73 20 73 74 6f 72 65 64 20 69  osub is stored i
e450: 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65  n local variable
e460: 20 61 64 64 72 47 6f 73 75 62 46 6c 75 73 68 2e   addrGosubFlush.
e470: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69  .  */.  if( pMWi
e480: 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 29 7b  n->pPartition ){
e490: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  .    int addr;. 
e4a0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 50 61     ExprList *pPa
e4b0: 72 74 20 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72  rt = pMWin->pPar
e4c0: 74 69 74 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20  tition;.    int 
e4d0: 6e 50 61 72 74 20 3d 20 70 50 61 72 74 2d 3e 6e  nPart = pPart->n
e4e0: 45 78 70 72 3b 0a 20 20 20 20 69 6e 74 20 72 65  Expr;.    int re
e4f0: 67 4e 65 77 50 61 72 74 20 3d 20 72 65 67 20 2b  gNewPart = reg +
e500: 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43   pMWin->nBufferC
e510: 6f 6c 3b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20  ol;.    KeyInfo 
e520: 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69  *pKeyInfo = sqli
e530: 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78  te3KeyInfoFromEx
e540: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
e550: 50 61 72 74 2c 20 30 2c 20 30 29 3b 0a 0a 20 20  Part, 0, 0);..  
e560: 20 20 61 64 64 72 49 66 20 3d 20 73 71 6c 69 74    addrIf = sqlit
e570: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
e580: 4f 50 5f 49 66 2c 20 70 4d 57 69 6e 2d 3e 72 65  OP_If, pMWin->re
e590: 67 46 69 72 73 74 29 3b 0a 20 20 20 20 61 64 64  gFirst);.    add
e5a0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
e5b0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp3(v, OP_Comp
e5c0: 61 72 65 2c 20 72 65 67 4e 65 77 50 61 72 74 2c  are, regNewPart,
e5d0: 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c   pMWin->regPart,
e5e0: 20 6e 50 61 72 74 29 3b 0a 20 20 20 20 73 71 6c   nPart);.    sql
e5f0: 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
e600: 28 76 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79 49  (v, (void*)pKeyI
e610: 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
e620: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
e630: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
e640: 6d 70 2c 20 61 64 64 72 2b 32 2c 20 61 64 64 72  mp, addr+2, addr
e650: 2b 34 2c 20 61 64 64 72 2b 32 29 3b 0a 20 20 20  +4, addr+2);.   
e660: 20 56 64 62 65 43 6f 76 65 72 61 67 65 45 71 4e   VdbeCoverageEqN
e670: 65 28 76 29 3b 0a 20 20 20 20 61 64 64 72 47 6f  e(v);.    addrGo
e680: 73 75 62 46 6c 75 73 68 20 3d 20 73 71 6c 69 74  subFlush = sqlit
e690: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
e6a0: 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 46 6c 75  OP_Gosub, regFlu
e6b0: 73 68 50 61 72 74 29 3b 0a 20 20 20 20 56 64 62  shPart);.    Vdb
e6c0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 61  eComment((v, "ca
e6d0: 6c 6c 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69  ll flush_partiti
e6e0: 6f 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  on"));.    sqlit
e6f0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
e700: 2c 20 61 64 64 72 49 66 29 3b 0a 20 20 20 20 73  , addrIf);.    s
e710: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
e720: 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67  (v, OP_Copy, reg
e730: 4e 65 77 50 61 72 74 2c 20 70 4d 57 69 6e 2d 3e  NewPart, pMWin->
e740: 72 65 67 50 61 72 74 2c 20 6e 50 61 72 74 2d 31  regPart, nPart-1
e750: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73  );.  }..  /* Ins
e760: 65 72 74 20 74 68 65 20 6e 65 77 20 72 6f 77 20  ert the new row 
e770: 69 6e 74 6f 20 74 68 65 20 65 70 68 65 6d 65 72  into the ephemer
e780: 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71  al table */.  sq
e790: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
e7a0: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
e7b0: 63 73 72 57 72 69 74 65 2c 20 72 65 67 52 6f 77  csrWrite, regRow
e7c0: 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  id);.  sqlite3Vd
e7d0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
e7e0: 6e 73 65 72 74 2c 20 63 73 72 57 72 69 74 65 2c  nsert, csrWrite,
e7f0: 20 72 65 67 52 65 63 6f 72 64 2c 20 72 65 67 52   regRecord, regR
e800: 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  owid);.  sqlite3
e810: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
e820: 5f 41 64 64 49 6d 6d 2c 20 70 4d 57 69 6e 2d 3e  _AddImm, pMWin->
e830: 72 65 67 53 69 7a 65 2c 20 31 29 3b 0a 0a 20 20  regSize, 1);..  
e840: 69 66 28 20 62 43 61 63 68 65 20 29 7b 0a 20 20  if( bCache ){.  
e850: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e860: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
e870: 72 2c 20 30 2c 20 70 4d 57 69 6e 2d 3e 72 65 67  r, 0, pMWin->reg
e880: 46 69 72 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  First);.    sqli
e890: 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
e8a0: 66 6f 29 3b 0a 20 20 20 20 61 64 64 72 49 6e 74  fo);.    addrInt
e8b0: 65 67 65 72 20 3d 20 73 71 6c 69 74 65 33 56 64  eger = sqlite3Vd
e8c0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
e8d0: 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 46 6c  nteger, 0, regFl
e8e0: 75 73 68 50 61 72 74 29 3b 0a 20 20 20 20 69 66  ushPart);.    if
e8f0: 28 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74  ( pMWin->pPartit
e900: 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ion ){.      sql
e910: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
e920: 28 76 2c 20 61 64 64 72 47 6f 73 75 62 46 6c 75  (v, addrGosubFlu
e930: 73 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  sh);.    }.    a
e940: 64 64 72 43 61 63 68 65 52 65 77 69 6e 64 20 3d  ddrCacheRewind =
e950: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e960: 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p1(v, OP_Rewind,
e970: 20 63 73 72 57 72 69 74 65 29 3b 0a 20 20 7d 65   csrWrite);.  }e
e980: 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 49 66 20  lse{.    addrIf 
e990: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
e9a0: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  Op1(v, OP_IfNot,
e9b0: 20 70 4d 57 69 6e 2d 3e 72 65 67 46 69 72 73 74   pMWin->regFirst
e9c0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69  );.  }..  /* Thi
e9d0: 73 20 62 6c 6f 63 6b 20 69 73 20 72 75 6e 20 66  s block is run f
e9e0: 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  or the first row
e9f0: 20 6f 66 20 65 61 63 68 20 70 61 72 74 69 74 69   of each partiti
ea00: 6f 6e 20 2a 2f 0a 20 20 73 2e 72 65 67 41 72 67  on */.  s.regArg
ea10: 20 3d 20 72 65 67 41 72 67 20 3d 20 77 69 6e 64   = regArg = wind
ea20: 6f 77 49 6e 69 74 41 63 63 75 6d 28 70 50 61 72  owInitAccum(pPar
ea30: 73 65 2c 20 70 4d 57 69 6e 29 3b 0a 0a 20 20 69  se, pMWin);..  i
ea40: 66 28 20 72 65 67 53 74 61 72 74 20 29 7b 0a 20  f( regStart ){. 
ea50: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
ea60: 64 65 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  de(pParse, pMWin
ea70: 2d 3e 70 53 74 61 72 74 2c 20 72 65 67 53 74 61  ->pStart, regSta
ea80: 72 74 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43  rt);.    windowC
ea90: 68 65 63 6b 49 6e 74 56 61 6c 75 65 28 70 50 61  heckIntValue(pPa
eaa0: 72 73 65 2c 20 72 65 67 53 74 61 72 74 2c 20 30  rse, regStart, 0
eab0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 67  );.  }.  if( reg
eac0: 45 6e 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  End ){.    sqlit
ead0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
eae0: 65 2c 20 70 4d 57 69 6e 2d 3e 70 45 6e 64 2c 20  e, pMWin->pEnd, 
eaf0: 72 65 67 45 6e 64 29 3b 0a 20 20 20 20 77 69 6e  regEnd);.    win
eb00: 64 6f 77 43 68 65 63 6b 49 6e 74 56 61 6c 75 65  dowCheckIntValue
eb10: 28 70 50 61 72 73 65 2c 20 72 65 67 45 6e 64 2c  (pParse, regEnd,
eb20: 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   1);.  }..  if( 
eb30: 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 70  pMWin->eStart==p
eb40: 4d 57 69 6e 2d 3e 65 45 6e 64 20 26 26 20 72 65  MWin->eEnd && re
eb50: 67 53 74 61 72 74 20 26 26 20 72 65 67 45 6e 64  gStart && regEnd
eb60: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d   ){.    int op =
eb70: 20 28 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74   ((pMWin->eStart
eb80: 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 29 20  ==TK_FOLLOWING) 
eb90: 3f 20 4f 50 5f 47 65 20 3a 20 4f 50 5f 4c 65 29  ? OP_Ge : OP_Le)
eba0: 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 47 65  ;.    int addrGe
ebb0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
ebc0: 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72 65 67 53  dOp3(v, op, regS
ebd0: 74 61 72 74 2c 20 30 2c 20 72 65 67 45 6e 64 29  tart, 0, regEnd)
ebe0: 3b 0a 20 20 20 20 77 69 6e 64 6f 77 41 67 67 46  ;.    windowAggF
ebf0: 69 6e 61 6c 28 70 50 61 72 73 65 2c 20 70 4d 57  inal(pParse, pMW
ec00: 69 6e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  in, 0);.    if( 
ec10: 62 43 61 63 68 65 20 29 7b 0a 20 20 20 20 20 20  bCache ){.      
ec20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ec30: 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 63  2(v, OP_Rowid, c
ec40: 73 72 57 72 69 74 65 2c 20 72 65 67 52 6f 77 69  srWrite, regRowi
ec50: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
ec60: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
ec70: 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 73 2e 63  P_NotExists, s.c
ec80: 75 72 72 65 6e 74 2e 63 73 72 2c 20 30 2c 20 72  urrent.csr, 0, r
ec90: 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  egRowid);.      
eca0: 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52  windowReturnOneR
ecb0: 6f 77 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  ow(pParse, pMWin
ecc0: 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72  , regGosub, addr
ecd0: 47 6f 73 75 62 29 3b 0a 20 20 20 20 20 20 73 71  Gosub);.      sq
ece0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
ecf0: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 63 73 72 57  v, OP_Next, csrW
ed00: 72 69 74 65 2c 20 61 64 64 72 43 61 63 68 65 52  rite, addrCacheR
ed10: 65 77 69 6e 64 2b 31 29 3b 0a 20 20 20 20 7d 65  ewind+1);.    }e
ed20: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
ed30: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
ed40: 4f 50 5f 52 65 77 69 6e 64 2c 20 73 2e 63 75 72  OP_Rewind, s.cur
ed50: 72 65 6e 74 2e 63 73 72 2c 20 31 29 3b 0a 20 20  rent.csr, 1);.  
ed60: 20 20 20 20 77 69 6e 64 6f 77 52 65 74 75 72 6e      windowReturn
ed70: 4f 6e 65 52 6f 77 28 70 50 61 72 73 65 2c 20 70  OneRow(pParse, p
ed80: 4d 57 69 6e 2c 20 72 65 67 47 6f 73 75 62 2c 20  MWin, regGosub, 
ed90: 61 64 64 72 47 6f 73 75 62 29 3b 0a 20 20 20 20  addrGosub);.    
eda0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
edb0: 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53  Op1(v, OP_ResetS
edc0: 6f 72 74 65 72 2c 20 73 2e 63 75 72 72 65 6e 74  orter, s.current
edd0: 2e 63 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  .csr);.    }.   
ede0: 20 61 64 64 72 53 68 6f 72 74 63 75 74 20 3d 20   addrShortcut = 
edf0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ee00: 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20  0(v, OP_Goto);. 
ee10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
ee20: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 47 65  mpHere(v, addrGe
ee30: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d 57  );.  }.  if( pMW
ee40: 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46  in->eStart==TK_F
ee50: 4f 4c 4c 4f 57 49 4e 47 20 26 26 20 72 65 67 45  OLLOWING && regE
ee60: 6e 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  nd ){.    assert
ee70: 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54  ( pMWin->eEnd==T
ee80: 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 3b 0a 20  K_FOLLOWING );. 
ee90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
eea0: 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74 72  dOp3(v, OP_Subtr
eeb0: 61 63 74 2c 20 72 65 67 53 74 61 72 74 2c 20 72  act, regStart, r
eec0: 65 67 45 6e 64 2c 20 72 65 67 53 74 61 72 74 29  egEnd, regStart)
eed0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4d 57  ;.  }..  if( pMW
eee0: 69 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b 5f 55  in->eStart!=TK_U
eef0: 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20 20  NBOUNDED ){.    
ef00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ef10: 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
ef20: 73 2e 73 74 61 72 74 2e 63 73 72 2c 20 31 29 3b  s.start.csr, 1);
ef30: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
ef40: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
ef50: 65 77 69 6e 64 2c 20 73 2e 63 75 72 72 65 6e 74  ewind, s.current
ef60: 2e 63 73 72 2c 20 31 29 3b 0a 20 20 73 71 6c 69  .csr, 1);.  sqli
ef70: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
ef80: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 73 2e 65 6e   OP_Rewind, s.en
ef90: 64 2e 63 73 72 2c 20 31 29 3b 0a 20 20 69 66 28  d.csr, 1);.  if(
efa0: 20 72 65 67 50 65 65 72 20 26 26 20 70 4f 72 64   regPeer && pOrd
efb0: 65 72 42 79 20 29 7b 0a 20 20 20 20 69 66 28 20  erBy ){.    if( 
efc0: 62 43 61 63 68 65 20 29 7b 0a 20 20 20 20 20 20  bCache ){.      
efd0: 77 69 6e 64 6f 77 52 65 61 64 50 65 65 72 56 61  windowReadPeerVa
efe0: 6c 75 65 73 28 26 73 2c 20 63 73 72 57 72 69 74  lues(&s, csrWrit
eff0: 65 2c 20 72 65 67 50 65 65 72 29 3b 0a 20 20 20  e, regPeer);.   
f000: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
f010: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
f020: 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4e  v, OP_Copy, regN
f030: 65 77 50 65 65 72 2c 20 72 65 67 50 65 65 72 2c  ewPeer, regPeer,
f040: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
f050: 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  -1);.    }.    s
f060: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
f070: 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67  (v, OP_Copy, reg
f080: 50 65 65 72 2c 20 73 2e 73 74 61 72 74 2e 72 65  Peer, s.start.re
f090: 67 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  g, pOrderBy->nEx
f0a0: 70 72 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  pr-1);.    sqlit
f0b0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
f0c0: 4f 50 5f 43 6f 70 79 2c 20 72 65 67 50 65 65 72  OP_Copy, regPeer
f0d0: 2c 20 73 2e 63 75 72 72 65 6e 74 2e 72 65 67 2c  , s.current.reg,
f0e0: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
f0f0: 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  -1);.    sqlite3
f100: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
f110: 5f 43 6f 70 79 2c 20 72 65 67 50 65 65 72 2c 20  _Copy, regPeer, 
f120: 73 2e 65 6e 64 2e 72 65 67 2c 20 70 4f 72 64 65  s.end.reg, pOrde
f130: 72 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20  rBy->nExpr-1);. 
f140: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62   }..  sqlite3Vdb
f150: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
f160: 74 65 67 65 72 2c 20 30 2c 20 70 4d 57 69 6e 2d  teger, 0, pMWin-
f170: 3e 72 65 67 46 69 72 73 74 29 3b 0a 20 20 61 64  >regFirst);.  ad
f180: 64 72 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33  drGoto = sqlite3
f190: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
f1a0: 5f 47 6f 74 6f 29 3b 0a 0a 20 20 2f 2a 20 42 65  _Goto);..  /* Be
f1b0: 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 53  gin generating S
f1c0: 45 43 4f 4e 44 5f 52 4f 57 5f 43 4f 44 45 20 2a  ECOND_ROW_CODE *
f1d0: 2f 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f  /.  VdbeModuleCo
f1e0: 6d 6d 65 6e 74 28 28 70 50 61 72 73 65 2d 3e 70  mment((pParse->p
f1f0: 56 64 62 65 2c 20 22 42 65 67 69 6e 20 77 69 6e  Vdbe, "Begin win
f200: 64 6f 77 43 6f 64 65 53 74 65 70 2e 53 45 43 4f  dowCodeStep.SECO
f210: 4e 44 5f 52 4f 57 5f 43 4f 44 45 22 29 29 3b 0a  ND_ROW_CODE"));.
f220: 20 20 69 66 28 20 62 43 61 63 68 65 20 29 7b 0a    if( bCache ){.
f230: 20 20 20 20 61 64 64 72 43 61 63 68 65 4e 65 78      addrCacheNex
f240: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
f250: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
f260: 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 54     if( pMWin->eT
f270: 79 70 65 21 3d 54 4b 5f 52 4f 57 53 20 29 7b 0a  ype!=TK_ROWS ){.
f280: 20 20 20 20 20 20 77 69 6e 64 6f 77 52 65 61 64        windowRead
f290: 50 65 65 72 56 61 6c 75 65 73 28 26 73 2c 20 63  PeerValues(&s, c
f2a0: 73 72 57 72 69 74 65 2c 20 72 65 67 4e 65 77 50  srWrite, regNewP
f2b0: 65 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  eer);.    }.  }e
f2c0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
f2d0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
f2e0: 61 64 64 72 49 66 29 3b 0a 20 20 7d 0a 20 20 69  addrIf);.  }.  i
f2f0: 66 28 20 72 65 67 50 65 65 72 20 29 7b 0a 20 20  f( regPeer ){.  
f300: 20 20 61 64 64 72 50 65 65 72 4a 75 6d 70 20 3d    addrPeerJump =
f310: 20 77 69 6e 64 6f 77 49 66 4e 65 77 50 65 65 72   windowIfNewPeer
f320: 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
f330: 79 2c 20 72 65 67 4e 65 77 50 65 65 72 2c 20 72  y, regNewPeer, r
f340: 65 67 50 65 65 72 29 3b 0a 20 20 7d 0a 20 20 69  egPeer);.  }.  i
f350: 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  f( pMWin->eStart
f360: 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29  ==TK_FOLLOWING )
f370: 7b 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65  {.    windowCode
f380: 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47  Op(&s, WINDOW_AG
f390: 47 53 54 45 50 2c 20 30 2c 20 30 29 3b 0a 20 20  GSTEP, 0, 0);.  
f3a0: 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e    if( pMWin->eEn
f3b0: 64 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20  d!=TK_UNBOUNDED 
f3c0: 29 7b 0a 20 20 20 20 20 20 77 69 6e 64 6f 77 43  ){.      windowC
f3d0: 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57  odeOp(&s, WINDOW
f3e0: 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 72 65 67  _RETURN_ROW, reg
f3f0: 45 6e 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 77  End, 0);.      w
f400: 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20  indowCodeOp(&s, 
f410: 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53  WINDOW_AGGINVERS
f420: 45 2c 20 72 65 67 53 74 61 72 74 2c 20 30 29 3b  E, regStart, 0);
f430: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 20  .    }.  }else. 
f440: 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64   if( pMWin->eEnd
f450: 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 29  ==TK_PRECEDING )
f460: 7b 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65  {.    windowCode
f470: 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47  Op(&s, WINDOW_AG
f480: 47 53 54 45 50 2c 20 72 65 67 45 6e 64 2c 20 30  GSTEP, regEnd, 0
f490: 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f 64  );.    windowCod
f4a0: 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52  eOp(&s, WINDOW_R
f4b0: 45 54 55 52 4e 5f 52 4f 57 2c 20 30 2c 20 30 29  ETURN_ROW, 0, 0)
f4c0: 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65  ;.    windowCode
f4d0: 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47  Op(&s, WINDOW_AG
f4e0: 47 49 4e 56 45 52 53 45 2c 20 72 65 67 53 74 61  GINVERSE, regSta
f4f0: 72 74 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  rt, 0);.  }else{
f500: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  .    int addr;. 
f510: 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28     windowCodeOp(
f520: 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 53 54  &s, WINDOW_AGGST
f530: 45 50 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  EP, 0, 0);.    i
f540: 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 21 3d  f( pMWin->eEnd!=
f550: 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a  TK_UNBOUNDED ){.
f560: 20 20 20 20 20 20 69 66 28 20 72 65 67 45 6e 64        if( regEnd
f570: 20 29 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65   ) addr = sqlite
f580: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
f590: 50 5f 49 66 50 6f 73 2c 20 72 65 67 45 6e 64 2c  P_IfPos, regEnd,
f5a0: 20 30 2c 20 31 29 3b 0a 20 20 20 20 20 20 77 69   0, 1);.      wi
f5b0: 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57  ndowCodeOp(&s, W
f5c0: 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57  INDOW_RETURN_ROW
f5d0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 77  , 0, 0);.      w
f5e0: 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20  indowCodeOp(&s, 
f5f0: 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53  WINDOW_AGGINVERS
f600: 45 2c 20 72 65 67 53 74 61 72 74 2c 20 30 29 3b  E, regStart, 0);
f610: 0a 20 20 20 20 20 20 69 66 28 20 72 65 67 45 6e  .      if( regEn
f620: 64 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  d ) sqlite3VdbeJ
f630: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
f640: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
f650: 28 20 61 64 64 72 50 65 65 72 4a 75 6d 70 20 29  ( addrPeerJump )
f660: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
f670: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
f680: 72 50 65 65 72 4a 75 6d 70 29 3b 0a 20 20 7d 0a  rPeerJump);.  }.
f690: 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d    VdbeModuleComm
f6a0: 65 6e 74 28 28 70 50 61 72 73 65 2d 3e 70 56 64  ent((pParse->pVd
f6b0: 62 65 2c 20 22 45 6e 64 20 77 69 6e 64 6f 77 43  be, "End windowC
f6c0: 6f 64 65 53 74 65 70 2e 53 45 43 4f 4e 44 5f 52  odeStep.SECOND_R
f6d0: 4f 57 5f 43 4f 44 45 22 29 29 3b 0a 0a 20 20 2f  OW_CODE"));..  /
f6e0: 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6d 61 69  * End of the mai
f6f0: 6e 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a  n input loop */.
f700: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
f710: 70 48 65 72 65 28 76 2c 20 61 64 64 72 47 6f 74  pHere(v, addrGot
f720: 6f 29 3b 0a 20 20 69 66 28 20 62 43 61 63 68 65  o);.  if( bCache
f730: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
f740: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f750: 4e 65 78 74 2c 20 63 73 72 57 72 69 74 65 2c 20  Next, csrWrite, 
f760: 61 64 64 72 43 61 63 68 65 4e 65 78 74 29 3b 0a  addrCacheNext);.
f770: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
f780: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 43  umpHere(v, addrC
f790: 61 63 68 65 52 65 77 69 6e 64 29 3b 20 0a 20 20  acheRewind); .  
f7a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 61  }else{.    if( a
f7b0: 64 64 72 53 68 6f 72 74 63 75 74 3e 30 20 29 20  ddrShortcut>0 ) 
f7c0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
f7d0: 65 72 65 28 76 2c 20 61 64 64 72 53 68 6f 72 74  ere(v, addrShort
f7e0: 63 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  cut);.    sqlite
f7f0: 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
f800: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 61 6c  );.  }..  /* Fal
f810: 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 69  l through */.  i
f820: 66 28 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69  f( pMWin->pParti
f830: 74 69 6f 6e 20 26 26 20 62 43 61 63 68 65 3d 3d  tion && bCache==
f840: 30 20 29 7b 0a 20 20 20 20 61 64 64 72 49 6e 74  0 ){.    addrInt
f850: 65 67 65 72 20 3d 20 73 71 6c 69 74 65 33 56 64  eger = sqlite3Vd
f860: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
f870: 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 46 6c  nteger, 0, regFl
f880: 75 73 68 50 61 72 74 29 3b 0a 20 20 20 20 73 71  ushPart);.    sq
f890: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
f8a0: 65 28 76 2c 20 61 64 64 72 47 6f 73 75 62 46 6c  e(v, addrGosubFl
f8b0: 75 73 68 29 3b 0a 20 20 7d 0a 0a 20 20 56 64 62  ush);.  }..  Vdb
f8c0: 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28  eModuleComment((
f8d0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 22  pParse->pVdbe, "
f8e0: 42 65 67 69 6e 20 77 69 6e 64 6f 77 43 6f 64 65  Begin windowCode
f8f0: 53 74 65 70 2e 46 4c 55 53 48 5f 43 4f 44 45 22  Step.FLUSH_CODE"
f900: 29 29 3b 0a 20 20 61 64 64 72 45 6d 70 74 79 20  ));.  addrEmpty 
f910: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
f920: 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op1(v, OP_Rewind
f930: 2c 20 63 73 72 57 72 69 74 65 29 3b 0a 20 20 69  , csrWrite);.  i
f940: 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  f( pMWin->eEnd==
f950: 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 29 7b 0a  TK_PRECEDING ){.
f960: 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70      windowCodeOp
f970: 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 53  (&s, WINDOW_AGGS
f980: 54 45 50 2c 20 72 65 67 45 6e 64 2c 20 30 29 3b  TEP, regEnd, 0);
f990: 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f  .    windowCodeO
f9a0: 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54  p(&s, WINDOW_RET
f9b0: 55 52 4e 5f 52 4f 57 2c 20 30 2c 20 30 29 3b 0a  URN_ROW, 0, 0);.
f9c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 57 69    }else if( pMWi
f9d0: 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f  n->eStart==TK_FO
f9e0: 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 69  LLOWING ){.    i
f9f0: 6e 74 20 61 64 64 72 53 74 61 72 74 3b 0a 20 20  nt addrStart;.  
fa00: 20 20 69 6e 74 20 61 64 64 72 42 72 65 61 6b 31    int addrBreak1
fa10: 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 42 72  ;.    int addrBr
fa20: 65 61 6b 32 3b 0a 20 20 20 20 69 6e 74 20 61 64  eak2;.    int ad
fa30: 64 72 42 72 65 61 6b 33 3b 0a 20 20 20 20 77 69  drBreak3;.    wi
fa40: 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57  ndowCodeOp(&s, W
fa50: 49 4e 44 4f 57 5f 41 47 47 53 54 45 50 2c 20 30  INDOW_AGGSTEP, 0
fa60: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 4d  , 0);.    if( pM
fa70: 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e  Win->eEnd==TK_UN
fa80: 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20 20 20  BOUNDED ){.     
fa90: 20 61 64 64 72 53 74 61 72 74 20 3d 20 73 71 6c   addrStart = sql
faa0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
fab0: 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 61 64  ddr(v);.      ad
fac0: 64 72 42 72 65 61 6b 31 20 3d 20 77 69 6e 64 6f  drBreak1 = windo
fad0: 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44  wCodeOp(&s, WIND
fae0: 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 72  OW_RETURN_ROW, r
faf0: 65 67 53 74 61 72 74 2c 20 31 29 3b 0a 20 20 20  egStart, 1);.   
fb00: 20 20 20 61 64 64 72 42 72 65 61 6b 32 20 3d 20     addrBreak2 = 
fb10: 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c  windowCodeOp(&s,
fb20: 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52   WINDOW_AGGINVER
fb30: 53 45 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d  SE, 0, 1);.    }
fb40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
fb50: 72 74 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d  rt( pMWin->eEnd=
fb60: 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 3b  =TK_FOLLOWING );
fb70: 0a 20 20 20 20 20 20 61 64 64 72 53 74 61 72 74  .      addrStart
fb80: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
fb90: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
fba0: 20 20 20 20 61 64 64 72 42 72 65 61 6b 31 20 3d      addrBreak1 =
fbb0: 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73   windowCodeOp(&s
fbc0: 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f  , WINDOW_RETURN_
fbd0: 52 4f 57 2c 20 72 65 67 45 6e 64 2c 20 31 29 3b  ROW, regEnd, 1);
fbe0: 0a 20 20 20 20 20 20 61 64 64 72 42 72 65 61 6b  .      addrBreak
fbf0: 32 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70  2 = windowCodeOp
fc00: 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49  (&s, WINDOW_AGGI
fc10: 4e 56 45 52 53 45 2c 20 72 65 67 53 74 61 72 74  NVERSE, regStart
fc20: 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
fc30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fc40: 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
fc50: 20 61 64 64 72 53 74 61 72 74 29 3b 0a 20 20 20   addrStart);.   
fc60: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
fc70: 48 65 72 65 28 76 2c 20 61 64 64 72 42 72 65 61  Here(v, addrBrea
fc80: 6b 32 29 3b 0a 20 20 20 20 61 64 64 72 53 74 61  k2);.    addrSta
fc90: 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
fca0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
fcb0: 20 20 20 20 61 64 64 72 42 72 65 61 6b 33 20 3d      addrBreak3 =
fcc0: 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73   windowCodeOp(&s
fcd0: 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f  , WINDOW_RETURN_
fce0: 52 4f 57 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20  ROW, 0, 1);.    
fcf0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fd00: 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
fd10: 20 61 64 64 72 53 74 61 72 74 29 3b 0a 20 20 20   addrStart);.   
fd20: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
fd30: 48 65 72 65 28 76 2c 20 61 64 64 72 42 72 65 61  Here(v, addrBrea
fd40: 6b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  k1);.    sqlite3
fd50: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
fd60: 61 64 64 72 42 72 65 61 6b 33 29 3b 0a 20 20 7d  addrBreak3);.  }
fd70: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 61 64  else{.    int ad
fd80: 64 72 42 72 65 61 6b 3b 0a 20 20 20 20 69 6e 74  drBreak;.    int
fd90: 20 61 64 64 72 53 74 61 72 74 3b 0a 20 20 20 20   addrStart;.    
fda0: 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c  windowCodeOp(&s,
fdb0: 20 57 49 4e 44 4f 57 5f 41 47 47 53 54 45 50 2c   WINDOW_AGGSTEP,
fdc0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 61 64 64 72   0, 0);.    addr
fdd0: 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
fde0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
fdf0: 29 3b 0a 20 20 20 20 61 64 64 72 42 72 65 61 6b  );.    addrBreak
fe00: 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28   = windowCodeOp(
fe10: 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55 52  &s, WINDOW_RETUR
fe20: 4e 5f 52 4f 57 2c 20 30 2c 20 31 29 3b 0a 20 20  N_ROW, 0, 1);.  
fe30: 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26    windowCodeOp(&
fe40: 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56  s, WINDOW_AGGINV
fe50: 45 52 53 45 2c 20 72 65 67 53 74 61 72 74 2c 20  ERSE, regStart, 
fe60: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
fe70: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
fe80: 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 53 74 61  Goto, 0, addrSta
fe90: 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rt);.    sqlite3
fea0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
feb0: 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 7d 0a  addrBreak);.  }.
fec0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
fed0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 45 6d  mpHere(v, addrEm
fee0: 70 74 79 29 3b 0a 0a 20 20 69 66 28 20 62 43 61  pty);..  if( bCa
fef0: 63 68 65 20 26 26 20 61 64 64 72 53 68 6f 72 74  che && addrShort
ff00: 63 75 74 3e 30 20 29 20 73 71 6c 69 74 65 33 56  cut>0 ) sqlite3V
ff10: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
ff20: 64 64 72 53 68 6f 72 74 63 75 74 29 3b 0a 20 20  ddrShortcut);.  
ff30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ff40: 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72  1(v, OP_ResetSor
ff50: 74 65 72 2c 20 73 2e 63 75 72 72 65 6e 74 2e 63  ter, s.current.c
ff60: 73 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  sr);.  sqlite3Vd
ff70: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
ff80: 6e 74 65 67 65 72 2c 20 30 2c 20 70 4d 57 69 6e  nteger, 0, pMWin
ff90: 2d 3e 72 65 67 53 69 7a 65 29 3b 0a 20 20 69 66  ->regSize);.  if
ffa0: 28 20 62 43 61 63 68 65 3d 3d 30 20 29 20 73 71  ( bCache==0 ) sq
ffb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
ffc0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
ffd0: 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 46 69 72 73  , pMWin->regFirs
ffe0: 74 29 3b 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65  t);.  VdbeModule
fff0: 43 6f 6d 6d 65 6e 74 28 28 70 50 61 72 73 65 2d  Comment((pParse-
10000 3e 70 56 64 62 65 2c 20 22 45 6e 64 20 77 69 6e  >pVdbe, "End win
10010 64 6f 77 43 6f 64 65 53 74 65 70 2e 46 4c 55 53  dowCodeStep.FLUS
10020 48 5f 43 4f 44 45 22 29 29 3b 0a 20 20 69 66 28  H_CODE"));.  if(
10030 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69   pMWin->pPartiti
10040 6f 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  on ){.    sqlite
10050 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c  3VdbeChangeP1(v,
10060 20 61 64 64 72 49 6e 74 65 67 65 72 2c 20 73 71   addrInteger, sq
10070 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
10080 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20 73 71  Addr(v));.    sq
10090 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
100a0 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
100b0 67 46 6c 75 73 68 50 61 72 74 29 3b 0a 20 20 7d  gFlushPart);.  }
100c0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  .}.../*.** Alloc
100d0 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ate and return a
100e0 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 74 68   duplicate of th
100f0 65 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20  e Window object 
10100 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65  indicated by the
10110 0a 2a 2a 20 74 68 69 72 64 20 61 72 67 75 6d 65  .** third argume
10120 6e 74 2e 20 53 65 74 20 74 68 65 20 57 69 6e 64  nt. Set the Wind
10130 6f 77 2e 70 4f 77 6e 65 72 20 66 69 65 6c 64 20  ow.pOwner field 
10140 6f 66 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63  of the new objec
10150 74 20 74 6f 0a 2a 2a 20 70 4f 77 6e 65 72 2e 0a  t to.** pOwner..
10160 2a 2f 0a 57 69 6e 64 6f 77 20 2a 73 71 6c 69 74  */.Window *sqlit
10170 65 33 57 69 6e 64 6f 77 44 75 70 28 73 71 6c 69  e3WindowDup(sqli
10180 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
10190 4f 77 6e 65 72 2c 20 57 69 6e 64 6f 77 20 2a 70  Owner, Window *p
101a0 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4e 65  ){.  Window *pNe
101b0 77 20 3d 20 30 3b 0a 20 20 69 66 28 20 41 4c 57  w = 0;.  if( ALW
101c0 41 59 53 28 70 29 20 29 7b 0a 20 20 20 20 70 4e  AYS(p) ){.    pN
101d0 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
101e0 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
101f0 65 6f 66 28 57 69 6e 64 6f 77 29 29 3b 0a 20 20  eof(Window));.  
10200 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
10210 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20      pNew->zName 
10220 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
10230 70 28 64 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b  p(db, p->zName);
10240 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 46 69  .      pNew->pFi
10250 6c 74 65 72 20 3d 20 73 71 6c 69 74 65 33 45 78  lter = sqlite3Ex
10260 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 46 69  prDup(db, p->pFi
10270 6c 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  lter, 0);.      
10280 70 4e 65 77 2d 3e 70 46 75 6e 63 20 3d 20 70 2d  pNew->pFunc = p-
10290 3e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 70 4e  >pFunc;.      pN
102a0 65 77 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 3d  ew->pPartition =
102b0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
102c0 44 75 70 28 64 62 2c 20 70 2d 3e 70 50 61 72 74  Dup(db, p->pPart
102d0 69 74 69 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 20  ition, 0);.     
102e0 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20   pNew->pOrderBy 
102f0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
10300 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64  tDup(db, p->pOrd
10310 65 72 42 79 2c 20 30 29 3b 0a 20 20 20 20 20 20  erBy, 0);.      
10320 70 4e 65 77 2d 3e 65 54 79 70 65 20 3d 20 70 2d  pNew->eType = p-
10330 3e 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70 4e  >eType;.      pN
10340 65 77 2d 3e 65 45 6e 64 20 3d 20 70 2d 3e 65 45  ew->eEnd = p->eE
10350 6e 64 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  nd;.      pNew->
10360 65 53 74 61 72 74 20 3d 20 70 2d 3e 65 53 74 61  eStart = p->eSta
10370 72 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  rt;.      pNew->
10380 70 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  pStart = sqlite3
10390 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
103a0 53 74 61 72 74 2c 20 30 29 3b 0a 20 20 20 20 20  Start, 0);.     
103b0 20 70 4e 65 77 2d 3e 70 45 6e 64 20 3d 20 73 71   pNew->pEnd = sq
103c0 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
103d0 20 70 2d 3e 70 45 6e 64 2c 20 30 29 3b 0a 20 20   p->pEnd, 0);.  
103e0 20 20 20 20 70 4e 65 77 2d 3e 70 4f 77 6e 65 72      pNew->pOwner
103f0 20 3d 20 70 4f 77 6e 65 72 3b 0a 20 20 20 20 7d   = pOwner;.    }
10400 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
10410 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ew;.}../*.** Ret
10420 75 72 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68  urn a copy of th
10430 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  e linked list of
10440 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 73 20   Window objects 
10450 70 61 73 73 65 64 20 61 73 20 74 68 65 0a 2a 2a  passed as the.**
10460 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
10470 2e 0a 2a 2f 0a 57 69 6e 64 6f 77 20 2a 73 71 6c  ..*/.Window *sql
10480 69 74 65 33 57 69 6e 64 6f 77 4c 69 73 74 44 75  ite3WindowListDu
10490 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  p(sqlite3 *db, W
104a0 69 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 57 69 6e  indow *p){.  Win
104b0 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 57 69 6e  dow *pWin;.  Win
104c0 64 6f 77 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20  dow *pRet = 0;. 
104d0 20 57 69 6e 64 6f 77 20 2a 2a 70 70 20 3d 20 26   Window **pp = &
104e0 70 52 65 74 3b 0a 0a 20 20 66 6f 72 28 70 57 69  pRet;..  for(pWi
104f0 6e 3d 70 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d  n=p; pWin; pWin=
10500 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b  pWin->pNextWin){
10510 0a 20 20 20 20 2a 70 70 20 3d 20 73 71 6c 69 74  .    *pp = sqlit
10520 65 33 57 69 6e 64 6f 77 44 75 70 28 64 62 2c 20  e3WindowDup(db, 
10530 30 2c 20 70 57 69 6e 29 3b 0a 20 20 20 20 69 66  0, pWin);.    if
10540 28 20 2a 70 70 3d 3d 30 20 29 20 62 72 65 61 6b  ( *pp==0 ) break
10550 3b 0a 20 20 20 20 70 70 20 3d 20 26 28 28 2a 70  ;.    pp = &((*p
10560 70 29 2d 3e 70 4e 65 78 74 57 69 6e 29 3b 0a 20  p)->pNextWin);. 
10570 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65   }..  return pRe
10580 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69  t;.}../*.** sqli
10590 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
105a0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
105b0 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20   called for the 
105c0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
105d0 20 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74   .** passed as t
105e0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
105f0 6e 74 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  nt when this fun
10600 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64  ction is invoked
10610 2e 20 49 74 20 67 65 6e 65 72 61 74 65 73 0a 2a  . It generates.*
10620 2a 20 63 6f 64 65 20 74 6f 20 70 6f 70 75 6c 61  * code to popula
10630 74 65 20 74 68 65 20 57 69 6e 64 6f 77 2e 72 65  te the Window.re
10640 67 52 65 73 75 6c 74 20 72 65 67 69 73 74 65 72  gResult register
10650 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77   for each window
10660 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a   function and.**
10670 20 69 6e 76 6f 6b 65 20 74 68 65 20 73 75 62 2d   invoke the sub-
10680 72 6f 75 74 69 6e 65 20 61 74 20 69 6e 73 74 72  routine at instr
10690 75 63 74 69 6f 6e 20 61 64 64 72 47 6f 73 75 62  uction addrGosub
106a0 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 72   once for each r
106b0 6f 77 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ow..** This func
106c0 74 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c 69 74  tion calls sqlit
106d0 65 33 57 68 65 72 65 45 6e 64 28 29 20 62 65 66  e3WhereEnd() bef
106e0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 0a  ore returning. .
106f0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57  */.void sqlite3W
10700 69 6e 64 6f 77 43 6f 64 65 53 74 65 70 28 0a 20  indowCodeStep(. 
10710 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
10720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10730 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
10740 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
10750 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10760 20 20 20 20 20 20 20 2f 2a 20 52 65 77 72 69 74         /* Rewrit
10770 74 65 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65  ten SELECT state
10780 6d 65 6e 74 20 2a 2f 0a 20 20 57 68 65 72 65 49  ment */.  WhereI
10790 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20  nfo *pWInfo,    
107a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
107b0 74 65 78 74 20 72 65 74 75 72 6e 65 64 20 62 79  text returned by
107c0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
107d0 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 72 65  in() */.  int re
107e0 67 47 6f 73 75 62 2c 20 20 20 20 20 20 20 20 20  gGosub,         
107f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
10800 69 73 74 65 72 20 66 6f 72 20 4f 50 5f 47 6f 73  ister for OP_Gos
10810 75 62 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ub */.  int addr
10820 47 6f 73 75 62 20 20 20 20 20 20 20 20 20 20 20  Gosub           
10830 20 20 20 20 20 20 20 20 2f 2a 20 4f 50 5f 47 6f          /* OP_Go
10840 73 75 62 20 68 65 72 65 20 74 6f 20 72 65 74 75  sub here to retu
10850 72 6e 20 65 61 63 68 20 72 6f 77 20 2a 2f 0a 29  rn each row */.)
10860 7b 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f  {.  VdbeModuleCo
10870 6d 6d 65 6e 74 28 28 70 50 61 72 73 65 2d 3e 70  mment((pParse->p
10880 56 64 62 65 2c 20 22 42 65 67 69 6e 20 77 69 6e  Vdbe, "Begin win
10890 64 6f 77 43 6f 64 65 53 74 65 70 28 29 22 29 29  dowCodeStep()"))
108a0 3b 0a 20 20 77 69 6e 64 6f 77 43 6f 64 65 53 74  ;.  windowCodeSt
108b0 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 57  ep(pParse, p, pW
108c0 49 6e 66 6f 2c 20 72 65 67 47 6f 73 75 62 2c 20  Info, regGosub, 
108d0 61 64 64 72 47 6f 73 75 62 29 3b 0a 20 20 56 64  addrGosub);.  Vd
108e0 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28  beModuleComment(
108f0 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
10900 22 45 6e 64 20 77 69 6e 64 6f 77 43 6f 64 65 53  "End windowCodeS
10910 74 65 70 28 29 22 29 29 3b 0a 7d 0a 0a 23 65 6e  tep()"));.}..#en
10920 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
10930 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f  IT_WINDOWFUNC */
10940 0a                                               .