/ Hex Artifact Content
Login

Artifact aefd7e4511a537ddae2d1206aa300167a2f9d04689ceb94ac32aabe7fe6e92bc:


0000: 2f 2a 0a 2a 2a 20 32 30 31 38 20 4d 61 79 20 30  /*.** 2018 May 0
0010: 38 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  8.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
0180: 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 6e  liteInt.h"..#ifn
0190: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
01a0: 57 49 4e 44 4f 57 46 55 4e 43 0a 0a 2f 2a 0a 2a  WINDOWFUNC../*.*
01b0: 2a 20 53 45 4c 45 43 54 20 52 45 57 52 49 54 49  * SELECT REWRITI
01c0: 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 41 6e 79 20 53  NG.**.**   Any S
01d0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
01e0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  that contains on
01f0: 65 20 6f 72 20 6d 6f 72 65 20 77 69 6e 64 6f 77  e or more window
0200: 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 0a 2a 2a   functions in.**
0210: 20 20 20 65 69 74 68 65 72 20 74 68 65 20 73 65     either the se
0220: 6c 65 63 74 20 6c 69 73 74 20 6f 72 20 4f 52 44  lect list or ORD
0230: 45 52 20 42 59 20 63 6c 61 75 73 65 20 28 74 68  ER BY clause (th
0240: 65 20 6f 6e 6c 79 20 74 77 6f 20 70 6c 61 63 65  e only two place
0250: 73 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20 66 75  s window.**   fu
0260: 6e 63 74 69 6f 6e 73 20 6d 61 79 20 62 65 20 75  nctions may be u
0270: 73 65 64 29 20 69 73 20 74 72 61 6e 73 66 6f 72  sed) is transfor
0280: 6d 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20  med by function 
0290: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 52 65 77  sqlite3WindowRew
02a0: 72 69 74 65 28 29 0a 2a 2a 20 20 20 69 6e 20 6f  rite().**   in o
02b0: 72 64 65 72 20 74 6f 20 73 75 70 70 6f 72 74 20  rder to support 
02c0: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
02d0: 70 72 6f 63 65 73 73 69 6e 67 2e 20 46 6f 72 20  processing. For 
02e0: 65 78 61 6d 70 6c 65 2c 20 77 69 74 68 20 74 68  example, with th
02f0: 65 0a 2a 2a 20 20 20 73 63 68 65 6d 61 3a 0a 2a  e.**   schema:.*
0300: 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20  *.**     CREATE 
0310: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63  TABLE t1(a, b, c
0320: 2c 20 64 2c 20 65 2c 20 66 2c 20 67 29 3b 0a 2a  , d, e, f, g);.*
0330: 2a 0a 2a 2a 20 20 20 74 68 65 20 73 74 61 74 65  *.**   the state
0340: 6d 65 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment:.**.**     
0350: 53 45 4c 45 43 54 20 61 2b 31 2c 20 6d 61 78 28  SELECT a+1, max(
0360: 62 29 20 4f 56 45 52 20 28 50 41 52 54 49 54 49  b) OVER (PARTITI
0370: 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20 42 59  ON BY c ORDER BY
0380: 20 64 29 20 46 52 4f 4d 20 74 31 20 4f 52 44 45   d) FROM t1 ORDE
0390: 52 20 42 59 20 65 3b 0a 2a 2a 0a 2a 2a 20 20 20  R BY e;.**.**   
03a0: 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74  is transformed t
03b0: 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  o:.**.**     SEL
03c0: 45 43 54 20 61 2b 31 2c 20 6d 61 78 28 62 29 20  ECT a+1, max(b) 
03d0: 4f 56 45 52 20 28 50 41 52 54 49 54 49 4f 4e 20  OVER (PARTITION 
03e0: 42 59 20 63 20 4f 52 44 45 52 20 42 59 20 64 29  BY c ORDER BY d)
03f0: 20 46 52 4f 4d 20 28 0a 2a 2a 20 20 20 20 20 20   FROM (.**      
0400: 20 20 20 53 45 4c 45 43 54 20 61 2c 20 65 2c 20     SELECT a, e, 
0410: 63 2c 20 64 2c 20 62 20 46 52 4f 4d 20 74 31 20  c, d, b FROM t1 
0420: 4f 52 44 45 52 20 42 59 20 63 2c 20 64 0a 2a 2a  ORDER BY c, d.**
0430: 20 20 20 20 20 29 20 4f 52 44 45 52 20 42 59 20       ) ORDER BY 
0440: 65 3b 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66  e;.**.**   The f
0450: 6c 61 74 74 65 6e 69 6e 67 20 6f 70 74 69 6d 69  lattening optimi
0460: 7a 61 74 69 6f 6e 20 69 73 20 64 69 73 61 62 6c  zation is disabl
0470: 65 64 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69  ed when processi
0480: 6e 67 20 74 68 69 73 20 74 72 61 6e 73 66 6f 72  ng this transfor
0490: 6d 65 64 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  med.**   SELECT 
04a0: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
04b0: 61 6c 6c 6f 77 73 20 74 68 65 20 69 6d 70 6c 65  allows the imple
04c0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
04d0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
04e0: 0a 2a 2a 20 20 20 28 69 6e 20 74 68 69 73 20 63  .**   (in this c
04f0: 61 73 65 20 6d 61 78 28 29 29 20 74 6f 20 70 72  ase max()) to pr
0500: 6f 63 65 73 73 20 72 6f 77 73 20 73 6f 72 74 65  ocess rows sorte
0510: 64 20 69 6e 20 6f 72 64 65 72 20 6f 66 20 28 63  d in order of (c
0520: 2c 20 64 29 2c 20 77 68 69 63 68 0a 2a 2a 20 20  , d), which.**  
0530: 20 6d 61 6b 65 73 20 74 68 69 6e 67 73 20 65 61   makes things ea
0540: 73 69 65 72 20 66 6f 72 20 6f 62 76 69 6f 75 73  sier for obvious
0550: 20 72 65 61 73 6f 6e 73 2e 20 4d 6f 72 65 20 67   reasons. More g
0560: 65 6e 65 72 61 6c 6c 79 3a 0a 2a 2a 0a 2a 2a 20  enerally:.**.** 
0570: 20 20 20 20 2a 20 46 52 4f 4d 2c 20 57 48 45 52      * FROM, WHER
0580: 45 2c 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20  E, GROUP BY and 
0590: 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73 20 61  HAVING clauses a
05a0: 72 65 20 61 6c 6c 20 6d 6f 76 65 64 20 74 6f 20  re all moved to 
05b0: 0a 2a 2a 20 20 20 20 20 20 20 74 68 65 20 73 75  .**       the su
05c0: 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  b-query..**.**  
05d0: 20 20 20 2a 20 4f 52 44 45 52 20 42 59 2c 20 4c     * ORDER BY, L
05e0: 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
05f0: 72 65 6d 61 69 6e 20 70 61 72 74 20 6f 66 20 74  remain part of t
0600: 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 2e  he parent query.
0610: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 65 72  .**.**     * Ter
0620: 6d 69 6e 61 6c 73 20 66 72 6f 6d 20 65 61 63 68  minals from each
0630: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
0640: 6f 6e 20 74 72 65 65 73 20 74 68 61 74 20 6d 61  on trees that ma
0650: 6b 65 20 75 70 20 74 68 65 20 0a 2a 2a 20 20 20  ke up the .**   
0660: 20 20 20 20 73 65 6c 65 63 74 2d 6c 69 73 74 20      select-list 
0670: 61 6e 64 20 4f 52 44 45 52 20 42 59 20 65 78 70  and ORDER BY exp
0680: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20  ressions in the 
0690: 70 61 72 65 6e 74 20 71 75 65 72 79 20 61 72 65  parent query are
06a0: 0a 2a 2a 20 20 20 20 20 20 20 73 65 6c 65 63 74  .**       select
06b0: 65 64 20 62 79 20 74 68 65 20 73 75 62 2d 71 75  ed by the sub-qu
06c0: 65 72 79 2e 20 46 6f 72 20 74 68 65 20 70 75 72  ery. For the pur
06d0: 70 6f 73 65 73 20 6f 66 20 74 68 65 20 74 72 61  poses of the tra
06e0: 6e 73 66 6f 72 6d 61 74 69 6f 6e 2c 0a 2a 2a 20  nsformation,.** 
06f0: 20 20 20 20 20 20 74 65 72 6d 69 6e 61 6c 73 20        terminals 
0700: 61 72 65 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72  are column refer
0710: 65 6e 63 65 73 20 61 6e 64 20 61 67 67 72 65 67  ences and aggreg
0720: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  ate functions..*
0730: 2a 0a 2a 2a 20 20 20 49 66 20 74 68 65 72 65 20  *.**   If there 
0740: 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  is more than one
0750: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
0760: 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 74   in the SELECT t
0770: 68 61 74 20 75 73 65 73 0a 2a 2a 20 20 20 74 68  hat uses.**   th
0780: 65 20 73 61 6d 65 20 77 69 6e 64 6f 77 20 64 65  e same window de
0790: 63 6c 61 72 61 74 69 6f 6e 20 28 74 68 65 20 4f  claration (the O
07a0: 56 45 52 20 62 69 74 29 2c 20 74 68 65 6e 20 61  VER bit), then a
07b0: 20 73 69 6e 67 6c 65 20 73 63 61 6e 20 6d 61 79   single scan may
07c0: 0a 2a 2a 20 20 20 62 65 20 75 73 65 64 20 74 6f  .**   be used to
07d0: 20 70 72 6f 63 65 73 73 20 6d 6f 72 65 20 74 68   process more th
07e0: 61 6e 20 6f 6e 65 20 77 69 6e 64 6f 77 20 66 75  an one window fu
07f0: 6e 63 74 69 6f 6e 2e 20 46 6f 72 20 65 78 61 6d  nction. For exam
0800: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ple:.**.**     S
0810: 45 4c 45 43 54 20 6d 61 78 28 62 29 20 4f 56 45  ELECT max(b) OVE
0820: 52 20 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20  R (PARTITION BY 
0830: 63 20 4f 52 44 45 52 20 42 59 20 64 29 2c 20 0a  c ORDER BY d), .
0840: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 6d 69  **            mi
0850: 6e 28 65 29 20 4f 56 45 52 20 28 50 41 52 54 49  n(e) OVER (PARTI
0860: 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20  TION BY c ORDER 
0870: 42 59 20 64 29 20 0a 2a 2a 20 20 20 20 20 46 52  BY d) .**     FR
0880: 4f 4d 20 74 31 3b 0a 2a 2a 0a 2a 2a 20 20 20 69  OM t1;.**.**   i
0890: 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  s transformed in
08a0: 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73   the same way as
08b0: 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f   the example abo
08c0: 76 65 2e 20 48 6f 77 65 76 65 72 3a 0a 2a 2a 0a  ve. However:.**.
08d0: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 6d 61  **     SELECT ma
08e0: 78 28 62 29 20 4f 56 45 52 20 28 50 41 52 54 49  x(b) OVER (PARTI
08f0: 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20  TION BY c ORDER 
0900: 42 59 20 64 29 2c 20 0a 2a 2a 20 20 20 20 20 20  BY d), .**      
0910: 20 20 20 20 20 20 6d 69 6e 28 65 29 20 4f 56 45        min(e) OVE
0920: 52 20 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20  R (PARTITION BY 
0930: 61 20 4f 52 44 45 52 20 42 59 20 62 29 20 0a 2a  a ORDER BY b) .*
0940: 2a 20 20 20 20 20 46 52 4f 4d 20 74 31 3b 0a 2a  *     FROM t1;.*
0950: 2a 0a 2a 2a 20 20 20 4d 75 73 74 20 62 65 20 74  *.**   Must be t
0960: 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 2a  ransformed to:.*
0970: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
0980: 6d 61 78 28 62 29 20 4f 56 45 52 20 28 50 41 52  max(b) OVER (PAR
0990: 54 49 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45  TITION BY c ORDE
09a0: 52 20 42 59 20 64 29 20 46 52 4f 4d 20 28 0a 2a  R BY d) FROM (.*
09b0: 2a 20 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  *         SELECT
09c0: 20 65 2c 20 6d 69 6e 28 65 29 20 4f 56 45 52 20   e, min(e) OVER 
09d0: 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20 61 20  (PARTITION BY a 
09e0: 4f 52 44 45 52 20 42 59 20 62 29 2c 20 63 2c 20  ORDER BY b), c, 
09f0: 64 2c 20 62 20 46 52 4f 4d 0a 2a 2a 20 20 20 20  d, b FROM.**    
0a00: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 2c         SELECT a,
0a10: 20 65 2c 20 63 2c 20 64 2c 20 62 20 46 52 4f 4d   e, c, d, b FROM
0a20: 20 74 31 20 4f 52 44 45 52 20 42 59 20 61 2c 20   t1 ORDER BY a, 
0a30: 62 0a 2a 2a 20 20 20 20 20 20 20 20 20 29 20 4f  b.**         ) O
0a40: 52 44 45 52 20 42 59 20 63 2c 20 64 0a 2a 2a 20  RDER BY c, d.** 
0a50: 20 20 20 20 29 20 4f 52 44 45 52 20 42 59 20 65      ) ORDER BY e
0a60: 3b 0a 2a 2a 0a 2a 2a 20 20 20 73 6f 20 74 68 61  ;.**.**   so tha
0a70: 74 20 62 6f 74 68 20 6d 69 6e 28 29 20 61 6e 64  t both min() and
0a80: 20 6d 61 78 28 29 20 6d 61 79 20 70 72 6f 63 65   max() may proce
0a90: 73 73 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6f  ss rows in the o
0aa0: 72 64 65 72 20 64 65 66 69 6e 65 64 20 62 79 0a  rder defined by.
0ab0: 2a 2a 20 20 20 74 68 65 69 72 20 72 65 73 70 65  **   their respe
0ac0: 63 74 69 76 65 20 77 69 6e 64 6f 77 20 64 65 63  ctive window dec
0ad0: 6c 61 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  larations..**.**
0ae0: 20 49 4e 54 45 52 46 41 43 45 20 57 49 54 48 20   INTERFACE WITH 
0af0: 53 45 4c 45 43 54 2e 43 0a 2a 2a 0a 2a 2a 20 20  SELECT.C.**.**  
0b00: 20 57 68 65 6e 20 70 72 6f 63 65 73 73 69 6e 67   When processing
0b10: 20 74 68 65 20 72 65 77 72 69 74 74 65 6e 20 53   the rewritten S
0b20: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
0b30: 20 63 6f 64 65 20 69 6e 20 73 65 6c 65 63 74 2e   code in select.
0b40: 63 20 63 61 6c 6c 73 0a 2a 2a 20 20 20 73 71 6c  c calls.**   sql
0b50: 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
0b60: 20 74 6f 20 62 65 67 69 6e 20 69 74 65 72 61 74   to begin iterat
0b70: 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68 65 20  ing through the 
0b80: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 0a 2a  results of the.*
0b90: 2a 20 20 20 73 75 62 2d 71 75 65 72 79 2c 20 77  *   sub-query, w
0ba0: 68 69 63 68 20 69 73 20 61 6c 77 61 79 73 20 69  hich is always i
0bb0: 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
0bc0: 63 6f 2d 72 6f 75 74 69 6e 65 2e 20 49 74 20 74  co-routine. It t
0bd0: 68 65 6e 20 63 61 6c 6c 73 0a 2a 2a 20 20 20 73  hen calls.**   s
0be0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65  qlite3WindowCode
0bf0: 53 74 65 70 28 29 20 74 6f 20 70 72 6f 63 65 73  Step() to proces
0c00: 73 20 72 6f 77 73 20 61 6e 64 20 66 69 6e 69 73  s rows and finis
0c10: 68 20 74 68 65 20 73 63 61 6e 20 62 79 20 63 61  h the scan by ca
0c20: 6c 6c 69 6e 67 0a 2a 2a 20 20 20 73 71 6c 69 74  lling.**   sqlit
0c30: 65 33 57 68 65 72 65 45 6e 64 28 29 2e 0a 2a 2a  e3WhereEnd()..**
0c40: 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 57 69 6e  .**   sqlite3Win
0c50: 64 6f 77 43 6f 64 65 53 74 65 70 28 29 20 67 65  dowCodeStep() ge
0c60: 6e 65 72 61 74 65 73 20 56 4d 20 63 6f 64 65 20  nerates VM code 
0c70: 73 6f 20 74 68 61 74 2c 20 66 6f 72 20 65 61 63  so that, for eac
0c80: 68 20 72 6f 77 20 72 65 74 75 72 6e 65 64 0a 2a  h row returned.*
0c90: 2a 20 20 20 62 79 20 74 68 65 20 73 75 62 2d 71  *   by the sub-q
0ca0: 75 65 72 79 20 61 20 73 75 62 2d 72 6f 75 74 69  uery a sub-routi
0cb0: 6e 65 20 28 4f 50 5f 47 6f 73 75 62 29 20 63 6f  ne (OP_Gosub) co
0cc0: 64 65 64 20 62 79 20 73 65 6c 65 63 74 2e 63 20  ded by select.c 
0cd0: 69 73 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2a 20 20  is invoked..**  
0ce0: 20 57 68 65 6e 20 74 68 65 20 73 75 62 2d 72 6f   When the sub-ro
0cf0: 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64  utine is invoked
0d00: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 68  :.**.**     * Th
0d10: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 61 6c 6c  e results of all
0d20: 20 77 69 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e   window-function
0d30: 73 20 66 6f 72 20 74 68 65 20 72 6f 77 20 61 72  s for the row ar
0d40: 65 20 73 74 6f 72 65 64 0a 2a 2a 20 20 20 20 20  e stored.**     
0d50: 20 20 69 6e 20 74 68 65 20 61 73 73 6f 63 69 61    in the associa
0d60: 74 65 64 20 57 69 6e 64 6f 77 2e 72 65 67 52 65  ted Window.regRe
0d70: 73 75 6c 74 20 72 65 67 69 73 74 65 72 73 2e 0a  sult registers..
0d80: 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 68 65 20  **.**     * The 
0d90: 72 65 71 75 69 72 65 64 20 74 65 72 6d 69 6e 61  required termina
0da0: 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f  l values are sto
0db0: 72 65 64 20 69 6e 20 74 68 65 20 63 75 72 72 65  red in the curre
0dc0: 6e 74 20 72 6f 77 20 6f 66 0a 2a 2a 20 20 20 20  nt row of.**    
0dd0: 20 20 20 74 65 6d 70 20 74 61 62 6c 65 20 57 69     temp table Wi
0de0: 6e 64 6f 77 2e 69 45 70 68 43 73 72 2e 0a 2a 2a  ndow.iEphCsr..**
0df0: 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 63 61  .**   In some ca
0e00: 73 65 73 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  ses, depending o
0e10: 6e 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61  n the window fra
0e20: 6d 65 20 61 6e 64 20 74 68 65 20 73 70 65 63 69  me and the speci
0e30: 66 69 63 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20  fic window.**   
0e40: 66 75 6e 63 74 69 6f 6e 73 20 69 6e 76 6f 6b 65  functions invoke
0e50: 64 2c 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  d, sqlite3Window
0e60: 43 6f 64 65 53 74 65 70 28 29 20 63 61 63 68 65  CodeStep() cache
0e70: 73 20 65 61 63 68 20 65 6e 74 69 72 65 20 70 61  s each entire pa
0e80: 72 74 69 74 69 6f 6e 0a 2a 2a 20 20 20 69 6e 20  rtition.**   in 
0e90: 61 20 74 65 6d 70 20 74 61 62 6c 65 20 62 65 66  a temp table bef
0ea0: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 61 6e  ore returning an
0eb0: 79 20 72 6f 77 73 2e 20 49 6e 20 6f 74 68 65 72  y rows. In other
0ec0: 20 63 61 73 65 73 20 69 74 20 64 6f 65 73 20 6e   cases it does n
0ed0: 6f 74 2e 0a 2a 2a 20 20 20 54 68 69 73 20 64 65  ot..**   This de
0ee0: 74 61 69 6c 20 69 73 20 65 6e 63 61 70 73 75 6c  tail is encapsul
0ef0: 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 69 73  ated within this
0f00: 20 66 69 6c 65 2c 20 74 68 65 20 63 6f 64 65 20   file, the code 
0f10: 67 65 6e 65 72 61 74 65 64 20 62 79 0a 2a 2a 20  generated by.** 
0f20: 20 20 73 65 6c 65 63 74 2e 63 20 69 73 20 74 68    select.c is th
0f30: 65 20 73 61 6d 65 20 69 6e 20 65 69 74 68 65 72  e same in either
0f40: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 55 49   case..**.** BUI
0f50: 4c 54 2d 49 4e 20 57 49 4e 44 4f 57 20 46 55 4e  LT-IN WINDOW FUN
0f60: 43 54 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 54  CTIONS.**.**   T
0f70: 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  his implementati
0f80: 6f 6e 20 66 65 61 74 75 72 65 73 20 74 68 65 20  on features the 
0f90: 66 6f 6c 6c 6f 77 69 6e 67 20 62 75 69 6c 74 2d  following built-
0fa0: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
0fb0: 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72  ons:.**.**     r
0fc0: 6f 77 5f 6e 75 6d 62 65 72 28 29 0a 2a 2a 20 20  ow_number().**  
0fd0: 20 20 20 72 61 6e 6b 28 29 0a 2a 2a 20 20 20 20     rank().**    
0fe0: 20 64 65 6e 73 65 5f 72 61 6e 6b 28 29 0a 2a 2a   dense_rank().**
0ff0: 20 20 20 20 20 70 65 72 63 65 6e 74 5f 72 61 6e       percent_ran
1000: 6b 28 29 0a 2a 2a 20 20 20 20 20 63 75 6d 65 5f  k().**     cume_
1010: 64 69 73 74 28 29 0a 2a 2a 20 20 20 20 20 6e 74  dist().**     nt
1020: 69 6c 65 28 4e 29 0a 2a 2a 20 20 20 20 20 6c 65  ile(N).**     le
1030: 61 64 28 65 78 70 72 20 5b 2c 20 6f 66 66 73 65  ad(expr [, offse
1040: 74 20 5b 2c 20 64 65 66 61 75 6c 74 5d 5d 29 0a  t [, default]]).
1050: 2a 2a 20 20 20 20 20 6c 61 67 28 65 78 70 72 20  **     lag(expr 
1060: 5b 2c 20 6f 66 66 73 65 74 20 5b 2c 20 64 65 66  [, offset [, def
1070: 61 75 6c 74 5d 5d 29 0a 2a 2a 20 20 20 20 20 66  ault]]).**     f
1080: 69 72 73 74 5f 76 61 6c 75 65 28 65 78 70 72 29  irst_value(expr)
1090: 0a 2a 2a 20 20 20 20 20 6c 61 73 74 5f 76 61 6c  .**     last_val
10a0: 75 65 28 65 78 70 72 29 0a 2a 2a 20 20 20 20 20  ue(expr).**     
10b0: 6e 74 68 5f 76 61 6c 75 65 28 65 78 70 72 2c 20  nth_value(expr, 
10c0: 4e 29 0a 2a 2a 20 20 20 0a 2a 2a 20 20 20 54 68  N).**   .**   Th
10d0: 65 73 65 20 61 72 65 20 74 68 65 20 73 61 6d 65  ese are the same
10e0: 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77   built-in window
10f0: 20 66 75 6e 63 74 69 6f 6e 73 20 73 75 70 70 6f   functions suppo
1100: 72 74 65 64 20 62 79 20 50 6f 73 74 67 72 65 73  rted by Postgres
1110: 2e 20 0a 2a 2a 20 20 20 41 6c 74 68 6f 75 67 68  . .**   Although
1120: 20 74 68 65 20 62 65 68 61 76 69 6f 75 72 20 6f   the behaviour o
1130: 66 20 61 67 67 72 65 67 61 74 65 20 77 69 6e 64  f aggregate wind
1140: 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 28 66 75  ow functions (fu
1150: 6e 63 74 69 6f 6e 73 20 74 68 61 74 0a 2a 2a 20  nctions that.** 
1160: 20 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 73    can be used as
1170: 20 65 69 74 68 65 72 20 61 67 67 72 65 67 61 74   either aggregat
1180: 65 73 20 6f 72 20 77 69 6e 64 6f 77 20 66 75 6e  es or window fun
1190: 74 69 6f 6e 73 29 20 61 6c 6c 6f 77 73 20 74 68  tions) allows th
11a0: 65 6d 20 74 6f 0a 2a 2a 20 20 20 62 65 20 69 6d  em to.**   be im
11b0: 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20  plemented using 
11c0: 61 6e 20 41 50 49 2c 20 62 75 69 6c 74 2d 69 6e  an API, built-in
11d0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
11e0: 73 20 61 72 65 20 6d 75 63 68 20 6d 6f 72 65 0a  s are much more.
11f0: 2a 2a 20 20 20 65 73 6f 74 65 72 69 63 2e 20 41  **   esoteric. A
1200: 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 73 6f 6d  dditionally, som
1210: 65 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  e window functio
1220: 6e 73 20 28 65 2e 67 2e 20 6e 74 68 5f 76 61 6c  ns (e.g. nth_val
1230: 75 65 28 29 29 20 0a 2a 2a 20 20 20 6d 61 79 20  ue()) .**   may 
1240: 6f 6e 6c 79 20 62 65 20 69 6d 70 6c 65 6d 65 6e  only be implemen
1250: 74 65 64 20 62 79 20 63 61 63 68 69 6e 67 20 74  ted by caching t
1260: 68 65 20 65 6e 74 69 72 65 20 70 61 72 74 69 74  he entire partit
1270: 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a  ion in memory..*
1280: 2a 20 20 20 41 73 20 73 75 63 68 2c 20 73 6f 6d  *   As such, som
1290: 65 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  e built-in windo
12a0: 77 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 20  w functions use 
12b0: 74 68 65 20 73 61 6d 65 20 41 50 49 20 61 73 20  the same API as 
12c0: 61 67 67 72 65 67 61 74 65 0a 2a 2a 20 20 20 77  aggregate.**   w
12d0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
12e0: 61 6e 64 20 73 6f 6d 65 20 61 72 65 20 69 6d 70  and some are imp
12f0: 6c 65 6d 65 6e 74 65 64 20 64 69 72 65 63 74 6c  lemented directl
1300: 79 20 75 73 69 6e 67 20 56 44 42 45 20 0a 2a 2a  y using VDBE .**
1310: 20 20 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e     instructions.
1320: 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 66   Additionally, f
1330: 6f 72 20 74 68 6f 73 65 20 66 75 6e 63 74 69 6f  or those functio
1340: 6e 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20  ns that use the 
1350: 41 50 49 2c 20 74 68 65 0a 2a 2a 20 20 20 77 69  API, the.**   wi
1360: 6e 64 6f 77 20 66 72 61 6d 65 20 69 73 20 73 6f  ndow frame is so
1370: 6d 65 74 69 6d 65 73 20 6d 6f 64 69 66 69 65 64  metimes modified
1380: 20 62 65 66 6f 72 65 20 74 68 65 20 53 45 4c 45   before the SELE
1390: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a  CT statement is.
13a0: 2a 2a 20 20 20 72 65 77 72 69 74 74 65 6e 2e 20  **   rewritten. 
13b0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 72 65 67  For example, reg
13c0: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 73  ardless of the s
13d0: 70 65 63 69 66 69 65 64 20 77 69 6e 64 6f 77 20  pecified window 
13e0: 66 72 61 6d 65 2c 20 74 68 65 0a 2a 2a 20 20 20  frame, the.**   
13f0: 72 6f 77 5f 6e 75 6d 62 65 72 28 29 20 66 75 6e  row_number() fun
1400: 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 75 73 65  ction always use
1410: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 4f 57  s:.**.**     ROW
1420: 53 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e  S BETWEEN UNBOUN
1430: 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e  DED PRECEDING AN
1440: 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a  D CURRENT ROW.**
1450: 0a 2a 2a 20 20 20 53 65 65 20 73 71 6c 69 74 65  .**   See sqlite
1460: 33 57 69 6e 64 6f 77 55 70 64 61 74 65 28 29 20  3WindowUpdate() 
1470: 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  for details..**.
1480: 2a 2a 20 20 20 41 73 20 77 65 6c 6c 20 61 73 20  **   As well as 
1490: 73 6f 6d 65 20 6f 66 20 74 68 65 20 62 75 69 6c  some of the buil
14a0: 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63  t-in window func
14b0: 74 69 6f 6e 73 2c 20 61 67 67 72 65 67 61 74 65  tions, aggregate
14c0: 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20 66 75 6e   window.**   fun
14d0: 63 74 69 6f 6e 73 20 6d 69 6e 28 29 20 61 6e 64  ctions min() and
14e0: 20 6d 61 78 28 29 20 61 72 65 20 69 6d 70 6c 65   max() are imple
14f0: 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 56 44 42  mented using VDB
1500: 45 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 69  E instructions i
1510: 66 0a 2a 2a 20 20 20 74 68 65 20 73 74 61 72 74  f.**   the start
1520: 20 6f 66 20 74 68 65 20 77 69 6e 64 6f 77 20 66   of the window f
1530: 72 61 6d 65 20 69 73 20 64 65 63 6c 61 72 65 64  rame is declared
1540: 20 61 73 20 61 6e 79 74 68 69 6e 67 20 6f 74 68   as anything oth
1550: 65 72 20 74 68 61 6e 20 0a 2a 2a 20 20 20 55 4e  er than .**   UN
1560: 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e  BOUNDED PRECEDIN
1570: 47 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  G..*/../*.** Imp
1580: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 62  lementation of b
1590: 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66  uilt-in window f
15a0: 75 6e 63 74 69 6f 6e 20 72 6f 77 5f 6e 75 6d 62  unction row_numb
15b0: 65 72 28 29 2e 20 41 73 73 75 6d 65 73 20 74 68  er(). Assumes th
15c0: 61 74 20 74 68 65 0a 2a 2a 20 77 69 6e 64 6f 77  at the.** window
15d0: 20 66 72 61 6d 65 20 68 61 73 20 62 65 65 6e 20   frame has been 
15e0: 63 6f 65 72 63 65 64 20 74 6f 3a 0a 2a 2a 0a 2a  coerced to:.**.*
15f0: 2a 20 20 20 52 4f 57 53 20 42 45 54 57 45 45 4e  *   ROWS BETWEEN
1600: 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45   UNBOUNDED PRECE
1610: 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54  DING AND CURRENT
1620: 20 52 4f 57 0a 2a 2f 0a 73 74 61 74 69 63 20 76   ROW.*/.static v
1630: 6f 69 64 20 72 6f 77 5f 6e 75 6d 62 65 72 53 74  oid row_numberSt
1640: 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  epFunc(.  sqlite
1650: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
1660: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
1670: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
1680: 61 70 41 72 67 0a 29 7b 0a 20 20 69 36 34 20 2a  apArg.){.  i64 *
1690: 70 20 3d 20 28 69 36 34 2a 29 73 71 6c 69 74 65  p = (i64*)sqlite
16a0: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
16b0: 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66  ext(pCtx, sizeof
16c0: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29  (*p));.  if( p )
16d0: 20 28 2a 70 29 2b 2b 3b 0a 20 20 55 4e 55 53 45   (*p)++;.  UNUSE
16e0: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72 67  D_PARAMETER(nArg
16f0: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1700: 4d 45 54 45 52 28 61 70 41 72 67 29 3b 0a 7d 0a  METER(apArg);.}.
1710: 73 74 61 74 69 63 20 76 6f 69 64 20 72 6f 77 5f  static void row_
1720: 6e 75 6d 62 65 72 56 61 6c 75 65 46 75 6e 63 28  numberValueFunc(
1730: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1740: 2a 70 43 74 78 29 7b 0a 20 20 69 36 34 20 2a 70  *pCtx){.  i64 *p
1750: 20 3d 20 28 69 36 34 2a 29 73 71 6c 69 74 65 33   = (i64*)sqlite3
1760: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
1770: 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28  xt(pCtx, sizeof(
1780: 2a 70 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  *p));.  sqlite3_
1790: 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74  result_int64(pCt
17a0: 78 2c 20 28 70 20 3f 20 2a 70 20 3a 20 30 29 29  x, (p ? *p : 0))
17b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65  ;.}../*.** Conte
17c0: 78 74 20 6f 62 6a 65 63 74 20 74 79 70 65 20 75  xt object type u
17d0: 73 65 64 20 62 79 20 72 61 6e 6b 28 29 2c 20 64  sed by rank(), d
17e0: 65 6e 73 65 5f 72 61 6e 6b 28 29 2c 20 70 65 72  ense_rank(), per
17f0: 63 65 6e 74 5f 72 61 6e 6b 28 29 20 61 6e 64 0a  cent_rank() and.
1800: 2a 2a 20 63 75 6d 65 5f 64 69 73 74 28 29 2e 0a  ** cume_dist()..
1810: 2a 2f 0a 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  */.struct CallCo
1820: 75 6e 74 20 7b 0a 20 20 69 36 34 20 6e 56 61 6c  unt {.  i64 nVal
1830: 75 65 3b 0a 20 20 69 36 34 20 6e 53 74 65 70 3b  ue;.  i64 nStep;
1840: 0a 20 20 69 36 34 20 6e 54 6f 74 61 6c 3b 0a 7d  .  i64 nTotal;.}
1850: 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  ;../*.** Impleme
1860: 6e 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74  ntation of built
1870: 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  -in window funct
1880: 69 6f 6e 20 64 65 6e 73 65 5f 72 61 6e 6b 28 29  ion dense_rank()
1890: 2e 20 41 73 73 75 6d 65 73 20 74 68 61 74 0a 2a  . Assumes that.*
18a0: 2a 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61  * the window fra
18b0: 6d 65 20 68 61 73 20 62 65 65 6e 20 73 65 74 20  me has been set 
18c0: 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e 47  to:.**.**   RANG
18d0: 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e  E BETWEEN UNBOUN
18e0: 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e  DED PRECEDING AN
18f0: 44 20 43 55 52 52 45 4e 54 20 52 4f 57 20 0a 2a  D CURRENT ROW .*
1900: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65  /.static void de
1910: 6e 73 65 5f 72 61 6e 6b 53 74 65 70 46 75 6e 63  nse_rankStepFunc
1920: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
1930: 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e  ext *pCtx, .  in
1940: 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65  t nArg,.  sqlite
1950: 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a  3_value **apArg.
1960: 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61 6c 6c  ){.  struct Call
1970: 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70 20 3d 20  Count *p;.  p = 
1980: 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e  (struct CallCoun
1990: 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65  t*)sqlite3_aggre
19a0: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74  gate_context(pCt
19b0: 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  x, sizeof(*p));.
19c0: 20 20 69 66 28 20 70 20 29 20 70 2d 3e 6e 53 74    if( p ) p->nSt
19d0: 65 70 20 3d 20 31 3b 0a 20 20 55 4e 55 53 45 44  ep = 1;.  UNUSED
19e0: 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72 67 29  _PARAMETER(nArg)
19f0: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1a00: 45 54 45 52 28 61 70 41 72 67 29 3b 0a 7d 0a 73  ETER(apArg);.}.s
1a10: 74 61 74 69 63 20 76 6f 69 64 20 64 65 6e 73 65  tatic void dense
1a20: 5f 72 61 6e 6b 56 61 6c 75 65 46 75 6e 63 28 73  _rankValueFunc(s
1a30: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1a40: 70 43 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20  pCtx){.  struct 
1a50: 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20  CallCount *p;.  
1a60: 70 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c  p = (struct Call
1a70: 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61  Count*)sqlite3_a
1a80: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
1a90: 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70  (pCtx, sizeof(*p
1aa0: 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ));.  if( p ){. 
1ab0: 20 20 20 69 66 28 20 70 2d 3e 6e 53 74 65 70 20     if( p->nStep 
1ac0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61 6c  ){.      p->nVal
1ad0: 75 65 2b 2b 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  ue++;.      p->n
1ae0: 53 74 65 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Step = 0;.    }.
1af0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
1b00: 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 70  lt_int64(pCtx, p
1b10: 2d 3e 6e 56 61 6c 75 65 29 3b 0a 20 20 7d 0a 7d  ->nValue);.  }.}
1b20: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
1b30: 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74 2d  tation of built-
1b40: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
1b50: 6f 6e 20 6e 74 68 5f 76 61 6c 75 65 28 29 2e 20  on nth_value(). 
1b60: 54 68 69 73 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  This.** implemen
1b70: 74 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 69  tation is used i
1b80: 6e 20 22 73 6c 6f 77 20 6d 6f 64 65 22 20 6f 6e  n "slow mode" on
1b90: 6c 79 20 2d 20 77 68 65 6e 20 74 68 65 20 45 58  ly - when the EX
1ba0: 43 4c 55 44 45 20 63 6c 61 75 73 65 0a 2a 2a 20  CLUDE clause.** 
1bb0: 69 73 20 6e 6f 74 20 73 65 74 20 74 6f 20 74 68  is not set to th
1bc0: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
1bd0: 22 4e 4f 20 4f 54 48 45 52 53 22 2e 0a 2a 2f 0a  "NO OTHERS"..*/.
1be0: 73 74 72 75 63 74 20 4e 74 68 56 61 6c 75 65 43  struct NthValueC
1bf0: 74 78 20 7b 0a 20 20 69 36 34 20 6e 53 74 65 70  tx {.  i64 nStep
1c00: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ;.  sqlite3_valu
1c10: 65 20 2a 70 56 61 6c 75 65 3b 0a 7d 3b 0a 73 74  e *pValue;.};.st
1c20: 61 74 69 63 20 76 6f 69 64 20 6e 74 68 5f 76 61  atic void nth_va
1c30: 6c 75 65 53 74 65 70 46 75 6e 63 28 0a 20 20 73  lueStepFunc(.  s
1c40: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1c50: 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72  pCtx, .  int nAr
1c60: 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  g,.  sqlite3_val
1c70: 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20  ue **apArg.){.  
1c80: 73 74 72 75 63 74 20 4e 74 68 56 61 6c 75 65 43  struct NthValueC
1c90: 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74  tx *p;.  p = (st
1ca0: 72 75 63 74 20 4e 74 68 56 61 6c 75 65 43 74 78  ruct NthValueCtx
1cb0: 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  *)sqlite3_aggreg
1cc0: 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78  ate_context(pCtx
1cd0: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
1ce0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 36   if( p ){.    i6
1cf0: 34 20 69 56 61 6c 3b 0a 20 20 20 20 73 77 69 74  4 iVal;.    swit
1d00: 63 68 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ch( sqlite3_valu
1d10: 65 5f 6e 75 6d 65 72 69 63 5f 74 79 70 65 28 61  e_numeric_type(a
1d20: 70 41 72 67 5b 31 5d 29 20 29 7b 0a 20 20 20 20  pArg[1]) ){.    
1d30: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
1d40: 54 45 47 45 52 3a 0a 20 20 20 20 20 20 20 20 69  TEGER:.        i
1d50: 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  Val = sqlite3_va
1d60: 6c 75 65 5f 69 6e 74 36 34 28 61 70 41 72 67 5b  lue_int64(apArg[
1d70: 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  1]);.        bre
1d80: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
1d90: 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20  QLITE_FLOAT: {. 
1da0: 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 66 56         double fV
1db0: 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  al = sqlite3_val
1dc0: 75 65 5f 64 6f 75 62 6c 65 28 61 70 41 72 67 5b  ue_double(apArg[
1dd0: 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  1]);.        if(
1de0: 20 28 28 69 36 34 29 66 56 61 6c 29 21 3d 66 56   ((i64)fVal)!=fV
1df0: 61 6c 20 29 20 67 6f 74 6f 20 65 72 72 6f 72 5f  al ) goto error_
1e00: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 69 56 61  out;.        iVa
1e10: 6c 20 3d 20 28 69 36 34 29 66 56 61 6c 3b 0a 20  l = (i64)fVal;. 
1e20: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1e30: 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66 61      }.      defa
1e40: 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 67 6f 74  ult:.        got
1e50: 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20  o error_out;.   
1e60: 20 7d 0a 20 20 20 20 69 66 28 20 69 56 61 6c 3c   }.    if( iVal<
1e70: 3d 30 20 29 20 67 6f 74 6f 20 65 72 72 6f 72 5f  =0 ) goto error_
1e80: 6f 75 74 3b 0a 0a 20 20 20 20 70 2d 3e 6e 53 74  out;..    p->nSt
1e90: 65 70 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69 56  ep++;.    if( iV
1ea0: 61 6c 3d 3d 70 2d 3e 6e 53 74 65 70 20 29 7b 0a  al==p->nStep ){.
1eb0: 20 20 20 20 20 20 70 2d 3e 70 56 61 6c 75 65 20        p->pValue 
1ec0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
1ed0: 64 75 70 28 61 70 41 72 67 5b 30 5d 29 3b 0a 20  dup(apArg[0]);. 
1ee0: 20 20 20 20 20 69 66 28 20 21 70 2d 3e 70 56 61       if( !p->pVa
1ef0: 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  lue ){.        s
1f00: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
1f10: 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29 3b  ror_nomem(pCtx);
1f20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1f30: 20 7d 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41   }.  UNUSED_PARA
1f40: 4d 45 54 45 52 28 6e 41 72 67 29 3b 0a 20 20 55  METER(nArg);.  U
1f50: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1f60: 61 70 41 72 67 29 3b 0a 20 20 72 65 74 75 72 6e  apArg);.  return
1f70: 3b 0a 0a 20 65 72 72 6f 72 5f 6f 75 74 3a 0a 20  ;.. error_out:. 
1f80: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1f90: 65 72 72 6f 72 28 0a 20 20 20 20 20 20 70 43 74  error(.      pCt
1fa0: 78 2c 20 22 73 65 63 6f 6e 64 20 61 72 67 75 6d  x, "second argum
1fb0: 65 6e 74 20 74 6f 20 6e 74 68 5f 76 61 6c 75 65  ent to nth_value
1fc0: 20 6d 75 73 74 20 62 65 20 61 20 70 6f 73 69 74   must be a posit
1fd0: 69 76 65 20 69 6e 74 65 67 65 72 22 2c 20 2d 31  ive integer", -1
1fe0: 0a 20 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  .  );.}.static v
1ff0: 6f 69 64 20 6e 74 68 5f 76 61 6c 75 65 46 69 6e  oid nth_valueFin
2000: 61 6c 69 7a 65 46 75 6e 63 28 73 71 6c 69 74 65  alizeFunc(sqlite
2010: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29  3_context *pCtx)
2020: 7b 0a 20 20 73 74 72 75 63 74 20 4e 74 68 56 61  {.  struct NthVa
2030: 6c 75 65 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d  lueCtx *p;.  p =
2040: 20 28 73 74 72 75 63 74 20 4e 74 68 56 61 6c 75   (struct NthValu
2050: 65 43 74 78 2a 29 73 71 6c 69 74 65 33 5f 61 67  eCtx*)sqlite3_ag
2060: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
2070: 70 43 74 78 2c 20 30 29 3b 0a 20 20 69 66 28 20  pCtx, 0);.  if( 
2080: 70 20 26 26 20 70 2d 3e 70 56 61 6c 75 65 20 29  p && p->pValue )
2090: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
20a0: 73 75 6c 74 5f 76 61 6c 75 65 28 70 43 74 78 2c  sult_value(pCtx,
20b0: 20 70 2d 3e 70 56 61 6c 75 65 29 3b 0a 20 20 20   p->pValue);.   
20c0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 66   sqlite3_value_f
20d0: 72 65 65 28 70 2d 3e 70 56 61 6c 75 65 29 3b 0a  ree(p->pValue);.
20e0: 20 20 20 20 70 2d 3e 70 56 61 6c 75 65 20 3d 20      p->pValue = 
20f0: 30 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65  0;.  }.}.#define
2100: 20 6e 74 68 5f 76 61 6c 75 65 49 6e 76 46 75 6e   nth_valueInvFun
2110: 63 20 6e 6f 6f 70 53 74 65 70 46 75 6e 63 0a 23  c noopStepFunc.#
2120: 64 65 66 69 6e 65 20 6e 74 68 5f 76 61 6c 75 65  define nth_value
2130: 56 61 6c 75 65 46 75 6e 63 20 6e 6f 6f 70 56 61  ValueFunc noopVa
2140: 6c 75 65 46 75 6e 63 0a 0a 73 74 61 74 69 63 20  lueFunc..static 
2150: 76 6f 69 64 20 66 69 72 73 74 5f 76 61 6c 75 65  void first_value
2160: 53 74 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69  StepFunc(.  sqli
2170: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
2180: 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  x, .  int nArg,.
2190: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
21a0: 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72  **apArg.){.  str
21b0: 75 63 74 20 4e 74 68 56 61 6c 75 65 43 74 78 20  uct NthValueCtx 
21c0: 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63  *p;.  p = (struc
21d0: 74 20 4e 74 68 56 61 6c 75 65 43 74 78 2a 29 73  t NthValueCtx*)s
21e0: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
21f0: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
2200: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
2210: 28 20 70 20 26 26 20 70 2d 3e 70 56 61 6c 75 65  ( p && p->pValue
2220: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 56  ==0 ){.    p->pV
2230: 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76  alue = sqlite3_v
2240: 61 6c 75 65 5f 64 75 70 28 61 70 41 72 67 5b 30  alue_dup(apArg[0
2250: 5d 29 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e  ]);.    if( !p->
2260: 70 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20  pValue ){.      
2270: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
2280: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29  rror_nomem(pCtx)
2290: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 55 4e  ;.    }.  }.  UN
22a0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
22b0: 41 72 67 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  Arg);.  UNUSED_P
22c0: 41 52 41 4d 45 54 45 52 28 61 70 41 72 67 29 3b  ARAMETER(apArg);
22d0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  .}.static void f
22e0: 69 72 73 74 5f 76 61 6c 75 65 46 69 6e 61 6c 69  irst_valueFinali
22f0: 7a 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  zeFunc(sqlite3_c
2300: 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20  ontext *pCtx){. 
2310: 20 73 74 72 75 63 74 20 4e 74 68 56 61 6c 75 65   struct NthValue
2320: 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73  Ctx *p;.  p = (s
2330: 74 72 75 63 74 20 4e 74 68 56 61 6c 75 65 43 74  truct NthValueCt
2340: 78 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65  x*)sqlite3_aggre
2350: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74  gate_context(pCt
2360: 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  x, sizeof(*p));.
2370: 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 70 56    if( p && p->pV
2380: 61 6c 75 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  alue ){.    sqli
2390: 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65  te3_result_value
23a0: 28 70 43 74 78 2c 20 70 2d 3e 70 56 61 6c 75 65  (pCtx, p->pValue
23b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  );.    sqlite3_v
23c0: 61 6c 75 65 5f 66 72 65 65 28 70 2d 3e 70 56 61  alue_free(p->pVa
23d0: 6c 75 65 29 3b 0a 20 20 20 20 70 2d 3e 70 56 61  lue);.    p->pVa
23e0: 6c 75 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23  lue = 0;.  }.}.#
23f0: 64 65 66 69 6e 65 20 66 69 72 73 74 5f 76 61 6c  define first_val
2400: 75 65 49 6e 76 46 75 6e 63 20 6e 6f 6f 70 53 74  ueInvFunc noopSt
2410: 65 70 46 75 6e 63 0a 23 64 65 66 69 6e 65 20 66  epFunc.#define f
2420: 69 72 73 74 5f 76 61 6c 75 65 56 61 6c 75 65 46  irst_valueValueF
2430: 75 6e 63 20 6e 6f 6f 70 56 61 6c 75 65 46 75 6e  unc noopValueFun
2440: 63 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  c../*.** Impleme
2450: 6e 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74  ntation of built
2460: 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  -in window funct
2470: 69 6f 6e 20 72 61 6e 6b 28 29 2e 20 41 73 73 75  ion rank(). Assu
2480: 6d 65 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  mes that.** the 
2490: 77 69 6e 64 6f 77 20 66 72 61 6d 65 20 68 61 73  window frame has
24a0: 20 62 65 65 6e 20 73 65 74 20 74 6f 3a 0a 2a 2a   been set to:.**
24b0: 0a 2a 2a 20 20 20 52 41 4e 47 45 20 42 45 54 57  .**   RANGE BETW
24c0: 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52  EEN UNBOUNDED PR
24d0: 45 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52  ECEDING AND CURR
24e0: 45 4e 54 20 52 4f 57 20 0a 2a 2f 0a 73 74 61 74  ENT ROW .*/.stat
24f0: 69 63 20 76 6f 69 64 20 72 61 6e 6b 53 74 65 70  ic void rankStep
2500: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
2510: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
2520: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
2530: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
2540: 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20  Arg.){.  struct 
2550: 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20  CallCount *p;.  
2560: 70 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c  p = (struct Call
2570: 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61  Count*)sqlite3_a
2580: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
2590: 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70  (pCtx, sizeof(*p
25a0: 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ));.  if( p ){. 
25b0: 20 20 20 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 20     p->nStep++;. 
25c0: 20 20 20 69 66 28 20 70 2d 3e 6e 56 61 6c 75 65     if( p->nValue
25d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
25e0: 6e 56 61 6c 75 65 20 3d 20 70 2d 3e 6e 53 74 65  nValue = p->nSte
25f0: 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 55  p;.    }.  }.  U
2600: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2610: 6e 41 72 67 29 3b 0a 20 20 55 4e 55 53 45 44 5f  nArg);.  UNUSED_
2620: 50 41 52 41 4d 45 54 45 52 28 61 70 41 72 67 29  PARAMETER(apArg)
2630: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
2640: 72 61 6e 6b 56 61 6c 75 65 46 75 6e 63 28 73 71  rankValueFunc(sq
2650: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
2660: 43 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20 43  Ctx){.  struct C
2670: 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70  allCount *p;.  p
2680: 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43   = (struct CallC
2690: 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67  ount*)sqlite3_ag
26a0: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
26b0: 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29  pCtx, sizeof(*p)
26c0: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
26d0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
26e0: 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 70 2d 3e  _int64(pCtx, p->
26f0: 6e 56 61 6c 75 65 29 3b 0a 20 20 20 20 70 2d 3e  nValue);.    p->
2700: 6e 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 7d 0a  nValue = 0;.  }.
2710: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
2720: 6e 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74  ntation of built
2730: 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  -in window funct
2740: 69 6f 6e 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b  ion percent_rank
2750: 28 29 2e 20 41 73 73 75 6d 65 73 20 74 68 61 74  (). Assumes that
2760: 0a 2a 2a 20 74 68 65 20 77 69 6e 64 6f 77 20 66  .** the window f
2770: 72 61 6d 65 20 68 61 73 20 62 65 65 6e 20 73 65  rame has been se
2780: 74 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 47 52  t to:.**.**   GR
2790: 4f 55 50 53 20 42 45 54 57 45 45 4e 20 43 55 52  OUPS BETWEEN CUR
27a0: 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 55 4e 42  RENT ROW AND UNB
27b0: 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47  OUNDED FOLLOWING
27c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
27d0: 70 65 72 63 65 6e 74 5f 72 61 6e 6b 53 74 65 70  percent_rankStep
27e0: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
27f0: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
2800: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
2810: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
2820: 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20  Arg.){.  struct 
2830: 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20  CallCount *p;.  
2840: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2850: 28 6e 41 72 67 29 3b 20 61 73 73 65 72 74 28 20  (nArg); assert( 
2860: 6e 41 72 67 3d 3d 30 20 29 3b 0a 20 20 55 4e 55  nArg==0 );.  UNU
2870: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 70  SED_PARAMETER(ap
2880: 41 72 67 29 3b 0a 20 20 70 20 3d 20 28 73 74 72  Arg);.  p = (str
2890: 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29 73  uct CallCount*)s
28a0: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
28b0: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
28c0: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
28d0: 28 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 54  ( p ){.    p->nT
28e0: 6f 74 61 6c 2b 2b 3b 0a 20 20 7d 0a 7d 0a 73 74  otal++;.  }.}.st
28f0: 61 74 69 63 20 76 6f 69 64 20 70 65 72 63 65 6e  atic void percen
2900: 74 5f 72 61 6e 6b 49 6e 76 46 75 6e 63 28 0a 20  t_rankInvFunc(. 
2910: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
2920: 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
2930: 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
2940: 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a  alue **apArg.){.
2950: 20 20 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75    struct CallCou
2960: 6e 74 20 2a 70 3b 0a 20 20 55 4e 55 53 45 44 5f  nt *p;.  UNUSED_
2970: 50 41 52 41 4d 45 54 45 52 28 6e 41 72 67 29 3b  PARAMETER(nArg);
2980: 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 30   assert( nArg==0
2990: 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
29a0: 41 4d 45 54 45 52 28 61 70 41 72 67 29 3b 0a 20  AMETER(apArg);. 
29b0: 20 70 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c   p = (struct Cal
29c0: 6c 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f  lCount*)sqlite3_
29d0: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
29e0: 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a  t(pCtx, sizeof(*
29f0: 70 29 29 3b 0a 20 20 70 2d 3e 6e 53 74 65 70 2b  p));.  p->nStep+
2a00: 2b 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  +;.}.static void
2a10: 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b 56 61 6c   percent_rankVal
2a20: 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  ueFunc(sqlite3_c
2a30: 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20  ontext *pCtx){. 
2a40: 20 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e   struct CallCoun
2a50: 74 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72  t *p;.  p = (str
2a60: 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29 73  uct CallCount*)s
2a70: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
2a80: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
2a90: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
2aa0: 28 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56  ( p ){.    p->nV
2ab0: 61 6c 75 65 20 3d 20 70 2d 3e 6e 53 74 65 70 3b  alue = p->nStep;
2ac0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 54 6f 74  .    if( p->nTot
2ad0: 61 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20 64 6f  al>1 ){.      do
2ae0: 75 62 6c 65 20 72 20 3d 20 28 64 6f 75 62 6c 65  uble r = (double
2af0: 29 70 2d 3e 6e 56 61 6c 75 65 20 2f 20 28 64 6f  )p->nValue / (do
2b00: 75 62 6c 65 29 28 70 2d 3e 6e 54 6f 74 61 6c 2d  uble)(p->nTotal-
2b10: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
2b20: 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28  3_result_double(
2b30: 70 43 74 78 2c 20 72 29 3b 0a 20 20 20 20 7d 65  pCtx, r);.    }e
2b40: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
2b50: 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65  e3_result_double
2b60: 28 70 43 74 78 2c 20 30 2e 30 29 3b 0a 20 20 20  (pCtx, 0.0);.   
2b70: 20 7d 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65   }.  }.}.#define
2b80: 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b 46 69 6e   percent_rankFin
2b90: 61 6c 69 7a 65 46 75 6e 63 20 70 65 72 63 65 6e  alizeFunc percen
2ba0: 74 5f 72 61 6e 6b 56 61 6c 75 65 46 75 6e 63 0a  t_rankValueFunc.
2bb0: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
2bc0: 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74 2d 69  ation of built-i
2bd0: 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  n window functio
2be0: 6e 20 63 75 6d 65 5f 64 69 73 74 28 29 2e 20 41  n cume_dist(). A
2bf0: 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 74  ssumes that.** t
2c00: 68 65 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 20  he window frame 
2c10: 68 61 73 20 62 65 65 6e 20 73 65 74 20 74 6f 3a  has been set to:
2c20: 0a 2a 2a 0a 2a 2a 20 20 20 47 52 4f 55 50 53 20  .**.**   GROUPS 
2c30: 42 45 54 57 45 45 4e 20 31 20 46 4f 4c 4c 4f 57  BETWEEN 1 FOLLOW
2c40: 49 4e 47 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45  ING AND UNBOUNDE
2c50: 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2f 0a 73  D FOLLOWING.*/.s
2c60: 74 61 74 69 63 20 76 6f 69 64 20 63 75 6d 65 5f  tatic void cume_
2c70: 64 69 73 74 53 74 65 70 46 75 6e 63 28 0a 20 20  distStepFunc(.  
2c80: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
2c90: 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41  *pCtx, .  int nA
2ca0: 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  rg,.  sqlite3_va
2cb0: 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 20  lue **apArg.){. 
2cc0: 20 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e   struct CallCoun
2cd0: 74 20 2a 70 3b 0a 20 20 55 4e 55 53 45 44 5f 50  t *p;.  UNUSED_P
2ce0: 41 52 41 4d 45 54 45 52 28 6e 41 72 67 29 3b 20  ARAMETER(nArg); 
2cf0: 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 30 20  assert( nArg==0 
2d00: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
2d10: 4d 45 54 45 52 28 61 70 41 72 67 29 3b 0a 20 20  METER(apArg);.  
2d20: 70 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c  p = (struct Call
2d30: 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61  Count*)sqlite3_a
2d40: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
2d50: 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70  (pCtx, sizeof(*p
2d60: 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ));.  if( p ){. 
2d70: 20 20 20 70 2d 3e 6e 54 6f 74 61 6c 2b 2b 3b 0a     p->nTotal++;.
2d80: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
2d90: 64 20 63 75 6d 65 5f 64 69 73 74 49 6e 76 46 75  d cume_distInvFu
2da0: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
2db0: 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20  ntext *pCtx, .  
2dc0: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69  int nArg,.  sqli
2dd0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72  te3_value **apAr
2de0: 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61  g.){.  struct Ca
2df0: 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 55 4e  llCount *p;.  UN
2e00: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
2e10: 41 72 67 29 3b 20 61 73 73 65 72 74 28 20 6e 41  Arg); assert( nA
2e20: 72 67 3d 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45  rg==0 );.  UNUSE
2e30: 44 5f 50 41 52 41 4d 45 54 45 52 28 61 70 41 72  D_PARAMETER(apAr
2e40: 67 29 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63  g);.  p = (struc
2e50: 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29 73 71 6c  t CallCount*)sql
2e60: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
2e70: 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a  ontext(pCtx, siz
2e80: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 70 2d 3e 6e  eof(*p));.  p->n
2e90: 53 74 65 70 2b 2b 3b 0a 7d 0a 73 74 61 74 69 63  Step++;.}.static
2ea0: 20 76 6f 69 64 20 63 75 6d 65 5f 64 69 73 74 56   void cume_distV
2eb0: 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33  alueFunc(sqlite3
2ec0: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b  _context *pCtx){
2ed0: 0a 20 20 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  .  struct CallCo
2ee0: 75 6e 74 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73  unt *p;.  p = (s
2ef0: 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a  truct CallCount*
2f00: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
2f10: 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c  te_context(pCtx,
2f20: 20 30 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a   0);.  if( p ){.
2f30: 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 28      double r = (
2f40: 64 6f 75 62 6c 65 29 28 70 2d 3e 6e 53 74 65 70  double)(p->nStep
2f50: 29 20 2f 20 28 64 6f 75 62 6c 65 29 28 70 2d 3e  ) / (double)(p->
2f60: 6e 54 6f 74 61 6c 29 3b 0a 20 20 20 20 73 71 6c  nTotal);.    sql
2f70: 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62  ite3_result_doub
2f80: 6c 65 28 70 43 74 78 2c 20 72 29 3b 0a 20 20 7d  le(pCtx, r);.  }
2f90: 0a 7d 0a 23 64 65 66 69 6e 65 20 63 75 6d 65 5f  .}.#define cume_
2fa0: 64 69 73 74 46 69 6e 61 6c 69 7a 65 46 75 6e 63  distFinalizeFunc
2fb0: 20 63 75 6d 65 5f 64 69 73 74 56 61 6c 75 65 46   cume_distValueF
2fc0: 75 6e 63 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65  unc../*.** Conte
2fd0: 78 74 20 6f 62 6a 65 63 74 20 66 6f 72 20 6e 74  xt object for nt
2fe0: 69 6c 65 28 29 20 77 69 6e 64 6f 77 20 66 75 6e  ile() window fun
2ff0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74  ction..*/.struct
3000: 20 4e 74 69 6c 65 43 74 78 20 7b 0a 20 20 69 36   NtileCtx {.  i6
3010: 34 20 6e 54 6f 74 61 6c 3b 20 20 20 20 20 20 20  4 nTotal;       
3020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3030: 20 54 6f 74 61 6c 20 72 6f 77 73 20 69 6e 20 70   Total rows in p
3040: 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 20 20 69 36  artition */.  i6
3050: 34 20 6e 50 61 72 61 6d 3b 20 20 20 20 20 20 20  4 nParam;       
3060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3070: 20 50 61 72 61 6d 65 74 65 72 20 70 61 73 73 65   Parameter passe
3080: 64 20 74 6f 20 6e 74 69 6c 65 28 4e 29 20 2a 2f  d to ntile(N) */
3090: 0a 20 20 69 36 34 20 69 52 6f 77 3b 20 20 20 20  .  i64 iRow;    
30a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f     /* Current ro
30c0: 77 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49  w */.};../*.** I
30d0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
30e0: 20 6e 74 69 6c 65 28 29 2e 20 54 68 69 73 20 61   ntile(). This a
30f0: 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20  ssumes that the 
3100: 77 69 6e 64 6f 77 20 66 72 61 6d 65 20 68 61 73  window frame has
3110: 0a 2a 2a 20 62 65 65 6e 20 63 6f 65 72 63 65 64  .** been coerced
3120: 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57   to:.**.**   ROW
3130: 53 20 43 55 52 52 45 4e 54 20 52 4f 57 20 41 4e  S CURRENT ROW AN
3140: 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c  D UNBOUNDED FOLL
3150: 4f 57 49 4e 47 0a 2a 2f 0a 73 74 61 74 69 63 20  OWING.*/.static 
3160: 76 6f 69 64 20 6e 74 69 6c 65 53 74 65 70 46 75  void ntileStepFu
3170: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
3180: 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20  ntext *pCtx, .  
3190: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69  int nArg,.  sqli
31a0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72  te3_value **apAr
31b0: 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 4e 74  g.){.  struct Nt
31c0: 69 6c 65 43 74 78 20 2a 70 3b 0a 20 20 61 73 73  ileCtx *p;.  ass
31d0: 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 20  ert( nArg==1 ); 
31e0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
31f0: 28 6e 41 72 67 29 3b 0a 20 20 70 20 3d 20 28 73  (nArg);.  p = (s
3200: 74 72 75 63 74 20 4e 74 69 6c 65 43 74 78 2a 29  truct NtileCtx*)
3210: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
3220: 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20  e_context(pCtx, 
3230: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69  sizeof(*p));.  i
3240: 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  f( p ){.    if( 
3250: 70 2d 3e 6e 54 6f 74 61 6c 3d 3d 30 20 29 7b 0a  p->nTotal==0 ){.
3260: 20 20 20 20 20 20 70 2d 3e 6e 50 61 72 61 6d 20        p->nParam 
3270: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
3280: 69 6e 74 36 34 28 61 70 41 72 67 5b 30 5d 29 3b  int64(apArg[0]);
3290: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 50  .      if( p->nP
32a0: 61 72 61 6d 3c 3d 30 20 29 7b 0a 20 20 20 20 20  aram<=0 ){.     
32b0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
32c0: 74 5f 65 72 72 6f 72 28 0a 20 20 20 20 20 20 20  t_error(.       
32d0: 20 20 20 20 20 70 43 74 78 2c 20 22 61 72 67 75       pCtx, "argu
32e0: 6d 65 6e 74 20 6f 66 20 6e 74 69 6c 65 20 6d 75  ment of ntile mu
32f0: 73 74 20 62 65 20 61 20 70 6f 73 69 74 69 76 65  st be a positive
3300: 20 69 6e 74 65 67 65 72 22 2c 20 2d 31 0a 20 20   integer", -1.  
3310: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
3320: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 54  .    }.    p->nT
3330: 6f 74 61 6c 2b 2b 3b 0a 20 20 7d 0a 7d 0a 73 74  otal++;.  }.}.st
3340: 61 74 69 63 20 76 6f 69 64 20 6e 74 69 6c 65 49  atic void ntileI
3350: 6e 76 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  nvFunc(.  sqlite
3360: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
3370: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
3380: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
3390: 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63  apArg.){.  struc
33a0: 74 20 4e 74 69 6c 65 43 74 78 20 2a 70 3b 0a 20  t NtileCtx *p;. 
33b0: 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31   assert( nArg==1
33c0: 20 29 3b 20 55 4e 55 53 45 44 5f 50 41 52 41 4d   ); UNUSED_PARAM
33d0: 45 54 45 52 28 6e 41 72 67 29 3b 0a 20 20 55 4e  ETER(nArg);.  UN
33e0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
33f0: 70 41 72 67 29 3b 0a 20 20 70 20 3d 20 28 73 74  pArg);.  p = (st
3400: 72 75 63 74 20 4e 74 69 6c 65 43 74 78 2a 29 73  ruct NtileCtx*)s
3410: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
3420: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
3430: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 70 2d  izeof(*p));.  p-
3440: 3e 69 52 6f 77 2b 2b 3b 0a 7d 0a 73 74 61 74 69  >iRow++;.}.stati
3450: 63 20 76 6f 69 64 20 6e 74 69 6c 65 56 61 6c 75  c void ntileValu
3460: 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  eFunc(sqlite3_co
3470: 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20 20  ntext *pCtx){.  
3480: 73 74 72 75 63 74 20 4e 74 69 6c 65 43 74 78 20  struct NtileCtx 
3490: 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63  *p;.  p = (struc
34a0: 74 20 4e 74 69 6c 65 43 74 78 2a 29 73 71 6c 69  t NtileCtx*)sqli
34b0: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
34c0: 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65  ntext(pCtx, size
34d0: 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70  of(*p));.  if( p
34e0: 20 26 26 20 70 2d 3e 6e 50 61 72 61 6d 3e 30 20   && p->nParam>0 
34f0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 69 7a 65  ){.    int nSize
3500: 20 3d 20 28 70 2d 3e 6e 54 6f 74 61 6c 20 2f 20   = (p->nTotal / 
3510: 70 2d 3e 6e 50 61 72 61 6d 29 3b 0a 20 20 20 20  p->nParam);.    
3520: 69 66 28 20 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a  if( nSize==0 ){.
3530: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
3540: 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c  sult_int64(pCtx,
3550: 20 70 2d 3e 69 52 6f 77 2b 31 29 3b 0a 20 20 20   p->iRow+1);.   
3560: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 36   }else{.      i6
3570: 34 20 6e 4c 61 72 67 65 20 3d 20 70 2d 3e 6e 54  4 nLarge = p->nT
3580: 6f 74 61 6c 20 2d 20 70 2d 3e 6e 50 61 72 61 6d  otal - p->nParam
3590: 2a 6e 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 36  *nSize;.      i6
35a0: 34 20 69 53 6d 61 6c 6c 20 3d 20 6e 4c 61 72 67  4 iSmall = nLarg
35b0: 65 2a 28 6e 53 69 7a 65 2b 31 29 3b 0a 20 20 20  e*(nSize+1);.   
35c0: 20 20 20 69 36 34 20 69 52 6f 77 20 3d 20 70 2d     i64 iRow = p-
35d0: 3e 69 52 6f 77 3b 0a 0a 20 20 20 20 20 20 61 73  >iRow;..      as
35e0: 73 65 72 74 28 20 28 6e 4c 61 72 67 65 2a 28 6e  sert( (nLarge*(n
35f0: 53 69 7a 65 2b 31 29 20 2b 20 28 70 2d 3e 6e 50  Size+1) + (p->nP
3600: 61 72 61 6d 2d 6e 4c 61 72 67 65 29 2a 6e 53 69  aram-nLarge)*nSi
3610: 7a 65 29 3d 3d 70 2d 3e 6e 54 6f 74 61 6c 20 29  ze)==p->nTotal )
3620: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 69 52 6f  ;..      if( iRo
3630: 77 3c 69 53 6d 61 6c 6c 20 29 7b 0a 20 20 20 20  w<iSmall ){.    
3640: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
3650: 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 31  lt_int64(pCtx, 1
3660: 20 2b 20 69 52 6f 77 2f 28 6e 53 69 7a 65 2b 31   + iRow/(nSize+1
3670: 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
3680: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3690: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43  _result_int64(pC
36a0: 74 78 2c 20 31 20 2b 20 6e 4c 61 72 67 65 20 2b  tx, 1 + nLarge +
36b0: 20 28 69 52 6f 77 2d 69 53 6d 61 6c 6c 29 2f 6e   (iRow-iSmall)/n
36c0: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Size);.      }. 
36d0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 64 65 66 69     }.  }.}.#defi
36e0: 6e 65 20 6e 74 69 6c 65 46 69 6e 61 6c 69 7a 65  ne ntileFinalize
36f0: 46 75 6e 63 20 6e 74 69 6c 65 56 61 6c 75 65 46  Func ntileValueF
3700: 75 6e 63 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65  unc../*.** Conte
3710: 78 74 20 6f 62 6a 65 63 74 20 66 6f 72 20 6c 61  xt object for la
3720: 73 74 5f 76 61 6c 75 65 28 29 20 77 69 6e 64 6f  st_value() windo
3730: 77 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  w function..*/.s
3740: 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75 65 43  truct LastValueC
3750: 74 78 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  tx {.  sqlite3_v
3760: 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e  alue *pVal;.  in
3770: 74 20 6e 56 61 6c 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a  t nVal;.};../*.*
3780: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
3790: 20 6f 66 20 6c 61 73 74 5f 76 61 6c 75 65 28 29   of last_value()
37a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
37b0: 20 6c 61 73 74 5f 76 61 6c 75 65 53 74 65 70 46   last_valueStepF
37c0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
37d0: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
37e0: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
37f0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41  ite3_value **apA
3800: 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 4c  rg.){.  struct L
3810: 61 73 74 56 61 6c 75 65 43 74 78 20 2a 70 3b 0a  astValueCtx *p;.
3820: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
3830: 45 52 28 6e 41 72 67 29 3b 0a 20 20 70 20 3d 20  ER(nArg);.  p = 
3840: 28 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75  (struct LastValu
3850: 65 43 74 78 2a 29 73 71 6c 69 74 65 33 5f 61 67  eCtx*)sqlite3_ag
3860: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
3870: 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29  pCtx, sizeof(*p)
3880: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
3890: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f    sqlite3_value_
38a0: 66 72 65 65 28 70 2d 3e 70 56 61 6c 29 3b 0a 20  free(p->pVal);. 
38b0: 20 20 20 70 2d 3e 70 56 61 6c 20 3d 20 73 71 6c     p->pVal = sql
38c0: 69 74 65 33 5f 76 61 6c 75 65 5f 64 75 70 28 61  ite3_value_dup(a
38d0: 70 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 69 66  pArg[0]);.    if
38e0: 28 20 70 2d 3e 70 56 61 6c 3d 3d 30 20 29 7b 0a  ( p->pVal==0 ){.
38f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
3900: 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d  sult_error_nomem
3910: 28 70 43 74 78 29 3b 0a 20 20 20 20 7d 65 6c 73  (pCtx);.    }els
3920: 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61 6c  e{.      p->nVal
3930: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ++;.    }.  }.}.
3940: 73 74 61 74 69 63 20 76 6f 69 64 20 6c 61 73 74  static void last
3950: 5f 76 61 6c 75 65 49 6e 76 46 75 6e 63 28 0a 20  _valueInvFunc(. 
3960: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
3970: 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
3980: 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
3990: 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a  alue **apArg.){.
39a0: 20 20 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c    struct LastVal
39b0: 75 65 43 74 78 20 2a 70 3b 0a 20 20 55 4e 55 53  ueCtx *p;.  UNUS
39c0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72  ED_PARAMETER(nAr
39d0: 67 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  g);.  UNUSED_PAR
39e0: 41 4d 45 54 45 52 28 61 70 41 72 67 29 3b 0a 20  AMETER(apArg);. 
39f0: 20 70 20 3d 20 28 73 74 72 75 63 74 20 4c 61 73   p = (struct Las
3a00: 74 56 61 6c 75 65 43 74 78 2a 29 73 71 6c 69 74  tValueCtx*)sqlit
3a10: 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e  e3_aggregate_con
3a20: 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f  text(pCtx, sizeo
3a30: 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 41 4c  f(*p));.  if( AL
3a40: 57 41 59 53 28 70 29 20 29 7b 0a 20 20 20 20 70  WAYS(p) ){.    p
3a50: 2d 3e 6e 56 61 6c 2d 2d 3b 0a 20 20 20 20 69 66  ->nVal--;.    if
3a60: 28 20 70 2d 3e 6e 56 61 6c 3d 3d 30 20 29 7b 0a  ( p->nVal==0 ){.
3a70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
3a80: 6c 75 65 5f 66 72 65 65 28 70 2d 3e 70 56 61 6c  lue_free(p->pVal
3a90: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 56 61 6c  );.      p->pVal
3aa0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
3ab0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 61  }.static void la
3ac0: 73 74 5f 76 61 6c 75 65 56 61 6c 75 65 46 75 6e  st_valueValueFun
3ad0: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
3ae0: 74 20 2a 70 43 74 78 29 7b 0a 20 20 73 74 72 75  t *pCtx){.  stru
3af0: 63 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 20  ct LastValueCtx 
3b00: 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63  *p;.  p = (struc
3b10: 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 2a 29  t LastValueCtx*)
3b20: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
3b30: 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20  e_context(pCtx, 
3b40: 30 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70  0);.  if( p && p
3b50: 2d 3e 70 56 61 6c 20 29 7b 0a 20 20 20 20 73 71  ->pVal ){.    sq
3b60: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c  lite3_result_val
3b70: 75 65 28 70 43 74 78 2c 20 70 2d 3e 70 56 61 6c  ue(pCtx, p->pVal
3b80: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
3b90: 76 6f 69 64 20 6c 61 73 74 5f 76 61 6c 75 65 46  void last_valueF
3ba0: 69 6e 61 6c 69 7a 65 46 75 6e 63 28 73 71 6c 69  inalizeFunc(sqli
3bb0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
3bc0: 78 29 7b 0a 20 20 73 74 72 75 63 74 20 4c 61 73  x){.  struct Las
3bd0: 74 56 61 6c 75 65 43 74 78 20 2a 70 3b 0a 20 20  tValueCtx *p;.  
3be0: 70 20 3d 20 28 73 74 72 75 63 74 20 4c 61 73 74  p = (struct Last
3bf0: 56 61 6c 75 65 43 74 78 2a 29 73 71 6c 69 74 65  ValueCtx*)sqlite
3c00: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
3c10: 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66  ext(pCtx, sizeof
3c20: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 26  (*p));.  if( p &
3c30: 26 20 70 2d 3e 70 56 61 6c 20 29 7b 0a 20 20 20  & p->pVal ){.   
3c40: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
3c50: 76 61 6c 75 65 28 70 43 74 78 2c 20 70 2d 3e 70  value(pCtx, p->p
3c60: 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Val);.    sqlite
3c70: 33 5f 76 61 6c 75 65 5f 66 72 65 65 28 70 2d 3e  3_value_free(p->
3c80: 70 56 61 6c 29 3b 0a 20 20 20 20 70 2d 3e 70 56  pVal);.    p->pV
3c90: 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  al = 0;.  }.}../
3ca0: 2a 0a 2a 2a 20 53 74 61 74 69 63 20 6e 61 6d 65  *.** Static name
3cb0: 73 20 66 6f 72 20 74 68 65 20 62 75 69 6c 74 2d  s for the built-
3cc0: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
3cd0: 6f 6e 20 6e 61 6d 65 73 2e 20 20 54 68 65 73 65  on names.  These
3ce0: 20 73 74 61 74 69 63 0a 2a 2a 20 6e 61 6d 65 73   static.** names
3cf0: 20 61 72 65 20 75 73 65 64 2c 20 72 61 74 68 65   are used, rathe
3d00: 72 20 74 68 61 6e 20 73 74 72 69 6e 67 20 6c 69  r than string li
3d10: 74 65 72 61 6c 73 2c 20 73 6f 20 74 68 61 74 20  terals, so that 
3d20: 46 75 6e 63 44 65 66 20 6f 62 6a 65 63 74 73 0a  FuncDef objects.
3d30: 2a 2a 20 63 61 6e 20 62 65 20 61 73 73 6f 63 69  ** can be associ
3d40: 61 74 65 64 20 77 69 74 68 20 61 20 70 61 72 74  ated with a part
3d50: 69 63 75 6c 61 72 20 77 69 6e 64 6f 77 20 66 75  icular window fu
3d60: 6e 63 74 69 6f 6e 20 62 79 20 64 69 72 65 63 74  nction by direct
3d70: 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  .** comparison o
3d80: 66 20 74 68 65 20 7a 4e 61 6d 65 20 70 6f 69 6e  f the zName poin
3d90: 74 65 72 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a  ter.  Example:.*
3da0: 2a 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 70  *.**       if( p
3db0: 46 75 6e 63 44 65 66 2d 3e 7a 4e 61 6d 65 3d 3d  FuncDef->zName==
3dc0: 72 6f 77 5f 76 61 6c 75 65 4e 61 6d 65 20 29 7b  row_valueName ){
3dd0: 20 2e 2e 2e 20 7d 0a 2a 2f 0a 73 74 61 74 69 63   ... }.*/.static
3de0: 20 63 6f 6e 73 74 20 63 68 61 72 20 72 6f 77 5f   const char row_
3df0: 6e 75 6d 62 65 72 4e 61 6d 65 5b 5d 20 3d 20 20  numberName[] =  
3e00: 20 22 72 6f 77 5f 6e 75 6d 62 65 72 22 3b 0a 73   "row_number";.s
3e10: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
3e20: 20 64 65 6e 73 65 5f 72 61 6e 6b 4e 61 6d 65 5b   dense_rankName[
3e30: 5d 20 3d 20 20 20 22 64 65 6e 73 65 5f 72 61 6e  ] =   "dense_ran
3e40: 6b 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  k";.static const
3e50: 20 63 68 61 72 20 72 61 6e 6b 4e 61 6d 65 5b 5d   char rankName[]
3e60: 20 3d 20 20 20 20 20 20 20 20 20 22 72 61 6e 6b   =         "rank
3e70: 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  ";.static const 
3e80: 63 68 61 72 20 70 65 72 63 65 6e 74 5f 72 61 6e  char percent_ran
3e90: 6b 4e 61 6d 65 5b 5d 20 3d 20 22 70 65 72 63 65  kName[] = "perce
3ea0: 6e 74 5f 72 61 6e 6b 22 3b 0a 73 74 61 74 69 63  nt_rank";.static
3eb0: 20 63 6f 6e 73 74 20 63 68 61 72 20 63 75 6d 65   const char cume
3ec0: 5f 64 69 73 74 4e 61 6d 65 5b 5d 20 3d 20 20 20  _distName[] =   
3ed0: 20 22 63 75 6d 65 5f 64 69 73 74 22 3b 0a 73 74   "cume_dist";.st
3ee0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
3ef0: 6e 74 69 6c 65 4e 61 6d 65 5b 5d 20 3d 20 20 20  ntileName[] =   
3f00: 20 20 20 20 20 22 6e 74 69 6c 65 22 3b 0a 73 74       "ntile";.st
3f10: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
3f20: 6c 61 73 74 5f 76 61 6c 75 65 4e 61 6d 65 5b 5d  last_valueName[]
3f30: 20 3d 20 20 20 22 6c 61 73 74 5f 76 61 6c 75 65   =   "last_value
3f40: 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  ";.static const 
3f50: 63 68 61 72 20 6e 74 68 5f 76 61 6c 75 65 4e 61  char nth_valueNa
3f60: 6d 65 5b 5d 20 3d 20 20 20 20 22 6e 74 68 5f 76  me[] =    "nth_v
3f70: 61 6c 75 65 22 3b 0a 73 74 61 74 69 63 20 63 6f  alue";.static co
3f80: 6e 73 74 20 63 68 61 72 20 66 69 72 73 74 5f 76  nst char first_v
3f90: 61 6c 75 65 4e 61 6d 65 5b 5d 20 3d 20 20 22 66  alueName[] =  "f
3fa0: 69 72 73 74 5f 76 61 6c 75 65 22 3b 0a 73 74 61  irst_value";.sta
3fb0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6c  tic const char l
3fc0: 65 61 64 4e 61 6d 65 5b 5d 20 3d 20 20 20 20 20  eadName[] =     
3fd0: 20 20 20 20 22 6c 65 61 64 22 3b 0a 73 74 61 74      "lead";.stat
3fe0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6c 61  ic const char la
3ff0: 67 4e 61 6d 65 5b 5d 20 3d 20 20 20 20 20 20 20  gName[] =       
4000: 20 20 20 22 6c 61 67 22 3b 0a 0a 2f 2a 0a 2a 2a     "lag";../*.**
4010: 20 4e 6f 2d 6f 70 20 69 6d 70 6c 65 6d 65 6e 74   No-op implement
4020: 61 74 69 6f 6e 73 20 6f 66 20 78 53 74 65 70 28  ations of xStep(
4030: 29 20 61 6e 64 20 78 46 69 6e 61 6c 69 7a 65 28  ) and xFinalize(
4040: 29 2e 20 20 55 73 65 64 20 61 73 20 70 6c 61 63  ).  Used as plac
4050: 65 2d 68 6f 6c 64 65 72 73 0a 2a 2a 20 66 6f 72  e-holders.** for
4060: 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77   built-in window
4070: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
4080: 6e 65 76 65 72 20 63 61 6c 6c 20 74 68 6f 73 65  never call those
4090: 20 69 6e 74 65 72 66 61 63 65 73 2e 0a 2a 2a 0a   interfaces..**.
40a0: 2a 2a 20 54 68 65 20 6e 6f 6f 70 56 61 6c 75 65  ** The noopValue
40b0: 46 75 6e 63 28 29 20 69 73 20 63 61 6c 6c 65 64  Func() is called
40c0: 20 62 75 74 20 69 73 20 65 78 70 65 63 74 65 64   but is expected
40d0: 20 74 6f 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20   to do nothing. 
40e0: 20 54 68 65 0a 2a 2a 20 6e 6f 6f 70 53 74 65 70   The.** noopStep
40f0: 46 75 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20  Func() is never 
4100: 63 61 6c 6c 65 64 2c 20 61 6e 64 20 73 6f 20 69  called, and so i
4110: 74 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  t is marked with
4120: 20 4e 4f 5f 54 45 53 54 20 74 6f 0a 2a 2a 20 6c   NO_TEST to.** l
4130: 65 74 20 74 68 65 20 74 65 73 74 20 63 6f 76 65  et the test cove
4140: 72 61 67 65 20 72 6f 75 74 69 6e 65 20 6b 6e 6f  rage routine kno
4150: 77 20 6e 6f 74 20 74 6f 20 65 78 70 65 63 74 20  w not to expect 
4160: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f  this function to
4170: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2e 0a   be.** invoked..
4180: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e  */.static void n
4190: 6f 6f 70 53 74 65 70 46 75 6e 63 28 20 20 20 20  oopStepFunc(    
41a0: 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 73 71  /*NO_TEST*/.  sq
41b0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
41c0: 2c 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45  ,        /*NO_TE
41d0: 53 54 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20  ST*/.  int n,   
41e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41f0: 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20    /*NO_TEST*/.  
4200: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
4210: 61 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f  a          /*NO_
4220: 54 45 53 54 2a 2f 0a 29 7b 20 20 20 20 20 20 20  TEST*/.){       
4230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4240: 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a      /*NO_TEST*/.
4250: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
4260: 45 52 28 70 29 3b 20 20 20 20 20 20 20 2f 2a 4e  ER(p);       /*N
4270: 4f 5f 54 45 53 54 2a 2f 0a 20 20 55 4e 55 53 45  O_TEST*/.  UNUSE
4280: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 29 3b 20  D_PARAMETER(n); 
4290: 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a        /*NO_TEST*
42a0: 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  /.  UNUSED_PARAM
42b0: 45 54 45 52 28 61 29 3b 20 20 20 20 20 20 20 2f  ETER(a);       /
42c0: 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 61 73 73  *NO_TEST*/.  ass
42d0: 65 72 74 28 30 29 3b 20 20 20 20 20 20 20 20 20  ert(0);         
42e0: 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53          /*NO_TES
42f0: 54 2a 2f 0a 7d 20 20 20 20 20 20 20 20 20 20 20  T*/.}           
4300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4310: 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 73 74 61   /*NO_TEST*/.sta
4320: 74 69 63 20 76 6f 69 64 20 6e 6f 6f 70 56 61 6c  tic void noopVal
4330: 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  ueFunc(sqlite3_c
4340: 6f 6e 74 65 78 74 20 2a 70 29 7b 20 55 4e 55 53  ontext *p){ UNUS
4350: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b  ED_PARAMETER(p);
4360: 20 2f 2a 6e 6f 2d 6f 70 2a 2f 20 7d 0a 0a 2f 2a   /*no-op*/ }../*
4370: 20 57 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   Window function
4380: 73 20 74 68 61 74 20 75 73 65 20 61 6c 6c 20 77  s that use all w
4390: 69 6e 64 6f 77 20 69 6e 74 65 72 66 61 63 65 73  indow interfaces
43a0: 3a 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c  : xStep, xFinal,
43b0: 0a 2a 2a 20 78 56 61 6c 75 65 2c 20 61 6e 64 20  .** xValue, and 
43c0: 78 49 6e 76 65 72 73 65 20 2a 2f 0a 23 64 65 66  xInverse */.#def
43d0: 69 6e 65 20 57 49 4e 44 4f 57 46 55 4e 43 41 4c  ine WINDOWFUNCAL
43e0: 4c 28 6e 61 6d 65 2c 6e 41 72 67 2c 65 78 74 72  L(name,nArg,extr
43f0: 61 29 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  a) {            
4400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4410: 20 20 20 20 20 20 20 5c 0a 20 20 6e 41 72 67 2c         \.  nArg,
4420: 20 28 53 51 4c 49 54 45 5f 55 54 46 38 7c 53 51   (SQLITE_UTF8|SQ
4430: 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57  LITE_FUNC_WINDOW
4440: 7c 65 78 74 72 61 29 2c 20 30 2c 20 30 2c 20 20  |extra), 0, 0,  
4450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4460: 20 20 20 20 5c 0a 20 20 6e 61 6d 65 20 23 23 20      \.  name ## 
4470: 53 74 65 70 46 75 6e 63 2c 20 6e 61 6d 65 20 23  StepFunc, name #
4480: 23 20 46 69 6e 61 6c 69 7a 65 46 75 6e 63 2c 20  # FinalizeFunc, 
4490: 6e 61 6d 65 20 23 23 20 56 61 6c 75 65 46 75 6e  name ## ValueFun
44a0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
44b0: 20 5c 0a 20 20 6e 61 6d 65 20 23 23 20 49 6e 76   \.  name ## Inv
44c0: 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20 4e 61  Func, name ## Na
44d0: 6d 65 2c 20 7b 30 7d 20 20 20 20 20 20 20 20 20  me, {0}         
44e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
4500: 7d 0a 0a 2f 2a 20 57 69 6e 64 6f 77 20 66 75 6e  }../* Window fun
4510: 63 74 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  ctions that are 
4520: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e  implemented usin
4530: 67 20 62 79 74 65 63 6f 64 65 20 61 6e 64 20 74  g bytecode and t
4540: 68 75 73 20 68 61 76 65 0a 2a 2a 20 6e 6f 2d 6f  hus have.** no-o
4550: 70 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 74  p routines for t
4560: 68 65 69 72 20 6d 65 74 68 6f 64 73 20 2a 2f 0a  heir methods */.
4570: 23 64 65 66 69 6e 65 20 57 49 4e 44 4f 57 46 55  #define WINDOWFU
4580: 4e 43 4e 4f 4f 50 28 6e 61 6d 65 2c 6e 41 72 67  NCNOOP(name,nArg
4590: 2c 65 78 74 72 61 29 20 7b 20 20 20 20 20 20 20  ,extra) {       
45a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45b0: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6e             \.  n
45c0: 41 72 67 2c 20 28 53 51 4c 49 54 45 5f 55 54 46  Arg, (SQLITE_UTF
45d0: 38 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49  8|SQLITE_FUNC_WI
45e0: 4e 44 4f 57 7c 65 78 74 72 61 29 2c 20 30 2c 20  NDOW|extra), 0, 
45f0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4600: 20 20 20 20 20 20 20 20 5c 0a 20 20 6e 6f 6f 70          \.  noop
4610: 53 74 65 70 46 75 6e 63 2c 20 6e 6f 6f 70 56 61  StepFunc, noopVa
4620: 6c 75 65 46 75 6e 63 2c 20 6e 6f 6f 70 56 61 6c  lueFunc, noopVal
4630: 75 65 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20  ueFunc,         
4640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4650: 20 20 20 20 20 5c 0a 20 20 6e 6f 6f 70 53 74 65       \.  noopSte
4660: 70 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20 4e  pFunc, name ## N
4670: 61 6d 65 2c 20 7b 30 7d 20 20 20 20 20 20 20 20  ame, {0}        
4680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46a0: 20 20 5c 0a 7d 0a 0a 2f 2a 20 57 69 6e 64 6f 77    \.}../* Window
46b0: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
46c0: 75 73 65 20 61 6c 6c 20 77 69 6e 64 6f 77 20 69  use all window i
46d0: 6e 74 65 72 66 61 63 65 73 3a 20 78 53 74 65 70  nterfaces: xStep
46e0: 2c 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 72 6f  , the.** same ro
46f0: 75 74 69 6e 65 20 66 6f 72 20 78 46 69 6e 61 6c  utine for xFinal
4700: 69 7a 65 20 61 6e 64 20 78 56 61 6c 75 65 20 61  ize and xValue a
4710: 6e 64 20 77 68 69 63 68 20 6e 65 76 65 72 20 63  nd which never c
4720: 61 6c 6c 0a 2a 2a 20 78 49 6e 76 65 72 73 65 2e  all.** xInverse.
4730: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 44   */.#define WIND
4740: 4f 57 46 55 4e 43 58 28 6e 61 6d 65 2c 6e 41 72  OWFUNCX(name,nAr
4750: 67 2c 65 78 74 72 61 29 20 7b 20 20 20 20 20 20  g,extra) {      
4760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
4780: 0a 20 20 6e 41 72 67 2c 20 28 53 51 4c 49 54 45  .  nArg, (SQLITE
4790: 5f 55 54 46 38 7c 53 51 4c 49 54 45 5f 46 55 4e  _UTF8|SQLITE_FUN
47a0: 43 5f 57 49 4e 44 4f 57 7c 65 78 74 72 61 29 2c  C_WINDOW|extra),
47b0: 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 20 20   0, 0,          
47c0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
47d0: 6e 61 6d 65 20 23 23 20 53 74 65 70 46 75 6e 63  name ## StepFunc
47e0: 2c 20 6e 61 6d 65 20 23 23 20 56 61 6c 75 65 46  , name ## ValueF
47f0: 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20 56 61 6c  unc, name ## Val
4800: 75 65 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20  ueFunc,         
4810: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6e 6f 6f           \.  noo
4820: 70 53 74 65 70 46 75 6e 63 2c 20 6e 61 6d 65 20  pStepFunc, name 
4830: 23 23 20 4e 61 6d 65 2c 20 7b 30 7d 20 20 20 20  ## Name, {0}    
4840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4860: 20 20 20 20 20 20 5c 0a 7d 0a 0a 0a 2f 2a 0a 2a        \.}.../*.*
4870: 2a 20 52 65 67 69 73 74 65 72 20 74 68 6f 73 65  * Register those
4880: 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77   built-in window
4890: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
48a0: 61 72 65 20 6e 6f 74 20 61 6c 73 6f 20 61 67 67  are not also agg
48b0: 72 65 67 61 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64  regates..*/.void
48c0: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 46 75   sqlite3WindowFu
48d0: 6e 63 74 69 6f 6e 73 28 76 6f 69 64 29 7b 0a 20  nctions(void){. 
48e0: 20 73 74 61 74 69 63 20 46 75 6e 63 44 65 66 20   static FuncDef 
48f0: 61 57 69 6e 64 6f 77 46 75 6e 63 73 5b 5d 20 3d  aWindowFuncs[] =
4900: 20 7b 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e   {.    WINDOWFUN
4910: 43 58 28 72 6f 77 5f 6e 75 6d 62 65 72 2c 20 30  CX(row_number, 0
4920: 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57  , 0),.    WINDOW
4930: 46 55 4e 43 58 28 64 65 6e 73 65 5f 72 61 6e 6b  FUNCX(dense_rank
4940: 2c 20 30 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e  , 0, 0),.    WIN
4950: 44 4f 57 46 55 4e 43 58 28 72 61 6e 6b 2c 20 30  DOWFUNCX(rank, 0
4960: 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57  , 0),.    WINDOW
4970: 46 55 4e 43 41 4c 4c 28 70 65 72 63 65 6e 74 5f  FUNCALL(percent_
4980: 72 61 6e 6b 2c 20 30 2c 20 30 29 2c 0a 20 20 20  rank, 0, 0),.   
4990: 20 57 49 4e 44 4f 57 46 55 4e 43 41 4c 4c 28 63   WINDOWFUNCALL(c
49a0: 75 6d 65 5f 64 69 73 74 2c 20 30 2c 20 30 29 2c  ume_dist, 0, 0),
49b0: 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 41  .    WINDOWFUNCA
49c0: 4c 4c 28 6e 74 69 6c 65 2c 20 31 2c 20 30 29 2c  LL(ntile, 1, 0),
49d0: 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 41  .    WINDOWFUNCA
49e0: 4c 4c 28 6c 61 73 74 5f 76 61 6c 75 65 2c 20 31  LL(last_value, 1
49f0: 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57  , 0),.    WINDOW
4a00: 46 55 4e 43 41 4c 4c 28 6e 74 68 5f 76 61 6c 75  FUNCALL(nth_valu
4a10: 65 2c 20 32 2c 20 30 29 2c 0a 20 20 20 20 57 49  e, 2, 0),.    WI
4a20: 4e 44 4f 57 46 55 4e 43 41 4c 4c 28 66 69 72 73  NDOWFUNCALL(firs
4a30: 74 5f 76 61 6c 75 65 2c 20 31 2c 20 30 29 2c 0a  t_value, 1, 0),.
4a40: 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f      WINDOWFUNCNO
4a50: 4f 50 28 6c 65 61 64 2c 20 31 2c 20 30 29 2c 0a  OP(lead, 1, 0),.
4a60: 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f      WINDOWFUNCNO
4a70: 4f 50 28 6c 65 61 64 2c 20 32 2c 20 30 29 2c 0a  OP(lead, 2, 0),.
4a80: 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f      WINDOWFUNCNO
4a90: 4f 50 28 6c 65 61 64 2c 20 33 2c 20 30 29 2c 0a  OP(lead, 3, 0),.
4aa0: 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f      WINDOWFUNCNO
4ab0: 4f 50 28 6c 61 67 2c 20 31 2c 20 30 29 2c 0a 20  OP(lag, 1, 0),. 
4ac0: 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f 4f     WINDOWFUNCNOO
4ad0: 50 28 6c 61 67 2c 20 32 2c 20 30 29 2c 0a 20 20  P(lag, 2, 0),.  
4ae0: 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f 4f 50    WINDOWFUNCNOOP
4af0: 28 6c 61 67 2c 20 33 2c 20 30 29 2c 0a 20 20 7d  (lag, 3, 0),.  }
4b00: 3b 0a 20 20 73 71 6c 69 74 65 33 49 6e 73 65 72  ;.  sqlite3Inser
4b10: 74 42 75 69 6c 74 69 6e 46 75 6e 63 73 28 61 57  tBuiltinFuncs(aW
4b20: 69 6e 64 6f 77 46 75 6e 63 73 2c 20 41 72 72 61  indowFuncs, Arra
4b30: 79 53 69 7a 65 28 61 57 69 6e 64 6f 77 46 75 6e  ySize(aWindowFun
4b40: 63 73 29 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  cs));.}..static 
4b50: 57 69 6e 64 6f 77 20 2a 77 69 6e 64 6f 77 46 69  Window *windowFi
4b60: 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  nd(Parse *pParse
4b70: 2c 20 57 69 6e 64 6f 77 20 2a 70 4c 69 73 74 2c  , Window *pList,
4b80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
4b90: 6d 65 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70  me){.  Window *p
4ba0: 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b  ;.  for(p=pList;
4bb0: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 57 69   p; p=p->pNextWi
4bc0: 6e 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  n){.    if( sqli
4bd0: 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 7a 4e  te3StrICmp(p->zN
4be0: 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29  ame, zName)==0 )
4bf0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
4c00: 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ( p==0 ){.    sq
4c10: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
4c20: 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 77  arse, "no such w
4c30: 69 6e 64 6f 77 3a 20 25 73 22 2c 20 7a 4e 61 6d  indow: %s", zNam
4c40: 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
4c50: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   p;.}../*.** Thi
4c60: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
4c70: 6c 6c 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  lled immediately
4c80: 20 61 66 74 65 72 20 72 65 73 6f 6c 76 69 6e 67   after resolving
4c90: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61   the function na
4ca0: 6d 65 0a 2a 2a 20 66 6f 72 20 61 20 77 69 6e 64  me.** for a wind
4cb0: 6f 77 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  ow function with
4cc0: 69 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  in a SELECT stat
4cd0: 65 6d 65 6e 74 2e 20 41 72 67 75 6d 65 6e 74 20  ement. Argument 
4ce0: 70 4c 69 73 74 20 69 73 20 61 0a 2a 2a 20 6c 69  pList is a.** li
4cf0: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 57 49 4e  nked list of WIN
4d00: 44 4f 57 20 64 65 66 69 6e 69 74 69 6f 6e 73 20  DOW definitions 
4d10: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
4d20: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
4d30: 2e 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 46  ..** Argument pF
4d40: 75 6e 63 20 69 73 20 74 68 65 20 66 75 6e 63 74  unc is the funct
4d50: 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 6a  ion definition j
4d60: 75 73 74 20 72 65 73 6f 6c 76 65 64 20 61 6e 64  ust resolved and
4d70: 20 70 57 69 6e 0a 2a 2a 20 69 73 20 74 68 65 20   pWin.** is the 
4d80: 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 72 65  Window object re
4d90: 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 61  presenting the a
4da0: 73 73 6f 63 69 61 74 65 64 20 4f 56 45 52 20 63  ssociated OVER c
4db0: 6c 61 75 73 65 2e 20 54 68 69 73 0a 2a 2a 20 66  lause. This.** f
4dc0: 75 6e 63 74 69 6f 6e 20 75 70 64 61 74 65 73 20  unction updates 
4dd0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
4de0: 70 57 69 6e 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  pWin as follows:
4df0: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68  .**.**   * If th
4e00: 65 20 4f 56 45 52 20 63 6c 61 75 73 65 20 72 65  e OVER clause re
4e10: 66 65 72 65 64 20 74 6f 20 61 20 6e 61 6d 65 64  fered to a named
4e20: 20 77 69 6e 64 6f 77 20 28 61 73 20 69 6e 20 22   window (as in "
4e30: 6d 61 78 28 78 29 20 4f 56 45 52 20 77 69 6e 22  max(x) OVER win"
4e40: 29 2c 0a 2a 2a 20 20 20 20 20 73 65 61 72 63 68  ),.**     search
4e50: 20 6c 69 73 74 20 70 4c 69 73 74 20 66 6f 72 20   list pList for 
4e60: 61 20 6d 61 74 63 68 69 6e 67 20 57 49 4e 44 4f  a matching WINDO
4e70: 57 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 61 6e  W definition, an
4e80: 64 20 75 70 64 61 74 65 20 70 57 69 6e 0a 2a 2a  d update pWin.**
4e90: 20 20 20 20 20 61 63 63 6f 72 64 69 6e 67 6c 79       accordingly
4ea0: 2e 20 49 66 20 6e 6f 20 73 75 63 68 20 57 49 4e  . If no such WIN
4eb0: 44 4f 57 20 63 6c 61 75 73 65 20 63 61 6e 20 62  DOW clause can b
4ec0: 65 20 66 6f 75 6e 64 2c 20 6c 65 61 76 65 20 61  e found, leave a
4ed0: 6e 20 65 72 72 6f 72 0a 2a 2a 20 20 20 20 20 69  n error.**     i
4ee0: 6e 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20  n pParse..**.** 
4ef0: 20 20 2a 20 49 66 20 74 68 65 20 66 75 6e 63 74    * If the funct
4f00: 69 6f 6e 20 69 73 20 61 20 62 75 69 6c 74 2d 69  ion is a built-i
4f10: 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  n window functio
4f20: 6e 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20  n that requires 
4f30: 74 68 65 0a 2a 2a 20 20 20 20 20 77 69 6e 64 6f  the.**     windo
4f40: 77 20 74 6f 20 62 65 20 63 6f 65 72 63 65 64 20  w to be coerced 
4f50: 28 73 65 65 20 22 42 55 49 4c 54 2d 49 4e 20 57  (see "BUILT-IN W
4f60: 49 4e 44 4f 57 20 46 55 4e 43 54 49 4f 4e 53 22  INDOW FUNCTIONS"
4f70: 20 61 74 20 74 68 65 20 74 6f 70 0a 2a 2a 20 20   at the top.**  
4f80: 20 20 20 6f 66 20 74 68 69 73 20 66 69 6c 65 29     of this file)
4f90: 2c 20 70 57 69 6e 20 69 73 20 75 70 64 61 74 65  , pWin is update
4fa0: 64 20 68 65 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20  d here..*/.void 
4fb0: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 55 70 64  sqlite3WindowUpd
4fc0: 61 74 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ate(.  Parse *pP
4fd0: 61 72 73 65 2c 20 0a 20 20 57 69 6e 64 6f 77 20  arse, .  Window 
4fe0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  *pList,         
4ff0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
5000: 20 6f 66 20 6e 61 6d 65 64 20 77 69 6e 64 6f 77   of named window
5010: 73 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43  s for this SELEC
5020: 54 20 2a 2f 0a 20 20 57 69 6e 64 6f 77 20 2a 70  T */.  Window *p
5030: 57 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  Win,            
5040: 20 20 20 20 20 20 20 2f 2a 20 57 69 6e 64 6f 77         /* Window
5050: 20 66 72 61 6d 65 20 74 6f 20 75 70 64 61 74 65   frame to update
5060: 20 2a 2f 0a 20 20 46 75 6e 63 44 65 66 20 2a 70   */.  FuncDef *p
5070: 46 75 6e 63 20 20 20 20 20 20 20 20 20 20 20 20  Func            
5080: 20 20 20 20 20 20 2f 2a 20 57 69 6e 64 6f 77 20        /* Window 
5090: 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74  function definit
50a0: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ion */.){.  if( 
50b0: 70 57 69 6e 2d 3e 7a 4e 61 6d 65 20 26 26 20 70  pWin->zName && p
50c0: 57 69 6e 2d 3e 65 46 72 6d 54 79 70 65 3d 3d 30  Win->eFrmType==0
50d0: 20 29 7b 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a   ){.    Window *
50e0: 70 20 3d 20 77 69 6e 64 6f 77 46 69 6e 64 28 70  p = windowFind(p
50f0: 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 57  Parse, pList, pW
5100: 69 6e 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  in->zName);.    
5110: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
5120: 6e 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70 50 61  n;.    pWin->pPa
5130: 72 74 69 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65  rtition = sqlite
5140: 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 50 61  3ExprListDup(pPa
5150: 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 50 61 72  rse->db, p->pPar
5160: 74 69 74 69 6f 6e 2c 20 30 29 3b 0a 20 20 20 20  tition, 0);.    
5170: 70 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pWin->pOrderBy =
5180: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
5190: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
51a0: 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 30 29 3b  p->pOrderBy, 0);
51b0: 0a 20 20 20 20 70 57 69 6e 2d 3e 70 53 74 61 72  .    pWin->pStar
51c0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
51d0: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
51e0: 2d 3e 70 53 74 61 72 74 2c 20 30 29 3b 0a 20 20  ->pStart, 0);.  
51f0: 20 20 70 57 69 6e 2d 3e 70 45 6e 64 20 3d 20 73    pWin->pEnd = s
5200: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50  qlite3ExprDup(pP
5210: 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 45 6e  arse->db, p->pEn
5220: 64 2c 20 30 29 3b 0a 20 20 20 20 70 57 69 6e 2d  d, 0);.    pWin-
5230: 3e 65 53 74 61 72 74 20 3d 20 70 2d 3e 65 53 74  >eStart = p->eSt
5240: 61 72 74 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 65  art;.    pWin->e
5250: 45 6e 64 20 3d 20 70 2d 3e 65 45 6e 64 3b 0a 20  End = p->eEnd;. 
5260: 20 20 20 70 57 69 6e 2d 3e 65 46 72 6d 54 79 70     pWin->eFrmTyp
5270: 65 20 3d 20 70 2d 3e 65 46 72 6d 54 79 70 65 3b  e = p->eFrmType;
5280: 0a 20 20 20 20 70 57 69 6e 2d 3e 65 45 78 63 6c  .    pWin->eExcl
5290: 75 64 65 20 3d 20 70 2d 3e 65 45 78 63 6c 75 64  ude = p->eExclud
52a0: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
52b0: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 68 61  sqlite3WindowCha
52c0: 69 6e 28 70 50 61 72 73 65 2c 20 70 57 69 6e 2c  in(pParse, pWin,
52d0: 20 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69   pList);.  }.  i
52e0: 66 28 20 28 70 57 69 6e 2d 3e 65 46 72 6d 54 79  f( (pWin->eFrmTy
52f0: 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 29 0a 20 20  pe==TK_RANGE).  
5300: 20 26 26 20 28 70 57 69 6e 2d 3e 70 53 74 61 72   && (pWin->pStar
5310: 74 20 7c 7c 20 70 57 69 6e 2d 3e 70 45 6e 64 29  t || pWin->pEnd)
5320: 20 0a 20 20 20 26 26 20 28 70 57 69 6e 2d 3e 70   .   && (pWin->p
5330: 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 57  OrderBy==0 || pW
5340: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  in->pOrderBy->nE
5350: 78 70 72 21 3d 31 29 0a 20 20 29 7b 0a 20 20 20  xpr!=1).  ){.   
5360: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
5370: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
5380: 22 52 41 4e 47 45 20 77 69 74 68 20 6f 66 66 73  "RANGE with offs
5390: 65 74 20 50 52 45 43 45 44 49 4e 47 2f 46 4f 4c  et PRECEDING/FOL
53a0: 4c 4f 57 49 4e 47 20 72 65 71 75 69 72 65 73 20  LOWING requires 
53b0: 6f 6e 65 20 4f 52 44 45 52 20 42 59 20 65 78 70  one ORDER BY exp
53c0: 72 65 73 73 69 6f 6e 22 0a 20 20 20 20 29 3b 0a  ression".    );.
53d0: 20 20 7d 65 6c 73 65 0a 20 20 69 66 28 20 70 46    }else.  if( pF
53e0: 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  unc->funcFlags &
53f0: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e   SQLITE_FUNC_WIN
5400: 44 4f 57 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  DOW ){.    sqlit
5410: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
5420: 3e 64 62 3b 0a 20 20 20 20 69 66 28 20 70 57 69  >db;.    if( pWi
5430: 6e 2d 3e 70 46 69 6c 74 65 72 20 29 7b 0a 20 20  n->pFilter ){.  
5440: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
5450: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
5460: 20 20 20 20 20 20 20 22 46 49 4c 54 45 52 20 63         "FILTER c
5470: 6c 61 75 73 65 20 6d 61 79 20 6f 6e 6c 79 20 62  lause may only b
5480: 65 20 75 73 65 64 20 77 69 74 68 20 61 67 67 72  e used with aggr
5490: 65 67 61 74 65 20 77 69 6e 64 6f 77 20 66 75 6e  egate window fun
54a0: 63 74 69 6f 6e 73 22 0a 20 20 20 20 20 20 29 3b  ctions".      );
54b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
54c0: 20 20 73 74 72 75 63 74 20 57 69 6e 64 6f 77 55    struct WindowU
54d0: 70 64 61 74 65 20 7b 0a 20 20 20 20 20 20 20 20  pdate {.        
54e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
54f0: 63 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65  c;.        int e
5500: 46 72 6d 54 79 70 65 3b 0a 20 20 20 20 20 20 20  FrmType;.       
5510: 20 69 6e 74 20 65 53 74 61 72 74 3b 0a 20 20 20   int eStart;.   
5520: 20 20 20 20 20 69 6e 74 20 65 45 6e 64 3b 0a 20       int eEnd;. 
5530: 20 20 20 20 20 7d 20 61 55 70 5b 5d 20 3d 20 7b       } aUp[] = {
5540: 0a 20 20 20 20 20 20 20 20 7b 20 72 6f 77 5f 6e  .        { row_n
5550: 75 6d 62 65 72 4e 61 6d 65 2c 20 20 20 54 4b 5f  umberName,   TK_
5560: 52 4f 57 53 2c 20 20 20 54 4b 5f 55 4e 42 4f 55  ROWS,   TK_UNBOU
5570: 4e 44 45 44 2c 20 54 4b 5f 43 55 52 52 45 4e 54  NDED, TK_CURRENT
5580: 20 7d 2c 20 0a 20 20 20 20 20 20 20 20 7b 20 64   }, .        { d
5590: 65 6e 73 65 5f 72 61 6e 6b 4e 61 6d 65 2c 20 20  ense_rankName,  
55a0: 20 54 4b 5f 52 41 4e 47 45 2c 20 20 54 4b 5f 55   TK_RANGE,  TK_U
55b0: 4e 42 4f 55 4e 44 45 44 2c 20 54 4b 5f 43 55 52  NBOUNDED, TK_CUR
55c0: 52 45 4e 54 20 7d 2c 20 0a 20 20 20 20 20 20 20  RENT }, .       
55d0: 20 7b 20 72 61 6e 6b 4e 61 6d 65 2c 20 20 20 20   { rankName,    
55e0: 20 20 20 20 20 54 4b 5f 52 41 4e 47 45 2c 20 20       TK_RANGE,  
55f0: 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 2c 20 54 4b  TK_UNBOUNDED, TK
5600: 5f 43 55 52 52 45 4e 54 20 7d 2c 20 0a 20 20 20  _CURRENT }, .   
5610: 20 20 20 20 20 7b 20 70 65 72 63 65 6e 74 5f 72       { percent_r
5620: 61 6e 6b 4e 61 6d 65 2c 20 54 4b 5f 47 52 4f 55  ankName, TK_GROU
5630: 50 53 2c 20 54 4b 5f 43 55 52 52 45 4e 54 2c 20  PS, TK_CURRENT, 
5640: 20 20 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 7d    TK_UNBOUNDED }
5650: 2c 20 0a 20 20 20 20 20 20 20 20 7b 20 63 75 6d  , .        { cum
5660: 65 5f 64 69 73 74 4e 61 6d 65 2c 20 20 20 20 54  e_distName,    T
5670: 4b 5f 47 52 4f 55 50 53 2c 20 54 4b 5f 46 4f 4c  K_GROUPS, TK_FOL
5680: 4c 4f 57 49 4e 47 2c 20 54 4b 5f 55 4e 42 4f 55  LOWING, TK_UNBOU
5690: 4e 44 45 44 20 7d 2c 20 0a 20 20 20 20 20 20 20  NDED }, .       
56a0: 20 7b 20 6e 74 69 6c 65 4e 61 6d 65 2c 20 20 20   { ntileName,   
56b0: 20 20 20 20 20 54 4b 5f 52 4f 57 53 2c 20 20 20       TK_ROWS,   
56c0: 54 4b 5f 43 55 52 52 45 4e 54 2c 20 20 20 54 4b  TK_CURRENT,   TK
56d0: 5f 55 4e 42 4f 55 4e 44 45 44 20 7d 2c 20 0a 20  _UNBOUNDED }, . 
56e0: 20 20 20 20 20 20 20 7b 20 6c 65 61 64 4e 61 6d         { leadNam
56f0: 65 2c 20 20 20 20 20 20 20 20 20 54 4b 5f 52 4f  e,         TK_RO
5700: 57 53 2c 20 20 20 54 4b 5f 55 4e 42 4f 55 4e 44  WS,   TK_UNBOUND
5710: 45 44 2c 20 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  ED, TK_UNBOUNDED
5720: 20 7d 2c 20 0a 20 20 20 20 20 20 20 20 7b 20 6c   }, .        { l
5730: 61 67 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  agName,         
5740: 20 54 4b 5f 52 4f 57 53 2c 20 20 20 54 4b 5f 55   TK_ROWS,   TK_U
5750: 4e 42 4f 55 4e 44 45 44 2c 20 54 4b 5f 43 55 52  NBOUNDED, TK_CUR
5760: 52 45 4e 54 20 7d 2c 20 0a 20 20 20 20 20 20 7d  RENT }, .      }
5770: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
5780: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
5790: 41 72 72 61 79 53 69 7a 65 28 61 55 70 29 3b 20  ArraySize(aUp); 
57a0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
57b0: 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d  ( pFunc->zName==
57c0: 61 55 70 5b 69 5d 2e 7a 46 75 6e 63 20 29 7b 0a  aUp[i].zFunc ){.
57d0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
57e0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
57f0: 70 57 69 6e 2d 3e 70 53 74 61 72 74 29 3b 0a 20  pWin->pStart);. 
5800: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
5810: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
5820: 57 69 6e 2d 3e 70 45 6e 64 29 3b 0a 20 20 20 20  Win->pEnd);.    
5830: 20 20 20 20 20 20 70 57 69 6e 2d 3e 70 45 6e 64        pWin->pEnd
5840: 20 3d 20 70 57 69 6e 2d 3e 70 53 74 61 72 74 20   = pWin->pStart 
5850: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 0;.          p
5860: 57 69 6e 2d 3e 65 46 72 6d 54 79 70 65 20 3d 20  Win->eFrmType = 
5870: 61 55 70 5b 69 5d 2e 65 46 72 6d 54 79 70 65 3b  aUp[i].eFrmType;
5880: 0a 20 20 20 20 20 20 20 20 20 20 70 57 69 6e 2d  .          pWin-
5890: 3e 65 53 74 61 72 74 20 3d 20 61 55 70 5b 69 5d  >eStart = aUp[i]
58a0: 2e 65 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20  .eStart;.       
58b0: 20 20 20 70 57 69 6e 2d 3e 65 45 6e 64 20 3d 20     pWin->eEnd = 
58c0: 61 55 70 5b 69 5d 2e 65 45 6e 64 3b 0a 20 20 20  aUp[i].eEnd;.   
58d0: 20 20 20 20 20 20 20 70 57 69 6e 2d 3e 65 45 78         pWin->eEx
58e0: 63 6c 75 64 65 20 3d 20 30 3b 0a 20 20 20 20 20  clude = 0;.     
58f0: 20 20 20 20 20 69 66 28 20 70 57 69 6e 2d 3e 65       if( pWin->e
5900: 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57  Start==TK_FOLLOW
5910: 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ING ){.         
5920: 20 20 20 70 57 69 6e 2d 3e 70 53 74 61 72 74 20     pWin->pStart 
5930: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
5940: 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 22 31  , TK_INTEGER, "1
5950: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ");.          }.
5960: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
5970: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5980: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70   }.    }.  }.  p
5990: 57 69 6e 2d 3e 70 46 75 6e 63 20 3d 20 70 46 75  Win->pFunc = pFu
59a0: 6e 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  nc;.}../*.** Con
59b0: 74 65 78 74 20 6f 62 6a 65 63 74 20 70 61 73 73  text object pass
59c0: 65 64 20 74 68 72 6f 75 67 68 20 73 71 6c 69 74  ed through sqlit
59d0: 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 29  e3WalkExprList()
59e0: 20 74 6f 0a 2a 2a 20 73 65 6c 65 63 74 57 69 6e   to.** selectWin
59f0: 64 6f 77 52 65 77 72 69 74 65 45 78 70 72 43 62  dowRewriteExprCb
5a00: 28 29 20 62 79 20 73 65 6c 65 63 74 57 69 6e 64  () by selectWind
5a10: 6f 77 52 65 77 72 69 74 65 45 4c 69 73 74 28 29  owRewriteEList()
5a20: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
5a30: 75 63 74 20 57 69 6e 64 6f 77 52 65 77 72 69 74  uct WindowRewrit
5a40: 65 20 57 69 6e 64 6f 77 52 65 77 72 69 74 65 3b  e WindowRewrite;
5a50: 0a 73 74 72 75 63 74 20 57 69 6e 64 6f 77 52 65  .struct WindowRe
5a60: 77 72 69 74 65 20 7b 0a 20 20 57 69 6e 64 6f 77  write {.  Window
5a70: 20 2a 70 57 69 6e 3b 0a 20 20 53 72 63 4c 69 73   *pWin;.  SrcLis
5a80: 74 20 2a 70 53 72 63 3b 0a 20 20 45 78 70 72 4c  t *pSrc;.  ExprL
5a90: 69 73 74 20 2a 70 53 75 62 3b 0a 20 20 53 65 6c  ist *pSub;.  Sel
5aa0: 65 63 74 20 2a 70 53 75 62 53 65 6c 65 63 74 3b  ect *pSubSelect;
5ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5ac0: 43 75 72 72 65 6e 74 20 73 75 62 2d 73 65 6c 65  Current sub-sele
5ad0: 63 74 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 7d 3b  ct, if any */.};
5ae0: 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 62 61 63 6b  ../*.** Callback
5af0: 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 64 20 62   function used b
5b00: 79 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65  y selectWindowRe
5b10: 77 72 69 74 65 45 4c 69 73 74 28 29 2e 20 49 66  writeEList(). If
5b20: 20 6e 65 63 65 73 73 61 72 79 2c 0a 2a 2a 20 74   necessary,.** t
5b30: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 70 70  his function app
5b40: 65 6e 64 73 20 74 6f 20 74 68 65 20 6f 75 74 70  ends to the outp
5b50: 75 74 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69  ut expression-li
5b60: 73 74 20 61 6e 64 20 75 70 64 61 74 65 73 20 0a  st and updates .
5b70: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 28 2a  ** expression (*
5b80: 70 70 45 78 70 72 29 20 69 6e 20 70 6c 61 63 65  ppExpr) in place
5b90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5ba0: 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72  selectWindowRewr
5bb0: 69 74 65 45 78 70 72 43 62 28 57 61 6c 6b 65 72  iteExprCb(Walker
5bc0: 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
5bd0: 2a 70 45 78 70 72 29 7b 0a 20 20 73 74 72 75 63  *pExpr){.  struc
5be0: 74 20 57 69 6e 64 6f 77 52 65 77 72 69 74 65 20  t WindowRewrite 
5bf0: 2a 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  *p = pWalker->u.
5c00: 70 52 65 77 72 69 74 65 3b 0a 20 20 50 61 72 73  pRewrite;.  Pars
5c10: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c  e *pParse = pWal
5c20: 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 0a 20 20  ker->pParse;..  
5c30: 2f 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74  /* If this funct
5c40: 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c  ion is being cal
5c50: 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  led from within 
5c60: 61 20 73 63 61 6c 61 72 20 73 75 62 2d 73 65 6c  a scalar sub-sel
5c70: 65 63 74 0a 20 20 2a 2a 20 74 68 61 74 20 75 73  ect.  ** that us
5c80: 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54  ed by the SELECT
5c90: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
5ca0: 20 70 72 6f 63 65 73 73 65 64 2c 20 6f 6e 6c 79   processed, only
5cb0: 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 54 4b   process.  ** TK
5cc0: 5f 43 4f 4c 55 4d 4e 20 65 78 70 72 65 73 73 69  _COLUMN expressi
5cd0: 6f 6e 73 20 74 68 61 74 20 72 65 66 65 72 20 74  ons that refer t
5ce0: 6f 20 69 74 20 28 74 68 65 20 6f 75 74 65 72 20  o it (the outer 
5cf0: 53 45 4c 45 43 54 29 2e 20 44 6f 0a 20 20 2a 2a  SELECT). Do.  **
5d00: 20 6e 6f 74 20 70 72 6f 63 65 73 73 20 61 67 67   not process agg
5d10: 72 65 67 61 74 65 73 20 6f 72 20 77 69 6e 64 6f  regates or windo
5d20: 77 20 66 75 6e 63 74 69 6f 6e 73 20 61 74 20 61  w functions at a
5d30: 6c 6c 2c 20 61 73 20 74 68 65 79 20 62 65 6c 6f  ll, as they belo
5d40: 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 73  ng.  ** to the s
5d50: 63 61 6c 61 72 20 73 75 62 2d 73 65 6c 65 63 74  calar sub-select
5d60: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
5d70: 53 75 62 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  SubSelect ){.   
5d80: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
5d90: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
5da0: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
5db0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 65 6c 73  ntinue;.    }els
5dc0: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 72  e{.      int nSr
5dd0: 63 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72  c = p->pSrc->nSr
5de0: 63 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  c;.      int i;.
5df0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
5e00: 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nSrc; i++){.   
5e10: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
5e20: 69 54 61 62 6c 65 3d 3d 70 2d 3e 70 53 72 63 2d  iTable==p->pSrc-
5e30: 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 29 20  >a[i].iCursor ) 
5e40: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
5e50: 20 20 20 20 20 69 66 28 20 69 3d 3d 6e 53 72 63       if( i==nSrc
5e60: 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f   ) return WRC_Co
5e70: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
5e80: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  }..  switch( pEx
5e90: 70 72 2d 3e 6f 70 20 29 7b 0a 0a 20 20 20 20 63  pr->op ){..    c
5ea0: 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
5eb0: 0a 20 20 20 20 20 20 69 66 28 20 21 45 78 70 72  .      if( !Expr
5ec0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
5ed0: 72 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29  r, EP_WinFunc) )
5ee0: 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
5ef0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5f00: 20 20 20 20 20 20 57 69 6e 64 6f 77 20 2a 70 57        Window *pW
5f10: 69 6e 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  in;.        for(
5f20: 70 57 69 6e 3d 70 2d 3e 70 57 69 6e 3b 20 70 57  pWin=p->pWin; pW
5f30: 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70  in; pWin=pWin->p
5f40: 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 20 20  NextWin){.      
5f50: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 79      if( pExpr->y
5f60: 2e 70 57 69 6e 3d 3d 70 57 69 6e 20 29 7b 0a 20  .pWin==pWin ){. 
5f70: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
5f80: 74 28 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 3d  t( pWin->pOwner=
5f90: 3d 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  =pExpr );.      
5fa0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
5fb0: 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 20 20  _Prune;.        
5fc0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
5fd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46      }.      /* F
5fe0: 61 6c 6c 20 74 68 72 6f 75 67 68 2e 20 20 2a 2f  all through.  */
5ff0: 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  ..    case TK_AG
6000: 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  G_FUNCTION:.    
6010: 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
6020: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 44  {.      Expr *pD
6030: 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  up = sqlite3Expr
6040: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
6050: 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  pExpr, 0);.     
6060: 20 70 2d 3e 70 53 75 62 20 3d 20 73 71 6c 69 74   p->pSub = sqlit
6070: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
6080: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 53 75 62  (pParse, p->pSub
6090: 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 69  , pDup);.      i
60a0: 66 28 20 70 2d 3e 70 53 75 62 20 29 7b 0a 20 20  f( p->pSub ){.  
60b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78        assert( Ex
60c0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
60d0: 78 70 72 2c 20 45 50 5f 53 74 61 74 69 63 29 3d  xpr, EP_Static)=
60e0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 45 78  =0 );.        Ex
60f0: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
6100: 78 70 72 2c 20 45 50 5f 53 74 61 74 69 63 29 3b  xpr, EP_Static);
6110: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6120: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
6130: 65 2d 3e 64 62 2c 20 70 45 78 70 72 29 3b 0a 20  e->db, pExpr);. 
6140: 20 20 20 20 20 20 20 45 78 70 72 43 6c 65 61 72         ExprClear
6150: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
6160: 45 50 5f 53 74 61 74 69 63 29 3b 0a 20 20 20 20  EP_Static);.    
6170: 20 20 20 20 6d 65 6d 73 65 74 28 70 45 78 70 72      memset(pExpr
6180: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  , 0, sizeof(Expr
6190: 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 70 45 78  ));..        pEx
61a0: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55  pr->op = TK_COLU
61b0: 4d 4e 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70  MN;.        pExp
61c0: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 2d 3e  r->iColumn = p->
61d0: 70 53 75 62 2d 3e 6e 45 78 70 72 2d 31 3b 0a 20  pSub->nExpr-1;. 
61e0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
61f0: 61 62 6c 65 20 3d 20 70 2d 3e 70 57 69 6e 2d 3e  able = p->pWin->
6200: 69 45 70 68 43 73 72 3b 0a 20 20 20 20 20 20 7d  iEphCsr;.      }
6210: 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ..      break;. 
6220: 20 20 20 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c     }..    defaul
6230: 74 3a 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20  t: /* no-op */. 
6240: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
6250: 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
6260: 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63  ntinue;.}.static
6270: 20 69 6e 74 20 73 65 6c 65 63 74 57 69 6e 64 6f   int selectWindo
6280: 77 52 65 77 72 69 74 65 53 65 6c 65 63 74 43 62  wRewriteSelectCb
6290: 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
62a0: 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
62b0: 74 29 7b 0a 20 20 73 74 72 75 63 74 20 57 69 6e  t){.  struct Win
62c0: 64 6f 77 52 65 77 72 69 74 65 20 2a 70 20 3d 20  dowRewrite *p = 
62d0: 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 52 65 77 72  pWalker->u.pRewr
62e0: 69 74 65 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  ite;.  Select *p
62f0: 53 61 76 65 20 3d 20 70 2d 3e 70 53 75 62 53 65  Save = p->pSubSe
6300: 6c 65 63 74 3b 0a 20 20 69 66 28 20 70 53 61 76  lect;.  if( pSav
6310: 65 3d 3d 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  e==pSelect ){.  
6320: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
6330: 74 69 6e 75 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tinue;.  }else{.
6340: 20 20 20 20 70 2d 3e 70 53 75 62 53 65 6c 65 63      p->pSubSelec
6350: 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20 20  t = pSelect;.   
6360: 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
6370: 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c  ct(pWalker, pSel
6380: 65 63 74 29 3b 0a 20 20 20 20 70 2d 3e 70 53 75  ect);.    p->pSu
6390: 62 53 65 6c 65 63 74 20 3d 20 70 53 61 76 65 3b  bSelect = pSave;
63a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
63b0: 43 5f 50 72 75 6e 65 3b 0a 7d 0a 0a 0a 2f 2a 0a  C_Prune;.}.../*.
63c0: 2a 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75  ** Iterate throu
63d0: 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69  gh each expressi
63e0: 6f 6e 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  on in expression
63f0: 2d 6c 69 73 74 20 70 45 4c 69 73 74 2e 20 46 6f  -list pEList. Fo
6400: 72 20 65 61 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20  r each:.**.**   
6410: 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 2c 0a 2a 2a 20  * TK_COLUMN,.** 
6420: 20 20 2a 20 61 67 67 72 65 67 61 74 65 20 66 75    * aggregate fu
6430: 6e 63 74 69 6f 6e 2c 20 6f 72 0a 2a 2a 20 20 20  nction, or.**   
6440: 2a 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  * window functio
6450: 6e 20 77 69 74 68 20 61 20 57 69 6e 64 6f 77 20  n with a Window 
6460: 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73 20 6e  object that is n
6470: 6f 74 20 61 20 6d 65 6d 62 65 72 20 6f 66 20 74  ot a member of t
6480: 68 65 20 0a 2a 2a 20 20 20 20 20 57 69 6e 64 6f  he .**     Windo
6490: 77 20 6c 69 73 74 20 70 61 73 73 65 64 20 61 73  w list passed as
64a0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
64b0: 6d 65 6e 74 20 28 70 57 69 6e 29 2e 0a 2a 2a 0a  ment (pWin)..**.
64c0: 2a 2a 20 41 70 70 65 6e 64 20 74 68 65 20 6e 6f  ** Append the no
64d0: 64 65 20 74 6f 20 6f 75 74 70 75 74 20 65 78 70  de to output exp
64e0: 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 28 2a 70  ression-list (*p
64f0: 70 53 75 62 29 2e 20 41 6e 64 20 72 65 70 6c 61  pSub). And repla
6500: 63 65 20 69 74 0a 2a 2a 20 77 69 74 68 20 61 20  ce it.** with a 
6510: 54 4b 5f 43 4f 4c 55 4d 4e 20 74 68 61 74 20 72  TK_COLUMN that r
6520: 65 61 64 73 20 74 68 65 20 28 4e 2d 31 29 74 68  eads the (N-1)th
6530: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 61 62 6c   element of tabl
6540: 65 20 0a 2a 2a 20 70 57 69 6e 2d 3e 69 45 70 68  e .** pWin->iEph
6550: 43 73 72 2c 20 77 68 65 72 65 20 4e 20 69 73 20  Csr, where N is 
6560: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
6570: 65 6d 65 6e 74 73 20 69 6e 20 28 2a 70 70 53 75  ements in (*ppSu
6580: 62 29 20 61 66 74 65 72 0a 2a 2a 20 61 70 70 65  b) after.** appe
6590: 6e 64 69 6e 67 20 74 68 65 20 6e 65 77 20 6f 6e  nding the new on
65a0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
65b0: 64 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65  d selectWindowRe
65c0: 77 72 69 74 65 45 4c 69 73 74 28 0a 20 20 50 61  writeEList(.  Pa
65d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20  rse *pParse, .  
65e0: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 2c 0a 20 20  Window *pWin,.  
65f0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 0a 20  SrcList *pSrc,. 
6600: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
6610: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
6620: 20 2f 2a 20 52 65 77 72 69 74 65 20 65 78 70 72   /* Rewrite expr
6630: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 69 73 20  essions in this 
6640: 6c 69 73 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  list */.  ExprLi
6650: 73 74 20 2a 2a 70 70 53 75 62 20 20 20 20 20 20  st **ppSub      
6660: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
6670: 4f 55 54 3a 20 53 75 62 2d 73 65 6c 65 63 74 20  OUT: Sub-select 
6680: 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20  expression-list 
6690: 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65 72 20 73  */.){.  Walker s
66a0: 57 61 6c 6b 65 72 3b 0a 20 20 57 69 6e 64 6f 77  Walker;.  Window
66b0: 52 65 77 72 69 74 65 20 73 52 65 77 72 69 74 65  Rewrite sRewrite
66c0: 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 61  ;..  memset(&sWa
66d0: 6c 6b 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  lker, 0, sizeof(
66e0: 57 61 6c 6b 65 72 29 29 3b 0a 20 20 6d 65 6d 73  Walker));.  mems
66f0: 65 74 28 26 73 52 65 77 72 69 74 65 2c 20 30 2c  et(&sRewrite, 0,
6700: 20 73 69 7a 65 6f 66 28 57 69 6e 64 6f 77 52 65   sizeof(WindowRe
6710: 77 72 69 74 65 29 29 3b 0a 0a 20 20 73 52 65 77  write));..  sRew
6720: 72 69 74 65 2e 70 53 75 62 20 3d 20 2a 70 70 53  rite.pSub = *ppS
6730: 75 62 3b 0a 20 20 73 52 65 77 72 69 74 65 2e 70  ub;.  sRewrite.p
6740: 57 69 6e 20 3d 20 70 57 69 6e 3b 0a 20 20 73 52  Win = pWin;.  sR
6750: 65 77 72 69 74 65 2e 70 53 72 63 20 3d 20 70 53  ewrite.pSrc = pS
6760: 72 63 3b 0a 0a 20 20 73 57 61 6c 6b 65 72 2e 70  rc;..  sWalker.p
6770: 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
6780: 20 20 73 57 61 6c 6b 65 72 2e 78 45 78 70 72 43    sWalker.xExprC
6790: 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74  allback = select
67a0: 57 69 6e 64 6f 77 52 65 77 72 69 74 65 45 78 70  WindowRewriteExp
67b0: 72 43 62 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 78  rCb;.  sWalker.x
67c0: 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
67d0: 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77   selectWindowRew
67e0: 72 69 74 65 53 65 6c 65 63 74 43 62 3b 0a 20 20  riteSelectCb;.  
67f0: 73 57 61 6c 6b 65 72 2e 75 2e 70 52 65 77 72 69  sWalker.u.pRewri
6800: 74 65 20 3d 20 26 73 52 65 77 72 69 74 65 3b 0a  te = &sRewrite;.
6810: 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33  .  (void)sqlite3
6820: 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 26 73 57  WalkExprList(&sW
6830: 61 6c 6b 65 72 2c 20 70 45 4c 69 73 74 29 3b 0a  alker, pEList);.
6840: 0a 20 20 2a 70 70 53 75 62 20 3d 20 73 52 65 77  .  *ppSub = sRew
6850: 72 69 74 65 2e 70 53 75 62 3b 0a 7d 0a 0a 2f 2a  rite.pSub;.}../*
6860: 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 63 6f 70  .** Append a cop
6870: 79 20 6f 66 20 65 61 63 68 20 65 78 70 72 65 73  y of each expres
6880: 73 69 6f 6e 20 69 6e 20 65 78 70 72 65 73 73 69  sion in expressi
6890: 6f 6e 2d 6c 69 73 74 20 70 41 70 70 65 6e 64 20  on-list pAppend 
68a0: 74 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  to.** expression
68b0: 20 6c 69 73 74 20 70 4c 69 73 74 2e 20 52 65 74   list pList. Ret
68c0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
68d0: 20 74 68 65 20 72 65 73 75 6c 74 20 6c 69 73 74   the result list
68e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72  ..*/.static Expr
68f0: 4c 69 73 74 20 2a 65 78 70 72 4c 69 73 74 41 70  List *exprListAp
6900: 70 65 6e 64 4c 69 73 74 28 0a 20 20 50 61 72 73  pendList(.  Pars
6910: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
6920: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
6930: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
6940: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
6950: 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77      /* List to w
6960: 68 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20  hich to append. 
6970: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
6980: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 41 70  .  ExprList *pAp
6990: 70 65 6e 64 20 20 20 20 20 20 20 2f 2a 20 4c 69  pend       /* Li
69a0: 73 74 20 6f 66 20 76 61 6c 75 65 73 20 74 6f 20  st of values to 
69b0: 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65  append. Might be
69c0: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66   NULL */.){.  if
69d0: 28 20 70 41 70 70 65 6e 64 20 29 7b 0a 20 20 20  ( pAppend ){.   
69e0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
69f0: 6e 49 6e 69 74 20 3d 20 70 4c 69 73 74 20 3f 20  nInit = pList ? 
6a00: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
6a10: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
6a20: 3c 70 41 70 70 65 6e 64 2d 3e 6e 45 78 70 72 3b  <pAppend->nExpr;
6a30: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
6a40: 72 20 2a 70 44 75 70 20 3d 20 73 71 6c 69 74 65  r *pDup = sqlite
6a50: 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d  3ExprDup(pParse-
6a60: 3e 64 62 2c 20 70 41 70 70 65 6e 64 2d 3e 61 5b  >db, pAppend->a[
6a70: 69 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  i].pExpr, 0);.  
6a80: 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
6a90: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
6aa0: 64 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c  d(pParse, pList,
6ab0: 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 69 66   pDup);.      if
6ac0: 28 20 70 4c 69 73 74 20 29 20 70 4c 69 73 74 2d  ( pList ) pList-
6ad0: 3e 61 5b 6e 49 6e 69 74 2b 69 5d 2e 73 6f 72 74  >a[nInit+i].sort
6ae0: 4f 72 64 65 72 20 3d 20 70 41 70 70 65 6e 64 2d  Order = pAppend-
6af0: 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
6b00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
6b10: 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
6b20: 0a 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43  .** If the SELEC
6b30: 54 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  T statement pass
6b40: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
6b50: 20 61 72 67 75 6d 65 6e 74 20 64 6f 65 73 20 6e   argument does n
6b60: 6f 74 20 69 6e 76 6f 6b 65 0a 2a 2a 20 61 6e 79  ot invoke.** any
6b70: 20 53 51 4c 20 77 69 6e 64 6f 77 20 66 75 6e 63   SQL window func
6b80: 74 69 6f 6e 73 2c 20 74 68 69 73 20 66 75 6e 63  tions, this func
6b90: 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
6ba0: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 0a   Otherwise, it .
6bb0: 2a 2a 20 72 65 77 72 69 74 65 73 20 74 68 65 20  ** rewrites the 
6bc0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
6bd0: 20 73 6f 20 74 68 61 74 20 77 69 6e 64 6f 77 20   so that window 
6be0: 66 75 6e 63 74 69 6f 6e 20 78 53 74 65 70 20 66  function xStep f
6bf0: 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 61 72 65 20  unctions.** are 
6c00: 69 6e 76 6f 6b 65 64 20 69 6e 20 74 68 65 20 63  invoked in the c
6c10: 6f 72 72 65 63 74 20 6f 72 64 65 72 20 61 73 20  orrect order as 
6c20: 64 65 73 63 72 69 62 65 64 20 75 6e 64 65 72 20  described under 
6c30: 22 53 45 4c 45 43 54 20 52 45 57 52 49 54 49 4e  "SELECT REWRITIN
6c40: 47 22 0a 2a 2a 20 61 74 20 74 68 65 20 74 6f 70  G".** at the top
6c50: 20 6f 66 20 74 68 69 73 20 66 69 6c 65 2e 0a 2a   of this file..*
6c60: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 69 6e  /.int sqlite3Win
6c70: 64 6f 77 52 65 77 72 69 74 65 28 50 61 72 73 65  dowRewrite(Parse
6c80: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
6c90: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d   *p){.  int rc =
6ca0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
6cb0: 28 20 70 2d 3e 70 57 69 6e 20 26 26 20 70 2d 3e  ( p->pWin && p->
6cc0: 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20  pPrior==0 ){.   
6cd0: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
6ce0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
6cf0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  );.    sqlite3 *
6d00: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
6d10: 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75  .    Select *pSu
6d20: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
6d30: 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65     /* The subque
6d40: 72 79 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73  ry */.    SrcLis
6d50: 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  t *pSrc = p->pSr
6d60: 63 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 57 68  c;.    Expr *pWh
6d70: 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ere = p->pWhere;
6d80: 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
6d90: 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
6da0: 6f 75 70 42 79 3b 0a 20 20 20 20 45 78 70 72 20  oupBy;.    Expr 
6db0: 2a 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48  *pHaving = p->pH
6dc0: 61 76 69 6e 67 3b 0a 20 20 20 20 45 78 70 72 4c  aving;.    ExprL
6dd0: 69 73 74 20 2a 70 53 6f 72 74 20 3d 20 30 3b 0a  ist *pSort = 0;.
6de0: 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
6df0: 53 75 62 6c 69 73 74 20 3d 20 30 3b 20 20 20 20  Sublist = 0;    
6e00: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
6e10: 20 6c 69 73 74 20 66 6f 72 20 73 75 62 2d 71 75   list for sub-qu
6e20: 65 72 79 20 2a 2f 0a 20 20 20 20 57 69 6e 64 6f  ery */.    Windo
6e30: 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57  w *pMWin = p->pW
6e40: 69 6e 3b 20 20 20 20 20 20 2f 2a 20 4d 61 73 74  in;      /* Mast
6e50: 65 72 20 77 69 6e 64 6f 77 20 6f 62 6a 65 63 74  er window object
6e60: 20 2a 2f 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a   */.    Window *
6e70: 70 57 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20  pWin;           
6e80: 20 20 20 20 20 20 2f 2a 20 57 69 6e 64 6f 77 20        /* Window 
6e90: 6f 62 6a 65 63 74 20 69 74 65 72 61 74 6f 72 20  object iterator 
6ea0: 2a 2f 0a 0a 20 20 20 20 70 2d 3e 70 53 72 63 20  */..    p->pSrc 
6eb0: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65  = 0;.    p->pWhe
6ec0: 72 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  re = 0;.    p->p
6ed0: 47 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20 20  GroupBy = 0;.   
6ee0: 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b   p->pHaving = 0;
6ef0: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
6f00: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
6f10: 75 73 65 20 66 6f 72 20 74 68 65 20 73 75 62 2d  use for the sub-
6f20: 73 65 6c 65 63 74 2e 20 54 68 69 73 20 69 73 20  select. This is 
6f30: 74 68 65 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f  the concatenatio
6f40: 6e 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  n.    ** of the 
6f50: 77 69 6e 64 6f 77 20 50 41 52 54 49 54 49 4f 4e  window PARTITION
6f60: 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 63 6c   and ORDER BY cl
6f70: 61 75 73 65 73 2e 20 54 68 65 6e 2c 20 69 66 20  auses. Then, if 
6f80: 74 68 69 73 20 6d 61 6b 65 73 20 69 74 0a 20 20  this makes it.  
6f90: 20 20 2a 2a 20 72 65 64 75 6e 64 61 6e 74 2c 20    ** redundant, 
6fa0: 72 65 6d 6f 76 65 20 74 68 65 20 4f 52 44 45 52  remove the ORDER
6fb0: 20 42 59 20 66 72 6f 6d 20 74 68 65 20 70 61 72   BY from the par
6fc0: 65 6e 74 20 53 45 4c 45 43 54 2e 20 20 2a 2f 0a  ent SELECT.  */.
6fd0: 20 20 20 20 70 53 6f 72 74 20 3d 20 73 71 6c 69      pSort = sqli
6fe0: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
6ff0: 62 2c 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69  b, pMWin->pParti
7000: 74 69 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 70 53  tion, 0);.    pS
7010: 6f 72 74 20 3d 20 65 78 70 72 4c 69 73 74 41 70  ort = exprListAp
7020: 70 65 6e 64 4c 69 73 74 28 70 50 61 72 73 65 2c  pendList(pParse,
7030: 20 70 53 6f 72 74 2c 20 70 4d 57 69 6e 2d 3e 70   pSort, pMWin->p
7040: 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66  OrderBy);.    if
7050: 28 20 70 53 6f 72 74 20 26 26 20 70 2d 3e 70 4f  ( pSort && p->pO
7060: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
7070: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c  if( sqlite3ExprL
7080: 69 73 74 43 6f 6d 70 61 72 65 28 70 53 6f 72 74  istCompare(pSort
7090: 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d  , p->pOrderBy, -
70a0: 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1)==0 ){.       
70b0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
70c0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f  Delete(db, p->pO
70d0: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 20  rderBy);.       
70e0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30   p->pOrderBy = 0
70f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7100: 0a 20 20 20 20 2f 2a 20 41 73 73 69 67 6e 20 61  .    /* Assign a
7110: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
7120: 6f 72 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  or the ephemeral
7130: 20 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20 62   table used to b
7140: 75 66 66 65 72 20 72 6f 77 73 2e 0a 20 20 20 20  uffer rows..    
7150: 2a 2a 20 54 68 65 20 4f 70 65 6e 45 70 68 65 6d  ** The OpenEphem
7160: 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  eral instruction
7170: 20 69 73 20 63 6f 64 65 64 20 6c 61 74 65 72 2c   is coded later,
7180: 20 61 66 74 65 72 20 69 74 20 69 73 20 6b 6e 6f   after it is kno
7190: 77 6e 20 68 6f 77 0a 20 20 20 20 2a 2a 20 6d 61  wn how.    ** ma
71a0: 6e 79 20 63 6f 6c 75 6d 6e 73 20 74 68 65 20 74  ny columns the t
71b0: 61 62 6c 65 20 77 69 6c 6c 20 68 61 76 65 2e 20  able will have. 
71c0: 20 2a 2f 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 69   */.    pMWin->i
71d0: 45 70 68 43 73 72 20 3d 20 70 50 61 72 73 65 2d  EphCsr = pParse-
71e0: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70 50 61  >nTab++;.    pPa
71f0: 72 73 65 2d 3e 6e 54 61 62 20 2b 3d 20 33 3b 0a  rse->nTab += 3;.
7200: 0a 20 20 20 20 73 65 6c 65 63 74 57 69 6e 64 6f  .    selectWindo
7210: 77 52 65 77 72 69 74 65 45 4c 69 73 74 28 70 50  wRewriteEList(pP
7220: 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 70 53 72  arse, pMWin, pSr
7230: 63 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 26 70  c, p->pEList, &p
7240: 53 75 62 6c 69 73 74 29 3b 0a 20 20 20 20 73 65  Sublist);.    se
7250: 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74  lectWindowRewrit
7260: 65 45 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  eEList(pParse, p
7270: 4d 57 69 6e 2c 20 70 53 72 63 2c 20 70 2d 3e 70  MWin, pSrc, p->p
7280: 4f 72 64 65 72 42 79 2c 20 26 70 53 75 62 6c 69  OrderBy, &pSubli
7290: 73 74 29 3b 0a 20 20 20 20 70 4d 57 69 6e 2d 3e  st);.    pMWin->
72a0: 6e 42 75 66 66 65 72 43 6f 6c 20 3d 20 28 70 53  nBufferCol = (pS
72b0: 75 62 6c 69 73 74 20 3f 20 70 53 75 62 6c 69 73  ublist ? pSublis
72c0: 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 0a  t->nExpr : 0);..
72d0: 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68      /* Append th
72e0: 65 20 50 41 52 54 49 54 49 4f 4e 20 42 59 20 61  e PARTITION BY a
72f0: 6e 64 20 4f 52 44 45 52 20 42 59 20 65 78 70 72  nd ORDER BY expr
7300: 65 73 73 69 6f 6e 73 20 74 6f 20 74 68 65 20 74  essions to the t
7310: 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 75  o the .    ** su
7320: 62 2d 73 65 6c 65 63 74 20 65 78 70 72 65 73 73  b-select express
7330: 69 6f 6e 20 6c 69 73 74 2e 20 54 68 65 79 20 61  ion list. They a
7340: 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 66  re required to f
7350: 69 67 75 72 65 20 6f 75 74 20 77 68 65 72 65 20  igure out where 
7360: 0a 20 20 20 20 2a 2a 20 62 6f 75 6e 64 61 72 69  .    ** boundari
7370: 65 73 20 66 6f 72 20 70 61 72 74 69 74 69 6f 6e  es for partition
7380: 73 20 61 6e 64 20 73 65 74 73 20 6f 66 20 70 65  s and sets of pe
7390: 65 72 20 72 6f 77 73 20 6c 69 65 2e 20 20 2a 2f  er rows lie.  */
73a0: 0a 20 20 20 20 70 53 75 62 6c 69 73 74 20 3d 20  .    pSublist = 
73b0: 65 78 70 72 4c 69 73 74 41 70 70 65 6e 64 4c 69  exprListAppendLi
73c0: 73 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 6c  st(pParse, pSubl
73d0: 69 73 74 2c 20 70 4d 57 69 6e 2d 3e 70 50 61 72  ist, pMWin->pPar
73e0: 74 69 74 69 6f 6e 29 3b 0a 20 20 20 20 70 53 75  tition);.    pSu
73f0: 62 6c 69 73 74 20 3d 20 65 78 70 72 4c 69 73 74  blist = exprList
7400: 41 70 70 65 6e 64 4c 69 73 74 28 70 50 61 72 73  AppendList(pPars
7410: 65 2c 20 70 53 75 62 6c 69 73 74 2c 20 70 4d 57  e, pSublist, pMW
7420: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 0a  in->pOrderBy);..
7430: 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68      /* Append th
7440: 65 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73  e arguments pass
7450: 65 64 20 74 6f 20 65 61 63 68 20 77 69 6e 64 6f  ed to each windo
7460: 77 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 74 68  w function to th
7470: 65 0a 20 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c  e.    ** sub-sel
7480: 65 63 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  ect expression l
7490: 69 73 74 2e 20 41 6c 73 6f 20 61 6c 6c 6f 63 61  ist. Also alloca
74a0: 74 65 20 74 77 6f 20 72 65 67 69 73 74 65 72 73  te two registers
74b0: 20 66 6f 72 20 65 61 63 68 0a 20 20 20 20 2a 2a   for each.    **
74c0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
74d0: 20 2d 20 6f 6e 65 20 66 6f 72 20 74 68 65 20 61   - one for the a
74e0: 63 63 75 6d 75 6c 61 74 6f 72 2c 20 61 6e 6f 74  ccumulator, anot
74f0: 68 65 72 20 66 6f 72 20 69 6e 74 65 72 69 6d 0a  her for interim.
7500: 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 73 2e 20      ** results. 
7510: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 57 69 6e   */.    for(pWin
7520: 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57  =pMWin; pWin; pW
7530: 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69  in=pWin->pNextWi
7540: 6e 29 7b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e  n){.      pWin->
7550: 69 41 72 67 43 6f 6c 20 3d 20 28 70 53 75 62 6c  iArgCol = (pSubl
7560: 69 73 74 20 3f 20 70 53 75 62 6c 69 73 74 2d 3e  ist ? pSublist->
7570: 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20  nExpr : 0);.    
7580: 20 20 70 53 75 62 6c 69 73 74 20 3d 20 65 78 70    pSublist = exp
7590: 72 4c 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28  rListAppendList(
75a0: 70 50 61 72 73 65 2c 20 70 53 75 62 6c 69 73 74  pParse, pSublist
75b0: 2c 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e  , pWin->pOwner->
75c0: 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  x.pList);.      
75d0: 69 66 28 20 70 57 69 6e 2d 3e 70 46 69 6c 74 65  if( pWin->pFilte
75e0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  r ){.        Exp
75f0: 72 20 2a 70 46 69 6c 74 65 72 20 3d 20 73 71 6c  r *pFilter = sql
7600: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
7610: 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72 2c 20 30  pWin->pFilter, 0
7620: 29 3b 0a 20 20 20 20 20 20 20 20 70 53 75 62 6c  );.        pSubl
7630: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
7640: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
7650: 73 65 2c 20 70 53 75 62 6c 69 73 74 2c 20 70 46  se, pSublist, pF
7660: 69 6c 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  ilter);.      }.
7670: 20 20 20 20 20 20 70 57 69 6e 2d 3e 72 65 67 41        pWin->regA
7680: 63 63 75 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  ccum = ++pParse-
7690: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 57 69  >nMem;.      pWi
76a0: 6e 2d 3e 72 65 67 52 65 73 75 6c 74 20 3d 20 2b  n->regResult = +
76b0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
76c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
76d0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
76e0: 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41  l, 0, pWin->regA
76f0: 63 63 75 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ccum);.    }..  
7700: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
7710: 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20   no ORDER BY or 
7720: 50 41 52 54 49 54 49 4f 4e 20 42 59 20 63 6c 61  PARTITION BY cla
7730: 75 73 65 2c 20 61 6e 64 20 74 68 65 20 77 69 6e  use, and the win
7740: 64 6f 77 0a 20 20 20 20 2a 2a 20 66 75 6e 63 74  dow.    ** funct
7750: 69 6f 6e 20 61 63 63 65 70 74 73 20 7a 65 72 6f  ion accepts zero
7760: 20 61 72 67 75 6d 65 6e 74 73 2c 20 61 6e 64 20   arguments, and 
7770: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 74 68  there are no oth
7780: 65 72 20 63 6f 6c 75 6d 6e 73 0a 20 20 20 20 2a  er columns.    *
7790: 2a 20 73 65 6c 65 63 74 65 64 20 28 65 2e 67 2e  * selected (e.g.
77a0: 20 22 53 45 4c 45 43 54 20 72 6f 77 5f 6e 75 6d   "SELECT row_num
77b0: 62 65 72 28 29 20 4f 56 45 52 20 28 29 20 46 52  ber() OVER () FR
77c0: 4f 4d 20 74 31 22 29 2c 20 69 74 20 69 73 20 70  OM t1"), it is p
77d0: 6f 73 73 69 62 6c 65 0a 20 20 20 20 2a 2a 20 74  ossible.    ** t
77e0: 68 61 74 20 70 53 75 62 6c 69 73 74 20 69 73 20  hat pSublist is 
77f0: 73 74 69 6c 6c 20 4e 55 4c 4c 20 68 65 72 65 2e  still NULL here.
7800: 20 41 64 64 20 61 20 63 6f 6e 73 74 61 6e 74 20   Add a constant 
7810: 65 78 70 72 65 73 73 69 6f 6e 20 68 65 72 65 20  expression here 
7820: 74 6f 20 0a 20 20 20 20 2a 2a 20 6b 65 65 70 20  to .    ** keep 
7830: 65 76 65 72 79 74 68 69 6e 67 20 6c 65 67 61 6c  everything legal
7840: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 0a   in this case. .
7850: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
7860: 53 75 62 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  Sublist==0 ){.  
7870: 20 20 20 20 70 53 75 62 6c 69 73 74 20 3d 20 73      pSublist = s
7880: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
7890: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20  pend(pParse, 0, 
78a0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
78b0: 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20  e3ExprAlloc(db, 
78c0: 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73 71 6c  TK_INTEGER, &sql
78d0: 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 30 5d  ite3IntTokens[0]
78e0: 2c 20 30 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  , 0).      );.  
78f0: 20 20 7d 0a 0a 20 20 20 20 70 53 75 62 20 3d 20    }..    pSub = 
7900: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77  sqlite3SelectNew
7910: 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  (.        pParse
7920: 2c 20 70 53 75 62 6c 69 73 74 2c 20 70 53 72 63  , pSublist, pSrc
7930: 2c 20 70 57 68 65 72 65 2c 20 70 47 72 6f 75 70  , pWhere, pGroup
7940: 42 79 2c 20 70 48 61 76 69 6e 67 2c 20 70 53 6f  By, pHaving, pSo
7950: 72 74 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a  rt, 0, 0.    );.
7960: 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 73 71      p->pSrc = sq
7970: 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
7980: 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c  nd(pParse, 0, 0,
7990: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e   0);.    if( p->
79a0: 70 53 72 63 20 29 7b 0a 20 20 20 20 20 20 70 2d  pSrc ){.      p-
79b0: 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c  >pSrc->a[0].pSel
79c0: 65 63 74 20 3d 20 70 53 75 62 3b 0a 20 20 20 20  ect = pSub;.    
79d0: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
79e0: 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50  AssignCursors(pP
79f0: 61 72 73 65 2c 20 70 2d 3e 70 53 72 63 29 3b 0a  arse, p->pSrc);.
7a00: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
7a10: 33 45 78 70 61 6e 64 53 75 62 71 75 65 72 79 28  3ExpandSubquery(
7a20: 70 50 61 72 73 65 2c 20 26 70 2d 3e 70 53 72 63  pParse, &p->pSrc
7a30: 2d 3e 61 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  ->a[0]) ){.     
7a40: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
7a50: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  OMEM;.      }els
7a60: 65 7b 0a 20 20 20 20 20 20 20 20 70 53 75 62 2d  e{.        pSub-
7a70: 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
7a80: 45 78 70 61 6e 64 65 64 3b 0a 20 20 20 20 20 20  Expanded;.      
7a90: 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d    p->selFlags &=
7aa0: 20 7e 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a   ~SF_Aggregate;.
7ab0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
7ac0: 65 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65  electPrep(pParse
7ad0: 2c 20 70 53 75 62 2c 20 30 29 3b 0a 20 20 20 20  , pSub, 0);.    
7ae0: 20 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69 74    }..      sqlit
7af0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
7b00: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
7b10: 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
7b20: 2c 20 70 53 75 62 6c 69 73 74 2d 3e 6e 45 78 70  , pSublist->nExp
7b30: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
7b40: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7b50: 50 5f 4f 70 65 6e 44 75 70 2c 20 70 4d 57 69 6e  P_OpenDup, pMWin
7b60: 2d 3e 69 45 70 68 43 73 72 2b 31 2c 20 70 4d 57  ->iEphCsr+1, pMW
7b70: 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20  in->iEphCsr);.  
7b80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7b90: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
7ba0: 44 75 70 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  Dup, pMWin->iEph
7bb0: 43 73 72 2b 32 2c 20 70 4d 57 69 6e 2d 3e 69 45  Csr+2, pMWin->iE
7bc0: 70 68 43 73 72 29 3b 0a 20 20 20 20 20 20 73 71  phCsr);.      sq
7bd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7be0: 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70  v, OP_OpenDup, p
7bf0: 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2b 33 2c  MWin->iEphCsr+3,
7c00: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29   pMWin->iEphCsr)
7c10: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7c20: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
7c30: 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 29  Delete(db, pSub)
7c40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
7c50: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
7c60: 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e   ) rc = SQLITE_N
7c70: 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  OMEM;.  }..  ret
7c80: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
7c90: 20 46 72 65 65 20 74 68 65 20 57 69 6e 64 6f 77   Free the Window
7ca0: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
7cb0: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
7cc0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ument..*/.void s
7cd0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65  qlite3WindowDele
7ce0: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
7cf0: 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 69 66  Window *p){.  if
7d00: 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( p ){.    sqlit
7d10: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
7d20: 20 70 2d 3e 70 46 69 6c 74 65 72 29 3b 0a 20 20   p->pFilter);.  
7d30: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
7d40: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
7d50: 50 61 72 74 69 74 69 6f 6e 29 3b 0a 20 20 20 20  Partition);.    
7d60: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
7d70: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
7d80: 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71 6c 69  derBy);.    sqli
7d90: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
7da0: 2c 20 70 2d 3e 70 45 6e 64 29 3b 0a 20 20 20 20  , p->pEnd);.    
7db0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
7dc0: 65 28 64 62 2c 20 70 2d 3e 70 53 74 61 72 74 29  e(db, p->pStart)
7dd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
7de0: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4e 61 6d 65  ree(db, p->zName
7df0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
7e00: 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 42 61 73  Free(db, p->zBas
7e10: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  e);.    sqlite3D
7e20: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
7e30: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
7e40: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
7e50: 6f 66 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74  of Window object
7e60: 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 74 68  s starting at th
7e70: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
7e80: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
7e90: 65 33 57 69 6e 64 6f 77 4c 69 73 74 44 65 6c 65  e3WindowListDele
7ea0: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
7eb0: 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 77 68  Window *p){.  wh
7ec0: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 57 69  ile( p ){.    Wi
7ed0: 6e 64 6f 77 20 2a 70 4e 65 78 74 20 3d 20 70 2d  ndow *pNext = p-
7ee0: 3e 70 4e 65 78 74 57 69 6e 3b 0a 20 20 20 20 73  >pNextWin;.    s
7ef0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65  qlite3WindowDele
7f00: 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 70  te(db, p);.    p
7f10: 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 7d 0a   = pNext;.  }.}.
7f20: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  ./*.** The argum
7f30: 65 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ent expression i
7f40: 73 20 61 6e 20 50 52 45 43 45 44 49 4e 47 20 6f  s an PRECEDING o
7f50: 72 20 46 4f 4c 4c 4f 57 49 4e 47 20 6f 66 66 73  r FOLLOWING offs
7f60: 65 74 2e 20 20 54 68 65 0a 2a 2a 20 76 61 6c 75  et.  The.** valu
7f70: 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f  e should be a no
7f80: 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67  n-negative integ
7f90: 65 72 2e 20 20 49 66 20 74 68 65 20 76 61 6c 75  er.  If the valu
7fa0: 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 63 6f  e is not a.** co
7fb0: 6e 73 74 61 6e 74 2c 20 63 68 61 6e 67 65 20 69  nstant, change i
7fc0: 74 20 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 65 20  t to NULL.  The 
7fd0: 66 61 63 74 20 74 68 61 74 20 69 74 20 69 73 20  fact that it is 
7fe0: 74 68 65 6e 20 61 20 6e 6f 6e 2d 6e 65 67 61 74  then a non-negat
7ff0: 69 76 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 77  ive.** integer w
8000: 69 6c 6c 20 62 65 20 63 61 75 67 68 74 20 6c 61  ill be caught la
8010: 74 65 72 2e 20 20 42 75 74 20 69 74 20 69 73 20  ter.  But it is 
8020: 69 6d 70 6f 72 74 61 6e 74 20 6e 6f 74 20 74 6f  important not to
8030: 20 6c 65 61 76 65 0a 2a 2a 20 76 61 72 69 61 62   leave.** variab
8040: 6c 65 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65  le values in the
8050: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
8060: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72  ..*/.static Expr
8070: 20 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4f   *sqlite3WindowO
8080: 66 66 73 65 74 45 78 70 72 28 50 61 72 73 65 20  ffsetExpr(Parse 
8090: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
80a0: 45 78 70 72 29 7b 0a 20 20 69 66 28 20 30 3d 3d  Expr){.  if( 0==
80b0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
80c0: 73 74 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a  stant(pExpr) ){.
80d0: 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d      if( IN_RENAM
80e0: 45 5f 4f 42 4a 45 43 54 20 29 20 73 71 6c 69 74  E_OBJECT ) sqlit
80f0: 65 33 52 65 6e 61 6d 65 45 78 70 72 55 6e 6d 61  e3RenameExprUnma
8100: 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  p(pParse, pExpr)
8110: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
8120: 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
8130: 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  db, pExpr);.    
8140: 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
8150: 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d  xprAlloc(pParse-
8160: 3e 64 62 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c  >db, TK_NULL, 0,
8170: 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
8180: 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pExpr;.}../*.*
8190: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72  * Allocate and r
81a0: 65 74 75 72 6e 20 61 20 6e 65 77 20 57 69 6e 64  eturn a new Wind
81b0: 6f 77 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69  ow object descri
81c0: 62 69 6e 67 20 61 20 57 69 6e 64 6f 77 20 44 65  bing a Window De
81d0: 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 57 69 6e  finition..*/.Win
81e0: 64 6f 77 20 2a 73 71 6c 69 74 65 33 57 69 6e 64  dow *sqlite3Wind
81f0: 6f 77 41 6c 6c 6f 63 28 0a 20 20 50 61 72 73 65  owAlloc(.  Parse
8200: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
8210: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
8220: 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 2c 20  */.  int eType, 
8230: 20 20 20 20 20 20 20 2f 2a 20 46 72 61 6d 65 20         /* Frame 
8240: 74 79 70 65 2e 20 54 4b 5f 52 41 4e 47 45 2c 20  type. TK_RANGE, 
8250: 54 4b 5f 52 4f 57 53 2c 20 54 4b 5f 47 52 4f 55  TK_ROWS, TK_GROU
8260: 50 53 2c 20 6f 72 20 30 20 2a 2f 0a 20 20 69 6e  PS, or 0 */.  in
8270: 74 20 65 53 74 61 72 74 2c 20 20 20 20 20 20 20  t eStart,       
8280: 2f 2a 20 53 74 61 72 74 20 74 79 70 65 3a 20 43  /* Start type: C
8290: 55 52 52 45 4e 54 2c 20 50 52 45 43 45 44 49 4e  URRENT, PRECEDIN
82a0: 47 2c 20 46 4f 4c 4c 4f 57 49 4e 47 2c 20 55 4e  G, FOLLOWING, UN
82b0: 42 4f 55 4e 44 45 44 20 2a 2f 0a 20 20 45 78 70  BOUNDED */.  Exp
82c0: 72 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20 2f  r *pStart,     /
82d0: 2a 20 53 74 61 72 74 20 77 69 6e 64 6f 77 20 73  * Start window s
82e0: 69 7a 65 20 69 66 20 54 4b 5f 50 52 45 43 45 44  ize if TK_PRECED
82f0: 49 4e 47 20 6f 72 20 46 4f 4c 4c 4f 57 49 4e 47  ING or FOLLOWING
8300: 20 2a 2f 0a 20 20 69 6e 74 20 65 45 6e 64 2c 20   */.  int eEnd, 
8310: 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 74          /* End t
8320: 79 70 65 3a 20 43 55 52 52 45 4e 54 2c 20 46 4f  ype: CURRENT, FO
8330: 4c 4c 4f 57 49 4e 47 2c 20 54 4b 5f 55 4e 42 4f  LLOWING, TK_UNBO
8340: 55 4e 44 45 44 2c 20 50 52 45 43 45 44 49 4e 47  UNDED, PRECEDING
8350: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 6e 64   */.  Expr *pEnd
8360: 2c 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 77  ,       /* End w
8370: 69 6e 64 6f 77 20 73 69 7a 65 20 69 66 20 54 4b  indow size if TK
8380: 5f 46 4f 4c 4c 4f 57 49 4e 47 20 6f 72 20 50 52  _FOLLOWING or PR
8390: 45 43 45 44 49 4e 47 20 2a 2f 0a 20 20 75 38 20  ECEDING */.  u8 
83a0: 65 45 78 63 6c 75 64 65 20 20 20 20 20 20 20 2f  eExclude       /
83b0: 2a 20 45 58 43 4c 55 44 45 20 63 6c 61 75 73 65  * EXCLUDE clause
83c0: 20 2a 2f 0a 29 7b 0a 20 20 57 69 6e 64 6f 77 20   */.){.  Window 
83d0: 2a 70 57 69 6e 20 3d 20 30 3b 0a 20 20 69 6e 74  *pWin = 0;.  int
83e0: 20 62 49 6d 70 6c 69 63 69 74 46 72 61 6d 65 20   bImplicitFrame 
83f0: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65  = 0;..  /* Parse
8400: 72 20 61 73 73 75 72 65 73 20 74 68 65 20 66 6f  r assures the fo
8410: 6c 6c 6f 77 69 6e 67 3a 20 2a 2f 0a 20 20 61 73  llowing: */.  as
8420: 73 65 72 74 28 20 65 54 79 70 65 3d 3d 30 20 7c  sert( eType==0 |
8430: 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47  | eType==TK_RANG
8440: 45 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 52  E || eType==TK_R
8450: 4f 57 53 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b  OWS || eType==TK
8460: 5f 47 52 4f 55 50 53 20 29 3b 0a 20 20 61 73 73  _GROUPS );.  ass
8470: 65 72 74 28 20 65 53 74 61 72 74 3d 3d 54 4b 5f  ert( eStart==TK_
8480: 43 55 52 52 45 4e 54 20 7c 7c 20 65 53 74 61 72  CURRENT || eStar
8490: 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 0a  t==TK_PRECEDING.
84a0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 53             || eS
84b0: 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44  tart==TK_UNBOUND
84c0: 45 44 20 7c 7c 20 65 53 74 61 72 74 3d 3d 54 4b  ED || eStart==TK
84d0: 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 3b 0a 20 20  _FOLLOWING );.  
84e0: 61 73 73 65 72 74 28 20 65 45 6e 64 3d 3d 54 4b  assert( eEnd==TK
84f0: 5f 43 55 52 52 45 4e 54 20 7c 7c 20 65 45 6e 64  _CURRENT || eEnd
8500: 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 0a 20  ==TK_FOLLOWING. 
8510: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 45 6e            || eEn
8520: 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20  d==TK_UNBOUNDED 
8530: 7c 7c 20 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43  || eEnd==TK_PREC
8540: 45 44 49 4e 47 20 29 3b 0a 20 20 61 73 73 65 72  EDING );.  asser
8550: 74 28 20 28 65 53 74 61 72 74 3d 3d 54 4b 5f 50  t( (eStart==TK_P
8560: 52 45 43 45 44 49 4e 47 20 7c 7c 20 65 53 74 61  RECEDING || eSta
8570: 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  rt==TK_FOLLOWING
8580: 29 3d 3d 28 70 53 74 61 72 74 21 3d 30 29 20 29  )==(pStart!=0) )
8590: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 65 45 6e  ;.  assert( (eEn
85a0: 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  d==TK_FOLLOWING 
85b0: 7c 7c 20 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43  || eEnd==TK_PREC
85c0: 45 44 49 4e 47 29 3d 3d 28 70 45 6e 64 21 3d 30  EDING)==(pEnd!=0
85d0: 29 20 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70  ) );..  if( eTyp
85e0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 62 49 6d 70  e==0 ){.    bImp
85f0: 6c 69 63 69 74 46 72 61 6d 65 20 3d 20 31 3b 0a  licitFrame = 1;.
8600: 20 20 20 20 65 54 79 70 65 20 3d 20 54 4b 5f 52      eType = TK_R
8610: 41 4e 47 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ANGE;.  }..  /* 
8620: 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68  Additionally, th
8630: 65 0a 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20  e.  ** starting 
8640: 62 6f 75 6e 64 61 72 79 20 74 79 70 65 20 6d 61  boundary type ma
8650: 79 20 6e 6f 74 20 6f 63 63 75 72 20 65 61 72 6c  y not occur earl
8660: 69 65 72 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ier in the follo
8670: 77 69 6e 67 20 6c 69 73 74 20 74 68 61 6e 0a 20  wing list than. 
8680: 20 2a 2a 20 74 68 65 20 65 6e 64 69 6e 67 20 62   ** the ending b
8690: 6f 75 6e 64 61 72 79 20 74 79 70 65 3a 0a 20 20  oundary type:.  
86a0: 2a 2a 0a 20 20 2a 2a 20 20 20 55 4e 42 4f 55 4e  **.  **   UNBOUN
86b0: 44 45 44 20 50 52 45 43 45 44 49 4e 47 0a 20 20  DED PRECEDING.  
86c0: 2a 2a 20 20 20 3c 65 78 70 72 3e 20 50 52 45 43  **   <expr> PREC
86d0: 45 44 49 4e 47 0a 20 20 2a 2a 20 20 20 43 55 52  EDING.  **   CUR
86e0: 52 45 4e 54 20 52 4f 57 0a 20 20 2a 2a 20 20 20  RENT ROW.  **   
86f0: 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47  <expr> FOLLOWING
8700: 0a 20 20 2a 2a 20 20 20 55 4e 42 4f 55 4e 44 45  .  **   UNBOUNDE
8710: 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20 2a 2a  D FOLLOWING.  **
8720: 0a 20 20 2a 2a 20 54 68 65 20 70 61 72 73 65 72  .  ** The parser
8730: 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 22 55   ensures that "U
8740: 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49  NBOUNDED PRECEDI
8750: 4e 47 22 20 63 61 6e 6e 6f 74 20 62 65 20 75 73  NG" cannot be us
8760: 65 64 20 61 73 20 61 6e 20 65 6e 64 69 6e 67 0a  ed as an ending.
8770: 20 20 2a 2a 20 62 6f 75 6e 64 61 72 79 2c 20 61    ** boundary, a
8780: 6e 64 20 74 68 61 6e 20 22 55 4e 42 4f 55 4e 44  nd than "UNBOUND
8790: 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 22 20 63 61  ED FOLLOWING" ca
87a0: 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 61 73 20  nnot be used as 
87b0: 61 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20  a starting.  ** 
87c0: 66 72 61 6d 65 20 62 6f 75 6e 64 61 72 79 2e 0a  frame boundary..
87d0: 20 20 2a 2f 0a 20 20 69 66 28 20 28 65 53 74 61    */.  if( (eSta
87e0: 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 26  rt==TK_CURRENT &
87f0: 26 20 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45  & eEnd==TK_PRECE
8800: 44 49 4e 47 29 0a 20 20 20 7c 7c 20 28 65 53 74  DING).   || (eSt
8810: 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e  art==TK_FOLLOWIN
8820: 47 20 26 26 20 28 65 45 6e 64 3d 3d 54 4b 5f 50  G && (eEnd==TK_P
8830: 52 45 43 45 44 49 4e 47 20 7c 7c 20 65 45 6e 64  RECEDING || eEnd
8840: 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29 29 0a 20  ==TK_CURRENT)). 
8850: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
8860: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
8870: 22 75 6e 73 75 70 70 6f 72 74 65 64 20 66 72 61  "unsupported fra
8880: 6d 65 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e  me specification
8890: 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 77 69 6e  ");.    goto win
88a0: 64 6f 77 41 6c 6c 6f 63 45 72 72 3b 0a 20 20 7d  dowAllocErr;.  }
88b0: 0a 0a 20 20 70 57 69 6e 20 3d 20 28 57 69 6e 64  ..  pWin = (Wind
88c0: 6f 77 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c  ow*)sqlite3DbMal
88d0: 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e  locZero(pParse->
88e0: 64 62 2c 20 73 69 7a 65 6f 66 28 57 69 6e 64 6f  db, sizeof(Windo
88f0: 77 29 29 3b 0a 20 20 69 66 28 20 70 57 69 6e 3d  w));.  if( pWin=
8900: 3d 30 20 29 20 67 6f 74 6f 20 77 69 6e 64 6f 77  =0 ) goto window
8910: 41 6c 6c 6f 63 45 72 72 3b 0a 20 20 70 57 69 6e  AllocErr;.  pWin
8920: 2d 3e 65 46 72 6d 54 79 70 65 20 3d 20 65 54 79  ->eFrmType = eTy
8930: 70 65 3b 0a 20 20 70 57 69 6e 2d 3e 65 53 74 61  pe;.  pWin->eSta
8940: 72 74 20 3d 20 65 53 74 61 72 74 3b 0a 20 20 70  rt = eStart;.  p
8950: 57 69 6e 2d 3e 65 45 6e 64 20 3d 20 65 45 6e 64  Win->eEnd = eEnd
8960: 3b 0a 20 20 69 66 28 20 65 45 78 63 6c 75 64 65  ;.  if( eExclude
8970: 3d 3d 30 20 26 26 20 4f 70 74 69 6d 69 7a 61 74  ==0 && Optimizat
8980: 69 6f 6e 44 69 73 61 62 6c 65 64 28 70 50 61 72  ionDisabled(pPar
8990: 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 51  se->db, SQLITE_Q
89a0: 75 65 72 79 46 6c 61 74 74 65 6e 65 72 29 20 29  ueryFlattener) )
89b0: 7b 0a 20 20 20 20 65 45 78 63 6c 75 64 65 20 3d  {.    eExclude =
89c0: 20 54 4b 5f 4e 4f 3b 0a 20 20 7d 0a 20 20 70 57   TK_NO;.  }.  pW
89d0: 69 6e 2d 3e 65 45 78 63 6c 75 64 65 20 3d 20 65  in->eExclude = e
89e0: 45 78 63 6c 75 64 65 3b 0a 20 20 70 57 69 6e 2d  Exclude;.  pWin-
89f0: 3e 62 49 6d 70 6c 69 63 69 74 46 72 61 6d 65 20  >bImplicitFrame 
8a00: 3d 20 62 49 6d 70 6c 69 63 69 74 46 72 61 6d 65  = bImplicitFrame
8a10: 3b 0a 20 20 70 57 69 6e 2d 3e 70 45 6e 64 20 3d  ;.  pWin->pEnd =
8a20: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4f 66   sqlite3WindowOf
8a30: 66 73 65 74 45 78 70 72 28 70 50 61 72 73 65 2c  fsetExpr(pParse,
8a40: 20 70 45 6e 64 29 3b 0a 20 20 70 57 69 6e 2d 3e   pEnd);.  pWin->
8a50: 70 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  pStart = sqlite3
8a60: 57 69 6e 64 6f 77 4f 66 66 73 65 74 45 78 70 72  WindowOffsetExpr
8a70: 28 70 50 61 72 73 65 2c 20 70 53 74 61 72 74 29  (pParse, pStart)
8a80: 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 69 6e 3b  ;.  return pWin;
8a90: 0a 0a 77 69 6e 64 6f 77 41 6c 6c 6f 63 45 72 72  ..windowAllocErr
8aa0: 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  :.  sqlite3ExprD
8ab0: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
8ac0: 2c 20 70 45 6e 64 29 3b 0a 20 20 73 71 6c 69 74  , pEnd);.  sqlit
8ad0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61  e3ExprDelete(pPa
8ae0: 72 73 65 2d 3e 64 62 2c 20 70 53 74 61 72 74 29  rse->db, pStart)
8af0: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
8b00: 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20 50 41  ./*.** Attach PA
8b10: 52 54 49 54 49 4f 4e 20 61 6e 64 20 4f 52 44 45  RTITION and ORDE
8b20: 52 20 42 59 20 63 6c 61 75 73 65 73 20 70 50 61  R BY clauses pPa
8b30: 72 74 69 74 69 6f 6e 20 61 6e 64 20 70 4f 72 64  rtition and pOrd
8b40: 65 72 42 79 20 74 6f 20 77 69 6e 64 6f 77 0a 2a  erBy to window.*
8b50: 2a 20 70 57 69 6e 2e 20 41 6c 73 6f 2c 20 69 66  * pWin. Also, if
8b60: 20 70 61 72 61 6d 65 74 65 72 20 70 42 61 73 65   parameter pBase
8b70: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 65   is not NULL, se
8b80: 74 20 70 57 69 6e 2d 3e 7a 42 61 73 65 20 74 6f  t pWin->zBase to
8b90: 20 74 68 65 0a 2a 2a 20 65 71 75 69 76 61 6c 65   the.** equivale
8ba0: 6e 74 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65  nt nul-terminate
8bb0: 64 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 57 69 6e  d string..*/.Win
8bc0: 64 6f 77 20 2a 73 71 6c 69 74 65 33 57 69 6e 64  dow *sqlite3Wind
8bd0: 6f 77 41 73 73 65 6d 62 6c 65 28 0a 20 20 50 61  owAssemble(.  Pa
8be0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20  rse *pParse, .  
8bf0: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 2c 20 0a 20  Window *pWin, . 
8c00: 20 45 78 70 72 4c 69 73 74 20 2a 70 50 61 72 74   ExprList *pPart
8c10: 69 74 69 6f 6e 2c 20 0a 20 20 45 78 70 72 4c 69  ition, .  ExprLi
8c20: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 0a 20  st *pOrderBy, . 
8c30: 20 54 6f 6b 65 6e 20 2a 70 42 61 73 65 0a 29 7b   Token *pBase.){
8c40: 0a 20 20 69 66 28 20 70 57 69 6e 20 29 7b 0a 20  .  if( pWin ){. 
8c50: 20 20 20 70 57 69 6e 2d 3e 70 50 61 72 74 69 74     pWin->pPartit
8c60: 69 6f 6e 20 3d 20 70 50 61 72 74 69 74 69 6f 6e  ion = pPartition
8c70: 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70 4f 72 64  ;.    pWin->pOrd
8c80: 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
8c90: 0a 20 20 20 20 69 66 28 20 70 42 61 73 65 20 29  .    if( pBase )
8ca0: 7b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 7a 42  {.      pWin->zB
8cb0: 61 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ase = sqlite3DbS
8cc0: 74 72 4e 44 75 70 28 70 50 61 72 73 65 2d 3e 64  trNDup(pParse->d
8cd0: 62 2c 20 70 42 61 73 65 2d 3e 7a 2c 20 70 42 61  b, pBase->z, pBa
8ce0: 73 65 2d 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  se->n);.    }.  
8cf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
8d00: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
8d10: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 50 61  (pParse->db, pPa
8d20: 72 74 69 74 69 6f 6e 29 3b 0a 20 20 20 20 73 71  rtition);.    sq
8d30: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
8d40: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
8d50: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d 0a 20  pOrderBy);.  }. 
8d60: 20 72 65 74 75 72 6e 20 70 57 69 6e 3b 0a 7d 0a   return pWin;.}.
8d70: 0a 2f 2a 0a 2a 2a 20 57 69 6e 64 6f 77 20 2a 70  ./*.** Window *p
8d80: 57 69 6e 20 68 61 73 20 6a 75 73 74 20 62 65 65  Win has just bee
8d90: 6e 20 63 72 65 61 74 65 64 20 66 72 6f 6d 20 61  n created from a
8da0: 20 57 49 4e 44 4f 57 20 63 6c 61 75 73 65 2e 20   WINDOW clause. 
8db0: 54 6f 6b 6e 65 20 70 42 61 73 65 0a 2a 2a 20 69  Tokne pBase.** i
8dc0: 73 20 74 68 65 20 62 61 73 65 20 77 69 6e 64 6f  s the base windo
8dd0: 77 2e 20 45 61 72 6c 69 65 72 20 77 69 6e 64 6f  w. Earlier windo
8de0: 77 73 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65  ws from the same
8df0: 20 57 49 4e 44 4f 57 20 63 6c 61 75 73 65 20 61   WINDOW clause a
8e00: 72 65 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  re.** stored in 
8e10: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
8e20: 73 74 61 72 74 69 6e 67 20 61 74 20 70 57 69 6e  starting at pWin
8e30: 2d 3e 70 4e 65 78 74 57 69 6e 2e 20 54 68 69 73  ->pNextWin. This
8e40: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 65 69 74   function.** eit
8e50: 68 65 72 20 75 70 64 61 74 65 73 20 2a 70 57 69  her updates *pWi
8e60: 6e 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  n according to t
8e70: 68 65 20 62 61 73 65 20 73 70 65 63 69 66 69 63  he base specific
8e80: 61 74 69 6f 6e 2c 20 6f 72 20 65 6c 73 65 0a 2a  ation, or else.*
8e90: 2a 20 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f  * leaves an erro
8ea0: 72 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  r in pParse..*/.
8eb0: 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64  void sqlite3Wind
8ec0: 6f 77 43 68 61 69 6e 28 50 61 72 73 65 20 2a 70  owChain(Parse *p
8ed0: 50 61 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70  Parse, Window *p
8ee0: 57 69 6e 2c 20 57 69 6e 64 6f 77 20 2a 70 4c 69  Win, Window *pLi
8ef0: 73 74 29 7b 0a 20 20 69 66 28 20 70 57 69 6e 2d  st){.  if( pWin-
8f00: 3e 7a 42 61 73 65 20 29 7b 0a 20 20 20 20 73 71  >zBase ){.    sq
8f10: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
8f20: 73 65 2d 3e 64 62 3b 0a 20 20 20 20 57 69 6e 64  se->db;.    Wind
8f30: 6f 77 20 2a 70 45 78 69 73 74 20 3d 20 77 69 6e  ow *pExist = win
8f40: 64 6f 77 46 69 6e 64 28 70 50 61 72 73 65 2c 20  dowFind(pParse, 
8f50: 70 4c 69 73 74 2c 20 70 57 69 6e 2d 3e 7a 42 61  pList, pWin->zBa
8f60: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78  se);.    if( pEx
8f70: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  ist ){.      con
8f80: 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20  st char *zErr = 
8f90: 30 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63  0;.      /* Chec
8fa0: 6b 20 66 6f 72 20 65 72 72 6f 72 73 20 2a 2f 0a  k for errors */.
8fb0: 20 20 20 20 20 20 69 66 28 20 70 57 69 6e 2d 3e        if( pWin->
8fc0: 70 50 61 72 74 69 74 69 6f 6e 20 29 7b 0a 20 20  pPartition ){.  
8fd0: 20 20 20 20 20 20 7a 45 72 72 20 3d 20 22 50 41        zErr = "PA
8fe0: 52 54 49 54 49 4f 4e 20 63 6c 61 75 73 65 22 3b  RTITION clause";
8ff0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
9000: 20 70 45 78 69 73 74 2d 3e 70 4f 72 64 65 72 42   pExist->pOrderB
9010: 79 20 26 26 20 70 57 69 6e 2d 3e 70 4f 72 64 65  y && pWin->pOrde
9020: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  rBy ){.        z
9030: 45 72 72 20 3d 20 22 4f 52 44 45 52 20 42 59 20  Err = "ORDER BY 
9040: 63 6c 61 75 73 65 22 3b 0a 20 20 20 20 20 20 7d  clause";.      }
9050: 65 6c 73 65 20 69 66 28 20 70 45 78 69 73 74 2d  else if( pExist-
9060: 3e 62 49 6d 70 6c 69 63 69 74 46 72 61 6d 65 3d  >bImplicitFrame=
9070: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 45  =0 ){.        zE
9080: 72 72 20 3d 20 22 66 72 61 6d 65 20 73 70 65 63  rr = "frame spec
9090: 69 66 69 63 61 74 69 6f 6e 22 3b 0a 20 20 20 20  ification";.    
90a0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 45    }.      if( zE
90b0: 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rr ){.        sq
90c0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
90d0: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
90e0: 20 20 20 22 63 61 6e 6e 6f 74 20 6f 76 65 72 72     "cannot overr
90f0: 69 64 65 20 25 73 20 6f 66 20 77 69 6e 64 6f 77  ide %s of window
9100: 3a 20 25 73 22 2c 20 7a 45 72 72 2c 20 70 57 69  : %s", zErr, pWi
9110: 6e 2d 3e 7a 42 61 73 65 0a 20 20 20 20 20 20 20  n->zBase.       
9120: 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   );.      }else{
9130: 0a 20 20 20 20 20 20 20 20 70 57 69 6e 2d 3e 70  .        pWin->p
9140: 50 61 72 74 69 74 69 6f 6e 20 3d 20 73 71 6c 69  Partition = sqli
9150: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
9160: 62 2c 20 70 45 78 69 73 74 2d 3e 70 50 61 72 74  b, pExist->pPart
9170: 69 74 69 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 20  ition, 0);.     
9180: 20 20 20 69 66 28 20 70 45 78 69 73 74 2d 3e 70     if( pExist->p
9190: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
91a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69       assert( pWi
91b0: 6e 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  n->pOrderBy==0 )
91c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 57 69 6e  ;.          pWin
91d0: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c  ->pOrderBy = sql
91e0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
91f0: 64 62 2c 20 70 45 78 69 73 74 2d 3e 70 4f 72 64  db, pExist->pOrd
9200: 65 72 42 79 2c 20 30 29 3b 0a 20 20 20 20 20 20  erBy, 0);.      
9210: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
9220: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57  te3DbFree(db, pW
9230: 69 6e 2d 3e 7a 42 61 73 65 29 3b 0a 20 20 20 20  in->zBase);.    
9240: 20 20 20 20 70 57 69 6e 2d 3e 7a 42 61 73 65 20      pWin->zBase 
9250: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
9260: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
9270: 41 74 74 61 63 68 20 77 69 6e 64 6f 77 20 6f 62  Attach window ob
9280: 6a 65 63 74 20 70 57 69 6e 20 74 6f 20 65 78 70  ject pWin to exp
9290: 72 65 73 73 69 6f 6e 20 70 2e 0a 2a 2f 0a 76 6f  ression p..*/.vo
92a0: 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  id sqlite3Window
92b0: 41 74 74 61 63 68 28 50 61 72 73 65 20 2a 70 50  Attach(Parse *pP
92c0: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 2c 20 57  arse, Expr *p, W
92d0: 69 6e 64 6f 77 20 2a 70 57 69 6e 29 7b 0a 20 20  indow *pWin){.  
92e0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73  if( p ){.    ass
92f0: 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46  ert( p->op==TK_F
9300: 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 2f  UNCTION );.    /
9310: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
9320: 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f  s only called fo
9330: 72 20 74 68 65 20 70 61 72 73 65 72 2e 20 20 49  r the parser.  I
9340: 66 20 70 57 69 6e 20 77 61 73 20 6e 6f 74 0a 20  f pWin was not. 
9350: 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20     ** allocated 
9360: 64 75 65 20 74 6f 20 61 6e 20 4f 4f 4d 2c 20 74  due to an OOM, t
9370: 68 65 6e 20 74 68 65 20 70 61 72 73 65 72 20 77  hen the parser w
9380: 6f 75 6c 64 20 66 61 69 6c 20 62 65 66 6f 72 65  ould fail before
9390: 20 65 76 65 72 0a 20 20 20 20 2a 2a 20 69 6e 76   ever.    ** inv
93a0: 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  oking this routi
93b0: 6e 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 41 4c  ne */.    if( AL
93c0: 57 41 59 53 28 70 57 69 6e 29 20 29 7b 0a 20 20  WAYS(pWin) ){.  
93d0: 20 20 20 20 70 2d 3e 79 2e 70 57 69 6e 20 3d 20      p->y.pWin = 
93e0: 70 57 69 6e 3b 0a 20 20 20 20 20 20 45 78 70 72  pWin;.      Expr
93f0: 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45  SetProperty(p, E
9400: 50 5f 57 69 6e 46 75 6e 63 29 3b 0a 20 20 20 20  P_WinFunc);.    
9410: 20 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 20 3d    pWin->pOwner =
9420: 20 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   p;.      if( p-
9430: 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74  >flags & EP_Dist
9440: 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  inct ){.        
9450: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
9460: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
9470: 20 20 20 22 44 49 53 54 49 4e 43 54 20 69 73 20     "DISTINCT is 
9480: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 66 6f  not supported fo
9490: 72 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  r window functio
94a0: 6e 73 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ns");.      }.  
94b0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
94c0: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 65   sqlite3WindowDe
94d0: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
94e0: 20 70 57 69 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   pWin);.  }.}../
94f0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66  *.** Return 0 if
9500: 20 74 68 65 20 74 77 6f 20 77 69 6e 64 6f 77 20   the two window 
9510: 6f 62 6a 65 63 74 73 20 61 72 65 20 69 64 65 6e  objects are iden
9520: 74 69 63 61 6c 2c 20 6f 72 20 6e 6f 6e 2d 7a 65  tical, or non-ze
9530: 72 6f 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a  ro otherwise..**
9540: 20 49 64 65 6e 74 69 63 61 6c 20 77 69 6e 64 6f   Identical windo
9550: 77 20 6f 62 6a 65 63 74 73 20 63 61 6e 20 62 65  w objects can be
9560: 20 70 72 6f 63 65 73 73 65 64 20 69 6e 20 61 20   processed in a 
9570: 73 69 6e 67 6c 65 20 73 63 61 6e 2e 0a 2a 2f 0a  single scan..*/.
9580: 69 6e 74 20 73 71 6c 69 74 65 33 57 69 6e 64 6f  int sqlite3Windo
9590: 77 43 6f 6d 70 61 72 65 28 50 61 72 73 65 20 2a  wCompare(Parse *
95a0: 70 50 61 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a  pParse, Window *
95b0: 70 31 2c 20 57 69 6e 64 6f 77 20 2a 70 32 29 7b  p1, Window *p2){
95c0: 0a 20 20 69 66 28 20 70 31 2d 3e 65 46 72 6d 54  .  if( p1->eFrmT
95d0: 79 70 65 21 3d 70 32 2d 3e 65 46 72 6d 54 79 70  ype!=p2->eFrmTyp
95e0: 65 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  e ) return 1;.  
95f0: 69 66 28 20 70 31 2d 3e 65 53 74 61 72 74 21 3d  if( p1->eStart!=
9600: 70 32 2d 3e 65 53 74 61 72 74 20 29 20 72 65 74  p2->eStart ) ret
9610: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 31 2d  urn 1;.  if( p1-
9620: 3e 65 45 6e 64 21 3d 70 32 2d 3e 65 45 6e 64 20  >eEnd!=p2->eEnd 
9630: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
9640: 28 20 70 31 2d 3e 65 45 78 63 6c 75 64 65 21 3d  ( p1->eExclude!=
9650: 70 32 2d 3e 65 45 78 63 6c 75 64 65 20 29 20 72  p2->eExclude ) r
9660: 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73  eturn 1;.  if( s
9670: 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
9680: 65 28 70 50 61 72 73 65 2c 20 70 31 2d 3e 70 53  e(pParse, p1->pS
9690: 74 61 72 74 2c 20 70 32 2d 3e 70 53 74 61 72 74  tart, p2->pStart
96a0: 2c 20 2d 31 29 20 29 20 72 65 74 75 72 6e 20 31  , -1) ) return 1
96b0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  ;.  if( sqlite3E
96c0: 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73  xprCompare(pPars
96d0: 65 2c 20 70 31 2d 3e 70 45 6e 64 2c 20 70 32 2d  e, p1->pEnd, p2-
96e0: 3e 70 45 6e 64 2c 20 2d 31 29 20 29 20 72 65 74  >pEnd, -1) ) ret
96f0: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c  urn 1;.  if( sql
9700: 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
9710: 61 72 65 28 70 31 2d 3e 70 50 61 72 74 69 74 69  are(p1->pPartiti
9720: 6f 6e 2c 20 70 32 2d 3e 70 50 61 72 74 69 74 69  on, p2->pPartiti
9730: 6f 6e 2c 20 2d 31 29 20 29 20 72 65 74 75 72 6e  on, -1) ) return
9740: 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   1;.  if( sqlite
9750: 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65  3ExprListCompare
9760: 28 70 31 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70  (p1->pOrderBy, p
9770: 32 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31 29  2->pOrderBy, -1)
9780: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72   ) return 1;.  r
9790: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn 0;.}.../*.
97a0: 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  ** This is calle
97b0: 64 20 62 79 20 63 6f 64 65 20 69 6e 20 73 65 6c  d by code in sel
97c0: 65 63 74 2e 63 20 62 65 66 6f 72 65 20 69 74 20  ect.c before it 
97d0: 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 57 68 65  calls sqlite3Whe
97e0: 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20 74 6f 20  reBegin().** to 
97f0: 62 65 67 69 6e 20 69 74 65 72 61 74 69 6e 67 20  begin iterating 
9800: 74 68 72 6f 75 67 68 20 74 68 65 20 73 75 62 2d  through the sub-
9810: 71 75 65 72 79 20 72 65 73 75 6c 74 73 2e 20 49  query results. I
9820: 74 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c  t is used to all
9830: 6f 63 61 74 65 0a 2a 2a 20 61 6e 64 20 69 6e 69  ocate.** and ini
9840: 74 69 61 6c 69 7a 65 20 72 65 67 69 73 74 65 72  tialize register
9850: 73 20 61 6e 64 20 63 75 72 73 6f 72 73 20 75 73  s and cursors us
9860: 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 69 6e  ed by sqlite3Win
9870: 64 6f 77 43 6f 64 65 53 74 65 70 28 29 2e 0a 2a  dowCodeStep()..*
9880: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69  /.void sqlite3Wi
9890: 6e 64 6f 77 43 6f 64 65 49 6e 69 74 28 50 61 72  ndowCodeInit(Par
98a0: 73 65 20 2a 70 50 61 72 73 65 2c 20 57 69 6e 64  se *pParse, Wind
98b0: 6f 77 20 2a 70 4d 57 69 6e 29 7b 0a 20 20 57 69  ow *pMWin){.  Wi
98c0: 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 56 64  ndow *pWin;.  Vd
98d0: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
98e0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
98f0: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 72  .  /* Allocate r
9900: 65 67 69 73 74 65 72 73 20 74 6f 20 75 73 65 20  egisters to use 
9910: 66 6f 72 20 50 41 52 54 49 54 49 4f 4e 20 42 59  for PARTITION BY
9920: 20 76 61 6c 75 65 73 2c 20 69 66 20 61 6e 79 2e   values, if any.
9930: 20 49 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a   Initialize.  **
9940: 20 73 61 69 64 20 72 65 67 69 73 74 65 72 73 20   said registers 
9950: 74 6f 20 4e 55 4c 4c 2e 20 20 2a 2f 0a 20 20 69  to NULL.  */.  i
9960: 66 28 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69  f( pMWin->pParti
9970: 74 69 6f 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20  tion ){.    int 
9980: 6e 45 78 70 72 20 3d 20 70 4d 57 69 6e 2d 3e 70  nExpr = pMWin->p
9990: 50 61 72 74 69 74 69 6f 6e 2d 3e 6e 45 78 70 72  Partition->nExpr
99a0: 3b 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 72 65 67  ;.    pMWin->reg
99b0: 50 61 72 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Part = pParse->n
99c0: 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73  Mem+1;.    pPars
99d0: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70 72  e->nMem += nExpr
99e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
99f0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75  eAddOp3(v, OP_Nu
9a00: 6c 6c 2c 20 30 2c 20 70 4d 57 69 6e 2d 3e 72 65  ll, 0, pMWin->re
9a10: 67 50 61 72 74 2c 20 70 4d 57 69 6e 2d 3e 72 65  gPart, pMWin->re
9a20: 67 50 61 72 74 2b 6e 45 78 70 72 2d 31 29 3b 0a  gPart+nExpr-1);.
9a30: 20 20 7d 0a 0a 20 20 70 4d 57 69 6e 2d 3e 72 65    }..  pMWin->re
9a40: 67 4f 6e 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d  gOne = ++pParse-
9a50: 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  >nMem;.  sqlite3
9a60: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
9a70: 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4d 57  _Integer, 1, pMW
9a80: 69 6e 2d 3e 72 65 67 4f 6e 65 29 3b 0a 0a 20 20  in->regOne);..  
9a90: 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 78 63 6c  if( pMWin->eExcl
9aa0: 75 64 65 20 29 7b 0a 20 20 20 20 70 4d 57 69 6e  ude ){.    pMWin
9ab0: 2d 3e 72 65 67 53 74 61 72 74 52 6f 77 69 64 20  ->regStartRowid 
9ac0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
9ad0: 3b 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 72 65 67  ;.    pMWin->reg
9ae0: 45 6e 64 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61  EndRowid = ++pPa
9af0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 70  rse->nMem;.    p
9b00: 4d 57 69 6e 2d 3e 63 73 72 41 70 70 20 3d 20 70  MWin->csrApp = p
9b10: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
9b20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9b30: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
9b40: 65 72 2c 20 31 2c 20 70 4d 57 69 6e 2d 3e 72 65  er, 1, pMWin->re
9b50: 67 53 74 61 72 74 52 6f 77 69 64 29 3b 0a 20 20  gStartRowid);.  
9b60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9b70: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
9b80: 72 2c 20 30 2c 20 70 4d 57 69 6e 2d 3e 72 65 67  r, 0, pMWin->reg
9b90: 45 6e 64 52 6f 77 69 64 29 3b 0a 20 20 20 20 73  EndRowid);.    s
9ba0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
9bb0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20  (v, OP_OpenDup, 
9bc0: 70 4d 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20 70  pMWin->csrApp, p
9bd0: 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a  MWin->iEphCsr);.
9be0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
9bf0: 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69  .  for(pWin=pMWi
9c00: 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57  n; pWin; pWin=pW
9c10: 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20  in->pNextWin){. 
9c20: 20 20 20 46 75 6e 63 44 65 66 20 2a 70 20 3d 20     FuncDef *p = 
9c30: 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20 20  pWin->pFunc;.   
9c40: 20 69 66 28 20 28 70 2d 3e 66 75 6e 63 46 6c 61   if( (p->funcFla
9c50: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
9c60: 5f 4d 49 4e 4d 41 58 29 20 26 26 20 70 57 69 6e  _MINMAX) && pWin
9c70: 2d 3e 65 53 74 61 72 74 21 3d 54 4b 5f 55 4e 42  ->eStart!=TK_UNB
9c80: 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20 20 20 20  OUNDED ){.      
9c90: 2f 2a 20 54 68 65 20 69 6e 6c 69 6e 65 20 76 65  /* The inline ve
9ca0: 72 73 69 6f 6e 73 20 6f 66 20 6d 69 6e 28 29 20  rsions of min() 
9cb0: 61 6e 64 20 6d 61 78 28 29 20 72 65 71 75 69 72  and max() requir
9cc0: 65 20 61 20 73 69 6e 67 6c 65 20 65 70 68 65 6d  e a single ephem
9cd0: 65 72 61 6c 0a 20 20 20 20 20 20 2a 2a 20 74 61  eral.      ** ta
9ce0: 62 6c 65 20 61 6e 64 20 33 20 72 65 67 69 73 74  ble and 3 regist
9cf0: 65 72 73 2e 20 54 68 65 20 72 65 67 69 73 74 65  ers. The registe
9d00: 72 73 20 61 72 65 20 75 73 65 64 20 61 73 20 66  rs are used as f
9d10: 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a  ollows:.      **
9d20: 0a 20 20 20 20 20 20 2a 2a 20 20 20 72 65 67 41  .      **   regA
9d30: 70 70 2b 30 3a 20 73 6c 6f 74 20 74 6f 20 63 6f  pp+0: slot to co
9d40: 70 79 20 6d 69 6e 28 29 2f 6d 61 78 28 29 20 61  py min()/max() a
9d50: 72 67 75 6d 65 6e 74 20 74 6f 20 66 6f 72 20 4d  rgument to for M
9d60: 61 6b 65 52 65 63 6f 72 64 0a 20 20 20 20 20 20  akeRecord.      
9d70: 2a 2a 20 20 20 72 65 67 41 70 70 2b 31 3a 20 69  **   regApp+1: i
9d80: 6e 74 65 67 65 72 20 76 61 6c 75 65 20 75 73 65  nteger value use
9d90: 64 20 74 6f 20 65 6e 73 75 72 65 20 6b 65 79 73  d to ensure keys
9da0: 20 61 72 65 20 75 6e 69 71 75 65 0a 20 20 20 20   are unique.    
9db0: 20 20 2a 2a 20 20 20 72 65 67 41 70 70 2b 32 3a    **   regApp+2:
9dc0: 20 6f 75 74 70 75 74 20 6f 66 20 4d 61 6b 65 52   output of MakeR
9dd0: 65 63 6f 72 64 0a 20 20 20 20 20 20 2a 2f 0a 20  ecord.      */. 
9de0: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
9df0: 4c 69 73 74 20 3d 20 70 57 69 6e 2d 3e 70 4f 77  List = pWin->pOw
9e00: 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  ner->x.pList;.  
9e10: 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
9e20: 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
9e30: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
9e40: 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  st(pParse, pList
9e50: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  , 0, 0);.      p
9e60: 57 69 6e 2d 3e 63 73 72 41 70 70 20 3d 20 70 50  Win->csrApp = pP
9e70: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
9e80: 20 20 20 20 70 57 69 6e 2d 3e 72 65 67 41 70 70      pWin->regApp
9e90: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
9ea0: 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  1;.      pParse-
9eb0: 3e 6e 4d 65 6d 20 2b 3d 20 33 3b 0a 20 20 20 20  >nMem += 3;.    
9ec0: 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 26    if( pKeyInfo &
9ed0: 26 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 7a  & pWin->pFunc->z
9ee0: 4e 61 6d 65 5b 31 5d 3d 3d 27 69 27 20 29 7b 0a  Name[1]=='i' ){.
9ef0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9f00: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
9f10: 72 64 65 72 5b 30 5d 3d 3d 30 20 29 3b 0a 20 20  rder[0]==0 );.  
9f20: 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e        pKeyInfo->
9f30: 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 20 3d 20  aSortOrder[0] = 
9f40: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
9f50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9f60: 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
9f70: 65 6d 65 72 61 6c 2c 20 70 57 69 6e 2d 3e 63 73  emeral, pWin->cs
9f80: 72 41 70 70 2c 20 32 29 3b 0a 20 20 20 20 20 20  rApp, 2);.      
9f90: 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e  sqlite3VdbeAppen
9fa0: 64 50 34 28 76 2c 20 70 4b 65 79 49 6e 66 6f 2c  dP4(v, pKeyInfo,
9fb0: 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
9fc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9fd0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
9fe0: 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65  ger, 0, pWin->re
9ff0: 67 41 70 70 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  gApp+1);.    }. 
a000: 20 20 20 65 6c 73 65 20 69 66 28 20 70 2d 3e 7a     else if( p->z
a010: 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e  Name==nth_valueN
a020: 61 6d 65 20 7c 7c 20 70 2d 3e 7a 4e 61 6d 65 3d  ame || p->zName=
a030: 3d 66 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65  =first_valueName
a040: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c 6c   ){.      /* All
a050: 6f 63 61 74 65 20 74 77 6f 20 72 65 67 69 73 74  ocate two regist
a060: 65 72 73 20 61 74 20 70 57 69 6e 2d 3e 72 65 67  ers at pWin->reg
a070: 41 70 70 2e 20 54 68 65 73 65 20 77 69 6c 6c 20  App. These will 
a080: 62 65 20 75 73 65 64 20 74 6f 0a 20 20 20 20 20  be used to.     
a090: 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 73 74   ** store the st
a0a0: 61 72 74 20 61 6e 64 20 65 6e 64 20 69 6e 64 65  art and end inde
a0b0: 78 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  x of the current
a0c0: 20 66 72 61 6d 65 2e 20 20 2a 2f 0a 20 20 20 20   frame.  */.    
a0d0: 20 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 20 3d    pWin->regApp =
a0e0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
a0f0: 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 63 73 72  .      pWin->csr
a100: 41 70 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  App = pParse->nT
a110: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61 72  ab++;.      pPar
a120: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 32 3b 0a 20  se->nMem += 2;. 
a130: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a140: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
a150: 6e 44 75 70 2c 20 70 57 69 6e 2d 3e 63 73 72 41  nDup, pWin->csrA
a160: 70 70 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43  pp, pMWin->iEphC
a170: 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65  sr);.    }.    e
a180: 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4e 61 6d 65  lse if( p->zName
a190: 3d 3d 6c 65 61 64 4e 61 6d 65 20 7c 7c 20 70 2d  ==leadName || p-
a1a0: 3e 7a 4e 61 6d 65 3d 3d 6c 61 67 4e 61 6d 65 20  >zName==lagName 
a1b0: 29 7b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 63  ){.      pWin->c
a1c0: 73 72 41 70 70 20 3d 20 70 50 61 72 73 65 2d 3e  srApp = pParse->
a1d0: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 73 71  nTab++;.      sq
a1e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
a1f0: 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70  v, OP_OpenDup, p
a200: 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20 70 4d 57  Win->csrApp, pMW
a210: 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20  in->iEphCsr);.  
a220: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 64 65 66 69    }.  }.}..#defi
a230: 6e 65 20 57 49 4e 44 4f 57 5f 53 54 41 52 54 49  ne WINDOW_STARTI
a240: 4e 47 5f 49 4e 54 20 20 30 0a 23 64 65 66 69 6e  NG_INT  0.#defin
a250: 65 20 57 49 4e 44 4f 57 5f 45 4e 44 49 4e 47 5f  e WINDOW_ENDING_
a260: 49 4e 54 20 20 20 20 31 0a 23 64 65 66 69 6e 65  INT    1.#define
a270: 20 57 49 4e 44 4f 57 5f 4e 54 48 5f 56 41 4c 55   WINDOW_NTH_VALU
a280: 45 5f 49 4e 54 20 32 0a 23 64 65 66 69 6e 65 20  E_INT 2.#define 
a290: 57 49 4e 44 4f 57 5f 53 54 41 52 54 49 4e 47 5f  WINDOW_STARTING_
a2a0: 4e 55 4d 20 20 33 0a 23 64 65 66 69 6e 65 20 57  NUM  3.#define W
a2b0: 49 4e 44 4f 57 5f 45 4e 44 49 4e 47 5f 4e 55 4d  INDOW_ENDING_NUM
a2c0: 20 20 20 20 34 0a 0a 2f 2a 0a 2a 2a 20 41 20 22      4../*.** A "
a2d0: 50 52 45 43 45 44 49 4e 47 20 3c 65 78 70 72 3e  PRECEDING <expr>
a2e0: 22 20 28 65 43 6f 6e 64 3d 3d 30 29 20 6f 72 20  " (eCond==0) or 
a2f0: 22 46 4f 4c 4c 4f 57 49 4e 47 20 3c 65 78 70 72  "FOLLOWING <expr
a300: 3e 22 20 28 65 43 6f 6e 64 3d 3d 31 29 20 6f 72  >" (eCond==1) or
a310: 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66   the.** value of
a320: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
a330: 6d 65 6e 74 20 74 6f 20 6e 74 68 5f 76 61 6c 75  ment to nth_valu
a340: 65 28 29 20 28 65 43 6f 6e 64 3d 3d 32 29 20 68  e() (eCond==2) h
a350: 61 73 20 6a 75 73 74 20 62 65 65 6e 0a 2a 2a 20  as just been.** 
a360: 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 74 68  evaluated and th
a370: 65 20 72 65 73 75 6c 74 20 6c 65 66 74 20 69 6e  e result left in
a380: 20 72 65 67 69 73 74 65 72 20 72 65 67 2e 20 54   register reg. T
a390: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 67 65 6e  his function gen
a3a0: 65 72 61 74 65 73 20 56 4d 0a 2a 2a 20 63 6f 64  erates VM.** cod
a3b0: 65 20 74 6f 20 63 68 65 63 6b 20 74 68 61 74 20  e to check that 
a3c0: 74 68 65 20 76 61 6c 75 65 20 69 73 20 61 20 6e  the value is a n
a3d0: 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65  on-negative inte
a3e0: 67 65 72 20 61 6e 64 20 74 68 72 6f 77 73 20 61  ger and throws a
a3f0: 6e 0a 2a 2a 20 65 78 63 65 70 74 69 6f 6e 20 69  n.** exception i
a400: 66 20 69 74 20 69 73 20 6e 6f 74 2e 0a 2a 2f 0a  f it is not..*/.
a410: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64  static void wind
a420: 6f 77 43 68 65 63 6b 56 61 6c 75 65 28 50 61 72  owCheckValue(Par
a430: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
a440: 72 65 67 2c 20 69 6e 74 20 65 43 6f 6e 64 29 7b  reg, int eCond){
a450: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
a460: 63 68 61 72 20 2a 61 7a 45 72 72 5b 5d 20 3d 20  char *azErr[] = 
a470: 7b 0a 20 20 20 20 22 66 72 61 6d 65 20 73 74 61  {.    "frame sta
a480: 72 74 69 6e 67 20 6f 66 66 73 65 74 20 6d 75 73  rting offset mus
a490: 74 20 62 65 20 61 20 6e 6f 6e 2d 6e 65 67 61 74  t be a non-negat
a4a0: 69 76 65 20 69 6e 74 65 67 65 72 22 2c 0a 20 20  ive integer",.  
a4b0: 20 20 22 66 72 61 6d 65 20 65 6e 64 69 6e 67 20    "frame ending 
a4c0: 6f 66 66 73 65 74 20 6d 75 73 74 20 62 65 20 61  offset must be a
a4d0: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e   non-negative in
a4e0: 74 65 67 65 72 22 2c 0a 20 20 20 20 22 73 65 63  teger",.    "sec
a4f0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
a500: 6e 74 68 5f 76 61 6c 75 65 20 6d 75 73 74 20 62  nth_value must b
a510: 65 20 61 20 70 6f 73 69 74 69 76 65 20 69 6e 74  e a positive int
a520: 65 67 65 72 22 2c 0a 20 20 20 20 22 66 72 61 6d  eger",.    "fram
a530: 65 20 73 74 61 72 74 69 6e 67 20 6f 66 66 73 65  e starting offse
a540: 74 20 6d 75 73 74 20 62 65 20 61 20 6e 6f 6e 2d  t must be a non-
a550: 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 22  negative number"
a560: 2c 0a 20 20 20 20 22 66 72 61 6d 65 20 65 6e 64  ,.    "frame end
a570: 69 6e 67 20 6f 66 66 73 65 74 20 6d 75 73 74 20  ing offset must 
a580: 62 65 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  be a non-negativ
a590: 65 20 6e 75 6d 62 65 72 22 2c 0a 20 20 7d 3b 0a  e number",.  };.
a5a0: 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 4f 70    static int aOp
a5b0: 5b 5d 20 3d 20 7b 20 4f 50 5f 47 65 2c 20 4f 50  [] = { OP_Ge, OP
a5c0: 5f 47 65 2c 20 4f 50 5f 47 74 2c 20 4f 50 5f 47  _Ge, OP_Gt, OP_G
a5d0: 65 2c 20 4f 50 5f 47 65 20 7d 3b 0a 20 20 56 64  e, OP_Ge };.  Vd
a5e0: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
a5f0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
a600: 20 20 69 6e 74 20 72 65 67 5a 65 72 6f 20 3d 20    int regZero = 
a610: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
a620: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73  g(pParse);.  ass
a630: 65 72 74 28 20 65 43 6f 6e 64 3e 3d 30 20 26 26  ert( eCond>=0 &&
a640: 20 65 43 6f 6e 64 3c 41 72 72 61 79 53 69 7a 65   eCond<ArraySize
a650: 28 61 7a 45 72 72 29 20 29 3b 0a 20 20 73 71 6c  (azErr) );.  sql
a660: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
a670: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
a680: 20 72 65 67 5a 65 72 6f 29 3b 0a 20 20 69 66 28   regZero);.  if(
a690: 20 65 43 6f 6e 64 3e 3d 57 49 4e 44 4f 57 5f 53   eCond>=WINDOW_S
a6a0: 54 41 52 54 49 4e 47 5f 4e 55 4d 20 29 7b 0a 20  TARTING_NUM ){. 
a6b0: 20 20 20 69 6e 74 20 72 65 67 53 74 72 69 6e 67     int regString
a6c0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
a6d0: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
a6e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a6f0: 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  Op4(v, OP_String
a700: 38 2c 20 30 2c 20 72 65 67 53 74 72 69 6e 67 2c  8, 0, regString,
a710: 20 30 2c 20 22 22 2c 20 50 34 5f 53 54 41 54 49   0, "", P4_STATI
a720: 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  C);.    sqlite3V
a730: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
a740: 47 65 2c 20 72 65 67 53 74 72 69 6e 67 2c 20 73  Ge, regString, s
a750: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
a760: 74 41 64 64 72 28 76 29 2b 32 2c 20 72 65 67 29  tAddr(v)+2, reg)
a770: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
a780: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c  eChangeP5(v, SQL
a790: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 7c  ITE_AFF_NUMERIC|
a7a0: 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
a7b0: 4c 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  L);.    VdbeCove
a7c0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 61 73 73  rage(v);.    ass
a7d0: 65 72 74 28 20 65 43 6f 6e 64 3d 3d 33 20 7c 7c  ert( eCond==3 ||
a7e0: 20 65 43 6f 6e 64 3d 3d 34 20 29 3b 0a 20 20 20   eCond==4 );.   
a7f0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
a800: 76 2c 20 65 43 6f 6e 64 3d 3d 33 29 3b 0a 20 20  v, eCond==3);.  
a810: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
a820: 28 76 2c 20 65 43 6f 6e 64 3d 3d 34 29 3b 0a 20  (v, eCond==4);. 
a830: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
a840: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
a850: 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72   OP_MustBeInt, r
a860: 65 67 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  eg, sqlite3VdbeC
a870: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29  urrentAddr(v)+2)
a880: 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
a890: 67 65 28 76 29 3b 0a 20 20 20 20 61 73 73 65 72  ge(v);.    asser
a8a0: 74 28 20 65 43 6f 6e 64 3d 3d 30 20 7c 7c 20 65  t( eCond==0 || e
a8b0: 43 6f 6e 64 3d 3d 31 20 7c 7c 20 65 43 6f 6e 64  Cond==1 || eCond
a8c0: 3d 3d 32 20 29 3b 0a 20 20 20 20 56 64 62 65 43  ==2 );.    VdbeC
a8d0: 6f 76 65 72 61 67 65 49 66 28 76 2c 20 65 43 6f  overageIf(v, eCo
a8e0: 6e 64 3d 3d 30 29 3b 0a 20 20 20 20 56 64 62 65  nd==0);.    Vdbe
a8f0: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 65 43  CoverageIf(v, eC
a900: 6f 6e 64 3d 3d 31 29 3b 0a 20 20 20 20 56 64 62  ond==1);.    Vdb
a910: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 65  eCoverageIf(v, e
a920: 43 6f 6e 64 3d 3d 32 29 3b 0a 20 20 7d 0a 20 20  Cond==2);.  }.  
a930: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a940: 33 28 76 2c 20 61 4f 70 5b 65 43 6f 6e 64 5d 2c  3(v, aOp[eCond],
a950: 20 72 65 67 5a 65 72 6f 2c 20 73 71 6c 69 74 65   regZero, sqlite
a960: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
a970: 28 76 29 2b 32 2c 20 72 65 67 29 3b 0a 20 20 56  (v)+2, reg);.  V
a980: 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72  dbeCoverageNever
a990: 4e 75 6c 6c 49 66 28 76 2c 20 65 43 6f 6e 64 3d  NullIf(v, eCond=
a9a0: 3d 30 29 3b 20 2f 2a 20 4e 55 4c 4c 20 63 61 73  =0); /* NULL cas
a9b0: 65 20 63 61 70 74 75 72 65 64 20 62 79 20 2a 2f  e captured by */
a9c0: 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e  .  VdbeCoverageN
a9d0: 65 76 65 72 4e 75 6c 6c 49 66 28 76 2c 20 65 43  everNullIf(v, eC
a9e0: 6f 6e 64 3d 3d 31 29 3b 20 2f 2a 20 20 20 74 68  ond==1); /*   th
a9f0: 65 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 20 2a  e OP_MustBeInt *
aa00: 2f 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  /.  VdbeCoverage
aa10: 4e 65 76 65 72 4e 75 6c 6c 49 66 28 76 2c 20 65  NeverNullIf(v, e
aa20: 43 6f 6e 64 3d 3d 32 29 3b 0a 20 20 56 64 62 65  Cond==2);.  Vdbe
aa30: 43 6f 76 65 72 61 67 65 4e 65 76 65 72 4e 75 6c  CoverageNeverNul
aa40: 6c 49 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 33 29  lIf(v, eCond==3)
aa50: 3b 20 2f 2a 20 4e 55 4c 4c 20 63 61 73 65 20 63  ; /* NULL case c
aa60: 61 75 67 68 74 20 62 79 20 2a 2f 0a 20 20 56 64  aught by */.  Vd
aa70: 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72 4e  beCoverageNeverN
aa80: 75 6c 6c 49 66 28 76 2c 20 65 43 6f 6e 64 3d 3d  ullIf(v, eCond==
aa90: 34 29 3b 20 2f 2a 20 20 20 74 68 65 20 4f 50 5f  4); /*   the OP_
aaa0: 47 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4d  Ge */.  sqlite3M
aab0: 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b  ayAbort(pParse);
aac0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
aad0: 64 4f 70 32 28 76 2c 20 4f 50 5f 48 61 6c 74 2c  dOp2(v, OP_Halt,
aae0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 4f   SQLITE_ERROR, O
aaf0: 45 5f 41 62 6f 72 74 29 3b 0a 20 20 73 71 6c 69  E_Abort);.  sqli
ab00: 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
ab10: 76 2c 20 28 76 6f 69 64 2a 29 61 7a 45 72 72 5b  v, (void*)azErr[
ab20: 65 43 6f 6e 64 5d 2c 20 50 34 5f 53 54 41 54 49  eCond], P4_STATI
ab30: 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  C);.  sqlite3Rel
ab40: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
ab50: 73 65 2c 20 72 65 67 5a 65 72 6f 29 3b 0a 7d 0a  se, regZero);.}.
ab60: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
ab70: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  e number of argu
ab80: 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20  ments passed to 
ab90: 74 68 65 20 77 69 6e 64 6f 77 2d 66 75 6e 63 74  the window-funct
aba0: 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  ion associated.*
abb0: 2a 20 77 69 74 68 20 74 68 65 20 6f 62 6a 65 63  * with the objec
abc0: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
abd0: 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 74 6f  only argument to
abe0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
abf0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
ac00: 6e 64 6f 77 41 72 67 43 6f 75 6e 74 28 57 69 6e  ndowArgCount(Win
ac10: 64 6f 77 20 2a 70 57 69 6e 29 7b 0a 20 20 45 78  dow *pWin){.  Ex
ac20: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
ac30: 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e  pWin->pOwner->x.
ac40: 70 4c 69 73 74 3b 0a 20 20 72 65 74 75 72 6e 20  pList;.  return 
ac50: 28 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e  (pList ? pList->
ac60: 6e 45 78 70 72 20 3a 20 30 29 3b 0a 7d 0a 0a 2f  nExpr : 0);.}../
ac70: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 4d  *.** Generate VM
ac80: 20 63 6f 64 65 20 74 6f 20 69 6e 76 6f 6b 65 20   code to invoke 
ac90: 65 69 74 68 65 72 20 78 53 74 65 70 28 29 20 28  either xStep() (
aca0: 69 66 20 62 49 6e 76 65 72 73 65 20 69 73 20 30  if bInverse is 0
acb0: 29 20 6f 72 20 0a 2a 2a 20 78 49 6e 76 65 72 73  ) or .** xInvers
acc0: 65 20 28 69 66 20 62 49 6e 76 65 72 73 65 20 69  e (if bInverse i
acd0: 73 20 6e 6f 6e 2d 7a 65 72 6f 29 20 66 6f 72 20  s non-zero) for 
ace0: 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63  each window func
acf0: 74 69 6f 6e 20 69 6e 20 74 68 65 20 0a 2a 2a 20  tion in the .** 
ad00: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72  linked list star
ad10: 74 69 6e 67 20 61 74 20 70 4d 57 69 6e 2e 20 4f  ting at pMWin. O
ad20: 72 2c 20 66 6f 72 20 62 75 69 6c 74 2d 69 6e 20  r, for built-in 
ad30: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73  window functions
ad40: 0a 2a 2a 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  .** that do not 
ad50: 75 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64  use the standard
ad60: 20 66 75 6e 63 74 69 6f 6e 20 41 50 49 2c 20 67   function API, g
ad70: 65 6e 65 72 61 74 65 20 74 68 65 20 72 65 71 75  enerate the requ
ad80: 69 72 65 64 0a 2a 2a 20 69 6e 6c 69 6e 65 20 56  ired.** inline V
ad90: 4d 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  M code..**.** If
ada0: 20 61 72 67 75 6d 65 6e 74 20 63 73 72 20 69 73   argument csr is
adb0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
adc0: 20 65 71 75 61 6c 20 74 6f 20 30 2c 20 74 68 65   equal to 0, the
add0: 6e 20 61 72 67 75 6d 65 6e 74 20 72 65 67 20 69  n argument reg i
ade0: 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72  s.** the first r
adf0: 65 67 69 73 74 65 72 20 69 6e 20 61 6e 20 61 72  egister in an ar
ae00: 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
ae10: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
ae20: 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67  e large.** enoug
ae30: 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 61 72  h to hold the ar
ae40: 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ray of arguments
ae50: 20 66 6f 72 20 65 61 63 68 20 66 75 6e 63 74 69   for each functi
ae60: 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  on. In this case
ae70: 0a 2a 2a 20 74 68 65 20 61 72 67 75 6d 65 6e 74  .** the argument
ae80: 73 20 61 72 65 20 65 78 74 72 61 63 74 65 64 20  s are extracted 
ae90: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
aea0: 20 72 6f 77 20 6f 66 20 63 73 72 20 69 6e 74 6f   row of csr into
aeb0: 20 74 68 65 0a 2a 2a 20 61 72 72 61 79 20 6f 66   the.** array of
aec0: 20 72 65 67 69 73 74 65 72 73 20 62 65 66 6f 72   registers befor
aed0: 65 20 69 6e 76 6f 6b 69 6e 67 20 4f 50 5f 41 67  e invoking OP_Ag
aee0: 67 53 74 65 70 20 6f 72 20 4f 50 5f 41 67 67 49  gStep or OP_AggI
aef0: 6e 76 65 72 73 65 0a 2a 2a 0a 2a 2a 20 4f 72 2c  nverse.**.** Or,
af00: 20 69 66 20 63 73 72 20 69 73 20 6c 65 73 73 20   if csr is less 
af10: 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
af20: 74 68 65 20 61 72 72 61 79 20 6f 66 20 72 65 67  the array of reg
af30: 69 73 74 65 72 73 20 61 74 20 72 65 67 20 69 73  isters at reg is
af40: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 70 6f 70 75  .** already popu
af50: 6c 61 74 65 64 20 77 69 74 68 20 61 6c 6c 20 63  lated with all c
af60: 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20  olumns from the 
af70: 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74  current row of t
af80: 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a  he sub-query..**
af90: 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
afa0: 72 65 67 50 61 72 74 53 69 7a 65 20 69 73 20 6e  regPartSize is n
afb0: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74  on-zero, then it
afc0: 20 69 73 20 61 20 72 65 67 69 73 74 65 72 20 63   is a register c
afd0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 0a 2a 2a  ontaining the.**
afe0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
aff0: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  in the current p
b000: 61 72 74 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  artition..*/.sta
b010: 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 41  tic void windowA
b020: 67 67 53 74 65 70 28 0a 20 20 50 61 72 73 65 20  ggStep(.  Parse 
b030: 2a 70 50 61 72 73 65 2c 20 0a 20 20 57 69 6e 64  *pParse, .  Wind
b040: 6f 77 20 2a 70 4d 57 69 6e 2c 20 20 20 20 20 20  ow *pMWin,      
b050: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
b060: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 77 69  inked list of wi
b070: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 2a  ndow functions *
b080: 2f 0a 20 20 69 6e 74 20 63 73 72 2c 20 20 20 20  /.  int csr,    
b090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0a0: 20 20 20 20 2f 2a 20 52 65 61 64 20 61 72 67 75      /* Read argu
b0b0: 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 69 73 20  ments from this 
b0c0: 63 75 72 73 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  cursor */.  int 
b0d0: 62 49 6e 76 65 72 73 65 2c 20 20 20 20 20 20 20  bInverse,       
b0e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
b0f0: 72 75 65 20 74 6f 20 69 6e 76 6f 6b 65 20 78 49  rue to invoke xI
b100: 6e 76 65 72 73 65 20 69 6e 73 74 65 61 64 20 6f  nverse instead o
b110: 66 20 78 53 74 65 70 20 2a 2f 0a 20 20 69 6e 74  f xStep */.  int
b120: 20 72 65 67 20 20 20 20 20 20 20 20 20 20 20 20   reg            
b130: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b140: 41 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  Array of registe
b150: 72 73 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  rs */.){.  Vdbe 
b160: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
b170: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 57  dbe(pParse);.  W
b180: 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 66  indow *pWin;.  f
b190: 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70  or(pWin=pMWin; p
b1a0: 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e  Win; pWin=pWin->
b1b0: 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 46  pNextWin){.    F
b1c0: 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20 3d 20  uncDef *pFunc = 
b1d0: 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20 20  pWin->pFunc;.   
b1e0: 20 69 6e 74 20 72 65 67 41 72 67 3b 0a 20 20 20   int regArg;.   
b1f0: 20 69 6e 74 20 6e 41 72 67 20 3d 20 77 69 6e 64   int nArg = wind
b200: 6f 77 41 72 67 43 6f 75 6e 74 28 70 57 69 6e 29  owArgCount(pWin)
b210: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20  ;.    int i;..  
b220: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
b230: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  g; i++){.      i
b240: 66 28 20 69 21 3d 31 20 7c 7c 20 70 46 75 6e 63  f( i!=1 || pFunc
b250: 2d 3e 7a 4e 61 6d 65 21 3d 6e 74 68 5f 76 61 6c  ->zName!=nth_val
b260: 75 65 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  ueName ){.      
b270: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b280: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
b290: 2c 20 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72  , csr, pWin->iAr
b2a0: 67 43 6f 6c 2b 69 2c 20 72 65 67 2b 69 29 3b 0a  gCol+i, reg+i);.
b2b0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
b2c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b2d0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
b2e0: 75 6d 6e 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  umn, pMWin->iEph
b2f0: 43 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43  Csr, pWin->iArgC
b300: 6f 6c 2b 69 2c 20 72 65 67 2b 69 29 3b 0a 20 20  ol+i, reg+i);.  
b310: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
b320: 72 65 67 41 72 67 20 3d 20 72 65 67 3b 0a 0a 20  regArg = reg;.. 
b330: 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 72 65     if( pMWin->re
b340: 67 53 74 61 72 74 52 6f 77 69 64 3d 3d 30 0a 20  gStartRowid==0. 
b350: 20 20 20 20 26 26 20 28 70 46 75 6e 63 2d 3e 66      && (pFunc->f
b360: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
b370: 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 20 0a  E_FUNC_MINMAX) .
b380: 20 20 20 20 20 26 26 20 28 70 57 69 6e 2d 3e 65       && (pWin->e
b390: 53 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e  Start!=TK_UNBOUN
b3a0: 44 45 44 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  DED).    ){.    
b3b0: 20 20 69 6e 74 20 61 64 64 72 49 73 4e 75 6c 6c    int addrIsNull
b3c0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
b3d0: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp1(v, OP_IsNul
b3e0: 6c 2c 20 72 65 67 41 72 67 29 3b 0a 20 20 20 20  l, regArg);.    
b3f0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
b400: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 49 6e  );.      if( bIn
b410: 76 65 72 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20  verse==0 ){.    
b420: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b430: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
b440: 6d 6d 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70  mm, pWin->regApp
b450: 2b 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  +1, 1);.        
b460: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b470: 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72  2(v, OP_SCopy, r
b480: 65 67 41 72 67 2c 20 70 57 69 6e 2d 3e 72 65 67  egArg, pWin->reg
b490: 41 70 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71  App);.        sq
b4a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
b4b0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
b4c0: 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2c 20  , pWin->regApp, 
b4d0: 32 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b  2, pWin->regApp+
b4e0: 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2);.        sqli
b4f0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
b500: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
b510: 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20 70 57 69  Win->csrApp, pWi
b520: 6e 2d 3e 72 65 67 41 70 70 2b 32 29 3b 0a 20 20  n->regApp+2);.  
b530: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b540: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b550: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 53 65  dOp4Int(v, OP_Se
b560: 65 6b 47 45 2c 20 70 57 69 6e 2d 3e 63 73 72 41  ekGE, pWin->csrA
b570: 70 70 2c 20 30 2c 20 72 65 67 41 72 67 2c 20 31  pp, 0, regArg, 1
b580: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
b590: 6f 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b 65  overageNeverTake
b5a0: 6e 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  n(v);.        sq
b5b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
b5c0: 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 70 57  v, OP_Delete, pW
b5d0: 69 6e 2d 3e 63 73 72 41 70 70 29 3b 0a 20 20 20  in->csrApp);.   
b5e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b5f0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 73 71 6c 69  JumpHere(v, sqli
b600: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
b610: 64 72 28 76 29 2d 32 29 3b 0a 20 20 20 20 20 20  dr(v)-2);.      
b620: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
b630: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
b640: 64 64 72 49 73 4e 75 6c 6c 29 3b 0a 20 20 20 20  ddrIsNull);.    
b650: 7d 65 6c 73 65 20 69 66 28 20 70 57 69 6e 2d 3e  }else if( pWin->
b660: 72 65 67 41 70 70 20 29 7b 0a 20 20 20 20 20 20  regApp ){.      
b670: 61 73 73 65 72 74 28 20 70 46 75 6e 63 2d 3e 7a  assert( pFunc->z
b680: 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e  Name==nth_valueN
b690: 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ame.           |
b6a0: 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d  | pFunc->zName==
b6b0: 66 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65 0a  first_valueName.
b6c0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61        );.      a
b6d0: 73 73 65 72 74 28 20 62 49 6e 76 65 72 73 65 3d  ssert( bInverse=
b6e0: 3d 30 20 7c 7c 20 62 49 6e 76 65 72 73 65 3d 3d  =0 || bInverse==
b6f0: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
b700: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b710: 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 57 69 6e 2d  OP_AddImm, pWin-
b720: 3e 72 65 67 41 70 70 2b 31 2d 62 49 6e 76 65 72  >regApp+1-bInver
b730: 73 65 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73  se, 1);.    }els
b740: 65 20 69 66 28 20 70 46 75 6e 63 2d 3e 78 53 46  e if( pFunc->xSF
b750: 75 6e 63 21 3d 6e 6f 6f 70 53 74 65 70 46 75 6e  unc!=noopStepFun
b760: 63 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  c ){.      int a
b770: 64 64 72 49 66 20 3d 20 30 3b 0a 20 20 20 20 20  ddrIf = 0;.     
b780: 20 69 66 28 20 70 57 69 6e 2d 3e 70 46 69 6c 74   if( pWin->pFilt
b790: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  er ){.        in
b7a0: 74 20 72 65 67 54 6d 70 3b 0a 20 20 20 20 20 20  t regTmp;.      
b7b0: 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d    assert( nArg==
b7c0: 30 20 7c 7c 20 6e 41 72 67 3d 3d 70 57 69 6e 2d  0 || nArg==pWin-
b7d0: 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74  >pOwner->x.pList
b7e0: 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->nExpr );.     
b7f0: 20 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 20     assert( nArg 
b800: 7c 7c 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d  || pWin->pOwner-
b810: 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20  >x.pList==0 );. 
b820: 20 20 20 20 20 20 20 72 65 67 54 6d 70 20 3d 20         regTmp = 
b830: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
b840: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
b850: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b860: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
b870: 6e 2c 20 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41  n, csr, pWin->iA
b880: 72 67 43 6f 6c 2b 6e 41 72 67 2c 72 65 67 54 6d  rgCol+nArg,regTm
b890: 70 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72  p);.        addr
b8a0: 49 66 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  If = sqlite3Vdbe
b8b0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e  AddOp3(v, OP_IfN
b8c0: 6f 74 2c 20 72 65 67 54 6d 70 2c 20 30 2c 20 31  ot, regTmp, 0, 1
b8d0: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
b8e0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
b8f0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
b900: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
b910: 2c 20 72 65 67 54 6d 70 29 3b 0a 20 20 20 20 20  , regTmp);.     
b920: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 46 75   }.      if( pFu
b930: 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  nc->funcFlags & 
b940: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44  SQLITE_FUNC_NEED
b950: 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  COLL ){.        
b960: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
b970: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
b980: 6e 41 72 67 3e 30 20 29 3b 0a 20 20 20 20 20 20  nArg>0 );.      
b990: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
b9a0: 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70  3ExprNNCollSeq(p
b9b0: 50 61 72 73 65 2c 20 70 57 69 6e 2d 3e 70 4f 77  Parse, pWin->pOw
b9c0: 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  ner->x.pList->a[
b9d0: 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  0].pExpr);.     
b9e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b9f0: 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53  dOp4(v, OP_CollS
ba00: 65 71 2c 20 30 2c 30 2c 30 2c 20 28 63 6f 6e 73  eq, 0,0,0, (cons
ba10: 74 20 63 68 61 72 2a 29 70 43 6f 6c 6c 2c 20 50  t char*)pColl, P
ba20: 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
ba30: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
ba40: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 62  3VdbeAddOp3(v, b
ba50: 49 6e 76 65 72 73 65 3f 20 4f 50 5f 41 67 67 49  Inverse? OP_AggI
ba60: 6e 76 65 72 73 65 20 3a 20 4f 50 5f 41 67 67 53  nverse : OP_AggS
ba70: 74 65 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20  tep, .          
ba80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 49                bI
ba90: 6e 76 65 72 73 65 2c 20 72 65 67 41 72 67 2c 20  nverse, regArg, 
baa0: 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 29 3b  pWin->regAccum);
bab0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
bac0: 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 46  beAppendP4(v, pF
bad0: 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  unc, P4_FUNCDEF)
bae0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
baf0: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28  dbeChangeP5(v, (
bb00: 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20 20 20  u8)nArg);.      
bb10: 69 66 28 20 61 64 64 72 49 66 20 29 20 73 71 6c  if( addrIf ) sql
bb20: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
bb30: 28 76 2c 20 61 64 64 72 49 66 29 3b 0a 20 20 20  (v, addrIf);.   
bb40: 20 7d 0a 20 20 7d 0a 7d 0a 0a 74 79 70 65 64 65   }.  }.}..typede
bb50: 66 20 73 74 72 75 63 74 20 57 69 6e 64 6f 77 43  f struct WindowC
bb60: 6f 64 65 41 72 67 20 57 69 6e 64 6f 77 43 6f 64  odeArg WindowCod
bb70: 65 41 72 67 3b 0a 74 79 70 65 64 65 66 20 73 74  eArg;.typedef st
bb80: 72 75 63 74 20 57 69 6e 64 6f 77 43 73 72 41 6e  ruct WindowCsrAn
bb90: 64 52 65 67 20 57 69 6e 64 6f 77 43 73 72 41 6e  dReg WindowCsrAn
bba0: 64 52 65 67 3b 0a 73 74 72 75 63 74 20 57 69 6e  dReg;.struct Win
bbb0: 64 6f 77 43 73 72 41 6e 64 52 65 67 20 7b 0a 20  dowCsrAndReg {. 
bbc0: 20 69 6e 74 20 63 73 72 3b 0a 20 20 69 6e 74 20   int csr;.  int 
bbd0: 72 65 67 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  reg;.};..struct 
bbe0: 57 69 6e 64 6f 77 43 6f 64 65 41 72 67 20 7b 0a  WindowCodeArg {.
bbf0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
bc00: 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e  .  Window *pMWin
bc10: 3b 0a 20 20 56 64 62 65 20 2a 70 56 64 62 65 3b  ;.  Vdbe *pVdbe;
bc20: 0a 20 20 69 6e 74 20 72 65 67 47 6f 73 75 62 3b  .  int regGosub;
bc30: 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75 62  .  int addrGosub
bc40: 3b 0a 20 20 69 6e 74 20 72 65 67 41 72 67 3b 0a  ;.  int regArg;.
bc50: 20 20 69 6e 74 20 65 44 65 6c 65 74 65 3b 0a 0a    int eDelete;..
bc60: 20 20 57 69 6e 64 6f 77 43 73 72 41 6e 64 52 65    WindowCsrAndRe
bc70: 67 20 73 74 61 72 74 3b 0a 20 20 57 69 6e 64 6f  g start;.  Windo
bc80: 77 43 73 72 41 6e 64 52 65 67 20 63 75 72 72 65  wCsrAndReg curre
bc90: 6e 74 3b 0a 20 20 57 69 6e 64 6f 77 43 73 72 41  nt;.  WindowCsrA
bca0: 6e 64 52 65 67 20 65 6e 64 3b 0a 7d 3b 0a 0a 2f  ndReg end;.};../
bcb0: 2a 0a 2a 2a 20 56 61 6c 75 65 73 20 74 68 61 74  *.** Values that
bcc0: 20 6d 61 79 20 62 65 20 70 61 73 73 65 64 20 61   may be passed a
bcd0: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
bce0: 75 6d 65 6e 74 20 74 6f 20 77 69 6e 64 6f 77 43  ument to windowC
bcf0: 6f 64 65 4f 70 28 29 2e 0a 2a 2f 0a 23 64 65 66  odeOp()..*/.#def
bd00: 69 6e 65 20 57 49 4e 44 4f 57 5f 52 45 54 55 52  ine WINDOW_RETUR
bd10: 4e 5f 52 4f 57 20 31 0a 23 64 65 66 69 6e 65 20  N_ROW 1.#define 
bd20: 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53  WINDOW_AGGINVERS
bd30: 45 20 32 0a 23 64 65 66 69 6e 65 20 57 49 4e 44  E 2.#define WIND
bd40: 4f 57 5f 41 47 47 53 54 45 50 20 20 20 20 33 0a  OW_AGGSTEP    3.
bd50: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
bd60: 56 4d 20 63 6f 64 65 20 74 6f 20 72 65 61 64 20  VM code to read 
bd70: 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61 6d 65  the window frame
bd80: 73 20 70 65 65 72 20 76 61 6c 75 65 73 20 66 72  s peer values fr
bd90: 6f 6d 20 63 75 72 73 6f 72 20 63 73 72 20 69 6e  om cursor csr in
bda0: 74 6f 0a 2a 2a 20 61 6e 20 61 72 72 61 79 20 6f  to.** an array o
bdb0: 66 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72  f registers star
bdc0: 74 69 6e 67 20 61 74 20 72 65 67 2e 0a 2a 2f 0a  ting at reg..*/.
bdd0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64  static void wind
bde0: 6f 77 52 65 61 64 50 65 65 72 56 61 6c 75 65 73  owReadPeerValues
bdf0: 28 0a 20 20 57 69 6e 64 6f 77 43 6f 64 65 41 72  (.  WindowCodeAr
be00: 67 20 2a 70 2c 0a 20 20 69 6e 74 20 63 73 72 2c  g *p,.  int csr,
be10: 0a 20 20 69 6e 74 20 72 65 67 0a 29 7b 0a 20 20  .  int reg.){.  
be20: 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20  Window *pMWin = 
be30: 70 2d 3e 70 4d 57 69 6e 3b 0a 20 20 45 78 70 72  p->pMWin;.  Expr
be40: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
be50: 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79   pMWin->pOrderBy
be60: 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
be70: 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20   ){.    Vdbe *v 
be80: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
be90: 28 70 2d 3e 70 50 61 72 73 65 29 3b 0a 20 20 20  (p->pParse);.   
bea0: 20 45 78 70 72 4c 69 73 74 20 2a 70 50 61 72 74   ExprList *pPart
beb0: 20 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69   = pMWin->pParti
bec0: 74 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 69 43  tion;.    int iC
bed0: 6f 6c 4f 66 66 20 3d 20 70 4d 57 69 6e 2d 3e 6e  olOff = pMWin->n
bee0: 42 75 66 66 65 72 43 6f 6c 20 2b 20 28 70 50 61  BufferCol + (pPa
bef0: 72 74 20 3f 20 70 50 61 72 74 2d 3e 6e 45 78 70  rt ? pPart->nExp
bf00: 72 20 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74 20  r : 0);.    int 
bf10: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
bf20: 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
bf30: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  r; i++){.      s
bf40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
bf50: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63  (v, OP_Column, c
bf60: 73 72 2c 20 69 43 6f 6c 4f 66 66 2b 69 2c 20 72  sr, iColOff+i, r
bf70: 65 67 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  eg+i);.    }.  }
bf80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
bf90: 74 65 20 56 4d 20 63 6f 64 65 20 74 6f 20 69 6e  te VM code to in
bfa0: 76 6f 6b 65 20 65 69 74 68 65 72 20 78 56 61 6c  voke either xVal
bfb0: 75 65 28 29 20 28 62 46 69 6e 3d 3d 30 29 20 6f  ue() (bFin==0) o
bfc0: 72 20 78 46 69 6e 61 6c 69 7a 65 28 29 0a 2a 2a  r xFinalize().**
bfd0: 20 28 62 46 69 6e 3d 3d 31 29 20 66 6f 72 20 65   (bFin==1) for e
bfe0: 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  ach window funct
bff0: 69 6f 6e 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65  ion in the linke
c000: 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67 20  d list starting 
c010: 61 74 0a 2a 2a 20 70 4d 57 69 6e 2e 20 4f 72 2c  at.** pMWin. Or,
c020: 20 66 6f 72 20 62 75 69 6c 74 2d 69 6e 20 77 69   for built-in wi
c030: 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e 73 20 74  ndow-functions t
c040: 68 61 74 20 64 6f 20 6e 6f 74 20 75 73 65 20 74  hat do not use t
c050: 68 65 20 73 74 61 6e 64 61 72 64 0a 2a 2a 20 41  he standard.** A
c060: 50 49 2c 20 67 65 6e 65 72 61 74 65 20 74 68 65  PI, generate the
c070: 20 65 71 75 69 76 61 6c 65 6e 74 20 56 4d 20 63   equivalent VM c
c080: 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ode..*/.static v
c090: 6f 69 64 20 77 69 6e 64 6f 77 41 67 67 46 69 6e  oid windowAggFin
c0a0: 61 6c 28 57 69 6e 64 6f 77 43 6f 64 65 41 72 67  al(WindowCodeArg
c0b0: 20 2a 70 2c 20 69 6e 74 20 62 46 69 6e 29 7b 0a   *p, int bFin){.
c0c0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
c0d0: 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 57  = p->pParse;.  W
c0e0: 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70  indow *pMWin = p
c0f0: 2d 3e 70 4d 57 69 6e 3b 0a 20 20 56 64 62 65 20  ->pMWin;.  Vdbe 
c100: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
c110: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 57  dbe(pParse);.  W
c120: 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 0a 20 20  indow *pWin;..  
c130: 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20  for(pWin=pMWin; 
c140: 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d  pWin; pWin=pWin-
c150: 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20  >pNextWin){.    
c160: 69 66 28 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74  if( pMWin->regSt
c170: 61 72 74 52 6f 77 69 64 3d 3d 30 0a 20 20 20 20  artRowid==0.    
c180: 20 26 26 20 28 70 57 69 6e 2d 3e 70 46 75 6e 63   && (pWin->pFunc
c190: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
c1a0: 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58  LITE_FUNC_MINMAX
c1b0: 29 20 0a 20 20 20 20 20 26 26 20 28 70 57 69 6e  ) .     && (pWin
c1c0: 2d 3e 65 53 74 61 72 74 21 3d 54 4b 5f 55 4e 42  ->eStart!=TK_UNB
c1d0: 4f 55 4e 44 45 44 29 0a 20 20 20 20 29 7b 0a 20  OUNDED).    ){. 
c1e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c1f0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
c200: 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 52  l, 0, pWin->regR
c210: 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 73 71  esult);.      sq
c220: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
c230: 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 57 69 6e  v, OP_Last, pWin
c240: 2d 3e 63 73 72 41 70 70 29 3b 0a 20 20 20 20 20  ->csrApp);.     
c250: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
c260: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
c270: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
c280: 43 6f 6c 75 6d 6e 2c 20 70 57 69 6e 2d 3e 63 73  Column, pWin->cs
c290: 72 41 70 70 2c 20 30 2c 20 70 57 69 6e 2d 3e 72  rApp, 0, pWin->r
c2a0: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
c2b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
c2c0: 48 65 72 65 28 76 2c 20 73 71 6c 69 74 65 33 56  Here(v, sqlite3V
c2d0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
c2e0: 29 2d 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  )-2);.    }else 
c2f0: 69 66 28 20 70 57 69 6e 2d 3e 72 65 67 41 70 70  if( pWin->regApp
c300: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
c310: 28 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72  ( pMWin->regStar
c320: 74 52 6f 77 69 64 3d 3d 30 20 29 3b 0a 20 20 20  tRowid==0 );.   
c330: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
c340: 74 20 6e 41 72 67 20 3d 20 77 69 6e 64 6f 77 41  t nArg = windowA
c350: 72 67 43 6f 75 6e 74 28 70 57 69 6e 29 3b 0a 20  rgCount(pWin);. 
c360: 20 20 20 20 20 69 66 28 20 62 46 69 6e 20 29 7b       if( bFin ){
c370: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
c380: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
c390: 5f 41 67 67 46 69 6e 61 6c 2c 20 70 57 69 6e 2d  _AggFinal, pWin-
c3a0: 3e 72 65 67 41 63 63 75 6d 2c 20 6e 41 72 67 29  >regAccum, nArg)
c3b0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
c3c0: 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c  3VdbeAppendP4(v,
c3d0: 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2c 20 50 34   pWin->pFunc, P4
c3e0: 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20  _FUNCDEF);.     
c3f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c400: 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
c410: 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 2c   pWin->regAccum,
c420: 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74   pWin->regResult
c430: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
c440: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
c450: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e  OP_Null, 0, pWin
c460: 2d 3e 72 65 67 41 63 63 75 6d 29 3b 0a 20 20 20  ->regAccum);.   
c470: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c480: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c490: 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67 56 61 6c  Op3(v, OP_AggVal
c4a0: 75 65 2c 70 57 69 6e 2d 3e 72 65 67 41 63 63 75  ue,pWin->regAccu
c4b0: 6d 2c 6e 41 72 67 2c 70 57 69 6e 2d 3e 72 65 67  m,nArg,pWin->reg
c4c0: 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 20  Result);.       
c4d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65   sqlite3VdbeAppe
c4e0: 6e 64 50 34 28 76 2c 20 70 57 69 6e 2d 3e 70 46  ndP4(v, pWin->pF
c4f0: 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  unc, P4_FUNCDEF)
c500: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c510: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
c520: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63 61  erate code to ca
c530: 6c 63 75 6c 61 74 65 20 74 68 65 20 63 75 72 72  lculate the curr
c540: 65 6e 74 20 76 61 6c 75 65 73 20 6f 66 20 61 6c  ent values of al
c550: 6c 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  l window functio
c560: 6e 73 20 69 6e 20 74 68 65 0a 2a 2a 20 70 2d 3e  ns in the.** p->
c570: 70 4d 57 69 6e 20 6c 69 73 74 20 62 79 20 64 6f  pMWin list by do
c580: 69 6e 67 20 61 20 66 75 6c 6c 20 73 63 61 6e 20  ing a full scan 
c590: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 77  of the current w
c5a0: 69 6e 64 6f 77 20 66 72 61 6d 65 2e 20 53 74 6f  indow frame. Sto
c5b0: 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74  re the.** result
c5c0: 73 20 69 6e 20 74 68 65 20 57 69 6e 64 6f 77 2e  s in the Window.
c5d0: 72 65 67 52 65 73 75 6c 74 20 72 65 67 69 73 74  regResult regist
c5e0: 65 72 73 2c 20 72 65 61 64 79 20 74 6f 20 72 65  ers, ready to re
c5f0: 74 75 72 6e 20 74 68 65 20 75 70 70 65 72 0a 2a  turn the upper.*
c600: 2a 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74  * layer..*/.stat
c610: 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 46 75  ic void windowFu
c620: 6c 6c 53 63 61 6e 28 57 69 6e 64 6f 77 43 6f 64  llScan(WindowCod
c630: 65 41 72 67 20 2a 70 29 7b 0a 20 20 57 69 6e 64  eArg *p){.  Wind
c640: 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 50 61 72 73  ow *pWin;.  Pars
c650: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70  e *pParse = p->p
c660: 50 61 72 73 65 3b 0a 20 20 57 69 6e 64 6f 77 20  Parse;.  Window 
c670: 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 4d 57 69  *pMWin = p->pMWi
c680: 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  n;.  Vdbe *v = p
c690: 2d 3e 70 56 64 62 65 3b 0a 0a 20 20 69 6e 74 20  ->pVdbe;..  int 
c6a0: 72 65 67 43 52 6f 77 69 64 20 3d 20 30 3b 20 20  regCRowid = 0;  
c6b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
c6c0: 75 72 72 65 6e 74 20 72 6f 77 69 64 20 76 61 6c  urrent rowid val
c6d0: 75 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43  ue */.  int regC
c6e0: 50 65 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  Peer = 0;       
c6f0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
c700: 6e 74 20 70 65 65 72 20 76 61 6c 75 65 73 20 2a  nt peer values *
c710: 2f 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64  /.  int regRowid
c720: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
c730: 20 20 20 20 2f 2a 20 41 67 67 53 74 65 70 20 72      /* AggStep r
c740: 6f 77 69 64 20 76 61 6c 75 65 20 2a 2f 0a 20 20  owid value */.  
c750: 69 6e 74 20 72 65 67 50 65 65 72 20 3d 20 30 3b  int regPeer = 0;
c760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c770: 2f 2a 20 41 67 67 53 74 65 70 20 70 65 65 72 20  /* AggStep peer 
c780: 76 61 6c 75 65 73 20 2a 2f 0a 0a 20 20 69 6e 74  values */..  int
c790: 20 6e 50 65 65 72 3b 0a 20 20 69 6e 74 20 6c 62   nPeer;.  int lb
c7a0: 6c 4e 65 78 74 3b 0a 20 20 69 6e 74 20 6c 62 6c  lNext;.  int lbl
c7b0: 42 72 6b 3b 0a 20 20 69 6e 74 20 61 64 64 72 4e  Brk;.  int addrN
c7c0: 65 78 74 3b 0a 20 20 69 6e 74 20 63 73 72 20 3d  ext;.  int csr =
c7d0: 20 70 4d 57 69 6e 2d 3e 63 73 72 41 70 70 3b 0a   pMWin->csrApp;.
c7e0: 0a 20 20 6e 50 65 65 72 20 3d 20 28 70 4d 57 69  .  nPeer = (pMWi
c7f0: 6e 2d 3e 70 4f 72 64 65 72 42 79 20 3f 20 70 4d  n->pOrderBy ? pM
c800: 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  Win->pOrderBy->n
c810: 45 78 70 72 20 3a 20 30 29 3b 0a 0a 20 20 6c 62  Expr : 0);..  lb
c820: 6c 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56  lNext = sqlite3V
c830: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
c840: 72 73 65 29 3b 0a 20 20 6c 62 6c 42 72 6b 20 3d  rse);.  lblBrk =
c850: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
c860: 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a  Label(pParse);..
c870: 20 20 72 65 67 43 52 6f 77 69 64 20 3d 20 73 71    regCRowid = sq
c880: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
c890: 70 50 61 72 73 65 29 3b 0a 20 20 72 65 67 52 6f  pParse);.  regRo
c8a0: 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74  wid = sqlite3Get
c8b0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
c8c0: 0a 20 20 69 66 28 20 6e 50 65 65 72 20 29 7b 0a  .  if( nPeer ){.
c8d0: 20 20 20 20 72 65 67 43 50 65 65 72 20 3d 20 73      regCPeer = s
c8e0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
c8f0: 67 65 28 70 50 61 72 73 65 2c 20 6e 50 65 65 72  ge(pParse, nPeer
c900: 29 3b 0a 20 20 20 20 72 65 67 50 65 65 72 20 3d  );.    regPeer =
c910: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
c920: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 50 65  ange(pParse, nPe
c930: 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  er);.  }..  sqli
c940: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
c950: 20 4f 50 5f 52 6f 77 69 64 2c 20 70 4d 57 69 6e   OP_Rowid, pMWin
c960: 2d 3e 69 45 70 68 43 73 72 2c 20 72 65 67 43 52  ->iEphCsr, regCR
c970: 6f 77 69 64 29 3b 0a 20 20 77 69 6e 64 6f 77 52  owid);.  windowR
c980: 65 61 64 50 65 65 72 56 61 6c 75 65 73 28 70 2c  eadPeerValues(p,
c990: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c   pMWin->iEphCsr,
c9a0: 20 72 65 67 43 50 65 65 72 29 3b 0a 0a 20 20 66   regCPeer);..  f
c9b0: 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70  or(pWin=pMWin; p
c9c0: 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e  Win; pWin=pWin->
c9d0: 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 73  pNextWin){.    s
c9e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
c9f0: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
ca00: 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 29 3b  pWin->regAccum);
ca10: 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56  .  }..  sqlite3V
ca20: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
ca30: 53 65 65 6b 47 45 2c 20 63 73 72 2c 20 6c 62 6c  SeekGE, csr, lbl
ca40: 42 72 6b 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 53  Brk, pMWin->regS
ca50: 74 61 72 74 52 6f 77 69 64 29 3b 0a 20 20 56 64  tartRowid);.  Vd
ca60: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
ca70: 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69   addrNext = sqli
ca80: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
ca90: 64 72 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  dr(v);.  sqlite3
caa0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
cab0: 5f 52 6f 77 69 64 2c 20 63 73 72 2c 20 72 65 67  _Rowid, csr, reg
cac0: 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65  Rowid);.  sqlite
cad0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
cae0: 50 5f 47 74 2c 20 70 4d 57 69 6e 2d 3e 72 65 67  P_Gt, pMWin->reg
caf0: 45 6e 64 52 6f 77 69 64 2c 20 6c 62 6c 42 72 6b  EndRowid, lblBrk
cb00: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 56  , regRowid);.  V
cb10: 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72  dbeCoverageNever
cb20: 4e 75 6c 6c 28 76 29 3b 0a 0a 20 20 69 66 28 20  Null(v);..  if( 
cb30: 70 4d 57 69 6e 2d 3e 65 45 78 63 6c 75 64 65 3d  pMWin->eExclude=
cb40: 3d 54 4b 5f 43 55 52 52 45 4e 54 20 29 7b 0a 20  =TK_CURRENT ){. 
cb50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cb60: 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20 72  dOp3(v, OP_Eq, r
cb70: 65 67 43 52 6f 77 69 64 2c 20 6c 62 6c 4e 65 78  egCRowid, lblNex
cb80: 74 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  t, regRowid);.  
cb90: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65    VdbeCoverageNe
cba0: 76 65 72 4e 75 6c 6c 28 76 29 3b 0a 20 20 7d 65  verNull(v);.  }e
cbb0: 6c 73 65 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65  lse if( pMWin->e
cbc0: 45 78 63 6c 75 64 65 21 3d 54 4b 5f 4e 4f 20 29  Exclude!=TK_NO )
cbd0: 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a  {.    int addr;.
cbe0: 20 20 20 20 69 6e 74 20 61 64 64 72 45 71 20 3d      int addrEq =
cbf0: 20 30 3b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   0;.    KeyInfo 
cc00: 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 0a 0a  *pKeyInfo = 0;..
cc10: 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70      if( pMWin->p
cc20: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
cc30: 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69   pKeyInfo = sqli
cc40: 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78  te3KeyInfoFromEx
cc50: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
cc60: 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 2c 20  MWin->pOrderBy, 
cc70: 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 0);.    }.   
cc80: 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 78 63   if( pMWin->eExc
cc90: 6c 75 64 65 3d 3d 54 4b 5f 54 49 45 53 20 29 7b  lude==TK_TIES ){
cca0: 0a 20 20 20 20 20 20 61 64 64 72 45 71 20 3d 20  .      addrEq = 
ccb0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ccc0: 33 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65 67 43  3(v, OP_Eq, regC
ccd0: 52 6f 77 69 64 2c 20 30 2c 20 72 65 67 52 6f 77  Rowid, 0, regRow
cce0: 69 64 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  id);.      VdbeC
ccf0: 6f 76 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c  overageNeverNull
cd00: 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  (v);.    }.    i
cd10: 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  f( pKeyInfo ){. 
cd20: 20 20 20 20 20 77 69 6e 64 6f 77 52 65 61 64 50       windowReadP
cd30: 65 65 72 56 61 6c 75 65 73 28 70 2c 20 63 73 72  eerValues(p, csr
cd40: 2c 20 72 65 67 50 65 65 72 29 3b 0a 20 20 20 20  , regPeer);.    
cd50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
cd60: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72  Op3(v, OP_Compar
cd70: 65 2c 20 72 65 67 50 65 65 72 2c 20 72 65 67 43  e, regPeer, regC
cd80: 50 65 65 72 2c 20 6e 50 65 65 72 29 3b 0a 20 20  Peer, nPeer);.  
cd90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
cda0: 70 70 65 6e 64 50 34 28 76 2c 20 28 76 6f 69 64  ppendP4(v, (void
cdb0: 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
cdc0: 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 61  EYINFO);.      a
cdd0: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
cde0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
cdf0: 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
ce00: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
ce10: 5f 4a 75 6d 70 2c 20 61 64 64 72 2c 20 6c 62 6c  _Jump, addr, lbl
ce20: 4e 65 78 74 2c 20 61 64 64 72 29 3b 0a 20 20 20  Next, addr);.   
ce30: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 45     VdbeCoverageE
ce40: 71 4e 65 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73  qNe(v);.    }els
ce50: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
ce60: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
ce70: 5f 47 6f 74 6f 2c 20 30 2c 20 6c 62 6c 4e 65 78  _Goto, 0, lblNex
ce80: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
ce90: 28 20 61 64 64 72 45 71 20 29 20 73 71 6c 69 74  ( addrEq ) sqlit
cea0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
ceb0: 2c 20 61 64 64 72 45 71 29 3b 0a 20 20 7d 0a 0a  , addrEq);.  }..
cec0: 20 20 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28    windowAggStep(
ced0: 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 63  pParse, pMWin, c
cee0: 73 72 2c 20 30 2c 20 70 2d 3e 72 65 67 41 72 67  sr, 0, p->regArg
cef0: 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62  );..  sqlite3Vdb
cf00: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
cf10: 20 6c 62 6c 4e 65 78 74 29 3b 0a 20 20 73 71 6c   lblNext);.  sql
cf20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
cf30: 2c 20 4f 50 5f 4e 65 78 74 2c 20 63 73 72 2c 20  , OP_Next, csr, 
cf40: 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 56 64 62  addrNext);.  Vdb
cf50: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
cf60: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
cf70: 65 72 65 28 76 2c 20 61 64 64 72 4e 65 78 74 2d  ere(v, addrNext-
cf80: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
cf90: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
cfa0: 72 4e 65 78 74 2b 31 29 3b 0a 20 20 73 71 6c 69  rNext+1);.  sqli
cfb0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
cfc0: 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77  g(pParse, regRow
cfd0: 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  id);.  sqlite3Re
cfe0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
cff0: 72 73 65 2c 20 72 65 67 43 52 6f 77 69 64 29 3b  rse, regCRowid);
d000: 0a 20 20 69 66 28 20 6e 50 65 65 72 20 29 7b 0a  .  if( nPeer ){.
d010: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
d020: 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
d030: 73 65 2c 20 72 65 67 50 65 65 72 2c 20 6e 50 65  se, regPeer, nPe
d040: 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  er);.    sqlite3
d050: 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
d060: 28 70 50 61 72 73 65 2c 20 72 65 67 43 50 65 65  (pParse, regCPee
d070: 72 2c 20 6e 50 65 65 72 29 3b 0a 20 20 7d 0a 0a  r, nPeer);.  }..
d080: 20 20 77 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c    windowAggFinal
d090: 28 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (p, 1);.}../*.**
d0a0: 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 75 62 2d   Invoke the sub-
d0b0: 72 6f 75 74 69 6e 65 20 61 74 20 72 65 67 47 6f  routine at regGo
d0c0: 73 75 62 20 28 67 65 6e 65 72 61 74 65 64 20 62  sub (generated b
d0d0: 79 20 63 6f 64 65 20 69 6e 20 73 65 6c 65 63 74  y code in select
d0e0: 2e 63 29 20 74 6f 0a 2a 2a 20 72 65 74 75 72 6e  .c) to.** return
d0f0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
d100: 20 6f 66 20 57 69 6e 64 6f 77 2e 69 45 70 68 43   of Window.iEphC
d110: 73 72 2e 20 49 66 20 61 6c 6c 20 77 69 6e 64 6f  sr. If all windo
d120: 77 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 0a  w functions are.
d130: 2a 2a 20 61 67 67 72 65 67 61 74 65 20 77 69 6e  ** aggregate win
d140: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  dow functions th
d150: 61 74 20 75 73 65 20 74 68 65 20 73 74 61 6e 64  at use the stand
d160: 61 72 64 20 41 50 49 2c 20 61 20 73 69 6e 67 6c  ard API, a singl
d170: 65 0a 2a 2a 20 4f 50 5f 47 6f 73 75 62 20 69 6e  e.** OP_Gosub in
d180: 73 74 72 75 63 74 69 6f 6e 20 69 73 20 61 6c 6c  struction is all
d190: 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69   that this routi
d1a0: 6e 65 20 67 65 6e 65 72 61 74 65 73 2e 20 45 78  ne generates. Ex
d1b0: 74 72 61 20 56 4d 20 63 6f 64 65 0a 2a 2a 20 66  tra VM code.** f
d1c0: 6f 72 20 70 65 72 2d 72 6f 77 20 70 72 6f 63 65  or per-row proce
d1d0: 73 73 69 6e 67 20 69 73 20 6f 6e 6c 79 20 67 65  ssing is only ge
d1e0: 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68 65 20  nerated for the 
d1f0: 66 6f 6c 6c 6f 77 69 6e 67 20 62 75 69 6c 74 2d  following built-
d200: 69 6e 20 77 69 6e 64 6f 77 0a 2a 2a 20 66 75 6e  in window.** fun
d210: 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ctions:.**.**   
d220: 6e 74 68 5f 76 61 6c 75 65 28 29 0a 2a 2a 20 20  nth_value().**  
d230: 20 66 69 72 73 74 5f 76 61 6c 75 65 28 29 0a 2a   first_value().*
d240: 2a 20 20 20 6c 61 67 28 29 0a 2a 2a 20 20 20 6c  *   lag().**   l
d250: 65 61 64 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20  ead().*/.static 
d260: 76 6f 69 64 20 77 69 6e 64 6f 77 52 65 74 75 72  void windowRetur
d270: 6e 4f 6e 65 52 6f 77 28 57 69 6e 64 6f 77 43 6f  nOneRow(WindowCo
d280: 64 65 41 72 67 20 2a 70 29 7b 0a 20 20 57 69 6e  deArg *p){.  Win
d290: 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e  dow *pMWin = p->
d2a0: 70 4d 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76  pMWin;.  Vdbe *v
d2b0: 20 3d 20 70 2d 3e 70 56 64 62 65 3b 0a 0a 20 20   = p->pVdbe;..  
d2c0: 69 66 28 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74  if( pMWin->regSt
d2d0: 61 72 74 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  artRowid ){.    
d2e0: 77 69 6e 64 6f 77 46 75 6c 6c 53 63 61 6e 28 70  windowFullScan(p
d2f0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
d300: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
d310: 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 57  p->pParse;.    W
d320: 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 0a 20 20  indow *pWin;..  
d330: 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e    for(pWin=pMWin
d340: 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69  ; pWin; pWin=pWi
d350: 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20  n->pNextWin){.  
d360: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 46 75      FuncDef *pFu
d370: 6e 63 20 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63  nc = pWin->pFunc
d380: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 75 6e  ;.      if( pFun
d390: 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61  c->zName==nth_va
d3a0: 6c 75 65 4e 61 6d 65 0a 20 20 20 20 20 20 20 7c  lueName.       |
d3b0: 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d  | pFunc->zName==
d3c0: 66 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65 0a  first_valueName.
d3d0: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
d3e0: 20 69 6e 74 20 63 73 72 20 3d 20 70 57 69 6e 2d   int csr = pWin-
d3f0: 3e 63 73 72 41 70 70 3b 0a 20 20 20 20 20 20 20  >csrApp;.       
d400: 20 69 6e 74 20 6c 62 6c 20 3d 20 73 71 6c 69 74   int lbl = sqlit
d410: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
d420: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
d430: 20 69 6e 74 20 74 6d 70 52 65 67 20 3d 20 73 71   int tmpReg = sq
d440: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
d450: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
d460: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d470: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
d480: 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c  , pWin->regResul
d490: 74 29 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 69  t);.  .        i
d4a0: 66 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d  f( pFunc->zName=
d4b0: 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 20 29  =nth_valueName )
d4c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
d4d0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
d4e0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 70 4d 57 69 6e   OP_Column,pMWin
d4f0: 2d 3e 69 45 70 68 43 73 72 2c 70 57 69 6e 2d 3e  ->iEphCsr,pWin->
d500: 69 41 72 67 43 6f 6c 2b 31 2c 74 6d 70 52 65 67  iArgCol+1,tmpReg
d510: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 77 69 6e  );.          win
d520: 64 6f 77 43 68 65 63 6b 56 61 6c 75 65 28 70 50  dowCheckValue(pP
d530: 61 72 73 65 2c 20 74 6d 70 52 65 67 2c 20 32 29  arse, tmpReg, 2)
d540: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
d550: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
d560: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
d570: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74  OP_Integer, 1, t
d580: 6d 70 52 65 67 29 3b 0a 20 20 20 20 20 20 20 20  mpReg);.        
d590: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
d5a0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
d5b0: 50 5f 41 64 64 2c 20 74 6d 70 52 65 67 2c 20 70  P_Add, tmpReg, p
d5c0: 57 69 6e 2d 3e 72 65 67 41 70 70 2c 20 74 6d 70  Win->regApp, tmp
d5d0: 52 65 67 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Reg);.        sq
d5e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
d5f0: 76 2c 20 4f 50 5f 47 74 2c 20 70 57 69 6e 2d 3e  v, OP_Gt, pWin->
d600: 72 65 67 41 70 70 2b 31 2c 20 6c 62 6c 2c 20 74  regApp+1, lbl, t
d610: 6d 70 52 65 67 29 3b 0a 20 20 20 20 20 20 20 20  mpReg);.        
d620: 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65  VdbeCoverageNeve
d630: 72 4e 75 6c 6c 28 76 29 3b 0a 20 20 20 20 20 20  rNull(v);.      
d640: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d650: 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f  Op3(v, OP_SeekRo
d660: 77 69 64 2c 20 63 73 72 2c 20 30 2c 20 74 6d 70  wid, csr, 0, tmp
d670: 52 65 67 29 3b 0a 20 20 20 20 20 20 20 20 56 64  Reg);.        Vd
d680: 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72 54  beCoverageNeverT
d690: 61 6b 65 6e 28 76 29 3b 0a 20 20 20 20 20 20 20  aken(v);.       
d6a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d6b0: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
d6c0: 20 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67   csr, pWin->iArg
d6d0: 43 6f 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65  Col, pWin->regRe
d6e0: 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 73  sult);.        s
d6f0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
d700: 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a  eLabel(v, lbl);.
d710: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
d720: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
d730: 61 72 73 65 2c 20 74 6d 70 52 65 67 29 3b 0a 20  arse, tmpReg);. 
d740: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73       }.      els
d750: 65 20 69 66 28 20 70 46 75 6e 63 2d 3e 7a 4e 61  e if( pFunc->zNa
d760: 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65 20 7c 7c 20  me==leadName || 
d770: 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 61  pFunc->zName==la
d780: 67 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  gName ){.       
d790: 20 69 6e 74 20 6e 41 72 67 20 3d 20 70 57 69 6e   int nArg = pWin
d7a0: 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73  ->pOwner->x.pLis
d7b0: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
d7c0: 20 20 69 6e 74 20 63 73 72 20 3d 20 70 57 69 6e    int csr = pWin
d7d0: 2d 3e 63 73 72 41 70 70 3b 0a 20 20 20 20 20 20  ->csrApp;.      
d7e0: 20 20 69 6e 74 20 6c 62 6c 20 3d 20 73 71 6c 69    int lbl = sqli
d7f0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
d800: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
d810: 20 20 69 6e 74 20 74 6d 70 52 65 67 20 3d 20 73    int tmpReg = s
d820: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
d830: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
d840: 20 20 69 6e 74 20 69 45 70 68 20 3d 20 70 4d 57    int iEph = pMW
d850: 69 6e 2d 3e 69 45 70 68 43 73 72 3b 0a 20 20 0a  in->iEphCsr;.  .
d860: 20 20 20 20 20 20 20 20 69 66 28 20 6e 41 72 67          if( nArg
d870: 3c 33 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <3 ){.          
d880: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d890: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
d8a0: 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74   pWin->regResult
d8b0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
d8c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
d8d0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
d8e0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 45 70 68   OP_Column, iEph
d8f0: 2c 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 32  ,pWin->iArgCol+2
d900: 2c 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74  ,pWin->regResult
d910: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
d920: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d930: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
d940: 69 64 2c 20 69 45 70 68 2c 20 74 6d 70 52 65 67  id, iEph, tmpReg
d950: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
d960: 41 72 67 3c 32 20 29 7b 0a 20 20 20 20 20 20 20  Arg<2 ){.       
d970: 20 20 20 69 6e 74 20 76 61 6c 20 3d 20 28 70 46     int val = (pF
d980: 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64  unc->zName==lead
d990: 4e 61 6d 65 20 3f 20 31 20 3a 20 2d 31 29 3b 0a  Name ? 1 : -1);.
d9a0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d9b0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
d9c0: 50 5f 41 64 64 49 6d 6d 2c 20 74 6d 70 52 65 67  P_AddImm, tmpReg
d9d0: 2c 20 76 61 6c 29 3b 0a 20 20 20 20 20 20 20 20  , val);.        
d9e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
d9f0: 20 69 6e 74 20 6f 70 20 3d 20 28 70 46 75 6e 63   int op = (pFunc
da00: 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d  ->zName==leadNam
da10: 65 20 3f 20 4f 50 5f 41 64 64 20 3a 20 4f 50 5f  e ? OP_Add : OP_
da20: 53 75 62 74 72 61 63 74 29 3b 0a 20 20 20 20 20  Subtract);.     
da30: 20 20 20 20 20 69 6e 74 20 74 6d 70 52 65 67 32       int tmpReg2
da40: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
da50: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
da60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
da70: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
da80: 43 6f 6c 75 6d 6e 2c 20 69 45 70 68 2c 20 70 57  Column, iEph, pW
da90: 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 31 2c 20 74  in->iArgCol+1, t
daa0: 6d 70 52 65 67 32 29 3b 0a 20 20 20 20 20 20 20  mpReg2);.       
dab0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
dac0: 64 4f 70 33 28 76 2c 20 6f 70 2c 20 74 6d 70 52  dOp3(v, op, tmpR
dad0: 65 67 32 2c 20 74 6d 70 52 65 67 2c 20 74 6d 70  eg2, tmpReg, tmp
dae0: 52 65 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Reg);.          
daf0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
db00: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 74 6d  mpReg(pParse, tm
db10: 70 52 65 67 32 29 3b 0a 20 20 20 20 20 20 20 20  pReg2);.        
db20: 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 73 71 6c  }.  .        sql
db30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
db40: 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20  , OP_SeekRowid, 
db50: 63 73 72 2c 20 6c 62 6c 2c 20 74 6d 70 52 65 67  csr, lbl, tmpReg
db60: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
db70: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
db80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
db90: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
dba0: 6d 6e 2c 20 63 73 72 2c 20 70 57 69 6e 2d 3e 69  mn, csr, pWin->i
dbb0: 41 72 67 43 6f 6c 2c 20 70 57 69 6e 2d 3e 72 65  ArgCol, pWin->re
dbc0: 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20  gResult);.      
dbd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
dbe0: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c  olveLabel(v, lbl
dbf0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
dc00: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
dc10: 28 70 50 61 72 73 65 2c 20 74 6d 70 52 65 67 29  (pParse, tmpReg)
dc20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
dc30: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
dc40: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
dc50: 73 75 62 2c 20 70 2d 3e 72 65 67 47 6f 73 75 62  sub, p->regGosub
dc60: 2c 20 70 2d 3e 61 64 64 72 47 6f 73 75 62 29 3b  , p->addrGosub);
dc70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
dc80: 74 65 20 63 6f 64 65 20 74 6f 20 73 65 74 20 74  te code to set t
dc90: 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72  he accumulator r
dca0: 65 67 69 73 74 65 72 20 66 6f 72 20 65 61 63 68  egister for each
dcb0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
dcc0: 0a 2a 2a 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65  .** in the linke
dcd0: 64 20 6c 69 73 74 20 70 61 73 73 65 64 20 61 73  d list passed as
dce0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
dcf0: 6d 65 6e 74 20 74 6f 20 4e 55 4c 4c 2e 20 41 6e  ment to NULL. An
dd00: 64 20 70 65 72 66 6f 72 6d 0a 2a 2a 20 61 6e 79  d perform.** any
dd10: 20 65 71 75 69 76 61 6c 65 6e 74 20 69 6e 69 74   equivalent init
dd20: 69 61 6c 69 7a 61 74 69 6f 6e 20 72 65 71 75 69  ialization requi
dd30: 72 65 64 20 62 79 20 61 6e 79 20 62 75 69 6c 74  red by any built
dd40: 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  -in window funct
dd50: 69 6f 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 6c  ions.** in the l
dd60: 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ist..*/.static i
dd70: 6e 74 20 77 69 6e 64 6f 77 49 6e 69 74 41 63 63  nt windowInitAcc
dd80: 75 6d 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  um(Parse *pParse
dd90: 2c 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 29  , Window *pMWin)
dda0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
ddb0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
ddc0: 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 65 67 41  rse);.  int regA
ddd0: 72 67 3b 0a 20 20 69 6e 74 20 6e 41 72 67 20 3d  rg;.  int nArg =
dde0: 20 30 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57   0;.  Window *pW
ddf0: 69 6e 3b 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70  in;.  for(pWin=p
de00: 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e  MWin; pWin; pWin
de10: 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29  =pWin->pNextWin)
de20: 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70  {.    FuncDef *p
de30: 46 75 6e 63 20 3d 20 70 57 69 6e 2d 3e 70 46 75  Func = pWin->pFu
de40: 6e 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  nc;.    sqlite3V
de50: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
de60: 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72  Null, 0, pWin->r
de70: 65 67 41 63 63 75 6d 29 3b 0a 20 20 20 20 6e 41  egAccum);.    nA
de80: 72 67 20 3d 20 4d 41 58 28 6e 41 72 67 2c 20 77  rg = MAX(nArg, w
de90: 69 6e 64 6f 77 41 72 67 43 6f 75 6e 74 28 70 57  indowArgCount(pW
dea0: 69 6e 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4d  in));.    if( pM
deb0: 57 69 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f 77  Win->regStartRow
dec0: 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  id==0 ){.      i
ded0: 66 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d  f( pFunc->zName=
dee0: 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 20 7c  =nth_valueName |
def0: 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d  | pFunc->zName==
df00: 66 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65 20  first_valueName 
df10: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
df20: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
df30: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70  OP_Integer, 0, p
df40: 57 69 6e 2d 3e 72 65 67 41 70 70 29 3b 0a 20 20  Win->regApp);.  
df50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
df60: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
df70: 74 65 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d 3e  teger, 0, pWin->
df80: 72 65 67 41 70 70 2b 31 29 3b 0a 20 20 20 20 20  regApp+1);.     
df90: 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 28 70   }..      if( (p
dfa0: 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20  Func->funcFlags 
dfb0: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49  & SQLITE_FUNC_MI
dfc0: 4e 4d 41 58 29 20 26 26 20 70 57 69 6e 2d 3e 63  NMAX) && pWin->c
dfd0: 73 72 41 70 70 20 29 7b 0a 20 20 20 20 20 20 20  srApp ){.       
dfe0: 20 61 73 73 65 72 74 28 20 70 57 69 6e 2d 3e 65   assert( pWin->e
dff0: 53 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e  Start!=TK_UNBOUN
e000: 44 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 73  DED );.        s
e010: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
e020: 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74  (v, OP_ResetSort
e030: 65 72 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70  er, pWin->csrApp
e040: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
e050: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
e060: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70  OP_Integer, 0, p
e070: 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31 29 3b 0a  Win->regApp+1);.
e080: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e090: 7d 0a 20 20 72 65 67 41 72 67 20 3d 20 70 50 61  }.  regArg = pPa
e0a0: 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 70  rse->nMem+1;.  p
e0b0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
e0c0: 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  Arg;.  return re
e0d0: 67 41 72 67 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  gArg;.}../* .** 
e0e0: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
e0f0: 68 65 20 63 75 72 72 65 6e 74 20 66 72 61 6d 65  he current frame
e100: 20 73 68 6f 75 6c 64 20 62 65 20 63 61 63 68 65   should be cache
e110: 64 20 69 6e 20 74 68 65 20 65 70 68 65 6d 65 72  d in the ephemer
e120: 61 6c 20 74 61 62 6c 65 2c 0a 2a 2a 20 65 76 65  al table,.** eve
e130: 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  n if there are n
e140: 6f 20 78 49 6e 76 65 72 73 65 28 29 20 63 61 6c  o xInverse() cal
e150: 6c 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a  ls required..*/.
e160: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 64 6f  static int windo
e170: 77 43 61 63 68 65 46 72 61 6d 65 28 57 69 6e 64  wCacheFrame(Wind
e180: 6f 77 20 2a 70 4d 57 69 6e 29 7b 0a 20 20 57 69  ow *pMWin){.  Wi
e190: 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 69 66  ndow *pWin;.  if
e1a0: 28 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72  ( pMWin->regStar
e1b0: 74 52 6f 77 69 64 20 29 20 72 65 74 75 72 6e 20  tRowid ) return 
e1c0: 31 3b 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d  1;.  for(pWin=pM
e1d0: 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d  Win; pWin; pWin=
e1e0: 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b  pWin->pNextWin){
e1f0: 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 46  .    FuncDef *pF
e200: 75 6e 63 20 3d 20 70 57 69 6e 2d 3e 70 46 75 6e  unc = pWin->pFun
e210: 63 3b 0a 20 20 20 20 69 66 28 20 28 70 46 75 6e  c;.    if( (pFun
e220: 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61  c->zName==nth_va
e230: 6c 75 65 4e 61 6d 65 29 0a 20 20 20 20 20 7c 7c  lueName).     ||
e240: 20 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d   (pFunc->zName==
e250: 66 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65 29  first_valueName)
e260: 0a 20 20 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d  .     || (pFunc-
e270: 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65  >zName==leadName
e280: 29 0a 20 20 20 20 20 7c 7c 20 28 70 46 75 6e 63  ).     || (pFunc
e290: 2d 3e 7a 4e 61 6d 65 3d 3d 6c 61 67 4e 61 6d 65  ->zName==lagName
e2a0: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
e2b0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
e2c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
e2d0: 0a 0a 2f 2a 0a 2a 2a 20 72 65 67 4f 6c 64 20 61  ../*.** regOld a
e2e0: 6e 64 20 72 65 67 4e 65 77 20 61 72 65 20 65 61  nd regNew are ea
e2f0: 63 68 20 74 68 65 20 66 69 72 73 74 20 72 65 67  ch the first reg
e300: 69 73 74 65 72 20 69 6e 20 61 6e 20 61 72 72 61  ister in an arra
e310: 79 20 6f 66 20 73 69 7a 65 0a 2a 2a 20 70 4f 72  y of size.** pOr
e320: 64 65 72 42 79 2d 3e 6e 45 78 70 72 2e 20 54 68  derBy->nExpr. Th
e330: 69 73 20 66 75 6e 63 74 69 6f 6e 20 67 65 6e 65  is function gene
e340: 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20 63 6f  rates code to co
e350: 6d 70 61 72 65 20 74 68 65 20 74 77 6f 0a 2a 2a  mpare the two.**
e360: 20 61 72 72 61 79 73 20 6f 66 20 72 65 67 69 73   arrays of regis
e370: 74 65 72 73 20 75 73 69 6e 67 20 74 68 65 20 63  ters using the c
e380: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
e390: 65 73 20 61 6e 64 20 6f 74 68 65 72 20 63 6f 6d  es and other com
e3a0: 70 61 72 69 73 6f 6e 0a 2a 2a 20 70 61 72 61 6d  parison.** param
e3b0: 65 74 65 72 73 20 73 70 65 63 69 66 69 65 64 20  eters specified 
e3c0: 62 79 20 70 4f 72 64 65 72 42 79 2e 20 0a 2a 2a  by pOrderBy. .**
e3d0: 0a 2a 2a 20 49 66 20 74 68 65 20 74 77 6f 20 61  .** If the two a
e3e0: 72 72 61 79 73 20 61 72 65 20 6e 6f 74 20 65 71  rrays are not eq
e3f0: 75 61 6c 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  ual, the content
e400: 73 20 6f 66 20 72 65 67 4e 65 77 20 69 73 20 63  s of regNew is c
e410: 6f 70 69 65 64 20 74 6f 20 0a 2a 2a 20 72 65 67  opied to .** reg
e420: 4f 6c 64 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20  Old and control 
e430: 66 61 6c 6c 73 20 74 68 72 6f 75 67 68 2e 20 4f  falls through. O
e440: 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
e450: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
e460: 20 61 72 72 61 79 73 0a 2a 2a 20 61 72 65 20 65   arrays.** are e
e470: 71 75 61 6c 2c 20 61 6e 20 4f 50 5f 47 6f 74 6f  qual, an OP_Goto
e480: 20 69 73 20 65 78 65 63 75 74 65 64 2e 20 54 68   is executed. Th
e490: 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
e4a0: 20 4f 50 5f 47 6f 74 6f 20 69 73 20 72 65 74 75   OP_Goto is retu
e4b0: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
e4c0: 76 6f 69 64 20 77 69 6e 64 6f 77 49 66 4e 65 77  void windowIfNew
e4d0: 50 65 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70  Peer(.  Parse *p
e4e0: 50 61 72 73 65 2c 0a 20 20 45 78 70 72 4c 69 73  Parse,.  ExprLis
e4f0: 74 20 2a 70 4f 72 64 65 72 42 79 2c 0a 20 20 69  t *pOrderBy,.  i
e500: 6e 74 20 72 65 67 4e 65 77 2c 20 20 20 20 20 20  nt regNew,      
e510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e520: 2a 20 46 69 72 73 74 20 69 6e 20 61 72 72 61 79  * First in array
e530: 20 6f 66 20 6e 65 77 20 76 61 6c 75 65 73 20 2a   of new values *
e540: 2f 0a 20 20 69 6e 74 20 72 65 67 4f 6c 64 2c 20  /.  int regOld, 
e550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e560: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 69 6e 20      /* First in 
e570: 61 72 72 61 79 20 6f 66 20 6f 6c 64 20 76 61 6c  array of old val
e580: 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ues */.  int add
e590: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
e5a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
e5b0: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56 64   here */.){.  Vd
e5c0: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
e5d0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
e5e0: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
e5f0: 7b 0a 20 20 20 20 69 6e 74 20 6e 56 61 6c 20 3d  {.    int nVal =
e600: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
e610: 3b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  ;.    KeyInfo *p
e620: 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
e630: 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  3KeyInfoFromExpr
e640: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72  List(pParse, pOr
e650: 64 65 72 42 79 2c 20 30 2c 20 30 29 3b 0a 20 20  derBy, 0, 0);.  
e660: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e670: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72  Op3(v, OP_Compar
e680: 65 2c 20 72 65 67 4f 6c 64 2c 20 72 65 67 4e 65  e, regOld, regNe
e690: 77 2c 20 6e 56 61 6c 29 3b 0a 20 20 20 20 73 71  w, nVal);.    sq
e6a0: 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
e6b0: 34 28 76 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79  4(v, (void*)pKey
e6c0: 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
e6d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
e6e0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
e6f0: 75 6d 70 2c 20 0a 20 20 20 20 20 20 73 71 6c 69  ump, .      sqli
e700: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
e710: 64 72 28 76 29 2b 31 2c 20 61 64 64 72 2c 20 73  dr(v)+1, addr, s
e720: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
e730: 74 41 64 64 72 28 76 29 2b 31 0a 20 20 20 20 29  tAddr(v)+1.    )
e740: 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
e750: 67 65 45 71 4e 65 28 76 29 3b 0a 20 20 20 20 73  geEqNe(v);.    s
e760: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
e770: 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67  (v, OP_Copy, reg
e780: 4e 65 77 2c 20 72 65 67 4f 6c 64 2c 20 6e 56 61  New, regOld, nVa
e790: 6c 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  l-1);.  }else{. 
e7a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e7b0: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
e7c0: 20 30 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d   0, addr);.  }.}
e7d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
e7e0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
e7f0: 61 73 20 70 61 72 74 20 6f 66 20 67 65 6e 65 72  as part of gener
e800: 61 74 69 6e 67 20 56 4d 20 70 72 6f 67 72 61 6d  ating VM program
e810: 73 20 66 6f 72 20 52 41 4e 47 45 0a 2a 2a 20 6f  s for RANGE.** o
e820: 66 66 73 65 74 20 50 52 45 43 45 44 49 4e 47 2f  ffset PRECEDING/
e830: 46 4f 4c 4c 4f 57 49 4e 47 20 66 72 61 6d 65 20  FOLLOWING frame 
e840: 62 6f 75 6e 64 61 72 69 65 73 2e 20 41 73 73 75  boundaries. Assu
e850: 6d 69 6e 67 20 22 41 53 43 22 20 6f 72 64 65 72  ming "ASC" order
e860: 20 66 6f 72 0a 2a 2a 20 74 68 65 20 4f 52 44 45   for.** the ORDE
e870: 52 20 42 59 20 74 65 72 6d 20 69 6e 20 74 68 65  R BY term in the
e880: 20 77 69 6e 64 6f 77 2c 20 69 74 20 67 65 6e 65   window, it gene
e890: 72 61 74 65 73 20 63 6f 64 65 20 65 71 75 69 76  rates code equiv
e8a0: 61 6c 65 6e 74 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20  alent to:.**.** 
e8b0: 20 20 69 66 28 20 63 73 72 31 2e 70 65 65 72 56    if( csr1.peerV
e8c0: 61 6c 20 2b 20 72 65 67 56 61 6c 20 3e 3d 20 63  al + regVal >= c
e8d0: 73 72 32 2e 70 65 65 72 56 61 6c 20 29 20 67 6f  sr2.peerVal ) go
e8e0: 74 6f 20 6c 62 6c 3b 0a 2a 2a 0a 2a 2a 20 41 20  to lbl;.**.** A 
e8f0: 73 70 65 63 69 61 6c 20 74 79 70 65 20 6f 66 20  special type of 
e900: 61 72 69 74 68 6d 65 74 69 63 20 69 73 20 75 73  arithmetic is us
e910: 65 64 20 73 75 63 68 20 74 68 61 74 20 69 66 20  ed such that if 
e920: 63 73 72 2e 70 65 65 72 56 61 6c 20 69 73 20 6e  csr.peerVal is n
e930: 6f 74 0a 2a 2a 20 61 20 6e 75 6d 65 72 69 63 20  ot.** a numeric 
e940: 74 79 70 65 20 28 72 65 61 6c 20 6f 72 20 69 6e  type (real or in
e950: 74 65 67 65 72 29 2c 20 74 68 65 6e 20 74 68 65  teger), then the
e960: 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 61   result of the a
e970: 64 64 69 74 69 6f 6e 20 69 73 0a 2a 2a 20 61 20  ddition is.** a 
e980: 63 6f 70 79 20 6f 66 20 63 73 72 31 2e 70 65 65  copy of csr1.pee
e990: 72 56 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rVal..*/.static 
e9a0: 76 6f 69 64 20 77 69 6e 64 6f 77 43 6f 64 65 52  void windowCodeR
e9b0: 61 6e 67 65 54 65 73 74 28 0a 20 20 57 69 6e 64  angeTest(.  Wind
e9c0: 6f 77 43 6f 64 65 41 72 67 20 2a 70 2c 20 0a 20  owCodeArg *p, . 
e9d0: 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20   int op,        
e9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9f0: 20 20 2f 2a 20 4f 50 5f 47 65 20 6f 72 20 4f 50    /* OP_Ge or OP
ea00: 5f 47 74 20 2a 2f 0a 20 20 69 6e 74 20 63 73 72  _Gt */.  int csr
ea10: 31 2c 20 0a 20 20 69 6e 74 20 72 65 67 56 61 6c  1, .  int regVal
ea20: 2c 20 0a 20 20 69 6e 74 20 63 73 72 32 2c 0a 20  , .  int csr2,. 
ea30: 20 69 6e 74 20 6c 62 6c 0a 29 7b 0a 20 20 50 61   int lbl.){.  Pa
ea40: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d  rse *pParse = p-
ea50: 3e 70 50 61 72 73 65 3b 0a 20 20 56 64 62 65 20  >pParse;.  Vdbe 
ea60: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
ea70: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
ea80: 6e 74 20 72 65 67 31 20 3d 20 73 71 6c 69 74 65  nt reg1 = sqlite
ea90: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
eaa0: 73 65 29 3b 0a 20 20 69 6e 74 20 72 65 67 32 20  se);.  int reg2 
eab0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
eac0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69  Reg(pParse);.  i
ead0: 6e 74 20 61 72 69 74 68 20 3d 20 4f 50 5f 41 64  nt arith = OP_Ad
eae0: 64 3b 0a 20 20 69 6e 74 20 61 64 64 72 47 65 3b  d;.  int addrGe;
eaf0: 0a 0a 20 20 69 6e 74 20 72 65 67 53 74 72 69 6e  ..  int regStrin
eb00: 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  g = ++pParse->nM
eb10: 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6f  em;..  assert( o
eb20: 70 3d 3d 4f 50 5f 47 65 20 7c 7c 20 6f 70 3d 3d  p==OP_Ge || op==
eb30: 4f 50 5f 47 74 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  OP_Gt || op==OP_
eb40: 4c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Le );.  assert( 
eb50: 70 2d 3e 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72  p->pMWin->pOrder
eb60: 42 79 20 26 26 20 70 2d 3e 70 4d 57 69 6e 2d 3e  By && p->pMWin->
eb70: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d  pOrderBy->nExpr=
eb80: 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  =1 );.  if( p->p
eb90: 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  MWin->pOrderBy->
eba0: 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29  a[0].sortOrder )
ebb0: 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f 70  {.    switch( op
ebc0: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f   ){.      case O
ebd0: 50 5f 47 65 3a 20 6f 70 20 3d 20 4f 50 5f 4c 65  P_Ge: op = OP_Le
ebe0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
ebf0: 61 73 65 20 4f 50 5f 47 74 3a 20 6f 70 20 3d 20  ase OP_Gt: op = 
ec00: 4f 50 5f 4c 74 3b 20 62 72 65 61 6b 3b 0a 20 20  OP_Lt; break;.  
ec10: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
ec20: 65 72 74 28 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29  ert( op==OP_Le )
ec30: 3b 20 6f 70 20 3d 20 4f 50 5f 47 65 3b 20 62 72  ; op = OP_Ge; br
ec40: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  eak;.    }.    a
ec50: 72 69 74 68 20 3d 20 4f 50 5f 53 75 62 74 72 61  rith = OP_Subtra
ec60: 63 74 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 64 6f  ct;.  }..  windo
ec70: 77 52 65 61 64 50 65 65 72 56 61 6c 75 65 73 28  wReadPeerValues(
ec80: 70 2c 20 63 73 72 31 2c 20 72 65 67 31 29 3b 0a  p, csr1, reg1);.
ec90: 20 20 77 69 6e 64 6f 77 52 65 61 64 50 65 65 72    windowReadPeer
eca0: 56 61 6c 75 65 73 28 70 2c 20 63 73 72 32 2c 20  Values(p, csr2, 
ecb0: 72 65 67 32 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  reg2);..  /* Che
ecc0: 63 6b 20 69 66 20 74 68 65 20 70 65 65 72 20 76  ck if the peer v
ecd0: 61 6c 75 65 20 66 6f 72 20 63 73 72 31 20 76 61  alue for csr1 va
ece0: 6c 75 65 20 69 73 20 61 20 74 65 78 74 20 6f 72  lue is a text or
ecf0: 20 62 6c 6f 62 20 62 79 20 63 6f 6d 70 61 72 69   blob by compari
ed00: 6e 67 0a 20 20 2a 2a 20 69 74 20 74 6f 20 74 68  ng.  ** it to th
ed10: 65 20 73 6d 61 6c 6c 65 73 74 20 70 6f 73 73 69  e smallest possi
ed20: 62 6c 65 20 73 74 72 69 6e 67 20 2d 20 27 27 2e  ble string - ''.
ed30: 20 49 66 20 69 74 20 69 73 2c 20 6a 75 6d 70 20   If it is, jump 
ed40: 6f 76 65 72 20 74 68 65 0a 20 20 2a 2a 20 4f 50  over the.  ** OP
ed50: 5f 41 64 64 20 6f 72 20 4f 50 5f 53 75 62 74 72  _Add or OP_Subtr
ed60: 61 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 61 6e  act operation an
ed70: 64 20 70 72 6f 63 65 65 64 20 64 69 72 65 63 74  d proceed direct
ed80: 6c 79 20 74 6f 20 74 68 65 20 63 6f 6d 70 61 72  ly to the compar
ed90: 69 73 6f 6e 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  ison. */.  sqlit
eda0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
edb0: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 72  OP_String8, 0, r
edc0: 65 67 53 74 72 69 6e 67 2c 20 30 2c 20 22 22 2c  egString, 0, "",
edd0: 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 61   P4_STATIC);.  a
ede0: 64 64 72 47 65 20 3d 20 73 71 6c 69 74 65 33 56  ddrGe = sqlite3V
edf0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
ee00: 47 65 2c 20 72 65 67 53 74 72 69 6e 67 2c 20 30  Ge, regString, 0
ee10: 2c 20 72 65 67 31 29 3b 0a 20 20 56 64 62 65 43  , reg1);.  VdbeC
ee20: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
ee30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
ee40: 76 2c 20 61 72 69 74 68 2c 20 72 65 67 56 61 6c  v, arith, regVal
ee50: 2c 20 72 65 67 31 2c 20 72 65 67 31 29 3b 0a 20  , reg1, reg1);. 
ee60: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
ee70: 48 65 72 65 28 76 2c 20 61 64 64 72 47 65 29 3b  Here(v, addrGe);
ee80: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
ee90: 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72 65 67 32  dOp3(v, op, reg2
eea0: 2c 20 6c 62 6c 2c 20 72 65 67 31 29 3b 20 56 64  , lbl, reg1); Vd
eeb0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
eec0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
eed0: 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e  geP5(v, SQLITE_N
eee0: 55 4c 4c 45 51 29 3b 0a 20 20 61 73 73 65 72 74  ULLEQ);.  assert
eef0: 28 20 6f 70 3d 3d 4f 50 5f 47 65 20 7c 7c 20 6f  ( op==OP_Ge || o
ef00: 70 3d 3d 4f 50 5f 47 74 20 7c 7c 20 6f 70 3d 3d  p==OP_Gt || op==
ef10: 4f 50 5f 4c 74 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  OP_Lt || op==OP_
ef20: 4c 65 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  Le );.  testcase
ef30: 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62  (op==OP_Ge); Vdb
ef40: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
ef50: 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 74 65 73  p==OP_Ge);.  tes
ef60: 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29  tcase(op==OP_Lt)
ef70: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
ef80: 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a  (v, op==OP_Lt);.
ef90: 20 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f    testcase(op==O
efa0: 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Le); VdbeCover
efb0: 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
efc0: 4c 65 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  Le);.  testcase(
efd0: 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65  op==OP_Gt); Vdbe
efe0: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
eff0: 3d 3d 4f 50 5f 47 74 29 3b 0a 0a 20 20 73 71 6c  ==OP_Gt);..  sql
f000: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
f010: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 31 29  eg(pParse, reg1)
f020: 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
f030: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
f040: 2c 20 72 65 67 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , reg2);.}../*.*
f050: 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f  * Helper functio
f060: 6e 20 66 6f 72 20 73 71 6c 69 74 65 33 57 69 6e  n for sqlite3Win
f070: 64 6f 77 43 6f 64 65 53 74 65 70 28 29 2e 20 45  dowCodeStep(). E
f080: 61 63 68 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  ach call to this
f090: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 67 65 6e   function.** gen
f0a0: 65 72 61 74 65 73 20 56 4d 20 63 6f 64 65 20 66  erates VM code f
f0b0: 6f 72 20 61 20 73 69 6e 67 6c 65 20 52 45 54 55  or a single RETU
f0c0: 52 4e 5f 52 4f 57 2c 20 41 47 47 53 54 45 50 20  RN_ROW, AGGSTEP 
f0d0: 6f 72 20 41 47 47 49 4e 56 45 52 53 45 20 0a 2a  or AGGINVERSE .*
f0e0: 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 52 65 66  * operation. Ref
f0f0: 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 65 72  er to the header
f100: 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 20 73 71 6c   comment for sql
f110: 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 53 74  ite3WindowCodeSt
f120: 65 70 28 29 20 66 6f 72 0a 2a 2a 20 64 65 74 61  ep() for.** deta
f130: 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
f140: 6e 74 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28  nt windowCodeOp(
f150: 0a 20 57 69 6e 64 6f 77 43 6f 64 65 41 72 67 20  . WindowCodeArg 
f160: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
f170: 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 6f 62     /* Context ob
f180: 6a 65 63 74 20 2a 2f 0a 20 69 6e 74 20 6f 70 2c  ject */. int op,
f190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 49 4e            /* WIN
f1b0: 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20  DOW_RETURN_ROW, 
f1c0: 41 47 47 53 54 45 50 20 6f 72 20 41 47 47 49 4e  AGGSTEP or AGGIN
f1d0: 56 45 52 53 45 20 2a 2f 0a 20 69 6e 74 20 72 65  VERSE */. int re
f1e0: 67 43 6f 75 6e 74 64 6f 77 6e 2c 20 20 20 20 20  gCountdown,     
f1f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
f200: 67 69 73 74 65 72 20 66 6f 72 20 4f 50 5f 49 66  gister for OP_If
f210: 50 6f 73 20 63 6f 75 6e 74 64 6f 77 6e 20 2a 2f  Pos countdown */
f220: 0a 20 69 6e 74 20 6a 75 6d 70 4f 6e 45 6f 66 20  . int jumpOnEof 
f230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f240: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
f250: 69 66 20 73 74 65 70 70 65 64 20 63 75 72 73 6f  if stepped curso
f260: 72 20 72 65 61 63 68 65 73 20 45 4f 46 20 2a 2f  r reaches EOF */
f270: 0a 29 7b 0a 20 20 69 6e 74 20 63 73 72 2c 20 72  .){.  int csr, r
f280: 65 67 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  eg;.  Parse *pPa
f290: 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b  rse = p->pParse;
f2a0: 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e  .  Window *pMWin
f2b0: 20 3d 20 70 2d 3e 70 4d 57 69 6e 3b 0a 20 20 69   = p->pMWin;.  i
f2c0: 6e 74 20 72 65 74 20 3d 20 30 3b 0a 20 20 56 64  nt ret = 0;.  Vd
f2d0: 62 65 20 2a 76 20 3d 20 70 2d 3e 70 56 64 62 65  be *v = p->pVdbe
f2e0: 3b 0a 20 20 69 6e 74 20 61 64 64 72 49 66 20 3d  ;.  int addrIf =
f2f0: 20 30 3b 20 0a 20 20 69 6e 74 20 61 64 64 72 43   0; .  int addrC
f300: 6f 6e 74 69 6e 75 65 20 3d 20 30 3b 0a 20 20 69  ontinue = 0;.  i
f310: 6e 74 20 61 64 64 72 47 6f 74 6f 20 3d 20 30 3b  nt addrGoto = 0;
f320: 0a 20 20 69 6e 74 20 62 50 65 65 72 20 3d 20 28  .  int bPeer = (
f330: 70 4d 57 69 6e 2d 3e 65 46 72 6d 54 79 70 65 21  pMWin->eFrmType!
f340: 3d 54 4b 5f 52 4f 57 53 29 3b 0a 0a 20 20 69 6e  =TK_ROWS);..  in
f350: 74 20 6c 62 6c 44 6f 6e 65 20 3d 20 73 71 6c 69  t lblDone = sqli
f360: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
f370: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
f380: 61 64 64 72 4e 65 78 74 52 61 6e 67 65 20 3d 20  addrNextRange = 
f390: 30 3b 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c  0;..  /* Special
f3a0: 20 63 61 73 65 20 2d 20 57 49 4e 44 4f 57 5f 41   case - WINDOW_A
f3b0: 47 47 49 4e 56 45 52 53 45 20 69 73 20 61 6c 77  GGINVERSE is alw
f3c0: 61 79 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74  ays a no-op if t
f3d0: 68 65 20 66 72 61 6d 65 0a 20 20 2a 2a 20 73 74  he frame.  ** st
f3e0: 61 72 74 73 20 77 69 74 68 20 55 4e 42 4f 55 4e  arts with UNBOUN
f3f0: 44 45 44 20 50 52 45 43 45 44 49 4e 47 2e 20 2a  DED PRECEDING. *
f400: 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 57 49 4e 44  /.  if( op==WIND
f410: 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 20 26 26  OW_AGGINVERSE &&
f420: 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d   pMWin->eStart==
f430: 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a  TK_UNBOUNDED ){.
f440: 20 20 20 20 61 73 73 65 72 74 28 20 72 65 67 43      assert( regC
f450: 6f 75 6e 74 64 6f 77 6e 3d 3d 30 20 26 26 20 6a  ountdown==0 && j
f460: 75 6d 70 4f 6e 45 6f 66 3d 3d 30 20 29 3b 0a 20  umpOnEof==0 );. 
f470: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
f480: 0a 0a 20 20 69 66 28 20 72 65 67 43 6f 75 6e 74  ..  if( regCount
f490: 64 6f 77 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66  down>0 ){.    if
f4a0: 28 20 70 4d 57 69 6e 2d 3e 65 46 72 6d 54 79 70  ( pMWin->eFrmTyp
f4b0: 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 29 7b 0a 20  e==TK_RANGE ){. 
f4c0: 20 20 20 20 20 61 64 64 72 4e 65 78 74 52 61 6e       addrNextRan
f4d0: 67 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ge = sqlite3Vdbe
f4e0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
f4f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 70        assert( op
f500: 3d 3d 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45  ==WINDOW_AGGINVE
f510: 52 53 45 20 7c 7c 20 6f 70 3d 3d 57 49 4e 44 4f  RSE || op==WINDO
f520: 57 5f 41 47 47 53 54 45 50 20 29 3b 0a 20 20 20  W_AGGSTEP );.   
f530: 20 20 20 69 66 28 20 6f 70 3d 3d 57 49 4e 44 4f     if( op==WINDO
f540: 57 5f 41 47 47 49 4e 56 45 52 53 45 20 29 7b 0a  W_AGGINVERSE ){.
f550: 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 57 69          if( pMWi
f560: 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f  n->eStart==TK_FO
f570: 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 20  LLOWING ){.     
f580: 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 52       windowCodeR
f590: 61 6e 67 65 54 65 73 74 28 0a 20 20 20 20 20 20  angeTest(.      
f5a0: 20 20 20 20 20 20 20 20 70 2c 20 4f 50 5f 4c 65          p, OP_Le
f5b0: 2c 20 70 2d 3e 63 75 72 72 65 6e 74 2e 63 73 72  , p->current.csr
f5c0: 2c 20 72 65 67 43 6f 75 6e 74 64 6f 77 6e 2c 20  , regCountdown, 
f5d0: 70 2d 3e 73 74 61 72 74 2e 63 73 72 2c 20 6c 62  p->start.csr, lb
f5e0: 6c 44 6f 6e 65 0a 20 20 20 20 20 20 20 20 20 20  lDone.          
f5f0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
f600: 7b 0a 20 20 20 20 20 20 20 20 20 20 77 69 6e 64  {.          wind
f610: 6f 77 43 6f 64 65 52 61 6e 67 65 54 65 73 74 28  owCodeRangeTest(
f620: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
f630: 2c 20 4f 50 5f 47 65 2c 20 70 2d 3e 73 74 61 72  , OP_Ge, p->star
f640: 74 2e 63 73 72 2c 20 72 65 67 43 6f 75 6e 74 64  t.csr, regCountd
f650: 6f 77 6e 2c 20 70 2d 3e 63 75 72 72 65 6e 74 2e  own, p->current.
f660: 63 73 72 2c 20 6c 62 6c 44 6f 6e 65 0a 20 20 20  csr, lblDone.   
f670: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
f680: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
f690: 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43  .        windowC
f6a0: 6f 64 65 52 61 6e 67 65 54 65 73 74 28 0a 20 20  odeRangeTest(.  
f6b0: 20 20 20 20 20 20 20 20 20 20 70 2c 20 4f 50 5f            p, OP_
f6c0: 47 74 2c 20 70 2d 3e 65 6e 64 2e 63 73 72 2c 20  Gt, p->end.csr, 
f6d0: 72 65 67 43 6f 75 6e 74 64 6f 77 6e 2c 20 70 2d  regCountdown, p-
f6e0: 3e 63 75 72 72 65 6e 74 2e 63 73 72 2c 20 6c 62  >current.csr, lb
f6f0: 6c 44 6f 6e 65 0a 20 20 20 20 20 20 20 20 29 3b  lDone.        );
f700: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
f710: 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72 49 66  se{.      addrIf
f720: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
f730: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp3(v, OP_IfPos
f740: 2c 20 72 65 67 43 6f 75 6e 74 64 6f 77 6e 2c 20  , regCountdown, 
f750: 30 2c 20 31 29 3b 0a 20 20 20 20 20 20 56 64 62  0, 1);.      Vdb
f760: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
f770: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f    }.  }..  if( o
f780: 70 3d 3d 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e  p==WINDOW_RETURN
f790: 5f 52 4f 57 20 26 26 20 70 4d 57 69 6e 2d 3e 72  _ROW && pMWin->r
f7a0: 65 67 53 74 61 72 74 52 6f 77 69 64 3d 3d 30 20  egStartRowid==0 
f7b0: 29 7b 0a 20 20 20 20 77 69 6e 64 6f 77 41 67 67  ){.    windowAgg
f7c0: 46 69 6e 61 6c 28 70 2c 20 30 29 3b 0a 20 20 7d  Final(p, 0);.  }
f7d0: 0a 20 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 20  .  addrContinue 
f7e0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
f7f0: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 73  rentAddr(v);.  s
f800: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
f810: 20 63 61 73 65 20 57 49 4e 44 4f 57 5f 52 45 54   case WINDOW_RET
f820: 55 52 4e 5f 52 4f 57 3a 0a 20 20 20 20 20 20 63  URN_ROW:.      c
f830: 73 72 20 3d 20 70 2d 3e 63 75 72 72 65 6e 74 2e  sr = p->current.
f840: 63 73 72 3b 0a 20 20 20 20 20 20 72 65 67 20 3d  csr;.      reg =
f850: 20 70 2d 3e 63 75 72 72 65 6e 74 2e 72 65 67 3b   p->current.reg;
f860: 0a 20 20 20 20 20 20 77 69 6e 64 6f 77 52 65 74  .      windowRet
f870: 75 72 6e 4f 6e 65 52 6f 77 28 70 29 3b 0a 20 20  urnOneRow(p);.  
f880: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
f890: 63 61 73 65 20 57 49 4e 44 4f 57 5f 41 47 47 49  case WINDOW_AGGI
f8a0: 4e 56 45 52 53 45 3a 0a 20 20 20 20 20 20 63 73  NVERSE:.      cs
f8b0: 72 20 3d 20 70 2d 3e 73 74 61 72 74 2e 63 73 72  r = p->start.csr
f8c0: 3b 0a 20 20 20 20 20 20 72 65 67 20 3d 20 70 2d  ;.      reg = p-
f8d0: 3e 73 74 61 72 74 2e 72 65 67 3b 0a 20 20 20 20  >start.reg;.    
f8e0: 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 72 65 67    if( pMWin->reg
f8f0: 53 74 61 72 74 52 6f 77 69 64 20 29 7b 0a 20 20  StartRowid ){.  
f900: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
f910: 57 69 6e 2d 3e 72 65 67 45 6e 64 52 6f 77 69 64  Win->regEndRowid
f920: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
f930: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f940: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 4d 57 69   OP_AddImm, pMWi
f950: 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f 77 69 64  n->regStartRowid
f960: 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 1);.      }els
f970: 65 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f  e{.        windo
f980: 77 41 67 67 53 74 65 70 28 70 50 61 72 73 65 2c  wAggStep(pParse,
f990: 20 70 4d 57 69 6e 2c 20 63 73 72 2c 20 31 2c 20   pMWin, csr, 1, 
f9a0: 70 2d 3e 72 65 67 41 72 67 29 3b 0a 20 20 20 20  p->regArg);.    
f9b0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
f9c0: 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ..    default:. 
f9d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d       assert( op=
f9e0: 3d 57 49 4e 44 4f 57 5f 41 47 47 53 54 45 50 20  =WINDOW_AGGSTEP 
f9f0: 29 3b 0a 20 20 20 20 20 20 63 73 72 20 3d 20 70  );.      csr = p
fa00: 2d 3e 65 6e 64 2e 63 73 72 3b 0a 20 20 20 20 20  ->end.csr;.     
fa10: 20 72 65 67 20 3d 20 70 2d 3e 65 6e 64 2e 72 65   reg = p->end.re
fa20: 67 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 57  g;.      if( pMW
fa30: 69 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f 77 69  in->regStartRowi
fa40: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  d ){.        ass
fa50: 65 72 74 28 20 70 4d 57 69 6e 2d 3e 72 65 67 45  ert( pMWin->regE
fa60: 6e 64 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20  ndRowid );.     
fa70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fa80: 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
fa90: 6d 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 45 6e 64  m, pMWin->regEnd
faa0: 52 6f 77 69 64 2c 20 31 29 3b 0a 20 20 20 20 20  Rowid, 1);.     
fab0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
fac0: 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28 70 50  windowAggStep(pP
fad0: 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 63 73 72  arse, pMWin, csr
fae0: 2c 20 30 2c 20 70 2d 3e 72 65 67 41 72 67 29 3b  , 0, p->regArg);
faf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
fb00: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  reak;.  }..  if(
fb10: 20 6f 70 3d 3d 70 2d 3e 65 44 65 6c 65 74 65 20   op==p->eDelete 
fb20: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
fb30: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44  beAddOp1(v, OP_D
fb40: 65 6c 65 74 65 2c 20 63 73 72 29 3b 0a 20 20 20  elete, csr);.   
fb50: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
fb60: 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 53  geP5(v, OPFLAG_S
fb70: 41 56 45 50 4f 53 49 54 49 4f 4e 29 3b 0a 20 20  AVEPOSITION);.  
fb80: 7d 0a 0a 20 20 69 66 28 20 6a 75 6d 70 4f 6e 45  }..  if( jumpOnE
fb90: 6f 66 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  of ){.    sqlite
fba0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
fbb0: 50 5f 4e 65 78 74 2c 20 63 73 72 2c 20 73 71 6c  P_Next, csr, sql
fbc0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
fbd0: 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 56  ddr(v)+2);.    V
fbe0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
fbf0: 20 20 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65      ret = sqlite
fc00: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
fc10: 50 5f 47 6f 74 6f 29 3b 0a 20 20 7d 65 6c 73 65  P_Goto);.  }else
fc20: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
fc30: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
fc40: 78 74 2c 20 63 73 72 2c 20 73 71 6c 69 74 65 33  xt, csr, sqlite3
fc50: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
fc60: 76 29 2b 31 2b 62 50 65 65 72 29 3b 0a 20 20 20  v)+1+bPeer);.   
fc70: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
fc80: 3b 0a 20 20 20 20 69 66 28 20 62 50 65 65 72 20  ;.    if( bPeer 
fc90: 29 7b 0a 20 20 20 20 20 20 61 64 64 72 47 6f 74  ){.      addrGot
fca0: 6f 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  o = sqlite3VdbeA
fcb0: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp0(v, OP_Goto
fcc0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
fcd0: 69 66 28 20 62 50 65 65 72 20 29 7b 0a 20 20 20  if( bPeer ){.   
fce0: 20 69 6e 74 20 6e 52 65 67 20 3d 20 28 70 4d 57   int nReg = (pMW
fcf0: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20 3f 20 70  in->pOrderBy ? p
fd00: 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  MWin->pOrderBy->
fd10: 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20  nExpr : 0);.    
fd20: 69 6e 74 20 72 65 67 54 6d 70 20 3d 20 28 6e 52  int regTmp = (nR
fd30: 65 67 20 3f 20 73 71 6c 69 74 65 33 47 65 74 54  eg ? sqlite3GetT
fd40: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
fd50: 20 6e 52 65 67 29 20 3a 20 30 29 3b 0a 20 20 20   nReg) : 0);.   
fd60: 20 77 69 6e 64 6f 77 52 65 61 64 50 65 65 72 56   windowReadPeerV
fd70: 61 6c 75 65 73 28 70 2c 20 63 73 72 2c 20 72 65  alues(p, csr, re
fd80: 67 54 6d 70 29 3b 0a 20 20 20 20 77 69 6e 64 6f  gTmp);.    windo
fd90: 77 49 66 4e 65 77 50 65 65 72 28 70 50 61 72 73  wIfNewPeer(pPars
fda0: 65 2c 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72  e, pMWin->pOrder
fdb0: 42 79 2c 20 72 65 67 54 6d 70 2c 20 72 65 67 2c  By, regTmp, reg,
fdc0: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a   addrContinue);.
fdd0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
fde0: 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
fdf0: 73 65 2c 20 72 65 67 54 6d 70 2c 20 6e 52 65 67  se, regTmp, nReg
fe00: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 61 64  );.  }..  if( ad
fe10: 64 72 4e 65 78 74 52 61 6e 67 65 20 29 7b 0a 20  drNextRange ){. 
fe20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fe30: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
fe40: 20 30 2c 20 61 64 64 72 4e 65 78 74 52 61 6e 67   0, addrNextRang
fe50: 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
fe60: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
fe70: 6c 28 76 2c 20 6c 62 6c 44 6f 6e 65 29 3b 0a 20  l(v, lblDone);. 
fe80: 20 69 66 28 20 61 64 64 72 47 6f 74 6f 20 29 20   if( addrGoto ) 
fe90: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
fea0: 65 72 65 28 76 2c 20 61 64 64 72 47 6f 74 6f 29  ere(v, addrGoto)
feb0: 3b 0a 20 20 69 66 28 20 61 64 64 72 49 66 20 29  ;.  if( addrIf )
fec0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
fed0: 48 65 72 65 28 76 2c 20 61 64 64 72 49 66 29 3b  Here(v, addrIf);
fee0: 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d  .  return ret;.}
fef0: 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  .../*.** Allocat
ff00: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64  e and return a d
ff10: 75 70 6c 69 63 61 74 65 20 6f 66 20 74 68 65 20  uplicate of the 
ff20: 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 69 6e  Window object in
ff30: 64 69 63 61 74 65 64 20 62 79 20 74 68 65 0a 2a  dicated by the.*
ff40: 2a 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  * third argument
ff50: 2e 20 53 65 74 20 74 68 65 20 57 69 6e 64 6f 77  . Set the Window
ff60: 2e 70 4f 77 6e 65 72 20 66 69 65 6c 64 20 6f 66  .pOwner field of
ff70: 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20   the new object 
ff80: 74 6f 0a 2a 2a 20 70 4f 77 6e 65 72 2e 0a 2a 2f  to.** pOwner..*/
ff90: 0a 57 69 6e 64 6f 77 20 2a 73 71 6c 69 74 65 33  .Window *sqlite3
ffa0: 57 69 6e 64 6f 77 44 75 70 28 73 71 6c 69 74 65  WindowDup(sqlite
ffb0: 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4f 77  3 *db, Expr *pOw
ffc0: 6e 65 72 2c 20 57 69 6e 64 6f 77 20 2a 70 29 7b  ner, Window *p){
ffd0: 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4e 65 77 20  .  Window *pNew 
ffe0: 3d 20 30 3b 0a 20 20 69 66 28 20 41 4c 57 41 59  = 0;.  if( ALWAY
fff0: 53 28 70 29 20 29 7b 0a 20 20 20 20 70 4e 65 77  S(p) ){.    pNew
10000 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
10010 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
10020 66 28 57 69 6e 64 6f 77 29 29 3b 0a 20 20 20 20  f(Window));.    
10030 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
10040 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20    pNew->zName = 
10050 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
10060 64 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  db, p->zName);. 
10070 20 20 20 20 20 70 4e 65 77 2d 3e 70 46 69 6c 74       pNew->pFilt
10080 65 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  er = sqlite3Expr
10090 44 75 70 28 64 62 2c 20 70 2d 3e 70 46 69 6c 74  Dup(db, p->pFilt
100a0 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e  er, 0);.      pN
100b0 65 77 2d 3e 70 46 75 6e 63 20 3d 20 70 2d 3e 70  ew->pFunc = p->p
100c0 46 75 6e 63 3b 0a 20 20 20 20 20 20 70 4e 65 77  Func;.      pNew
100d0 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 3d 20 73  ->pPartition = s
100e0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
100f0 70 28 64 62 2c 20 70 2d 3e 70 50 61 72 74 69 74  p(db, p->pPartit
10100 69 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  ion, 0);.      p
10110 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  New->pOrderBy = 
10120 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
10130 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  up(db, p->pOrder
10140 42 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e  By, 0);.      pN
10150 65 77 2d 3e 65 46 72 6d 54 79 70 65 20 3d 20 70  ew->eFrmType = p
10160 2d 3e 65 46 72 6d 54 79 70 65 3b 0a 20 20 20 20  ->eFrmType;.    
10170 20 20 70 4e 65 77 2d 3e 65 45 6e 64 20 3d 20 70    pNew->eEnd = p
10180 2d 3e 65 45 6e 64 3b 0a 20 20 20 20 20 20 70 4e  ->eEnd;.      pN
10190 65 77 2d 3e 65 53 74 61 72 74 20 3d 20 70 2d 3e  ew->eStart = p->
101a0 65 53 74 61 72 74 3b 0a 20 20 20 20 20 20 70 4e  eStart;.      pN
101b0 65 77 2d 3e 65 45 78 63 6c 75 64 65 20 3d 20 70  ew->eExclude = p
101c0 2d 3e 65 45 78 63 6c 75 64 65 3b 0a 20 20 20 20  ->eExclude;.    
101d0 20 20 70 4e 65 77 2d 3e 70 53 74 61 72 74 20 3d    pNew->pStart =
101e0 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
101f0 64 62 2c 20 70 2d 3e 70 53 74 61 72 74 2c 20 30  db, p->pStart, 0
10200 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  );.      pNew->p
10210 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 45 78 70  End = sqlite3Exp
10220 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 6e 64  rDup(db, p->pEnd
10230 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  , 0);.      pNew
10240 2d 3e 70 4f 77 6e 65 72 20 3d 20 70 4f 77 6e 65  ->pOwner = pOwne
10250 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  r;.    }.  }.  r
10260 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
10270 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 63 6f  *.** Return a co
10280 70 79 20 6f 66 20 74 68 65 20 6c 69 6e 6b 65 64  py of the linked
10290 20 6c 69 73 74 20 6f 66 20 57 69 6e 64 6f 77 20   list of Window 
102a0 6f 62 6a 65 63 74 73 20 70 61 73 73 65 64 20 61  objects passed a
102b0 73 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20  s the.** second 
102c0 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 57 69 6e  argument..*/.Win
102d0 64 6f 77 20 2a 73 71 6c 69 74 65 33 57 69 6e 64  dow *sqlite3Wind
102e0 6f 77 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65  owListDup(sqlite
102f0 33 20 2a 64 62 2c 20 57 69 6e 64 6f 77 20 2a 70  3 *db, Window *p
10300 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69  ){.  Window *pWi
10310 6e 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 52 65  n;.  Window *pRe
10320 74 20 3d 20 30 3b 0a 20 20 57 69 6e 64 6f 77 20  t = 0;.  Window 
10330 2a 2a 70 70 20 3d 20 26 70 52 65 74 3b 0a 0a 20  **pp = &pRet;.. 
10340 20 66 6f 72 28 70 57 69 6e 3d 70 3b 20 70 57 69   for(pWin=p; pWi
10350 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e  n; pWin=pWin->pN
10360 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 2a 70 70  extWin){.    *pp
10370 20 3d 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77   = sqlite3Window
10380 44 75 70 28 64 62 2c 20 30 2c 20 70 57 69 6e 29  Dup(db, 0, pWin)
10390 3b 0a 20 20 20 20 69 66 28 20 2a 70 70 3d 3d 30  ;.    if( *pp==0
103a0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 70   ) break;.    pp
103b0 20 3d 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78   = &((*pp)->pNex
103c0 74 57 69 6e 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  tWin);.  }..  re
103d0 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
103e0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
103f0 69 66 20 69 74 20 63 61 6e 20 62 65 20 64 65 74  if it can be det
10400 65 72 6d 69 6e 65 64 20 61 74 20 63 6f 6d 70 69  ermined at compi
10410 6c 65 20 74 69 6d 65 20 74 68 61 74 20 65 78 70  le time that exp
10420 72 65 73 73 69 6f 6e 20 0a 2a 2a 20 70 45 78 70  ression .** pExp
10430 72 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 61  r evaluates to a
10440 20 76 61 6c 75 65 20 74 68 61 74 2c 20 77 68 65   value that, whe
10450 6e 20 63 61 73 74 20 74 6f 20 61 6e 20 69 6e 74  n cast to an int
10460 65 67 65 72 2c 20 69 73 20 67 72 65 61 74 65 72  eger, is greater
10470 20 0a 2a 2a 20 74 68 61 6e 20 7a 65 72 6f 2e 20   .** than zero. 
10480 46 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  False otherwise.
10490 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d  .**.** If an OOM
104a0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
104b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74  his function set
104c0 73 20 74 68 65 20 50 61 72 73 65 2e 64 62 2e 6d  s the Parse.db.m
104d0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 0a 2a 2a 20  allocFailed .** 
104e0 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e 73  flag and returns
104f0 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   zero..*/.static
10500 20 69 6e 74 20 77 69 6e 64 6f 77 45 78 70 72 47   int windowExprG
10510 74 5a 65 72 6f 28 50 61 72 73 65 20 2a 70 50 61  tZero(Parse *pPa
10520 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
10530 29 7b 0a 20 20 69 6e 74 20 72 65 74 20 3d 20 30  ){.  int ret = 0
10540 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
10550 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
10560 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
10570 56 61 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Val = 0;.  sqlit
10580 65 33 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28  e3ValueFromExpr(
10590 64 62 2c 20 70 45 78 70 72 2c 20 64 62 2d 3e 65  db, pExpr, db->e
105a0 6e 63 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  nc, SQLITE_AFF_N
105b0 55 4d 45 52 49 43 2c 20 26 70 56 61 6c 29 3b 0a  UMERIC, &pVal);.
105c0 20 20 69 66 28 20 70 56 61 6c 20 26 26 20 73 71    if( pVal && sq
105d0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
105e0 70 56 61 6c 29 3e 30 20 29 7b 0a 20 20 20 20 72  pVal)>0 ){.    r
105f0 65 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71  et = 1;.  }.  sq
10600 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
10610 56 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Val);.  return r
10620 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c  et;.}../*.** sql
10630 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
10640 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
10650 6e 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65  n called for the
10660 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
10670 74 20 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20  t .** passed as 
10680 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
10690 65 6e 74 20 77 68 65 6e 20 74 68 69 73 20 66 75  ent when this fu
106a0 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65  nction is invoke
106b0 64 2e 20 49 74 20 67 65 6e 65 72 61 74 65 73 0a  d. It generates.
106c0 2a 2a 20 63 6f 64 65 20 74 6f 20 70 6f 70 75 6c  ** code to popul
106d0 61 74 65 20 74 68 65 20 57 69 6e 64 6f 77 2e 72  ate the Window.r
106e0 65 67 52 65 73 75 6c 74 20 72 65 67 69 73 74 65  egResult registe
106f0 72 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f  r for each windo
10700 77 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61  w function .** a
10710 6e 64 20 69 6e 76 6f 6b 65 20 74 68 65 20 73 75  nd invoke the su
10720 62 2d 72 6f 75 74 69 6e 65 20 61 74 20 69 6e 73  b-routine at ins
10730 74 72 75 63 74 69 6f 6e 20 61 64 64 72 47 6f 73  truction addrGos
10740 75 62 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ub once for each
10750 20 72 6f 77 2e 0a 2a 2a 20 73 71 6c 69 74 65 33   row..** sqlite3
10760 57 68 65 72 65 45 6e 64 28 29 20 69 73 20 61 6c  WhereEnd() is al
10770 77 61 79 73 20 63 61 6c 6c 65 64 20 62 65 66 6f  ways called befo
10780 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 0a 2a  re returning. .*
10790 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
107a0 6f 6e 20 68 61 6e 64 6c 65 73 20 73 65 76 65 72  on handles sever
107b0 61 6c 20 64 69 66 66 65 72 65 6e 74 20 74 79 70  al different typ
107c0 65 73 20 6f 66 20 77 69 6e 64 6f 77 20 66 72 61  es of window fra
107d0 6d 65 73 2c 20 77 68 69 63 68 0a 2a 2a 20 72 65  mes, which.** re
107e0 71 75 69 72 65 20 73 6c 69 67 68 74 6c 79 20 64  quire slightly d
107f0 69 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73  ifferent process
10800 69 6e 67 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ing. The followi
10810 6e 67 20 70 73 65 75 64 6f 20 63 6f 64 65 20 69  ng pseudo code i
10820 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69 6d 70  s.** used to imp
10830 6c 65 6d 65 6e 74 20 77 69 6e 64 6f 77 20 66 72  lement window fr
10840 61 6d 65 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ames of the form
10850 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57 53 20 42  :.**.**   ROWS B
10860 45 54 57 45 45 4e 20 3c 65 78 70 72 31 3e 20 50  ETWEEN <expr1> P
10870 52 45 43 45 44 49 4e 47 20 41 4e 44 20 3c 65 78  RECEDING AND <ex
10880 70 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a  pr2> FOLLOWING.*
10890 2a 0a 2a 2a 20 4f 74 68 65 72 20 77 69 6e 64 6f  *.** Other windo
108a0 77 20 66 72 61 6d 65 20 74 79 70 65 73 20 75 73  w frame types us
108b0 65 20 76 61 72 69 61 6e 74 73 20 6f 66 20 74 68  e variants of th
108c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
108d0 2a 2a 20 20 20 20 20 2e 2e 2e 20 6c 6f 6f 70 20  **     ... loop 
108e0 73 74 61 72 74 65 64 20 62 79 20 73 71 6c 69 74  started by sqlit
108f0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2e  e3WhereBegin() .
10900 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20  ...**       if( 
10910 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 20 29 7b  new partition ){
10920 0a 2a 2a 20 20 20 20 20 20 20 20 20 47 6f 73 75  .**         Gosu
10930 62 20 66 6c 75 73 68 0a 2a 2a 20 20 20 20 20 20  b flush.**      
10940 20 7d 0a 2a 2a 20 20 20 20 20 20 20 49 6e 73 65   }.**       Inse
10950 72 74 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20  rt new row into 
10960 65 70 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20  eph table..**   
10970 20 20 20 20 0a 2a 2a 20 20 20 20 20 20 20 69 66      .**       if
10980 28 20 66 69 72 73 74 20 72 6f 77 20 6f 66 20 70  ( first row of p
10990 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20  artition ){.**  
109a0 20 20 20 20 20 20 20 2f 2f 20 52 65 77 69 6e 64         // Rewind
109b0 20 74 68 72 65 65 20 63 75 72 73 6f 72 73 2c 20   three cursors, 
109c0 61 6c 6c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  all open on the 
109d0 65 70 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20  eph table..**   
109e0 20 20 20 20 20 20 52 65 77 69 6e 64 28 63 73 72        Rewind(csr
109f0 45 6e 64 29 3b 0a 2a 2a 20 20 20 20 20 20 20 20  End);.**        
10a00 20 52 65 77 69 6e 64 28 63 73 72 53 74 61 72 74   Rewind(csrStart
10a10 29 3b 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 65  );.**         Re
10a20 77 69 6e 64 28 63 73 72 43 75 72 72 65 6e 74 29  wind(csrCurrent)
10a30 3b 0a 2a 2a 20 20 20 20 20 20 20 0a 2a 2a 20 20  ;.**       .**  
10a40 20 20 20 20 20 20 20 72 65 67 45 6e 64 20 3d 20         regEnd = 
10a50 3c 65 78 70 72 32 3e 20 20 20 20 20 20 20 20 20  <expr2>         
10a60 20 2f 2f 20 46 4f 4c 4c 4f 57 49 4e 47 20 65 78   // FOLLOWING ex
10a70 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 20 20 20 20  pression.**     
10a80 20 20 20 20 72 65 67 53 74 61 72 74 20 3d 20 3c      regStart = <
10a90 65 78 70 72 31 3e 20 20 20 20 20 20 20 20 2f 2f  expr1>        //
10aa0 20 50 52 45 43 45 44 49 4e 47 20 65 78 70 72 65   PRECEDING expre
10ab0 73 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 7d  ssion.**       }
10ac0 65 6c 73 65 7b 0a 2a 2a 20 20 20 20 20 20 20 20  else{.**        
10ad0 20 2f 2f 20 46 69 72 73 74 20 74 69 6d 65 20 74   // First time t
10ae0 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61  his branch is ta
10af0 6b 65 6e 2c 20 74 68 65 20 65 70 68 20 74 61 62  ken, the eph tab
10b00 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 77 6f 20  le contains two 
10b10 0a 2a 2a 20 20 20 20 20 20 20 20 20 2f 2f 20 72  .**         // r
10b20 6f 77 73 2e 20 54 68 65 20 66 69 72 73 74 20 72  ows. The first r
10b30 6f 77 20 69 6e 20 74 68 65 20 70 61 72 74 69 74  ow in the partit
10b40 69 6f 6e 2c 20 77 68 69 63 68 20 61 6c 6c 20 74  ion, which all t
10b50 68 72 65 65 20 63 75 72 73 6f 72 73 0a 2a 2a 20  hree cursors.** 
10b60 20 20 20 20 20 20 20 20 2f 2f 20 63 75 72 72 65          // curre
10b70 6e 74 6c 79 20 70 6f 69 6e 74 20 74 6f 2c 20 61  ntly point to, a
10b80 6e 64 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  nd the following
10b90 20 72 6f 77 2e 0a 2a 2a 20 20 20 20 20 20 20 20   row..**        
10ba0 20 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20 20   AGGSTEP.**     
10bb0 20 20 20 20 69 66 28 20 28 72 65 67 45 6e 64 2d      if( (regEnd-
10bc0 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20  -)<=0 ){.**     
10bd0 20 20 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57        RETURN_ROW
10be0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 69 66  .**           if
10bf0 28 20 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d  ( (regStart--)<=
10c00 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  0 ){.**         
10c10 20 20 20 20 41 47 47 49 4e 56 45 52 53 45 0a 2a      AGGINVERSE.*
10c20 2a 20 20 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a  *           }.**
10c30 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20           }.**   
10c40 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a      }.**     }.*
10c50 2a 20 20 20 20 20 66 6c 75 73 68 3a 0a 2a 2a 20  *     flush:.** 
10c60 20 20 20 20 20 20 41 47 47 53 54 45 50 0a 2a 2a        AGGSTEP.**
10c70 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 31 20         while( 1 
10c80 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 45  ){.**         RE
10c90 54 55 52 4e 20 52 4f 57 0a 2a 2a 20 20 20 20 20  TURN ROW.**     
10ca0 20 20 20 20 69 66 28 20 63 73 72 43 75 72 72 65      if( csrCurre
10cb0 6e 74 20 69 73 20 45 4f 46 20 29 20 62 72 65 61  nt is EOF ) brea
10cc0 6b 3b 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 66  k;.**         if
10cd0 28 20 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d  ( (regStart--)<=
10ce0 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  0 ){.**         
10cf0 20 20 41 67 67 49 6e 76 65 72 73 65 28 63 73 72    AggInverse(csr
10d00 53 74 61 72 74 29 0a 2a 2a 20 20 20 20 20 20 20  Start).**       
10d10 20 20 20 20 4e 65 78 74 28 63 73 72 53 74 61 72      Next(csrStar
10d20 74 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a  t).**         }.
10d30 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a  **       }.**.**
10d40 20 54 68 65 20 70 73 65 75 64 6f 2d 63 6f 64 65   The pseudo-code
10d50 20 61 62 6f 76 65 20 75 73 65 73 20 74 68 65 20   above uses the 
10d60 66 6f 6c 6c 6f 77 69 6e 67 20 73 68 6f 72 74 68  following shorth
10d70 61 6e 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 41 47 47  and:.**.**   AGG
10d80 53 54 45 50 3a 20 20 20 20 69 6e 76 6f 6b 65 20  STEP:    invoke 
10d90 74 68 65 20 61 67 67 72 65 67 61 74 65 20 78 53  the aggregate xS
10da0 74 65 70 28 29 20 66 75 6e 63 74 69 6f 6e 20 66  tep() function f
10db0 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77 20 66  or each window f
10dc0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20  unction.**      
10dd0 20 20 20 20 20 20 20 20 20 77 69 74 68 20 61 72           with ar
10de0 67 75 6d 65 6e 74 73 20 72 65 61 64 20 66 72 6f  guments read fro
10df0 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  m the current ro
10e00 77 20 6f 66 20 63 75 72 73 6f 72 20 63 73 72 45  w of cursor csrE
10e10 6e 64 2c 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20  nd, then.**     
10e20 20 20 20 20 20 20 20 20 20 20 73 74 65 70 20 63            step c
10e30 75 72 73 6f 72 20 63 73 72 45 6e 64 20 66 6f 72  ursor csrEnd for
10e40 77 61 72 64 20 6f 6e 65 20 72 6f 77 20 28 69 2e  ward one row (i.
10e50 65 2e 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  e. sqlite3BtreeN
10e60 65 78 74 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  ext())..**.**   
10e70 52 45 54 55 52 4e 5f 52 4f 57 3a 20 72 65 74 75  RETURN_ROW: retu
10e80 72 6e 20 61 20 72 6f 77 20 74 6f 20 74 68 65 20  rn a row to the 
10e90 63 61 6c 6c 65 72 20 62 61 73 65 64 20 6f 6e 20  caller based on 
10ea0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
10eb0 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  the .**         
10ec0 20 20 20 20 20 20 63 75 72 72 65 6e 74 20 72 6f        current ro
10ed0 77 20 6f 66 20 63 73 72 43 75 72 72 65 6e 74 20  w of csrCurrent 
10ee0 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  and the current 
10ef0 73 74 61 74 65 20 6f 66 20 61 6c 6c 20 0a 2a 2a  state of all .**
10f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
10f10 67 67 72 65 67 61 74 65 73 2e 20 54 68 65 6e 20  ggregates. Then 
10f20 73 74 65 70 20 63 75 72 73 6f 72 20 63 73 72 43  step cursor csrC
10f30 75 72 72 65 6e 74 20 66 6f 72 77 61 72 64 20 6f  urrent forward o
10f40 6e 65 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 20 20  ne row..**.**   
10f50 41 47 47 49 4e 56 45 52 53 45 3a 20 69 6e 76 6f  AGGINVERSE: invo
10f60 6b 65 20 74 68 65 20 61 67 67 72 65 67 61 74 65  ke the aggregate
10f70 20 78 49 6e 76 65 72 73 65 28 29 20 66 75 6e 63   xInverse() func
10f80 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 77 69  tion for each wi
10f90 6e 64 6f 77 20 0a 2a 2a 20 20 20 20 20 20 20 20  ndow .**        
10fa0 20 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 73         functions
10fb0 20 77 69 74 68 20 61 72 67 75 6d 65 6e 74 73 20   with arguments 
10fc0 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75  read from the cu
10fd0 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 63 75 72  rrent row of cur
10fe0 73 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  sor.**          
10ff0 20 20 20 20 20 63 73 72 53 74 61 72 74 2e 20 54       csrStart. T
11000 68 65 6e 20 73 74 65 70 20 63 73 72 53 74 61 72  hen step csrStar
11010 74 20 66 6f 72 77 61 72 64 20 6f 6e 65 20 72 6f  t forward one ro
11020 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61  w..**.** There a
11030 72 65 20 74 77 6f 20 6f 74 68 65 72 20 52 4f 57  re two other ROW
11040 53 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 73 20  S window frames 
11050 74 68 61 74 20 61 72 65 20 68 61 6e 64 6c 65 64  that are handled
11060 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 2a   significantly.*
11070 2a 20 64 69 66 66 65 72 65 6e 74 6c 79 20 66 72  * differently fr
11080 6f 6d 20 74 68 65 20 61 62 6f 76 65 20 2d 20 22  om the above - "
11090 42 45 54 57 45 45 4e 20 3c 65 78 70 72 3e 20 50  BETWEEN <expr> P
110a0 52 45 43 45 44 49 4e 47 20 41 4e 44 20 3c 65 78  RECEDING AND <ex
110b0 70 72 3e 20 50 52 45 43 45 44 49 4e 47 22 0a 2a  pr> PRECEDING".*
110c0 2a 20 61 6e 64 20 22 42 45 54 57 45 45 4e 20 3c  * and "BETWEEN <
110d0 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20  expr> FOLLOWING 
110e0 41 4e 44 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f  AND <expr> FOLLO
110f0 57 49 4e 47 22 2e 20 54 68 65 73 65 20 61 72 65  WING". These are
11100 20 73 70 65 63 69 61 6c 20 0a 2a 2a 20 63 61 73   special .** cas
11110 65 73 20 62 65 63 61 75 73 65 20 74 68 65 79 20  es because they 
11120 63 68 61 6e 67 65 20 74 68 65 20 6f 72 64 65 72  change the order
11130 20 69 6e 20 77 68 69 63 68 20 74 68 65 20 74 68   in which the th
11140 72 65 65 20 63 75 72 73 6f 72 73 20 28 63 73 72  ree cursors (csr
11150 53 74 61 72 74 2c 0a 2a 2a 20 63 73 72 43 75 72  Start,.** csrCur
11160 72 65 6e 74 20 61 6e 64 20 63 73 72 45 6e 64 29  rent and csrEnd)
11170 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
11180 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74   the ephemeral t
11190 61 62 6c 65 2e 20 43 61 73 65 73 20 74 68 61 74  able. Cases that
111a0 0a 2a 2a 20 75 73 65 20 55 4e 42 4f 55 4e 44 45  .** use UNBOUNDE
111b0 44 20 6f 72 20 43 55 52 52 45 4e 54 20 52 4f 57  D or CURRENT ROW
111c0 20 61 72 65 20 6d 75 63 68 20 73 69 6d 70 6c 65   are much simple
111d0 72 20 76 61 72 69 61 74 69 6f 6e 73 20 6f 6e 20  r variations on 
111e0 6f 6e 65 20 6f 66 20 74 68 65 73 65 0a 2a 2a 20  one of these.** 
111f0 74 68 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 52  three..**.**   R
11200 4f 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70  OWS BETWEEN <exp
11210 72 31 3e 20 50 52 45 43 45 44 49 4e 47 20 41 4e  r1> PRECEDING AN
11220 44 20 3c 65 78 70 72 32 3e 20 50 52 45 43 45 44  D <expr2> PRECED
11230 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e  ING.**.**     ..
11240 2e 20 6c 6f 6f 70 20 73 74 61 72 74 65 64 20 62  . loop started b
11250 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
11260 67 69 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20  gin() ....**    
11270 20 20 20 69 66 28 20 6e 65 77 20 70 61 72 74 69     if( new parti
11280 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20  tion ){.**      
11290 20 20 20 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a     Gosub flush.*
112a0 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  *       }.**    
112b0 20 20 20 49 6e 73 65 72 74 20 6e 65 77 20 72 6f     Insert new ro
112c0 77 20 69 6e 74 6f 20 65 70 68 20 74 61 62 6c 65  w into eph table
112d0 2e 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 66  ..**       if( f
112e0 69 72 73 74 20 72 6f 77 20 6f 66 20 70 61 72 74  irst row of part
112f0 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20  ition ){.**     
11300 20 20 20 20 52 65 77 69 6e 64 28 63 73 72 45 6e      Rewind(csrEn
11310 64 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72 53  d) ; Rewind(csrS
11320 74 61 72 74 29 20 3b 20 52 65 77 69 6e 64 28 63  tart) ; Rewind(c
11330 73 72 43 75 72 72 65 6e 74 29 0a 2a 2a 20 20 20  srCurrent).**   
11340 20 20 20 20 20 20 72 65 67 45 6e 64 20 3d 20 3c        regEnd = <
11350 65 78 70 72 32 3e 0a 2a 2a 20 20 20 20 20 20 20  expr2>.**       
11360 20 20 72 65 67 53 74 61 72 74 20 3d 20 3c 65 78    regStart = <ex
11370 70 72 31 3e 0a 2a 2a 20 20 20 20 20 20 20 7d 65  pr1>.**       }e
11380 6c 73 65 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  lse{.**         
11390 69 66 28 20 28 72 65 67 45 6e 64 2d 2d 29 3c 3d  if( (regEnd--)<=
113a0 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  0 ){.**         
113b0 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20    AGGSTEP.**    
113c0 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20       }.**       
113d0 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20    RETURN_ROW.** 
113e0 20 20 20 20 20 20 20 20 69 66 28 20 28 72 65 67          if( (reg
113f0 53 74 61 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a  Start--)<=0 ){.*
11400 2a 20 20 20 20 20 20 20 20 20 20 20 41 47 47 49  *           AGGI
11410 4e 56 45 52 53 45 0a 2a 2a 20 20 20 20 20 20 20  NVERSE.**       
11420 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a    }.**       }.*
11430 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 66  *     }.**     f
11440 6c 75 73 68 3a 0a 2a 2a 20 20 20 20 20 20 20 69  lush:.**       i
11450 66 28 20 28 72 65 67 45 6e 64 2d 2d 29 3c 3d 30  f( (regEnd--)<=0
11460 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41   ){.**         A
11470 47 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 20 20  GGSTEP.**       
11480 7d 0a 2a 2a 20 20 20 20 20 20 20 52 45 54 55 52  }.**       RETUR
11490 4e 5f 52 4f 57 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20  N_ROW.**.**.**  
114a0 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20 3c 65   ROWS BETWEEN <e
114b0 78 70 72 31 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20  xpr1> FOLLOWING 
114c0 41 4e 44 20 3c 65 78 70 72 32 3e 20 46 4f 4c 4c  AND <expr2> FOLL
114d0 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20  OWING.**.**     
114e0 2e 2e 2e 20 6c 6f 6f 70 20 73 74 61 72 74 65 64  ... loop started
114f0 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
11500 42 65 67 69 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20  Begin() ....**  
11510 20 20 20 69 66 28 20 6e 65 77 20 70 61 72 74 69     if( new parti
11520 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20  tion ){.**      
11530 20 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20   Gosub flush.** 
11540 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 49 6e 73      }.**     Ins
11550 65 72 74 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f  ert new row into
11560 20 65 70 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20   eph table..**  
11570 20 20 20 69 66 28 20 66 69 72 73 74 20 72 6f 77     if( first row
11580 20 6f 66 20 70 61 72 74 69 74 69 6f 6e 20 29 7b   of partition ){
11590 0a 2a 2a 20 20 20 20 20 20 20 52 65 77 69 6e 64  .**       Rewind
115a0 28 63 73 72 45 6e 64 29 20 3b 20 52 65 77 69 6e  (csrEnd) ; Rewin
115b0 64 28 63 73 72 53 74 61 72 74 29 20 3b 20 52 65  d(csrStart) ; Re
115c0 77 69 6e 64 28 63 73 72 43 75 72 72 65 6e 74 29  wind(csrCurrent)
115d0 0a 2a 2a 20 20 20 20 20 20 20 72 65 67 45 6e 64  .**       regEnd
115e0 20 3d 20 3c 65 78 70 72 32 3e 0a 2a 2a 20 20 20   = <expr2>.**   
115f0 20 20 20 20 72 65 67 53 74 61 72 74 20 3d 20 72      regStart = r
11600 65 67 45 6e 64 20 2d 20 3c 65 78 70 72 31 3e 0a  egEnd - <expr1>.
11610 2a 2a 20 20 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a  **     }else{.**
11620 20 20 20 20 20 20 20 41 47 47 53 54 45 50 0a 2a         AGGSTEP.*
11630 2a 20 20 20 20 20 20 20 69 66 28 20 28 72 65 67  *       if( (reg
11640 45 6e 64 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20  End--)<=0 ){.** 
11650 20 20 20 20 20 20 20 20 52 45 54 55 52 4e 5f 52          RETURN_R
11660 4f 57 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a  OW.**       }.**
11670 20 20 20 20 20 20 20 69 66 28 20 28 72 65 67 53         if( (regS
11680 74 61 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a  tart--)<=0 ){.**
11690 20 20 20 20 20 20 20 20 20 41 47 47 49 4e 56 45           AGGINVE
116a0 52 53 45 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a  RSE.**       }.*
116b0 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 7d 0a 2a  *     }.**   }.*
116c0 2a 20 20 20 66 6c 75 73 68 3a 0a 2a 2a 20 20 20  *   flush:.**   
116d0 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20    AGGSTEP.**    
116e0 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 2a 2a 20   while( 1 ){.** 
116f0 20 20 20 20 20 20 69 66 28 20 28 72 65 67 45 6e        if( (regEn
11700 64 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20  d--)<=0 ){.**   
11710 20 20 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57        RETURN_ROW
11720 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 66 28 20  .**         if( 
11730 65 6f 66 20 29 20 62 72 65 61 6b 3b 0a 2a 2a 20  eof ) break;.** 
11740 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20        }.**      
11750 20 69 66 28 20 28 72 65 67 53 74 61 72 74 2d 2d   if( (regStart--
11760 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20  )<=0 ){.**      
11770 20 20 20 41 47 47 49 4e 56 45 52 53 45 0a 2a 2a     AGGINVERSE.**
11780 20 20 20 20 20 20 20 20 20 69 66 28 20 65 6f 66           if( eof
11790 20 29 20 62 72 65 61 6b 0a 2a 2a 20 20 20 20 20   ) break.**     
117a0 20 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20    }.**     }.** 
117b0 20 20 20 20 77 68 69 6c 65 28 20 21 65 6f 66 20      while( !eof 
117c0 63 73 72 43 75 72 72 65 6e 74 20 29 7b 0a 2a 2a  csrCurrent ){.**
117d0 20 20 20 20 20 20 20 52 45 54 55 52 4e 5f 52 4f         RETURN_RO
117e0 57 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a  W.**     }.**.**
117f0 20 46 6f 72 20 74 68 65 20 6d 6f 73 74 20 70 61   For the most pa
11800 72 74 2c 20 74 68 65 20 70 61 74 74 65 72 6e 73  rt, the patterns
11810 20 61 62 6f 76 65 20 61 72 65 20 61 64 61 70 74   above are adapt
11820 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 55 4e  ed to support UN
11830 42 4f 55 4e 44 45 44 20 62 79 0a 2a 2a 20 61 73  BOUNDED by.** as
11840 73 75 6d 69 6e 67 20 74 68 61 74 20 69 74 20 69  suming that it i
11850 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
11860 22 69 6e 66 69 6e 69 74 79 20 50 52 45 43 45 44  "infinity PRECED
11870 49 4e 47 2f 46 4f 4c 4c 4f 57 49 4e 47 22 20 61  ING/FOLLOWING" a
11880 6e 64 0a 2a 2a 20 43 55 52 52 45 4e 54 20 52 4f  nd.** CURRENT RO
11890 57 20 62 79 20 61 73 73 75 6d 69 6e 67 20 74 68  W by assuming th
118a0 61 74 20 69 74 20 69 73 20 65 71 75 69 76 69 6c  at it is equivil
118b0 65 6e 74 20 74 6f 20 22 30 20 50 52 45 43 45 44  ent to "0 PRECED
118c0 49 4e 47 2f 46 4f 4c 4c 4f 57 49 4e 47 22 2e 0a  ING/FOLLOWING"..
118d0 2a 2a 20 54 68 69 73 20 69 73 20 6f 70 74 69 6d  ** This is optim
118e0 69 7a 65 64 20 6f 66 20 63 6f 75 72 73 65 20 2d  ized of course -
118f0 20 62 72 61 6e 63 68 65 73 20 74 68 61 74 20 77   branches that w
11900 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 74 61 6b  ill never be tak
11910 65 6e 20 61 6e 64 0a 2a 2a 20 63 6f 6e 64 69 74  en and.** condit
11920 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 61 6c  ions that are al
11930 77 61 79 73 20 74 72 75 65 20 61 72 65 20 6f 6d  ways true are om
11940 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 56  itted from the V
11950 4d 20 63 6f 64 65 2e 20 54 68 65 20 6f 6e 6c 79  M code. The only
11960 0a 2a 2a 20 65 78 63 65 70 74 69 6f 6e 61 6c 20  .** exceptional 
11970 63 61 73 65 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  case is:.**.**  
11980 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20 3c 65   ROWS BETWEEN <e
11990 78 70 72 31 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20  xpr1> FOLLOWING 
119a0 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f  AND UNBOUNDED FO
119b0 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20  LLOWING.**.**   
119c0 20 20 2e 2e 2e 20 6c 6f 6f 70 20 73 74 61 72 74    ... loop start
119d0 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  ed by sqlite3Whe
119e0 72 65 42 65 67 69 6e 28 29 20 2e 2e 2e 0a 2a 2a  reBegin() ....**
119f0 20 20 20 20 20 69 66 28 20 6e 65 77 20 70 61 72       if( new par
11a00 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20  tition ){.**    
11a10 20 20 20 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a     Gosub flush.*
11a20 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 49  *     }.**     I
11a30 6e 73 65 72 74 20 6e 65 77 20 72 6f 77 20 69 6e  nsert new row in
11a40 74 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a 2a 2a  to eph table..**
11a50 20 20 20 20 20 69 66 28 20 66 69 72 73 74 20 72       if( first r
11a60 6f 77 20 6f 66 20 70 61 72 74 69 74 69 6f 6e 20  ow of partition 
11a70 29 7b 0a 2a 2a 20 20 20 20 20 20 20 52 65 77 69  ){.**       Rewi
11a80 6e 64 28 63 73 72 45 6e 64 29 20 3b 20 52 65 77  nd(csrEnd) ; Rew
11a90 69 6e 64 28 63 73 72 53 74 61 72 74 29 20 3b 20  ind(csrStart) ; 
11aa0 52 65 77 69 6e 64 28 63 73 72 43 75 72 72 65 6e  Rewind(csrCurren
11ab0 74 29 0a 2a 2a 20 20 20 20 20 20 20 72 65 67 53  t).**       regS
11ac0 74 61 72 74 20 3d 20 3c 65 78 70 72 31 3e 0a 2a  tart = <expr1>.*
11ad0 2a 20 20 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20  *     }else{.** 
11ae0 20 20 20 20 20 20 41 47 47 53 54 45 50 0a 2a 2a        AGGSTEP.**
11af0 20 20 20 20 20 7d 0a 2a 2a 20 20 20 7d 0a 2a 2a       }.**   }.**
11b00 20 20 20 66 6c 75 73 68 3a 0a 2a 2a 20 20 20 20     flush:.**    
11b10 20 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20 20   AGGSTEP.**     
11b20 77 68 69 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20  while( 1 ){.**  
11b30 20 20 20 20 20 69 66 28 20 28 72 65 67 53 74 61       if( (regSta
11b40 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20  rt--)<=0 ){.**  
11b50 20 20 20 20 20 20 20 41 47 47 49 4e 56 45 52 53         AGGINVERS
11b60 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 66 28  E.**         if(
11b70 20 65 6f 66 20 29 20 62 72 65 61 6b 0a 2a 2a 20   eof ) break.** 
11b80 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20        }.**      
11b90 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20   RETURN_ROW.**  
11ba0 20 20 20 7d 0a 2a 2a 20 20 20 20 20 77 68 69 6c     }.**     whil
11bb0 65 28 20 21 65 6f 66 20 63 73 72 43 75 72 72 65  e( !eof csrCurre
11bc0 6e 74 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 52  nt ){.**       R
11bd0 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20  ETURN_ROW.**    
11be0 20 7d 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65   }.**.** Also re
11bf0 71 75 69 72 69 6e 67 20 73 70 65 63 69 61 6c 20  quiring special 
11c00 68 61 6e 64 6c 69 6e 67 20 61 72 65 20 74 68 65  handling are the
11c10 20 63 61 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   cases:.**.**   
11c20 52 4f 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78  ROWS BETWEEN <ex
11c30 70 72 31 3e 20 50 52 45 43 45 44 49 4e 47 20 41  pr1> PRECEDING A
11c40 4e 44 20 3c 65 78 70 72 32 3e 20 50 52 45 43 45  ND <expr2> PRECE
11c50 44 49 4e 47 0a 2a 2a 20 20 20 52 4f 57 53 20 42  DING.**   ROWS B
11c60 45 54 57 45 45 4e 20 3c 65 78 70 72 31 3e 20 46  ETWEEN <expr1> F
11c70 4f 4c 4c 4f 57 49 4e 47 20 41 4e 44 20 3c 65 78  OLLOWING AND <ex
11c80 70 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a  pr2> FOLLOWING.*
11c90 2a 0a 2a 2a 20 77 68 65 6e 20 28 65 78 70 72 31  *.** when (expr1
11ca0 20 3c 20 65 78 70 72 32 29 2e 20 54 68 69 73 20   < expr2). This 
11cb0 69 73 20 64 65 74 65 63 74 65 64 20 61 74 20 72  is detected at r
11cc0 75 6e 74 69 6d 65 2c 20 6e 6f 74 20 62 79 20 74  untime, not by t
11cd0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
11ce0 20 54 6f 20 68 61 6e 64 6c 65 20 74 68 69 73 20   To handle this 
11cf0 63 61 73 65 2c 20 74 68 65 20 70 73 65 75 64 6f  case, the pseudo
11d00 2d 63 6f 64 65 20 70 72 6f 67 72 61 6d 73 20 64  -code programs d
11d10 65 70 69 63 74 65 64 20 61 62 6f 76 65 20 61 72  epicted above ar
11d20 65 20 6d 6f 64 69 66 69 65 64 0a 2a 2a 20 73 6c  e modified.** sl
11d30 69 67 68 74 6c 79 20 74 6f 20 62 65 3a 0a 2a 2a  ightly to be:.**
11d40 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 6c 6f 6f 70  .**     ... loop
11d50 20 73 74 61 72 74 65 64 20 62 79 20 73 71 6c 69   started by sqli
11d60 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
11d70 2e 2e 2e 0a 2a 2a 20 20 20 20 20 69 66 28 20 6e  ....**     if( n
11d80 65 77 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a  ew partition ){.
11d90 2a 2a 20 20 20 20 20 20 20 47 6f 73 75 62 20 66  **       Gosub f
11da0 6c 75 73 68 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a  lush.**     }.**
11db0 20 20 20 20 20 49 6e 73 65 72 74 20 6e 65 77 20       Insert new 
11dc0 72 6f 77 20 69 6e 74 6f 20 65 70 68 20 74 61 62  row into eph tab
11dd0 6c 65 2e 0a 2a 2a 20 20 20 20 20 69 66 28 20 66  le..**     if( f
11de0 69 72 73 74 20 72 6f 77 20 6f 66 20 70 61 72 74  irst row of part
11df0 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20  ition ){.**     
11e00 20 20 52 65 77 69 6e 64 28 63 73 72 45 6e 64 29    Rewind(csrEnd)
11e10 20 3b 20 52 65 77 69 6e 64 28 63 73 72 53 74 61   ; Rewind(csrSta
11e20 72 74 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72  rt) ; Rewind(csr
11e30 43 75 72 72 65 6e 74 29 0a 2a 2a 20 20 20 20 20  Current).**     
11e40 20 20 72 65 67 45 6e 64 20 3d 20 3c 65 78 70 72    regEnd = <expr
11e50 32 3e 0a 2a 2a 20 20 20 20 20 20 20 72 65 67 53  2>.**       regS
11e60 74 61 72 74 20 3d 20 3c 65 78 70 72 31 3e 0a 2a  tart = <expr1>.*
11e70 2a 20 20 20 20 20 20 20 69 66 28 20 72 65 67 45  *       if( regE
11e80 6e 64 20 3c 20 72 65 67 53 74 61 72 74 20 29 7b  nd < regStart ){
11e90 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 45 54 55  .**         RETU
11ea0 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 20 20  RN_ROW.**       
11eb0 20 20 64 65 6c 65 74 65 20 65 70 68 20 74 61 62    delete eph tab
11ec0 6c 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 20  le contents.**  
11ed0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 0a         continue.
11ee0 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20  **       }.**   
11ef0 20 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20    ....**.** The 
11f00 6e 65 77 20 22 63 6f 6e 74 69 6e 75 65 22 20 73  new "continue" s
11f10 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20  tatement in the 
11f20 61 62 6f 76 65 20 6a 75 6d 70 73 20 74 6f 20 74  above jumps to t
11f30 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  he next iteratio
11f40 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 75 74 65  n.** of the oute
11f50 72 20 6c 6f 6f 70 20 2d 20 74 68 65 20 6f 6e 65  r loop - the one
11f60 20 73 74 61 72 74 65 64 20 62 79 20 73 71 6c 69   started by sqli
11f70 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e  te3WhereBegin().
11f80 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 72 69 6f  .**.** The vario
11f90 75 73 20 47 52 4f 55 50 53 20 63 61 73 65 73 20  us GROUPS cases 
11fa0 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  are implemented 
11fb0 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 70  using the same p
11fc0 61 74 74 65 72 6e 73 20 61 73 0a 2a 2a 20 52 4f  atterns as.** RO
11fd0 57 53 2e 20 54 68 65 20 56 4d 20 63 6f 64 65 20  WS. The VM code 
11fe0 69 73 20 6d 6f 64 69 66 69 65 64 20 73 6c 69 67  is modified slig
11ff0 68 74 6c 79 20 73 6f 20 74 68 61 74 3a 0a 2a 2a  htly so that:.**
12000 0a 2a 2a 20 20 20 31 2e 20 54 68 65 20 65 6c 73  .**   1. The els
12010 65 20 62 72 61 6e 63 68 20 69 6e 20 74 68 65 20  e branch in the 
12020 6d 61 69 6e 20 6c 6f 6f 70 20 69 73 20 6f 6e 6c  main loop is onl
12030 79 20 74 61 6b 65 6e 20 69 66 20 74 68 65 20 72  y taken if the r
12040 6f 77 20 6a 75 73 74 0a 2a 2a 20 20 20 20 20 20  ow just.**      
12050 61 64 64 65 64 20 74 6f 20 74 68 65 20 65 70 68  added to the eph
12060 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 73 20  emeral table is 
12070 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 6e  the start of a n
12080 65 77 20 67 72 6f 75 70 2e 20 49 6e 0a 2a 2a 20  ew group. In.** 
12090 20 20 20 20 20 6f 74 68 65 72 20 77 6f 72 64 73       other words
120a0 2c 20 69 74 20 62 65 63 6f 6d 65 73 3a 0a 2a 2a  , it becomes:.**
120b0 0a 2a 2a 20 20 20 20 20 20 20 20 20 2e 2e 2e 20  .**         ... 
120c0 6c 6f 6f 70 20 73 74 61 72 74 65 64 20 62 79 20  loop started by 
120d0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
120e0 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20  n() ....**      
120f0 20 20 20 69 66 28 20 6e 65 77 20 70 61 72 74 69     if( new parti
12100 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20  tion ){.**      
12110 20 20 20 20 20 47 6f 73 75 62 20 66 6c 75 73 68       Gosub flush
12120 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a  .**         }.**
12130 20 20 20 20 20 20 20 20 20 49 6e 73 65 72 74 20           Insert 
12140 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20 65 70 68  new row into eph
12150 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 20   table..**      
12160 20 20 20 69 66 28 20 66 69 72 73 74 20 72 6f 77     if( first row
12170 20 6f 66 20 70 61 72 74 69 74 69 6f 6e 20 29 7b   of partition ){
12180 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 52 65  .**           Re
12190 77 69 6e 64 28 63 73 72 45 6e 64 29 20 3b 20 52  wind(csrEnd) ; R
121a0 65 77 69 6e 64 28 63 73 72 53 74 61 72 74 29 20  ewind(csrStart) 
121b0 3b 20 52 65 77 69 6e 64 28 63 73 72 43 75 72 72  ; Rewind(csrCurr
121c0 65 6e 74 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  ent).**         
121d0 20 20 72 65 67 45 6e 64 20 3d 20 3c 65 78 70 72    regEnd = <expr
121e0 32 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  2>.**           
121f0 72 65 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72  regStart = <expr
12200 31 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 65  1>.**         }e
12210 6c 73 65 20 69 66 28 20 6e 65 77 20 67 72 6f 75  lse if( new grou
12220 70 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  p ){.**         
12230 20 20 2e 2e 2e 20 0a 2a 2a 20 20 20 20 20 20 20    ... .**       
12240 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a    }.**       }.*
12250 2a 0a 2a 2a 20 20 20 32 2e 20 49 6e 73 74 65 61  *.**   2. Instea
12260 64 20 6f 66 20 70 72 6f 63 65 73 73 69 6e 67 20  d of processing 
12270 61 20 73 69 6e 67 6c 65 20 72 6f 77 2c 20 65 61  a single row, ea
12280 63 68 20 52 45 54 55 52 4e 5f 52 4f 57 2c 20 41  ch RETURN_ROW, A
12290 47 47 53 54 45 50 20 6f 72 20 0a 2a 2a 20 20 20  GGSTEP or .**   
122a0 20 20 20 41 47 47 49 4e 56 45 52 53 45 20 73 74     AGGINVERSE st
122b0 65 70 20 70 72 6f 63 65 73 73 65 73 20 74 68 65  ep processes the
122c0 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
122d0 74 68 65 20 72 65 6c 65 76 61 6e 74 20 63 75 72  the relevant cur
122e0 73 6f 72 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  sor and.**      
122f0 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 72  all subsequent r
12300 6f 77 73 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  ows belonging to
12310 20 74 68 65 20 73 61 6d 65 20 67 72 6f 75 70 2e   the same group.
12320 0a 2a 2a 0a 2a 2a 20 52 41 4e 47 45 20 77 69 6e  .**.** RANGE win
12330 64 6f 77 20 66 72 61 6d 65 73 20 61 72 65 20 61  dow frames are a
12340 20 6c 69 74 74 6c 65 20 64 69 66 66 65 72 65 6e   little differen
12350 74 20 61 67 61 69 6e 2e 20 41 73 20 66 6f 72 20  t again. As for 
12360 47 52 4f 55 50 53 2c 20 74 68 65 20 0a 2a 2a 20  GROUPS, the .** 
12370 6d 61 69 6e 20 6c 6f 6f 70 20 72 75 6e 73 20 6f  main loop runs o
12380 6e 63 65 20 70 65 72 20 67 72 6f 75 70 20 6f 6e  nce per group on
12390 6c 79 2e 20 41 6e 64 20 52 45 54 55 52 4e 5f 52  ly. And RETURN_R
123a0 4f 57 2c 20 41 47 47 53 54 45 50 20 61 6e 64 20  OW, AGGSTEP and 
123b0 41 47 47 49 4e 56 45 52 53 45 0a 2a 2a 20 64 65  AGGINVERSE.** de
123c0 61 6c 20 69 6e 20 67 72 6f 75 70 73 20 69 6e 73  al in groups ins
123d0 74 65 61 64 20 6f 66 20 72 6f 77 73 2e 20 41 73  tead of rows. As
123e0 20 66 6f 72 20 52 4f 57 53 20 61 6e 64 20 47 52   for ROWS and GR
123f0 4f 55 50 53 2c 20 74 68 65 72 65 20 61 72 65 20  OUPS, there are 
12400 74 68 72 65 65 0a 2a 2a 20 62 61 73 69 63 20 63  three.** basic c
12410 61 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 41  ases:.**.**   RA
12420 4e 47 45 20 42 45 54 57 45 45 4e 20 3c 65 78 70  NGE BETWEEN <exp
12430 72 31 3e 20 50 52 45 43 45 44 49 4e 47 20 41 4e  r1> PRECEDING AN
12440 44 20 3c 65 78 70 72 32 3e 20 46 4f 4c 4c 4f 57  D <expr2> FOLLOW
12450 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e  ING.**.**     ..
12460 2e 20 6c 6f 6f 70 20 73 74 61 72 74 65 64 20 62  . loop started b
12470 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
12480 67 69 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20  gin() ....**    
12490 20 20 20 69 66 28 20 6e 65 77 20 70 61 72 74 69     if( new parti
124a0 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20  tion ){.**      
124b0 20 20 20 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a     Gosub flush.*
124c0 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  *       }.**    
124d0 20 20 20 49 6e 73 65 72 74 20 6e 65 77 20 72 6f     Insert new ro
124e0 77 20 69 6e 74 6f 20 65 70 68 20 74 61 62 6c 65  w into eph table
124f0 2e 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 66  ..**       if( f
12500 69 72 73 74 20 72 6f 77 20 6f 66 20 70 61 72 74  irst row of part
12510 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20  ition ){.**     
12520 20 20 20 20 52 65 77 69 6e 64 28 63 73 72 45 6e      Rewind(csrEn
12530 64 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72 53  d) ; Rewind(csrS
12540 74 61 72 74 29 20 3b 20 52 65 77 69 6e 64 28 63  tart) ; Rewind(c
12550 73 72 43 75 72 72 65 6e 74 29 0a 2a 2a 20 20 20  srCurrent).**   
12560 20 20 20 20 20 20 72 65 67 45 6e 64 20 3d 20 3c        regEnd = <
12570 65 78 70 72 32 3e 0a 2a 2a 20 20 20 20 20 20 20  expr2>.**       
12580 20 20 72 65 67 53 74 61 72 74 20 3d 20 3c 65 78    regStart = <ex
12590 70 72 31 3e 0a 2a 2a 20 20 20 20 20 20 20 7d 65  pr1>.**       }e
125a0 6c 73 65 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  lse{.**         
125b0 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 20  AGGSTEP.**      
125c0 20 20 20 77 68 69 6c 65 28 20 28 63 73 72 43 75     while( (csrCu
125d0 72 72 65 6e 74 2e 6b 65 79 20 2b 20 72 65 67 45  rrent.key + regE
125e0 6e 64 29 20 3c 20 63 73 72 45 6e 64 2e 6b 65 79  nd) < csrEnd.key
125f0 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   ){.**          
12600 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20   RETURN_ROW.**  
12610 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
12620 63 73 72 53 74 61 72 74 2e 6b 65 79 20 2b 20 72  csrStart.key + r
12630 65 67 53 74 61 72 74 29 20 3c 20 63 73 72 43 75  egStart) < csrCu
12640 72 72 65 6e 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20  rrent.key ){.** 
12650 20 20 20 20 20 20 20 20 20 20 20 20 41 47 47 49              AGGI
12660 4e 56 45 52 53 45 0a 2a 2a 20 20 20 20 20 20 20  NVERSE.**       
12670 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20      }.**        
12680 20 7d 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a   }.**       }.**
12690 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 66 6c       }.**     fl
126a0 75 73 68 3a 0a 2a 2a 20 20 20 20 20 20 20 41 47  ush:.**       AG
126b0 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 77  GSTEP.**       w
126c0 68 69 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20  hile( 1 ){.**   
126d0 20 20 20 20 20 20 52 45 54 55 52 4e 20 52 4f 57        RETURN ROW
126e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 66 28 20  .**         if( 
126f0 63 73 72 43 75 72 72 65 6e 74 20 69 73 20 45 4f  csrCurrent is EO
12700 46 20 29 20 62 72 65 61 6b 3b 0a 2a 2a 20 20 20  F ) break;.**   
12710 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 63          while( c
12720 73 72 53 74 61 72 74 2e 6b 65 79 20 2b 20 72 65  srStart.key + re
12730 67 53 74 61 72 74 29 20 3c 20 63 73 72 43 75 72  gStart) < csrCur
12740 72 65 6e 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20  rent.key ){.**  
12750 20 20 20 20 20 20 20 20 20 20 20 41 47 47 49 4e             AGGIN
12760 56 45 52 53 45 0a 2a 2a 20 20 20 20 20 20 20 20  VERSE.**        
12770 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20     }.**         
12780 7d 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 0a  }.**       }.**.
12790 2a 2a 20 49 6e 20 74 68 65 20 61 62 6f 76 65 20  ** In the above 
127a0 6e 6f 74 61 74 69 6f 6e 2c 20 22 63 73 72 2e 6b  notation, "csr.k
127b0 65 79 22 20 6d 65 61 6e 73 20 74 68 65 20 63 75  ey" means the cu
127c0 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74  rrent value of t
127d0 68 65 20 4f 52 44 45 52 20 42 59 20 0a 2a 2a 20  he ORDER BY .** 
127e0 65 78 70 72 65 73 73 69 6f 6e 20 28 74 68 65 72  expression (ther
127f0 65 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 31  e is only ever 1
12800 20 66 6f 72 20 61 20 52 41 4e 47 45 20 74 68 61   for a RANGE tha
12810 74 20 75 73 65 73 20 61 6e 20 3c 65 78 70 72 3e  t uses an <expr>
12820 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 20 6f 72   FOLLOWING.** or
12830 20 3c 65 78 70 72 20 50 52 45 43 45 44 49 4e 47   <expr PRECEDING
12840 29 20 72 65 61 64 20 66 72 6f 6d 20 63 75 72 73  ) read from curs
12850 6f 72 20 63 73 72 2e 0a 2a 2a 0a 2a 2a 20 20 20  or csr..**.**   
12860 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 3c 65  RANGE BETWEEN <e
12870 78 70 72 31 3e 20 50 52 45 43 45 44 49 4e 47 20  xpr1> PRECEDING 
12880 41 4e 44 20 3c 65 78 70 72 32 3e 20 50 52 45 43  AND <expr2> PREC
12890 45 44 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20  EDING.**.**     
128a0 2e 2e 2e 20 6c 6f 6f 70 20 73 74 61 72 74 65 64  ... loop started
128b0 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
128c0 42 65 67 69 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20  Begin() ....**  
128d0 20 20 20 20 20 69 66 28 20 6e 65 77 20 70 61 72       if( new par
128e0 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20  tition ){.**    
128f0 20 20 20 20 20 47 6f 73 75 62 20 66 6c 75 73 68       Gosub flush
12900 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  .**       }.**  
12910 20 20 20 20 20 49 6e 73 65 72 74 20 6e 65 77 20       Insert new 
12920 72 6f 77 20 69 6e 74 6f 20 65 70 68 20 74 61 62  row into eph tab
12930 6c 65 2e 0a 2a 2a 20 20 20 20 20 20 20 69 66 28  le..**       if(
12940 20 66 69 72 73 74 20 72 6f 77 20 6f 66 20 70 61   first row of pa
12950 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20  rtition ){.**   
12960 20 20 20 20 20 20 52 65 77 69 6e 64 28 63 73 72        Rewind(csr
12970 45 6e 64 29 20 3b 20 52 65 77 69 6e 64 28 63 73  End) ; Rewind(cs
12980 72 53 74 61 72 74 29 20 3b 20 52 65 77 69 6e 64  rStart) ; Rewind
12990 28 63 73 72 43 75 72 72 65 6e 74 29 0a 2a 2a 20  (csrCurrent).** 
129a0 20 20 20 20 20 20 20 20 72 65 67 45 6e 64 20 3d          regEnd =
129b0 20 3c 65 78 70 72 32 3e 0a 2a 2a 20 20 20 20 20   <expr2>.**     
129c0 20 20 20 20 72 65 67 53 74 61 72 74 20 3d 20 3c      regStart = <
129d0 65 78 70 72 31 3e 0a 2a 2a 20 20 20 20 20 20 20  expr1>.**       
129e0 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20 20 20 20 20  }else{.**       
129f0 20 20 77 68 69 6c 65 28 20 28 63 73 72 45 6e 64    while( (csrEnd
12a00 2e 6b 65 79 20 2b 20 72 65 67 45 6e 64 29 20 3c  .key + regEnd) <
12a10 3d 20 63 73 72 43 75 72 72 65 6e 74 2e 6b 65 79  = csrCurrent.key
12a20 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   ){.**          
12a30 20 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20 20   AGGSTEP.**     
12a40 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20      }.**        
12a50 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20   RETURN_ROW.**  
12a60 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63         while( (c
12a70 73 72 53 74 61 72 74 2e 6b 65 79 20 2b 20 72 65  srStart.key + re
12a80 67 53 74 61 72 74 29 20 3c 20 63 73 72 43 75 72  gStart) < csrCur
12a90 72 65 6e 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20  rent.key ){.**  
12aa0 20 20 20 20 20 20 20 20 20 41 47 47 49 4e 56 45           AGGINVE
12ab0 52 53 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d  RSE.**         }
12ac0 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  .**       }.**  
12ad0 20 20 20 7d 0a 2a 2a 20 20 20 20 20 66 6c 75 73     }.**     flus
12ae0 68 3a 0a 2a 2a 20 20 20 20 20 20 20 77 68 69 6c  h:.**       whil
12af0 65 28 20 28 63 73 72 45 6e 64 2e 6b 65 79 20 2b  e( (csrEnd.key +
12b00 20 72 65 67 45 6e 64 29 20 3c 3d 20 63 73 72 43   regEnd) <= csrC
12b10 75 72 72 65 6e 74 2e 6b 65 79 20 29 7b 0a 2a 2a  urrent.key ){.**
12b20 20 20 20 20 20 20 20 20 20 41 47 47 53 54 45 50           AGGSTEP
12b30 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  .**       }.**  
12b40 20 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a       RETURN_ROW.
12b50 2a 2a 0a 2a 2a 20 20 20 52 41 4e 47 45 20 42 45  **.**   RANGE BE
12b60 54 57 45 45 4e 20 3c 65 78 70 72 31 3e 20 46 4f  TWEEN <expr1> FO
12b70 4c 4c 4f 57 49 4e 47 20 41 4e 44 20 3c 65 78 70  LLOWING AND <exp
12b80 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a  r2> FOLLOWING.**
12b90 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 6c 6f 6f 70  .**     ... loop
12ba0 20 73 74 61 72 74 65 64 20 62 79 20 73 71 6c 69   started by sqli
12bb0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
12bc0 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 69 66 28  ....**       if(
12bd0 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 20 29   new partition )
12be0 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 47 6f 73  {.**         Gos
12bf0 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20 20 20 20  ub flush.**     
12c00 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 49 6e 73    }.**       Ins
12c10 65 72 74 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f  ert new row into
12c20 20 65 70 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20   eph table..**  
12c30 20 20 20 20 20 69 66 28 20 66 69 72 73 74 20 72       if( first r
12c40 6f 77 20 6f 66 20 70 61 72 74 69 74 69 6f 6e 20  ow of partition 
12c50 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 65  ){.**         Re
12c60 77 69 6e 64 28 63 73 72 45 6e 64 29 20 3b 20 52  wind(csrEnd) ; R
12c70 65 77 69 6e 64 28 63 73 72 53 74 61 72 74 29 20  ewind(csrStart) 
12c80 3b 20 52 65 77 69 6e 64 28 63 73 72 43 75 72 72  ; Rewind(csrCurr
12c90 65 6e 74 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  ent).**         
12ca0 72 65 67 45 6e 64 20 3d 20 3c 65 78 70 72 32 3e  regEnd = <expr2>
12cb0 0a 2a 2a 20 20 20 20 20 20 20 20 20 72 65 67 53  .**         regS
12cc0 74 61 72 74 20 3d 20 3c 65 78 70 72 31 3e 0a 2a  tart = <expr1>.*
12cd0 2a 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 2a  *       }else{.*
12ce0 2a 20 20 20 20 20 20 20 20 20 41 47 47 53 54 45  *         AGGSTE
12cf0 50 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 68 69  P.**         whi
12d00 6c 65 28 20 28 63 73 72 43 75 72 72 65 6e 74 2e  le( (csrCurrent.
12d10 6b 65 79 20 2b 20 72 65 67 45 6e 64 29 20 3c 20  key + regEnd) < 
12d20 63 73 72 45 6e 64 2e 6b 65 79 20 29 7b 0a 2a 2a  csrEnd.key ){.**
12d30 20 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65             while
12d40 28 20 28 63 73 72 43 75 72 72 65 6e 74 2e 6b 65  ( (csrCurrent.ke
12d50 79 20 2b 20 72 65 67 53 74 61 72 74 29 20 3e 20  y + regStart) > 
12d60 63 73 72 53 74 61 72 74 2e 6b 65 79 20 29 7b 0a  csrStart.key ){.
12d70 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 41  **             A
12d80 47 47 49 4e 56 45 52 53 45 0a 2a 2a 20 20 20 20  GGINVERSE.**    
12d90 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
12da0 20 20 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57        RETURN_ROW
12db0 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a  .**         }.**
12dc0 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
12dd0 7d 0a 2a 2a 20 20 20 20 20 66 6c 75 73 68 3a 0a  }.**     flush:.
12de0 2a 2a 20 20 20 20 20 20 20 41 47 47 53 54 45 50  **       AGGSTEP
12df0 0a 2a 2a 20 20 20 20 20 20 20 77 68 69 6c 65 28  .**       while(
12e00 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20   1 ){.**        
12e10 20 77 68 69 6c 65 28 20 28 63 73 72 43 75 72 72   while( (csrCurr
12e20 65 6e 74 2e 6b 65 79 20 2b 20 72 65 67 53 74 61  ent.key + regSta
12e30 72 74 29 20 3e 20 63 73 72 53 74 61 72 74 2e 6b  rt) > csrStart.k
12e40 65 79 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  ey ){.**        
12e50 20 20 20 41 47 47 49 4e 56 45 52 53 45 0a 2a 2a     AGGINVERSE.**
12e60 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65             if( e
12e70 6f 66 20 29 20 62 72 65 61 6b 20 22 77 68 69 6c  of ) break "whil
12e80 65 28 20 31 20 29 22 20 6c 6f 6f 70 2e 0a 2a 2a  e( 1 )" loop..**
12e90 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20           }.**   
12ea0 20 20 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57        RETURN_ROW
12eb0 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  .**       }.**  
12ec0 20 20 20 20 20 77 68 69 6c 65 28 20 21 65 6f 66       while( !eof
12ed0 20 63 73 72 43 75 72 72 65 6e 74 20 29 7b 0a 2a   csrCurrent ){.*
12ee0 2a 20 20 20 20 20 20 20 20 20 52 45 54 55 52 4e  *         RETURN
12ef0 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 20 20 7d 0a  _ROW.**       }.
12f00 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 78 74 20 61  **.** The text a
12f10 62 6f 76 65 20 6c 65 61 76 65 73 20 6f 75 74 20  bove leaves out 
12f20 6d 61 6e 79 20 64 65 74 61 69 6c 73 2e 20 52 65  many details. Re
12f30 66 65 72 20 74 6f 20 74 68 65 20 63 6f 64 65 20  fer to the code 
12f40 61 6e 64 20 63 6f 6d 6d 65 6e 74 73 0a 2a 2a 20  and comments.** 
12f50 62 65 6c 6f 77 20 66 6f 72 20 61 20 6d 6f 72 65  below for a more
12f60 20 63 6f 6d 70 6c 65 74 65 20 70 69 63 74 75 72   complete pictur
12f70 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
12f80 65 33 57 69 6e 64 6f 77 43 6f 64 65 53 74 65 70  e3WindowCodeStep
12f90 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
12fa0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
12fb0 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
12fc0 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
12fd0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
12fe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 77            /* Rew
12ff0 72 69 74 74 65 6e 20 53 45 4c 45 43 54 20 73 74  ritten SELECT st
13000 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 57 68 65  atement */.  Whe
13010 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20  reInfo *pWInfo, 
13020 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13030 43 6f 6e 74 65 78 74 20 72 65 74 75 72 6e 65 64  Context returned
13040 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
13050 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74  Begin() */.  int
13060 20 72 65 67 47 6f 73 75 62 2c 20 20 20 20 20 20   regGosub,      
13070 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13080 52 65 67 69 73 74 65 72 20 66 6f 72 20 4f 50 5f  Register for OP_
13090 47 6f 73 75 62 20 2a 2f 0a 20 20 69 6e 74 20 61  Gosub */.  int a
130a0 64 64 72 47 6f 73 75 62 20 20 20 20 20 20 20 20  ddrGosub        
130b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 50             /* OP
130c0 5f 47 6f 73 75 62 20 68 65 72 65 20 74 6f 20 72  _Gosub here to r
130d0 65 74 75 72 6e 20 65 61 63 68 20 72 6f 77 20 2a  eturn each row *
130e0 2f 0a 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70  /.){.  Window *p
130f0 4d 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b 0a  MWin = p->pWin;.
13100 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
13110 65 72 42 79 20 3d 20 70 4d 57 69 6e 2d 3e 70 4f  erBy = pMWin->pO
13120 72 64 65 72 42 79 3b 0a 20 20 56 64 62 65 20 2a  rderBy;.  Vdbe *
13130 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
13140 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e  be(pParse);.  in
13150 74 20 63 73 72 57 72 69 74 65 3b 20 20 20 20 20  t csrWrite;     
13160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13170 20 43 75 72 73 6f 72 20 75 73 65 64 20 74 6f 20   Cursor used to 
13180 77 72 69 74 65 20 74 6f 20 65 70 68 2e 20 74 61  write to eph. ta
13190 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 63 73 72  ble */.  int csr
131a0 49 6e 70 75 74 20 3d 20 70 2d 3e 70 53 72 63 2d  Input = p->pSrc-
131b0 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 20 20  >a[0].iCursor;  
131c0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20     /* Cursor of 
131d0 73 75 62 2d 73 65 6c 65 63 74 20 2a 2f 0a 20 20  sub-select */.  
131e0 69 6e 74 20 6e 49 6e 70 75 74 20 3d 20 70 2d 3e  int nInput = p->
131f0 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 2d  pSrc->a[0].pTab-
13200 3e 6e 43 6f 6c 3b 20 20 20 20 2f 2a 20 4e 75 6d  >nCol;    /* Num
13210 62 65 72 20 6f 66 20 63 6f 6c 73 20 72 65 74 75  ber of cols retu
13220 72 6e 65 64 20 62 79 20 73 75 62 20 2a 2f 0a 20  rned by sub */. 
13230 20 69 6e 74 20 69 49 6e 70 75 74 3b 20 20 20 20   int iInput;    
13240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
13260 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
13270 20 73 75 62 20 63 6f 6c 73 20 2a 2f 0a 20 20 69   sub cols */.  i
13280 6e 74 20 61 64 64 72 4e 65 3b 20 20 20 20 20 20  nt addrNe;      
13290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
132a0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f  * Address of OP_
132b0 4e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  Ne */.  int addr
132c0 47 6f 73 75 62 46 6c 75 73 68 20 3d 20 30 3b 20  GosubFlush = 0; 
132d0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
132e0 73 73 20 6f 66 20 4f 50 5f 47 6f 73 75 62 20 74  ss of OP_Gosub t
132f0 6f 20 66 6c 75 73 68 3a 20 2a 2f 0a 20 20 69 6e  o flush: */.  in
13300 74 20 61 64 64 72 49 6e 74 65 67 65 72 20 3d 20  t addrInteger = 
13310 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
13320 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 49   Address of OP_I
13330 6e 74 65 67 65 72 20 2a 2f 0a 20 20 69 6e 74 20  nteger */.  int 
13340 61 64 64 72 45 6d 70 74 79 3b 20 20 20 20 20 20  addrEmpty;      
13350 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
13360 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 52 65 77  ddress of OP_Rew
13370 69 6e 64 20 69 6e 20 66 6c 75 73 68 3a 20 2a 2f  ind in flush: */
13380 0a 20 20 69 6e 74 20 72 65 67 53 74 61 72 74 20  .  int regStart 
13390 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
133a0 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 3c     /* Value of <
133b0 65 78 70 72 3e 20 50 52 45 43 45 44 49 4e 47 20  expr> PRECEDING 
133c0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45 6e 64 20  */.  int regEnd 
133d0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
133e0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
133f0 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e   <expr> FOLLOWIN
13400 47 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4e 65  G */.  int regNe
13410 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
13420 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
13430 6f 66 20 72 65 67 69 73 74 65 72 73 20 68 6f 6c  of registers hol
13440 64 69 6e 67 20 6e 65 77 20 69 6e 70 75 74 20 72  ding new input r
13450 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52  ow */.  int regR
13460 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20  ecord;          
13470 20 20 20 20 20 20 20 20 2f 2a 20 72 65 67 4e 65          /* regNe
13480 77 20 61 72 72 61 79 20 69 6e 20 72 65 63 6f 72  w array in recor
13490 64 20 66 6f 72 6d 20 2a 2f 0a 20 20 69 6e 74 20  d form */.  int 
134a0 72 65 67 52 6f 77 69 64 3b 20 20 20 20 20 20 20  regRowid;       
134b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
134c0 6f 77 69 64 20 66 6f 72 20 72 65 67 52 65 63 6f  owid for regReco
134d0 72 64 20 69 6e 20 65 70 68 20 74 61 62 6c 65 20  rd in eph table 
134e0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4e 65 77 50  */.  int regNewP
134f0 65 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  eer = 0;        
13500 20 20 20 20 20 2f 2a 20 50 65 65 72 20 76 61 6c       /* Peer val
13510 75 65 73 20 66 6f 72 20 6e 65 77 20 72 6f 77 20  ues for new row 
13520 28 70 61 72 74 20 6f 66 20 72 65 67 4e 65 77 29  (part of regNew)
13530 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 65 65   */.  int regPee
13540 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
13550 20 20 20 20 20 20 2f 2a 20 50 65 65 72 20 76 61        /* Peer va
13560 6c 75 65 73 20 66 6f 72 20 63 75 72 72 65 6e 74  lues for current
13570 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 72 65   row */.  int re
13580 67 46 6c 75 73 68 50 61 72 74 20 3d 20 30 3b 20  gFlushPart = 0; 
13590 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
135a0 69 73 74 65 72 20 66 6f 72 20 22 47 6f 73 75 62  ister for "Gosub
135b0 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e   flush_partition
135c0 22 20 2a 2f 0a 20 20 57 69 6e 64 6f 77 43 6f 64  " */.  WindowCod
135d0 65 41 72 67 20 73 3b 20 20 20 20 20 20 20 20 20  eArg s;         
135e0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78         /* Contex
135f0 74 20 6f 62 6a 65 63 74 20 66 6f 72 20 73 75 62  t object for sub
13600 2d 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20 69  -routines */.  i
13610 6e 74 20 6c 62 6c 57 68 65 72 65 45 6e 64 3b 20  nt lblWhereEnd; 
13620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13630 2a 20 4c 61 62 65 6c 20 6a 75 73 74 20 62 65 66  * Label just bef
13640 6f 72 65 20 73 71 6c 69 74 65 33 57 68 65 72 65  ore sqlite3Where
13650 45 6e 64 28 29 20 63 6f 64 65 20 2a 2f 0a 0a 20  End() code */.. 
13660 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e   assert( pMWin->
13670 65 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45  eStart==TK_PRECE
13680 44 49 4e 47 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65  DING || pMWin->e
13690 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e  Start==TK_CURREN
136a0 54 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d 57  T .       || pMW
136b0 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46  in->eStart==TK_F
136c0 4f 4c 4c 4f 57 49 4e 47 20 7c 7c 20 70 4d 57 69  OLLOWING || pMWi
136d0 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e  n->eStart==TK_UN
136e0 42 4f 55 4e 44 45 44 20 0a 20 20 29 3b 0a 20 20  BOUNDED .  );.  
136f0 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65  assert( pMWin->e
13700 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e  End==TK_FOLLOWIN
13710 47 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e 64  G || pMWin->eEnd
13720 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 0a 20 20  ==TK_CURRENT .  
13730 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65       || pMWin->e
13740 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  End==TK_UNBOUNDE
13750 44 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e 64  D || pMWin->eEnd
13760 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 0a  ==TK_PRECEDING .
13770 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70    );.  assert( p
13780 4d 57 69 6e 2d 3e 65 45 78 63 6c 75 64 65 3d 3d  MWin->eExclude==
13790 30 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 78 63  0 || pMWin->eExc
137a0 6c 75 64 65 3d 3d 54 4b 5f 43 55 52 52 45 4e 54  lude==TK_CURRENT
137b0 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e  .       || pMWin
137c0 2d 3e 65 45 78 63 6c 75 64 65 3d 3d 54 4b 5f 47  ->eExclude==TK_G
137d0 52 4f 55 50 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65  ROUP || pMWin->e
137e0 45 78 63 6c 75 64 65 3d 3d 54 4b 5f 54 49 45 53  Exclude==TK_TIES
137f0 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e  .       || pMWin
13800 2d 3e 65 45 78 63 6c 75 64 65 3d 3d 54 4b 5f 4e  ->eExclude==TK_N
13810 4f 0a 20 20 29 3b 0a 0a 20 20 6c 62 6c 57 68 65  O.  );..  lblWhe
13820 72 65 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56  reEnd = sqlite3V
13830 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
13840 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  rse);..  /* Fill
13850 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20   in the context 
13860 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 6d 65 6d 73  object */.  mems
13870 65 74 28 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&s, 0, sizeof
13880 28 57 69 6e 64 6f 77 43 6f 64 65 41 72 67 29 29  (WindowCodeArg))
13890 3b 0a 20 20 73 2e 70 50 61 72 73 65 20 3d 20 70  ;.  s.pParse = p
138a0 50 61 72 73 65 3b 0a 20 20 73 2e 70 4d 57 69 6e  Parse;.  s.pMWin
138b0 20 3d 20 70 4d 57 69 6e 3b 0a 20 20 73 2e 70 56   = pMWin;.  s.pV
138c0 64 62 65 20 3d 20 76 3b 0a 20 20 73 2e 72 65 67  dbe = v;.  s.reg
138d0 47 6f 73 75 62 20 3d 20 72 65 67 47 6f 73 75 62  Gosub = regGosub
138e0 3b 0a 20 20 73 2e 61 64 64 72 47 6f 73 75 62 20  ;.  s.addrGosub 
138f0 3d 20 61 64 64 72 47 6f 73 75 62 3b 0a 20 20 73  = addrGosub;.  s
13900 2e 63 75 72 72 65 6e 74 2e 63 73 72 20 3d 20 70  .current.csr = p
13910 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 3b 0a 20  MWin->iEphCsr;. 
13920 20 63 73 72 57 72 69 74 65 20 3d 20 73 2e 63 75   csrWrite = s.cu
13930 72 72 65 6e 74 2e 63 73 72 2b 31 3b 0a 20 20 73  rrent.csr+1;.  s
13940 2e 73 74 61 72 74 2e 63 73 72 20 3d 20 73 2e 63  .start.csr = s.c
13950 75 72 72 65 6e 74 2e 63 73 72 2b 32 3b 0a 20 20  urrent.csr+2;.  
13960 73 2e 65 6e 64 2e 63 73 72 20 3d 20 73 2e 63 75  s.end.csr = s.cu
13970 72 72 65 6e 74 2e 63 73 72 2b 33 3b 0a 0a 20 20  rrent.csr+3;..  
13980 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  /* Figure out wh
13990 65 6e 20 72 6f 77 73 20 6d 61 79 20 62 65 20 64  en rows may be d
139a0 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20  eleted from the 
139b0 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e  ephemeral table.
139c0 20 54 68 65 72 65 0a 20 20 2a 2a 20 61 72 65 20   There.  ** are 
139d0 66 6f 75 72 20 6f 70 74 69 6f 6e 73 20 2d 20 74  four options - t
139e0 68 65 79 20 6d 61 79 20 6e 65 76 65 72 20 62 65  hey may never be
139f0 20 64 65 6c 65 74 65 64 20 28 65 44 65 6c 65 74   deleted (eDelet
13a00 65 3d 3d 30 29 2c 20 74 68 65 79 20 6d 61 79 20  e==0), they may 
13a10 0a 20 20 2a 2a 20 62 65 20 64 65 6c 65 74 65 64  .  ** be deleted
13a20 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 79   as soon as they
13a30 20 61 72 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 70   are no longer p
13a40 61 72 74 20 6f 66 20 74 68 65 20 77 69 6e 64 6f  art of the windo
13a50 77 20 66 72 61 6d 65 0a 20 20 2a 2a 20 28 65 44  w frame.  ** (eD
13a60 65 6c 65 74 65 3d 3d 57 49 4e 44 4f 57 5f 41 47  elete==WINDOW_AG
13a70 47 49 4e 56 45 52 53 45 29 2c 20 74 68 65 79 20  GINVERSE), they 
13a80 6d 61 79 20 62 65 20 64 65 6c 65 74 65 64 20 61  may be deleted a
13a90 73 20 61 66 74 65 72 20 74 68 65 20 72 6f 77 20  s after the row 
13aa0 0a 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72  .  ** has been r
13ab0 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
13ac0 61 6c 6c 65 72 20 28 57 49 4e 44 4f 57 5f 52 45  aller (WINDOW_RE
13ad0 54 55 52 4e 5f 52 4f 57 29 2c 20 6f 72 20 74 68  TURN_ROW), or th
13ae0 65 79 20 6d 61 79 0a 20 20 2a 2a 20 62 65 20 64  ey may.  ** be d
13af0 65 6c 65 74 65 64 20 61 66 74 65 72 20 74 68 65  eleted after the
13b00 79 20 65 6e 74 65 72 20 74 68 65 20 66 72 61 6d  y enter the fram
13b10 65 20 28 57 49 4e 44 4f 57 5f 41 47 47 53 54 45  e (WINDOW_AGGSTE
13b20 50 29 2e 20 2a 2f 0a 20 20 73 77 69 74 63 68 28  P). */.  switch(
13b30 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 20 29   pMWin->eStart )
13b40 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4f  {.    case TK_FO
13b50 4c 4c 4f 57 49 4e 47 3a 0a 20 20 20 20 20 20 69  LLOWING:.      i
13b60 66 28 20 70 4d 57 69 6e 2d 3e 65 46 72 6d 54 79  f( pMWin->eFrmTy
13b70 70 65 21 3d 54 4b 5f 52 41 4e 47 45 0a 20 20 20  pe!=TK_RANGE.   
13b80 20 20 20 20 26 26 20 77 69 6e 64 6f 77 45 78 70      && windowExp
13b90 72 47 74 5a 65 72 6f 28 70 50 61 72 73 65 2c 20  rGtZero(pParse, 
13ba0 70 4d 57 69 6e 2d 3e 70 53 74 61 72 74 29 0a 20  pMWin->pStart). 
13bb0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
13bc0 73 2e 65 44 65 6c 65 74 65 20 3d 20 57 49 4e 44  s.eDelete = WIND
13bd0 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 3b 0a 20  OW_RETURN_ROW;. 
13be0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
13bf0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
13c00 55 4e 42 4f 55 4e 44 45 44 3a 0a 20 20 20 20 20  UNBOUNDED:.     
13c10 20 69 66 28 20 77 69 6e 64 6f 77 43 61 63 68 65   if( windowCache
13c20 46 72 61 6d 65 28 70 4d 57 69 6e 29 3d 3d 30 20  Frame(pMWin)==0 
13c30 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
13c40 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50  MWin->eEnd==TK_P
13c50 52 45 43 45 44 49 4e 47 20 29 7b 0a 20 20 20 20  RECEDING ){.    
13c60 20 20 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d        if( pMWin-
13c70 3e 65 46 72 6d 54 79 70 65 21 3d 54 4b 5f 52 41  >eFrmType!=TK_RA
13c80 4e 47 45 0a 20 20 20 20 20 20 20 20 20 20 20 26  NGE.           &
13c90 26 20 77 69 6e 64 6f 77 45 78 70 72 47 74 5a 65  & windowExprGtZe
13ca0 72 6f 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  ro(pParse, pMWin
13cb0 2d 3e 70 45 6e 64 29 0a 20 20 20 20 20 20 20 20  ->pEnd).        
13cc0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
13cd0 20 73 2e 65 44 65 6c 65 74 65 20 3d 20 57 49 4e   s.eDelete = WIN
13ce0 44 4f 57 5f 41 47 47 53 54 45 50 3b 0a 20 20 20  DOW_AGGSTEP;.   
13cf0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13d00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13d10 20 20 73 2e 65 44 65 6c 65 74 65 20 3d 20 57 49    s.eDelete = WI
13d20 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 3b  NDOW_RETURN_ROW;
13d30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13d40 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
13d50 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
13d60 20 20 20 73 2e 65 44 65 6c 65 74 65 20 3d 20 57     s.eDelete = W
13d70 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45  INDOW_AGGINVERSE
13d80 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
13d90 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
13da0 65 20 72 65 67 69 73 74 65 72 73 20 66 6f 72 20  e registers for 
13db0 74 68 65 20 61 72 72 61 79 20 6f 66 20 76 61 6c  the array of val
13dc0 75 65 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62  ues from the sub
13dd0 2d 71 75 65 72 79 2c 20 74 68 65 0a 20 20 2a 2a  -query, the.  **
13de0 20 73 61 6d 76 65 20 76 61 6c 75 65 73 20 69 6e   samve values in
13df0 20 72 65 63 6f 72 64 20 66 6f 72 6d 2c 20 61 6e   record form, an
13e00 64 20 74 68 65 20 72 6f 77 69 64 20 75 73 65 64  d the rowid used
13e10 20 74 6f 20 69 6e 73 65 72 74 20 73 61 69 64 20   to insert said 
13e20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 69 6e 74 6f  record.  ** into
13e30 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74   the ephemeral t
13e40 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 72 65 67 4e  able.  */.  regN
13e50 65 77 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ew = pParse->nMe
13e60 6d 2b 31 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  m+1;.  pParse->n
13e70 4d 65 6d 20 2b 3d 20 6e 49 6e 70 75 74 3b 0a 20  Mem += nInput;. 
13e80 20 72 65 67 52 65 63 6f 72 64 20 3d 20 2b 2b 70   regRecord = ++p
13e90 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
13ea0 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72  egRowid = ++pPar
13eb0 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 2f 2a 20  se->nMem;..  /* 
13ec0 49 66 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72  If the window fr
13ed0 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  ame contains an 
13ee0 22 3c 65 78 70 72 3e 20 50 52 45 43 45 44 49 4e  "<expr> PRECEDIN
13ef0 47 22 20 6f 72 20 22 3c 65 78 70 72 3e 20 46 4f  G" or "<expr> FO
13f00 4c 4c 4f 57 49 4e 47 22 0a 20 20 2a 2a 20 63 6c  LLOWING".  ** cl
13f10 61 75 73 65 2c 20 61 6c 6c 6f 63 61 74 65 20 72  ause, allocate r
13f20 65 67 69 73 74 65 72 73 20 74 6f 20 73 74 6f 72  egisters to stor
13f30 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  e the results of
13f40 20 65 76 61 6c 75 61 74 69 6e 67 20 65 61 63 68   evaluating each
13f50 0a 20 20 2a 2a 20 3c 65 78 70 72 3e 2e 20 20 2a  .  ** <expr>.  *
13f60 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65  /.  if( pMWin->e
13f70 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44  Start==TK_PRECED
13f80 49 4e 47 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53  ING || pMWin->eS
13f90 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49  tart==TK_FOLLOWI
13fa0 4e 47 20 29 7b 0a 20 20 20 20 72 65 67 53 74 61  NG ){.    regSta
13fb0 72 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rt = ++pParse->n
13fc0 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  Mem;.  }.  if( p
13fd0 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50  MWin->eEnd==TK_P
13fe0 52 45 43 45 44 49 4e 47 20 7c 7c 20 70 4d 57 69  RECEDING || pMWi
13ff0 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c  n->eEnd==TK_FOLL
14000 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 72 65 67  OWING ){.    reg
14010 45 6e 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  End = ++pParse->
14020 6e 4d 65 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  nMem;.  }..  /* 
14030 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  If this is not a
14040 20 22 52 4f 57 53 20 42 45 54 57 45 45 4e 20 2e   "ROWS BETWEEN .
14050 2e 2e 22 20 66 72 61 6d 65 2c 20 74 68 65 6e 20  .." frame, then 
14060 61 6c 6c 6f 63 61 74 65 20 61 72 72 61 79 73 20  allocate arrays 
14070 6f 66 0a 20 20 2a 2a 20 72 65 67 69 73 74 65 72  of.  ** register
14080 73 20 74 6f 20 73 74 6f 72 65 20 63 6f 70 69 65  s to store copie
14090 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  s of the ORDER B
140a0 59 20 65 78 70 72 65 73 73 69 6f 6e 73 20 28 70  Y expressions (p
140b0 65 65 72 20 76 61 6c 75 65 73 29 20 0a 20 20 2a  eer values) .  *
140c0 2a 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 6c  * for the main l
140d0 6f 6f 70 2c 20 61 6e 64 20 66 6f 72 20 65 61 63  oop, and for eac
140e0 68 20 63 75 72 73 6f 72 20 28 73 74 61 72 74 2c  h cursor (start,
140f0 20 63 75 72 72 65 6e 74 20 61 6e 64 20 65 6e 64   current and end
14100 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69  ). */.  if( pMWi
14110 6e 2d 3e 65 46 72 6d 54 79 70 65 21 3d 54 4b 5f  n->eFrmType!=TK_
14120 52 4f 57 53 20 29 7b 0a 20 20 20 20 69 6e 74 20  ROWS ){.    int 
14130 6e 50 65 65 72 20 3d 20 28 70 4f 72 64 65 72 42  nPeer = (pOrderB
14140 79 20 3f 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  y ? pOrderBy->nE
14150 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 72 65  xpr : 0);.    re
14160 67 4e 65 77 50 65 65 72 20 3d 20 72 65 67 4e 65  gNewPeer = regNe
14170 77 20 2b 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66  w + pMWin->nBuff
14180 65 72 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 70  erCol;.    if( p
14190 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e  MWin->pPartition
141a0 20 29 20 72 65 67 4e 65 77 50 65 65 72 20 2b 3d   ) regNewPeer +=
141b0 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69   pMWin->pPartiti
141c0 6f 6e 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 72  on->nExpr;.    r
141d0 65 67 50 65 65 72 20 3d 20 70 50 61 72 73 65 2d  egPeer = pParse-
141e0 3e 6e 4d 65 6d 2b 31 3b 20 20 20 20 20 20 20 70  >nMem+1;       p
141f0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
14200 50 65 65 72 3b 0a 20 20 20 20 73 2e 73 74 61 72  Peer;.    s.star
14210 74 2e 72 65 67 20 3d 20 70 50 61 72 73 65 2d 3e  t.reg = pParse->
14220 6e 4d 65 6d 2b 31 3b 20 20 20 70 50 61 72 73 65  nMem+1;   pParse
14230 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 65 65 72 3b  ->nMem += nPeer;
14240 0a 20 20 20 20 73 2e 63 75 72 72 65 6e 74 2e 72  .    s.current.r
14250 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  eg = pParse->nMe
14260 6d 2b 31 3b 20 70 50 61 72 73 65 2d 3e 6e 4d 65  m+1; pParse->nMe
14270 6d 20 2b 3d 20 6e 50 65 65 72 3b 0a 20 20 20 20  m += nPeer;.    
14280 73 2e 65 6e 64 2e 72 65 67 20 3d 20 70 50 61 72  s.end.reg = pPar
14290 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 20 20 20 20 20  se->nMem+1;     
142a0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
142b0 6e 50 65 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  nPeer;.  }..  /*
142c0 20 4c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e   Load the column
142d0 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20   values for the 
142e0 72 6f 77 20 72 65 74 75 72 6e 65 64 20 62 79 20  row returned by 
142f0 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 0a 20  the sub-select. 
14300 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 61 72 72 61   ** into an arra
14310 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 73  y of registers s
14320 74 61 72 74 69 6e 67 20 61 74 20 72 65 67 4e 65  tarting at regNe
14330 77 2e 20 41 73 73 65 6d 62 6c 65 20 74 68 65 6d  w. Assemble them
14340 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 72 65 63   into.  ** a rec
14350 6f 72 64 20 69 6e 20 72 65 67 69 73 74 65 72 20  ord in register 
14360 72 65 67 52 65 63 6f 72 64 2e 20 2a 2f 0a 20 20  regRecord. */.  
14370 66 6f 72 28 69 49 6e 70 75 74 3d 30 3b 20 69 49  for(iInput=0; iI
14380 6e 70 75 74 3c 6e 49 6e 70 75 74 3b 20 69 49 6e  nput<nInput; iIn
14390 70 75 74 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  put++){.    sqli
143a0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
143b0 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 49   OP_Column, csrI
143c0 6e 70 75 74 2c 20 69 49 6e 70 75 74 2c 20 72 65  nput, iInput, re
143d0 67 4e 65 77 2b 69 49 6e 70 75 74 29 3b 0a 20 20  gNew+iInput);.  
143e0 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
143f0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
14400 52 65 63 6f 72 64 2c 20 72 65 67 4e 65 77 2c 20  Record, regNew, 
14410 6e 49 6e 70 75 74 2c 20 72 65 67 52 65 63 6f 72  nInput, regRecor
14420 64 29 3b 0a 0a 20 20 2f 2a 20 41 6e 20 69 6e 70  d);..  /* An inp
14430 75 74 20 72 6f 77 20 68 61 73 20 6a 75 73 74 20  ut row has just 
14440 62 65 65 6e 20 72 65 61 64 20 69 6e 74 6f 20 61  been read into a
14450 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73  n array of regis
14460 74 65 72 73 20 73 74 61 72 74 69 6e 67 0a 20 20  ters starting.  
14470 2a 2a 20 61 74 20 72 65 67 4e 65 77 2e 20 49 66  ** at regNew. If
14480 20 74 68 65 20 77 69 6e 64 6f 77 20 68 61 73 20   the window has 
14490 61 20 50 41 52 54 49 54 49 4f 4e 20 63 6c 61 75  a PARTITION clau
144a0 73 65 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20 67  se, this block g
144b0 65 6e 65 72 61 74 65 73 20 0a 20 20 2a 2a 20 56  enerates .  ** V
144c0 4d 20 63 6f 64 65 20 74 6f 20 63 68 65 63 6b 20  M code to check 
144d0 69 66 20 74 68 65 20 69 6e 70 75 74 20 72 6f 77  if the input row
144e0 20 69 73 20 74 68 65 20 73 74 61 72 74 20 6f 66   is the start of
144f0 20 61 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e   a new partition
14500 2e 0a 20 20 2a 2a 20 49 66 20 73 6f 2c 20 69 74  ..  ** If so, it
14510 20 64 6f 65 73 20 61 6e 20 4f 50 5f 47 6f 73 75   does an OP_Gosu
14520 62 20 74 6f 20 61 6e 20 61 64 64 72 65 73 73 20  b to an address 
14530 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 69 6e 20  to be filled in 
14540 6c 61 74 65 72 2e 20 54 68 65 0a 20 20 2a 2a 20  later. The.  ** 
14550 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f  address of the O
14560 50 5f 47 6f 73 75 62 20 69 73 20 73 74 6f 72 65  P_Gosub is store
14570 64 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61  d in local varia
14580 62 6c 65 20 61 64 64 72 47 6f 73 75 62 46 6c 75  ble addrGosubFlu
14590 73 68 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57  sh. */.  if( pMW
145a0 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 29  in->pPartition )
145b0 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a  {.    int addr;.
145c0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 50      ExprList *pP
145d0 61 72 74 20 3d 20 70 4d 57 69 6e 2d 3e 70 50 61  art = pMWin->pPa
145e0 72 74 69 74 69 6f 6e 3b 0a 20 20 20 20 69 6e 74  rtition;.    int
145f0 20 6e 50 61 72 74 20 3d 20 70 50 61 72 74 2d 3e   nPart = pPart->
14600 6e 45 78 70 72 3b 0a 20 20 20 20 69 6e 74 20 72  nExpr;.    int r
14610 65 67 4e 65 77 50 61 72 74 20 3d 20 72 65 67 4e  egNewPart = regN
14620 65 77 20 2b 20 70 4d 57 69 6e 2d 3e 6e 42 75 66  ew + pMWin->nBuf
14630 66 65 72 43 6f 6c 3b 0a 20 20 20 20 4b 65 79 49  ferCol;.    KeyI
14640 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
14650 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72  sqlite3KeyInfoFr
14660 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
14670 65 2c 20 70 50 61 72 74 2c 20 30 2c 20 30 29 3b  e, pPart, 0, 0);
14680 0a 0a 20 20 20 20 72 65 67 46 6c 75 73 68 50 61  ..    regFlushPa
14690 72 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rt = ++pParse->n
146a0 4d 65 6d 3b 0a 20 20 20 20 61 64 64 72 20 3d 20  Mem;.    addr = 
146b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
146c0 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  3(v, OP_Compare,
146d0 20 72 65 67 4e 65 77 50 61 72 74 2c 20 70 4d 57   regNewPart, pMW
146e0 69 6e 2d 3e 72 65 67 50 61 72 74 2c 20 6e 50 61  in->regPart, nPa
146f0 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rt);.    sqlite3
14700 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20  VdbeAppendP4(v, 
14710 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2c  (void*)pKeyInfo,
14720 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
14730 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14740 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
14750 61 64 64 72 2b 32 2c 20 61 64 64 72 2b 34 2c 20  addr+2, addr+4, 
14760 61 64 64 72 2b 32 29 3b 0a 20 20 20 20 56 64 62  addr+2);.    Vdb
14770 65 43 6f 76 65 72 61 67 65 45 71 4e 65 28 76 29  eCoverageEqNe(v)
14780 3b 0a 20 20 20 20 61 64 64 72 47 6f 73 75 62 46  ;.    addrGosubF
14790 6c 75 73 68 20 3d 20 73 71 6c 69 74 65 33 56 64  lush = sqlite3Vd
147a0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 47  beAddOp1(v, OP_G
147b0 6f 73 75 62 2c 20 72 65 67 46 6c 75 73 68 50 61  osub, regFlushPa
147c0 72 74 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  rt);.    VdbeCom
147d0 6d 65 6e 74 28 28 76 2c 20 22 63 61 6c 6c 20 66  ment((v, "call f
147e0 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 29  lush_partition")
147f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
14800 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
14810 6f 70 79 2c 20 72 65 67 4e 65 77 50 61 72 74 2c  opy, regNewPart,
14820 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c   pMWin->regPart,
14830 20 6e 50 61 72 74 2d 31 29 3b 0a 20 20 7d 0a 0a   nPart-1);.  }..
14840 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20    /* Insert the 
14850 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20 74 68 65  new row into the
14860 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
14870 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
14880 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
14890 77 52 6f 77 69 64 2c 20 63 73 72 57 72 69 74 65  wRowid, csrWrite
148a0 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 73  , regRowid);.  s
148b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
148c0 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 63  (v, OP_Insert, c
148d0 73 72 57 72 69 74 65 2c 20 72 65 67 52 65 63 6f  srWrite, regReco
148e0 72 64 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  rd, regRowid);. 
148f0 20 61 64 64 72 4e 65 20 3d 20 73 71 6c 69 74 65   addrNe = sqlite
14900 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
14910 50 5f 4e 65 2c 20 70 4d 57 69 6e 2d 3e 72 65 67  P_Ne, pMWin->reg
14920 4f 6e 65 2c 20 30 2c 20 72 65 67 52 6f 77 69 64  One, 0, regRowid
14930 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67  );.  VdbeCoverag
14940 65 4e 65 76 65 72 4e 75 6c 6c 28 76 29 3b 0a 0a  eNeverNull(v);..
14950 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
14960 69 73 20 72 75 6e 20 66 6f 72 20 74 68 65 20 66  is run for the f
14970 69 72 73 74 20 72 6f 77 20 6f 66 20 65 61 63 68  irst row of each
14980 20 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 20 20   partition */.  
14990 73 2e 72 65 67 41 72 67 20 3d 20 77 69 6e 64 6f  s.regArg = windo
149a0 77 49 6e 69 74 41 63 63 75 6d 28 70 50 61 72 73  wInitAccum(pPars
149b0 65 2c 20 70 4d 57 69 6e 29 3b 0a 0a 20 20 69 66  e, pMWin);..  if
149c0 28 20 72 65 67 53 74 61 72 74 20 29 7b 0a 20 20  ( regStart ){.  
149d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
149e0 65 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2d  e(pParse, pMWin-
149f0 3e 70 53 74 61 72 74 2c 20 72 65 67 53 74 61 72  >pStart, regStar
14a00 74 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43 68  t);.    windowCh
14a10 65 63 6b 56 61 6c 75 65 28 70 50 61 72 73 65 2c  eckValue(pParse,
14a20 20 72 65 67 53 74 61 72 74 2c 20 30 20 2b 20 28   regStart, 0 + (
14a30 70 4d 57 69 6e 2d 3e 65 46 72 6d 54 79 70 65 3d  pMWin->eFrmType=
14a40 3d 54 4b 5f 52 41 4e 47 45 20 3f 20 33 20 3a 20  =TK_RANGE ? 3 : 
14a50 30 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  0));.  }.  if( r
14a60 65 67 45 6e 64 20 29 7b 0a 20 20 20 20 73 71 6c  egEnd ){.    sql
14a70 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
14a80 72 73 65 2c 20 70 4d 57 69 6e 2d 3e 70 45 6e 64  rse, pMWin->pEnd
14a90 2c 20 72 65 67 45 6e 64 29 3b 0a 20 20 20 20 77  , regEnd);.    w
14aa0 69 6e 64 6f 77 43 68 65 63 6b 56 61 6c 75 65 28  indowCheckValue(
14ab0 70 50 61 72 73 65 2c 20 72 65 67 45 6e 64 2c 20  pParse, regEnd, 
14ac0 31 20 2b 20 28 70 4d 57 69 6e 2d 3e 65 46 72 6d  1 + (pMWin->eFrm
14ad0 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 3f  Type==TK_RANGE ?
14ae0 20 33 20 3a 20 30 29 29 3b 0a 20 20 7d 0a 0a 20   3 : 0));.  }.. 
14af0 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61   if( pMWin->eSta
14b00 72 74 3d 3d 70 4d 57 69 6e 2d 3e 65 45 6e 64 20  rt==pMWin->eEnd 
14b10 26 26 20 72 65 67 53 74 61 72 74 20 29 7b 0a 20  && regStart ){. 
14b20 20 20 20 69 6e 74 20 6f 70 20 3d 20 28 28 70 4d     int op = ((pM
14b30 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
14b40 46 4f 4c 4c 4f 57 49 4e 47 29 20 3f 20 4f 50 5f  FOLLOWING) ? OP_
14b50 47 65 20 3a 20 4f 50 5f 4c 65 29 3b 0a 20 20 20  Ge : OP_Le);.   
14b60 20 69 6e 74 20 61 64 64 72 47 65 20 3d 20 73 71   int addrGe = sq
14b70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
14b80 76 2c 20 6f 70 2c 20 72 65 67 53 74 61 72 74 2c  v, op, regStart,
14b90 20 30 2c 20 72 65 67 45 6e 64 29 3b 0a 20 20 20   0, regEnd);.   
14ba0 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76   VdbeCoverageNev
14bb0 65 72 4e 75 6c 6c 49 66 28 76 2c 20 6f 70 3d 3d  erNullIf(v, op==
14bc0 4f 50 5f 47 65 29 3b 20 2f 2a 20 4e 65 76 65 72  OP_Ge); /* Never
14bd0 4e 75 6c 6c 20 62 65 63 61 75 73 65 20 62 6f 75  Null because bou
14be0 6e 64 20 3c 65 78 70 72 3e 20 2a 2f 0a 20 20 20  nd <expr> */.   
14bf0 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76   VdbeCoverageNev
14c00 65 72 4e 75 6c 6c 49 66 28 76 2c 20 6f 70 3d 3d  erNullIf(v, op==
14c10 4f 50 5f 4c 65 29 3b 20 2f 2a 20 20 20 76 61 6c  OP_Le); /*   val
14c20 75 65 73 20 70 72 65 76 69 6f 75 73 6c 79 20 63  ues previously c
14c30 68 65 63 6b 65 64 20 2a 2f 0a 20 20 20 20 77 69  hecked */.    wi
14c40 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 26 73 2c  ndowAggFinal(&s,
14c50 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
14c60 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14c70 5f 52 65 77 69 6e 64 2c 20 73 2e 63 75 72 72 65  _Rewind, s.curre
14c80 6e 74 2e 63 73 72 2c 20 31 29 3b 0a 20 20 20 20  nt.csr, 1);.    
14c90 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65  VdbeCoverageNeve
14ca0 72 54 61 6b 65 6e 28 76 29 3b 0a 20 20 20 20 77  rTaken(v);.    w
14cb0 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52 6f  indowReturnOneRo
14cc0 77 28 26 73 29 3b 0a 20 20 20 20 73 71 6c 69 74  w(&s);.    sqlit
14cd0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
14ce0 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20  OP_ResetSorter, 
14cf0 73 2e 63 75 72 72 65 6e 74 2e 63 73 72 29 3b 0a  s.current.csr);.
14d00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14d10 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
14d20 2c 20 30 2c 20 6c 62 6c 57 68 65 72 65 45 6e 64  , 0, lblWhereEnd
14d30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
14d40 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
14d50 64 72 47 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  drGe);.  }.  if(
14d60 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d   pMWin->eStart==
14d70 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 26 26 20  TK_FOLLOWING && 
14d80 70 4d 57 69 6e 2d 3e 65 46 72 6d 54 79 70 65 21  pMWin->eFrmType!
14d90 3d 54 4b 5f 52 41 4e 47 45 20 26 26 20 72 65 67  =TK_RANGE && reg
14da0 45 6e 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72  End ){.    asser
14db0 74 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  t( pMWin->eEnd==
14dc0 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 3b 0a  TK_FOLLOWING );.
14dd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14de0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74  ddOp3(v, OP_Subt
14df0 72 61 63 74 2c 20 72 65 67 53 74 61 72 74 2c 20  ract, regStart, 
14e00 72 65 67 45 6e 64 2c 20 72 65 67 53 74 61 72 74  regEnd, regStart
14e10 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4d  );.  }..  if( pM
14e20 57 69 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b 5f  Win->eStart!=TK_
14e30 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20  UNBOUNDED ){.   
14e40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14e50 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
14e60 20 73 2e 73 74 61 72 74 2e 63 73 72 2c 20 31 29   s.start.csr, 1)
14e70 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
14e80 67 65 4e 65 76 65 72 54 61 6b 65 6e 28 76 29 3b  geNeverTaken(v);
14e90 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
14ea0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
14eb0 65 77 69 6e 64 2c 20 73 2e 63 75 72 72 65 6e 74  ewind, s.current
14ec0 2e 63 73 72 2c 20 31 29 3b 0a 20 20 56 64 62 65  .csr, 1);.  Vdbe
14ed0 43 6f 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b  CoverageNeverTak
14ee0 65 6e 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  en(v);.  sqlite3
14ef0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14f00 5f 52 65 77 69 6e 64 2c 20 73 2e 65 6e 64 2e 63  _Rewind, s.end.c
14f10 73 72 2c 20 31 29 3b 0a 20 20 56 64 62 65 43 6f  sr, 1);.  VdbeCo
14f20 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b 65 6e  verageNeverTaken
14f30 28 76 29 3b 0a 20 20 69 66 28 20 72 65 67 50 65  (v);.  if( regPe
14f40 65 72 20 26 26 20 70 4f 72 64 65 72 42 79 20 29  er && pOrderBy )
14f50 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
14f60 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
14f70 70 79 2c 20 72 65 67 4e 65 77 50 65 65 72 2c 20  py, regNewPeer, 
14f80 72 65 67 50 65 65 72 2c 20 70 4f 72 64 65 72 42  regPeer, pOrderB
14f90 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20  y->nExpr-1);.   
14fa0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14fb0 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p3(v, OP_Copy, r
14fc0 65 67 50 65 65 72 2c 20 73 2e 73 74 61 72 74 2e  egPeer, s.start.
14fd0 72 65 67 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  reg, pOrderBy->n
14fe0 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 73 71 6c  Expr-1);.    sql
14ff0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
15000 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 50 65  , OP_Copy, regPe
15010 65 72 2c 20 73 2e 63 75 72 72 65 6e 74 2e 72 65  er, s.current.re
15020 67 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  g, pOrderBy->nEx
15030 70 72 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  pr-1);.    sqlit
15040 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
15050 4f 50 5f 43 6f 70 79 2c 20 72 65 67 50 65 65 72  OP_Copy, regPeer
15060 2c 20 73 2e 65 6e 64 2e 72 65 67 2c 20 70 4f 72  , s.end.reg, pOr
15070 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b  derBy->nExpr-1);
15080 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56  .  }..  sqlite3V
15090 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
150a0 47 6f 74 6f 2c 20 30 2c 20 6c 62 6c 57 68 65 72  Goto, 0, lblWher
150b0 65 45 6e 64 29 3b 0a 0a 20 20 73 71 6c 69 74 65  eEnd);..  sqlite
150c0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
150d0 20 61 64 64 72 4e 65 29 3b 0a 20 20 69 66 28 20   addrNe);.  if( 
150e0 72 65 67 50 65 65 72 20 29 7b 0a 20 20 20 20 77  regPeer ){.    w
150f0 69 6e 64 6f 77 49 66 4e 65 77 50 65 65 72 28 70  indowIfNewPeer(p
15100 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
15110 20 72 65 67 4e 65 77 50 65 65 72 2c 20 72 65 67   regNewPeer, reg
15120 50 65 65 72 2c 20 6c 62 6c 57 68 65 72 65 45 6e  Peer, lblWhereEn
15130 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d  d);.  }.  if( pM
15140 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
15150 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20  FOLLOWING ){.   
15160 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73   windowCodeOp(&s
15170 2c 20 57 49 4e 44 4f 57 5f 41 47 47 53 54 45 50  , WINDOW_AGGSTEP
15180 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
15190 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 21 3d 54 4b   pMWin->eEnd!=TK
151a0 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20  _UNBOUNDED ){.  
151b0 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65      if( pMWin->e
151c0 46 72 6d 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47  FrmType==TK_RANG
151d0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  E ){.        int
151e0 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33 56 64   lbl = sqlite3Vd
151f0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
15200 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  se);.        int
15210 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69   addrNext = sqli
15220 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
15230 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 77  dr(v);.        w
15240 69 6e 64 6f 77 43 6f 64 65 52 61 6e 67 65 54 65  indowCodeRangeTe
15250 73 74 28 26 73 2c 20 4f 50 5f 47 65 2c 20 73 2e  st(&s, OP_Ge, s.
15260 63 75 72 72 65 6e 74 2e 63 73 72 2c 20 72 65 67  current.csr, reg
15270 45 6e 64 2c 20 73 2e 65 6e 64 2e 63 73 72 2c 20  End, s.end.csr, 
15280 6c 62 6c 29 3b 0a 20 20 20 20 20 20 20 20 77 69  lbl);.        wi
15290 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57  ndowCodeOp(&s, W
152a0 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45  INDOW_AGGINVERSE
152b0 2c 20 72 65 67 53 74 61 72 74 2c 20 30 29 3b 0a  , regStart, 0);.
152c0 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f          windowCo
152d0 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f  deOp(&s, WINDOW_
152e0 52 45 54 55 52 4e 5f 52 4f 57 2c 20 30 2c 20 30  RETURN_ROW, 0, 0
152f0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
15300 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15310 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
15320 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 73  Next);.        s
15330 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
15340 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a  eLabel(v, lbl);.
15350 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15360 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f       windowCodeO
15370 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54  p(&s, WINDOW_RET
15380 55 52 4e 5f 52 4f 57 2c 20 72 65 67 45 6e 64 2c  URN_ROW, regEnd,
15390 20 30 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e   0);.        win
153a0 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49  dowCodeOp(&s, WI
153b0 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 2c  NDOW_AGGINVERSE,
153c0 20 72 65 67 53 74 61 72 74 2c 20 30 29 3b 0a 20   regStart, 0);. 
153d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
153e0 65 6c 73 65 0a 20 20 69 66 28 20 70 4d 57 69 6e  else.  if( pMWin
153f0 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45  ->eEnd==TK_PRECE
15400 44 49 4e 47 20 29 7b 0a 20 20 20 20 77 69 6e 64  DING ){.    wind
15410 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e  owCodeOp(&s, WIN
15420 44 4f 57 5f 41 47 47 53 54 45 50 2c 20 72 65 67  DOW_AGGSTEP, reg
15430 45 6e 64 2c 20 30 29 3b 0a 20 20 20 20 77 69 6e  End, 0);.    win
15440 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49  dowCodeOp(&s, WI
15450 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c  NDOW_RETURN_ROW,
15460 20 30 2c 20 30 29 3b 0a 20 20 20 20 77 69 6e 64   0, 0);.    wind
15470 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e  owCodeOp(&s, WIN
15480 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 2c 20  DOW_AGGINVERSE, 
15490 72 65 67 53 74 61 72 74 2c 20 30 29 3b 0a 20 20  regStart, 0);.  
154a0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 61  }else{.    int a
154b0 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 77 69 6e  ddr = 0;.    win
154c0 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49  dowCodeOp(&s, WI
154d0 4e 44 4f 57 5f 41 47 47 53 54 45 50 2c 20 30 2c  NDOW_AGGSTEP, 0,
154e0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 57   0);.    if( pMW
154f0 69 6e 2d 3e 65 45 6e 64 21 3d 54 4b 5f 55 4e 42  in->eEnd!=TK_UNB
15500 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20 20 20 20  OUNDED ){.      
15510 69 66 28 20 70 4d 57 69 6e 2d 3e 65 46 72 6d 54  if( pMWin->eFrmT
15520 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 29 7b  ype==TK_RANGE ){
15530 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 62 6c  .        int lbl
15540 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61 64   = 0;.        ad
15550 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
15560 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
15570 20 20 20 20 20 20 20 20 69 66 28 20 72 65 67 45          if( regE
15580 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nd ){.          
15590 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  lbl = sqlite3Vdb
155a0 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
155b0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 77 69  e);.          wi
155c0 6e 64 6f 77 43 6f 64 65 52 61 6e 67 65 54 65 73  ndowCodeRangeTes
155d0 74 28 26 73 2c 20 4f 50 5f 47 65 2c 20 73 2e 63  t(&s, OP_Ge, s.c
155e0 75 72 72 65 6e 74 2e 63 73 72 2c 20 72 65 67 45  urrent.csr, regE
155f0 6e 64 2c 20 73 2e 65 6e 64 2e 63 73 72 2c 20 6c  nd, s.end.csr, l
15600 62 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  bl);.        }. 
15610 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64         windowCod
15620 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52  eOp(&s, WINDOW_R
15630 45 54 55 52 4e 5f 52 4f 57 2c 20 30 2c 20 30 29  ETURN_ROW, 0, 0)
15640 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77  ;.        window
15650 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f  CodeOp(&s, WINDO
15660 57 5f 41 47 47 49 4e 56 45 52 53 45 2c 20 72 65  W_AGGINVERSE, re
15670 67 53 74 61 72 74 2c 20 30 29 3b 0a 20 20 20 20  gStart, 0);.    
15680 20 20 20 20 69 66 28 20 72 65 67 45 6e 64 20 29      if( regEnd )
15690 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
156a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
156b0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
156c0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  r);.          sq
156d0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
156e0 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20  Label(v, lbl);. 
156f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
15700 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
15710 28 20 72 65 67 45 6e 64 20 29 7b 0a 20 20 20 20  ( regEnd ){.    
15720 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
15730 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
15740 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 72 65 67 45  , OP_IfPos, regE
15750 6e 64 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 20  nd, 0, 1);.     
15760 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
15770 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  e(v);.        }.
15780 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f          windowCo
15790 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f  deOp(&s, WINDOW_
157a0 52 45 54 55 52 4e 5f 52 4f 57 2c 20 30 2c 20 30  RETURN_ROW, 0, 0
157b0 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f  );.        windo
157c0 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44  wCodeOp(&s, WIND
157d0 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 2c 20 72  OW_AGGINVERSE, r
157e0 65 67 53 74 61 72 74 2c 20 30 29 3b 0a 20 20 20  egStart, 0);.   
157f0 20 20 20 20 20 69 66 28 20 72 65 67 45 6e 64 20       if( regEnd 
15800 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
15810 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
15820 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15830 7d 0a 0a 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74  }..  /* End of t
15840 68 65 20 6d 61 69 6e 20 69 6e 70 75 74 20 6c 6f  he main input lo
15850 6f 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  op */.  sqlite3V
15860 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
15870 76 2c 20 6c 62 6c 57 68 65 72 65 45 6e 64 29 3b  v, lblWhereEnd);
15880 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  .  sqlite3WhereE
15890 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a 20 20 2f  nd(pWInfo);..  /
158a0 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a  * Fall through *
158b0 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70  /.  if( pMWin->p
158c0 50 61 72 74 69 74 69 6f 6e 20 29 7b 0a 20 20 20  Partition ){.   
158d0 20 61 64 64 72 49 6e 74 65 67 65 72 20 3d 20 73   addrInteger = s
158e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
158f0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
15900 30 2c 20 72 65 67 46 6c 75 73 68 50 61 72 74 29  0, regFlushPart)
15910 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
15920 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
15930 72 47 6f 73 75 62 46 6c 75 73 68 29 3b 0a 20 20  rGosubFlush);.  
15940 7d 0a 0a 20 20 61 64 64 72 45 6d 70 74 79 20 3d  }..  addrEmpty =
15950 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15960 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p1(v, OP_Rewind,
15970 20 63 73 72 57 72 69 74 65 29 3b 0a 20 20 56 64   csrWrite);.  Vd
15980 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
15990 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64   if( pMWin->eEnd
159a0 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 29  ==TK_PRECEDING )
159b0 7b 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65  {.    windowCode
159c0 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47  Op(&s, WINDOW_AG
159d0 47 53 54 45 50 2c 20 72 65 67 45 6e 64 2c 20 30  GSTEP, regEnd, 0
159e0 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f 64  );.    windowCod
159f0 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52  eOp(&s, WINDOW_R
15a00 45 54 55 52 4e 5f 52 4f 57 2c 20 30 2c 20 30 29  ETURN_ROW, 0, 0)
15a10 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d  ;.  }else if( pM
15a20 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
15a30 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20  FOLLOWING ){.   
15a40 20 69 6e 74 20 61 64 64 72 53 74 61 72 74 3b 0a   int addrStart;.
15a50 20 20 20 20 69 6e 74 20 61 64 64 72 42 72 65 61      int addrBrea
15a60 6b 31 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72  k1;.    int addr
15a70 42 72 65 61 6b 32 3b 0a 20 20 20 20 69 6e 74 20  Break2;.    int 
15a80 61 64 64 72 42 72 65 61 6b 33 3b 0a 20 20 20 20  addrBreak3;.    
15a90 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c  windowCodeOp(&s,
15aa0 20 57 49 4e 44 4f 57 5f 41 47 47 53 54 45 50 2c   WINDOW_AGGSTEP,
15ab0 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
15ac0 70 4d 57 69 6e 2d 3e 65 46 72 6d 54 79 70 65 3d  pMWin->eFrmType=
15ad0 3d 54 4b 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20  =TK_RANGE ){.   
15ae0 20 20 20 61 64 64 72 53 74 61 72 74 20 3d 20 73     addrStart = s
15af0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
15b00 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
15b10 61 64 64 72 42 72 65 61 6b 32 20 3d 20 77 69 6e  addrBreak2 = win
15b20 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49  dowCodeOp(&s, WI
15b30 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 2c  NDOW_AGGINVERSE,
15b40 20 72 65 67 53 74 61 72 74 2c 20 31 29 3b 0a 20   regStart, 1);. 
15b50 20 20 20 20 20 61 64 64 72 42 72 65 61 6b 31 20       addrBreak1 
15b60 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26  = windowCodeOp(&
15b70 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e  s, WINDOW_RETURN
15b80 5f 52 4f 57 2c 20 30 2c 20 31 29 3b 0a 20 20 20  _ROW, 0, 1);.   
15b90 20 7d 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70   }else.    if( p
15ba0 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55  MWin->eEnd==TK_U
15bb0 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20 20  NBOUNDED ){.    
15bc0 20 20 61 64 64 72 53 74 61 72 74 20 3d 20 73 71    addrStart = sq
15bd0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
15be0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 61  Addr(v);.      a
15bf0 64 64 72 42 72 65 61 6b 31 20 3d 20 77 69 6e 64  ddrBreak1 = wind
15c00 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e  owCodeOp(&s, WIN
15c10 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20  DOW_RETURN_ROW, 
15c20 72 65 67 53 74 61 72 74 2c 20 31 29 3b 0a 20 20  regStart, 1);.  
15c30 20 20 20 20 61 64 64 72 42 72 65 61 6b 32 20 3d      addrBreak2 =
15c40 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73   windowCodeOp(&s
15c50 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45  , WINDOW_AGGINVE
15c60 52 53 45 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20  RSE, 0, 1);.    
15c70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
15c80 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64  ert( pMWin->eEnd
15c90 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29  ==TK_FOLLOWING )
15ca0 3b 0a 20 20 20 20 20 20 61 64 64 72 53 74 61 72  ;.      addrStar
15cb0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
15cc0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
15cd0 20 20 20 20 20 61 64 64 72 42 72 65 61 6b 31 20       addrBreak1 
15ce0 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26  = windowCodeOp(&
15cf0 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e  s, WINDOW_RETURN
15d00 5f 52 4f 57 2c 20 72 65 67 45 6e 64 2c 20 31 29  _ROW, regEnd, 1)
15d10 3b 0a 20 20 20 20 20 20 61 64 64 72 42 72 65 61  ;.      addrBrea
15d20 6b 32 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f  k2 = windowCodeO
15d30 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47  p(&s, WINDOW_AGG
15d40 49 4e 56 45 52 53 45 2c 20 72 65 67 53 74 61 72  INVERSE, regStar
15d50 74 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  t, 1);.    }.   
15d60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15d70 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
15d80 2c 20 61 64 64 72 53 74 61 72 74 29 3b 0a 20 20  , addrStart);.  
15d90 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
15da0 70 48 65 72 65 28 76 2c 20 61 64 64 72 42 72 65  pHere(v, addrBre
15db0 61 6b 32 29 3b 0a 20 20 20 20 61 64 64 72 53 74  ak2);.    addrSt
15dc0 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
15dd0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
15de0 0a 20 20 20 20 61 64 64 72 42 72 65 61 6b 33 20  .    addrBreak3 
15df0 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26  = windowCodeOp(&
15e00 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e  s, WINDOW_RETURN
15e10 5f 52 4f 57 2c 20 30 2c 20 31 29 3b 0a 20 20 20  _ROW, 0, 1);.   
15e20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15e30 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
15e40 2c 20 61 64 64 72 53 74 61 72 74 29 3b 0a 20 20  , addrStart);.  
15e50 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
15e60 70 48 65 72 65 28 76 2c 20 61 64 64 72 42 72 65  pHere(v, addrBre
15e70 61 6b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ak1);.    sqlite
15e80 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
15e90 20 61 64 64 72 42 72 65 61 6b 33 29 3b 0a 20 20   addrBreak3);.  
15ea0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 61  }else{.    int a
15eb0 64 64 72 42 72 65 61 6b 3b 0a 20 20 20 20 69 6e  ddrBreak;.    in
15ec0 74 20 61 64 64 72 53 74 61 72 74 3b 0a 20 20 20  t addrStart;.   
15ed0 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73   windowCodeOp(&s
15ee0 2c 20 57 49 4e 44 4f 57 5f 41 47 47 53 54 45 50  , WINDOW_AGGSTEP
15ef0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 61 64 64  , 0, 0);.    add
15f00 72 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  rStart = sqlite3
15f10 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
15f20 76 29 3b 0a 20 20 20 20 61 64 64 72 42 72 65 61  v);.    addrBrea
15f30 6b 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70  k = windowCodeOp
15f40 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55  (&s, WINDOW_RETU
15f50 52 4e 5f 52 4f 57 2c 20 30 2c 20 31 29 3b 0a 20  RN_ROW, 0, 1);. 
15f60 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28     windowCodeOp(
15f70 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e  &s, WINDOW_AGGIN
15f80 56 45 52 53 45 2c 20 72 65 67 53 74 61 72 74 2c  VERSE, regStart,
15f90 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
15fa0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15fb0 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 53 74  _Goto, 0, addrSt
15fc0 61 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  art);.    sqlite
15fd0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
15fe0 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 7d   addrBreak);.  }
15ff0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
16000 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 45 6d  mpHere(v, addrEm
16010 70 74 79 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  pty);..  sqlite3
16020 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
16030 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20 73 2e  _ResetSorter, s.
16040 63 75 72 72 65 6e 74 2e 63 73 72 29 3b 0a 20 20  current.csr);.  
16050 69 66 28 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74  if( pMWin->pPart
16060 69 74 69 6f 6e 20 29 7b 0a 20 20 20 20 69 66 28  ition ){.    if(
16070 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72 74   pMWin->regStart
16080 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 73  Rowid ){.      s
16090 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
160a0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
160b0 31 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61  1, pMWin->regSta
160c0 72 74 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  rtRowid);.      
160d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
160e0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
160f0 20 30 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 45 6e   0, pMWin->regEn
16100 64 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 20  dRowid);.    }. 
16110 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
16120 61 6e 67 65 50 31 28 76 2c 20 61 64 64 72 49 6e  angeP1(v, addrIn
16130 74 65 67 65 72 2c 20 73 71 6c 69 74 65 33 56 64  teger, sqlite3Vd
16140 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
16150 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
16160 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
16170 65 74 75 72 6e 2c 20 72 65 67 46 6c 75 73 68 50  eturn, regFlushP
16180 61 72 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 65 6e  art);.  }.}..#en
16190 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
161a0 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f  IT_WINDOWFUNC */
161b0 0a                                               .