/ Hex Artifact Content
Login

Artifact 8d53b6178212deab779624b1fd12b32c4581d33a8a0dfe29f869a81356a7acdd:


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 2f 2a 0a 2a 2a 20  ncs));.}../*.** 
3f90: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
3fa0: 20 63 61 6c 6c 65 64 20 69 6d 6d 65 64 69 61 74   called immediat
3fb0: 65 6c 79 20 61 66 74 65 72 20 72 65 73 6f 6c 76  ely after resolv
3fc0: 69 6e 67 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ing the function
3fd0: 20 6e 61 6d 65 0a 2a 2a 20 66 6f 72 20 61 20 77   name.** for a w
3fe0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 77  indow function w
3ff0: 69 74 68 69 6e 20 61 20 53 45 4c 45 43 54 20 73  ithin a SELECT s
4000: 74 61 74 65 6d 65 6e 74 2e 20 41 72 67 75 6d 65  tatement. Argume
4010: 6e 74 20 70 4c 69 73 74 20 69 73 20 61 0a 2a 2a  nt pList is a.**
4020: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
4030: 57 49 4e 44 4f 57 20 64 65 66 69 6e 69 74 69 6f  WINDOW definitio
4040: 6e 73 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ns for the curre
4050: 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  nt SELECT statem
4060: 65 6e 74 2e 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ent..** Argument
4070: 20 70 46 75 6e 63 20 69 73 20 74 68 65 20 66 75   pFunc is the fu
4080: 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f  nction definitio
4090: 6e 20 6a 75 73 74 20 72 65 73 6f 6c 76 65 64 20  n just resolved 
40a0: 61 6e 64 20 70 57 69 6e 0a 2a 2a 20 69 73 20 74  and pWin.** is t
40b0: 68 65 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74  he Window object
40c0: 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68   representing th
40d0: 65 20 61 73 73 6f 63 69 61 74 65 64 20 4f 56 45  e associated OVE
40e0: 52 20 63 6c 61 75 73 65 2e 20 54 68 69 73 0a 2a  R clause. This.*
40f0: 2a 20 66 75 6e 63 74 69 6f 6e 20 75 70 64 61 74  * function updat
4100: 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  es the contents 
4110: 6f 66 20 70 57 69 6e 20 61 73 20 66 6f 6c 6c 6f  of pWin as follo
4120: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66  ws:.**.**   * If
4130: 20 74 68 65 20 4f 56 45 52 20 63 6c 61 75 73 65   the OVER clause
4140: 20 72 65 66 65 72 65 64 20 74 6f 20 61 20 6e 61   refered to a na
4150: 6d 65 64 20 77 69 6e 64 6f 77 20 28 61 73 20 69  med window (as i
4160: 6e 20 22 6d 61 78 28 78 29 20 4f 56 45 52 20 77  n "max(x) OVER w
4170: 69 6e 22 29 2c 0a 2a 2a 20 20 20 20 20 73 65 61  in"),.**     sea
4180: 72 63 68 20 6c 69 73 74 20 70 4c 69 73 74 20 66  rch list pList f
4190: 6f 72 20 61 20 6d 61 74 63 68 69 6e 67 20 57 49  or a matching WI
41a0: 4e 44 4f 57 20 64 65 66 69 6e 69 74 69 6f 6e 2c  NDOW definition,
41b0: 20 61 6e 64 20 75 70 64 61 74 65 20 70 57 69 6e   and update pWin
41c0: 0a 2a 2a 20 20 20 20 20 61 63 63 6f 72 64 69 6e  .**     accordin
41d0: 67 6c 79 2e 20 49 66 20 6e 6f 20 73 75 63 68 20  gly. If no such 
41e0: 57 49 4e 44 4f 57 20 63 6c 61 75 73 65 20 63 61  WINDOW clause ca
41f0: 6e 20 62 65 20 66 6f 75 6e 64 2c 20 6c 65 61 76  n be found, leav
4200: 65 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 20 20  e an error.**   
4210: 20 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2a 0a    in pParse..**.
4220: 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 66 75  **   * If the fu
4230: 6e 63 74 69 6f 6e 20 69 73 20 61 20 62 75 69 6c  nction is a buil
4240: 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63  t-in window func
4250: 74 69 6f 6e 20 74 68 61 74 20 72 65 71 75 69 72  tion that requir
4260: 65 73 20 74 68 65 0a 2a 2a 20 20 20 20 20 77 69  es the.**     wi
4270: 6e 64 6f 77 20 74 6f 20 62 65 20 63 6f 65 72 63  ndow to be coerc
4280: 65 64 20 28 73 65 65 20 22 42 55 49 4c 54 2d 49  ed (see "BUILT-I
4290: 4e 20 57 49 4e 44 4f 57 20 46 55 4e 43 54 49 4f  N WINDOW FUNCTIO
42a0: 4e 53 22 20 61 74 20 74 68 65 20 74 6f 70 0a 2a  NS" at the top.*
42b0: 2a 20 20 20 20 20 6f 66 20 74 68 69 73 20 66 69  *     of this fi
42c0: 6c 65 29 2c 20 70 57 69 6e 20 69 73 20 75 70 64  le), pWin is upd
42d0: 61 74 65 64 20 68 65 72 65 2e 0a 2a 2f 0a 76 6f  ated here..*/.vo
42e0: 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  id sqlite3Window
42f0: 55 70 64 61 74 65 28 0a 20 20 50 61 72 73 65 20  Update(.  Parse 
4300: 2a 70 50 61 72 73 65 2c 20 0a 20 20 57 69 6e 64  *pParse, .  Wind
4310: 6f 77 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  ow *pList,      
4320: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
4330: 69 73 74 20 6f 66 20 6e 61 6d 65 64 20 77 69 6e  ist of named win
4340: 64 6f 77 73 20 66 6f 72 20 74 68 69 73 20 53 45  dows for this SE
4350: 4c 45 43 54 20 2a 2f 0a 20 20 57 69 6e 64 6f 77  LECT */.  Window
4360: 20 2a 70 57 69 6e 2c 20 20 20 20 20 20 20 20 20   *pWin,         
4370: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6e            /* Win
4380: 64 6f 77 20 66 72 61 6d 65 20 74 6f 20 75 70 64  dow frame to upd
4390: 61 74 65 20 2a 2f 0a 20 20 46 75 6e 63 44 65 66  ate */.  FuncDef
43a0: 20 2a 70 46 75 6e 63 20 20 20 20 20 20 20 20 20   *pFunc         
43b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6e 64           /* Wind
43c0: 6f 77 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69  ow function defi
43d0: 6e 69 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69  nition */.){.  i
43e0: 66 28 20 70 57 69 6e 2d 3e 7a 4e 61 6d 65 20 26  f( pWin->zName &
43f0: 26 20 70 57 69 6e 2d 3e 65 54 79 70 65 3d 3d 30  & pWin->eType==0
4400: 20 29 7b 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a   ){.    Window *
4410: 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69  p;.    for(p=pLi
4420: 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  st; p; p=p->pNex
4430: 74 57 69 6e 29 7b 0a 20 20 20 20 20 20 69 66 28  tWin){.      if(
4440: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
4450: 70 2d 3e 7a 4e 61 6d 65 2c 20 70 57 69 6e 2d 3e  p->zName, pWin->
4460: 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61  zName)==0 ) brea
4470: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
4480: 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73   p==0 ){.      s
4490: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
44a0: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
44b0: 77 69 6e 64 6f 77 3a 20 25 73 22 2c 20 70 57 69  window: %s", pWi
44c0: 6e 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  n->zName);.     
44d0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
44e0: 20 20 20 70 57 69 6e 2d 3e 70 50 61 72 74 69 74     pWin->pPartit
44f0: 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ion = sqlite3Exp
4500: 72 4c 69 73 74 44 75 70 28 70 50 61 72 73 65 2d  rListDup(pParse-
4510: 3e 64 62 2c 20 70 2d 3e 70 50 61 72 74 69 74 69  >db, p->pPartiti
4520: 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 70 57 69 6e  on, 0);.    pWin
4530: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c  ->pOrderBy = sql
4540: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
4550: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70  pParse->db, p->p
4560: 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 20 20 20  OrderBy, 0);.   
4570: 20 70 57 69 6e 2d 3e 70 53 74 61 72 74 20 3d 20   pWin->pStart = 
4580: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
4590: 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 53  Parse->db, p->pS
45a0: 74 61 72 74 2c 20 30 29 3b 0a 20 20 20 20 70 57  tart, 0);.    pW
45b0: 69 6e 2d 3e 70 45 6e 64 20 3d 20 73 71 6c 69 74  in->pEnd = sqlit
45c0: 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65  e3ExprDup(pParse
45d0: 2d 3e 64 62 2c 20 70 2d 3e 70 45 6e 64 2c 20 30  ->db, p->pEnd, 0
45e0: 29 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 65 53 74  );.    pWin->eSt
45f0: 61 72 74 20 3d 20 70 2d 3e 65 53 74 61 72 74 3b  art = p->eStart;
4600: 0a 20 20 20 20 70 57 69 6e 2d 3e 65 45 6e 64 20  .    pWin->eEnd 
4610: 3d 20 70 2d 3e 65 45 6e 64 3b 0a 20 20 20 20 70  = p->eEnd;.    p
4620: 57 69 6e 2d 3e 65 54 79 70 65 20 3d 20 70 2d 3e  Win->eType = p->
4630: 65 54 79 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28  eType;.  }.  if(
4640: 20 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67   pFunc->funcFlag
4650: 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
4660: 57 49 4e 44 4f 57 20 29 7b 0a 20 20 20 20 73 71  WINDOW ){.    sq
4670: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
4680: 73 65 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28 20  se->db;.    if( 
4690: 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72 20 29 7b  pWin->pFilter ){
46a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
46b0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
46c0: 20 20 20 20 20 20 20 20 20 20 22 46 49 4c 54 45            "FILTE
46d0: 52 20 63 6c 61 75 73 65 20 6d 61 79 20 6f 6e 6c  R clause may onl
46e0: 79 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61  y be used with a
46f0: 67 67 72 65 67 61 74 65 20 77 69 6e 64 6f 77 20  ggregate window 
4700: 66 75 6e 63 74 69 6f 6e 73 22 0a 20 20 20 20 20  functions".     
4710: 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 20 20   );.    }else.  
4720: 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 7a 4e 61    if( pFunc->zNa
4730: 6d 65 3d 3d 72 6f 77 5f 6e 75 6d 62 65 72 4e 61  me==row_numberNa
4740: 6d 65 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61  me || pFunc->zNa
4750: 6d 65 3d 3d 6e 74 69 6c 65 4e 61 6d 65 20 29 7b  me==ntileName ){
4760: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
4770: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 57 69  prDelete(db, pWi
4780: 6e 2d 3e 70 53 74 61 72 74 29 3b 0a 20 20 20 20  n->pStart);.    
4790: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
47a0: 65 74 65 28 64 62 2c 20 70 57 69 6e 2d 3e 70 45  ete(db, pWin->pE
47b0: 6e 64 29 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d  nd);.      pWin-
47c0: 3e 70 53 74 61 72 74 20 3d 20 70 57 69 6e 2d 3e  >pStart = pWin->
47d0: 70 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  pEnd = 0;.      
47e0: 70 57 69 6e 2d 3e 65 54 79 70 65 20 3d 20 54 4b  pWin->eType = TK
47f0: 5f 52 4f 57 53 3b 0a 20 20 20 20 20 20 70 57 69  _ROWS;.      pWi
4800: 6e 2d 3e 65 53 74 61 72 74 20 3d 20 54 4b 5f 55  n->eStart = TK_U
4810: 4e 42 4f 55 4e 44 45 44 3b 0a 20 20 20 20 20 20  NBOUNDED;.      
4820: 70 57 69 6e 2d 3e 65 45 6e 64 20 3d 20 54 4b 5f  pWin->eEnd = TK_
4830: 43 55 52 52 45 4e 54 3b 0a 20 20 20 20 7d 65 6c  CURRENT;.    }el
4840: 73 65 0a 0a 20 20 20 20 69 66 28 20 70 46 75 6e  se..    if( pFun
4850: 63 2d 3e 7a 4e 61 6d 65 3d 3d 64 65 6e 73 65 5f  c->zName==dense_
4860: 72 61 6e 6b 4e 61 6d 65 20 7c 7c 20 70 46 75 6e  rankName || pFun
4870: 63 2d 3e 7a 4e 61 6d 65 3d 3d 72 61 6e 6b 4e 61  c->zName==rankNa
4880: 6d 65 0a 20 20 20 20 20 7c 7c 20 70 46 75 6e 63  me.     || pFunc
4890: 2d 3e 7a 4e 61 6d 65 3d 3d 70 65 72 63 65 6e 74  ->zName==percent
48a0: 5f 72 61 6e 6b 4e 61 6d 65 20 7c 7c 20 70 46 75  _rankName || pFu
48b0: 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 63 75 6d 65 5f  nc->zName==cume_
48c0: 64 69 73 74 4e 61 6d 65 0a 20 20 20 20 29 7b 0a  distName.    ){.
48d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
48e0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 57 69 6e  rDelete(db, pWin
48f0: 2d 3e 70 53 74 61 72 74 29 3b 0a 20 20 20 20 20  ->pStart);.     
4900: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
4910: 74 65 28 64 62 2c 20 70 57 69 6e 2d 3e 70 45 6e  te(db, pWin->pEn
4920: 64 29 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e  d);.      pWin->
4930: 70 53 74 61 72 74 20 3d 20 70 57 69 6e 2d 3e 70  pStart = pWin->p
4940: 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  End = 0;.      p
4950: 57 69 6e 2d 3e 65 54 79 70 65 20 3d 20 54 4b 5f  Win->eType = TK_
4960: 52 41 4e 47 45 3b 0a 20 20 20 20 20 20 70 57 69  RANGE;.      pWi
4970: 6e 2d 3e 65 53 74 61 72 74 20 3d 20 54 4b 5f 55  n->eStart = TK_U
4980: 4e 42 4f 55 4e 44 45 44 3b 0a 20 20 20 20 20 20  NBOUNDED;.      
4990: 70 57 69 6e 2d 3e 65 45 6e 64 20 3d 20 54 4b 5f  pWin->eEnd = TK_
49a0: 43 55 52 52 45 4e 54 3b 0a 20 20 20 20 7d 0a 20  CURRENT;.    }. 
49b0: 20 7d 0a 20 20 70 57 69 6e 2d 3e 70 46 75 6e 63   }.  pWin->pFunc
49c0: 20 3d 20 70 46 75 6e 63 3b 0a 7d 0a 0a 2f 2a 0a   = pFunc;.}../*.
49d0: 2a 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63  ** Context objec
49e0: 74 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  t passed through
49f0: 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
4a00: 4c 69 73 74 28 29 20 74 6f 0a 2a 2a 20 73 65 6c  List() to.** sel
4a10: 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65  ectWindowRewrite
4a20: 45 78 70 72 43 62 28 29 20 62 79 20 73 65 6c 65  ExprCb() by sele
4a30: 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65 45  ctWindowRewriteE
4a40: 4c 69 73 74 28 29 2e 0a 2a 2f 0a 74 79 70 65 64  List()..*/.typed
4a50: 65 66 20 73 74 72 75 63 74 20 57 69 6e 64 6f 77  ef struct Window
4a60: 52 65 77 72 69 74 65 20 57 69 6e 64 6f 77 52 65  Rewrite WindowRe
4a70: 77 72 69 74 65 3b 0a 73 74 72 75 63 74 20 57 69  write;.struct Wi
4a80: 6e 64 6f 77 52 65 77 72 69 74 65 20 7b 0a 20 20  ndowRewrite {.  
4a90: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20  Window *pWin;.  
4aa0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20  SrcList *pSrc;. 
4ab0: 20 45 78 70 72 4c 69 73 74 20 2a 70 53 75 62 3b   ExprList *pSub;
4ac0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 53  .  Select *pSubS
4ad0: 65 6c 65 63 74 3b 20 20 20 20 20 20 20 20 20 20  elect;          
4ae0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 75     /* Current su
4af0: 62 2d 73 65 6c 65 63 74 2c 20 69 66 20 61 6e 79  b-select, if any
4b00: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61   */.};../*.** Ca
4b10: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
4b20: 75 73 65 64 20 62 79 20 73 65 6c 65 63 74 57 69  used by selectWi
4b30: 6e 64 6f 77 52 65 77 72 69 74 65 45 4c 69 73 74  ndowRewriteEList
4b40: 28 29 2e 20 49 66 20 6e 65 63 65 73 73 61 72 79  (). If necessary
4b50: 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  ,.** this functi
4b60: 6f 6e 20 61 70 70 65 6e 64 73 20 74 6f 20 74 68  on appends to th
4b70: 65 20 6f 75 74 70 75 74 20 65 78 70 72 65 73 73  e output express
4b80: 69 6f 6e 2d 6c 69 73 74 20 61 6e 64 20 75 70 64  ion-list and upd
4b90: 61 74 65 73 20 0a 2a 2a 20 65 78 70 72 65 73 73  ates .** express
4ba0: 69 6f 6e 20 28 2a 70 70 45 78 70 72 29 20 69 6e  ion (*ppExpr) in
4bb0: 20 70 6c 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69   place..*/.stati
4bc0: 63 20 69 6e 74 20 73 65 6c 65 63 74 57 69 6e 64  c int selectWind
4bd0: 6f 77 52 65 77 72 69 74 65 45 78 70 72 43 62 28  owRewriteExprCb(
4be0: 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
4bf0: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
4c00: 20 73 74 72 75 63 74 20 57 69 6e 64 6f 77 52 65   struct WindowRe
4c10: 77 72 69 74 65 20 2a 70 20 3d 20 70 57 61 6c 6b  write *p = pWalk
4c20: 65 72 2d 3e 75 2e 70 52 65 77 72 69 74 65 3b 0a  er->u.pRewrite;.
4c30: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
4c40: 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
4c50: 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  e;..  /* If this
4c60: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69   function is bei
4c70: 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77  ng called from w
4c80: 69 74 68 69 6e 20 61 20 73 63 61 6c 61 72 20 73  ithin a scalar s
4c90: 75 62 2d 73 65 6c 65 63 74 0a 20 20 2a 2a 20 74  ub-select.  ** t
4ca0: 68 61 74 20 75 73 65 64 20 62 79 20 74 68 65 20  hat used by the 
4cb0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
4cc0: 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64   being processed
4cd0: 2c 20 6f 6e 6c 79 20 70 72 6f 63 65 73 73 0a 20  , only process. 
4ce0: 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 20 65 78   ** TK_COLUMN ex
4cf0: 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72  pressions that r
4d00: 65 66 65 72 20 74 6f 20 69 74 20 28 74 68 65 20  efer to it (the 
4d10: 6f 75 74 65 72 20 53 45 4c 45 43 54 29 2e 20 44  outer SELECT). D
4d20: 6f 0a 20 20 2a 2a 20 6e 6f 74 20 70 72 6f 63 65  o.  ** not proce
4d30: 73 73 20 61 67 67 72 65 67 61 74 65 73 20 6f 72  ss aggregates or
4d40: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
4d50: 73 20 61 74 20 61 6c 6c 2c 20 61 73 20 74 68 65  s at all, as the
4d60: 79 20 62 65 6c 6f 6e 67 0a 20 20 2a 2a 20 74 6f  y belong.  ** to
4d70: 20 74 68 65 20 73 63 61 6c 61 72 20 73 75 62 2d   the scalar sub-
4d80: 73 65 6c 65 63 74 2e 20 20 2a 2f 0a 20 20 69 66  select.  */.  if
4d90: 28 20 70 2d 3e 70 53 75 62 53 65 6c 65 63 74 20  ( p->pSubSelect 
4da0: 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  ){.    if( pExpr
4db0: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
4dc0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
4dd0: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
4de0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
4df0: 6e 74 20 6e 53 72 63 20 3d 20 70 2d 3e 70 53 72  nt nSrc = p->pSr
4e00: 63 2d 3e 6e 53 72 63 3b 0a 20 20 20 20 20 20 69  c->nSrc;.      i
4e10: 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
4e20: 69 3d 30 3b 20 69 3c 6e 53 72 63 3b 20 69 2b 2b  i=0; i<nSrc; i++
4e30: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
4e40: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 2d  Expr->iTable==p-
4e50: 3e 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72  >pSrc->a[i].iCur
4e60: 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  sor ) break;.   
4e70: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
4e80: 3d 3d 6e 53 72 63 20 29 20 72 65 74 75 72 6e 20  ==nSrc ) return 
4e90: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
4ea0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63    }.  }..  switc
4eb0: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
4ec0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
4ed0: 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28  CTION:.      if(
4ee0: 20 70 45 78 70 72 2d 3e 70 57 69 6e 3d 3d 30 20   pExpr->pWin==0 
4ef0: 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
4f00: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
4f10: 20 20 20 20 20 20 20 57 69 6e 64 6f 77 20 2a 70         Window *p
4f20: 57 69 6e 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  Win;.        for
4f30: 28 70 57 69 6e 3d 70 2d 3e 70 57 69 6e 3b 20 70  (pWin=p->pWin; p
4f40: 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e  Win; pWin=pWin->
4f50: 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 20  pNextWin){.     
4f60: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
4f70: 70 57 69 6e 3d 3d 70 57 69 6e 20 29 7b 0a 20 20  pWin==pWin ){.  
4f80: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
4f90: 28 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 3d 3d  ( pWin->pOwner==
4fa0: 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 20  pExpr );.       
4fb0: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
4fc0: 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 20 20 20  Prune;.         
4fd0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
4fe0: 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61     }.      /* Fa
4ff0: 6c 6c 20 74 68 72 6f 75 67 68 2e 20 20 2a 2f 0a  ll through.  */.
5000: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
5010: 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63  _FUNCTION:.    c
5020: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
5030: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 44 75  .      Expr *pDu
5040: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  p = sqlite3ExprD
5050: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
5060: 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
5070: 70 2d 3e 70 53 75 62 20 3d 20 73 71 6c 69 74 65  p->pSub = sqlite
5080: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
5090: 70 50 61 72 73 65 2c 20 70 2d 3e 70 53 75 62 2c  pParse, p->pSub,
50a0: 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 69 66   pDup);.      if
50b0: 28 20 70 2d 3e 70 53 75 62 20 29 7b 0a 20 20 20  ( p->pSub ){.   
50c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70       assert( Exp
50d0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
50e0: 70 72 2c 20 45 50 5f 53 74 61 74 69 63 29 3d 3d  pr, EP_Static)==
50f0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70  0 );.        Exp
5100: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78  rSetProperty(pEx
5110: 70 72 2c 20 45 50 5f 53 74 61 74 69 63 29 3b 0a  pr, EP_Static);.
5120: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
5130: 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65  xprDelete(pParse
5140: 2d 3e 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20  ->db, pExpr);.  
5150: 20 20 20 20 20 20 45 78 70 72 43 6c 65 61 72 50        ExprClearP
5160: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
5170: 50 5f 53 74 61 74 69 63 29 3b 0a 20 20 20 20 20  P_Static);.     
5180: 20 20 20 6d 65 6d 73 65 74 28 70 45 78 70 72 2c     memset(pExpr,
5190: 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29   0, sizeof(Expr)
51a0: 29 3b 0a 0a 20 20 20 20 20 20 20 20 70 45 78 70  );..        pExp
51b0: 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d  r->op = TK_COLUM
51c0: 4e 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  N;.        pExpr
51d0: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 2d 3e 70  ->iColumn = p->p
51e0: 53 75 62 2d 3e 6e 45 78 70 72 2d 31 3b 0a 20 20  Sub->nExpr-1;.  
51f0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
5200: 62 6c 65 20 3d 20 70 2d 3e 70 57 69 6e 2d 3e 69  ble = p->pWin->i
5210: 45 70 68 43 73 72 3b 0a 20 20 20 20 20 20 7d 0a  EphCsr;.      }.
5220: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5230: 20 20 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c 74    }..    default
5240: 3a 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20  : /* no-op */.  
5250: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
5260: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
5270: 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20  tinue;.}.static 
5280: 69 6e 74 20 73 65 6c 65 63 74 57 69 6e 64 6f 77  int selectWindow
5290: 52 65 77 72 69 74 65 53 65 6c 65 63 74 43 62 28  RewriteSelectCb(
52a0: 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
52b0: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
52c0: 29 7b 0a 20 20 73 74 72 75 63 74 20 57 69 6e 64  ){.  struct Wind
52d0: 6f 77 52 65 77 72 69 74 65 20 2a 70 20 3d 20 70  owRewrite *p = p
52e0: 57 61 6c 6b 65 72 2d 3e 75 2e 70 52 65 77 72 69  Walker->u.pRewri
52f0: 74 65 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53  te;.  Select *pS
5300: 61 76 65 20 3d 20 70 2d 3e 70 53 75 62 53 65 6c  ave = p->pSubSel
5310: 65 63 74 3b 0a 20 20 69 66 28 20 70 53 61 76 65  ect;.  if( pSave
5320: 3d 3d 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ==pSelect ){.   
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 20 20 7d 65 6c 73 65 7b 0a 20  inue;.  }else{. 
5350: 20 20 20 70 2d 3e 70 53 75 62 53 65 6c 65 63 74     p->pSubSelect
5360: 20 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20 20 20   = pSelect;.    
5370: 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
5380: 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 65  t(pWalker, pSele
5390: 63 74 29 3b 0a 20 20 20 20 70 2d 3e 70 53 75 62  ct);.    p->pSub
53a0: 53 65 6c 65 63 74 20 3d 20 70 53 61 76 65 3b 0a  Select = pSave;.
53b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43    }.  return WRC
53c0: 5f 50 72 75 6e 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  _Prune;.}.../*.*
53d0: 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67  * Iterate throug
53e0: 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  h each expressio
53f0: 6e 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 2d  n in expression-
5400: 6c 69 73 74 20 70 45 4c 69 73 74 2e 20 46 6f 72  list pEList. For
5410: 20 65 61 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a   each:.**.**   *
5420: 20 54 4b 5f 43 4f 4c 55 4d 4e 2c 0a 2a 2a 20 20   TK_COLUMN,.**  
5430: 20 2a 20 61 67 67 72 65 67 61 74 65 20 66 75 6e   * aggregate fun
5440: 63 74 69 6f 6e 2c 20 6f 72 0a 2a 2a 20 20 20 2a  ction, or.**   *
5450: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
5460: 20 77 69 74 68 20 61 20 57 69 6e 64 6f 77 20 6f   with a Window o
5470: 62 6a 65 63 74 20 74 68 61 74 20 69 73 20 6e 6f  bject that is no
5480: 74 20 61 20 6d 65 6d 62 65 72 20 6f 66 20 74 68  t a member of th
5490: 65 20 0a 2a 2a 20 20 20 20 20 57 69 6e 64 6f 77  e .**     Window
54a0: 20 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20   list passed as 
54b0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
54c0: 65 6e 74 20 28 70 57 69 6e 29 2e 0a 2a 2a 0a 2a  ent (pWin)..**.*
54d0: 2a 20 41 70 70 65 6e 64 20 74 68 65 20 6e 6f 64  * Append the nod
54e0: 65 20 74 6f 20 6f 75 74 70 75 74 20 65 78 70 72  e to output expr
54f0: 65 73 73 69 6f 6e 2d 6c 69 73 74 20 28 2a 70 70  ession-list (*pp
5500: 53 75 62 29 2e 20 41 6e 64 20 72 65 70 6c 61 63  Sub). And replac
5510: 65 20 69 74 0a 2a 2a 20 77 69 74 68 20 61 20 54  e it.** with a T
5520: 4b 5f 43 4f 4c 55 4d 4e 20 74 68 61 74 20 72 65  K_COLUMN that re
5530: 61 64 73 20 74 68 65 20 28 4e 2d 31 29 74 68 20  ads the (N-1)th 
5540: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 61 62 6c 65  element of table
5550: 20 0a 2a 2a 20 70 57 69 6e 2d 3e 69 45 70 68 43   .** pWin->iEphC
5560: 73 72 2c 20 77 68 65 72 65 20 4e 20 69 73 20 74  sr, where N is t
5570: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  he number of ele
5580: 6d 65 6e 74 73 20 69 6e 20 28 2a 70 70 53 75 62  ments in (*ppSub
5590: 29 20 61 66 74 65 72 0a 2a 2a 20 61 70 70 65 6e  ) after.** appen
55a0: 64 69 6e 67 20 74 68 65 20 6e 65 77 20 6f 6e 65  ding the new one
55b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
55c0: 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77   selectWindowRew
55d0: 72 69 74 65 45 4c 69 73 74 28 0a 20 20 50 61 72  riteEList(.  Par
55e0: 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 57  se *pParse, .  W
55f0: 69 6e 64 6f 77 20 2a 70 57 69 6e 2c 0a 20 20 53  indow *pWin,.  S
5600: 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 0a 20 20  rcList *pSrc,.  
5610: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
5620: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5630: 2f 2a 20 52 65 77 72 69 74 65 20 65 78 70 72 65  /* Rewrite expre
5640: 73 73 69 6f 6e 73 20 69 6e 20 74 68 69 73 20 6c  ssions in this l
5650: 69 73 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ist */.  ExprLis
5660: 74 20 2a 2a 70 70 53 75 62 20 20 20 20 20 20 20  t **ppSub       
5670: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
5680: 55 54 3a 20 53 75 62 2d 73 65 6c 65 63 74 20 65  UT: Sub-select e
5690: 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 2a  xpression-list *
56a0: 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65 72 20 73 57  /.){.  Walker sW
56b0: 61 6c 6b 65 72 3b 0a 20 20 57 69 6e 64 6f 77 52  alker;.  WindowR
56c0: 65 77 72 69 74 65 20 73 52 65 77 72 69 74 65 3b  ewrite sRewrite;
56d0: 0a 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 61 6c  ..  memset(&sWal
56e0: 6b 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57  ker, 0, sizeof(W
56f0: 61 6c 6b 65 72 29 29 3b 0a 20 20 6d 65 6d 73 65  alker));.  memse
5700: 74 28 26 73 52 65 77 72 69 74 65 2c 20 30 2c 20  t(&sRewrite, 0, 
5710: 73 69 7a 65 6f 66 28 57 69 6e 64 6f 77 52 65 77  sizeof(WindowRew
5720: 72 69 74 65 29 29 3b 0a 0a 20 20 73 52 65 77 72  rite));..  sRewr
5730: 69 74 65 2e 70 53 75 62 20 3d 20 2a 70 70 53 75  ite.pSub = *ppSu
5740: 62 3b 0a 20 20 73 52 65 77 72 69 74 65 2e 70 57  b;.  sRewrite.pW
5750: 69 6e 20 3d 20 70 57 69 6e 3b 0a 20 20 73 52 65  in = pWin;.  sRe
5760: 77 72 69 74 65 2e 70 53 72 63 20 3d 20 70 53 72  write.pSrc = pSr
5770: 63 3b 0a 0a 20 20 73 57 61 6c 6b 65 72 2e 70 50  c;..  sWalker.pP
5780: 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
5790: 20 73 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61   sWalker.xExprCa
57a0: 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 57  llback = selectW
57b0: 69 6e 64 6f 77 52 65 77 72 69 74 65 45 78 70 72  indowRewriteExpr
57c0: 43 62 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 78 53  Cb;.  sWalker.xS
57d0: 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
57e0: 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72  selectWindowRewr
57f0: 69 74 65 53 65 6c 65 63 74 43 62 3b 0a 20 20 73  iteSelectCb;.  s
5800: 57 61 6c 6b 65 72 2e 75 2e 70 52 65 77 72 69 74  Walker.u.pRewrit
5810: 65 20 3d 20 26 73 52 65 77 72 69 74 65 3b 0a 0a  e = &sRewrite;..
5820: 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 57    (void)sqlite3W
5830: 61 6c 6b 45 78 70 72 4c 69 73 74 28 26 73 57 61  alkExprList(&sWa
5840: 6c 6b 65 72 2c 20 70 45 4c 69 73 74 29 3b 0a 0a  lker, pEList);..
5850: 20 20 2a 70 70 53 75 62 20 3d 20 73 52 65 77 72    *ppSub = sRewr
5860: 69 74 65 2e 70 53 75 62 3b 0a 7d 0a 0a 2f 2a 0a  ite.pSub;.}../*.
5870: 2a 2a 20 41 70 70 65 6e 64 20 61 20 63 6f 70 79  ** Append a copy
5880: 20 6f 66 20 65 61 63 68 20 65 78 70 72 65 73 73   of each express
5890: 69 6f 6e 20 69 6e 20 65 78 70 72 65 73 73 69 6f  ion in expressio
58a0: 6e 2d 6c 69 73 74 20 70 41 70 70 65 6e 64 20 74  n-list pAppend t
58b0: 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  o.** expression 
58c0: 6c 69 73 74 20 70 4c 69 73 74 2e 20 52 65 74 75  list pList. Retu
58d0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
58e0: 74 68 65 20 72 65 73 75 6c 74 20 6c 69 73 74 2e  the result list.
58f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 4c  .*/.static ExprL
5900: 69 73 74 20 2a 65 78 70 72 4c 69 73 74 41 70 70  ist *exprListApp
5910: 65 6e 64 4c 69 73 74 28 0a 20 20 50 61 72 73 65  endList(.  Parse
5920: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
5930: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
5940: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
5950: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
5960: 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68     /* List to wh
5970: 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d  ich to append. M
5980: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
5990: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 41 70 70    ExprList *pApp
59a0: 65 6e 64 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  end       /* Lis
59b0: 74 20 6f 66 20 76 61 6c 75 65 73 20 74 6f 20 61  t of values to a
59c0: 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20  ppend. Might be 
59d0: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  NULL */.){.  if(
59e0: 20 70 41 70 70 65 6e 64 20 29 7b 0a 20 20 20 20   pAppend ){.    
59f0: 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e  int i;.    int n
5a00: 49 6e 69 74 20 3d 20 70 4c 69 73 74 20 3f 20 70  Init = pList ? p
5a10: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b  List->nExpr : 0;
5a20: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
5a30: 70 41 70 70 65 6e 64 2d 3e 6e 45 78 70 72 3b 20  pAppend->nExpr; 
5a40: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
5a50: 20 2a 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33   *pDup = sqlite3
5a60: 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e  ExprDup(pParse->
5a70: 64 62 2c 20 70 41 70 70 65 6e 64 2d 3e 61 5b 69  db, pAppend->a[i
5a80: 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  ].pExpr, 0);.   
5a90: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
5aa0: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
5ab0: 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20  (pParse, pList, 
5ac0: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 69 66 28  pDup);.      if(
5ad0: 20 70 4c 69 73 74 20 29 20 70 4c 69 73 74 2d 3e   pList ) pList->
5ae0: 61 5b 6e 49 6e 69 74 2b 69 5d 2e 73 6f 72 74 4f  a[nInit+i].sortO
5af0: 72 64 65 72 20 3d 20 70 41 70 70 65 6e 64 2d 3e  rder = pAppend->
5b00: 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[i].sortOrder;.
5b10: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
5b20: 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
5b30: 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43 54  ** If the SELECT
5b40: 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65   statement passe
5b50: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
5b60: 61 72 67 75 6d 65 6e 74 20 64 6f 65 73 20 6e 6f  argument does no
5b70: 74 20 69 6e 76 6f 6b 65 0a 2a 2a 20 61 6e 79 20  t invoke.** any 
5b80: 53 51 4c 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  SQL window funct
5b90: 69 6f 6e 73 2c 20 74 68 69 73 20 66 75 6e 63 74  ions, this funct
5ba0: 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
5bb0: 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 0a 2a  Otherwise, it .*
5bc0: 2a 20 72 65 77 72 69 74 65 73 20 74 68 65 20 53  * rewrites the S
5bd0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
5be0: 73 6f 20 74 68 61 74 20 77 69 6e 64 6f 77 20 66  so that window f
5bf0: 75 6e 63 74 69 6f 6e 20 78 53 74 65 70 20 66 75  unction xStep fu
5c00: 6e 63 74 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 69  nctions.** are i
5c10: 6e 76 6f 6b 65 64 20 69 6e 20 74 68 65 20 63 6f  nvoked in the co
5c20: 72 72 65 63 74 20 6f 72 64 65 72 20 61 73 20 64  rrect order as d
5c30: 65 73 63 72 69 62 65 64 20 75 6e 64 65 72 20 22  escribed under "
5c40: 53 45 4c 45 43 54 20 52 45 57 52 49 54 49 4e 47  SELECT REWRITING
5c50: 22 0a 2a 2a 20 61 74 20 74 68 65 20 74 6f 70 20  ".** at the top 
5c60: 6f 66 20 74 68 69 73 20 66 69 6c 65 2e 0a 2a 2f  of this file..*/
5c70: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 69 6e 64  .int sqlite3Wind
5c80: 6f 77 52 65 77 72 69 74 65 28 50 61 72 73 65 20  owRewrite(Parse 
5c90: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
5ca0: 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *p){.  int rc = 
5cb0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
5cc0: 20 70 2d 3e 70 57 69 6e 20 29 7b 0a 20 20 20 20   p->pWin ){.    
5cd0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
5ce0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
5cf0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  ;.    sqlite3 *d
5d00: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
5d10: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62      Select *pSub
5d20: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
5d30: 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72    /* The subquer
5d40: 79 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74  y */.    SrcList
5d50: 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63   *pSrc = p->pSrc
5d60: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 57 68 65  ;.    Expr *pWhe
5d70: 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a  re = p->pWhere;.
5d80: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47      ExprList *pG
5d90: 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f  roupBy = p->pGro
5da0: 75 70 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a  upBy;.    Expr *
5db0: 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61  pHaving = p->pHa
5dc0: 76 69 6e 67 3b 0a 20 20 20 20 45 78 70 72 4c 69  ving;.    ExprLi
5dd0: 73 74 20 2a 70 53 6f 72 74 20 3d 20 30 3b 0a 0a  st *pSort = 0;..
5de0: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 53      ExprList *pS
5df0: 75 62 6c 69 73 74 20 3d 20 30 3b 20 20 20 20 20  ublist = 0;     
5e00: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
5e10: 6c 69 73 74 20 66 6f 72 20 73 75 62 2d 71 75 65  list for sub-que
5e20: 72 79 20 2a 2f 0a 20 20 20 20 57 69 6e 64 6f 77  ry */.    Window
5e30: 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57 69   *pMWin = p->pWi
5e40: 6e 3b 20 20 20 20 20 20 2f 2a 20 4d 61 73 74 65  n;      /* Maste
5e50: 72 20 77 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20  r window object 
5e60: 2a 2f 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a 70  */.    Window *p
5e70: 57 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  Win;            
5e80: 20 20 20 20 20 2f 2a 20 57 69 6e 64 6f 77 20 6f       /* Window o
5e90: 62 6a 65 63 74 20 69 74 65 72 61 74 6f 72 20 2a  bject iterator *
5ea0: 2f 0a 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d  /..    p->pSrc =
5eb0: 20 30 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72   0;.    p->pWher
5ec0: 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 47  e = 0;.    p->pG
5ed0: 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20 20 20  roupBy = 0;.    
5ee0: 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a  p->pHaving = 0;.
5ef0: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74  .    /* Create t
5f00: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
5f10: 73 65 20 66 6f 72 20 74 68 65 20 73 75 62 2d 73  se for the sub-s
5f20: 65 6c 65 63 74 2e 20 54 68 69 73 20 69 73 20 74  elect. This is t
5f30: 68 65 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e  he concatenation
5f40: 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 77  .    ** of the w
5f50: 69 6e 64 6f 77 20 50 41 52 54 49 54 49 4f 4e 20  indow PARTITION 
5f60: 61 6e 64 20 4f 52 44 45 52 20 42 59 20 63 6c 61  and ORDER BY cla
5f70: 75 73 65 73 2e 20 54 68 65 6e 2c 20 69 66 20 74  uses. Then, if t
5f80: 68 69 73 20 6d 61 6b 65 73 20 69 74 0a 20 20 20  his makes it.   
5f90: 20 2a 2a 20 72 65 64 75 6e 64 61 6e 74 2c 20 72   ** redundant, r
5fa0: 65 6d 6f 76 65 20 74 68 65 20 4f 52 44 45 52 20  emove the ORDER 
5fb0: 42 59 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65  BY from the pare
5fc0: 6e 74 20 53 45 4c 45 43 54 2e 20 20 2a 2f 0a 20  nt SELECT.  */. 
5fd0: 20 20 20 70 53 6f 72 74 20 3d 20 73 71 6c 69 74     pSort = sqlit
5fe0: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
5ff0: 2c 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74  , pMWin->pPartit
6000: 69 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 70 53 6f  ion, 0);.    pSo
6010: 72 74 20 3d 20 65 78 70 72 4c 69 73 74 41 70 70  rt = exprListApp
6020: 65 6e 64 4c 69 73 74 28 70 50 61 72 73 65 2c 20  endList(pParse, 
6030: 70 53 6f 72 74 2c 20 70 4d 57 69 6e 2d 3e 70 4f  pSort, pMWin->pO
6040: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28  rderBy);.    if(
6050: 20 70 53 6f 72 74 20 26 26 20 70 2d 3e 70 4f 72   pSort && p->pOr
6060: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69  derBy ){.      i
6070: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  f( sqlite3ExprLi
6080: 73 74 43 6f 6d 70 61 72 65 28 70 53 6f 72 74 2c  stCompare(pSort,
6090: 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31   p->pOrderBy, -1
60a0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
60b0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
60c0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
60d0: 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 20 20  derBy);.        
60e0: 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
60f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
6100: 20 20 20 20 2f 2a 20 41 73 73 69 67 6e 20 61 20      /* Assign a 
6110: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
6120: 72 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20  r the ephemeral 
6130: 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20 62 75  table used to bu
6140: 66 66 65 72 20 72 6f 77 73 2e 0a 20 20 20 20 2a  ffer rows..    *
6150: 2a 20 54 68 65 20 4f 70 65 6e 45 70 68 65 6d 65  * The OpenEpheme
6160: 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ral instruction 
6170: 69 73 20 63 6f 64 65 64 20 6c 61 74 65 72 2c 20  is coded later, 
6180: 61 66 74 65 72 20 69 74 20 69 73 20 6b 6e 6f 77  after it is know
6190: 6e 20 68 6f 77 0a 20 20 20 20 2a 2a 20 6d 61 6e  n how.    ** man
61a0: 79 20 63 6f 6c 75 6d 6e 73 20 74 68 65 20 74 61  y columns the ta
61b0: 62 6c 65 20 77 69 6c 6c 20 68 61 76 65 2e 20 20  ble will have.  
61c0: 2a 2f 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 69 45  */.    pMWin->iE
61d0: 70 68 43 73 72 20 3d 20 70 50 61 72 73 65 2d 3e  phCsr = pParse->
61e0: 6e 54 61 62 2b 2b 3b 0a 0a 20 20 20 20 73 65 6c  nTab++;..    sel
61f0: 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65  ectWindowRewrite
6200: 45 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4d  EList(pParse, pM
6210: 57 69 6e 2c 20 70 53 72 63 2c 20 70 2d 3e 70 45  Win, pSrc, p->pE
6220: 4c 69 73 74 2c 20 26 70 53 75 62 6c 69 73 74 29  List, &pSublist)
6230: 3b 0a 20 20 20 20 73 65 6c 65 63 74 57 69 6e 64  ;.    selectWind
6240: 6f 77 52 65 77 72 69 74 65 45 4c 69 73 74 28 70  owRewriteEList(p
6250: 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 70 53  Parse, pMWin, pS
6260: 72 63 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  rc, p->pOrderBy,
6270: 20 26 70 53 75 62 6c 69 73 74 29 3b 0a 20 20 20   &pSublist);.   
6280: 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43   pMWin->nBufferC
6290: 6f 6c 20 3d 20 28 70 53 75 62 6c 69 73 74 20 3f  ol = (pSublist ?
62a0: 20 70 53 75 62 6c 69 73 74 2d 3e 6e 45 78 70 72   pSublist->nExpr
62b0: 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 41   : 0);..    /* A
62c0: 70 70 65 6e 64 20 74 68 65 20 50 41 52 54 49 54  ppend the PARTIT
62d0: 49 4f 4e 20 42 59 20 61 6e 64 20 4f 52 44 45 52  ION BY and ORDER
62e0: 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 73 20   BY expressions 
62f0: 74 6f 20 74 68 65 20 74 6f 20 74 68 65 20 0a 20  to the to the . 
6300: 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74     ** sub-select
6310: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
6320: 2e 20 54 68 65 79 20 61 72 65 20 72 65 71 75 69  . They are requi
6330: 72 65 64 20 74 6f 20 66 69 67 75 72 65 20 6f 75  red to figure ou
6340: 74 20 77 68 65 72 65 20 0a 20 20 20 20 2a 2a 20  t where .    ** 
6350: 62 6f 75 6e 64 61 72 69 65 73 20 66 6f 72 20 70  boundaries for p
6360: 61 72 74 69 74 69 6f 6e 73 20 61 6e 64 20 73 65  artitions and se
6370: 74 73 20 6f 66 20 70 65 65 72 20 72 6f 77 73 20  ts of peer rows 
6380: 6c 69 65 2e 20 20 2a 2f 0a 20 20 20 20 70 53 75  lie.  */.    pSu
6390: 62 6c 69 73 74 20 3d 20 65 78 70 72 4c 69 73 74  blist = exprList
63a0: 41 70 70 65 6e 64 4c 69 73 74 28 70 50 61 72 73  AppendList(pPars
63b0: 65 2c 20 70 53 75 62 6c 69 73 74 2c 20 70 4d 57  e, pSublist, pMW
63c0: 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 29 3b  in->pPartition);
63d0: 0a 20 20 20 20 70 53 75 62 6c 69 73 74 20 3d 20  .    pSublist = 
63e0: 65 78 70 72 4c 69 73 74 41 70 70 65 6e 64 4c 69  exprListAppendLi
63f0: 73 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 6c  st(pParse, pSubl
6400: 69 73 74 2c 20 70 4d 57 69 6e 2d 3e 70 4f 72 64  ist, pMWin->pOrd
6410: 65 72 42 79 29 3b 0a 0a 20 20 20 20 2f 2a 20 41  erBy);..    /* A
6420: 70 70 65 6e 64 20 74 68 65 20 61 72 67 75 6d 65  ppend the argume
6430: 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 65 61  nts passed to ea
6440: 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  ch window functi
6450: 6f 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  on to the.    **
6460: 20 73 75 62 2d 73 65 6c 65 63 74 20 65 78 70 72   sub-select expr
6470: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 41 6c 73  ession list. Als
6480: 6f 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 72  o allocate two r
6490: 65 67 69 73 74 65 72 73 20 66 6f 72 20 65 61 63  egisters for eac
64a0: 68 0a 20 20 20 20 2a 2a 20 77 69 6e 64 6f 77 20  h.    ** window 
64b0: 66 75 6e 63 74 69 6f 6e 20 2d 20 6f 6e 65 20 66  function - one f
64c0: 6f 72 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  or the accumulat
64d0: 6f 72 2c 20 61 6e 6f 74 68 65 72 20 66 6f 72 20  or, another for 
64e0: 69 6e 74 65 72 69 6d 0a 20 20 20 20 2a 2a 20 72  interim.    ** r
64f0: 65 73 75 6c 74 73 2e 20 20 2a 2f 0a 20 20 20 20  esults.  */.    
6500: 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20  for(pWin=pMWin; 
6510: 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d  pWin; pWin=pWin-
6520: 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20  >pNextWin){.    
6530: 20 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 20    pWin->iArgCol 
6540: 3d 20 28 70 53 75 62 6c 69 73 74 20 3f 20 70 53  = (pSublist ? pS
6550: 75 62 6c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20  ublist->nExpr : 
6560: 30 29 3b 0a 20 20 20 20 20 20 70 53 75 62 6c 69  0);.      pSubli
6570: 73 74 20 3d 20 65 78 70 72 4c 69 73 74 41 70 70  st = exprListApp
6580: 65 6e 64 4c 69 73 74 28 70 50 61 72 73 65 2c 20  endList(pParse, 
6590: 70 53 75 62 6c 69 73 74 2c 20 70 57 69 6e 2d 3e  pSublist, pWin->
65a0: 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 29  pOwner->x.pList)
65b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 69 6e  ;.      if( pWin
65c0: 2d 3e 70 46 69 6c 74 65 72 20 29 7b 0a 20 20 20  ->pFilter ){.   
65d0: 20 20 20 20 20 45 78 70 72 20 2a 70 46 69 6c 74       Expr *pFilt
65e0: 65 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  er = sqlite3Expr
65f0: 44 75 70 28 64 62 2c 20 70 57 69 6e 2d 3e 70 46  Dup(db, pWin->pF
6600: 69 6c 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  ilter, 0);.     
6610: 20 20 20 70 53 75 62 6c 69 73 74 20 3d 20 73 71     pSublist = sq
6620: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
6630: 65 6e 64 28 70 50 61 72 73 65 2c 20 70 53 75 62  end(pParse, pSub
6640: 6c 69 73 74 2c 20 70 46 69 6c 74 65 72 29 3b 0a  list, pFilter);.
6650: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 57        }.      pW
6660: 69 6e 2d 3e 72 65 67 41 63 63 75 6d 20 3d 20 2b  in->regAccum = +
6670: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
6680: 20 20 20 20 20 70 57 69 6e 2d 3e 72 65 67 52 65       pWin->regRe
6690: 73 75 6c 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  sult = ++pParse-
66a0: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c  >nMem;.      sql
66b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
66c0: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57  , OP_Null, 0, pW
66d0: 69 6e 2d 3e 72 65 67 41 63 63 75 6d 29 3b 0a 20  in->regAccum);. 
66e0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
66f0: 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45  there is no ORDE
6700: 52 20 42 59 20 6f 72 20 50 41 52 54 49 54 49 4f  R BY or PARTITIO
6710: 4e 20 42 59 20 63 6c 61 75 73 65 2c 20 61 6e 64  N BY clause, and
6720: 20 74 68 65 20 77 69 6e 64 6f 77 0a 20 20 20 20   the window.    
6730: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 63 63 65  ** function acce
6740: 70 74 73 20 7a 65 72 6f 20 61 72 67 75 6d 65 6e  pts zero argumen
6750: 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72  ts, and there ar
6760: 65 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6c 75 6d  e no other colum
6770: 6e 73 0a 20 20 20 20 2a 2a 20 73 65 6c 65 63 74  ns.    ** select
6780: 65 64 20 28 65 2e 67 2e 20 22 53 45 4c 45 43 54  ed (e.g. "SELECT
6790: 20 72 6f 77 5f 6e 75 6d 62 65 72 28 29 20 4f 56   row_number() OV
67a0: 45 52 20 28 29 20 46 52 4f 4d 20 74 31 22 29 2c  ER () FROM t1"),
67b0: 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 0a   it is possible.
67c0: 20 20 20 20 2a 2a 20 74 68 61 74 20 70 53 75 62      ** that pSub
67d0: 6c 69 73 74 20 69 73 20 73 74 69 6c 6c 20 4e 55  list is still NU
67e0: 4c 4c 20 68 65 72 65 2e 20 41 64 64 20 61 20 63  LL here. Add a c
67f0: 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69  onstant expressi
6800: 6f 6e 20 68 65 72 65 20 74 6f 20 0a 20 20 20 20  on here to .    
6810: 2a 2a 20 6b 65 65 70 20 65 76 65 72 79 74 68 69  ** keep everythi
6820: 6e 67 20 6c 65 67 61 6c 20 69 6e 20 74 68 69 73  ng legal in this
6830: 20 63 61 73 65 2e 20 0a 20 20 20 20 2a 2f 0a 20   case. .    */. 
6840: 20 20 20 69 66 28 20 70 53 75 62 6c 69 73 74 3d     if( pSublist=
6850: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 53 75 62  =0 ){.      pSub
6860: 6c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  list = sqlite3Ex
6870: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
6880: 72 73 65 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  rse, 0, .       
6890: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c     sqlite3ExprAl
68a0: 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47  loc(db, TK_INTEG
68b0: 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54  ER, &sqlite3IntT
68c0: 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29 0a 20 20 20  okens[0], 0).   
68d0: 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20     );.    }..   
68e0: 20 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33 53   pSub = sqlite3S
68f0: 65 6c 65 63 74 4e 65 77 28 0a 20 20 20 20 20 20  electNew(.      
6900: 20 20 70 50 61 72 73 65 2c 20 70 53 75 62 6c 69    pParse, pSubli
6910: 73 74 2c 20 70 53 72 63 2c 20 70 57 68 65 72 65  st, pSrc, pWhere
6920: 2c 20 70 47 72 6f 75 70 42 79 2c 20 70 48 61 76  , pGroupBy, pHav
6930: 69 6e 67 2c 20 70 53 6f 72 74 2c 20 30 2c 20 30  ing, pSort, 0, 0
6940: 0a 20 20 20 20 29 3b 0a 20 20 20 20 70 2d 3e 70  .    );.    p->p
6950: 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Src = sqlite3Src
6960: 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20 30  ListAppend(db, 0
6970: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  , 0, 0);.    ass
6980: 65 72 74 28 20 70 2d 3e 70 53 72 63 20 7c 7c 20  ert( p->pSrc || 
6990: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
69a0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   );.    if( p->p
69b0: 53 72 63 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Src ){.      p->
69c0: 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
69d0: 63 74 20 3d 20 70 53 75 62 3b 0a 20 20 20 20 20  ct = pSub;.     
69e0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
69f0: 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61  ssignCursors(pPa
6a00: 72 73 65 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20  rse, p->pSrc);. 
6a10: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
6a20: 45 78 70 61 6e 64 53 75 62 71 75 65 72 79 28 70  ExpandSubquery(p
6a30: 50 61 72 73 65 2c 20 26 70 2d 3e 70 53 72 63 2d  Parse, &p->pSrc-
6a40: 3e 61 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  >a[0]) ){.      
6a50: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
6a60: 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  MEM;.      }else
6a70: 7b 0a 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e  {.        pSub->
6a80: 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45  selFlags |= SF_E
6a90: 78 70 61 6e 64 65 64 3b 0a 20 20 20 20 20 20 20  xpanded;.       
6aa0: 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20   p->selFlags &= 
6ab0: 7e 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20  ~SF_Aggregate;. 
6ac0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
6ad0: 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c  lectPrep(pParse,
6ae0: 20 70 53 75 62 2c 20 30 29 3b 0a 20 20 20 20 20   pSub, 0);.     
6af0: 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65   }..      sqlite
6b00: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6b10: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
6b20: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c   pMWin->iEphCsr,
6b30: 20 70 53 75 62 6c 69 73 74 2d 3e 6e 45 78 70 72   pSublist->nExpr
6b40: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
6b50: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
6b60: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62  tDelete(db, pSub
6b70: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
6b80: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
6b90: 64 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  d ) rc = SQLITE_
6ba0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 72 65  NOMEM;.  }..  re
6bb0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
6bc0: 2a 20 46 72 65 65 20 74 68 65 20 57 69 6e 64 6f  * Free the Windo
6bd0: 77 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  w object passed 
6be0: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
6bf0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  gument..*/.void 
6c00: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 65 6c  sqlite3WindowDel
6c10: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
6c20: 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 69   Window *p){.  i
6c30: 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( p ){.    sqli
6c40: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
6c50: 2c 20 70 2d 3e 70 46 69 6c 74 65 72 29 3b 0a 20  , p->pFilter);. 
6c60: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
6c70: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
6c80: 70 50 61 72 74 69 74 69 6f 6e 29 3b 0a 20 20 20  pPartition);.   
6c90: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
6ca0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f  Delete(db, p->pO
6cb0: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71 6c  rderBy);.    sql
6cc0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
6cd0: 62 2c 20 70 2d 3e 70 45 6e 64 29 3b 0a 20 20 20  b, p->pEnd);.   
6ce0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
6cf0: 74 65 28 64 62 2c 20 70 2d 3e 70 53 74 61 72 74  te(db, p->pStart
6d00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
6d10: 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4e 61 6d  Free(db, p->zNam
6d20: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  e);.    sqlite3D
6d30: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
6d40: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
6d50: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
6d60: 6f 66 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74  of Window object
6d70: 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 74 68  s starting at th
6d80: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
6d90: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
6da0: 65 33 57 69 6e 64 6f 77 4c 69 73 74 44 65 6c 65  e3WindowListDele
6db0: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
6dc0: 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 77 68  Window *p){.  wh
6dd0: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 57 69  ile( p ){.    Wi
6de0: 6e 64 6f 77 20 2a 70 4e 65 78 74 20 3d 20 70 2d  ndow *pNext = p-
6df0: 3e 70 4e 65 78 74 57 69 6e 3b 0a 20 20 20 20 73  >pNextWin;.    s
6e00: 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65  qlite3WindowDele
6e10: 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 70  te(db, p);.    p
6e20: 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 7d 0a   = pNext;.  }.}.
6e30: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  ./*.** The argum
6e40: 65 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ent expression i
6e50: 73 20 61 6e 20 50 52 45 43 45 44 49 4e 47 20 6f  s an PRECEDING o
6e60: 72 20 46 4f 4c 4c 4f 57 49 4e 47 20 6f 66 66 73  r FOLLOWING offs
6e70: 65 74 2e 20 20 54 68 65 0a 2a 2a 20 76 61 6c 75  et.  The.** valu
6e80: 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f  e should be a no
6e90: 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67  n-negative integ
6ea0: 65 72 2e 20 20 49 66 20 74 68 65 20 76 61 6c 75  er.  If the valu
6eb0: 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 63 6f  e is not a.** co
6ec0: 6e 73 74 61 6e 74 2c 20 63 68 61 6e 67 65 20 69  nstant, change i
6ed0: 74 20 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 65 20  t to NULL.  The 
6ee0: 66 61 63 74 20 74 68 61 74 20 69 74 20 69 73 20  fact that it is 
6ef0: 74 68 65 6e 20 61 20 6e 6f 6e 2d 6e 65 67 61 74  then a non-negat
6f00: 69 76 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 77  ive.** integer w
6f10: 69 6c 6c 20 62 65 20 63 61 75 67 68 74 20 6c 61  ill be caught la
6f20: 74 65 72 2e 20 20 42 75 74 20 69 74 20 69 73 20  ter.  But it is 
6f30: 69 6d 70 6f 72 74 61 6e 74 20 6e 6f 74 20 74 6f  important not to
6f40: 20 6c 65 61 76 65 0a 2a 2a 20 76 61 72 69 61 62   leave.** variab
6f50: 6c 65 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65  le values in the
6f60: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
6f70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72  ..*/.static Expr
6f80: 20 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4f   *sqlite3WindowO
6f90: 66 66 73 65 74 45 78 70 72 28 50 61 72 73 65 20  ffsetExpr(Parse 
6fa0: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
6fb0: 45 78 70 72 29 7b 0a 20 20 69 66 28 20 30 3d 3d  Expr){.  if( 0==
6fc0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
6fd0: 73 74 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a  stant(pExpr) ){.
6fe0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
6ff0: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
7000: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 70 45  , pExpr);.    pE
7010: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
7020: 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64  rAlloc(pParse->d
7030: 62 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30  b, TK_NULL, 0, 0
7040: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
7050: 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pExpr;.}../*.** 
7060: 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74  Allocate and ret
7070: 75 72 6e 20 61 20 6e 65 77 20 57 69 6e 64 6f 77  urn a new Window
7080: 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69 62 69   object describi
7090: 6e 67 20 61 20 57 69 6e 64 6f 77 20 44 65 66 69  ng a Window Defi
70a0: 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 57 69 6e 64 6f  nition..*/.Windo
70b0: 77 20 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  w *sqlite3Window
70c0: 41 6c 6c 6f 63 28 0a 20 20 50 61 72 73 65 20 2a  Alloc(.  Parse *
70d0: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
70e0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
70f0: 0a 20 20 69 6e 74 20 65 54 79 70 65 2c 20 20 20  .  int eType,   
7100: 20 20 20 20 20 2f 2a 20 46 72 61 6d 65 20 74 79       /* Frame ty
7110: 70 65 2e 20 54 4b 5f 52 41 4e 47 45 20 6f 72 20  pe. TK_RANGE or 
7120: 54 4b 5f 52 4f 57 53 20 2a 2f 0a 20 20 69 6e 74  TK_ROWS */.  int
7130: 20 65 53 74 61 72 74 2c 20 20 20 20 20 20 20 2f   eStart,       /
7140: 2a 20 53 74 61 72 74 20 74 79 70 65 3a 20 43 55  * Start type: CU
7150: 52 52 45 4e 54 2c 20 50 52 45 43 45 44 49 4e 47  RRENT, PRECEDING
7160: 2c 20 46 4f 4c 4c 4f 57 49 4e 47 2c 20 55 4e 42  , FOLLOWING, UNB
7170: 4f 55 4e 44 45 44 20 2a 2f 0a 20 20 45 78 70 72  OUNDED */.  Expr
7180: 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20 2f 2a   *pStart,     /*
7190: 20 53 74 61 72 74 20 77 69 6e 64 6f 77 20 73 69   Start window si
71a0: 7a 65 20 69 66 20 54 4b 5f 50 52 45 43 45 44 49  ze if TK_PRECEDI
71b0: 4e 47 20 6f 72 20 46 4f 4c 4c 4f 57 49 4e 47 20  NG or FOLLOWING 
71c0: 2a 2f 0a 20 20 69 6e 74 20 65 45 6e 64 2c 20 20  */.  int eEnd,  
71d0: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 74 79         /* End ty
71e0: 70 65 3a 20 43 55 52 52 45 4e 54 2c 20 46 4f 4c  pe: CURRENT, FOL
71f0: 4c 4f 57 49 4e 47 2c 20 54 4b 5f 55 4e 42 4f 55  LOWING, TK_UNBOU
7200: 4e 44 45 44 2c 20 50 52 45 43 45 44 49 4e 47 20  NDED, PRECEDING 
7210: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 6e 64 20  */.  Expr *pEnd 
7220: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 77 69         /* End wi
7230: 6e 64 6f 77 20 73 69 7a 65 20 69 66 20 54 4b 5f  ndow size if TK_
7240: 46 4f 4c 4c 4f 57 49 4e 47 20 6f 72 20 50 52 45  FOLLOWING or PRE
7250: 43 45 44 49 4e 47 20 2a 2f 0a 29 7b 0a 20 20 57  CEDING */.){.  W
7260: 69 6e 64 6f 77 20 2a 70 57 69 6e 20 3d 20 30 3b  indow *pWin = 0;
7270: 0a 0a 20 20 2f 2a 20 50 61 72 73 65 72 20 61 73  ..  /* Parser as
7280: 73 75 72 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77  sures the follow
7290: 69 6e 67 3a 20 2a 2f 0a 20 20 61 73 73 65 72 74  ing: */.  assert
72a0: 28 20 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47  ( eType==TK_RANG
72b0: 45 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 52  E || eType==TK_R
72c0: 4f 57 53 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OWS );.  assert(
72d0: 20 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52   eStart==TK_CURR
72e0: 45 4e 54 20 7c 7c 20 65 53 74 61 72 74 3d 3d 54  ENT || eStart==T
72f0: 4b 5f 50 52 45 43 45 44 49 4e 47 0a 20 20 20 20  K_PRECEDING.    
7300: 20 20 20 20 20 20 20 7c 7c 20 65 53 74 61 72 74         || eStart
7310: 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 7c  ==TK_UNBOUNDED |
7320: 7c 20 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c  | eStart==TK_FOL
7330: 4c 4f 57 49 4e 47 20 29 3b 0a 20 20 61 73 73 65  LOWING );.  asse
7340: 72 74 28 20 65 45 6e 64 3d 3d 54 4b 5f 43 55 52  rt( eEnd==TK_CUR
7350: 52 45 4e 54 20 7c 7c 20 65 45 6e 64 3d 3d 54 4b  RENT || eEnd==TK
7360: 5f 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20 20 20 20  _FOLLOWING.     
7370: 20 20 20 20 20 20 7c 7c 20 65 45 6e 64 3d 3d 54        || eEnd==T
7380: 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 7c 7c 20 65  K_UNBOUNDED || e
7390: 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e  End==TK_PRECEDIN
73a0: 47 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  G );.  assert( (
73b0: 65 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45  eStart==TK_PRECE
73c0: 44 49 4e 47 20 7c 7c 20 65 53 74 61 72 74 3d 3d  DING || eStart==
73d0: 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 29 3d 3d 28  TK_FOLLOWING)==(
73e0: 70 53 74 61 72 74 21 3d 30 29 20 29 3b 0a 20 20  pStart!=0) );.  
73f0: 61 73 73 65 72 74 28 20 28 65 45 6e 64 3d 3d 54  assert( (eEnd==T
7400: 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 7c 7c 20 65  K_FOLLOWING || e
7410: 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e  End==TK_PRECEDIN
7420: 47 29 3d 3d 28 70 45 6e 64 21 3d 30 29 20 29 3b  G)==(pEnd!=0) );
7430: 0a 0a 0a 20 20 2f 2a 20 49 66 20 61 20 66 72 61  ...  /* If a fra
7440: 6d 65 20 69 73 20 64 65 63 6c 61 72 65 64 20 22  me is declared "
7450: 52 41 4e 47 45 22 20 28 6e 6f 74 20 22 52 4f 57  RANGE" (not "ROW
7460: 53 22 29 2c 20 74 68 65 6e 20 69 74 20 6d 61 79  S"), then it may
7470: 20 6e 6f 74 20 75 73 65 0a 20 20 2a 2a 20 65 69   not use.  ** ei
7480: 74 68 65 72 20 22 3c 65 78 70 72 3e 20 50 52 45  ther "<expr> PRE
7490: 43 45 44 49 4e 47 22 20 6f 72 20 22 3c 65 78 70  CEDING" or "<exp
74a0: 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 22 2e 0a 20  r> FOLLOWING".. 
74b0: 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d   */.  if( eType=
74c0: 3d 54 4b 5f 52 41 4e 47 45 20 26 26 20 28 70 53  =TK_RANGE && (pS
74d0: 74 61 72 74 21 3d 30 20 7c 7c 20 70 45 6e 64 21  tart!=0 || pEnd!
74e0: 3d 30 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  =0) ){.    sqlit
74f0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
7500: 65 2c 20 22 52 41 4e 47 45 20 6d 75 73 74 20 75  e, "RANGE must u
7510: 73 65 20 6f 6e 6c 79 20 55 4e 42 4f 55 4e 44 45  se only UNBOUNDE
7520: 44 20 6f 72 20 43 55 52 52 45 4e 54 20 52 4f 57  D or CURRENT ROW
7530: 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 77 69 6e  ");.    goto win
7540: 64 6f 77 41 6c 6c 6f 63 45 72 72 3b 0a 20 20 7d  dowAllocErr;.  }
7550: 0a 0a 20 20 2f 2a 20 41 64 64 69 74 69 6f 6e 61  ..  /* Additiona
7560: 6c 6c 79 2c 20 74 68 65 0a 20 20 2a 2a 20 73 74  lly, the.  ** st
7570: 61 72 74 69 6e 67 20 62 6f 75 6e 64 61 72 79 20  arting boundary 
7580: 74 79 70 65 20 6d 61 79 20 6e 6f 74 20 6f 63 63  type may not occ
7590: 75 72 20 65 61 72 6c 69 65 72 20 69 6e 20 74 68  ur earlier in th
75a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 69 73 74  e following list
75b0: 20 74 68 61 6e 0a 20 20 2a 2a 20 74 68 65 20 65   than.  ** the e
75c0: 6e 64 69 6e 67 20 62 6f 75 6e 64 61 72 79 20 74  nding boundary t
75d0: 79 70 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ype:.  **.  **  
75e0: 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45   UNBOUNDED PRECE
75f0: 44 49 4e 47 0a 20 20 2a 2a 20 20 20 3c 65 78 70  DING.  **   <exp
7600: 72 3e 20 50 52 45 43 45 44 49 4e 47 0a 20 20 2a  r> PRECEDING.  *
7610: 2a 20 20 20 43 55 52 52 45 4e 54 20 52 4f 57 0a  *   CURRENT ROW.
7620: 20 20 2a 2a 20 20 20 3c 65 78 70 72 3e 20 46 4f    **   <expr> FO
7630: 4c 4c 4f 57 49 4e 47 0a 20 20 2a 2a 20 20 20 55  LLOWING.  **   U
7640: 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49  NBOUNDED FOLLOWI
7650: 4e 47 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  NG.  **.  ** The
7660: 20 70 61 72 73 65 72 20 65 6e 73 75 72 65 73 20   parser ensures 
7670: 74 68 61 74 20 22 55 4e 42 4f 55 4e 44 45 44 20  that "UNBOUNDED 
7680: 50 52 45 43 45 44 49 4e 47 22 20 63 61 6e 6e 6f  PRECEDING" canno
7690: 74 20 62 65 20 75 73 65 64 20 61 73 20 61 6e 20  t be used as an 
76a0: 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 6f 75 6e  ending.  ** boun
76b0: 64 61 72 79 2c 20 61 6e 64 20 74 68 61 6e 20 22  dary, and than "
76c0: 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57  UNBOUNDED FOLLOW
76d0: 49 4e 47 22 20 63 61 6e 6e 6f 74 20 62 65 20 75  ING" cannot be u
76e0: 73 65 64 20 61 73 20 61 20 73 74 61 72 74 69 6e  sed as a startin
76f0: 67 0a 20 20 2a 2a 20 66 72 61 6d 65 20 62 6f 75  g.  ** frame bou
7700: 6e 64 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ndary..  */.  if
7710: 28 20 28 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55  ( (eStart==TK_CU
7720: 52 52 45 4e 54 20 26 26 20 65 45 6e 64 3d 3d 54  RRENT && eEnd==T
7730: 4b 5f 50 52 45 43 45 44 49 4e 47 29 0a 20 20 20  K_PRECEDING).   
7740: 7c 7c 20 28 65 53 74 61 72 74 3d 3d 54 4b 5f 46  || (eStart==TK_F
7750: 4f 4c 4c 4f 57 49 4e 47 20 26 26 20 28 65 45 6e  OLLOWING && (eEn
7760: 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20  d==TK_PRECEDING 
7770: 7c 7c 20 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52  || eEnd==TK_CURR
7780: 45 4e 54 29 29 0a 20 20 29 7b 0a 20 20 20 20 73  ENT)).  ){.    s
7790: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
77a0: 50 61 72 73 65 2c 20 22 75 6e 73 75 70 70 6f 72  Parse, "unsuppor
77b0: 74 65 64 20 66 72 61 6d 65 20 64 65 6c 69 6d 69  ted frame delimi
77c0: 74 65 72 20 66 6f 72 20 52 4f 57 53 22 29 3b 0a  ter for ROWS");.
77d0: 20 20 20 20 67 6f 74 6f 20 77 69 6e 64 6f 77 41      goto windowA
77e0: 6c 6c 6f 63 45 72 72 3b 0a 20 20 7d 0a 0a 20 20  llocErr;.  }..  
77f0: 70 57 69 6e 20 3d 20 28 57 69 6e 64 6f 77 2a 29  pWin = (Window*)
7800: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
7810: 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ero(pParse->db, 
7820: 73 69 7a 65 6f 66 28 57 69 6e 64 6f 77 29 29 3b  sizeof(Window));
7830: 0a 20 20 69 66 28 20 70 57 69 6e 3d 3d 30 20 29  .  if( pWin==0 )
7840: 20 67 6f 74 6f 20 77 69 6e 64 6f 77 41 6c 6c 6f   goto windowAllo
7850: 63 45 72 72 3b 0a 20 20 70 57 69 6e 2d 3e 65 54  cErr;.  pWin->eT
7860: 79 70 65 20 3d 20 65 54 79 70 65 3b 0a 20 20 70  ype = eType;.  p
7870: 57 69 6e 2d 3e 65 53 74 61 72 74 20 3d 20 65 53  Win->eStart = eS
7880: 74 61 72 74 3b 0a 20 20 70 57 69 6e 2d 3e 65 45  tart;.  pWin->eE
7890: 6e 64 20 3d 20 65 45 6e 64 3b 0a 20 20 70 57 69  nd = eEnd;.  pWi
78a0: 6e 2d 3e 70 45 6e 64 20 3d 20 73 71 6c 69 74 65  n->pEnd = sqlite
78b0: 33 57 69 6e 64 6f 77 4f 66 66 73 65 74 45 78 70  3WindowOffsetExp
78c0: 72 28 70 50 61 72 73 65 2c 20 70 45 6e 64 29 3b  r(pParse, pEnd);
78d0: 0a 20 20 70 57 69 6e 2d 3e 70 53 74 61 72 74 20  .  pWin->pStart 
78e0: 3d 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4f  = sqlite3WindowO
78f0: 66 66 73 65 74 45 78 70 72 28 70 50 61 72 73 65  ffsetExpr(pParse
7900: 2c 20 70 53 74 61 72 74 29 3b 0a 20 20 72 65 74  , pStart);.  ret
7910: 75 72 6e 20 70 57 69 6e 3b 0a 0a 77 69 6e 64 6f  urn pWin;..windo
7920: 77 41 6c 6c 6f 63 45 72 72 3a 0a 20 20 73 71 6c  wAllocErr:.  sql
7930: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
7940: 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 6e 64 29  Parse->db, pEnd)
7950: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
7960: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
7970: 2c 20 70 53 74 61 72 74 29 3b 0a 20 20 72 65 74  , pStart);.  ret
7980: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
7990: 41 74 74 61 63 68 20 77 69 6e 64 6f 77 20 6f 62  Attach window ob
79a0: 6a 65 63 74 20 70 57 69 6e 20 74 6f 20 65 78 70  ject pWin to exp
79b0: 72 65 73 73 69 6f 6e 20 70 2e 0a 2a 2f 0a 76 6f  ression p..*/.vo
79c0: 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  id sqlite3Window
79d0: 41 74 74 61 63 68 28 50 61 72 73 65 20 2a 70 50  Attach(Parse *pP
79e0: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 2c 20 57  arse, Expr *p, W
79f0: 69 6e 64 6f 77 20 2a 70 57 69 6e 29 7b 0a 20 20  indow *pWin){.  
7a00: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  if( p ){.    if(
7a10: 20 70 57 69 6e 20 29 7b 0a 20 20 20 20 20 20 70   pWin ){.      p
7a20: 2d 3e 70 57 69 6e 20 3d 20 70 57 69 6e 3b 0a 20  ->pWin = pWin;. 
7a30: 20 20 20 20 20 70 57 69 6e 2d 3e 70 4f 77 6e 65       pWin->pOwne
7a40: 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 69 66 28  r = p;.      if(
7a50: 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44   p->flags & EP_D
7a60: 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20  istinct ){.     
7a70: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
7a80: 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
7a90: 20 20 20 20 20 20 22 44 49 53 54 49 4e 43 54 20        "DISTINCT 
7aa0: 69 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  is not supported
7ab0: 20 66 6f 72 20 77 69 6e 64 6f 77 20 66 75 6e 63   for window func
7ac0: 74 69 6f 6e 73 22 29 3b 0a 20 20 20 20 20 20 7d  tions");.      }
7ad0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
7ae0: 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64 6f      sqlite3Windo
7af0: 77 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  wDelete(pParse->
7b00: 64 62 2c 20 70 57 69 6e 29 3b 0a 20 20 7d 0a 7d  db, pWin);.  }.}
7b10: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30  ../*.** Return 0
7b20: 20 69 66 20 74 68 65 20 74 77 6f 20 77 69 6e 64   if the two wind
7b30: 6f 77 20 6f 62 6a 65 63 74 73 20 61 72 65 20 69  ow objects are i
7b40: 64 65 6e 74 69 63 61 6c 2c 20 6f 72 20 6e 6f 6e  dentical, or non
7b50: 2d 7a 65 72 6f 20 6f 74 68 65 72 77 69 73 65 2e  -zero otherwise.
7b60: 0a 2a 2a 20 49 64 65 6e 74 69 63 61 6c 20 77 69  .** Identical wi
7b70: 6e 64 6f 77 20 6f 62 6a 65 63 74 73 20 63 61 6e  ndow objects can
7b80: 20 62 65 20 70 72 6f 63 65 73 73 65 64 20 69 6e   be processed in
7b90: 20 61 20 73 69 6e 67 6c 65 20 73 63 61 6e 2e 0a   a single scan..
7ba0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 69  */.int sqlite3Wi
7bb0: 6e 64 6f 77 43 6f 6d 70 61 72 65 28 50 61 72 73  ndowCompare(Pars
7bc0: 65 20 2a 70 50 61 72 73 65 2c 20 57 69 6e 64 6f  e *pParse, Windo
7bd0: 77 20 2a 70 31 2c 20 57 69 6e 64 6f 77 20 2a 70  w *p1, Window *p
7be0: 32 29 7b 0a 20 20 69 66 28 20 70 31 2d 3e 65 54  2){.  if( p1->eT
7bf0: 79 70 65 21 3d 70 32 2d 3e 65 54 79 70 65 20 29  ype!=p2->eType )
7c00: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
7c10: 20 70 31 2d 3e 65 53 74 61 72 74 21 3d 70 32 2d   p1->eStart!=p2-
7c20: 3e 65 53 74 61 72 74 20 29 20 72 65 74 75 72 6e  >eStart ) return
7c30: 20 31 3b 0a 20 20 69 66 28 20 70 31 2d 3e 65 45   1;.  if( p1->eE
7c40: 6e 64 21 3d 70 32 2d 3e 65 45 6e 64 20 29 20 72  nd!=p2->eEnd ) r
7c50: 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73  eturn 1;.  if( s
7c60: 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
7c70: 65 28 70 50 61 72 73 65 2c 20 70 31 2d 3e 70 53  e(pParse, p1->pS
7c80: 74 61 72 74 2c 20 70 32 2d 3e 70 53 74 61 72 74  tart, p2->pStart
7c90: 2c 20 2d 31 29 20 29 20 72 65 74 75 72 6e 20 31  , -1) ) return 1
7ca0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  ;.  if( sqlite3E
7cb0: 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73  xprCompare(pPars
7cc0: 65 2c 20 70 31 2d 3e 70 45 6e 64 2c 20 70 32 2d  e, p1->pEnd, p2-
7cd0: 3e 70 45 6e 64 2c 20 2d 31 29 20 29 20 72 65 74  >pEnd, -1) ) ret
7ce0: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c  urn 1;.  if( sql
7cf0: 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
7d00: 61 72 65 28 70 31 2d 3e 70 50 61 72 74 69 74 69  are(p1->pPartiti
7d10: 6f 6e 2c 20 70 32 2d 3e 70 50 61 72 74 69 74 69  on, p2->pPartiti
7d20: 6f 6e 2c 20 2d 31 29 20 29 20 72 65 74 75 72 6e  on, -1) ) return
7d30: 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   1;.  if( sqlite
7d40: 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65  3ExprListCompare
7d50: 28 70 31 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70  (p1->pOrderBy, p
7d60: 32 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31 29  2->pOrderBy, -1)
7d70: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72   ) return 1;.  r
7d80: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn 0;.}.../*.
7d90: 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  ** This is calle
7da0: 64 20 62 79 20 63 6f 64 65 20 69 6e 20 73 65 6c  d by code in sel
7db0: 65 63 74 2e 63 20 62 65 66 6f 72 65 20 69 74 20  ect.c before it 
7dc0: 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 57 68 65  calls sqlite3Whe
7dd0: 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20 74 6f 20  reBegin().** to 
7de0: 62 65 67 69 6e 20 69 74 65 72 61 74 69 6e 67 20  begin iterating 
7df0: 74 68 72 6f 75 67 68 20 74 68 65 20 73 75 62 2d  through the sub-
7e00: 71 75 65 72 79 20 72 65 73 75 6c 74 73 2e 20 49  query results. I
7e10: 74 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c  t is used to all
7e20: 6f 63 61 74 65 0a 2a 2a 20 61 6e 64 20 69 6e 69  ocate.** and ini
7e30: 74 69 61 6c 69 7a 65 20 72 65 67 69 73 74 65 72  tialize register
7e40: 73 20 61 6e 64 20 63 75 72 73 6f 72 73 20 75 73  s and cursors us
7e50: 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 69 6e  ed by sqlite3Win
7e60: 64 6f 77 43 6f 64 65 53 74 65 70 28 29 2e 0a 2a  dowCodeStep()..*
7e70: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69  /.void sqlite3Wi
7e80: 6e 64 6f 77 43 6f 64 65 49 6e 69 74 28 50 61 72  ndowCodeInit(Par
7e90: 73 65 20 2a 70 50 61 72 73 65 2c 20 57 69 6e 64  se *pParse, Wind
7ea0: 6f 77 20 2a 70 4d 57 69 6e 29 7b 0a 20 20 57 69  ow *pMWin){.  Wi
7eb0: 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 56 64  ndow *pWin;.  Vd
7ec0: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
7ed0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
7ee0: 20 20 69 6e 74 20 6e 50 61 72 74 20 3d 20 28 70    int nPart = (p
7ef0: 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e  MWin->pPartition
7f00: 20 3f 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69   ? pMWin->pParti
7f10: 74 69 6f 6e 2d 3e 6e 45 78 70 72 20 3a 20 30 29  tion->nExpr : 0)
7f20: 3b 0a 20 20 6e 50 61 72 74 20 2b 3d 20 28 70 4d  ;.  nPart += (pM
7f30: 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20 3f 20  Win->pOrderBy ? 
7f40: 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 2d  pMWin->pOrderBy-
7f50: 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 69  >nExpr : 0);.  i
7f60: 66 28 20 6e 50 61 72 74 20 29 7b 0a 20 20 20 20  f( nPart ){.    
7f70: 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 20 3d  pMWin->regPart =
7f80: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
7f90: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
7fa0: 6d 20 2b 3d 20 6e 50 61 72 74 3b 0a 20 20 20 20  m += nPart;.    
7fb0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7fc0: 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  3(v, OP_Null, 0,
7fd0: 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c   pMWin->regPart,
7fe0: 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 2b   pMWin->regPart+
7ff0: 6e 50 61 72 74 2d 31 29 3b 0a 20 20 7d 0a 0a 20  nPart-1);.  }.. 
8000: 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b   for(pWin=pMWin;
8010: 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e   pWin; pWin=pWin
8020: 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20  ->pNextWin){.   
8030: 20 46 75 6e 63 44 65 66 20 2a 70 20 3d 20 70 57   FuncDef *p = pW
8040: 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 69  in->pFunc;.    i
8050: 66 28 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73  f( (p->funcFlags
8060: 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d   & SQLITE_FUNC_M
8070: 49 4e 4d 41 58 29 20 26 26 20 70 57 69 6e 2d 3e  INMAX) && pWin->
8080: 65 53 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55  eStart!=TK_UNBOU
8090: 4e 44 45 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a  NDED ){.      /*
80a0: 20 54 68 65 20 69 6e 6c 69 6e 65 20 76 65 72 73   The inline vers
80b0: 69 6f 6e 73 20 6f 66 20 6d 69 6e 28 29 20 61 6e  ions of min() an
80c0: 64 20 6d 61 78 28 29 20 72 65 71 75 69 72 65 20  d max() require 
80d0: 61 20 73 69 6e 67 6c 65 20 65 70 68 65 6d 65 72  a single ephemer
80e0: 61 6c 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  al.      ** tabl
80f0: 65 20 61 6e 64 20 33 20 72 65 67 69 73 74 65 72  e and 3 register
8100: 73 2e 20 54 68 65 20 72 65 67 69 73 74 65 72 73  s. The registers
8110: 20 61 72 65 20 75 73 65 64 20 61 73 20 66 6f 6c   are used as fol
8120: 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  lows:.      **. 
8130: 20 20 20 20 20 2a 2a 20 20 20 72 65 67 41 70 70       **   regApp
8140: 2b 30 3a 20 73 6c 6f 74 20 74 6f 20 63 6f 70 79  +0: slot to copy
8150: 20 6d 69 6e 28 29 2f 6d 61 78 28 29 20 61 72 67   min()/max() arg
8160: 75 6d 65 6e 74 20 74 6f 20 66 6f 72 20 4d 61 6b  ument to for Mak
8170: 65 52 65 63 6f 72 64 0a 20 20 20 20 20 20 2a 2a  eRecord.      **
8180: 20 20 20 72 65 67 41 70 70 2b 31 3a 20 69 6e 74     regApp+1: int
8190: 65 67 65 72 20 76 61 6c 75 65 20 75 73 65 64 20  eger value used 
81a0: 74 6f 20 65 6e 73 75 72 65 20 6b 65 79 73 20 61  to ensure keys a
81b0: 72 65 20 75 6e 69 71 75 65 0a 20 20 20 20 20 20  re unique.      
81c0: 2a 2a 20 20 20 72 65 67 41 70 70 2b 32 3a 20 6f  **   regApp+2: o
81d0: 75 74 70 75 74 20 6f 66 20 4d 61 6b 65 52 65 63  utput of MakeRec
81e0: 6f 72 64 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ord.      */.   
81f0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
8200: 73 74 20 3d 20 70 57 69 6e 2d 3e 70 4f 77 6e 65  st = pWin->pOwne
8210: 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
8220: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
8230: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
8240: 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
8250: 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20  (pParse, pList, 
8260: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 57 69  0, 0);.      pWi
8270: 6e 2d 3e 63 73 72 41 70 70 20 3d 20 70 50 61 72  n->csrApp = pPar
8280: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
8290: 20 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 20 3d    pWin->regApp =
82a0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
82b0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
82c0: 4d 65 6d 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20  Mem += 3;.      
82d0: 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 26 26 20  if( pKeyInfo && 
82e0: 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 7a 4e 61  pWin->pFunc->zNa
82f0: 6d 65 5b 31 5d 3d 3d 27 69 27 20 29 7b 0a 20 20  me[1]=='i' ){.  
8300: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4b        assert( pK
8310: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
8320: 65 72 5b 30 5d 3d 3d 30 20 29 3b 0a 20 20 20 20  er[0]==0 );.    
8330: 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53      pKeyInfo->aS
8340: 6f 72 74 4f 72 64 65 72 5b 30 5d 20 3d 20 31 3b  ortOrder[0] = 1;
8350: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
8360: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
8370: 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
8380: 65 72 61 6c 2c 20 70 57 69 6e 2d 3e 63 73 72 41  eral, pWin->csrA
8390: 70 70 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71  pp, 2);.      sq
83a0: 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
83b0: 34 28 76 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 50  4(v, pKeyInfo, P
83c0: 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
83d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
83e0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
83f0: 72 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41  r, 0, pWin->regA
8400: 70 70 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pp+1);.    }.   
8410: 20 65 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4e 61   else if( p->zNa
8420: 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d  me==nth_valueNam
8430: 65 20 7c 7c 20 70 2d 3e 7a 4e 61 6d 65 3d 3d 66  e || p->zName==f
8440: 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65 20 29  irst_valueName )
8450: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63  {.      /* Alloc
8460: 61 74 65 20 74 77 6f 20 72 65 67 69 73 74 65 72  ate two register
8470: 73 20 61 74 20 70 57 69 6e 2d 3e 72 65 67 41 70  s at pWin->regAp
8480: 70 2e 20 54 68 65 73 65 20 77 69 6c 6c 20 62 65  p. These will be
8490: 20 75 73 65 64 20 74 6f 0a 20 20 20 20 20 20 2a   used to.      *
84a0: 2a 20 73 74 6f 72 65 20 74 68 65 20 73 74 61 72  * store the star
84b0: 74 20 61 6e 64 20 65 6e 64 20 69 6e 64 65 78 20  t and end index 
84c0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 66  of the current f
84d0: 72 61 6d 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  rame.  */.      
84e0: 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 69  assert( pMWin->i
84f0: 45 70 68 43 73 72 20 29 3b 0a 20 20 20 20 20 20  EphCsr );.      
8500: 70 57 69 6e 2d 3e 72 65 67 41 70 70 20 3d 20 70  pWin->regApp = p
8510: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
8520: 20 20 20 20 20 70 57 69 6e 2d 3e 63 73 72 41 70       pWin->csrAp
8530: 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  p = pParse->nTab
8540: 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  ++;.      pParse
8550: 2d 3e 6e 4d 65 6d 20 2b 3d 20 32 3b 0a 20 20 20  ->nMem += 2;.   
8560: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8570: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44  dOp2(v, OP_OpenD
8580: 75 70 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70  up, pWin->csrApp
8590: 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
85a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73  );.    }.    els
85b0: 65 20 69 66 28 20 70 2d 3e 7a 4e 61 6d 65 3d 3d  e if( p->zName==
85c0: 6c 65 61 64 4e 61 6d 65 20 7c 7c 20 70 2d 3e 7a  leadName || p->z
85d0: 4e 61 6d 65 3d 3d 6c 61 67 4e 61 6d 65 20 29 7b  Name==lagName ){
85e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
85f0: 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 20 29 3b  MWin->iEphCsr );
8600: 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 63 73 72  .      pWin->csr
8610: 41 70 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  App = pParse->nT
8620: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69  ab++;.      sqli
8630: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8640: 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70 57 69   OP_OpenDup, pWi
8650: 6e 2d 3e 63 73 72 41 70 70 2c 20 70 4d 57 69 6e  n->csrApp, pMWin
8660: 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 20 20  ->iEphCsr);.    
8670: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
8680: 20 22 50 52 45 43 45 44 49 4e 47 20 3c 65 78 70   "PRECEDING <exp
8690: 72 3e 22 20 28 65 43 6f 6e 64 3d 3d 30 29 20 6f  r>" (eCond==0) o
86a0: 72 20 22 46 4f 4c 4c 4f 57 49 4e 47 20 3c 65 78  r "FOLLOWING <ex
86b0: 70 72 3e 22 20 28 65 43 6f 6e 64 3d 3d 31 29 20  pr>" (eCond==1) 
86c0: 6f 72 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  or the.** value 
86d0: 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  of the second ar
86e0: 67 75 6d 65 6e 74 20 74 6f 20 6e 74 68 5f 76 61  gument to nth_va
86f0: 6c 75 65 28 29 20 28 65 43 6f 6e 64 3d 3d 32 29  lue() (eCond==2)
8700: 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 0a 2a   has just been.*
8710: 2a 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  * evaluated and 
8720: 74 68 65 20 72 65 73 75 6c 74 20 6c 65 66 74 20  the result left 
8730: 69 6e 20 72 65 67 69 73 74 65 72 20 72 65 67 2e  in register reg.
8740: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 67   This function g
8750: 65 6e 65 72 61 74 65 73 20 56 4d 0a 2a 2a 20 63  enerates VM.** c
8760: 6f 64 65 20 74 6f 20 63 68 65 63 6b 20 74 68 61  ode to check tha
8770: 74 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 61  t the value is a
8780: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e   non-negative in
8790: 74 65 67 65 72 20 61 6e 64 20 74 68 72 6f 77 73  teger and throws
87a0: 20 61 6e 0a 2a 2a 20 65 78 63 65 70 74 69 6f 6e   an.** exception
87b0: 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2e 0a 2a   if it is not..*
87c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
87d0: 6e 64 6f 77 43 68 65 63 6b 49 6e 74 56 61 6c 75  ndowCheckIntValu
87e0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
87f0: 20 69 6e 74 20 72 65 67 2c 20 69 6e 74 20 65 43   int reg, int eC
8800: 6f 6e 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63  ond){.  static c
8810: 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 45 72 72  onst char *azErr
8820: 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 66 72 61 6d  [] = {.    "fram
8830: 65 20 73 74 61 72 74 69 6e 67 20 6f 66 66 73 65  e starting offse
8840: 74 20 6d 75 73 74 20 62 65 20 61 20 6e 6f 6e 2d  t must be a non-
8850: 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72  negative integer
8860: 22 2c 0a 20 20 20 20 22 66 72 61 6d 65 20 65 6e  ",.    "frame en
8870: 64 69 6e 67 20 6f 66 66 73 65 74 20 6d 75 73 74  ding offset must
8880: 20 62 65 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69   be a non-negati
8890: 76 65 20 69 6e 74 65 67 65 72 22 2c 0a 20 20 20  ve integer",.   
88a0: 20 22 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e   "second argumen
88b0: 74 20 74 6f 20 6e 74 68 5f 76 61 6c 75 65 20 6d  t to nth_value m
88c0: 75 73 74 20 62 65 20 61 20 70 6f 73 69 74 69 76  ust be a positiv
88d0: 65 20 69 6e 74 65 67 65 72 22 0a 20 20 7d 3b 0a  e integer".  };.
88e0: 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 4f 70    static int aOp
88f0: 5b 5d 20 3d 20 7b 20 4f 50 5f 47 65 2c 20 4f 50  [] = { OP_Ge, OP
8900: 5f 47 65 2c 20 4f 50 5f 47 74 20 7d 3b 0a 20 20  _Ge, OP_Gt };.  
8910: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
8920: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
8930: 3b 0a 20 20 69 6e 74 20 72 65 67 5a 65 72 6f 20  ;.  int regZero 
8940: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
8950: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 61  Reg(pParse);.  a
8960: 73 73 65 72 74 28 20 65 43 6f 6e 64 3d 3d 30 20  ssert( eCond==0 
8970: 7c 7c 20 65 43 6f 6e 64 3d 3d 31 20 7c 7c 20 65  || eCond==1 || e
8980: 43 6f 6e 64 3d 3d 32 20 29 3b 0a 20 20 73 71 6c  Cond==2 );.  sql
8990: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
89a0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
89b0: 20 72 65 67 5a 65 72 6f 29 3b 0a 20 20 73 71 6c   regZero);.  sql
89c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
89d0: 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
89e0: 72 65 67 2c 20 73 71 6c 69 74 65 33 56 64 62 65  reg, sqlite3Vdbe
89f0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32  CurrentAddr(v)+2
8a00: 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67  );.  VdbeCoverag
8a10: 65 49 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 30 29  eIf(v, eCond==0)
8a20: 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  ;.  VdbeCoverage
8a30: 49 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 31 29 3b  If(v, eCond==1);
8a40: 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  .  VdbeCoverageI
8a50: 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 32 29 3b 0a  f(v, eCond==2);.
8a60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8a70: 4f 70 33 28 76 2c 20 61 4f 70 5b 65 43 6f 6e 64  Op3(v, aOp[eCond
8a80: 5d 2c 20 72 65 67 5a 65 72 6f 2c 20 73 71 6c 69  ], regZero, sqli
8a90: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
8aa0: 64 72 28 76 29 2b 32 2c 20 72 65 67 29 3b 0a 20  dr(v)+2, reg);. 
8ab0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76   VdbeCoverageNev
8ac0: 65 72 4e 75 6c 6c 49 66 28 76 2c 20 65 43 6f 6e  erNullIf(v, eCon
8ad0: 64 3d 3d 30 29 3b 0a 20 20 56 64 62 65 43 6f 76  d==0);.  VdbeCov
8ae0: 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c 49 66  erageNeverNullIf
8af0: 28 76 2c 20 65 43 6f 6e 64 3d 3d 31 29 3b 0a 20  (v, eCond==1);. 
8b00: 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76   VdbeCoverageNev
8b10: 65 72 4e 75 6c 6c 49 66 28 76 2c 20 65 43 6f 6e  erNullIf(v, eCon
8b20: 64 3d 3d 32 29 3b 0a 20 20 73 71 6c 69 74 65 33  d==2);.  sqlite3
8b30: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
8b40: 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 45 52  _Halt, SQLITE_ER
8b50: 52 4f 52 2c 20 4f 45 5f 41 62 6f 72 74 29 3b 0a  ROR, OE_Abort);.
8b60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70    sqlite3VdbeApp
8b70: 65 6e 64 50 34 28 76 2c 20 28 76 6f 69 64 2a 29  endP4(v, (void*)
8b80: 61 7a 45 72 72 5b 65 43 6f 6e 64 5d 2c 20 50 34  azErr[eCond], P4
8b90: 5f 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69  _STATIC);.  sqli
8ba0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
8bb0: 67 28 70 50 61 72 73 65 2c 20 72 65 67 5a 65 72  g(pParse, regZer
8bc0: 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  o);.}../*.** Ret
8bd0: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
8be0: 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73  f arguments pass
8bf0: 65 64 20 74 6f 20 74 68 65 20 77 69 6e 64 6f 77  ed to the window
8c00: 2d 66 75 6e 63 74 69 6f 6e 20 61 73 73 6f 63 69  -function associ
8c10: 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65  ated.** with the
8c20: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
8c30: 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
8c40: 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
8c50: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
8c60: 69 6e 74 20 77 69 6e 64 6f 77 41 72 67 43 6f 75  int windowArgCou
8c70: 6e 74 28 57 69 6e 64 6f 77 20 2a 70 57 69 6e 29  nt(Window *pWin)
8c80: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  {.  ExprList *pL
8c90: 69 73 74 20 3d 20 70 57 69 6e 2d 3e 70 4f 77 6e  ist = pWin->pOwn
8ca0: 65 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 72  er->x.pList;.  r
8cb0: 65 74 75 72 6e 20 28 70 4c 69 73 74 20 3f 20 70  eturn (pList ? p
8cc0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29  List->nExpr : 0)
8cd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
8ce0: 61 74 65 20 56 4d 20 63 6f 64 65 20 74 6f 20 69  ate VM code to i
8cf0: 6e 76 6f 6b 65 20 65 69 74 68 65 72 20 78 53 74  nvoke either xSt
8d00: 65 70 28 29 20 28 69 66 20 62 49 6e 76 65 72 73  ep() (if bInvers
8d10: 65 20 69 73 20 30 29 20 6f 72 20 0a 2a 2a 20 78  e is 0) or .** x
8d20: 49 6e 76 65 72 73 65 20 28 69 66 20 62 49 6e 76  Inverse (if bInv
8d30: 65 72 73 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  erse is non-zero
8d40: 29 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f  ) for each windo
8d50: 77 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 74 68  w function in th
8d60: 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73  e .** linked lis
8d70: 74 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 4d  t starting at pM
8d80: 57 69 6e 2e 20 4f 72 2c 20 66 6f 72 20 62 75 69  Win. Or, for bui
8d90: 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e  lt-in window fun
8da0: 63 74 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 64  ctions.** that d
8db0: 6f 20 6e 6f 74 20 75 73 65 20 74 68 65 20 73 74  o not use the st
8dc0: 61 6e 64 61 72 64 20 66 75 6e 63 74 69 6f 6e 20  andard function 
8dd0: 41 50 49 2c 20 67 65 6e 65 72 61 74 65 20 74 68  API, generate th
8de0: 65 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 69 6e  e required.** in
8df0: 6c 69 6e 65 20 56 4d 20 63 6f 64 65 2e 0a 2a 2a  line VM code..**
8e00: 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
8e10: 63 73 72 20 69 73 20 67 72 65 61 74 65 72 20 74  csr is greater t
8e20: 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
8e30: 30 2c 20 74 68 65 6e 20 61 72 67 75 6d 65 6e 74  0, then argument
8e40: 20 72 65 67 20 69 73 0a 2a 2a 20 74 68 65 20 66   reg is.** the f
8e50: 69 72 73 74 20 72 65 67 69 73 74 65 72 20 69 6e  irst register in
8e60: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67   an array of reg
8e70: 69 73 74 65 72 73 20 67 75 61 72 61 6e 74 65 65  isters guarantee
8e80: 64 20 74 6f 20 62 65 20 6c 61 72 67 65 0a 2a 2a  d to be large.**
8e90: 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
8ea0: 74 68 65 20 61 72 72 61 79 20 6f 66 20 61 72 67  the array of arg
8eb0: 75 6d 65 6e 74 73 20 66 6f 72 20 65 61 63 68 20  uments for each 
8ec0: 66 75 6e 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69  function. In thi
8ed0: 73 20 63 61 73 65 0a 2a 2a 20 74 68 65 20 61 72  s case.** the ar
8ee0: 67 75 6d 65 6e 74 73 20 61 72 65 20 65 78 74 72  guments are extr
8ef0: 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 63  acted from the c
8f00: 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 63 73  urrent row of cs
8f10: 72 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 61 72  r into the.** ar
8f20: 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
8f30: 20 62 65 66 6f 72 65 20 69 6e 76 6f 6b 69 6e 67   before invoking
8f40: 20 4f 50 5f 41 67 67 53 74 65 70 20 6f 72 20 4f   OP_AggStep or O
8f50: 50 5f 41 67 67 49 6e 76 65 72 73 65 0a 2a 2a 0a  P_AggInverse.**.
8f60: 2a 2a 20 4f 72 2c 20 69 66 20 63 73 72 20 69 73  ** Or, if csr is
8f70: 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
8f80: 20 74 68 65 6e 20 74 68 65 20 61 72 72 61 79 20   then the array 
8f90: 6f 66 20 72 65 67 69 73 74 65 72 73 20 61 74 20  of registers at 
8fa0: 72 65 67 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64  reg is.** alread
8fb0: 79 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  y populated with
8fc0: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 66 72 6f   all columns fro
8fd0: 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  m the current ro
8fe0: 77 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65  w of the sub-que
8ff0: 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67  ry..**.** If arg
9000: 75 6d 65 6e 74 20 72 65 67 50 61 72 74 53 69 7a  ument regPartSiz
9010: 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  e is non-zero, t
9020: 68 65 6e 20 69 74 20 69 73 20 61 20 72 65 67 69  hen it is a regi
9030: 73 74 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ster containing 
9040: 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
9050: 20 72 6f 77 73 20 69 6e 20 74 68 65 20 63 75 72   rows in the cur
9060: 72 65 6e 74 20 70 61 72 74 69 74 69 6f 6e 2e 0a  rent partition..
9070: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
9080: 69 6e 64 6f 77 41 67 67 53 74 65 70 28 0a 20 20  indowAggStep(.  
9090: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a  Parse *pParse, .
90a0: 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 2c    Window *pMWin,
90b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90c0: 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74    /* Linked list
90d0: 20 6f 66 20 77 69 6e 64 6f 77 20 66 75 6e 63 74   of window funct
90e0: 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 63 73  ions */.  int cs
90f0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
9100: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
9110: 64 20 61 72 67 75 6d 65 6e 74 73 20 66 72 6f 6d  d arguments from
9120: 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a   this cursor */.
9130: 20 20 69 6e 74 20 62 49 6e 76 65 72 73 65 2c 20    int bInverse, 
9140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9150: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 76    /* True to inv
9160: 6f 6b 65 20 78 49 6e 76 65 72 73 65 20 69 6e 73  oke xInverse ins
9170: 74 65 61 64 20 6f 66 20 78 53 74 65 70 20 2a 2f  tead of xStep */
9180: 0a 20 20 69 6e 74 20 72 65 67 2c 20 20 20 20 20  .  int reg,     
9190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91a0: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 72     /* Array of r
91b0: 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 69 6e  egisters */.  in
91c0: 74 20 72 65 67 50 61 72 74 53 69 7a 65 20 20 20  t regPartSize   
91d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
91e0: 20 52 65 67 69 73 74 65 72 20 63 6f 6e 74 61 69   Register contai
91f0: 6e 69 6e 67 20 73 69 7a 65 20 6f 66 20 70 61 72  ning size of par
9200: 74 69 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 56  tition */.){.  V
9210: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
9220: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
9230: 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b  .  Window *pWin;
9240: 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69  .  for(pWin=pMWi
9250: 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57  n; pWin; pWin=pW
9260: 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20  in->pNextWin){. 
9270: 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70     int flags = p
9280: 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63  Win->pFunc->func
9290: 46 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 72  Flags;.    int r
92a0: 65 67 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 6e  egArg;.    int n
92b0: 41 72 67 20 3d 20 77 69 6e 64 6f 77 41 72 67 43  Arg = windowArgC
92c0: 6f 75 6e 74 28 70 57 69 6e 29 3b 0a 0a 20 20 20  ount(pWin);..   
92d0: 20 69 66 28 20 63 73 72 3e 3d 30 20 29 7b 0a 20   if( csr>=0 ){. 
92e0: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
92f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
9300: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
9310: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9320: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
9330: 20 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67   csr, pWin->iArg
9340: 43 6f 6c 2b 69 2c 20 72 65 67 2b 69 29 3b 0a 20  Col+i, reg+i);. 
9350: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 67       }.      reg
9360: 41 72 67 20 3d 20 72 65 67 3b 0a 20 20 20 20 20  Arg = reg;.     
9370: 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
9380: 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 5f  ITE_FUNC_WINDOW_
9390: 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20  SIZE ){.        
93a0: 69 66 28 20 6e 41 72 67 3d 3d 30 20 29 7b 0a 20  if( nArg==0 ){. 
93b0: 20 20 20 20 20 20 20 20 20 72 65 67 41 72 67 20           regArg 
93c0: 3d 20 72 65 67 50 61 72 74 53 69 7a 65 3b 0a 20  = regPartSize;. 
93d0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
93e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
93f0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
9400: 53 43 6f 70 79 2c 20 72 65 67 50 61 72 74 53 69  SCopy, regPartSi
9410: 7a 65 2c 20 72 65 67 2b 6e 41 72 67 29 3b 0a 20  ze, reg+nArg);. 
9420: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9430: 20 6e 41 72 67 2b 2b 3b 0a 20 20 20 20 20 20 7d   nArg++;.      }
9440: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9450: 20 20 61 73 73 65 72 74 28 20 21 28 66 6c 61 67    assert( !(flag
9460: 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
9470: 57 49 4e 44 4f 57 5f 53 49 5a 45 29 20 29 3b 0a  WINDOW_SIZE) );.
9480: 20 20 20 20 20 20 72 65 67 41 72 67 20 3d 20 72        regArg = r
9490: 65 67 20 2b 20 70 57 69 6e 2d 3e 69 41 72 67 43  eg + pWin->iArgC
94a0: 6f 6c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ol;.    }..    i
94b0: 66 28 20 28 70 57 69 6e 2d 3e 70 46 75 6e 63 2d  f( (pWin->pFunc-
94c0: 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
94d0: 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29  ITE_FUNC_MINMAX)
94e0: 20 0a 20 20 20 20 20 20 26 26 20 70 57 69 6e 2d   .      && pWin-
94f0: 3e 65 53 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f  >eStart!=TK_UNBO
9500: 55 4e 44 45 44 20 0a 20 20 20 20 29 7b 0a 20 20  UNDED .    ){.  
9510: 20 20 20 20 69 6e 74 20 61 64 64 72 49 73 4e 75      int addrIsNu
9520: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ll = sqlite3Vdbe
9530: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e  AddOp1(v, OP_IsN
9540: 75 6c 6c 2c 20 72 65 67 41 72 67 29 3b 0a 20 20  ull, regArg);.  
9550: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
9560: 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62  (v);.      if( b
9570: 49 6e 76 65 72 73 65 3d 3d 30 20 29 7b 0a 20 20  Inverse==0 ){.  
9580: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9590: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
95a0: 64 49 6d 6d 2c 20 70 57 69 6e 2d 3e 72 65 67 41  dImm, pWin->regA
95b0: 70 70 2b 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  pp+1, 1);.      
95c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
95d0: 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c  Op2(v, OP_SCopy,
95e0: 20 72 65 67 41 72 67 2c 20 70 57 69 6e 2d 3e 72   regArg, pWin->r
95f0: 65 67 41 70 70 29 3b 0a 20 20 20 20 20 20 20 20  egApp);.        
9600: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9610: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
9620: 72 64 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70  rd, pWin->regApp
9630: 2c 20 32 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70  , 2, pWin->regAp
9640: 70 2b 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71  p+2);.        sq
9650: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
9660: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
9670: 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20 70   pWin->csrApp, p
9680: 57 69 6e 2d 3e 72 65 67 41 70 70 2b 32 29 3b 0a  Win->regApp+2);.
9690: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
96a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
96b0: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
96c0: 53 65 65 6b 47 45 2c 20 70 57 69 6e 2d 3e 63 73  SeekGE, pWin->cs
96d0: 72 41 70 70 2c 20 30 2c 20 72 65 67 41 72 67 2c  rApp, 0, regArg,
96e0: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62   1);.        Vdb
96f0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
9700: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9710: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65  eAddOp1(v, OP_De
9720: 6c 65 74 65 2c 20 70 57 69 6e 2d 3e 63 73 72 41  lete, pWin->csrA
9730: 70 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  pp);.        sql
9740: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
9750: 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  (v, sqlite3VdbeC
9760: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 32 29  urrentAddr(v)-2)
9770: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9780: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
9790: 65 72 65 28 76 2c 20 61 64 64 72 49 73 4e 75 6c  ere(v, addrIsNul
97a0: 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  l);.    }else if
97b0: 28 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 20 29  ( pWin->regApp )
97c0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
97d0: 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 7a 4e 61  pWin->pFunc->zNa
97e0: 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d  me==nth_valueNam
97f0: 65 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  e.           || 
9800: 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 7a 4e 61  pWin->pFunc->zNa
9810: 6d 65 3d 3d 66 69 72 73 74 5f 76 61 6c 75 65 4e  me==first_valueN
9820: 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ame.      );.   
9830: 20 20 20 61 73 73 65 72 74 28 20 62 49 6e 76 65     assert( bInve
9840: 72 73 65 3d 3d 30 20 7c 7c 20 62 49 6e 76 65 72  rse==0 || bInver
9850: 73 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  se==1 );.      s
9860: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
9870: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70  (v, OP_AddImm, p
9880: 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31 2d 62 49  Win->regApp+1-bI
9890: 6e 76 65 72 73 65 2c 20 31 29 3b 0a 20 20 20 20  nverse, 1);.    
98a0: 7d 65 6c 73 65 20 69 66 28 20 70 57 69 6e 2d 3e  }else if( pWin->
98b0: 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65  pFunc->zName==le
98c0: 61 64 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 20  adName.         
98d0: 20 20 7c 7c 20 70 57 69 6e 2d 3e 70 46 75 6e 63    || pWin->pFunc
98e0: 2d 3e 7a 4e 61 6d 65 3d 3d 6c 61 67 4e 61 6d 65  ->zName==lagName
98f0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
9900: 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d 65   no-op */.    }e
9910: 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  lse{.      int a
9920: 64 64 72 49 66 20 3d 20 30 3b 0a 20 20 20 20 20  ddrIf = 0;.     
9930: 20 69 66 28 20 70 57 69 6e 2d 3e 70 46 69 6c 74   if( pWin->pFilt
9940: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  er ){.        in
9950: 74 20 72 65 67 54 6d 70 3b 0a 20 20 20 20 20 20  t regTmp;.      
9960: 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d    assert( nArg==
9970: 30 20 7c 7c 20 6e 41 72 67 3d 3d 70 57 69 6e 2d  0 || nArg==pWin-
9980: 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74  >pOwner->x.pList
9990: 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->nExpr );.     
99a0: 20 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 20     assert( nArg 
99b0: 7c 7c 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d  || pWin->pOwner-
99c0: 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20  >x.pList==0 );. 
99d0: 20 20 20 20 20 20 20 69 66 28 20 63 73 72 3e 30         if( csr>0
99e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
99f0: 67 54 6d 70 20 3d 20 73 71 6c 69 74 65 33 47 65  gTmp = sqlite3Ge
9a00: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
9a10: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
9a20: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
9a30: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c   OP_Column, csr,
9a40: 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 6e   pWin->iArgCol+n
9a50: 41 72 67 2c 72 65 67 54 6d 70 29 3b 0a 20 20 20  Arg,regTmp);.   
9a60: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9a70: 20 20 20 20 20 20 72 65 67 54 6d 70 20 3d 20 72        regTmp = r
9a80: 65 67 41 72 67 20 2b 20 6e 41 72 67 3b 0a 20 20  egArg + nArg;.  
9a90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9aa0: 61 64 64 72 49 66 20 3d 20 73 71 6c 69 74 65 33  addrIf = sqlite3
9ab0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
9ac0: 5f 49 66 4e 6f 74 2c 20 72 65 67 54 6d 70 2c 20  _IfNot, regTmp, 
9ad0: 30 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 56  0, 1);.        V
9ae0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
9af0: 20 20 20 20 20 20 20 20 69 66 28 20 63 73 72 3e          if( csr>
9b00: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
9b10: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
9b20: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
9b30: 54 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Tmp);.        }.
9b40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
9b50: 28 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66  ( pWin->pFunc->f
9b60: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
9b70: 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20  E_FUNC_NEEDCOLL 
9b80: 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  ){.        CollS
9b90: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  eq *pColl;.     
9ba0: 20 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3e     assert( nArg>
9bb0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  0 );.        pCo
9bc0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
9bd0: 4e 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  NNCollSeq(pParse
9be0: 2c 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e  , pWin->pOwner->
9bf0: 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  x.pList->a[0].pE
9c00: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  xpr);.        sq
9c10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
9c20: 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30  v, OP_CollSeq, 0
9c30: 2c 30 2c 30 2c 20 28 63 6f 6e 73 74 20 63 68 61  ,0,0, (const cha
9c40: 72 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c  r*)pColl, P4_COL
9c50: 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LSEQ);.      }. 
9c60: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9c70: 41 64 64 4f 70 33 28 76 2c 20 62 49 6e 76 65 72  AddOp3(v, bInver
9c80: 73 65 3f 20 4f 50 5f 41 67 67 49 6e 76 65 72 73  se? OP_AggInvers
9c90: 65 20 3a 20 4f 50 5f 41 67 67 53 74 65 70 2c 20  e : OP_AggStep, 
9ca0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9cb0: 20 20 20 20 20 20 20 20 20 62 49 6e 76 65 72 73           bInvers
9cc0: 65 2c 20 72 65 67 41 72 67 2c 20 70 57 69 6e 2d  e, regArg, pWin-
9cd0: 3e 72 65 67 41 63 63 75 6d 29 3b 0a 20 20 20 20  >regAccum);.    
9ce0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70    sqlite3VdbeApp
9cf0: 65 6e 64 50 34 28 76 2c 20 70 57 69 6e 2d 3e 70  endP4(v, pWin->p
9d00: 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46  Func, P4_FUNCDEF
9d10: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9d20: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
9d30: 28 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20 20  (u8)nArg);.     
9d40: 20 69 66 28 20 61 64 64 72 49 66 20 29 20 73 71   if( addrIf ) sq
9d50: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
9d60: 65 28 76 2c 20 61 64 64 72 49 66 29 3b 0a 20 20  e(v, addrIf);.  
9d70: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
9d80: 20 47 65 6e 65 72 61 74 65 20 56 4d 20 63 6f 64   Generate VM cod
9d90: 65 20 74 6f 20 69 6e 76 6f 6b 65 20 65 69 74 68  e to invoke eith
9da0: 65 72 20 78 56 61 6c 75 65 28 29 20 28 62 46 69  er xValue() (bFi
9db0: 6e 61 6c 3d 3d 30 29 20 6f 72 20 78 46 69 6e 61  nal==0) or xFina
9dc0: 6c 69 7a 65 28 29 0a 2a 2a 20 28 62 46 69 6e 61  lize().** (bFina
9dd0: 6c 3d 3d 31 29 20 66 6f 72 20 65 61 63 68 20 77  l==1) for each w
9de0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 69  indow function i
9df0: 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  n the linked lis
9e00: 74 20 73 74 61 72 74 69 6e 67 20 61 74 0a 2a 2a  t starting at.**
9e10: 20 70 4d 57 69 6e 2e 20 4f 72 2c 20 66 6f 72 20   pMWin. Or, for 
9e20: 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 2d  built-in window-
9e30: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 64  functions that d
9e40: 6f 20 6e 6f 74 20 75 73 65 20 74 68 65 20 73 74  o not use the st
9e50: 61 6e 64 61 72 64 0a 2a 2a 20 41 50 49 2c 20 67  andard.** API, g
9e60: 65 6e 65 72 61 74 65 20 74 68 65 20 65 71 75 69  enerate the equi
9e70: 76 61 6c 65 6e 74 20 56 4d 20 63 6f 64 65 2e 0a  valent VM code..
9e80: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
9e90: 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 50 61  indowAggFinal(Pa
9ea0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 57 69 6e  rse *pParse, Win
9eb0: 64 6f 77 20 2a 70 4d 57 69 6e 2c 20 69 6e 74 20  dow *pMWin, int 
9ec0: 62 46 69 6e 61 6c 29 7b 0a 20 20 56 64 62 65 20  bFinal){.  Vdbe 
9ed0: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
9ee0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 57  dbe(pParse);.  W
9ef0: 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 0a 20 20  indow *pWin;..  
9f00: 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20  for(pWin=pMWin; 
9f10: 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d  pWin; pWin=pWin-
9f20: 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20  >pNextWin){.    
9f30: 69 66 28 20 28 70 57 69 6e 2d 3e 70 46 75 6e 63  if( (pWin->pFunc
9f40: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
9f50: 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58  LITE_FUNC_MINMAX
9f60: 29 20 0a 20 20 20 20 20 26 26 20 70 57 69 6e 2d  ) .     && pWin-
9f70: 3e 65 53 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f  >eStart!=TK_UNBO
9f80: 55 4e 44 45 44 20 0a 20 20 20 20 29 7b 0a 20 20  UNDED .    ){.  
9f90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9fa0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
9fb0: 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65  , 0, pWin->regRe
9fc0: 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  sult);.      sql
9fd0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
9fe0: 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 57 69 6e 2d  , OP_Last, pWin-
9ff0: 3e 63 73 72 41 70 70 29 3b 0a 20 20 20 20 20 20  >csrApp);.      
a000: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
a010: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a020: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
a030: 6f 6c 75 6d 6e 2c 20 70 57 69 6e 2d 3e 63 73 72  olumn, pWin->csr
a040: 41 70 70 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65  App, 0, pWin->re
a050: 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20  gResult);.      
a060: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
a070: 65 72 65 28 76 2c 20 73 71 6c 69 74 65 33 56 64  ere(v, sqlite3Vd
a080: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
a090: 2d 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62  -2);.      if( b
a0a0: 46 69 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  Final ){.       
a0b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a0c0: 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f  p1(v, OP_ResetSo
a0d0: 72 74 65 72 2c 20 70 57 69 6e 2d 3e 63 73 72 41  rter, pWin->csrA
a0e0: 70 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pp);.      }.   
a0f0: 20 7d 65 6c 73 65 20 69 66 28 20 70 57 69 6e 2d   }else if( pWin-
a100: 3e 72 65 67 41 70 70 20 29 7b 0a 20 20 20 20 7d  >regApp ){.    }
a110: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
a120: 62 46 69 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  bFinal ){.      
a130: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a140: 4f 70 32 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e  Op2(v, OP_AggFin
a150: 61 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63  al, pWin->regAcc
a160: 75 6d 2c 20 77 69 6e 64 6f 77 41 72 67 43 6f 75  um, windowArgCou
a170: 6e 74 28 70 57 69 6e 29 29 3b 0a 20 20 20 20 20  nt(pWin));.     
a180: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70     sqlite3VdbeAp
a190: 70 65 6e 64 50 34 28 76 2c 20 70 57 69 6e 2d 3e  pendP4(v, pWin->
a1a0: 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45  pFunc, P4_FUNCDE
a1b0: 46 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  F);.        sqli
a1c0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
a1d0: 20 4f 50 5f 43 6f 70 79 2c 20 70 57 69 6e 2d 3e   OP_Copy, pWin->
a1e0: 72 65 67 41 63 63 75 6d 2c 20 70 57 69 6e 2d 3e  regAccum, pWin->
a1f0: 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  regResult);.    
a200: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a210: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
a220: 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63  , 0, pWin->regAc
a230: 63 75 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  cum);.      }els
a240: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
a250: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
a260: 4f 50 5f 41 67 67 56 61 6c 75 65 2c 20 70 57 69  OP_AggValue, pWi
a270: 6e 2d 3e 72 65 67 41 63 63 75 6d 2c 20 77 69 6e  n->regAccum, win
a280: 64 6f 77 41 72 67 43 6f 75 6e 74 28 70 57 69 6e  dowArgCount(pWin
a290: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
a2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2b0: 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29  pWin->regResult)
a2c0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
a2d0: 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c  3VdbeAppendP4(v,
a2e0: 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2c 20 50 34   pWin->pFunc, P4
a2f0: 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20  _FUNCDEF);.     
a300: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
a310: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
a320: 69 6f 6e 20 67 65 6e 65 72 61 74 65 73 20 56 4d  ion generates VM
a330: 20 63 6f 64 65 20 74 6f 20 69 6e 76 6f 6b 65 20   code to invoke 
a340: 74 68 65 20 73 75 62 2d 72 6f 75 74 69 6e 65 20  the sub-routine 
a350: 61 74 20 61 64 64 72 65 73 73 0a 2a 2a 20 6c 62  at address.** lb
a360: 6c 46 6c 75 73 68 50 61 72 74 20 6f 6e 63 65 20  lFlushPart once 
a370: 66 6f 72 20 65 61 63 68 20 70 61 72 74 69 74 69  for each partiti
a380: 6f 6e 20 77 69 74 68 20 74 68 65 20 65 6e 74 69  on with the enti
a390: 72 65 20 70 61 72 74 69 74 69 6f 6e 20 63 61 63  re partition cac
a3a0: 68 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 57 69  hed in.** the Wi
a3b0: 6e 64 6f 77 2e 69 45 70 68 43 73 72 20 74 65 6d  ndow.iEphCsr tem
a3c0: 70 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  p table..*/.stat
a3d0: 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 50 61  ic void windowPa
a3e0: 72 74 69 74 69 6f 6e 43 61 63 68 65 28 0a 20 20  rtitionCache(.  
a3f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20  Parse *pParse,. 
a400: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
a410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a420: 20 2f 2a 20 54 68 65 20 72 65 77 72 69 74 74 65   /* The rewritte
a430: 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  n SELECT stateme
a440: 6e 74 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66  nt */.  WhereInf
a450: 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 20 20  o *pWInfo,      
a460: 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
a470: 49 6e 66 6f 20 74 6f 20 63 61 6c 6c 20 57 68 65  Info to call Whe
a480: 72 65 45 6e 64 28 29 20 6f 6e 20 2a 2f 0a 20 20  reEnd() on */.  
a490: 69 6e 74 20 72 65 67 46 6c 75 73 68 50 61 72 74  int regFlushPart
a4a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
a4b0: 2f 2a 20 52 65 67 69 73 74 65 72 20 74 6f 20 75  /* Register to u
a4c0: 73 65 20 77 69 74 68 20 47 6f 73 75 62 20 6c 62  se with Gosub lb
a4d0: 6c 46 6c 75 73 68 50 61 72 74 20 2a 2f 0a 20 20  lFlushPart */.  
a4e0: 69 6e 74 20 6c 62 6c 46 6c 75 73 68 50 61 72 74  int lblFlushPart
a4f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
a500: 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 74 6f  /* Subroutine to
a510: 20 47 6f 73 75 62 20 74 6f 20 2a 2f 0a 20 20 69   Gosub to */.  i
a520: 6e 74 20 2a 70 52 65 67 53 69 7a 65 20 20 20 20  nt *pRegSize    
a530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a540: 2a 20 4f 55 54 3a 20 52 65 67 69 73 74 65 72 20  * OUT: Register 
a550: 63 6f 6e 74 61 69 6e 69 6e 67 20 70 61 72 74 69  containing parti
a560: 74 69 6f 6e 20 73 69 7a 65 20 2a 2f 0a 29 7b 0a  tion size */.){.
a570: 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20    Window *pMWin 
a580: 3d 20 70 2d 3e 70 57 69 6e 3b 0a 20 20 56 64 62  = p->pWin;.  Vdb
a590: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
a5a0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
a5b0: 20 69 6e 74 20 69 53 75 62 43 73 72 20 3d 20 70   int iSubCsr = p
a5c0: 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75  ->pSrc->a[0].iCu
a5d0: 72 73 6f 72 3b 0a 20 20 69 6e 74 20 6e 53 75 62  rsor;.  int nSub
a5e0: 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d   = p->pSrc->a[0]
a5f0: 2e 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 69  .pTab->nCol;.  i
a600: 6e 74 20 6b 3b 0a 0a 20 20 69 6e 74 20 72 65 67  nt k;..  int reg
a610: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
a620: 31 3b 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f  1;.  int regReco
a630: 72 64 20 3d 20 72 65 67 2b 6e 53 75 62 3b 0a 20  rd = reg+nSub;. 
a640: 20 69 6e 74 20 72 65 67 52 6f 77 69 64 20 3d 20   int regRowid = 
a650: 72 65 67 52 65 63 6f 72 64 2b 31 3b 0a 0a 20 20  regRecord+1;..  
a660: 2a 70 52 65 67 53 69 7a 65 20 3d 20 72 65 67 52  *pRegSize = regR
a670: 6f 77 69 64 3b 0a 20 20 70 50 61 72 73 65 2d 3e  owid;.  pParse->
a680: 6e 4d 65 6d 20 2b 3d 20 6e 53 75 62 20 2b 20 32  nMem += nSub + 2
a690: 3b 0a 0a 20 20 2f 2a 20 4d 61 72 74 69 61 6c 20  ;..  /* Martial 
a6a0: 74 68 65 20 72 6f 77 20 72 65 74 75 72 6e 65 64  the row returned
a6b0: 20 62 79 20 74 68 65 20 73 75 62 2d 73 65 6c 65   by the sub-sele
a6c0: 63 74 20 69 6e 74 6f 20 61 6e 20 61 72 72 61 79  ct into an array
a6d0: 20 6f 66 20 0a 20 20 2a 2a 20 72 65 67 69 73 74   of .  ** regist
a6e0: 65 72 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d  ers. */.  for(k=
a6f0: 30 3b 20 6b 3c 6e 53 75 62 3b 20 6b 2b 2b 29 7b  0; k<nSub; k++){
a700: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a710: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
a720: 75 6d 6e 2c 20 69 53 75 62 43 73 72 2c 20 6b 2c  umn, iSubCsr, k,
a730: 20 72 65 67 2b 6b 29 3b 0a 20 20 7d 0a 20 20 73   reg+k);.  }.  s
a740: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
a750: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
a760: 64 2c 20 72 65 67 2c 20 6e 53 75 62 2c 20 72 65  d, reg, nSub, re
a770: 67 52 65 63 6f 72 64 29 3b 0a 0a 20 20 2f 2a 20  gRecord);..  /* 
a780: 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 69 73  Check if this is
a790: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20   the start of a 
a7a0: 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 2e 20 49  new partition. I
a7b0: 66 20 73 6f 2c 20 63 61 6c 6c 20 74 68 65 0a 20  f so, call the. 
a7c0: 20 2a 2a 20 66 6c 75 73 68 5f 70 61 72 74 69 74   ** flush_partit
a7d0: 69 6f 6e 20 73 75 62 2d 72 6f 75 74 69 6e 65 2e  ion sub-routine.
a7e0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e    */.  if( pMWin
a7f0: 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 29 7b 0a  ->pPartition ){.
a800: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
a810: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 50 61 72    ExprList *pPar
a820: 74 20 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74  t = pMWin->pPart
a830: 69 74 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 6e  ition;.    int n
a840: 50 61 72 74 20 3d 20 70 50 61 72 74 2d 3e 6e 45  Part = pPart->nE
a850: 78 70 72 3b 0a 20 20 20 20 69 6e 74 20 72 65 67  xpr;.    int reg
a860: 4e 65 77 50 61 72 74 20 3d 20 72 65 67 20 2b 20  NewPart = reg + 
a870: 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f  pMWin->nBufferCo
a880: 6c 3b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  l;.    KeyInfo *
a890: 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
a8a0: 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  e3KeyInfoFromExp
a8b0: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 50  rList(pParse, pP
a8c0: 61 72 74 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20  art, 0, 0);..   
a8d0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
a8e0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
a8f0: 43 6f 6d 70 61 72 65 2c 20 72 65 67 4e 65 77 50  Compare, regNewP
a900: 61 72 74 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50  art, pMWin->regP
a910: 61 72 74 2c 6e 50 61 72 74 29 3b 0a 20 20 20 20  art,nPart);.    
a920: 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e  sqlite3VdbeAppen
a930: 64 50 34 28 76 2c 20 28 76 6f 69 64 2a 29 70 4b  dP4(v, (void*)pK
a940: 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
a950: 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  FO);.    sqlite3
a960: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
a970: 5f 4a 75 6d 70 2c 20 61 64 64 72 2b 32 2c 20 61  _Jump, addr+2, a
a980: 64 64 72 2b 34 2c 20 61 64 64 72 2b 32 29 3b 0a  ddr+4, addr+2);.
a990: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
a9a0: 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
a9b0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
a9c0: 5f 43 6f 70 79 2c 20 72 65 67 4e 65 77 50 61 72  _Copy, regNewPar
a9d0: 74 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72  t, pMWin->regPar
a9e0: 74 2c 20 6e 50 61 72 74 2d 31 29 3b 0a 20 20 20  t, nPart-1);.   
a9f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
aa00: 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
aa10: 72 65 67 46 6c 75 73 68 50 61 72 74 2c 20 6c 62  regFlushPart, lb
aa20: 6c 46 6c 75 73 68 50 61 72 74 29 3b 0a 20 20 20  lFlushPart);.   
aa30: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
aa40: 20 22 63 61 6c 6c 20 66 6c 75 73 68 5f 70 61 72   "call flush_par
aa50: 74 69 74 69 6f 6e 22 29 29 3b 0a 20 20 7d 0a 0a  tition"));.  }..
aa60: 20 20 2f 2a 20 42 75 66 66 65 72 20 74 68 65 20    /* Buffer the 
aa70: 63 75 72 72 65 6e 74 20 72 6f 77 20 69 6e 20 74  current row in t
aa80: 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  he ephemeral tab
aa90: 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  le. */.  sqlite3
aaa0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
aab0: 5f 4e 65 77 52 6f 77 69 64 2c 20 70 4d 57 69 6e  _NewRowid, pMWin
aac0: 2d 3e 69 45 70 68 43 73 72 2c 20 72 65 67 52 6f  ->iEphCsr, regRo
aad0: 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  wid);.  sqlite3V
aae0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
aaf0: 49 6e 73 65 72 74 2c 20 70 4d 57 69 6e 2d 3e 69  Insert, pMWin->i
ab00: 45 70 68 43 73 72 2c 20 72 65 67 52 65 63 6f 72  EphCsr, regRecor
ab10: 64 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 0a 20  d, regRowid);.. 
ab20: 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 69   /* End of the i
ab30: 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 73  nput loop */.  s
ab40: 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
ab50: 57 49 6e 66 6f 29 3b 0a 0a 20 20 2f 2a 20 49 6e  WInfo);..  /* In
ab60: 76 6f 6b 65 20 22 66 6c 75 73 68 5f 70 61 72 74  voke "flush_part
ab70: 69 74 69 6f 6e 22 20 74 6f 20 64 65 61 6c 20 77  ition" to deal w
ab80: 69 74 68 20 74 68 65 20 66 69 6e 61 6c 20 28 6f  ith the final (o
ab90: 72 20 6f 6e 6c 79 29 20 70 61 72 74 69 74 69 6f  r only) partitio
aba0: 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  n */.  sqlite3Vd
abb0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
abc0: 6f 73 75 62 2c 20 72 65 67 46 6c 75 73 68 50 61  osub, regFlushPa
abd0: 72 74 2c 20 6c 62 6c 46 6c 75 73 68 50 61 72 74  rt, lblFlushPart
abe0: 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
abf0: 28 28 76 2c 20 22 63 61 6c 6c 20 66 6c 75 73 68  ((v, "call flush
ac00: 5f 70 61 72 74 69 74 69 6f 6e 22 29 29 3b 0a 7d  _partition"));.}
ac10: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
ac20: 68 65 20 73 75 62 2d 72 6f 75 74 69 6e 65 20 61  he sub-routine a
ac30: 74 20 72 65 67 47 6f 73 75 62 20 28 67 65 6e 65  t regGosub (gene
ac40: 72 61 74 65 64 20 62 79 20 63 6f 64 65 20 69 6e  rated by code in
ac50: 20 73 65 6c 65 63 74 2e 63 29 20 74 6f 0a 2a 2a   select.c) to.**
ac60: 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   return the curr
ac70: 65 6e 74 20 72 6f 77 20 6f 66 20 57 69 6e 64 6f  ent row of Windo
ac80: 77 2e 69 45 70 68 43 73 72 2e 20 49 66 20 61 6c  w.iEphCsr. If al
ac90: 6c 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  l window functio
aca0: 6e 73 20 61 72 65 0a 2a 2a 20 61 67 67 72 65 67  ns are.** aggreg
acb0: 61 74 65 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  ate window funct
acc0: 69 6f 6e 73 20 74 68 61 74 20 75 73 65 20 74 68  ions that use th
acd0: 65 20 73 74 61 6e 64 61 72 64 20 41 50 49 2c 20  e standard API, 
ace0: 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 4f 50 5f 47  a single.** OP_G
acf0: 6f 73 75 62 20 69 6e 73 74 72 75 63 74 69 6f 6e  osub instruction
ad00: 20 69 73 20 61 6c 6c 20 74 68 61 74 20 74 68 69   is all that thi
ad10: 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
ad20: 74 65 73 2e 20 45 78 74 72 61 20 56 4d 20 63 6f  tes. Extra VM co
ad30: 64 65 0a 2a 2a 20 66 6f 72 20 70 65 72 2d 72 6f  de.** for per-ro
ad40: 77 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20  w processing is 
ad50: 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66  only generated f
ad60: 6f 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  or the following
ad70: 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77   built-in window
ad80: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a  .** functions:.*
ad90: 2a 0a 2a 2a 20 20 20 6e 74 68 5f 76 61 6c 75 65  *.**   nth_value
ada0: 28 29 0a 2a 2a 20 20 20 66 69 72 73 74 5f 76 61  ().**   first_va
adb0: 6c 75 65 28 29 0a 2a 2a 20 20 20 6c 61 67 28 29  lue().**   lag()
adc0: 0a 2a 2a 20 20 20 6c 65 61 64 28 29 0a 2a 2f 0a  .**   lead().*/.
add0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64  static void wind
ade0: 6f 77 52 65 74 75 72 6e 4f 6e 65 52 6f 77 28 0a  owReturnOneRow(.
adf0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
ae00: 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e  .  Window *pMWin
ae10: 2c 0a 20 20 69 6e 74 20 72 65 67 47 6f 73 75 62  ,.  int regGosub
ae20: 2c 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75  ,.  int addrGosu
ae30: 62 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  b.){.  Vdbe *v =
ae40: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
ae50: 70 50 61 72 73 65 29 3b 0a 20 20 57 69 6e 64 6f  pParse);.  Windo
ae60: 77 20 2a 70 57 69 6e 3b 0a 20 20 66 6f 72 28 70  w *pWin;.  for(p
ae70: 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b  Win=pMWin; pWin;
ae80: 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78   pWin=pWin->pNex
ae90: 74 57 69 6e 29 7b 0a 20 20 20 20 46 75 6e 63 44  tWin){.    FuncD
aea0: 65 66 20 2a 70 46 75 6e 63 20 3d 20 70 57 69 6e  ef *pFunc = pWin
aeb0: 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 69 66 28  ->pFunc;.    if(
aec0: 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e   pFunc->zName==n
aed0: 74 68 5f 76 61 6c 75 65 4e 61 6d 65 0a 20 20 20  th_valueName.   
aee0: 20 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d    || pFunc->zNam
aef0: 65 3d 3d 66 69 72 73 74 5f 76 61 6c 75 65 4e 61  e==first_valueNa
af00: 6d 65 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  me.    ){.      
af10: 69 6e 74 20 63 73 72 20 3d 20 70 57 69 6e 2d 3e  int csr = pWin->
af20: 63 73 72 41 70 70 3b 0a 20 20 20 20 20 20 69 6e  csrApp;.      in
af30: 74 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33 56  t lbl = sqlite3V
af40: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
af50: 0a 20 20 20 20 20 20 69 6e 74 20 74 6d 70 52 65  .      int tmpRe
af60: 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
af70: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
af80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
af90: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
afa0: 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 52  l, 0, pWin->regR
afb0: 65 73 75 6c 74 29 3b 0a 0a 20 20 20 20 20 20 69  esult);..      i
afc0: 66 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d  f( pFunc->zName=
afd0: 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 20 29  =nth_valueName )
afe0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
aff0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
b000: 50 5f 43 6f 6c 75 6d 6e 2c 20 70 4d 57 69 6e 2d  P_Column, pMWin-
b010: 3e 69 45 70 68 43 73 72 2c 20 70 57 69 6e 2d 3e  >iEphCsr, pWin->
b020: 69 41 72 67 43 6f 6c 2b 31 2c 74 6d 70 52 65 67  iArgCol+1,tmpReg
b030: 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f  );.        windo
b040: 77 43 68 65 63 6b 49 6e 74 56 61 6c 75 65 28 70  wCheckIntValue(p
b050: 50 61 72 73 65 2c 20 74 6d 70 52 65 67 2c 20 32  Parse, tmpReg, 2
b060: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
b070: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b080: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b090: 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 6d 70 52  Integer, 1, tmpR
b0a0: 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eg);.      }.   
b0b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b0c0: 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20  dOp3(v, OP_Add, 
b0d0: 74 6d 70 52 65 67 2c 20 70 57 69 6e 2d 3e 72 65  tmpReg, pWin->re
b0e0: 67 41 70 70 2c 20 74 6d 70 52 65 67 29 3b 0a 20  gApp, tmpReg);. 
b0f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b100: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 47 74 2c  AddOp3(v, OP_Gt,
b110: 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31 2c   pWin->regApp+1,
b120: 20 6c 62 6c 2c 20 74 6d 70 52 65 67 29 3b 0a 20   lbl, tmpReg);. 
b130: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
b140: 65 4e 65 76 65 72 4e 75 6c 6c 28 76 29 3b 0a 20  eNeverNull(v);. 
b150: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b160: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65  AddOp3(v, OP_See
b170: 6b 52 6f 77 69 64 2c 20 63 73 72 2c 20 6c 62 6c  kRowid, csr, lbl
b180: 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20  , tmpReg);.     
b190: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
b1a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b1b0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
b1c0: 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20 70 57 69  Column, csr, pWi
b1d0: 6e 2d 3e 69 41 72 67 43 6f 6c 2c 20 70 57 69 6e  n->iArgCol, pWin
b1e0: 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20  ->regResult);.  
b1f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
b200: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
b210: 62 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  bl);.      sqlit
b220: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
b230: 28 70 50 61 72 73 65 2c 20 74 6d 70 52 65 67 29  (pParse, tmpReg)
b240: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65  ;.    }.    else
b250: 20 69 66 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d   if( pFunc->zNam
b260: 65 3d 3d 6c 65 61 64 4e 61 6d 65 20 7c 7c 20 70  e==leadName || p
b270: 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 61 67  Func->zName==lag
b280: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 69 6e  Name ){.      in
b290: 74 20 6e 41 72 67 20 3d 20 70 57 69 6e 2d 3e 70  t nArg = pWin->p
b2a0: 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  Owner->x.pList->
b2b0: 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74  nExpr;.      int
b2c0: 20 69 45 70 68 20 3d 20 70 4d 57 69 6e 2d 3e 69   iEph = pMWin->i
b2d0: 45 70 68 43 73 72 3b 0a 20 20 20 20 20 20 69 6e  EphCsr;.      in
b2e0: 74 20 63 73 72 20 3d 20 70 57 69 6e 2d 3e 63 73  t csr = pWin->cs
b2f0: 72 41 70 70 3b 0a 20 20 20 20 20 20 69 6e 74 20  rApp;.      int 
b300: 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  lbl = sqlite3Vdb
b310: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
b320: 20 20 20 20 20 69 6e 74 20 74 6d 70 52 65 67 20       int tmpReg 
b330: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
b340: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 0a 20 20  Reg(pParse);..  
b350: 20 20 20 20 69 66 28 20 6e 41 72 67 3c 33 20 29      if( nArg<3 )
b360: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
b370: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b380: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d  P_Null, 0, pWin-
b390: 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20  >regResult);.   
b3a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b3b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b3c0: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
b3d0: 2c 20 69 45 70 68 2c 20 70 57 69 6e 2d 3e 69 41  , iEph, pWin->iA
b3e0: 72 67 43 6f 6c 2b 32 2c 20 70 57 69 6e 2d 3e 72  rgCol+2, pWin->r
b3f0: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
b400: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
b410: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
b420: 5f 52 6f 77 69 64 2c 20 69 45 70 68 2c 20 74 6d  _Rowid, iEph, tm
b430: 70 52 65 67 29 3b 0a 20 20 20 20 20 20 69 66 28  pReg);.      if(
b440: 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20 20 20   nArg<2 ){.     
b450: 20 20 20 69 6e 74 20 76 61 6c 20 3d 20 28 70 46     int val = (pF
b460: 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64  unc->zName==lead
b470: 4e 61 6d 65 20 3f 20 31 20 3a 20 2d 31 29 3b 0a  Name ? 1 : -1);.
b480: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b490: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b4a0: 41 64 64 49 6d 6d 2c 20 74 6d 70 52 65 67 2c 20  AddImm, tmpReg, 
b4b0: 76 61 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  val);.      }els
b4c0: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f  e{.        int o
b4d0: 70 20 3d 20 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d  p = (pFunc->zNam
b4e0: 65 3d 3d 6c 65 61 64 4e 61 6d 65 20 3f 20 4f 50  e==leadName ? OP
b4f0: 5f 41 64 64 20 3a 20 4f 50 5f 53 75 62 74 72 61  _Add : OP_Subtra
b500: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ct);.        int
b510: 20 74 6d 70 52 65 67 32 20 3d 20 73 71 6c 69 74   tmpReg2 = sqlit
b520: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
b530: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
b540: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
b550: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 45  v, OP_Column, iE
b560: 70 68 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f  ph, pWin->iArgCo
b570: 6c 2b 31 2c 20 74 6d 70 52 65 67 32 29 3b 0a 20  l+1, tmpReg2);. 
b580: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b590: 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20  beAddOp3(v, op, 
b5a0: 74 6d 70 52 65 67 32 2c 20 74 6d 70 52 65 67 2c  tmpReg2, tmpReg,
b5b0: 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20 20   tmpReg);.      
b5c0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
b5d0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
b5e0: 74 6d 70 52 65 67 32 29 3b 0a 20 20 20 20 20 20  tmpReg2);.      
b5f0: 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  }..      sqlite3
b600: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
b610: 5f 53 65 65 6b 52 6f 77 69 64 2c 20 63 73 72 2c  _SeekRowid, csr,
b620: 20 6c 62 6c 2c 20 74 6d 70 52 65 67 29 3b 0a 20   lbl, tmpReg);. 
b630: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
b640: 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e(v);.      sqli
b650: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
b660: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c   OP_Column, csr,
b670: 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2c 20   pWin->iArgCol, 
b680: 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29  pWin->regResult)
b690: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b6a0: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
b6b0: 76 2c 20 6c 62 6c 29 3b 0a 20 20 20 20 20 20 73  v, lbl);.      s
b6c0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
b6d0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 74 6d 70  pReg(pParse, tmp
b6e0: 52 65 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Reg);.    }.  }.
b6f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b700: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
b710: 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47   regGosub, addrG
b720: 6f 73 75 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  osub);.}../*.** 
b730: 49 6e 76 6f 6b 65 20 74 68 65 20 63 6f 64 65 20  Invoke the code 
b740: 67 65 6e 65 72 61 74 65 64 20 62 79 20 77 69 6e  generated by win
b750: 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52 6f 77 28  dowReturnOneRow(
b760: 29 20 61 6e 64 2c 20 6f 70 74 69 6f 6e 61 6c 6c  ) and, optionall
b770: 79 2c 20 74 68 65 0a 2a 2a 20 78 49 6e 76 65 72  y, the.** xInver
b780: 73 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f  se() function fo
b790: 72 20 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75  r each window fu
b7a0: 6e 63 74 69 6f 6e 2c 20 66 6f 72 20 6f 6e 65 20  nction, for one 
b7b0: 6f 72 20 6d 6f 72 65 20 72 6f 77 73 0a 2a 2a 20  or more rows.** 
b7c0: 66 72 6f 6d 20 74 68 65 20 57 69 6e 64 6f 77 2e  from the Window.
b7d0: 69 45 70 68 43 73 72 20 74 65 6d 70 20 74 61 62  iEphCsr temp tab
b7e0: 6c 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  le. This routine
b7f0: 20 67 65 6e 65 72 61 74 65 73 20 56 4d 20 63 6f   generates VM co
b800: 64 65 0a 2a 2a 20 73 69 6d 69 6c 61 72 20 74 6f  de.** similar to
b810: 3a 0a 2a 2a 0a 2a 2a 20 20 20 77 68 69 6c 65 28  :.**.**   while(
b820: 20 72 65 67 43 74 72 3e 30 20 29 7b 0a 2a 2a 20   regCtr>0 ){.** 
b830: 20 20 20 20 72 65 67 43 74 72 2d 2d 3b 0a 2a 2a      regCtr--;.**
b840: 20 20 20 20 20 77 69 6e 64 6f 77 52 65 74 75 72       windowRetur
b850: 6e 4f 6e 65 52 6f 77 28 29 0a 2a 2a 20 20 20 20  nOneRow().**    
b860: 20 69 66 28 20 62 49 6e 76 65 72 73 65 20 29 7b   if( bInverse ){
b870: 0a 2a 2a 20 20 20 20 20 20 20 41 67 67 49 6e 76  .**       AggInv
b880: 65 72 73 65 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a  erse.**     }.**
b890: 20 20 20 20 20 4e 65 78 74 20 28 57 69 6e 64 6f       Next (Windo
b8a0: 77 2e 69 45 70 68 43 73 72 29 0a 2a 2a 20 20 20  w.iEphCsr).**   
b8b0: 7d 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  }.*/.static void
b8c0: 20 77 69 6e 64 6f 77 52 65 74 75 72 6e 52 6f 77   windowReturnRow
b8d0: 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
b8e0: 73 65 2c 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d  se,.  Window *pM
b8f0: 57 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  Win,            
b900: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
b910: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
b920: 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43 74  s */.  int regCt
b930: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
b940: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
b950: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 75  er containing nu
b960: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f 0a  mber of rows */.
b970: 20 20 69 6e 74 20 72 65 67 47 6f 73 75 62 2c 20    int regGosub, 
b980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b990: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f    /* Register fo
b9a0: 72 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75  r Gosub addrGosu
b9b0: 62 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 47  b */.  int addrG
b9c0: 6f 73 75 62 2c 20 20 20 20 20 20 20 20 20 20 20  osub,           
b9d0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
b9e0: 73 20 6f 66 20 73 75 62 2d 72 6f 75 74 69 6e 65  s of sub-routine
b9f0: 20 66 6f 72 20 52 65 74 75 72 6e 4f 6e 65 52 6f   for ReturnOneRo
ba00: 77 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 49 6e  w */.  int regIn
ba10: 76 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  vArg,           
ba20: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
ba30: 6f 66 20 72 65 67 69 73 74 65 72 73 20 66 6f 72  of registers for
ba40: 20 78 49 6e 76 65 72 73 65 20 61 72 67 73 20 2a   xInverse args *
ba50: 2f 0a 20 20 69 6e 74 20 72 65 67 49 6e 76 53 69  /.  int regInvSi
ba60: 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
ba70: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
ba80: 63 6f 6e 74 61 69 6e 69 6e 67 20 73 69 7a 65 20  containing size 
ba90: 6f 66 20 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a  of partition */.
baa0: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  ){.  int addr;. 
bab0: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
bac0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
bad0: 29 3b 0a 20 20 77 69 6e 64 6f 77 41 67 67 46 69  );.  windowAggFi
bae0: 6e 61 6c 28 70 50 61 72 73 65 2c 20 70 4d 57 69  nal(pParse, pMWi
baf0: 6e 2c 20 30 29 3b 0a 20 20 61 64 64 72 20 3d 20  n, 0);.  addr = 
bb00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
bb10: 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 72  3(v, OP_IfPos, r
bb20: 65 67 43 74 72 2c 20 73 71 6c 69 74 65 33 56 64  egCtr, sqlite3Vd
bb30: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
bb40: 2b 32 20 2c 31 29 3b 0a 20 20 56 64 62 65 43 6f  +2 ,1);.  VdbeCo
bb50: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
bb60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
bb70: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29  , OP_Goto, 0, 0)
bb80: 3b 0a 20 20 77 69 6e 64 6f 77 52 65 74 75 72 6e  ;.  windowReturn
bb90: 4f 6e 65 52 6f 77 28 70 50 61 72 73 65 2c 20 70  OneRow(pParse, p
bba0: 4d 57 69 6e 2c 20 72 65 67 47 6f 73 75 62 2c 20  MWin, regGosub, 
bbb0: 61 64 64 72 47 6f 73 75 62 29 3b 0a 20 20 69 66  addrGosub);.  if
bbc0: 28 20 72 65 67 49 6e 76 41 72 67 20 29 7b 0a 20  ( regInvArg ){. 
bbd0: 20 20 20 77 69 6e 64 6f 77 41 67 67 53 74 65 70     windowAggStep
bbe0: 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20  (pParse, pMWin, 
bbf0: 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20  pMWin->iEphCsr, 
bc00: 31 2c 20 72 65 67 49 6e 76 41 72 67 2c 20 72 65  1, regInvArg, re
bc10: 67 49 6e 76 53 69 7a 65 29 3b 0a 20 20 7d 0a 20  gInvSize);.  }. 
bc20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bc30: 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70  p2(v, OP_Next, p
bc40: 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 61  MWin->iEphCsr, a
bc50: 64 64 72 29 3b 0a 20 20 56 64 62 65 43 6f 76 65  ddr);.  VdbeCove
bc60: 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
bc70: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
bc80: 2c 20 61 64 64 72 2b 31 29 3b 20 20 20 2f 2a 20  , addr+1);   /* 
bc90: 54 68 65 20 4f 50 5f 47 6f 74 6f 20 2a 2f 0a 7d  The OP_Goto */.}
bca0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
bcb0: 20 63 6f 64 65 20 74 6f 20 73 65 74 20 74 68 65   code to set the
bcc0: 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67   accumulator reg
bcd0: 69 73 74 65 72 20 66 6f 72 20 65 61 63 68 20 77  ister for each w
bce0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 0a 2a  indow function.*
bcf0: 2a 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20  * in the linked 
bd00: 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74  list passed as t
bd10: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
bd20: 6e 74 20 74 6f 20 4e 55 4c 4c 2e 20 41 6e 64 20  nt to NULL. And 
bd30: 70 65 72 66 6f 72 6d 0a 2a 2a 20 61 6e 79 20 65  perform.** any e
bd40: 71 75 69 76 61 6c 65 6e 74 20 69 6e 69 74 69 61  quivalent initia
bd50: 6c 69 7a 61 74 69 6f 6e 20 72 65 71 75 69 72 65  lization require
bd60: 64 20 62 79 20 61 6e 79 20 62 75 69 6c 74 2d 69  d by any built-i
bd70: 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  n window functio
bd80: 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 6c 69 73  ns.** in the lis
bd90: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
bda0: 20 77 69 6e 64 6f 77 49 6e 69 74 41 63 63 75 6d   windowInitAccum
bdb0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
bdc0: 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 29 7b 0a  Window *pMWin){.
bdd0: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
bde0: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
bdf0: 65 29 3b 0a 20 20 69 6e 74 20 72 65 67 41 72 67  e);.  int regArg
be00: 3b 0a 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 30  ;.  int nArg = 0
be10: 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e  ;.  Window *pWin
be20: 3b 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57  ;.  for(pWin=pMW
be30: 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70  in; pWin; pWin=p
be40: 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a  Win->pNextWin){.
be50: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 46 75      FuncDef *pFu
be60: 6e 63 20 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63  nc = pWin->pFunc
be70: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
be80: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
be90: 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67  ll, 0, pWin->reg
bea0: 41 63 63 75 6d 29 3b 0a 20 20 20 20 6e 41 72 67  Accum);.    nArg
beb0: 20 3d 20 4d 41 58 28 6e 41 72 67 2c 20 77 69 6e   = MAX(nArg, win
bec0: 64 6f 77 41 72 67 43 6f 75 6e 74 28 70 57 69 6e  dowArgCount(pWin
bed0: 29 29 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e  ));.    if( pFun
bee0: 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61  c->zName==nth_va
bef0: 6c 75 65 4e 61 6d 65 0a 20 20 20 20 20 7c 7c 20  lueName.     || 
bf00: 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69  pFunc->zName==fi
bf10: 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65 0a 20 20  rst_valueName.  
bf20: 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74    ){.      sqlit
bf30: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
bf40: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70  OP_Integer, 0, p
bf50: 57 69 6e 2d 3e 72 65 67 41 70 70 29 3b 0a 20 20  Win->regApp);.  
bf60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
bf70: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
bf80: 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65  ger, 0, pWin->re
bf90: 67 41 70 70 2b 31 29 3b 0a 20 20 20 20 7d 0a 0a  gApp+1);.    }..
bfa0: 20 20 20 20 69 66 28 20 28 70 46 75 6e 63 2d 3e      if( (pFunc->
bfb0: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
bfc0: 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 20  TE_FUNC_MINMAX) 
bfd0: 26 26 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 20  && pWin->csrApp 
bfe0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
bff0: 20 70 57 69 6e 2d 3e 65 53 74 61 72 74 21 3d 54   pWin->eStart!=T
c000: 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 3b 0a 20  K_UNBOUNDED );. 
c010: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c020: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73  AddOp1(v, OP_Res
c030: 65 74 53 6f 72 74 65 72 2c 20 70 57 69 6e 2d 3e  etSorter, pWin->
c040: 63 73 72 41 70 70 29 3b 0a 20 20 20 20 20 20 73  csrApp);.      s
c050: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
c060: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
c070: 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b  0, pWin->regApp+
c080: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1);.    }.  }.  
c090: 72 65 67 41 72 67 20 3d 20 70 50 61 72 73 65 2d  regArg = pParse-
c0a0: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 70 50 61 72 73  >nMem+1;.  pPars
c0b0: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 41 72 67 3b  e->nMem += nArg;
c0c0: 0a 20 20 72 65 74 75 72 6e 20 72 65 67 41 72 67  .  return regArg
c0d0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
c0e0: 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74   function does t
c0f0: 68 65 20 77 6f 72 6b 20 6f 66 20 73 71 6c 69 74  he work of sqlit
c100: 65 33 57 69 6e 64 6f 77 43 6f 64 65 53 74 65 70  e3WindowCodeStep
c110: 28 29 20 66 6f 72 20 61 6c 6c 20 22 52 4f 57 53  () for all "ROWS
c120: 22 0a 2a 2a 20 77 69 6e 64 6f 77 20 66 72 61 6d  ".** window fram
c130: 65 20 74 79 70 65 73 20 65 78 63 65 70 74 20 66  e types except f
c140: 6f 72 20 22 42 45 54 57 45 45 4e 20 55 4e 42 4f  or "BETWEEN UNBO
c150: 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20  UNDED PRECEDING 
c160: 41 4e 44 20 43 55 52 52 45 4e 54 0a 2a 2a 20 52  AND CURRENT.** R
c170: 4f 57 22 2e 20 50 73 65 75 64 6f 2d 63 6f 64 65  OW". Pseudo-code
c180: 20 66 6f 72 20 65 61 63 68 20 66 6f 6c 6c 6f 77   for each follow
c190: 73 2e 0a 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42 45  s..**.** ROWS BE
c1a0: 54 57 45 45 4e 20 3c 65 78 70 72 31 3e 20 50 52  TWEEN <expr1> PR
c1b0: 45 43 45 44 49 4e 47 20 41 4e 44 20 3c 65 78 70  ECEDING AND <exp
c1c0: 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a  r2> FOLLOWING.**
c1d0: 0a 2a 2a 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20  .**     ....**  
c1e0: 20 20 20 20 20 69 66 28 20 6e 65 77 20 70 61 72       if( new par
c1f0: 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20  tition ){.**    
c200: 20 20 20 20 20 47 6f 73 75 62 20 66 6c 75 73 68       Gosub flush
c210: 5f 70 61 72 74 69 74 69 6f 6e 0a 2a 2a 20 20 20  _partition.**   
c220: 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 49      }.**       I
c230: 6e 73 65 72 74 20 28 72 65 63 6f 72 64 20 69 6e  nsert (record in
c240: 20 65 70 68 2d 74 61 62 6c 65 29 0a 2a 2a 20 20   eph-table).**  
c250: 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
c260: 6e 64 28 29 0a 2a 2a 20 20 20 20 20 47 6f 73 75  nd().**     Gosu
c270: 62 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f  b flush_partitio
c280: 6e 0a 2a 2a 20 20 0a 2a 2a 20 20 20 66 6c 75 73  n.**  .**   flus
c290: 68 5f 70 61 72 74 69 74 69 6f 6e 3a 0a 2a 2a 20  h_partition:.** 
c2a0: 20 20 20 20 4f 6e 63 65 20 7b 0a 2a 2a 20 20 20      Once {.**   
c2b0: 20 20 20 20 4f 70 65 6e 44 75 70 20 28 69 45 70      OpenDup (iEp
c2c0: 68 43 73 72 20 2d 3e 20 63 73 72 53 74 61 72 74  hCsr -> csrStart
c2d0: 29 0a 2a 2a 20 20 20 20 20 20 20 4f 70 65 6e 44  ).**       OpenD
c2e0: 75 70 20 28 69 45 70 68 43 73 72 20 2d 3e 20 63  up (iEphCsr -> c
c2f0: 73 72 45 6e 64 29 0a 2a 2a 20 20 20 20 20 7d 0a  srEnd).**     }.
c300: 2a 2a 20 20 20 20 20 72 65 67 53 74 61 72 74 20  **     regStart 
c310: 3d 20 3c 65 78 70 72 31 3e 20 20 20 20 20 20 20  = <expr1>       
c320: 20 20 20 20 20 20 20 20 20 2f 2f 20 50 52 45 43           // PREC
c330: 45 44 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e  EDING expression
c340: 0a 2a 2a 20 20 20 20 20 72 65 67 45 6e 64 20 3d  .**     regEnd =
c350: 20 3c 65 78 70 72 32 3e 20 20 20 20 20 20 20 20   <expr2>        
c360: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 46 4f 4c            // FOL
c370: 4c 4f 57 49 4e 47 20 65 78 70 72 65 73 73 69 6f  LOWING expressio
c380: 6e 0a 2a 2a 20 20 20 20 20 69 66 28 20 72 65 67  n.**     if( reg
c390: 53 74 61 72 74 3c 30 20 7c 7c 20 72 65 67 45 6e  Start<0 || regEn
c3a0: 64 3c 30 20 29 7b 20 65 72 72 6f 72 21 20 7d 0a  d<0 ){ error! }.
c3b0: 2a 2a 20 20 20 20 20 52 65 77 69 6e 64 20 28 63  **     Rewind (c
c3c0: 73 72 2c 63 73 72 53 74 61 72 74 2c 63 73 72 45  sr,csrStart,csrE
c3d0: 6e 64 29 20 20 20 20 20 20 2f 2f 20 69 66 20 45  nd)      // if E
c3e0: 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68 5f 70 61  OF goto flush_pa
c3f0: 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20  rtition_done.** 
c400: 20 20 20 20 20 20 4e 65 78 74 28 63 73 72 45 6e        Next(csrEn
c410: 64 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d)              
c420: 20 20 20 20 20 20 2f 2f 20 69 66 20 45 4f 46 20        // if EOF 
c430: 73 6b 69 70 20 41 67 67 73 74 65 70 0a 2a 2a 20  skip Aggstep.** 
c440: 20 20 20 20 20 20 41 67 67 73 74 65 70 20 28 63        Aggstep (c
c450: 73 72 45 6e 64 29 0a 2a 2a 20 20 20 20 20 20 20  srEnd).**       
c460: 69 66 28 20 28 72 65 67 45 6e 64 2d 2d 29 3c 3d  if( (regEnd--)<=
c470: 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  0 ){.**         
c480: 41 67 67 46 69 6e 61 6c 20 28 78 56 61 6c 75 65  AggFinal (xValue
c490: 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 47 6f 73  ).**         Gos
c4a0: 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20  ub addrGosub.** 
c4b0: 20 20 20 20 20 20 20 20 4e 65 78 74 28 63 73 72          Next(csr
c4c0: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
c4d0: 20 2f 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f 20   // if EOF goto 
c4e0: 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f  flush_partition_
c4f0: 64 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  done.**         
c500: 69 66 28 20 28 72 65 67 53 74 61 72 74 2d 2d 29  if( (regStart--)
c510: 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  <=0 ){.**       
c520: 20 20 20 20 41 67 67 49 6e 76 65 72 73 65 20 28      AggInverse (
c530: 63 73 72 53 74 61 72 74 29 0a 2a 2a 20 20 20 20  csrStart).**    
c540: 20 20 20 20 20 20 20 4e 65 78 74 28 63 73 72 53         Next(csrS
c550: 74 61 72 74 29 0a 2a 2a 20 20 20 20 20 20 20 20  tart).**        
c560: 20 7d 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a   }.**       }.**
c570: 20 20 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69     flush_partiti
c580: 6f 6e 5f 64 6f 6e 65 3a 0a 2a 2a 20 20 20 20 20  on_done:.**     
c590: 52 65 73 65 74 53 6f 72 74 65 72 20 28 63 73 72  ResetSorter (csr
c5a0: 29 0a 2a 2a 20 20 20 20 20 52 65 74 75 72 6e 0a  ).**     Return.
c5b0: 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57 45  **.** ROWS BETWE
c5c0: 45 4e 20 3c 65 78 70 72 3e 20 50 52 45 43 45 44  EN <expr> PRECED
c5d0: 49 4e 47 20 20 20 20 41 4e 44 20 43 55 52 52 45  ING    AND CURRE
c5e0: 4e 54 20 52 4f 57 0a 2a 2a 20 52 4f 57 53 20 42  NT ROW.** ROWS B
c5f0: 45 54 57 45 45 4e 20 43 55 52 52 45 4e 54 20 52  ETWEEN CURRENT R
c600: 4f 57 20 20 20 20 20 20 20 20 20 41 4e 44 20 3c  OW         AND <
c610: 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a  expr> FOLLOWING.
c620: 2a 2a 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20  ** ROWS BETWEEN 
c630: 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44  UNBOUNDED PRECED
c640: 49 4e 47 20 41 4e 44 20 3c 65 78 70 72 3e 20 46  ING AND <expr> F
c650: 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20  OLLOWING.**.**  
c660: 20 54 68 65 73 65 20 61 72 65 20 73 69 6d 69 6c   These are simil
c670: 61 72 20 74 6f 20 74 68 65 20 61 62 6f 76 65 2e  ar to the above.
c680: 20 46 6f 72 20 22 43 55 52 52 45 4e 54 20 52 4f   For "CURRENT RO
c690: 57 22 2c 20 69 6e 74 69 61 6c 69 7a 65 20 74 68  W", intialize th
c6a0: 65 0a 2a 2a 20 20 20 72 65 67 69 73 74 65 72 20  e.**   register 
c6b0: 74 6f 20 30 2e 20 46 6f 72 20 22 55 4e 42 4f 55  to 0. For "UNBOU
c6c0: 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 22 20  NDED PRECEDING" 
c6d0: 74 6f 20 69 6e 66 69 6e 69 74 79 2e 0a 2a 2a 0a  to infinity..**.
c6e0: 2a 2a 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20  ** ROWS BETWEEN 
c6f0: 3c 65 78 70 72 3e 20 50 52 45 43 45 44 49 4e 47  <expr> PRECEDING
c700: 20 20 20 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45      AND UNBOUNDE
c710: 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 20 52  D FOLLOWING.** R
c720: 4f 57 53 20 42 45 54 57 45 45 4e 20 43 55 52 52  OWS BETWEEN CURR
c730: 45 4e 54 20 52 4f 57 20 20 20 20 20 20 20 20 20  ENT ROW         
c740: 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f  AND UNBOUNDED FO
c750: 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20  LLOWING.**.**   
c760: 20 20 52 65 77 69 6e 64 20 28 63 73 72 2c 63 73    Rewind (csr,cs
c770: 72 53 74 61 72 74 2c 63 73 72 45 6e 64 29 20 20  rStart,csrEnd)  
c780: 20 20 2f 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f    // if EOF goto
c790: 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e   flush_partition
c7a0: 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20 77 68 69  _done.**     whi
c7b0: 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20  le( 1 ){.**     
c7c0: 20 20 4e 65 78 74 28 63 73 72 45 6e 64 29 20 20    Next(csrEnd)  
c7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7e0: 2f 2f 20 45 78 69 74 20 77 68 69 6c 65 28 31 29  // Exit while(1)
c7f0: 20 61 74 20 45 4f 46 0a 2a 2a 20 20 20 20 20 20   at EOF.**      
c800: 20 41 67 67 73 74 65 70 20 28 63 73 72 45 6e 64   Aggstep (csrEnd
c810: 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20  ).**     }.**   
c820: 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 2a 2a    while( 1 ){.**
c830: 20 20 20 20 20 20 20 41 67 67 46 69 6e 61 6c 20         AggFinal 
c840: 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20 20 20 20  (xValue).**     
c850: 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75    Gosub addrGosu
c860: 62 0a 2a 2a 20 20 20 20 20 20 20 4e 65 78 74 28  b.**       Next(
c870: 63 73 72 29 20 20 20 20 20 20 20 20 20 20 20 20  csr)            
c880: 20 20 20 20 20 20 20 20 20 2f 2f 20 69 66 20 45           // if E
c890: 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68 5f 70 61  OF goto flush_pa
c8a0: 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20  rtition_done.** 
c8b0: 20 20 20 20 20 20 69 66 28 20 28 72 65 67 53 74        if( (regSt
c8c0: 61 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20  art--)<=0 ){.** 
c8d0: 20 20 20 20 20 20 20 20 41 67 67 49 6e 76 65 72          AggInver
c8e0: 73 65 20 28 63 73 72 53 74 61 72 74 29 0a 2a 2a  se (csrStart).**
c8f0: 20 20 20 20 20 20 20 20 20 4e 65 78 74 28 63 73           Next(cs
c900: 72 53 74 61 72 74 29 0a 2a 2a 20 20 20 20 20 20  rStart).**      
c910: 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a   }.**     }.**.*
c920: 2a 20 20 20 46 6f 72 20 74 68 65 20 22 43 55 52  *   For the "CUR
c930: 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 55 4e 42  RENT ROW AND UNB
c940: 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47  OUNDED FOLLOWING
c950: 22 20 63 61 73 65 2c 20 74 68 65 20 66 69 6e 61  " case, the fina
c960: 6c 20 69 66 28 29 20 0a 2a 2a 20 20 20 63 6f 6e  l if() .**   con
c970: 64 69 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73  dition is always
c980: 20 74 72 75 65 20 28 61 73 20 69 66 20 72 65 67   true (as if reg
c990: 53 74 61 72 74 20 77 65 72 65 20 69 6e 69 74 69  Start were initi
c9a0: 61 6c 69 7a 65 64 20 74 6f 20 30 29 2e 0a 2a 2a  alized to 0)..**
c9b0: 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54 57 45 45  .** RANGE BETWEE
c9c0: 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20 41 4e  N CURRENT ROW AN
c9d0: 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c  D UNBOUNDED FOLL
c9e0: 4f 57 49 4e 47 0a 2a 2a 20 0a 2a 2a 20 20 20 54  OWING.** .**   T
c9f0: 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  his is the only 
ca00: 52 41 4e 47 45 20 63 61 73 65 20 68 61 6e 64 6c  RANGE case handl
ca10: 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  ed by this routi
ca20: 6e 65 2e 20 49 74 20 6d 6f 64 69 66 69 65 73 20  ne. It modifies 
ca30: 74 68 65 0a 2a 2a 20 20 20 73 65 63 6f 6e 64 20  the.**   second 
ca40: 77 68 69 6c 65 28 20 31 20 29 20 6c 6f 6f 70 20  while( 1 ) loop 
ca50: 69 6e 20 22 52 4f 57 53 20 42 45 54 57 45 45 4e  in "ROWS BETWEEN
ca60: 20 43 55 52 52 45 4e 54 20 2e 2e 2e 20 55 4e 42   CURRENT ... UNB
ca70: 4f 55 4e 44 45 44 2e 2e 2e 22 20 74 6f 0a 2a 2a  OUNDED..." to.**
ca80: 20 20 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20     be:.**.**    
ca90: 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 2a 2a 20   while( 1 ){.** 
caa0: 20 20 20 20 20 20 41 67 67 46 69 6e 61 6c 20 28        AggFinal (
cab0: 78 56 61 6c 75 65 29 0a 2a 2a 20 20 20 20 20 20  xValue).**      
cac0: 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 2a 2a 20   while( 1 ){.** 
cad0: 20 20 20 20 20 20 20 20 72 65 67 50 65 65 72 2b          regPeer+
cae0: 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20 47 6f 73  +.**         Gos
caf0: 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20  ub addrGosub.** 
cb00: 20 20 20 20 20 20 20 20 4e 65 78 74 28 63 73 72          Next(csr
cb10: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
cb20: 20 20 20 20 20 20 2f 2f 20 69 66 20 45 4f 46 20        // if EOF 
cb30: 67 6f 74 6f 20 66 6c 75 73 68 5f 70 61 72 74 69  goto flush_parti
cb40: 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20  tion_done.**    
cb50: 20 20 20 20 20 69 66 28 20 6e 65 77 20 70 65 65       if( new pee
cb60: 72 20 29 20 62 72 65 61 6b 3b 0a 2a 2a 20 20 20  r ) break;.**   
cb70: 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 77      }.**       w
cb80: 68 69 6c 65 28 20 28 72 65 67 50 65 65 72 2d 2d  hile( (regPeer--
cb90: 29 3e 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  )>0 ){.**       
cba0: 20 20 41 67 67 49 6e 76 65 72 73 65 20 28 63 73    AggInverse (cs
cbb0: 72 53 74 61 72 74 29 0a 2a 2a 20 20 20 20 20 20  rStart).**      
cbc0: 20 20 20 4e 65 78 74 28 63 73 72 53 74 61 72 74     Next(csrStart
cbd0: 29 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20  ).**       }.** 
cbe0: 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 52 4f 57 53      }.**.** ROWS
cbf0: 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 3e 20   BETWEEN <expr> 
cc00: 46 4f 4c 4c 4f 57 49 4e 47 20 20 20 20 41 4e 44  FOLLOWING    AND
cc10: 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e   <expr> FOLLOWIN
cc20: 47 0a 2a 2a 0a 2a 2a 20 20 20 72 65 67 45 6e 64  G.**.**   regEnd
cc30: 20 3d 20 72 65 67 45 6e 64 20 2d 20 72 65 67 53   = regEnd - regS
cc40: 74 61 72 74 0a 2a 2a 20 20 20 52 65 77 69 6e 64  tart.**   Rewind
cc50: 20 28 63 73 72 2c 63 73 72 53 74 61 72 74 2c 63   (csr,csrStart,c
cc60: 73 72 45 6e 64 29 20 20 20 2f 2f 20 69 66 20 45  srEnd)   // if E
cc70: 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68 5f 70 61  OF goto flush_pa
cc80: 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20  rtition_done.** 
cc90: 20 20 20 20 41 67 67 73 74 65 70 20 28 63 73 72      Aggstep (csr
cca0: 45 6e 64 29 0a 2a 2a 20 20 20 20 20 4e 65 78 74  End).**     Next
ccb0: 28 63 73 72 45 6e 64 29 20 20 20 20 20 20 20 20  (csrEnd)        
ccc0: 20 20 20 20 20 20 20 20 20 2f 2f 20 69 66 20 45           // if E
ccd0: 4f 46 20 66 61 6c 6c 2d 74 68 72 6f 75 67 68 0a  OF fall-through.
cce0: 2a 2a 20 20 20 20 20 69 66 28 20 28 72 65 67 45  **     if( (regE
ccf0: 6e 64 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20  nd--)<=0 ){.**  
cd00: 20 20 20 20 20 69 66 28 20 28 72 65 67 53 74 61       if( (regSta
cd10: 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20  rt--)<=0 ){.**  
cd20: 20 20 20 20 20 20 20 41 67 67 46 69 6e 61 6c 20         AggFinal 
cd30: 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20 20 20 20  (xValue).**     
cd40: 20 20 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f      Gosub addrGo
cd50: 73 75 62 0a 2a 2a 20 20 20 20 20 20 20 20 20 4e  sub.**         N
cd60: 65 78 74 28 63 73 72 29 20 20 20 20 20 20 20 20  ext(csr)        
cd70: 20 20 20 20 20 20 2f 2f 20 69 66 20 45 4f 46 20        // if EOF 
cd80: 67 6f 74 6f 20 66 6c 75 73 68 5f 70 61 72 74 69  goto flush_parti
cd90: 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20  tion_done.**    
cda0: 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 41 67     }.**       Ag
cdb0: 67 49 6e 76 65 72 73 65 20 28 63 73 72 53 74 61  gInverse (csrSta
cdc0: 72 74 29 0a 2a 2a 20 20 20 20 20 20 20 4e 65 78  rt).**       Nex
cdd0: 74 20 28 63 73 72 53 74 61 72 74 29 0a 2a 2a 20  t (csrStart).** 
cde0: 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 52 4f 57 53      }.**.** ROWS
cdf0: 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 3e 20   BETWEEN <expr> 
ce00: 50 52 45 43 45 44 49 4e 47 20 20 20 20 41 4e 44  PRECEDING    AND
ce10: 20 3c 65 78 70 72 3e 20 50 52 45 43 45 44 49 4e   <expr> PRECEDIN
ce20: 47 0a 2a 2a 0a 2a 2a 20 20 20 52 65 70 6c 61 63  G.**.**   Replac
ce30: 65 20 74 68 65 20 62 69 74 20 61 66 74 65 72 20  e the bit after 
ce40: 22 52 65 77 69 6e 64 22 20 69 6e 20 74 68 65 20  "Rewind" in the 
ce50: 61 62 6f 76 65 20 77 69 74 68 3a 0a 2a 2a 0a 2a  above with:.**.*
ce60: 2a 20 20 20 20 20 69 66 28 20 28 72 65 67 45 6e  *     if( (regEn
ce70: 64 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20  d--)<=0 ){.**   
ce80: 20 20 20 20 41 67 67 53 74 65 70 20 28 63 73 72      AggStep (csr
ce90: 45 6e 64 29 0a 2a 2a 20 20 20 20 20 20 20 4e 65  End).**       Ne
cea0: 78 74 20 28 63 73 72 45 6e 64 29 0a 2a 2a 20 20  xt (csrEnd).**  
ceb0: 20 20 20 7d 0a 2a 2a 20 20 20 20 20 41 67 67 46     }.**     AggF
cec0: 69 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a  inal (xValue).**
ced0: 20 20 20 20 20 47 6f 73 75 62 20 61 64 64 72 47       Gosub addrG
cee0: 6f 73 75 62 0a 2a 2a 20 20 20 20 20 4e 65 78 74  osub.**     Next
cef0: 28 63 73 72 29 20 20 20 20 20 20 20 20 20 20 20  (csr)           
cf00: 20 20 20 20 20 20 20 2f 2f 20 69 66 20 45 4f 46         // if EOF
cf10: 20 67 6f 74 6f 20 66 6c 75 73 68 5f 70 61 72 74   goto flush_part
cf20: 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20  ition_done.**   
cf30: 20 20 69 66 28 20 28 72 65 67 53 74 61 72 74 2d    if( (regStart-
cf40: 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20  -)<=0 ){.**     
cf50: 20 20 41 67 67 49 6e 76 65 72 73 65 20 28 63 73    AggInverse (cs
cf60: 72 32 29 0a 2a 2a 20 20 20 20 20 20 20 4e 65 78  r2).**       Nex
cf70: 74 20 28 63 73 72 32 29 0a 2a 2a 20 20 20 20 20  t (csr2).**     
cf80: 7d 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76  }.**.*/.static v
cf90: 6f 69 64 20 77 69 6e 64 6f 77 43 6f 64 65 52 6f  oid windowCodeRo
cfa0: 77 45 78 70 72 53 74 65 70 28 0a 20 20 50 61 72  wExprStep(.  Par
cfb0: 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 53  se *pParse, .  S
cfc0: 65 6c 65 63 74 20 2a 70 2c 0a 20 20 57 68 65 72  elect *p,.  Wher
cfd0: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20  eInfo *pWInfo,. 
cfe0: 20 69 6e 74 20 72 65 67 47 6f 73 75 62 2c 20 0a   int regGosub, .
cff0: 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75 62 0a    int addrGosub.
d000: 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57  ){.  Window *pMW
d010: 69 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b 0a 20 20  in = p->pWin;.  
d020: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
d030: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
d040: 3b 0a 20 20 69 6e 74 20 72 65 67 46 6c 75 73 68  ;.  int regFlush
d050: 50 61 72 74 3b 20 20 20 20 20 20 20 20 20 20 20  Part;           
d060: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
d070: 66 6f 72 20 22 47 6f 73 75 62 20 66 6c 75 73 68  for "Gosub flush
d080: 5f 70 61 72 74 69 74 69 6f 6e 22 20 2a 2f 0a 20  _partition" */. 
d090: 20 69 6e 74 20 6c 62 6c 46 6c 75 73 68 50 61 72   int lblFlushPar
d0a0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
d0b0: 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 22 47   /* Label for "G
d0c0: 6f 73 75 62 20 66 6c 75 73 68 5f 70 61 72 74 69  osub flush_parti
d0d0: 74 69 6f 6e 22 20 2a 2f 0a 20 20 69 6e 74 20 6c  tion" */.  int l
d0e0: 62 6c 46 6c 75 73 68 44 6f 6e 65 3b 20 20 20 20  blFlushDone;    
d0f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
d100: 62 65 6c 20 66 6f 72 20 22 47 6f 73 75 62 20 66  bel for "Gosub f
d110: 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64  lush_partition_d
d120: 6f 6e 65 22 20 2a 2f 0a 0a 20 20 69 6e 74 20 72  one" */..  int r
d130: 65 67 41 72 67 3b 0a 20 20 69 6e 74 20 61 64 64  egArg;.  int add
d140: 72 3b 0a 20 20 69 6e 74 20 63 73 72 53 74 61 72  r;.  int csrStar
d150: 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  t = pParse->nTab
d160: 2b 2b 3b 0a 20 20 69 6e 74 20 63 73 72 45 6e 64  ++;.  int csrEnd
d170: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
d180: 2b 3b 0a 20 20 69 6e 74 20 72 65 67 53 74 61 72  +;.  int regStar
d190: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
d1a0: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
d1b0: 66 20 3c 65 78 70 72 3e 20 50 52 45 43 45 44 49  f <expr> PRECEDI
d1c0: 4e 47 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45  NG */.  int regE
d1d0: 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
d1e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
d1f0: 65 20 6f 66 20 3c 65 78 70 72 3e 20 46 4f 4c 4c  e of <expr> FOLL
d200: 4f 57 49 4e 47 20 2a 2f 0a 20 20 69 6e 74 20 61  OWING */.  int a
d210: 64 64 72 47 6f 74 6f 3b 0a 20 20 69 6e 74 20 61  ddrGoto;.  int a
d220: 64 64 72 54 6f 70 3b 0a 20 20 69 6e 74 20 61 64  ddrTop;.  int ad
d230: 64 72 49 66 50 6f 73 31 20 3d 20 30 3b 0a 20 20  drIfPos1 = 0;.  
d240: 69 6e 74 20 61 64 64 72 49 66 50 6f 73 32 20 3d  int addrIfPos2 =
d250: 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 53 69 7a   0;.  int regSiz
d260: 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  e = 0;..  assert
d270: 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d  ( pMWin->eStart=
d280: 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 0a 20  =TK_PRECEDING . 
d290: 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e        || pMWin->
d2a0: 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45  eStart==TK_CURRE
d2b0: 4e 54 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d  NT .       || pM
d2c0: 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
d2d0: 46 4f 4c 4c 4f 57 49 4e 47 20 0a 20 20 20 20 20  FOLLOWING .     
d2e0: 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61    || pMWin->eSta
d2f0: 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  rt==TK_UNBOUNDED
d300: 20 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28   .  );.  assert(
d310: 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b   pMWin->eEnd==TK
d320: 5f 46 4f 4c 4c 4f 57 49 4e 47 20 0a 20 20 20 20  _FOLLOWING .    
d330: 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e     || pMWin->eEn
d340: 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 0a 20  d==TK_CURRENT . 
d350: 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e        || pMWin->
d360: 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44  eEnd==TK_UNBOUND
d370: 45 44 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d  ED .       || pM
d380: 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52  Win->eEnd==TK_PR
d390: 45 43 45 44 49 4e 47 20 0a 20 20 29 3b 0a 0a 20  ECEDING .  );.. 
d3a0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 72 65 67   /* Allocate reg
d3b0: 69 73 74 65 72 20 61 6e 64 20 6c 61 62 65 6c 20  ister and label 
d3c0: 66 6f 72 20 74 68 65 20 22 66 6c 75 73 68 5f 70  for the "flush_p
d3d0: 61 72 74 69 74 69 6f 6e 22 20 73 75 62 2d 72 6f  artition" sub-ro
d3e0: 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 72 65 67 46  utine. */.  regF
d3f0: 6c 75 73 68 50 61 72 74 20 3d 20 2b 2b 70 50 61  lushPart = ++pPa
d400: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6c 62 6c  rse->nMem;.  lbl
d410: 46 6c 75 73 68 50 61 72 74 20 3d 20 73 71 6c 69  FlushPart = sqli
d420: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
d430: 28 76 29 3b 0a 20 20 6c 62 6c 46 6c 75 73 68 44  (v);.  lblFlushD
d440: 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  one = sqlite3Vdb
d450: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
d460: 20 20 72 65 67 53 74 61 72 74 20 3d 20 2b 2b 70    regStart = ++p
d470: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
d480: 65 67 45 6e 64 20 3d 20 2b 2b 70 50 61 72 73 65  egEnd = ++pParse
d490: 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 77 69 6e 64 6f  ->nMem;..  windo
d4a0: 77 50 61 72 74 69 74 69 6f 6e 43 61 63 68 65 28  wPartitionCache(
d4b0: 70 50 61 72 73 65 2c 20 70 2c 20 70 57 49 6e 66  pParse, p, pWInf
d4c0: 6f 2c 20 72 65 67 46 6c 75 73 68 50 61 72 74 2c  o, regFlushPart,
d4d0: 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 2c 20 26   lblFlushPart, &
d4e0: 72 65 67 53 69 7a 65 29 3b 0a 0a 20 20 61 64 64  regSize);..  add
d4f0: 72 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33 56  rGoto = sqlite3V
d500: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
d510: 47 6f 74 6f 29 3b 0a 0a 20 20 2f 2a 20 53 74 61  Goto);..  /* Sta
d520: 72 74 20 6f 66 20 22 66 6c 75 73 68 5f 70 61 72  rt of "flush_par
d530: 74 69 74 69 6f 6e 22 20 2a 2f 0a 20 20 73 71 6c  tition" */.  sql
d540: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
d550: 61 62 65 6c 28 76 2c 20 6c 62 6c 46 6c 75 73 68  abel(v, lblFlush
d560: 50 61 72 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  Part);.  sqlite3
d570: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
d580: 5f 4f 6e 63 65 2c 20 30 2c 20 73 71 6c 69 74 65  _Once, 0, sqlite
d590: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
d5a0: 28 76 29 2b 33 29 3b 0a 20 20 56 64 62 65 43 6f  (v)+3);.  VdbeCo
d5b0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 56 64 62  verage(v);.  Vdb
d5c0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 46 6c  eComment((v, "Fl
d5d0: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 20 73 75  ush_partition su
d5e0: 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 73  broutine"));.  s
d5f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d600: 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20  (v, OP_OpenDup, 
d610: 63 73 72 53 74 61 72 74 2c 20 70 4d 57 69 6e 2d  csrStart, pMWin-
d620: 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 73 71 6c  >iEphCsr);.  sql
d630: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
d640: 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 63 73  , OP_OpenDup, cs
d650: 72 45 6e 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  rEnd, pMWin->iEp
d660: 68 43 73 72 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  hCsr);..  /* If 
d670: 65 69 74 68 65 72 20 72 65 67 53 74 61 72 74 20  either regStart 
d680: 6f 72 20 72 65 67 45 6e 64 20 61 72 65 20 6e 6f  or regEnd are no
d690: 74 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69  t non-negative i
d6a0: 6e 74 65 67 65 72 73 2c 20 74 68 72 6f 77 20 0a  ntegers, throw .
d6b0: 20 20 2a 2a 20 61 6e 20 65 78 63 65 70 74 69 6f    ** an exceptio
d6c0: 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57  n.  */.  if( pMW
d6d0: 69 6e 2d 3e 70 53 74 61 72 74 20 29 7b 0a 20 20  in->pStart ){.  
d6e0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
d6f0: 65 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2d  e(pParse, pMWin-
d700: 3e 70 53 74 61 72 74 2c 20 72 65 67 53 74 61 72  >pStart, regStar
d710: 74 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43 68  t);.    windowCh
d720: 65 63 6b 49 6e 74 56 61 6c 75 65 28 70 50 61 72  eckIntValue(pPar
d730: 73 65 2c 20 72 65 67 53 74 61 72 74 2c 20 30 29  se, regStart, 0)
d740: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d 57 69  ;.  }.  if( pMWi
d750: 6e 2d 3e 70 45 6e 64 20 29 7b 0a 20 20 20 20 73  n->pEnd ){.    s
d760: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
d770: 50 61 72 73 65 2c 20 70 4d 57 69 6e 2d 3e 70 45  Parse, pMWin->pE
d780: 6e 64 2c 20 72 65 67 45 6e 64 29 3b 0a 20 20 20  nd, regEnd);.   
d790: 20 77 69 6e 64 6f 77 43 68 65 63 6b 49 6e 74 56   windowCheckIntV
d7a0: 61 6c 75 65 28 70 50 61 72 73 65 2c 20 72 65 67  alue(pParse, reg
d7b0: 45 6e 64 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20  End, 1);.  }..  
d7c0: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 22 52  /* If this is "R
d7d0: 4f 57 53 20 3c 65 78 70 72 31 3e 20 46 4f 4c 4c  OWS <expr1> FOLL
d7e0: 4f 57 49 4e 47 20 41 4e 44 20 52 4f 57 53 20 3c  OWING AND ROWS <
d7f0: 65 78 70 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47  expr2> FOLLOWING
d800: 22 2c 20 64 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ", do:.  **.  **
d810: 20 20 20 69 66 28 20 72 65 67 45 6e 64 3c 72 65     if( regEnd<re
d820: 67 53 74 61 72 74 20 29 7b 0a 20 20 2a 2a 20 20  gStart ){.  **  
d830: 20 20 20 2f 2f 20 54 68 65 20 66 72 61 6d 65 20     // The frame 
d840: 61 6c 77 61 79 73 20 63 6f 6e 73 69 73 74 73 20  always consists 
d850: 6f 66 20 30 20 72 6f 77 73 0a 20 20 2a 2a 20 20  of 0 rows.  **  
d860: 20 20 20 72 65 67 53 74 61 72 74 20 3d 20 72 65     regStart = re
d870: 67 53 69 7a 65 3b 0a 20 20 2a 2a 20 20 20 7d 0a  gSize;.  **   }.
d880: 20 20 2a 2a 20 20 20 72 65 67 45 6e 64 20 3d 20    **   regEnd = 
d890: 72 65 67 45 6e 64 20 2d 20 72 65 67 53 74 61 72  regEnd - regStar
d8a0: 74 3b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4d  t;.  */.  if( pM
d8b0: 57 69 6e 2d 3e 70 45 6e 64 20 26 26 20 70 4d 57  Win->pEnd && pMW
d8c0: 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46  in->eStart==TK_F
d8d0: 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20  OLLOWING ){.    
d8e0: 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 70  assert( pMWin->p
d8f0: 53 74 61 72 74 21 3d 30 20 29 3b 0a 20 20 20 20  Start!=0 );.    
d900: 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65  assert( pMWin->e
d910: 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e  End==TK_FOLLOWIN
d920: 47 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  G );.    sqlite3
d930: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
d940: 5f 47 65 2c 20 72 65 67 53 74 61 72 74 2c 20 73  _Ge, regStart, s
d950: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
d960: 74 41 64 64 72 28 76 29 2b 32 2c 20 72 65 67 45  tAddr(v)+2, regE
d970: 6e 64 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  nd);.    VdbeCov
d980: 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c 28 76  erageNeverNull(v
d990: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
d9a0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
d9b0: 6f 70 79 2c 20 72 65 67 53 69 7a 65 2c 20 72 65  opy, regSize, re
d9c0: 67 53 74 61 72 74 29 3b 0a 20 20 20 20 73 71 6c  gStart);.    sql
d9d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
d9e0: 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72  , OP_Subtract, r
d9f0: 65 67 53 74 61 72 74 2c 20 72 65 67 45 6e 64 2c  egStart, regEnd,
da00: 20 72 65 67 45 6e 64 29 3b 0a 20 20 7d 0a 0a 20   regEnd);.  }.. 
da10: 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70 53 74 61   if( pMWin->pSta
da20: 72 74 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e  rt && pMWin->eEn
da30: 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20  d==TK_PRECEDING 
da40: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
da50: 4d 57 69 6e 2d 3e 70 45 6e 64 21 3d 30 20 29 3b  MWin->pEnd!=0 );
da60: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 57  .    assert( pMW
da70: 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 50  in->eStart==TK_P
da80: 52 45 43 45 44 49 4e 47 20 29 3b 0a 20 20 20 20  RECEDING );.    
da90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
daa0: 33 28 76 2c 20 4f 50 5f 4c 65 2c 20 72 65 67 53  3(v, OP_Le, regS
dab0: 74 61 72 74 2c 20 73 71 6c 69 74 65 33 56 64 62  tart, sqlite3Vdb
dac0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
dad0: 33 2c 20 72 65 67 45 6e 64 29 3b 0a 20 20 20 20  3, regEnd);.    
dae0: 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65  VdbeCoverageNeve
daf0: 72 4e 75 6c 6c 28 76 29 3b 0a 20 20 20 20 73 71  rNull(v);.    sq
db00: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
db10: 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 53  v, OP_Copy, regS
db20: 69 7a 65 2c 20 72 65 67 53 74 61 72 74 29 3b 0a  ize, regStart);.
db30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
db40: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp2(v, OP_Copy
db50: 2c 20 72 65 67 53 69 7a 65 2c 20 72 65 67 45 6e  , regSize, regEn
db60: 64 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e  d);.  }..  /* In
db70: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61 63 63  itialize the acc
db80: 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65  umulator registe
db90: 72 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f  r for each windo
dba0: 77 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 4e 55  w function to NU
dbb0: 4c 4c 20 2a 2f 0a 20 20 72 65 67 41 72 67 20 3d  LL */.  regArg =
dbc0: 20 77 69 6e 64 6f 77 49 6e 69 74 41 63 63 75 6d   windowInitAccum
dbd0: 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 29 3b  (pParse, pMWin);
dbe0: 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ..  sqlite3VdbeA
dbf0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
dc00: 6e 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43  nd, pMWin->iEphC
dc10: 73 72 2c 20 6c 62 6c 46 6c 75 73 68 44 6f 6e 65  sr, lblFlushDone
dc20: 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67  );.  VdbeCoverag
dc30: 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
dc40: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
dc50: 52 65 77 69 6e 64 2c 20 63 73 72 53 74 61 72 74  Rewind, csrStart
dc60: 2c 20 6c 62 6c 46 6c 75 73 68 44 6f 6e 65 29 3b  , lblFlushDone);
dc70: 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e  .  VdbeCoverageN
dc80: 65 76 65 72 54 61 6b 65 6e 28 76 29 3b 0a 20 20  everTaken(v);.  
dc90: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
dca0: 65 50 35 28 76 2c 20 31 29 3b 0a 20 20 73 71 6c  eP5(v, 1);.  sql
dcb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
dcc0: 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 63 73 72  , OP_Rewind, csr
dcd0: 45 6e 64 2c 20 6c 62 6c 46 6c 75 73 68 44 6f 6e  End, lblFlushDon
dce0: 65 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61  e);.  VdbeCovera
dcf0: 67 65 4e 65 76 65 72 54 61 6b 65 6e 28 76 29 3b  geNeverTaken(v);
dd00: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
dd10: 61 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a 0a 20  angeP5(v, 1);.. 
dd20: 20 2f 2a 20 49 6e 76 6f 6b 65 20 41 67 67 53 74   /* Invoke AggSt
dd30: 65 70 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  ep function for 
dd40: 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63  each window func
dd50: 74 69 6f 6e 20 75 73 69 6e 67 20 74 68 65 20 72  tion using the r
dd60: 6f 77 20 74 68 61 74 0a 20 20 2a 2a 20 63 73 72  ow that.  ** csr
dd70: 45 6e 64 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  End currently po
dd80: 69 6e 74 73 20 74 6f 2e 20 4f 72 2c 20 69 66 20  ints to. Or, if 
dd90: 63 73 72 45 6e 64 20 69 73 20 61 6c 72 65 61 64  csrEnd is alread
dda0: 79 20 61 74 20 45 4f 46 2c 0a 20 20 2a 2a 20 64  y at EOF,.  ** d
ddb0: 6f 20 6e 6f 74 68 69 6e 67 2e 20 20 2a 2f 0a 20  o nothing.  */. 
ddc0: 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
ddd0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
dde0: 72 28 76 29 3b 0a 20 20 69 66 28 20 70 4d 57 69  r(v);.  if( pMWi
ddf0: 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43  n->eEnd==TK_PREC
de00: 45 44 49 4e 47 20 29 7b 0a 20 20 20 20 61 64 64  EDING ){.    add
de10: 72 49 66 50 6f 73 31 20 3d 20 73 71 6c 69 74 65  rIfPos1 = sqlite
de20: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
de30: 50 5f 49 66 50 6f 73 2c 20 72 65 67 45 6e 64 2c  P_IfPos, regEnd,
de40: 20 30 20 2c 20 31 29 3b 0a 20 20 20 20 56 64 62   0 , 1);.    Vdb
de50: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
de60: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
de70: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
de80: 2c 20 63 73 72 45 6e 64 2c 20 73 71 6c 69 74 65  , csrEnd, sqlite
de90: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
dea0: 28 76 29 2b 32 29 3b 0a 20 20 56 64 62 65 43 6f  (v)+2);.  VdbeCo
deb0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 61 64 64  verage(v);.  add
dec0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
ded0: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp0(v, OP_Goto
dee0: 29 3b 0a 20 20 77 69 6e 64 6f 77 41 67 67 53 74  );.  windowAggSt
def0: 65 70 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  ep(pParse, pMWin
df00: 2c 20 63 73 72 45 6e 64 2c 20 30 2c 20 72 65 67  , csrEnd, 0, reg
df10: 41 72 67 2c 20 72 65 67 53 69 7a 65 29 3b 0a 20  Arg, regSize);. 
df20: 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64   if( pMWin->eEnd
df30: 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29  ==TK_UNBOUNDED )
df40: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
df50: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
df60: 74 6f 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b  to, 0, addrTop);
df70: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
df80: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
df90: 29 3b 0a 20 20 20 20 61 64 64 72 54 6f 70 20 3d  );.    addrTop =
dfa0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
dfb0: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 7d 65  entAddr(v);.  }e
dfc0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
dfd0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
dfe0: 61 64 64 72 29 3b 0a 20 20 20 20 69 66 28 20 70  addr);.    if( p
dff0: 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50  MWin->eEnd==TK_P
e000: 52 45 43 45 44 49 4e 47 20 29 7b 0a 20 20 20 20  RECEDING ){.    
e010: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
e020: 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 66 50  pHere(v, addrIfP
e030: 6f 73 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  os1);.    }.  }.
e040: 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45  .  if( pMWin->eE
e050: 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  nd==TK_FOLLOWING
e060: 20 29 7b 0a 20 20 20 20 61 64 64 72 49 66 50 6f   ){.    addrIfPo
e070: 73 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  s1 = sqlite3Vdbe
e080: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50  AddOp3(v, OP_IfP
e090: 6f 73 2c 20 72 65 67 45 6e 64 2c 20 30 20 2c 20  os, regEnd, 0 , 
e0a0: 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  1);.    VdbeCove
e0b0: 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69  rage(v);.  }.  i
e0c0: 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  f( pMWin->eStart
e0d0: 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29  ==TK_FOLLOWING )
e0e0: 7b 0a 20 20 20 20 61 64 64 72 49 66 50 6f 73 32  {.    addrIfPos2
e0f0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
e100: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp3(v, OP_IfPos
e110: 2c 20 72 65 67 53 74 61 72 74 2c 20 30 20 2c 20  , regStart, 0 , 
e120: 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  1);.    VdbeCove
e130: 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 77  rage(v);.  }.  w
e140: 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 70 50  indowAggFinal(pP
e150: 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 30 29 3b  arse, pMWin, 0);
e160: 0a 20 20 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f  .  windowReturnO
e170: 6e 65 52 6f 77 28 70 50 61 72 73 65 2c 20 70 4d  neRow(pParse, pM
e180: 57 69 6e 2c 20 72 65 67 47 6f 73 75 62 2c 20 61  Win, regGosub, a
e190: 64 64 72 47 6f 73 75 62 29 3b 0a 20 20 73 71 6c  ddrGosub);.  sql
e1a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
e1b0: 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4d 57 69 6e  , OP_Next, pMWin
e1c0: 2d 3e 69 45 70 68 43 73 72 2c 20 73 71 6c 69 74  ->iEphCsr, sqlit
e1d0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
e1e0: 72 28 76 29 2b 32 29 3b 0a 20 20 56 64 62 65 43  r(v)+2);.  VdbeC
e1f0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
e200: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
e210: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c  v, OP_Goto, 0, l
e220: 62 6c 46 6c 75 73 68 44 6f 6e 65 29 3b 0a 20 20  blFlushDone);.  
e230: 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72  if( pMWin->eStar
e240: 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  t==TK_FOLLOWING 
e250: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
e260: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
e270: 64 72 49 66 50 6f 73 32 29 3b 0a 20 20 7d 0a 0a  drIfPos2);.  }..
e280: 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74    if( pMWin->eSt
e290: 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20  art==TK_CURRENT 
e2a0: 0a 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53  .   || pMWin->eS
e2b0: 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49  tart==TK_PRECEDI
e2c0: 4e 47 20 0a 20 20 20 7c 7c 20 70 4d 57 69 6e 2d  NG .   || pMWin-
e2d0: 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c  >eStart==TK_FOLL
e2e0: 4f 57 49 4e 47 20 0a 20 20 29 7b 0a 20 20 20 20  OWING .  ){.    
e2f0: 69 6e 74 20 6c 62 6c 53 6b 69 70 49 6e 76 65 72  int lblSkipInver
e300: 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  se = sqlite3Vdbe
e310: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 3b 0a 20  MakeLabel(v);;. 
e320: 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53     if( pMWin->eS
e330: 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49  tart==TK_PRECEDI
e340: 4e 47 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  NG ){.      sqli
e350: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
e360: 20 4f 50 5f 49 66 50 6f 73 2c 20 72 65 67 53 74   OP_IfPos, regSt
e370: 61 72 74 2c 20 6c 62 6c 53 6b 69 70 49 6e 76 65  art, lblSkipInve
e380: 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 56  rse, 1);.      V
e390: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
e3a0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4d      }.    if( pM
e3b0: 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
e3c0: 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20  FOLLOWING ){.   
e3d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e3e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
e3f0: 20 63 73 72 53 74 61 72 74 2c 20 73 71 6c 69 74   csrStart, sqlit
e400: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
e410: 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 20 20 56  r(v)+2);.      V
e420: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
e430: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e440: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
e450: 74 6f 2c 20 30 2c 20 6c 62 6c 53 6b 69 70 49 6e  to, 0, lblSkipIn
e460: 76 65 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73  verse);.    }els
e470: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
e480: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
e490: 5f 4e 65 78 74 2c 20 63 73 72 53 74 61 72 74 2c  _Next, csrStart,
e4a0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
e4b0: 65 6e 74 41 64 64 72 28 76 29 2b 31 29 3b 0a 20  entAddr(v)+1);. 
e4c0: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
e4d0: 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  e(v);.    }.    
e4e0: 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28 70 50  windowAggStep(pP
e4f0: 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 63 73 72  arse, pMWin, csr
e500: 53 74 61 72 74 2c 20 31 2c 20 72 65 67 41 72 67  Start, 1, regArg
e510: 2c 20 72 65 67 53 69 7a 65 29 3b 0a 20 20 20 20  , regSize);.    
e520: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
e530: 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 53 6b  veLabel(v, lblSk
e540: 69 70 49 6e 76 65 72 73 65 29 3b 0a 20 20 7d 0a  ipInverse);.  }.
e550: 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e    if( pMWin->eEn
e560: 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  d==TK_FOLLOWING 
e570: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
e580: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
e590: 64 72 49 66 50 6f 73 31 29 3b 0a 20 20 7d 0a 20  drIfPos1);.  }. 
e5a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e5b0: 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
e5c0: 2c 20 61 64 64 72 54 6f 70 29 3b 0a 0a 20 20 2f  , addrTop);..  /
e5d0: 2a 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f  * flush_partitio
e5e0: 6e 5f 64 6f 6e 65 3a 20 2a 2f 0a 20 20 73 71 6c  n_done: */.  sql
e5f0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
e600: 61 62 65 6c 28 76 2c 20 6c 62 6c 46 6c 75 73 68  abel(v, lblFlush
e610: 44 6f 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Done);.  sqlite3
e620: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
e630: 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20 70 4d  _ResetSorter, pM
e640: 57 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20  Win->iEphCsr);. 
e650: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e660: 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
e670: 20 72 65 67 46 6c 75 73 68 50 61 72 74 29 3b 0a   regFlushPart);.
e680: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
e690: 2c 20 22 65 6e 64 20 66 6c 75 73 68 5f 70 61 72  , "end flush_par
e6a0: 74 69 74 69 6f 6e 20 73 75 62 72 6f 75 74 69 6e  tition subroutin
e6b0: 65 22 29 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  e"));..  /* Jump
e6c0: 20 74 6f 20 68 65 72 65 20 74 6f 20 73 6b 69 70   to here to skip
e6d0: 20 6f 76 65 72 20 66 6c 75 73 68 5f 70 61 72 74   over flush_part
e6e0: 69 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  ition */.  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 47 6f 74 6f 29 3b 0a 7d 0a 0a  , addrGoto);.}..
e710: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
e720: 69 6f 6e 20 64 6f 65 73 20 74 68 65 20 77 6f 72  ion does the wor
e730: 6b 20 6f 66 20 73 71 6c 69 74 65 33 57 69 6e 64  k of sqlite3Wind
e740: 6f 77 43 6f 64 65 53 74 65 70 28 29 20 66 6f 72  owCodeStep() for
e750: 20 63 61 73 65 73 20 74 68 61 74 0a 2a 2a 20 77   cases that.** w
e760: 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65  ould normally be
e770: 20 68 61 6e 64 6c 65 64 20 62 79 20 77 69 6e 64   handled by wind
e780: 6f 77 43 6f 64 65 44 65 66 61 75 6c 74 53 74 65  owCodeDefaultSte
e790: 70 28 29 20 77 68 65 6e 20 74 68 65 72 65 20 61  p() when there a
e7a0: 72 65 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f 72  re.** one or mor
e7b0: 65 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  e built-in windo
e7c0: 77 2d 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74  w-functions that
e7d0: 20 72 65 71 75 69 72 65 20 74 68 65 20 65 6e 74   require the ent
e7e0: 69 72 65 20 70 61 72 74 69 74 69 6f 6e 0a 2a 2a  ire partition.**
e7f0: 20 74 6f 20 62 65 20 63 61 63 68 65 64 20 69 6e   to be cached in
e800: 20 61 20 74 65 6d 70 20 74 61 62 6c 65 20 62 65   a temp table be
e810: 66 6f 72 65 20 61 6e 79 20 72 6f 77 73 20 63 61  fore any rows ca
e820: 6e 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 41  n be returned. A
e830: 64 64 69 74 69 6f 6e 61 6c 6c 79 2e 0a 2a 2a 20  dditionally..** 
e840: 22 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 43  "RANGE BETWEEN C
e850: 55 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 55  URRENT ROW AND U
e860: 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49  NBOUNDED FOLLOWI
e870: 4e 47 22 20 69 73 20 61 6c 77 61 79 73 20 68 61  NG" is always ha
e880: 6e 64 6c 65 64 20 62 79 0a 2a 2a 20 74 68 69 73  ndled by.** this
e890: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
e8a0: 20 50 73 65 75 64 6f 2d 63 6f 64 65 20 63 6f 72   Pseudo-code cor
e8b0: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
e8c0: 65 20 56 4d 20 63 6f 64 65 20 67 65 6e 65 72 61  e VM code genera
e8d0: 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
e8e0: 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 65 61 63 68  tion.** for each
e8f0: 20 74 79 70 65 20 6f 66 20 77 69 6e 64 6f 77 20   type of window 
e900: 66 6f 6c 6c 6f 77 73 2e 0a 2a 2a 0a 2a 2a 20 52  follows..**.** R
e910: 41 4e 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42  ANGE BETWEEN UNB
e920: 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47  OUNDED PRECEDING
e930: 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57   AND CURRENT ROW
e940: 0a 2a 2a 0a 2a 2a 20 20 20 66 6c 75 73 68 5f 70  .**.**   flush_p
e950: 61 72 74 69 74 69 6f 6e 3a 0a 2a 2a 20 20 20 20  artition:.**    
e960: 20 4f 6e 63 65 20 7b 0a 2a 2a 20 20 20 20 20 20   Once {.**      
e970: 20 4f 70 65 6e 44 75 70 20 28 69 45 70 68 43 73   OpenDup (iEphCs
e980: 72 20 2d 3e 20 63 73 72 4c 65 61 64 29 0a 2a 2a  r -> csrLead).**
e990: 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 49 6e       }.**     In
e9a0: 74 65 67 65 72 20 63 74 72 20 30 0a 2a 2a 20 20  teger ctr 0.**  
e9b0: 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 20 28     foreach row (
e9c0: 63 73 72 4c 65 61 64 29 7b 0a 2a 2a 20 20 20 20  csrLead){.**    
e9d0: 20 20 20 69 66 28 20 6e 65 77 20 70 65 65 72 20     if( new peer 
e9e0: 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 67  ){.**         Ag
e9f0: 67 46 69 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a  gFinal (xValue).
ea00: 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  **         for(i
ea10: 3d 30 3b 20 69 3c 63 74 72 3b 20 69 2b 2b 29 7b  =0; i<ctr; i++){
ea20: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 47 6f  .**           Go
ea30: 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a  sub addrGosub.**
ea40: 20 20 20 20 20 20 20 20 20 20 20 4e 65 78 74 20             Next 
ea50: 69 45 70 68 43 73 72 0a 2a 2a 20 20 20 20 20 20  iEphCsr.**      
ea60: 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20     }.**         
ea70: 49 6e 74 65 67 65 72 20 63 74 72 20 30 0a 2a 2a  Integer ctr 0.**
ea80: 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
ea90: 20 20 41 67 67 53 74 65 70 20 28 63 73 72 4c 65    AggStep (csrLe
eaa0: 61 64 29 0a 2a 2a 20 20 20 20 20 20 20 49 6e 63  ad).**       Inc
eab0: 72 20 63 74 72 0a 2a 2a 20 20 20 20 20 7d 0a 2a  r ctr.**     }.*
eac0: 2a 0a 2a 2a 20 20 20 20 20 41 67 67 46 69 6e 61  *.**     AggFina
ead0: 6c 20 28 78 46 69 6e 61 6c 69 7a 65 29 0a 2a 2a  l (xFinalize).**
eae0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
eaf0: 63 74 72 3b 20 69 2b 2b 29 7b 0a 2a 2a 20 20 20  ctr; i++){.**   
eb00: 20 20 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f      Gosub addrGo
eb10: 73 75 62 0a 2a 2a 20 20 20 20 20 20 20 4e 65 78  sub.**       Nex
eb20: 74 20 69 45 70 68 43 73 72 0a 2a 2a 20 20 20 20  t iEphCsr.**    
eb30: 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 73   }.**.**     Res
eb40: 65 74 53 6f 72 74 65 72 20 28 63 73 72 29 0a 2a  etSorter (csr).*
eb50: 2a 20 20 20 20 20 52 65 74 75 72 6e 0a 2a 2a 0a  *     Return.**.
eb60: 2a 2a 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20  ** ROWS BETWEEN 
eb70: 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44  UNBOUNDED PRECED
eb80: 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54 20  ING AND CURRENT 
eb90: 52 4f 57 0a 2a 2a 0a 2a 2a 20 20 20 41 73 20 61  ROW.**.**   As a
eba0: 62 6f 76 65 2c 20 65 78 63 65 70 74 20 74 68 61  bove, except tha
ebb0: 74 20 74 68 65 20 22 69 66 28 20 6e 65 77 20 70  t the "if( new p
ebc0: 65 65 72 20 29 22 20 62 72 61 6e 63 68 20 69 73  eer )" branch is
ebd0: 20 61 6c 77 61 79 73 20 74 61 6b 65 6e 2e 0a 2a   always taken..*
ebe0: 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54 57 45  *.** RANGE BETWE
ebf0: 45 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20 41  EN CURRENT ROW A
ec00: 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 20 0a  ND CURRENT ROW .
ec10: 2a 2a 0a 2a 2a 20 20 20 41 73 20 61 62 6f 76 65  **.**   As above
ec20: 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 65 61  , except that ea
ec30: 63 68 20 6f 66 20 74 68 65 20 66 6f 72 28 29 20  ch of the for() 
ec40: 6c 6f 6f 70 73 20 62 65 63 6f 6d 65 73 3a 0a 2a  loops becomes:.*
ec50: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72  *.**         for
ec60: 28 69 3d 30 3b 20 69 3c 63 74 72 3b 20 69 2b 2b  (i=0; i<ctr; i++
ec70: 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ){.**           
ec80: 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a  Gosub addrGosub.
ec90: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 67 67  **           Agg
eca0: 49 6e 76 65 72 73 65 20 28 69 45 70 68 43 73 72  Inverse (iEphCsr
ecb0: 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 4e  ).**           N
ecc0: 65 78 74 20 69 45 70 68 43 73 72 0a 2a 2a 20 20  ext iEphCsr.**  
ecd0: 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 52         }.**.** R
ece0: 41 4e 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42  ANGE BETWEEN UNB
ecf0: 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47  OUNDED PRECEDING
ed00: 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46   AND UNBOUNDED F
ed10: 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20  OLLOWING.**.**  
ed20: 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e   flush_partition
ed30: 3a 0a 2a 2a 20 20 20 20 20 4f 6e 63 65 20 7b 0a  :.**     Once {.
ed40: 2a 2a 20 20 20 20 20 20 20 4f 70 65 6e 44 75 70  **       OpenDup
ed50: 20 28 69 45 70 68 43 73 72 20 2d 3e 20 63 73 72   (iEphCsr -> csr
ed60: 4c 65 61 64 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a  Lead).**     }.*
ed70: 2a 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f  *     foreach ro
ed80: 77 20 28 63 73 72 4c 65 61 64 29 20 7b 0a 2a 2a  w (csrLead) {.**
ed90: 20 20 20 20 20 20 20 41 67 67 53 74 65 70 20 28         AggStep (
eda0: 63 73 72 4c 65 61 64 29 0a 2a 2a 20 20 20 20 20  csrLead).**     
edb0: 7d 0a 2a 2a 20 20 20 20 20 66 6f 72 65 61 63 68  }.**     foreach
edc0: 20 72 6f 77 20 28 69 45 70 68 43 73 72 29 20 7b   row (iEphCsr) {
edd0: 0a 2a 2a 20 20 20 20 20 20 20 47 6f 73 75 62 20  .**       Gosub 
ede0: 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20  addrGosub.**    
edf0: 20 7d 0a 2a 2a 20 0a 2a 2a 20 52 41 4e 47 45 20   }.** .** RANGE 
ee00: 42 45 54 57 45 45 4e 20 43 55 52 52 45 4e 54 20  BETWEEN CURRENT 
ee10: 52 4f 57 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45  ROW AND UNBOUNDE
ee20: 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a  D FOLLOWING.**.*
ee30: 2a 20 20 20 66 6c 75 73 68 5f 70 61 72 74 69 74  *   flush_partit
ee40: 69 6f 6e 3a 0a 2a 2a 20 20 20 20 20 4f 6e 63 65  ion:.**     Once
ee50: 20 7b 0a 2a 2a 20 20 20 20 20 20 20 4f 70 65 6e   {.**       Open
ee60: 44 75 70 20 28 69 45 70 68 43 73 72 20 2d 3e 20  Dup (iEphCsr -> 
ee70: 63 73 72 4c 65 61 64 29 0a 2a 2a 20 20 20 20 20  csrLead).**     
ee80: 7d 0a 2a 2a 20 20 20 20 20 66 6f 72 65 61 63 68  }.**     foreach
ee90: 20 72 6f 77 20 28 63 73 72 4c 65 61 64 29 7b 0a   row (csrLead){.
eea0: 2a 2a 20 20 20 20 20 20 20 41 67 67 53 74 65 70  **       AggStep
eeb0: 20 28 63 73 72 4c 65 61 64 29 0a 2a 2a 20 20 20   (csrLead).**   
eec0: 20 20 7d 0a 2a 2a 20 20 20 20 20 52 65 77 69 6e    }.**     Rewin
eed0: 64 20 28 63 73 72 4c 65 61 64 29 0a 2a 2a 20 20  d (csrLead).**  
eee0: 20 20 20 49 6e 74 65 67 65 72 20 63 74 72 20 30     Integer ctr 0
eef0: 0a 2a 2a 20 20 20 20 20 66 6f 72 65 61 63 68 20  .**     foreach 
ef00: 72 6f 77 20 28 63 73 72 4c 65 61 64 29 7b 0a 2a  row (csrLead){.*
ef10: 2a 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 20  *       if( new 
ef20: 70 65 65 72 20 29 7b 0a 2a 2a 20 20 20 20 20 20  peer ){.**      
ef30: 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78 56 61     AggFinal (xVa
ef40: 6c 75 65 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  lue).**         
ef50: 66 6f 72 28 69 3d 30 3b 20 69 3c 63 74 72 3b 20  for(i=0; i<ctr; 
ef60: 69 2b 2b 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  i++){.**        
ef70: 20 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73     Gosub addrGos
ef80: 75 62 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ub.**           
ef90: 41 67 67 49 6e 76 65 72 73 65 20 28 69 45 70 68  AggInverse (iEph
efa0: 43 73 72 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  Csr).**         
efb0: 20 20 4e 65 78 74 20 69 45 70 68 43 73 72 0a 2a    Next iEphCsr.*
efc0: 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  *         }.**  
efd0: 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63         Integer c
efe0: 74 72 20 30 0a 2a 2a 20 20 20 20 20 20 20 7d 0a  tr 0.**       }.
eff0: 2a 2a 20 20 20 20 20 20 20 49 6e 63 72 20 63 74  **       Incr ct
f000: 72 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a  r.**     }.**.**
f010: 20 20 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78       AggFinal (x
f020: 46 69 6e 61 6c 69 7a 65 29 0a 2a 2a 20 20 20 20  Finalize).**    
f030: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 63 74 72 3b   for(i=0; i<ctr;
f040: 20 69 2b 2b 29 7b 0a 2a 2a 20 20 20 20 20 20 20   i++){.**       
f050: 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a  Gosub addrGosub.
f060: 2a 2a 20 20 20 20 20 20 20 4e 65 78 74 20 69 45  **       Next iE
f070: 70 68 43 73 72 0a 2a 2a 20 20 20 20 20 7d 0a 2a  phCsr.**     }.*
f080: 2a 0a 2a 2a 20 20 20 20 20 52 65 73 65 74 53 6f  *.**     ResetSo
f090: 72 74 65 72 20 28 63 73 72 29 0a 2a 2a 20 20 20  rter (csr).**   
f0a0: 20 20 52 65 74 75 72 6e 0a 2a 2f 0a 73 74 61 74    Return.*/.stat
f0b0: 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 43 6f  ic void windowCo
f0c0: 64 65 43 61 63 68 65 53 74 65 70 28 0a 20 20 50  deCacheStep(.  P
f0d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20  arse *pParse, . 
f0e0: 20 53 65 6c 65 63 74 20 2a 70 2c 0a 20 20 57 68   Select *p,.  Wh
f0f0: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
f100: 0a 20 20 69 6e 74 20 72 65 67 47 6f 73 75 62 2c  .  int regGosub,
f110: 20 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75   .  int addrGosu
f120: 62 0a 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70  b.){.  Window *p
f130: 4d 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b 0a  MWin = p->pWin;.
f140: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
f150: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
f160: 65 29 3b 0a 20 20 69 6e 74 20 6b 3b 0a 20 20 69  e);.  int k;.  i
f170: 6e 74 20 61 64 64 72 3b 0a 20 20 45 78 70 72 4c  nt addr;.  ExprL
f180: 69 73 74 20 2a 70 50 61 72 74 20 3d 20 70 4d 57  ist *pPart = pMW
f190: 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 3b 0a  in->pPartition;.
f1a0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
f1b0: 65 72 42 79 20 3d 20 70 4d 57 69 6e 2d 3e 70 4f  erBy = pMWin->pO
f1c0: 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 6e 50  rderBy;.  int nP
f1d0: 65 65 72 20 3d 20 70 4f 72 64 65 72 42 79 20 3f  eer = pOrderBy ?
f1e0: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
f1f0: 20 3a 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 4e   : 0;.  int regN
f200: 65 77 50 65 65 72 3b 0a 0a 20 20 69 6e 74 20 61  ewPeer;..  int a
f210: 64 64 72 47 6f 74 6f 3b 20 20 20 20 20 20 20 20  ddrGoto;        
f220: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
f230: 64 72 65 73 73 20 6f 66 20 47 6f 74 6f 20 75 73  dress of Goto us
f240: 65 64 20 74 6f 20 6a 75 6d 70 20 66 6c 75 73 68  ed to jump flush
f250: 5f 70 61 72 2e 2e 20 2a 2f 0a 20 20 69 6e 74 20  _par.. */.  int 
f260: 61 64 64 72 4e 65 78 74 3b 20 20 20 20 20 20 20  addrNext;       
f270: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
f280: 75 6d 70 20 68 65 72 65 20 66 6f 72 20 6e 65 78  ump here for nex
f290: 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 6c  t iteration of l
f2a0: 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  oop */.  int reg
f2b0: 46 6c 75 73 68 50 61 72 74 3b 0a 20 20 69 6e 74  FlushPart;.  int
f2c0: 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 3b 0a 20   lblFlushPart;. 
f2d0: 20 69 6e 74 20 63 73 72 4c 65 61 64 3b 0a 20 20   int csrLead;.  
f2e0: 69 6e 74 20 72 65 67 43 74 72 3b 0a 20 20 69 6e  int regCtr;.  in
f2f0: 74 20 72 65 67 41 72 67 3b 20 20 20 20 20 20 20  t regArg;       
f300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f310: 20 52 65 67 69 73 74 65 72 20 61 72 72 61 79 20   Register array 
f320: 74 6f 20 6d 61 72 74 69 61 6c 20 66 75 6e 63 74  to martial funct
f330: 69 6f 6e 20 61 72 67 73 20 2a 2f 0a 20 20 69 6e  ion args */.  in
f340: 74 20 72 65 67 53 69 7a 65 3b 0a 20 20 69 6e 74  t regSize;.  int
f350: 20 6c 62 6c 45 6d 70 74 79 3b 0a 20 20 69 6e 74   lblEmpty;.  int
f360: 20 62 52 65 76 65 72 73 65 20 3d 20 70 4d 57 69   bReverse = pMWi
f370: 6e 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70  n->pOrderBy && p
f380: 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
f390: 5f 43 55 52 52 45 4e 54 20 0a 20 20 20 20 20 20  _CURRENT .      
f3a0: 20 20 20 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45      && pMWin->eE
f3b0: 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  nd==TK_UNBOUNDED
f3c0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 4d  ;..  assert( (pM
f3d0: 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
f3e0: 55 4e 42 4f 55 4e 44 45 44 20 26 26 20 70 4d 57  UNBOUNDED && pMW
f3f0: 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55 52  in->eEnd==TK_CUR
f400: 52 45 4e 54 29 20 0a 20 20 20 20 20 20 20 7c 7c  RENT) .       ||
f410: 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d   (pMWin->eStart=
f420: 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 26 26  =TK_UNBOUNDED &&
f430: 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b   pMWin->eEnd==TK
f440: 5f 55 4e 42 4f 55 4e 44 45 44 29 20 0a 20 20 20  _UNBOUNDED) .   
f450: 20 20 20 20 7c 7c 20 28 70 4d 57 69 6e 2d 3e 65      || (pMWin->e
f460: 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e  Start==TK_CURREN
f470: 54 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64  T && pMWin->eEnd
f480: 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29 20 0a 20  ==TK_CURRENT) . 
f490: 20 20 20 20 20 20 7c 7c 20 28 70 4d 57 69 6e 2d        || (pMWin-
f4a0: 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52  >eStart==TK_CURR
f4b0: 45 4e 54 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45  ENT && pMWin->eE
f4c0: 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  nd==TK_UNBOUNDED
f4d0: 29 20 0a 20 20 29 3b 0a 0a 20 20 6c 62 6c 45 6d  ) .  );..  lblEm
f4e0: 70 74 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pty = sqlite3Vdb
f4f0: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
f500: 20 72 65 67 4e 65 77 50 65 65 72 20 3d 20 70 50   regNewPeer = pP
f510: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
f520: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
f530: 6e 50 65 65 72 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  nPeer;..  /* All
f540: 6f 63 61 74 65 20 72 65 67 69 73 74 65 72 20 61  ocate register a
f550: 6e 64 20 6c 61 62 65 6c 20 66 6f 72 20 74 68 65  nd label for the
f560: 20 22 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f   "flush_partitio
f570: 6e 22 20 73 75 62 2d 72 6f 75 74 69 6e 65 2e 20  n" sub-routine. 
f580: 2a 2f 0a 20 20 72 65 67 46 6c 75 73 68 50 61 72  */.  regFlushPar
f590: 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
f5a0: 65 6d 3b 0a 20 20 6c 62 6c 46 6c 75 73 68 50 61  em;.  lblFlushPa
f5b0: 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
f5c0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
f5d0: 20 63 73 72 4c 65 61 64 20 3d 20 70 50 61 72 73   csrLead = pPars
f5e0: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 72 65 67  e->nTab++;.  reg
f5f0: 43 74 72 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Ctr = ++pParse->
f600: 6e 4d 65 6d 3b 0a 0a 20 20 77 69 6e 64 6f 77 50  nMem;..  windowP
f610: 61 72 74 69 74 69 6f 6e 43 61 63 68 65 28 70 50  artitionCache(pP
f620: 61 72 73 65 2c 20 70 2c 20 70 57 49 6e 66 6f 2c  arse, p, pWInfo,
f630: 20 72 65 67 46 6c 75 73 68 50 61 72 74 2c 20 6c   regFlushPart, l
f640: 62 6c 46 6c 75 73 68 50 61 72 74 2c 20 26 72 65  blFlushPart, &re
f650: 67 53 69 7a 65 29 3b 0a 20 20 61 64 64 72 47 6f  gSize);.  addrGo
f660: 74 6f 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  to = sqlite3Vdbe
f670: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74  AddOp0(v, OP_Got
f680: 6f 29 3b 0a 0a 20 20 2f 2a 20 53 74 61 72 74 20  o);..  /* Start 
f690: 6f 66 20 22 66 6c 75 73 68 5f 70 61 72 74 69 74  of "flush_partit
f6a0: 69 6f 6e 22 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ion" */.  sqlite
f6b0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
f6c0: 6c 28 76 2c 20 6c 62 6c 46 6c 75 73 68 50 61 72  l(v, lblFlushPar
f6d0: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  t);.  sqlite3Vdb
f6e0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 6e  eAddOp2(v, OP_On
f6f0: 63 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 56 64  ce, 0, sqlite3Vd
f700: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
f710: 2b 32 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72  +2);.  VdbeCover
f720: 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
f730: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
f740: 50 5f 4f 70 65 6e 44 75 70 2c 20 63 73 72 4c 65  P_OpenDup, csrLe
f750: 61 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43  ad, pMWin->iEphC
f760: 73 72 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  sr);..  /* Initi
f770: 61 6c 69 7a 65 20 74 68 65 20 61 63 63 75 6d 75  alize the accumu
f780: 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 20 66  lator register f
f790: 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77 20 66  or each window f
f7a0: 75 6e 63 74 69 6f 6e 20 74 6f 20 4e 55 4c 4c 20  unction to NULL 
f7b0: 2a 2f 0a 20 20 72 65 67 41 72 67 20 3d 20 77 69  */.  regArg = wi
f7c0: 6e 64 6f 77 49 6e 69 74 41 63 63 75 6d 28 70 50  ndowInitAccum(pP
f7d0: 61 72 73 65 2c 20 70 4d 57 69 6e 29 3b 0a 0a 20  arse, pMWin);.. 
f7e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f7f0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
f800: 2c 20 30 2c 20 72 65 67 43 74 72 29 3b 0a 20 20  , 0, regCtr);.  
f810: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f820: 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
f830: 63 73 72 4c 65 61 64 2c 20 6c 62 6c 45 6d 70 74  csrLead, lblEmpt
f840: 79 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61  y);.  VdbeCovera
f850: 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
f860: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
f870: 5f 52 65 77 69 6e 64 2c 20 70 4d 57 69 6e 2d 3e  _Rewind, pMWin->
f880: 69 45 70 68 43 73 72 2c 20 6c 62 6c 45 6d 70 74  iEphCsr, lblEmpt
f890: 79 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61  y);.  VdbeCovera
f8a0: 67 65 4e 65 76 65 72 54 61 6b 65 6e 28 76 29 3b  geNeverTaken(v);
f8b0: 0a 0a 20 20 69 66 28 20 62 52 65 76 65 72 73 65  ..  if( bReverse
f8c0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
f8d0: 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
f8e0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
f8f0: 20 20 20 77 69 6e 64 6f 77 41 67 67 53 74 65 70     windowAggStep
f900: 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20  (pParse, pMWin, 
f910: 63 73 72 4c 65 61 64 2c 20 30 2c 20 72 65 67 41  csrLead, 0, regA
f920: 72 67 2c 20 72 65 67 53 69 7a 65 29 3b 0a 20 20  rg, regSize);.  
f930: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f940: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
f950: 63 73 72 4c 65 61 64 2c 20 61 64 64 72 32 29 3b  csrLead, addr2);
f960: 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
f970: 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
f980: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
f990: 50 5f 52 65 77 69 6e 64 2c 20 63 73 72 4c 65 61  P_Rewind, csrLea
f9a0: 64 2c 20 6c 62 6c 45 6d 70 74 79 29 3b 0a 20 20  d, lblEmpty);.  
f9b0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65    VdbeCoverageNe
f9c0: 76 65 72 54 61 6b 65 6e 28 76 29 3b 0a 20 20 7d  verTaken(v);.  }
f9d0: 0a 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71  .  addrNext = sq
f9e0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
f9f0: 41 64 64 72 28 76 29 3b 0a 0a 20 20 69 66 28 20  Addr(v);..  if( 
fa00: 70 4f 72 64 65 72 42 79 20 26 26 20 28 70 4d 57  pOrderBy && (pMW
fa10: 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55 52  in->eEnd==TK_CUR
fa20: 52 45 4e 54 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65  RENT || pMWin->e
fa30: 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e  Start==TK_CURREN
fa40: 54 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 43  T) ){.    int bC
fa50: 75 72 72 65 6e 74 20 3d 20 28 70 4d 57 69 6e 2d  urrent = (pMWin-
fa60: 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52  >eStart==TK_CURR
fa70: 45 4e 54 29 3b 0a 20 20 20 20 69 6e 74 20 61 64  ENT);.    int ad
fa80: 64 72 4a 75 6d 70 20 3d 20 30 3b 20 20 20 20 20  drJump = 0;     
fa90: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
faa0: 73 73 20 6f 66 20 4f 50 5f 4a 75 6d 70 20 62 65  ss of OP_Jump be
fab0: 6c 6f 77 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  low */.    if( p
fac0: 4d 57 69 6e 2d 3e 65 54 79 70 65 3d 3d 54 4b 5f  MWin->eType==TK_
fad0: 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 69  RANGE ){.      i
fae0: 6e 74 20 69 4f 66 66 20 3d 20 70 4d 57 69 6e 2d  nt iOff = pMWin-
faf0: 3e 6e 42 75 66 66 65 72 43 6f 6c 20 2b 20 28 70  >nBufferCol + (p
fb00: 50 61 72 74 20 3f 20 70 50 61 72 74 2d 3e 6e 45  Part ? pPart->nE
fb10: 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  xpr : 0);.      
fb20: 69 6e 74 20 72 65 67 50 65 65 72 20 3d 20 70 4d  int regPeer = pM
fb30: 57 69 6e 2d 3e 72 65 67 50 61 72 74 20 2b 20 28  Win->regPart + (
fb40: 70 50 61 72 74 20 3f 20 70 50 61 72 74 2d 3e 6e  pPart ? pPart->n
fb50: 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 20  Expr : 0);.     
fb60: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
fb70: 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  fo = sqlite3KeyI
fb80: 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
fb90: 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
fba0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 66  , 0, 0);.      f
fbb0: 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 50 65 65 72 3b  or(k=0; k<nPeer;
fbc0: 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   k++){.        s
fbd0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
fbe0: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63  (v, OP_Column, c
fbf0: 73 72 4c 65 61 64 2c 20 69 4f 66 66 2b 6b 2c 20  srLead, iOff+k, 
fc00: 72 65 67 4e 65 77 50 65 65 72 2b 6b 29 3b 0a 20  regNewPeer+k);. 
fc10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 64 64       }.      add
fc20: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
fc30: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp3(v, OP_Comp
fc40: 61 72 65 2c 20 72 65 67 4e 65 77 50 65 65 72 2c  are, regNewPeer,
fc50: 20 72 65 67 50 65 65 72 2c 20 6e 50 65 65 72 29   regPeer, nPeer)
fc60: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
fc70: 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28  dbeAppendP4(v, (
fc80: 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  void*)pKeyInfo, 
fc90: 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
fca0: 20 20 20 61 64 64 72 4a 75 6d 70 20 3d 20 73 71     addrJump = sq
fcb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
fcc0: 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72  v, OP_Jump, addr
fcd0: 2b 32 2c 20 30 2c 20 61 64 64 72 2b 32 29 3b 0a  +2, 0, addr+2);.
fce0: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
fcf0: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
fd00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
fd10: 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4e 65  , OP_Copy, regNe
fd20: 77 50 65 65 72 2c 20 72 65 67 50 65 65 72 2c 20  wPeer, regPeer, 
fd30: 6e 50 65 65 72 2d 31 29 3b 0a 20 20 20 20 7d 0a  nPeer-1);.    }.
fd40: 0a 20 20 20 20 77 69 6e 64 6f 77 52 65 74 75 72  .    windowRetur
fd50: 6e 52 6f 77 73 28 70 50 61 72 73 65 2c 20 70 4d  nRows(pParse, pM
fd60: 57 69 6e 2c 20 72 65 67 43 74 72 2c 20 72 65 67  Win, regCtr, reg
fd70: 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62  Gosub, addrGosub
fd80: 2c 20 0a 20 20 20 20 20 20 20 20 28 62 43 75 72  , .        (bCur
fd90: 72 65 6e 74 20 3f 20 72 65 67 41 72 67 20 3a 20  rent ? regArg : 
fda0: 30 29 2c 20 28 62 43 75 72 72 65 6e 74 20 3f 20  0), (bCurrent ? 
fdb0: 72 65 67 53 69 7a 65 20 3a 20 30 29 0a 20 20 20  regSize : 0).   
fdc0: 20 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72   );.    if( addr
fdd0: 4a 75 6d 70 20 29 20 73 71 6c 69 74 65 33 56 64  Jump ) sqlite3Vd
fde0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
fdf0: 64 72 4a 75 6d 70 29 3b 0a 20 20 7d 0a 0a 20 20  drJump);.  }..  
fe00: 69 66 28 20 62 52 65 76 65 72 73 65 3d 3d 30 20  if( bReverse==0 
fe10: 29 7b 0a 20 20 20 20 77 69 6e 64 6f 77 41 67 67  ){.    windowAgg
fe20: 53 74 65 70 28 70 50 61 72 73 65 2c 20 70 4d 57  Step(pParse, pMW
fe30: 69 6e 2c 20 63 73 72 4c 65 61 64 2c 20 30 2c 20  in, csrLead, 0, 
fe40: 72 65 67 41 72 67 2c 20 72 65 67 53 69 7a 65 29  regArg, regSize)
fe50: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
fe60: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
fe70: 41 64 64 49 6d 6d 2c 20 72 65 67 43 74 72 2c 20  AddImm, regCtr, 
fe80: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
fe90: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
fea0: 78 74 2c 20 63 73 72 4c 65 61 64 2c 20 61 64 64  xt, csrLead, add
feb0: 72 4e 65 78 74 29 3b 0a 20 20 56 64 62 65 43 6f  rNext);.  VdbeCo
fec0: 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 77 69  verage(v);..  wi
fed0: 6e 64 6f 77 52 65 74 75 72 6e 52 6f 77 73 28 70  ndowReturnRows(p
fee0: 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 72 65  Parse, pMWin, re
fef0: 67 43 74 72 2c 20 72 65 67 47 6f 73 75 62 2c 20  gCtr, regGosub, 
ff00: 61 64 64 72 47 6f 73 75 62 2c 20 30 2c 20 30 29  addrGosub, 0, 0)
ff10: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ;..  sqlite3Vdbe
ff20: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
ff30: 6c 62 6c 45 6d 70 74 79 29 3b 0a 20 20 73 71 6c  lblEmpty);.  sql
ff40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
ff50: 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72  , OP_ResetSorter
ff60: 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
ff70: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
ff80: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
ff90: 75 72 6e 2c 20 72 65 67 46 6c 75 73 68 50 61 72  urn, regFlushPar
ffa0: 74 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74  t);..  /* Jump t
ffb0: 6f 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 6f  o here to skip o
ffc0: 76 65 72 20 66 6c 75 73 68 5f 70 61 72 74 69 74  ver flush_partit
ffd0: 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ion */.  sqlite3
ffe0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
fff0: 61 64 64 72 47 6f 74 6f 29 3b 0a 7d 0a 0a 0a 2f  addrGoto);.}.../
10000 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54 57 45  *.** RANGE BETWE
10010 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  EN UNBOUNDED PRE
10020 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45  CEDING AND CURRE
10030 4e 54 20 52 4f 57 0a 2a 2a 0a 2a 2a 20 20 20 2e  NT ROW.**.**   .
10040 2e 2e 0a 2a 2a 20 20 20 20 20 69 66 28 20 6e 65  ...**     if( ne
10050 77 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a  w partition ){.*
10060 2a 20 20 20 20 20 20 20 41 67 67 46 69 6e 61 6c  *       AggFinal
10070 20 28 78 46 69 6e 61 6c 69 7a 65 29 0a 2a 2a 20   (xFinalize).** 
10080 20 20 20 20 20 20 47 6f 73 75 62 20 61 64 64 72        Gosub addr
10090 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20 20 52  Gosub.**       R
100a0 65 73 65 74 53 6f 72 74 65 72 20 65 70 68 2d 74  esetSorter eph-t
100b0 61 62 6c 65 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a  able.**     }.**
100c0 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 6e 65       else if( ne
100d0 77 20 70 65 65 72 20 29 7b 0a 2a 2a 20 20 20 20  w peer ){.**    
100e0 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78 56 61     AggFinal (xVa
100f0 6c 75 65 29 0a 2a 2a 20 20 20 20 20 20 20 47 6f  lue).**       Go
10100 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a  sub addrGosub.**
10110 20 20 20 20 20 20 20 52 65 73 65 74 53 6f 72 74         ResetSort
10120 65 72 20 65 70 68 2d 74 61 62 6c 65 0a 2a 2a 20  er eph-table.** 
10130 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 41 67 67      }.**     Agg
10140 53 74 65 70 0a 2a 2a 20 20 20 20 20 49 6e 73 65  Step.**     Inse
10150 72 74 20 28 72 65 63 6f 72 64 20 69 6e 74 6f 20  rt (record into 
10160 65 70 68 2d 74 61 62 6c 65 29 0a 2a 2a 20 20 20  eph-table).**   
10170 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
10180 29 0a 2a 2a 20 20 20 41 67 67 46 69 6e 61 6c 20  ).**   AggFinal 
10190 28 78 46 69 6e 61 6c 69 7a 65 29 0a 2a 2a 20 20  (xFinalize).**  
101a0 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62   Gosub addrGosub
101b0 0a 2a 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54  .**.** RANGE BET
101c0 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50  WEEN UNBOUNDED P
101d0 52 45 43 45 44 49 4e 47 20 41 4e 44 20 55 4e 42  RECEDING AND UNB
101e0 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47  OUNDED FOLLOWING
101f0 0a 2a 2a 0a 2a 2a 20 20 20 41 73 20 61 62 6f 76  .**.**   As abov
10200 65 2c 20 65 78 63 65 70 74 20 74 61 6b 65 20 6e  e, except take n
10210 6f 20 61 63 74 69 6f 6e 20 66 6f 72 20 61 20 22  o action for a "
10220 6e 65 77 20 70 65 65 72 22 2e 20 49 6e 76 6f 6b  new peer". Invok
10230 65 0a 2a 2a 20 20 20 74 68 65 20 73 75 62 2d 72  e.**   the sub-r
10240 6f 75 74 69 6e 65 20 6f 6e 63 65 20 6f 6e 6c 79  outine once only
10250 20 66 6f 72 20 65 61 63 68 20 70 61 72 74 69 74   for each partit
10260 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 52 41 4e 47 45  ion..**.** RANGE
10270 20 42 45 54 57 45 45 4e 20 43 55 52 52 45 4e 54   BETWEEN CURRENT
10280 20 52 4f 57 20 41 4e 44 20 43 55 52 52 45 4e 54   ROW AND CURRENT
10290 20 52 4f 57 0a 2a 2a 0a 2a 2a 20 20 20 41 73 20   ROW.**.**   As 
102a0 61 62 6f 76 65 2c 20 65 78 63 65 70 74 20 74 68  above, except th
102b0 61 74 20 74 68 65 20 22 6e 65 77 20 70 65 65 72  at the "new peer
102c0 22 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 68  " condition is h
102d0 61 6e 64 6c 65 64 20 69 6e 20 74 68 65 0a 2a 2a  andled in the.**
102e0 20 20 20 73 61 6d 65 20 77 61 79 20 61 73 20 22     same way as "
102f0 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 22 20 28  new partition" (
10300 73 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 22  so there is no "
10310 65 6c 73 65 20 69 66 22 20 62 6c 6f 63 6b 29 2e  else if" block).
10320 0a 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57  .**.** ROWS BETW
10330 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52  EEN UNBOUNDED PR
10340 45 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52  ECEDING AND CURR
10350 45 4e 54 20 52 4f 57 0a 2a 2a 20 0a 2a 2a 20 20  ENT ROW.** .**  
10360 20 41 73 20 61 62 6f 76 65 2c 20 65 78 63 65 70   As above, excep
10370 74 20 61 73 73 75 6d 65 20 65 76 65 72 79 20 72  t assume every r
10380 6f 77 20 69 73 20 61 20 22 6e 65 77 20 70 65 65  ow is a "new pee
10390 72 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  r"..*/.static vo
103a0 69 64 20 77 69 6e 64 6f 77 43 6f 64 65 44 65 66  id windowCodeDef
103b0 61 75 6c 74 53 74 65 70 28 0a 20 20 50 61 72 73  aultStep(.  Pars
103c0 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 53 65  e *pParse, .  Se
103d0 6c 65 63 74 20 2a 70 2c 0a 20 20 57 68 65 72 65  lect *p,.  Where
103e0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20 20  Info *pWInfo,.  
103f0 69 6e 74 20 72 65 67 47 6f 73 75 62 2c 20 0a 20  int regGosub, . 
10400 20 69 6e 74 20 61 64 64 72 47 6f 73 75 62 0a 29   int addrGosub.)
10410 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69  {.  Window *pMWi
10420 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b 0a 20 20 56  n = p->pWin;.  V
10430 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
10440 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
10450 0a 20 20 69 6e 74 20 6b 3b 0a 20 20 69 6e 74 20  .  int k;.  int 
10460 69 53 75 62 43 73 72 20 3d 20 70 2d 3e 70 53 72  iSubCsr = p->pSr
10470 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b  c->a[0].iCursor;
10480 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 70 2d  .  int nSub = p-
10490 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62  >pSrc->a[0].pTab
104a0 2d 3e 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 72 65  ->nCol;.  int re
104b0 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  g = pParse->nMem
104c0 2b 31 3b 0a 20 20 69 6e 74 20 72 65 67 52 65 63  +1;.  int regRec
104d0 6f 72 64 20 3d 20 72 65 67 2b 6e 53 75 62 3b 0a  ord = reg+nSub;.
104e0 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 20 3d    int regRowid =
104f0 20 72 65 67 52 65 63 6f 72 64 2b 31 3b 0a 20 20   regRecord+1;.  
10500 69 6e 74 20 61 64 64 72 3b 0a 20 20 45 78 70 72  int addr;.  Expr
10510 4c 69 73 74 20 2a 70 50 61 72 74 20 3d 20 70 4d  List *pPart = pM
10520 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 3b  Win->pPartition;
10530 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
10540 64 65 72 42 79 20 3d 20 70 4d 57 69 6e 2d 3e 70  derBy = pMWin->p
10550 4f 72 64 65 72 42 79 3b 0a 0a 20 20 61 73 73 65  OrderBy;..  asse
10560 72 74 28 20 70 4d 57 69 6e 2d 3e 65 54 79 70 65  rt( pMWin->eType
10570 3d 3d 54 4b 5f 52 41 4e 47 45 20 0a 20 20 20 20  ==TK_RANGE .    
10580 20 20 7c 7c 20 28 70 4d 57 69 6e 2d 3e 65 53 74    || (pMWin->eSt
10590 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  art==TK_UNBOUNDE
105a0 44 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64  D && pMWin->eEnd
105b0 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29 0a 20 20  ==TK_CURRENT).  
105c0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70  );..  assert( (p
105d0 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
105e0 5f 55 4e 42 4f 55 4e 44 45 44 20 26 26 20 70 4d  _UNBOUNDED && pM
105f0 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55  Win->eEnd==TK_CU
10600 52 52 45 4e 54 29 0a 20 20 20 20 20 20 20 7c 7c  RRENT).       ||
10610 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d   (pMWin->eStart=
10620 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 26 26  =TK_UNBOUNDED &&
10630 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b   pMWin->eEnd==TK
10640 5f 55 4e 42 4f 55 4e 44 45 44 29 0a 20 20 20 20  _UNBOUNDED).    
10650 20 20 20 7c 7c 20 28 70 4d 57 69 6e 2d 3e 65 53     || (pMWin->eS
10660 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54  tart==TK_CURRENT
10670 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d   && pMWin->eEnd=
10680 3d 54 4b 5f 43 55 52 52 45 4e 54 29 0a 20 20 20  =TK_CURRENT).   
10690 20 20 20 20 7c 7c 20 28 70 4d 57 69 6e 2d 3e 65      || (pMWin->e
106a0 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e  Start==TK_CURREN
106b0 54 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64  T && pMWin->eEnd
106c0 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 26  ==TK_UNBOUNDED &
106d0 26 20 21 70 4f 72 64 65 72 42 79 29 0a 20 20 29  & !pOrderBy).  )
106e0 3b 0a 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  ;..  if( pMWin->
106f0 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44  eEnd==TK_UNBOUND
10700 45 44 20 29 7b 0a 20 20 20 20 70 4f 72 64 65 72  ED ){.    pOrder
10710 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 70  By = 0;.  }..  p
10720 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
10730 53 75 62 20 2b 20 32 3b 0a 0a 20 20 2f 2a 20 4d  Sub + 2;..  /* M
10740 61 72 74 69 61 6c 20 74 68 65 20 72 6f 77 20 72  artial the row r
10750 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 73  eturned by the s
10760 75 62 2d 73 65 6c 65 63 74 20 69 6e 74 6f 20 61  ub-select into a
10770 6e 20 61 72 72 61 79 20 6f 66 20 0a 20 20 2a 2a  n array of .  **
10780 20 72 65 67 69 73 74 65 72 73 2e 20 2a 2f 0a 20   registers. */. 
10790 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 53 75 62   for(k=0; k<nSub
107a0 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; k++){.    sqli
107b0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
107c0 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 75 62   OP_Column, iSub
107d0 43 73 72 2c 20 6b 2c 20 72 65 67 2b 6b 29 3b 0a  Csr, k, reg+k);.
107e0 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
107f0 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 73  if this is the s
10800 74 61 72 74 20 6f 66 20 61 20 6e 65 77 20 70 61  tart of a new pa
10810 72 74 69 74 69 6f 6e 20 6f 72 20 70 65 65 72 20  rtition or peer 
10820 67 72 6f 75 70 2e 20 2a 2f 0a 20 20 69 66 28 20  group. */.  if( 
10830 70 50 61 72 74 20 7c 7c 20 70 4f 72 64 65 72 42  pPart || pOrderB
10840 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 50 61  y ){.    int nPa
10850 72 74 20 3d 20 28 70 50 61 72 74 20 3f 20 70 50  rt = (pPart ? pP
10860 61 72 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b  art->nExpr : 0);
10870 0a 20 20 20 20 69 6e 74 20 61 64 64 72 47 6f 74  .    int addrGot
10880 6f 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 61  o = 0;.    int a
10890 64 64 72 4a 75 6d 70 20 3d 20 30 3b 0a 20 20 20  ddrJump = 0;.   
108a0 20 69 6e 74 20 6e 50 65 65 72 20 3d 20 28 70 4f   int nPeer = (pO
108b0 72 64 65 72 42 79 20 3f 20 70 4f 72 64 65 72 42  rderBy ? pOrderB
108c0 79 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 0a  y->nExpr : 0);..
108d0 20 20 20 20 69 66 28 20 70 50 61 72 74 20 29 7b      if( pPart ){
108e0 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 4e 65  .      int regNe
108f0 77 50 61 72 74 20 3d 20 72 65 67 20 2b 20 70 4d  wPart = reg + pM
10900 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 3b  Win->nBufferCol;
10910 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
10920 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
10930 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  e3KeyInfoFromExp
10940 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 50  rList(pParse, pP
10950 61 72 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  art, 0, 0);.    
10960 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
10970 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
10980 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67 4e 65 77  _Compare, regNew
10990 50 61 72 74 2c 20 70 4d 57 69 6e 2d 3e 72 65 67  Part, pMWin->reg
109a0 50 61 72 74 2c 6e 50 61 72 74 29 3b 0a 20 20 20  Part,nPart);.   
109b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70     sqlite3VdbeAp
109c0 70 65 6e 64 50 34 28 76 2c 20 28 76 6f 69 64 2a  pendP4(v, (void*
109d0 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
109e0 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 61 64  YINFO);.      ad
109f0 64 72 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33  drJump = sqlite3
10a00 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
10a10 5f 4a 75 6d 70 2c 20 61 64 64 72 2b 32 2c 20 30  _Jump, addr+2, 0
10a20 2c 20 61 64 64 72 2b 32 29 3b 0a 20 20 20 20 20  , addr+2);.     
10a30 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
10a40 3b 0a 20 20 20 20 20 20 77 69 6e 64 6f 77 41 67  ;.      windowAg
10a50 67 46 69 6e 61 6c 28 70 50 61 72 73 65 2c 20 70  gFinal(pParse, p
10a60 4d 57 69 6e 2c 20 31 29 3b 0a 20 20 20 20 20 20  MWin, 1);.      
10a70 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
10a80 20 20 20 20 20 20 20 20 61 64 64 72 47 6f 74 6f          addrGoto
10a90 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
10aa0 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29  dOp0(v, OP_Goto)
10ab0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10ac0 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42  .    if( pOrderB
10ad0 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  y ){.      int r
10ae0 65 67 4e 65 77 50 65 65 72 20 3d 20 72 65 67 20  egNewPeer = reg 
10af0 2b 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72  + pMWin->nBuffer
10b00 43 6f 6c 20 2b 20 6e 50 61 72 74 3b 0a 20 20 20  Col + nPart;.   
10b10 20 20 20 69 6e 74 20 72 65 67 50 65 65 72 20 3d     int regPeer =
10b20 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 20   pMWin->regPart 
10b30 2b 20 6e 50 61 72 74 3b 0a 0a 20 20 20 20 20 20  + nPart;..      
10b40 69 66 28 20 61 64 64 72 4a 75 6d 70 20 29 20 73  if( addrJump ) s
10b50 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
10b60 72 65 28 76 2c 20 61 64 64 72 4a 75 6d 70 29 3b  re(v, addrJump);
10b70 0a 20 20 20 20 20 20 69 66 28 20 70 4d 57 69 6e  .      if( pMWin
10b80 2d 3e 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47  ->eType==TK_RANG
10b90 45 20 29 7b 0a 20 20 20 20 20 20 20 20 4b 65 79  E ){.        Key
10ba0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
10bb0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46   sqlite3KeyInfoF
10bc0 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
10bd0 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 2c  se, pOrderBy, 0,
10be0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64   0);.        add
10bf0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
10c00 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp3(v, OP_Comp
10c10 61 72 65 2c 20 72 65 67 4e 65 77 50 65 65 72 2c  are, regNewPeer,
10c20 20 72 65 67 50 65 65 72 2c 20 6e 50 65 65 72 29   regPeer, nPeer)
10c30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10c40 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c  3VdbeAppendP4(v,
10c50 20 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f   (void*)pKeyInfo
10c60 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
10c70 20 20 20 20 20 20 20 61 64 64 72 4a 75 6d 70 20         addrJump 
10c80 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
10c90 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
10ca0 61 64 64 72 2b 32 2c 20 30 2c 20 61 64 64 72 2b  addr+2, 0, addr+
10cb0 32 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  2);.        Vdbe
10cc0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
10cd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10ce0 20 20 61 64 64 72 4a 75 6d 70 20 3d 20 30 3b 0a    addrJump = 0;.
10cf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 69        }.      wi
10d00 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 70 50 61  ndowAggFinal(pPa
10d10 72 73 65 2c 20 70 4d 57 69 6e 2c 20 70 4d 57 69  rse, pMWin, pMWi
10d20 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55  n->eStart==TK_CU
10d30 52 52 45 4e 54 29 3b 0a 20 20 20 20 20 20 69 66  RRENT);.      if
10d40 28 20 61 64 64 72 47 6f 74 6f 20 29 20 73 71 6c  ( addrGoto ) sql
10d50 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
10d60 28 76 2c 20 61 64 64 72 47 6f 74 6f 29 3b 0a 20  (v, addrGoto);. 
10d70 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65     }..    sqlite
10d80 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10d90 50 5f 52 65 77 69 6e 64 2c 20 70 4d 57 69 6e 2d  P_Rewind, pMWin-
10da0 3e 69 45 70 68 43 73 72 2c 73 71 6c 69 74 65 33  >iEphCsr,sqlite3
10db0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
10dc0 76 29 2b 33 29 3b 0a 20 20 20 20 56 64 62 65 43  v)+3);.    VdbeC
10dd0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
10de0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10df0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
10e00 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73  egGosub, addrGos
10e10 75 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ub);.    sqlite3
10e20 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10e30 5f 4e 65 78 74 2c 20 70 4d 57 69 6e 2d 3e 69 45  _Next, pMWin->iE
10e40 70 68 43 73 72 2c 20 73 71 6c 69 74 65 33 56 64  phCsr, sqlite3Vd
10e50 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
10e60 2d 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  -1);.    VdbeCov
10e70 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 73  erage(v);..    s
10e80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
10e90 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74  (v, OP_ResetSort
10ea0 65 72 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43  er, pMWin->iEphC
10eb0 73 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  sr);.    sqlite3
10ec0 56 64 62 65 41 64 64 4f 70 33 28 0a 20 20 20 20  VdbeAddOp3(.    
10ed0 20 20 20 20 76 2c 20 4f 50 5f 43 6f 70 79 2c 20      v, OP_Copy, 
10ee0 72 65 67 2b 70 4d 57 69 6e 2d 3e 6e 42 75 66 66  reg+pMWin->nBuff
10ef0 65 72 43 6f 6c 2c 20 70 4d 57 69 6e 2d 3e 72 65  erCol, pMWin->re
10f00 67 50 61 72 74 2c 20 6e 50 61 72 74 2b 6e 50 65  gPart, nPart+nPe
10f10 65 72 2d 31 0a 20 20 20 20 29 3b 0a 0a 20 20 20  er-1.    );..   
10f20 20 69 66 28 20 61 64 64 72 4a 75 6d 70 20 29 20   if( addrJump ) 
10f30 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
10f40 65 72 65 28 76 2c 20 61 64 64 72 4a 75 6d 70 29  ere(v, addrJump)
10f50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 76 6f  ;.  }..  /* Invo
10f60 6b 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e  ke step function
10f70 20 66 6f 72 20 77 69 6e 64 6f 77 20 66 75 6e 63   for window func
10f80 74 69 6f 6e 73 20 2a 2f 0a 20 20 77 69 6e 64 6f  tions */.  windo
10f90 77 41 67 67 53 74 65 70 28 70 50 61 72 73 65 2c  wAggStep(pParse,
10fa0 20 70 4d 57 69 6e 2c 20 2d 31 2c 20 30 2c 20 72   pMWin, -1, 0, r
10fb0 65 67 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 42 75  eg, 0);..  /* Bu
10fc0 66 66 65 72 20 74 68 65 20 63 75 72 72 65 6e 74  ffer the current
10fd0 20 72 6f 77 20 69 6e 20 74 68 65 20 65 70 68 65   row in the ephe
10fe0 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20 2a 2f 0a  meral table. */.
10ff0 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 6e 42 75    if( pMWin->nBu
11000 66 66 65 72 43 6f 6c 3e 30 20 29 7b 0a 20 20 20  fferCol>0 ){.   
11010 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11020 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
11030 6f 72 64 2c 20 72 65 67 2c 20 70 4d 57 69 6e 2d  ord, reg, pMWin-
11040 3e 6e 42 75 66 66 65 72 43 6f 6c 2c 20 72 65 67  >nBufferCol, reg
11050 52 65 63 6f 72 64 29 3b 0a 20 20 7d 65 6c 73 65  Record);.  }else
11060 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
11070 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 42 6c  eAddOp2(v, OP_Bl
11080 6f 62 2c 20 30 2c 20 72 65 67 52 65 63 6f 72 64  ob, 0, regRecord
11090 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
110a0 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28 76  beAppendP4(v, (v
110b0 6f 69 64 2a 29 22 22 2c 20 30 29 3b 0a 20 20 7d  oid*)"", 0);.  }
110c0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
110d0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
110e0 77 69 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  wid, pMWin->iEph
110f0 43 73 72 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  Csr, regRowid);.
11100 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11110 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
11120 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
11130 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 72 65 67  , regRecord, reg
11140 52 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a 20 45 6e  Rowid);..  /* En
11150 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
11160 63 61 6e 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 73  can loop. */.  s
11170 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
11180 57 49 6e 66 6f 29 3b 0a 0a 20 20 77 69 6e 64 6f  WInfo);..  windo
11190 77 41 67 67 46 69 6e 61 6c 28 70 50 61 72 73 65  wAggFinal(pParse
111a0 2c 20 70 4d 57 69 6e 2c 20 31 29 3b 0a 20 20 73  , pMWin, 1);.  s
111b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
111c0 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70  (v, OP_Rewind, p
111d0 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 73 71  MWin->iEphCsr,sq
111e0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
111f0 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 56 64  Addr(v)+3);.  Vd
11200 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
11210 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11220 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
11230 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f  regGosub, addrGo
11240 73 75 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  sub);.  sqlite3V
11250 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11260 4e 65 78 74 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  Next, pMWin->iEp
11270 68 43 73 72 2c 20 73 71 6c 69 74 65 33 56 64 62  hCsr, sqlite3Vdb
11280 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d  eCurrentAddr(v)-
11290 31 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61  1);.  VdbeCovera
112a0 67 65 28 76 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ge(v);.}../*.** 
112b0 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74  Allocate and ret
112c0 75 72 6e 20 61 20 64 75 70 6c 69 63 61 74 65 20  urn a duplicate 
112d0 6f 66 20 74 68 65 20 57 69 6e 64 6f 77 20 6f 62  of the Window ob
112e0 6a 65 63 74 20 69 6e 64 69 63 61 74 65 64 20 62  ject indicated b
112f0 79 20 74 68 65 0a 2a 2a 20 74 68 69 72 64 20 61  y the.** third a
11300 72 67 75 6d 65 6e 74 2e 20 53 65 74 20 74 68 65  rgument. Set the
11310 20 57 69 6e 64 6f 77 2e 70 4f 77 6e 65 72 20 66   Window.pOwner f
11320 69 65 6c 64 20 6f 66 20 74 68 65 20 6e 65 77 20  ield of the new 
11330 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 70 4f 77  object to.** pOw
11340 6e 65 72 2e 0a 2a 2f 0a 57 69 6e 64 6f 77 20 2a  ner..*/.Window *
11350 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 75 70  sqlite3WindowDup
11360 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
11370 70 72 20 2a 70 4f 77 6e 65 72 2c 20 57 69 6e 64  pr *pOwner, Wind
11380 6f 77 20 2a 70 29 7b 0a 20 20 57 69 6e 64 6f 77  ow *p){.  Window
11390 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 69 66   *pNew = 0;.  if
113a0 28 20 70 20 29 7b 0a 20 20 20 20 70 4e 65 77 20  ( p ){.    pNew 
113b0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
113c0 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
113d0 28 57 69 6e 64 6f 77 29 29 3b 0a 20 20 20 20 69  (Window));.    i
113e0 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
113f0 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 73   pNew->zName = s
11400 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
11410 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  b, p->zName);.  
11420 20 20 20 20 70 4e 65 77 2d 3e 70 46 69 6c 74 65      pNew->pFilte
11430 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
11440 75 70 28 64 62 2c 20 70 2d 3e 70 46 69 6c 74 65  up(db, p->pFilte
11450 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65  r, 0);.      pNe
11460 77 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 3d 20  w->pPartition = 
11470 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
11480 75 70 28 64 62 2c 20 70 2d 3e 70 50 61 72 74 69  up(db, p->pParti
11490 74 69 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  tion, 0);.      
114a0 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
114b0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
114c0 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  Dup(db, p->pOrde
114d0 72 42 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  rBy, 0);.      p
114e0 4e 65 77 2d 3e 65 54 79 70 65 20 3d 20 70 2d 3e  New->eType = p->
114f0 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70 4e 65  eType;.      pNe
11500 77 2d 3e 65 45 6e 64 20 3d 20 70 2d 3e 65 45 6e  w->eEnd = p->eEn
11510 64 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 65  d;.      pNew->e
11520 53 74 61 72 74 20 3d 20 70 2d 3e 65 53 74 61 72  Start = p->eStar
11530 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  t;.      pNew->p
11540 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 45  Start = sqlite3E
11550 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 53  xprDup(db, p->pS
11560 74 61 72 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  tart, 0);.      
11570 70 4e 65 77 2d 3e 70 45 6e 64 20 3d 20 73 71 6c  pNew->pEnd = sql
11580 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
11590 70 2d 3e 70 45 6e 64 2c 20 30 29 3b 0a 20 20 20  p->pEnd, 0);.   
115a0 20 20 20 70 4e 65 77 2d 3e 70 4f 77 6e 65 72 20     pNew->pOwner 
115b0 3d 20 70 4f 77 6e 65 72 3b 0a 20 20 20 20 7d 0a  = pOwner;.    }.
115c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
115d0 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  w;.}../*.** Retu
115e0 72 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  rn a copy of the
115f0 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
11600 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 73 20 70  Window objects p
11610 61 73 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20  assed as the.** 
11620 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
11630 0a 2a 2f 0a 57 69 6e 64 6f 77 20 2a 73 71 6c 69  .*/.Window *sqli
11640 74 65 33 57 69 6e 64 6f 77 4c 69 73 74 44 75 70  te3WindowListDup
11650 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69  (sqlite3 *db, Wi
11660 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 57 69 6e 64  ndow *p){.  Wind
11670 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 57 69 6e 64  ow *pWin;.  Wind
11680 6f 77 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20  ow *pRet = 0;.  
11690 57 69 6e 64 6f 77 20 2a 2a 70 70 20 3d 20 26 70  Window **pp = &p
116a0 52 65 74 3b 0a 0a 20 20 66 6f 72 28 70 57 69 6e  Ret;..  for(pWin
116b0 3d 70 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70  =p; pWin; pWin=p
116c0 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a  Win->pNextWin){.
116d0 20 20 20 20 2a 70 70 20 3d 20 73 71 6c 69 74 65      *pp = sqlite
116e0 33 57 69 6e 64 6f 77 44 75 70 28 64 62 2c 20 30  3WindowDup(db, 0
116f0 2c 20 70 57 69 6e 29 3b 0a 20 20 20 20 69 66 28  , pWin);.    if(
11700 20 2a 70 70 3d 3d 30 20 29 20 62 72 65 61 6b 3b   *pp==0 ) break;
11710 0a 20 20 20 20 70 70 20 3d 20 26 28 28 2a 70 70  .    pp = &((*pp
11720 29 2d 3e 70 4e 65 78 74 57 69 6e 29 3b 0a 20 20  )->pNextWin);.  
11730 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  }..  return pRet
11740 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74  ;.}../*.** sqlit
11750 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 68  e3WhereBegin() h
11760 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
11770 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 53  called for the S
11780 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
11790 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74 68  .** passed as th
117a0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
117b0 74 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  t when this func
117c0 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 2e  tion is invoked.
117d0 20 49 74 20 67 65 6e 65 72 61 74 65 73 0a 2a 2a   It generates.**
117e0 20 63 6f 64 65 20 74 6f 20 70 6f 70 75 6c 61 74   code to populat
117f0 65 20 74 68 65 20 57 69 6e 64 6f 77 2e 72 65 67  e the Window.reg
11800 52 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 20  Result register 
11810 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77 20  for each window 
11820 66 75 6e 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20  function and.** 
11830 69 6e 76 6f 6b 65 20 74 68 65 20 73 75 62 2d 72  invoke the sub-r
11840 6f 75 74 69 6e 65 20 61 74 20 69 6e 73 74 72 75  outine at instru
11850 63 74 69 6f 6e 20 61 64 64 72 47 6f 73 75 62 20  ction addrGosub 
11860 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 72 6f  once for each ro
11870 77 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  w..** This funct
11880 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c 69 74 65  ion calls sqlite
11890 33 57 68 65 72 65 45 6e 64 28 29 20 62 65 66 6f  3WhereEnd() befo
118a0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 0a 2a  re returning. .*
118b0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69  /.void sqlite3Wi
118c0 6e 64 6f 77 43 6f 64 65 53 74 65 70 28 0a 20 20  ndowCodeStep(.  
118d0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
118e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118f0 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
11900 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
11910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11920 20 20 20 20 20 20 2f 2a 20 52 65 77 72 69 74 74        /* Rewritt
11930 65 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  en SELECT statem
11940 65 6e 74 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ent */.  WhereIn
11950 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 20  fo *pWInfo,     
11960 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74           /* Cont
11970 65 78 74 20 72 65 74 75 72 6e 65 64 20 62 79 20  ext returned by 
11980 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
11990 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  n() */.  int reg
119a0 47 6f 73 75 62 2c 20 20 20 20 20 20 20 20 20 20  Gosub,          
119b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
119c0 73 74 65 72 20 66 6f 72 20 4f 50 5f 47 6f 73 75  ster for OP_Gosu
119d0 62 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 47  b */.  int addrG
119e0 6f 73 75 62 20 20 20 20 20 20 20 20 20 20 20 20  osub            
119f0 20 20 20 20 20 20 20 2f 2a 20 4f 50 5f 47 6f 73         /* OP_Gos
11a00 75 62 20 68 65 72 65 20 74 6f 20 72 65 74 75 72  ub here to retur
11a10 6e 20 65 61 63 68 20 72 6f 77 20 2a 2f 0a 29 7b  n each row */.){
11a20 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e  .  Window *pMWin
11a30 20 3d 20 70 2d 3e 70 57 69 6e 3b 0a 0a 20 20 2f   = p->pWin;..  /
11a40 2a 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65  * There are thre
11a50 65 20 64 69 66 66 65 72 65 6e 74 20 66 75 6e 63  e different func
11a60 74 69 6f 6e 73 20 74 68 61 74 20 6d 61 79 20 62  tions that may b
11a70 65 20 75 73 65 64 20 74 6f 20 64 6f 20 74 68 65  e used to do the
11a80 20 77 6f 72 6b 0a 20 20 2a 2a 20 6f 66 20 74 68   work.  ** of th
11a90 69 73 20 6f 6e 65 2c 20 64 65 70 65 6e 64 69 6e  is one, dependin
11aa0 67 20 6f 6e 20 74 68 65 20 77 69 6e 64 6f 77 20  g on the window 
11ab0 66 72 61 6d 65 20 61 6e 64 20 74 68 65 20 73 70  frame and the sp
11ac0 65 63 69 66 69 63 20 62 75 69 6c 74 2d 69 6e 0a  ecific built-in.
11ad0 20 20 2a 2a 20 77 69 6e 64 6f 77 20 66 75 6e 63    ** window func
11ae0 74 69 6f 6e 73 20 75 73 65 64 20 28 69 66 20 61  tions used (if a
11af0 6e 79 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77  ny)..  **.  ** w
11b00 69 6e 64 6f 77 43 6f 64 65 52 6f 77 45 78 70 72  indowCodeRowExpr
11b10 53 74 65 70 28 29 20 68 61 6e 64 6c 65 73 20 61  Step() handles a
11b20 6c 6c 20 22 52 4f 57 53 22 20 77 69 6e 64 6f 77  ll "ROWS" window
11b30 20 66 72 61 6d 65 73 2c 20 65 78 63 65 70 74 20   frames, except 
11b40 66 6f 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  for:.  **.  **  
11b50 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20 55 4e   ROWS BETWEEN UN
11b60 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e  BOUNDED PRECEDIN
11b70 47 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f  G AND CURRENT RO
11b80 57 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  W.  **.  ** The 
11b90 65 78 63 65 70 74 69 6f 6e 20 69 73 20 62 65 63  exception is bec
11ba0 61 75 73 65 20 77 69 6e 64 6f 77 43 6f 64 65 52  ause windowCodeR
11bb0 6f 77 45 78 70 72 53 74 65 70 28 29 20 69 6d 70  owExprStep() imp
11bc0 6c 65 6d 65 6e 74 73 20 61 6c 6c 20 77 69 6e 64  lements all wind
11bd0 6f 77 0a 20 20 2a 2a 20 66 72 61 6d 65 20 74 79  ow.  ** frame ty
11be0 70 65 73 20 62 79 20 63 61 63 68 69 6e 67 20 74  pes by caching t
11bf0 68 65 20 65 6e 74 69 72 65 20 70 61 72 74 69 74  he entire partit
11c00 69 6f 6e 20 69 6e 20 61 20 74 65 6d 70 20 74 61  ion in a temp ta
11c10 62 6c 65 2c 20 61 6e 64 0a 20 20 2a 2a 20 22 52  ble, and.  ** "R
11c20 4f 57 53 20 42 45 54 57 45 45 4e 20 55 4e 42 4f  OWS BETWEEN UNBO
11c30 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20  UNDED PRECEDING 
11c40 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 22  AND CURRENT ROW"
11c50 20 69 73 20 65 61 73 79 20 65 6e 6f 75 67 68 20   is easy enough 
11c60 74 6f 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e  to.  ** implemen
11c70 74 20 77 69 74 68 6f 75 74 20 73 75 63 68 20 61  t without such a
11c80 20 63 61 63 68 65 2e 0a 20 20 2a 2a 0a 20 20 2a   cache..  **.  *
11c90 2a 20 77 69 6e 64 6f 77 43 6f 64 65 43 61 63 68  * windowCodeCach
11ca0 65 53 74 65 70 28 29 20 69 73 20 75 73 65 64 20  eStep() is used 
11cb0 66 6f 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  for:.  **.  **  
11cc0 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 43   RANGE BETWEEN C
11cd0 55 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 55  URRENT ROW AND U
11ce0 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49  NBOUNDED FOLLOWI
11cf0 4e 47 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 74 20  NG.  **.  ** It 
11d00 69 73 20 61 6c 73 6f 20 75 73 65 64 20 66 6f 72  is also used for
11d10 20 61 6e 79 74 68 69 6e 67 20 6e 6f 74 20 68 61   anything not ha
11d20 6e 64 6c 65 64 20 62 79 20 77 69 6e 64 6f 77 43  ndled by windowC
11d30 6f 64 65 52 6f 77 45 78 70 72 53 74 65 70 28 29  odeRowExprStep()
11d40 20 0a 20 20 2a 2a 20 74 68 61 74 20 69 6e 76 6f   .  ** that invo
11d50 6b 65 73 20 61 20 62 75 69 6c 74 2d 69 6e 20 77  kes a built-in w
11d60 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 74  indow function t
11d70 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68 65  hat requires the
11d80 20 65 6e 74 69 72 65 20 0a 20 20 2a 2a 20 70 61   entire .  ** pa
11d90 72 74 69 74 69 6f 6e 20 74 6f 20 62 65 20 63 61  rtition to be ca
11da0 63 68 65 64 20 69 6e 20 61 20 74 65 6d 70 20 74  ched in a temp t
11db0 61 62 6c 65 20 62 65 66 6f 72 65 20 61 6e 79 20  able before any 
11dc0 72 6f 77 73 20 61 72 65 20 72 65 74 75 72 6e 65  rows are returne
11dd0 64 0a 20 20 2a 2a 20 28 65 2e 67 2e 20 6e 74 68  d.  ** (e.g. nth
11de0 5f 76 61 6c 75 65 28 29 20 6f 72 20 70 65 72 63  _value() or perc
11df0 65 6e 74 5f 72 61 6e 6b 28 29 29 2e 0a 20 20 2a  ent_rank())..  *
11e00 2a 0a 20 20 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20  *.  ** Finally, 
11e10 61 73 73 75 6d 69 6e 67 20 74 68 65 72 65 20 69  assuming there i
11e20 73 20 6e 6f 20 62 75 69 6c 74 2d 69 6e 20 77 69  s no built-in wi
11e30 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 74 68  ndow function th
11e40 61 74 20 72 65 71 75 69 72 65 73 0a 20 20 2a 2a  at requires.  **
11e50 20 74 68 65 20 70 61 72 74 69 74 69 6f 6e 20 74   the partition t
11e60 6f 20 62 65 20 63 61 63 68 65 64 2c 20 77 69 6e  o be cached, win
11e70 64 6f 77 43 6f 64 65 44 65 66 61 75 6c 74 53 74  dowCodeDefaultSt
11e80 65 70 28 29 20 69 73 20 75 73 65 64 20 66 6f 72  ep() is used for
11e90 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 52 41  :.  **.  **   RA
11ea0 4e 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f  NGE BETWEEN UNBO
11eb0 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20  UNDED PRECEDING 
11ec0 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 20  AND CURRENT ROW 
11ed0 0a 20 20 2a 2a 20 20 20 52 41 4e 47 45 20 42 45  .  **   RANGE BE
11ee0 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20  TWEEN UNBOUNDED 
11ef0 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 55 4e  PRECEDING AND UN
11f00 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e  BOUNDED FOLLOWIN
11f10 47 0a 20 20 2a 2a 20 20 20 52 41 4e 47 45 20 42  G.  **   RANGE B
11f20 45 54 57 45 45 4e 20 43 55 52 52 45 4e 54 20 52  ETWEEN CURRENT R
11f30 4f 57 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52  OW AND CURRENT R
11f40 4f 57 20 0a 20 20 2a 2a 20 20 20 52 4f 57 53 20  OW .  **   ROWS 
11f50 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45  BETWEEN UNBOUNDE
11f60 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20  D PRECEDING AND 
11f70 43 55 52 52 45 4e 54 20 52 4f 57 0a 20 20 2a 2a  CURRENT ROW.  **
11f80 0a 20 20 2a 2a 20 77 69 6e 64 6f 77 43 6f 64 65  .  ** windowCode
11f90 44 65 66 61 75 6c 74 53 74 65 70 28 29 20 69 73  DefaultStep() is
11fa0 20 74 68 65 20 6f 6e 6c 79 20 6f 6e 65 20 6f 66   the only one of
11fb0 20 74 68 65 20 74 68 72 65 65 20 66 75 6e 63 74   the three funct
11fc0 69 6f 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 64  ions that.  ** d
11fd0 6f 65 73 20 6e 6f 74 20 63 61 63 68 65 20 65 61  oes not cache ea
11fe0 63 68 20 70 61 72 74 69 74 69 6f 6e 20 69 6e 20  ch partition in 
11ff0 61 20 74 65 6d 70 20 74 61 62 6c 65 20 62 65 66  a temp table bef
12000 6f 72 65 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f  ore beginning to
12010 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 72 6f 77  .  ** return row
12020 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4d  s..  */.  if( pM
12030 57 69 6e 2d 3e 65 54 79 70 65 3d 3d 54 4b 5f 52  Win->eType==TK_R
12040 4f 57 53 20 0a 20 20 20 26 26 20 28 70 4d 57 69  OWS .   && (pMWi
12050 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b 5f 55 4e  n->eStart!=TK_UN
12060 42 4f 55 4e 44 45 44 7c 7c 70 4d 57 69 6e 2d 3e  BOUNDED||pMWin->
12070 65 45 6e 64 21 3d 54 4b 5f 43 55 52 52 45 4e 54  eEnd!=TK_CURRENT
12080 7c 7c 21 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72  ||!pMWin->pOrder
12090 42 79 29 0a 20 20 29 7b 0a 20 20 20 20 77 69 6e  By).  ){.    win
120a0 64 6f 77 43 6f 64 65 52 6f 77 45 78 70 72 53 74  dowCodeRowExprSt
120b0 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 57  ep(pParse, p, pW
120c0 49 6e 66 6f 2c 20 72 65 67 47 6f 73 75 62 2c 20  Info, regGosub, 
120d0 61 64 64 72 47 6f 73 75 62 29 3b 0a 20 20 7d 65  addrGosub);.  }e
120e0 6c 73 65 7b 0a 20 20 20 20 57 69 6e 64 6f 77 20  lse{.    Window 
120f0 2a 70 57 69 6e 3b 0a 20 20 20 20 69 6e 74 20 62  *pWin;.    int b
12100 43 61 63 68 65 20 3d 20 30 3b 20 20 20 20 20 20  Cache = 0;      
12110 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
12120 20 74 6f 20 75 73 65 20 43 61 63 68 65 53 74 65   to use CacheSte
12130 70 28 29 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20  p() */..    if( 
12140 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
12150 4b 5f 43 55 52 52 45 4e 54 20 26 26 20 70 4d 57  K_CURRENT && pMW
12160 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42  in->eEnd==TK_UNB
12170 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20 20 20 20  OUNDED ){.      
12180 62 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 20 20  bCache = 1;.    
12190 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72  }else{.      for
121a0 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69  (pWin=pMWin; pWi
121b0 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e  n; pWin=pWin->pN
121c0 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 20 20 20  extWin){.       
121d0 20 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20   FuncDef *pFunc 
121e0 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20  = pWin->pFunc;. 
121f0 20 20 20 20 20 20 20 69 66 28 20 28 70 46 75 6e         if( (pFun
12200 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  c->funcFlags & S
12210 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f  QLITE_FUNC_WINDO
12220 57 5f 53 49 5a 45 29 0a 20 20 20 20 20 20 20 20  W_SIZE).        
12230 20 7c 7c 20 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d   || (pFunc->zNam
12240 65 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65  e==nth_valueName
12250 29 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70  ).         || (p
12260 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72  Func->zName==fir
12270 73 74 5f 76 61 6c 75 65 4e 61 6d 65 29 0a 20 20  st_valueName).  
12280 20 20 20 20 20 20 20 7c 7c 20 28 70 46 75 6e 63         || (pFunc
12290 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d  ->zName==leadNam
122a0 65 29 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  e).         || (
122b0 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 61  pFunc->zName==la
122c0 67 4e 61 6d 65 29 0a 20 20 20 20 20 20 20 20 29  gName).        )
122d0 7b 0a 20 20 20 20 20 20 20 20 20 20 62 43 61 63  {.          bCac
122e0 68 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  he = 1;.        
122f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
12300 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
12310 0a 0a 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69  ..    /* Otherwi
12320 73 65 2c 20 63 61 6c 6c 20 77 69 6e 64 6f 77 43  se, call windowC
12330 6f 64 65 44 65 66 61 75 6c 74 53 74 65 70 28 29  odeDefaultStep()
12340 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 43  .  */.    if( bC
12350 61 63 68 65 20 29 7b 0a 20 20 20 20 20 20 77 69  ache ){.      wi
12360 6e 64 6f 77 43 6f 64 65 43 61 63 68 65 53 74 65  ndowCodeCacheSte
12370 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 57 49  p(pParse, p, pWI
12380 6e 66 6f 2c 20 72 65 67 47 6f 73 75 62 2c 20 61  nfo, regGosub, a
12390 64 64 72 47 6f 73 75 62 29 3b 0a 20 20 20 20 7d  ddrGosub);.    }
123a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 77 69 6e 64  else{.      wind
123b0 6f 77 43 6f 64 65 44 65 66 61 75 6c 74 53 74 65  owCodeDefaultSte
123c0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 57 49  p(pParse, p, pWI
123d0 6e 66 6f 2c 20 72 65 67 47 6f 73 75 62 2c 20 61  nfo, regGosub, a
123e0 64 64 72 47 6f 73 75 62 29 3b 0a 20 20 20 20 7d  ddrGosub);.    }
123f0 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  .  }.}..#endif /
12400 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  * SQLITE_OMIT_WI
12410 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a              NDOWFUNC */.