/ Hex Artifact Content
Login

Artifact bd1e1c2674546d0a61c04895352b2651756136757c2c399bd11b6cc609416e0d:


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 29  ITE_AFF_NUMERIC)
a7a0: 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
a7b0: 67 65 28 76 29 3b 0a 20 20 20 20 61 73 73 65 72  ge(v);.    asser
a7c0: 74 28 20 65 43 6f 6e 64 3d 3d 33 20 7c 7c 20 65  t( eCond==3 || e
a7d0: 43 6f 6e 64 3d 3d 34 20 29 3b 0a 20 20 20 20 56  Cond==4 );.    V
a7e0: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
a7f0: 20 65 43 6f 6e 64 3d 3d 33 29 3b 0a 20 20 20 20   eCond==3);.    
a800: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
a810: 2c 20 65 43 6f 6e 64 3d 3d 34 29 3b 0a 20 20 7d  , eCond==4);.  }
a820: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
a830: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a840: 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 65 67  P_MustBeInt, reg
a850: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
a860: 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a  rentAddr(v)+2);.
a870: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
a880: 28 76 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  (v);.    assert(
a890: 20 65 43 6f 6e 64 3d 3d 30 20 7c 7c 20 65 43 6f   eCond==0 || eCo
a8a0: 6e 64 3d 3d 31 20 7c 7c 20 65 43 6f 6e 64 3d 3d  nd==1 || eCond==
a8b0: 32 20 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  2 );.    VdbeCov
a8c0: 65 72 61 67 65 49 66 28 76 2c 20 65 43 6f 6e 64  erageIf(v, eCond
a8d0: 3d 3d 30 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  ==0);.    VdbeCo
a8e0: 76 65 72 61 67 65 49 66 28 76 2c 20 65 43 6f 6e  verageIf(v, eCon
a8f0: 64 3d 3d 31 29 3b 0a 20 20 20 20 56 64 62 65 43  d==1);.    VdbeC
a900: 6f 76 65 72 61 67 65 49 66 28 76 2c 20 65 43 6f  overageIf(v, eCo
a910: 6e 64 3d 3d 32 29 3b 0a 20 20 7d 0a 20 20 73 71  nd==2);.  }.  sq
a920: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
a930: 76 2c 20 61 4f 70 5b 65 43 6f 6e 64 5d 2c 20 72  v, aOp[eCond], r
a940: 65 67 5a 65 72 6f 2c 20 73 71 6c 69 74 65 33 56  egZero, sqlite3V
a950: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
a960: 29 2b 32 2c 20 72 65 67 29 3b 0a 20 20 56 64 62  )+2, reg);.  Vdb
a970: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 65  eCoverageIf(v, e
a980: 43 6f 6e 64 3d 3d 30 29 3b 0a 20 20 56 64 62 65  Cond==0);.  Vdbe
a990: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 65 43  CoverageIf(v, eC
a9a0: 6f 6e 64 3d 3d 31 29 3b 0a 20 20 56 64 62 65 43  ond==1);.  VdbeC
a9b0: 6f 76 65 72 61 67 65 49 66 28 76 2c 20 65 43 6f  overageIf(v, eCo
a9c0: 6e 64 3d 3d 32 29 3b 0a 20 20 56 64 62 65 43 6f  nd==2);.  VdbeCo
a9d0: 76 65 72 61 67 65 49 66 28 76 2c 20 65 43 6f 6e  verageIf(v, eCon
a9e0: 64 3d 3d 33 29 3b 0a 20 20 56 64 62 65 43 6f 76  d==3);.  VdbeCov
a9f0: 65 72 61 67 65 49 66 28 76 2c 20 65 43 6f 6e 64  erageIf(v, eCond
aa00: 3d 3d 34 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d  ==4);.  sqlite3M
aa10: 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b  ayAbort(pParse);
aa20: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
aa30: 64 4f 70 32 28 76 2c 20 4f 50 5f 48 61 6c 74 2c  dOp2(v, OP_Halt,
aa40: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 4f   SQLITE_ERROR, O
aa50: 45 5f 41 62 6f 72 74 29 3b 0a 20 20 73 71 6c 69  E_Abort);.  sqli
aa60: 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
aa70: 76 2c 20 28 76 6f 69 64 2a 29 61 7a 45 72 72 5b  v, (void*)azErr[
aa80: 65 43 6f 6e 64 5d 2c 20 50 34 5f 53 54 41 54 49  eCond], P4_STATI
aa90: 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  C);.  sqlite3Rel
aaa0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
aab0: 73 65 2c 20 72 65 67 5a 65 72 6f 29 3b 0a 7d 0a  se, regZero);.}.
aac0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
aad0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  e number of argu
aae0: 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20  ments passed to 
aaf0: 74 68 65 20 77 69 6e 64 6f 77 2d 66 75 6e 63 74  the window-funct
ab00: 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  ion associated.*
ab10: 2a 20 77 69 74 68 20 74 68 65 20 6f 62 6a 65 63  * with the objec
ab20: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
ab30: 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 74 6f  only argument to
ab40: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
ab50: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
ab60: 6e 64 6f 77 41 72 67 43 6f 75 6e 74 28 57 69 6e  ndowArgCount(Win
ab70: 64 6f 77 20 2a 70 57 69 6e 29 7b 0a 20 20 45 78  dow *pWin){.  Ex
ab80: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
ab90: 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e  pWin->pOwner->x.
aba0: 70 4c 69 73 74 3b 0a 20 20 72 65 74 75 72 6e 20  pList;.  return 
abb0: 28 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e  (pList ? pList->
abc0: 6e 45 78 70 72 20 3a 20 30 29 3b 0a 7d 0a 0a 2f  nExpr : 0);.}../
abd0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 4d  *.** Generate VM
abe0: 20 63 6f 64 65 20 74 6f 20 69 6e 76 6f 6b 65 20   code to invoke 
abf0: 65 69 74 68 65 72 20 78 53 74 65 70 28 29 20 28  either xStep() (
ac00: 69 66 20 62 49 6e 76 65 72 73 65 20 69 73 20 30  if bInverse is 0
ac10: 29 20 6f 72 20 0a 2a 2a 20 78 49 6e 76 65 72 73  ) or .** xInvers
ac20: 65 20 28 69 66 20 62 49 6e 76 65 72 73 65 20 69  e (if bInverse i
ac30: 73 20 6e 6f 6e 2d 7a 65 72 6f 29 20 66 6f 72 20  s non-zero) for 
ac40: 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63  each window func
ac50: 74 69 6f 6e 20 69 6e 20 74 68 65 20 0a 2a 2a 20  tion in the .** 
ac60: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72  linked list star
ac70: 74 69 6e 67 20 61 74 20 70 4d 57 69 6e 2e 20 4f  ting at pMWin. O
ac80: 72 2c 20 66 6f 72 20 62 75 69 6c 74 2d 69 6e 20  r, for built-in 
ac90: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73  window functions
aca0: 0a 2a 2a 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  .** that do not 
acb0: 75 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64  use the standard
acc0: 20 66 75 6e 63 74 69 6f 6e 20 41 50 49 2c 20 67   function API, g
acd0: 65 6e 65 72 61 74 65 20 74 68 65 20 72 65 71 75  enerate the requ
ace0: 69 72 65 64 0a 2a 2a 20 69 6e 6c 69 6e 65 20 56  ired.** inline V
acf0: 4d 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  M code..**.** If
ad00: 20 61 72 67 75 6d 65 6e 74 20 63 73 72 20 69 73   argument csr is
ad10: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
ad20: 20 65 71 75 61 6c 20 74 6f 20 30 2c 20 74 68 65   equal to 0, the
ad30: 6e 20 61 72 67 75 6d 65 6e 74 20 72 65 67 20 69  n argument reg i
ad40: 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72  s.** the first r
ad50: 65 67 69 73 74 65 72 20 69 6e 20 61 6e 20 61 72  egister in an ar
ad60: 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
ad70: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
ad80: 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67  e large.** enoug
ad90: 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 61 72  h to hold the ar
ada0: 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ray of arguments
adb0: 20 66 6f 72 20 65 61 63 68 20 66 75 6e 63 74 69   for each functi
adc0: 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  on. In this case
add0: 0a 2a 2a 20 74 68 65 20 61 72 67 75 6d 65 6e 74  .** the argument
ade0: 73 20 61 72 65 20 65 78 74 72 61 63 74 65 64 20  s are extracted 
adf0: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
ae00: 20 72 6f 77 20 6f 66 20 63 73 72 20 69 6e 74 6f   row of csr into
ae10: 20 74 68 65 0a 2a 2a 20 61 72 72 61 79 20 6f 66   the.** array of
ae20: 20 72 65 67 69 73 74 65 72 73 20 62 65 66 6f 72   registers befor
ae30: 65 20 69 6e 76 6f 6b 69 6e 67 20 4f 50 5f 41 67  e invoking OP_Ag
ae40: 67 53 74 65 70 20 6f 72 20 4f 50 5f 41 67 67 49  gStep or OP_AggI
ae50: 6e 76 65 72 73 65 0a 2a 2a 0a 2a 2a 20 4f 72 2c  nverse.**.** Or,
ae60: 20 69 66 20 63 73 72 20 69 73 20 6c 65 73 73 20   if csr is less 
ae70: 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
ae80: 74 68 65 20 61 72 72 61 79 20 6f 66 20 72 65 67  the array of reg
ae90: 69 73 74 65 72 73 20 61 74 20 72 65 67 20 69 73  isters at reg is
aea0: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 70 6f 70 75  .** already popu
aeb0: 6c 61 74 65 64 20 77 69 74 68 20 61 6c 6c 20 63  lated with all c
aec0: 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20  olumns from the 
aed0: 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74  current row of t
aee0: 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a  he sub-query..**
aef0: 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
af00: 72 65 67 50 61 72 74 53 69 7a 65 20 69 73 20 6e  regPartSize is n
af10: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74  on-zero, then it
af20: 20 69 73 20 61 20 72 65 67 69 73 74 65 72 20 63   is a register c
af30: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 0a 2a 2a  ontaining the.**
af40: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
af50: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  in the current p
af60: 61 72 74 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  artition..*/.sta
af70: 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 41  tic void windowA
af80: 67 67 53 74 65 70 28 0a 20 20 50 61 72 73 65 20  ggStep(.  Parse 
af90: 2a 70 50 61 72 73 65 2c 20 0a 20 20 57 69 6e 64  *pParse, .  Wind
afa0: 6f 77 20 2a 70 4d 57 69 6e 2c 20 20 20 20 20 20  ow *pMWin,      
afb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
afc0: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 77 69  inked list of wi
afd0: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 2a  ndow functions *
afe0: 2f 0a 20 20 69 6e 74 20 63 73 72 2c 20 20 20 20  /.  int csr,    
aff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b000: 20 20 20 20 2f 2a 20 52 65 61 64 20 61 72 67 75      /* Read argu
b010: 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 69 73 20  ments from this 
b020: 63 75 72 73 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  cursor */.  int 
b030: 62 49 6e 76 65 72 73 65 2c 20 20 20 20 20 20 20  bInverse,       
b040: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
b050: 72 75 65 20 74 6f 20 69 6e 76 6f 6b 65 20 78 49  rue to invoke xI
b060: 6e 76 65 72 73 65 20 69 6e 73 74 65 61 64 20 6f  nverse instead o
b070: 66 20 78 53 74 65 70 20 2a 2f 0a 20 20 69 6e 74  f xStep */.  int
b080: 20 72 65 67 20 20 20 20 20 20 20 20 20 20 20 20   reg            
b090: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b0a0: 41 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  Array of registe
b0b0: 72 73 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  rs */.){.  Vdbe 
b0c0: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
b0d0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 57  dbe(pParse);.  W
b0e0: 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 66  indow *pWin;.  f
b0f0: 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70  or(pWin=pMWin; p
b100: 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e  Win; pWin=pWin->
b110: 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 46  pNextWin){.    F
b120: 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20 3d 20  uncDef *pFunc = 
b130: 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20 20  pWin->pFunc;.   
b140: 20 69 6e 74 20 72 65 67 41 72 67 3b 0a 20 20 20   int regArg;.   
b150: 20 69 6e 74 20 6e 41 72 67 20 3d 20 77 69 6e 64   int nArg = wind
b160: 6f 77 41 72 67 43 6f 75 6e 74 28 70 57 69 6e 29  owArgCount(pWin)
b170: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20  ;.    int i;..  
b180: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
b190: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  g; i++){.      i
b1a0: 66 28 20 69 21 3d 31 20 7c 7c 20 70 46 75 6e 63  f( i!=1 || pFunc
b1b0: 2d 3e 7a 4e 61 6d 65 21 3d 6e 74 68 5f 76 61 6c  ->zName!=nth_val
b1c0: 75 65 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  ueName ){.      
b1d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b1e0: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
b1f0: 2c 20 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72  , csr, pWin->iAr
b200: 67 43 6f 6c 2b 69 2c 20 72 65 67 2b 69 29 3b 0a  gCol+i, reg+i);.
b210: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
b220: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b230: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
b240: 75 6d 6e 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  umn, pMWin->iEph
b250: 43 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43  Csr, pWin->iArgC
b260: 6f 6c 2b 69 2c 20 72 65 67 2b 69 29 3b 0a 20 20  ol+i, reg+i);.  
b270: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
b280: 72 65 67 41 72 67 20 3d 20 72 65 67 3b 0a 0a 20  regArg = reg;.. 
b290: 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 72 65     if( pMWin->re
b2a0: 67 53 74 61 72 74 52 6f 77 69 64 3d 3d 30 0a 20  gStartRowid==0. 
b2b0: 20 20 20 20 26 26 20 28 70 46 75 6e 63 2d 3e 66      && (pFunc->f
b2c0: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
b2d0: 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 20 0a  E_FUNC_MINMAX) .
b2e0: 20 20 20 20 20 26 26 20 28 70 57 69 6e 2d 3e 65       && (pWin->e
b2f0: 53 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e  Start!=TK_UNBOUN
b300: 44 45 44 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  DED).    ){.    
b310: 20 20 69 6e 74 20 61 64 64 72 49 73 4e 75 6c 6c    int addrIsNull
b320: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
b330: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp1(v, OP_IsNul
b340: 6c 2c 20 72 65 67 41 72 67 29 3b 0a 20 20 20 20  l, regArg);.    
b350: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
b360: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 49 6e  );.      if( bIn
b370: 76 65 72 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20  verse==0 ){.    
b380: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b390: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
b3a0: 6d 6d 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70  mm, pWin->regApp
b3b0: 2b 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  +1, 1);.        
b3c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b3d0: 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72  2(v, OP_SCopy, r
b3e0: 65 67 41 72 67 2c 20 70 57 69 6e 2d 3e 72 65 67  egArg, pWin->reg
b3f0: 41 70 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71  App);.        sq
b400: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
b410: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
b420: 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2c 20  , pWin->regApp, 
b430: 32 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b  2, pWin->regApp+
b440: 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2);.        sqli
b450: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
b460: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
b470: 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20 70 57 69  Win->csrApp, pWi
b480: 6e 2d 3e 72 65 67 41 70 70 2b 32 29 3b 0a 20 20  n->regApp+2);.  
b490: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b4a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b4b0: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 53 65  dOp4Int(v, OP_Se
b4c0: 65 6b 47 45 2c 20 70 57 69 6e 2d 3e 63 73 72 41  ekGE, pWin->csrA
b4d0: 70 70 2c 20 30 2c 20 72 65 67 41 72 67 2c 20 31  pp, 0, regArg, 1
b4e0: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
b4f0: 6f 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b 65  overageNeverTake
b500: 6e 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  n(v);.        sq
b510: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
b520: 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 70 57  v, OP_Delete, pW
b530: 69 6e 2d 3e 63 73 72 41 70 70 29 3b 0a 20 20 20  in->csrApp);.   
b540: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b550: 4a 75 6d 70 48 65 72 65 28 76 2c 20 73 71 6c 69  JumpHere(v, sqli
b560: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
b570: 64 72 28 76 29 2d 32 29 3b 0a 20 20 20 20 20 20  dr(v)-2);.      
b580: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
b590: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
b5a0: 64 64 72 49 73 4e 75 6c 6c 29 3b 0a 20 20 20 20  ddrIsNull);.    
b5b0: 7d 65 6c 73 65 20 69 66 28 20 70 57 69 6e 2d 3e  }else if( pWin->
b5c0: 72 65 67 41 70 70 20 29 7b 0a 20 20 20 20 20 20  regApp ){.      
b5d0: 61 73 73 65 72 74 28 20 70 46 75 6e 63 2d 3e 7a  assert( pFunc->z
b5e0: 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e  Name==nth_valueN
b5f0: 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ame.           |
b600: 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d  | pFunc->zName==
b610: 66 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65 0a  first_valueName.
b620: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61        );.      a
b630: 73 73 65 72 74 28 20 62 49 6e 76 65 72 73 65 3d  ssert( bInverse=
b640: 3d 30 20 7c 7c 20 62 49 6e 76 65 72 73 65 3d 3d  =0 || bInverse==
b650: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
b660: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b670: 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 57 69 6e 2d  OP_AddImm, pWin-
b680: 3e 72 65 67 41 70 70 2b 31 2d 62 49 6e 76 65 72  >regApp+1-bInver
b690: 73 65 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73  se, 1);.    }els
b6a0: 65 20 69 66 28 20 70 46 75 6e 63 2d 3e 78 53 46  e if( pFunc->xSF
b6b0: 75 6e 63 21 3d 6e 6f 6f 70 53 74 65 70 46 75 6e  unc!=noopStepFun
b6c0: 63 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  c ){.      int a
b6d0: 64 64 72 49 66 20 3d 20 30 3b 0a 20 20 20 20 20  ddrIf = 0;.     
b6e0: 20 69 66 28 20 70 57 69 6e 2d 3e 70 46 69 6c 74   if( pWin->pFilt
b6f0: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  er ){.        in
b700: 74 20 72 65 67 54 6d 70 3b 0a 20 20 20 20 20 20  t regTmp;.      
b710: 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d    assert( nArg==
b720: 30 20 7c 7c 20 6e 41 72 67 3d 3d 70 57 69 6e 2d  0 || nArg==pWin-
b730: 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74  >pOwner->x.pList
b740: 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->nExpr );.     
b750: 20 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 20     assert( nArg 
b760: 7c 7c 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d  || pWin->pOwner-
b770: 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20  >x.pList==0 );. 
b780: 20 20 20 20 20 20 20 72 65 67 54 6d 70 20 3d 20         regTmp = 
b790: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
b7a0: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
b7b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b7c0: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
b7d0: 6e 2c 20 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41  n, csr, pWin->iA
b7e0: 72 67 43 6f 6c 2b 6e 41 72 67 2c 72 65 67 54 6d  rgCol+nArg,regTm
b7f0: 70 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72  p);.        addr
b800: 49 66 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  If = sqlite3Vdbe
b810: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e  AddOp3(v, OP_IfN
b820: 6f 74 2c 20 72 65 67 54 6d 70 2c 20 30 2c 20 31  ot, regTmp, 0, 1
b830: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
b840: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
b850: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
b860: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
b870: 2c 20 72 65 67 54 6d 70 29 3b 0a 20 20 20 20 20  , regTmp);.     
b880: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 46 75   }.      if( pFu
b890: 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  nc->funcFlags & 
b8a0: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44  SQLITE_FUNC_NEED
b8b0: 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  COLL ){.        
b8c0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
b8d0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
b8e0: 6e 41 72 67 3e 30 20 29 3b 0a 20 20 20 20 20 20  nArg>0 );.      
b8f0: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
b900: 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70  3ExprNNCollSeq(p
b910: 50 61 72 73 65 2c 20 70 57 69 6e 2d 3e 70 4f 77  Parse, pWin->pOw
b920: 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  ner->x.pList->a[
b930: 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  0].pExpr);.     
b940: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b950: 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53  dOp4(v, OP_CollS
b960: 65 71 2c 20 30 2c 30 2c 30 2c 20 28 63 6f 6e 73  eq, 0,0,0, (cons
b970: 74 20 63 68 61 72 2a 29 70 43 6f 6c 6c 2c 20 50  t char*)pColl, P
b980: 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
b990: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
b9a0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 62  3VdbeAddOp3(v, b
b9b0: 49 6e 76 65 72 73 65 3f 20 4f 50 5f 41 67 67 49  Inverse? OP_AggI
b9c0: 6e 76 65 72 73 65 20 3a 20 4f 50 5f 41 67 67 53  nverse : OP_AggS
b9d0: 74 65 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20  tep, .          
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 49                bI
b9f0: 6e 76 65 72 73 65 2c 20 72 65 67 41 72 67 2c 20  nverse, regArg, 
ba00: 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 29 3b  pWin->regAccum);
ba10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
ba20: 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 46  beAppendP4(v, pF
ba30: 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  unc, P4_FUNCDEF)
ba40: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
ba50: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28  dbeChangeP5(v, (
ba60: 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20 20 20  u8)nArg);.      
ba70: 69 66 28 20 61 64 64 72 49 66 20 29 20 73 71 6c  if( addrIf ) sql
ba80: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
ba90: 28 76 2c 20 61 64 64 72 49 66 29 3b 0a 20 20 20  (v, addrIf);.   
baa0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 74 79 70 65 64 65   }.  }.}..typede
bab0: 66 20 73 74 72 75 63 74 20 57 69 6e 64 6f 77 43  f struct WindowC
bac0: 6f 64 65 41 72 67 20 57 69 6e 64 6f 77 43 6f 64  odeArg WindowCod
bad0: 65 41 72 67 3b 0a 74 79 70 65 64 65 66 20 73 74  eArg;.typedef st
bae0: 72 75 63 74 20 57 69 6e 64 6f 77 43 73 72 41 6e  ruct WindowCsrAn
baf0: 64 52 65 67 20 57 69 6e 64 6f 77 43 73 72 41 6e  dReg WindowCsrAn
bb00: 64 52 65 67 3b 0a 73 74 72 75 63 74 20 57 69 6e  dReg;.struct Win
bb10: 64 6f 77 43 73 72 41 6e 64 52 65 67 20 7b 0a 20  dowCsrAndReg {. 
bb20: 20 69 6e 74 20 63 73 72 3b 0a 20 20 69 6e 74 20   int csr;.  int 
bb30: 72 65 67 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  reg;.};..struct 
bb40: 57 69 6e 64 6f 77 43 6f 64 65 41 72 67 20 7b 0a  WindowCodeArg {.
bb50: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
bb60: 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e  .  Window *pMWin
bb70: 3b 0a 20 20 56 64 62 65 20 2a 70 56 64 62 65 3b  ;.  Vdbe *pVdbe;
bb80: 0a 20 20 69 6e 74 20 72 65 67 47 6f 73 75 62 3b  .  int regGosub;
bb90: 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75 62  .  int addrGosub
bba0: 3b 0a 20 20 69 6e 74 20 72 65 67 41 72 67 3b 0a  ;.  int regArg;.
bbb0: 20 20 69 6e 74 20 65 44 65 6c 65 74 65 3b 0a 0a    int eDelete;..
bbc0: 20 20 57 69 6e 64 6f 77 43 73 72 41 6e 64 52 65    WindowCsrAndRe
bbd0: 67 20 73 74 61 72 74 3b 0a 20 20 57 69 6e 64 6f  g start;.  Windo
bbe0: 77 43 73 72 41 6e 64 52 65 67 20 63 75 72 72 65  wCsrAndReg curre
bbf0: 6e 74 3b 0a 20 20 57 69 6e 64 6f 77 43 73 72 41  nt;.  WindowCsrA
bc00: 6e 64 52 65 67 20 65 6e 64 3b 0a 7d 3b 0a 0a 2f  ndReg end;.};../
bc10: 2a 0a 2a 2a 20 56 61 6c 75 65 73 20 74 68 61 74  *.** Values that
bc20: 20 6d 61 79 20 62 65 20 70 61 73 73 65 64 20 61   may be passed a
bc30: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
bc40: 75 6d 65 6e 74 20 74 6f 20 77 69 6e 64 6f 77 43  ument to windowC
bc50: 6f 64 65 4f 70 28 29 2e 0a 2a 2f 0a 23 64 65 66  odeOp()..*/.#def
bc60: 69 6e 65 20 57 49 4e 44 4f 57 5f 52 45 54 55 52  ine WINDOW_RETUR
bc70: 4e 5f 52 4f 57 20 31 0a 23 64 65 66 69 6e 65 20  N_ROW 1.#define 
bc80: 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53  WINDOW_AGGINVERS
bc90: 45 20 32 0a 23 64 65 66 69 6e 65 20 57 49 4e 44  E 2.#define WIND
bca0: 4f 57 5f 41 47 47 53 54 45 50 20 20 20 20 33 0a  OW_AGGSTEP    3.
bcb0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
bcc0: 56 4d 20 63 6f 64 65 20 74 6f 20 72 65 61 64 20  VM code to read 
bcd0: 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61 6d 65  the window frame
bce0: 73 20 70 65 65 72 20 76 61 6c 75 65 73 20 66 72  s peer values fr
bcf0: 6f 6d 20 63 75 72 73 6f 72 20 63 73 72 20 69 6e  om cursor csr in
bd00: 74 6f 0a 2a 2a 20 61 6e 20 61 72 72 61 79 20 6f  to.** an array o
bd10: 66 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72  f registers star
bd20: 74 69 6e 67 20 61 74 20 72 65 67 2e 0a 2a 2f 0a  ting at reg..*/.
bd30: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64  static void wind
bd40: 6f 77 52 65 61 64 50 65 65 72 56 61 6c 75 65 73  owReadPeerValues
bd50: 28 0a 20 20 57 69 6e 64 6f 77 43 6f 64 65 41 72  (.  WindowCodeAr
bd60: 67 20 2a 70 2c 0a 20 20 69 6e 74 20 63 73 72 2c  g *p,.  int csr,
bd70: 0a 20 20 69 6e 74 20 72 65 67 0a 29 7b 0a 20 20  .  int reg.){.  
bd80: 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20  Window *pMWin = 
bd90: 70 2d 3e 70 4d 57 69 6e 3b 0a 20 20 45 78 70 72  p->pMWin;.  Expr
bda0: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
bdb0: 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79   pMWin->pOrderBy
bdc0: 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
bdd0: 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20   ){.    Vdbe *v 
bde0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
bdf0: 28 70 2d 3e 70 50 61 72 73 65 29 3b 0a 20 20 20  (p->pParse);.   
be00: 20 45 78 70 72 4c 69 73 74 20 2a 70 50 61 72 74   ExprList *pPart
be10: 20 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69   = pMWin->pParti
be20: 74 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 69 43  tion;.    int iC
be30: 6f 6c 4f 66 66 20 3d 20 70 4d 57 69 6e 2d 3e 6e  olOff = pMWin->n
be40: 42 75 66 66 65 72 43 6f 6c 20 2b 20 28 70 50 61  BufferCol + (pPa
be50: 72 74 20 3f 20 70 50 61 72 74 2d 3e 6e 45 78 70  rt ? pPart->nExp
be60: 72 20 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74 20  r : 0);.    int 
be70: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
be80: 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
be90: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  r; i++){.      s
bea0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
beb0: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63  (v, OP_Column, c
bec0: 73 72 2c 20 69 43 6f 6c 4f 66 66 2b 69 2c 20 72  sr, iColOff+i, r
bed0: 65 67 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  eg+i);.    }.  }
bee0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
bef0: 74 65 20 56 4d 20 63 6f 64 65 20 74 6f 20 69 6e  te VM code to in
bf00: 76 6f 6b 65 20 65 69 74 68 65 72 20 78 56 61 6c  voke either xVal
bf10: 75 65 28 29 20 28 62 46 69 6e 3d 3d 30 29 20 6f  ue() (bFin==0) o
bf20: 72 20 78 46 69 6e 61 6c 69 7a 65 28 29 0a 2a 2a  r xFinalize().**
bf30: 20 28 62 46 69 6e 3d 3d 31 29 20 66 6f 72 20 65   (bFin==1) for e
bf40: 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  ach window funct
bf50: 69 6f 6e 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65  ion in the linke
bf60: 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67 20  d list starting 
bf70: 61 74 0a 2a 2a 20 70 4d 57 69 6e 2e 20 4f 72 2c  at.** pMWin. Or,
bf80: 20 66 6f 72 20 62 75 69 6c 74 2d 69 6e 20 77 69   for built-in wi
bf90: 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e 73 20 74  ndow-functions t
bfa0: 68 61 74 20 64 6f 20 6e 6f 74 20 75 73 65 20 74  hat do not use t
bfb0: 68 65 20 73 74 61 6e 64 61 72 64 0a 2a 2a 20 41  he standard.** A
bfc0: 50 49 2c 20 67 65 6e 65 72 61 74 65 20 74 68 65  PI, generate the
bfd0: 20 65 71 75 69 76 61 6c 65 6e 74 20 56 4d 20 63   equivalent VM c
bfe0: 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ode..*/.static v
bff0: 6f 69 64 20 77 69 6e 64 6f 77 41 67 67 46 69 6e  oid windowAggFin
c000: 61 6c 28 57 69 6e 64 6f 77 43 6f 64 65 41 72 67  al(WindowCodeArg
c010: 20 2a 70 2c 20 69 6e 74 20 62 46 69 6e 29 7b 0a   *p, int bFin){.
c020: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
c030: 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 57  = p->pParse;.  W
c040: 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70  indow *pMWin = p
c050: 2d 3e 70 4d 57 69 6e 3b 0a 20 20 56 64 62 65 20  ->pMWin;.  Vdbe 
c060: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
c070: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 57  dbe(pParse);.  W
c080: 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 0a 20 20  indow *pWin;..  
c090: 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20  for(pWin=pMWin; 
c0a0: 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d  pWin; pWin=pWin-
c0b0: 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20  >pNextWin){.    
c0c0: 69 66 28 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74  if( pMWin->regSt
c0d0: 61 72 74 52 6f 77 69 64 3d 3d 30 0a 20 20 20 20  artRowid==0.    
c0e0: 20 26 26 20 28 70 57 69 6e 2d 3e 70 46 75 6e 63   && (pWin->pFunc
c0f0: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
c100: 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58  LITE_FUNC_MINMAX
c110: 29 20 0a 20 20 20 20 20 26 26 20 28 70 57 69 6e  ) .     && (pWin
c120: 2d 3e 65 53 74 61 72 74 21 3d 54 4b 5f 55 4e 42  ->eStart!=TK_UNB
c130: 4f 55 4e 44 45 44 29 0a 20 20 20 20 29 7b 0a 20  OUNDED).    ){. 
c140: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c150: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
c160: 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 52  l, 0, pWin->regR
c170: 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 73 71  esult);.      sq
c180: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
c190: 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 57 69 6e  v, OP_Last, pWin
c1a0: 2d 3e 63 73 72 41 70 70 29 3b 0a 20 20 20 20 20  ->csrApp);.     
c1b0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
c1c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
c1d0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
c1e0: 43 6f 6c 75 6d 6e 2c 20 70 57 69 6e 2d 3e 63 73  Column, pWin->cs
c1f0: 72 41 70 70 2c 20 30 2c 20 70 57 69 6e 2d 3e 72  rApp, 0, pWin->r
c200: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
c210: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
c220: 48 65 72 65 28 76 2c 20 73 71 6c 69 74 65 33 56  Here(v, sqlite3V
c230: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
c240: 29 2d 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  )-2);.    }else 
c250: 69 66 28 20 70 57 69 6e 2d 3e 72 65 67 41 70 70  if( pWin->regApp
c260: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
c270: 28 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72  ( pMWin->regStar
c280: 74 52 6f 77 69 64 3d 3d 30 20 29 3b 0a 20 20 20  tRowid==0 );.   
c290: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
c2a0: 74 20 6e 41 72 67 20 3d 20 77 69 6e 64 6f 77 41  t nArg = windowA
c2b0: 72 67 43 6f 75 6e 74 28 70 57 69 6e 29 3b 0a 20  rgCount(pWin);. 
c2c0: 20 20 20 20 20 69 66 28 20 62 46 69 6e 20 29 7b       if( bFin ){
c2d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
c2e0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
c2f0: 5f 41 67 67 46 69 6e 61 6c 2c 20 70 57 69 6e 2d  _AggFinal, pWin-
c300: 3e 72 65 67 41 63 63 75 6d 2c 20 6e 41 72 67 29  >regAccum, nArg)
c310: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
c320: 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c  3VdbeAppendP4(v,
c330: 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2c 20 50 34   pWin->pFunc, P4
c340: 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20  _FUNCDEF);.     
c350: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c360: 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
c370: 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 2c   pWin->regAccum,
c380: 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74   pWin->regResult
c390: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
c3a0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
c3b0: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e  OP_Null, 0, pWin
c3c0: 2d 3e 72 65 67 41 63 63 75 6d 29 3b 0a 20 20 20  ->regAccum);.   
c3d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c3e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c3f0: 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67 56 61 6c  Op3(v, OP_AggVal
c400: 75 65 2c 70 57 69 6e 2d 3e 72 65 67 41 63 63 75  ue,pWin->regAccu
c410: 6d 2c 6e 41 72 67 2c 70 57 69 6e 2d 3e 72 65 67  m,nArg,pWin->reg
c420: 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 20  Result);.       
c430: 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65   sqlite3VdbeAppe
c440: 6e 64 50 34 28 76 2c 20 70 57 69 6e 2d 3e 70 46  ndP4(v, pWin->pF
c450: 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  unc, P4_FUNCDEF)
c460: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c470: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
c480: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63 61  erate code to ca
c490: 6c 63 75 6c 61 74 65 20 74 68 65 20 63 75 72 72  lculate the curr
c4a0: 65 6e 74 20 76 61 6c 75 65 73 20 6f 66 20 61 6c  ent values of al
c4b0: 6c 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  l window functio
c4c0: 6e 73 20 69 6e 20 74 68 65 0a 2a 2a 20 70 2d 3e  ns in the.** p->
c4d0: 70 4d 57 69 6e 20 6c 69 73 74 20 62 79 20 64 6f  pMWin list by do
c4e0: 69 6e 67 20 61 20 66 75 6c 6c 20 73 63 61 6e 20  ing a full scan 
c4f0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 77  of the current w
c500: 69 6e 64 6f 77 20 66 72 61 6d 65 2e 20 53 74 6f  indow frame. Sto
c510: 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74  re the.** result
c520: 73 20 69 6e 20 74 68 65 20 57 69 6e 64 6f 77 2e  s in the Window.
c530: 72 65 67 52 65 73 75 6c 74 20 72 65 67 69 73 74  regResult regist
c540: 65 72 73 2c 20 72 65 61 64 79 20 74 6f 20 72 65  ers, ready to re
c550: 74 75 72 6e 20 74 68 65 20 75 70 70 65 72 0a 2a  turn the upper.*
c560: 2a 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74  * layer..*/.stat
c570: 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 46 75  ic void windowFu
c580: 6c 6c 53 63 61 6e 28 57 69 6e 64 6f 77 43 6f 64  llScan(WindowCod
c590: 65 41 72 67 20 2a 70 29 7b 0a 20 20 57 69 6e 64  eArg *p){.  Wind
c5a0: 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 50 61 72 73  ow *pWin;.  Pars
c5b0: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70  e *pParse = p->p
c5c0: 50 61 72 73 65 3b 0a 20 20 57 69 6e 64 6f 77 20  Parse;.  Window 
c5d0: 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 4d 57 69  *pMWin = p->pMWi
c5e0: 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  n;.  Vdbe *v = p
c5f0: 2d 3e 70 56 64 62 65 3b 0a 0a 20 20 69 6e 74 20  ->pVdbe;..  int 
c600: 72 65 67 43 52 6f 77 69 64 20 3d 20 30 3b 20 20  regCRowid = 0;  
c610: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
c620: 75 72 72 65 6e 74 20 72 6f 77 69 64 20 76 61 6c  urrent rowid val
c630: 75 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43  ue */.  int regC
c640: 50 65 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  Peer = 0;       
c650: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
c660: 6e 74 20 70 65 65 72 20 76 61 6c 75 65 73 20 2a  nt peer values *
c670: 2f 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64  /.  int regRowid
c680: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
c690: 20 20 20 20 2f 2a 20 41 67 67 53 74 65 70 20 72      /* AggStep r
c6a0: 6f 77 69 64 20 76 61 6c 75 65 20 2a 2f 0a 20 20  owid value */.  
c6b0: 69 6e 74 20 72 65 67 50 65 65 72 20 3d 20 30 3b  int regPeer = 0;
c6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6d0: 2f 2a 20 41 67 67 53 74 65 70 20 70 65 65 72 20  /* AggStep peer 
c6e0: 76 61 6c 75 65 73 20 2a 2f 0a 0a 20 20 69 6e 74  values */..  int
c6f0: 20 6e 50 65 65 72 3b 0a 20 20 69 6e 74 20 6c 62   nPeer;.  int lb
c700: 6c 4e 65 78 74 3b 0a 20 20 69 6e 74 20 6c 62 6c  lNext;.  int lbl
c710: 42 72 6b 3b 0a 20 20 69 6e 74 20 61 64 64 72 4e  Brk;.  int addrN
c720: 65 78 74 3b 0a 20 20 69 6e 74 20 63 73 72 20 3d  ext;.  int csr =
c730: 20 70 4d 57 69 6e 2d 3e 63 73 72 41 70 70 3b 0a   pMWin->csrApp;.
c740: 0a 20 20 6e 50 65 65 72 20 3d 20 28 70 4d 57 69  .  nPeer = (pMWi
c750: 6e 2d 3e 70 4f 72 64 65 72 42 79 20 3f 20 70 4d  n->pOrderBy ? pM
c760: 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  Win->pOrderBy->n
c770: 45 78 70 72 20 3a 20 30 29 3b 0a 0a 20 20 6c 62  Expr : 0);..  lb
c780: 6c 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56  lNext = sqlite3V
c790: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
c7a0: 72 73 65 29 3b 0a 20 20 6c 62 6c 42 72 6b 20 3d  rse);.  lblBrk =
c7b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
c7c0: 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a  Label(pParse);..
c7d0: 20 20 72 65 67 43 52 6f 77 69 64 20 3d 20 73 71    regCRowid = sq
c7e0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
c7f0: 70 50 61 72 73 65 29 3b 0a 20 20 72 65 67 52 6f  pParse);.  regRo
c800: 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74  wid = sqlite3Get
c810: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
c820: 0a 20 20 69 66 28 20 6e 50 65 65 72 20 29 7b 0a  .  if( nPeer ){.
c830: 20 20 20 20 72 65 67 43 50 65 65 72 20 3d 20 73      regCPeer = s
c840: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
c850: 67 65 28 70 50 61 72 73 65 2c 20 6e 50 65 65 72  ge(pParse, nPeer
c860: 29 3b 0a 20 20 20 20 72 65 67 50 65 65 72 20 3d  );.    regPeer =
c870: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
c880: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 50 65  ange(pParse, nPe
c890: 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  er);.  }..  sqli
c8a0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
c8b0: 20 4f 50 5f 52 6f 77 69 64 2c 20 70 4d 57 69 6e   OP_Rowid, pMWin
c8c0: 2d 3e 69 45 70 68 43 73 72 2c 20 72 65 67 43 52  ->iEphCsr, regCR
c8d0: 6f 77 69 64 29 3b 0a 20 20 77 69 6e 64 6f 77 52  owid);.  windowR
c8e0: 65 61 64 50 65 65 72 56 61 6c 75 65 73 28 70 2c  eadPeerValues(p,
c8f0: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c   pMWin->iEphCsr,
c900: 20 72 65 67 43 50 65 65 72 29 3b 0a 0a 20 20 66   regCPeer);..  f
c910: 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70  or(pWin=pMWin; p
c920: 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e  Win; pWin=pWin->
c930: 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 73  pNextWin){.    s
c940: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
c950: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
c960: 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 29 3b  pWin->regAccum);
c970: 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56  .  }..  sqlite3V
c980: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
c990: 53 65 65 6b 47 45 2c 20 63 73 72 2c 20 6c 62 6c  SeekGE, csr, lbl
c9a0: 42 72 6b 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 53  Brk, pMWin->regS
c9b0: 74 61 72 74 52 6f 77 69 64 29 3b 0a 20 20 56 64  tartRowid);.  Vd
c9c0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
c9d0: 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69   addrNext = sqli
c9e0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
c9f0: 64 72 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  dr(v);.  sqlite3
ca00: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
ca10: 5f 52 6f 77 69 64 2c 20 63 73 72 2c 20 72 65 67  _Rowid, csr, reg
ca20: 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65  Rowid);.  sqlite
ca30: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
ca40: 50 5f 47 74 2c 20 70 4d 57 69 6e 2d 3e 72 65 67  P_Gt, pMWin->reg
ca50: 45 6e 64 52 6f 77 69 64 2c 20 6c 62 6c 42 72 6b  EndRowid, lblBrk
ca60: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 56  , regRowid);.  V
ca70: 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72  dbeCoverageNever
ca80: 4e 75 6c 6c 28 76 29 3b 0a 0a 20 20 69 66 28 20  Null(v);..  if( 
ca90: 70 4d 57 69 6e 2d 3e 65 45 78 63 6c 75 64 65 3d  pMWin->eExclude=
caa0: 3d 54 4b 5f 43 55 52 52 45 4e 54 20 29 7b 0a 20  =TK_CURRENT ){. 
cab0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cac0: 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20 72  dOp3(v, OP_Eq, r
cad0: 65 67 43 52 6f 77 69 64 2c 20 6c 62 6c 4e 65 78  egCRowid, lblNex
cae0: 74 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  t, regRowid);.  
caf0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
cb00: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
cb10: 4d 57 69 6e 2d 3e 65 45 78 63 6c 75 64 65 21 3d  MWin->eExclude!=
cb20: 54 4b 5f 4e 4f 20 29 7b 0a 20 20 20 20 69 6e 74  TK_NO ){.    int
cb30: 20 61 64 64 72 3b 0a 20 20 20 20 69 6e 74 20 61   addr;.    int a
cb40: 64 64 72 45 71 20 3d 20 30 3b 0a 20 20 20 20 4b  ddrEq = 0;.    K
cb50: 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
cb60: 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70   = 0;..    if( p
cb70: 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20 29  MWin->pOrderBy )
cb80: 7b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f  {.      pKeyInfo
cb90: 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
cba0: 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
cbb0: 61 72 73 65 2c 20 70 4d 57 69 6e 2d 3e 70 4f 72  arse, pMWin->pOr
cbc0: 64 65 72 42 79 2c 20 30 2c 20 30 29 3b 0a 20 20  derBy, 0, 0);.  
cbd0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4d 57 69    }.    if( pMWi
cbe0: 6e 2d 3e 65 45 78 63 6c 75 64 65 3d 3d 54 4b 5f  n->eExclude==TK_
cbf0: 54 49 45 53 20 29 7b 0a 20 20 20 20 20 20 61 64  TIES ){.      ad
cc00: 64 72 45 71 20 3d 20 73 71 6c 69 74 65 33 56 64  drEq = sqlite3Vd
cc10: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45  beAddOp3(v, OP_E
cc20: 71 2c 20 72 65 67 43 52 6f 77 69 64 2c 20 30 2c  q, regCRowid, 0,
cc30: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
cc40: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
cc50: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
cc60: 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20   pKeyInfo ){.   
cc70: 20 20 20 77 69 6e 64 6f 77 52 65 61 64 50 65 65     windowReadPee
cc80: 72 56 61 6c 75 65 73 28 70 2c 20 63 73 72 2c 20  rValues(p, csr, 
cc90: 72 65 67 50 65 65 72 29 3b 0a 20 20 20 20 20 20  regPeer);.      
cca0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ccb0: 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  3(v, OP_Compare,
ccc0: 20 72 65 67 50 65 65 72 2c 20 72 65 67 43 50 65   regPeer, regCPe
ccd0: 65 72 2c 20 6e 50 65 65 72 29 3b 0a 20 20 20 20  er, nPeer);.    
cce0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70    sqlite3VdbeApp
ccf0: 65 6e 64 50 34 28 76 2c 20 28 76 6f 69 64 2a 29  endP4(v, (void*)
cd00: 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
cd10: 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 61 64 64  INFO);.      add
cd20: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
cd30: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31 3b  urrentAddr(v)+1;
cd40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
cd50: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
cd60: 75 6d 70 2c 20 61 64 64 72 2c 20 6c 62 6c 4e 65  ump, addr, lblNe
cd70: 78 74 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20  xt, addr);.     
cd80: 20 56 64 62 65 43 6f 76 65 72 61 67 65 45 71 4e   VdbeCoverageEqN
cd90: 65 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  e(v);.    }else{
cda0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
cdb0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
cdc0: 6f 74 6f 2c 20 30 2c 20 6c 62 6c 4e 65 78 74 29  oto, 0, lblNext)
cdd0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
cde0: 61 64 64 72 45 71 20 29 20 73 71 6c 69 74 65 33  addrEq ) sqlite3
cdf0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
ce00: 61 64 64 72 45 71 29 3b 0a 20 20 7d 0a 0a 20 20  addrEq);.  }..  
ce10: 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28 70 50  windowAggStep(pP
ce20: 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 63 73 72  arse, pMWin, csr
ce30: 2c 20 30 2c 20 70 2d 3e 72 65 67 41 72 67 29 3b  , 0, p->regArg);
ce40: 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  ..  sqlite3VdbeR
ce50: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
ce60: 62 6c 4e 65 78 74 29 3b 0a 20 20 73 71 6c 69 74  blNext);.  sqlit
ce70: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
ce80: 4f 50 5f 4e 65 78 74 2c 20 63 73 72 2c 20 61 64  OP_Next, csr, ad
ce90: 64 72 4e 65 78 74 29 3b 0a 20 20 56 64 62 65 43  drNext);.  VdbeC
cea0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
ceb0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
cec0: 65 28 76 2c 20 61 64 64 72 4e 65 78 74 2d 31 29  e(v, addrNext-1)
ced0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  ;.  sqlite3VdbeJ
cee0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4e  umpHere(v, addrN
cef0: 65 78 74 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65  ext+1);.  sqlite
cf00: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
cf10: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64  pParse, regRowid
cf20: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
cf30: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
cf40: 65 2c 20 72 65 67 43 52 6f 77 69 64 29 3b 0a 20  e, regCRowid);. 
cf50: 20 69 66 28 20 6e 50 65 65 72 20 29 7b 0a 20 20   if( nPeer ){.  
cf60: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
cf70: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
cf80: 2c 20 72 65 67 50 65 65 72 2c 20 6e 50 65 65 72  , regPeer, nPeer
cf90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
cfa0: 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
cfb0: 50 61 72 73 65 2c 20 72 65 67 43 50 65 65 72 2c  Parse, regCPeer,
cfc0: 20 6e 50 65 65 72 29 3b 0a 20 20 7d 0a 0a 20 20   nPeer);.  }..  
cfd0: 77 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 70  windowAggFinal(p
cfe0: 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  , 1);.}../*.** I
cff0: 6e 76 6f 6b 65 20 74 68 65 20 73 75 62 2d 72 6f  nvoke the sub-ro
d000: 75 74 69 6e 65 20 61 74 20 72 65 67 47 6f 73 75  utine at regGosu
d010: 62 20 28 67 65 6e 65 72 61 74 65 64 20 62 79 20  b (generated by 
d020: 63 6f 64 65 20 69 6e 20 73 65 6c 65 63 74 2e 63  code in select.c
d030: 29 20 74 6f 0a 2a 2a 20 72 65 74 75 72 6e 20 74  ) to.** return t
d040: 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f  he current row o
d050: 66 20 57 69 6e 64 6f 77 2e 69 45 70 68 43 73 72  f Window.iEphCsr
d060: 2e 20 49 66 20 61 6c 6c 20 77 69 6e 64 6f 77 20  . If all window 
d070: 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 0a 2a 2a  functions are.**
d080: 20 61 67 67 72 65 67 61 74 65 20 77 69 6e 64 6f   aggregate windo
d090: 77 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74  w functions that
d0a0: 20 75 73 65 20 74 68 65 20 73 74 61 6e 64 61 72   use the standar
d0b0: 64 20 41 50 49 2c 20 61 20 73 69 6e 67 6c 65 0a  d API, a single.
d0c0: 2a 2a 20 4f 50 5f 47 6f 73 75 62 20 69 6e 73 74  ** OP_Gosub inst
d0d0: 72 75 63 74 69 6f 6e 20 69 73 20 61 6c 6c 20 74  ruction is all t
d0e0: 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hat this routine
d0f0: 20 67 65 6e 65 72 61 74 65 73 2e 20 45 78 74 72   generates. Extr
d100: 61 20 56 4d 20 63 6f 64 65 0a 2a 2a 20 66 6f 72  a VM code.** for
d110: 20 70 65 72 2d 72 6f 77 20 70 72 6f 63 65 73 73   per-row process
d120: 69 6e 67 20 69 73 20 6f 6e 6c 79 20 67 65 6e 65  ing is only gene
d130: 72 61 74 65 64 20 66 6f 72 20 74 68 65 20 66 6f  rated for the fo
d140: 6c 6c 6f 77 69 6e 67 20 62 75 69 6c 74 2d 69 6e  llowing built-in
d150: 20 77 69 6e 64 6f 77 0a 2a 2a 20 66 75 6e 63 74   window.** funct
d160: 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6e 74  ions:.**.**   nt
d170: 68 5f 76 61 6c 75 65 28 29 0a 2a 2a 20 20 20 66  h_value().**   f
d180: 69 72 73 74 5f 76 61 6c 75 65 28 29 0a 2a 2a 20  irst_value().** 
d190: 20 20 6c 61 67 28 29 0a 2a 2a 20 20 20 6c 65 61    lag().**   lea
d1a0: 64 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  d().*/.static vo
d1b0: 69 64 20 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f  id windowReturnO
d1c0: 6e 65 52 6f 77 28 57 69 6e 64 6f 77 43 6f 64 65  neRow(WindowCode
d1d0: 41 72 67 20 2a 70 29 7b 0a 20 20 57 69 6e 64 6f  Arg *p){.  Windo
d1e0: 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 4d  w *pMWin = p->pM
d1f0: 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  Win;.  Vdbe *v =
d200: 20 70 2d 3e 70 56 64 62 65 3b 0a 0a 20 20 69 66   p->pVdbe;..  if
d210: 28 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72  ( pMWin->regStar
d220: 74 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 77 69  tRowid ){.    wi
d230: 6e 64 6f 77 46 75 6c 6c 53 63 61 6e 28 70 29 3b  ndowFullScan(p);
d240: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 61  .  }else{.    Pa
d250: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d  rse *pParse = p-
d260: 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 57 69 6e  >pParse;.    Win
d270: 64 6f 77 20 2a 70 57 69 6e 3b 0a 0a 20 20 20 20  dow *pWin;..    
d280: 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20  for(pWin=pMWin; 
d290: 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d  pWin; pWin=pWin-
d2a0: 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20  >pNextWin){.    
d2b0: 20 20 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63    FuncDef *pFunc
d2c0: 20 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a   = pWin->pFunc;.
d2d0: 20 20 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d        if( pFunc-
d2e0: 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75  >zName==nth_valu
d2f0: 65 4e 61 6d 65 0a 20 20 20 20 20 20 20 7c 7c 20  eName.       || 
d300: 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69  pFunc->zName==fi
d310: 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65 0a 20 20  rst_valueName.  
d320: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69      ){.        i
d330: 6e 74 20 63 73 72 20 3d 20 70 57 69 6e 2d 3e 63  nt csr = pWin->c
d340: 73 72 41 70 70 3b 0a 20 20 20 20 20 20 20 20 69  srApp;.        i
d350: 6e 74 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33  nt lbl = sqlite3
d360: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
d370: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69  arse);.        i
d380: 6e 74 20 74 6d 70 52 65 67 20 3d 20 73 71 6c 69  nt tmpReg = sqli
d390: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
d3a0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
d3b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d3c0: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
d3d0: 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29  pWin->regResult)
d3e0: 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 69 66 28  ;.  .        if(
d3f0: 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e   pFunc->zName==n
d400: 74 68 5f 76 61 6c 75 65 4e 61 6d 65 20 29 7b 0a  th_valueName ){.
d410: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d420: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
d430: 50 5f 43 6f 6c 75 6d 6e 2c 70 4d 57 69 6e 2d 3e  P_Column,pMWin->
d440: 69 45 70 68 43 73 72 2c 70 57 69 6e 2d 3e 69 41  iEphCsr,pWin->iA
d450: 72 67 43 6f 6c 2b 31 2c 74 6d 70 52 65 67 29 3b  rgCol+1,tmpReg);
d460: 0a 20 20 20 20 20 20 20 20 20 20 77 69 6e 64 6f  .          windo
d470: 77 43 68 65 63 6b 56 61 6c 75 65 28 70 50 61 72  wCheckValue(pPar
d480: 73 65 2c 20 74 6d 70 52 65 67 2c 20 32 29 3b 0a  se, tmpReg, 2);.
d490: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
d4a0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d4b0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
d4c0: 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 6d 70  _Integer, 1, tmp
d4d0: 52 65 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Reg);.        }.
d4e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d4f0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
d500: 41 64 64 2c 20 74 6d 70 52 65 67 2c 20 70 57 69  Add, tmpReg, pWi
d510: 6e 2d 3e 72 65 67 41 70 70 2c 20 74 6d 70 52 65  n->regApp, tmpRe
d520: 67 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  g);.        sqli
d530: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
d540: 20 4f 50 5f 47 74 2c 20 70 57 69 6e 2d 3e 72 65   OP_Gt, pWin->re
d550: 67 41 70 70 2b 31 2c 20 6c 62 6c 2c 20 74 6d 70  gApp+1, lbl, tmp
d560: 52 65 67 29 3b 0a 20 20 20 20 20 20 20 20 56 64  Reg);.        Vd
d570: 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72 4e  beCoverageNeverN
d580: 75 6c 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  ull(v);.        
d590: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d5a0: 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69  3(v, OP_SeekRowi
d5b0: 64 2c 20 63 73 72 2c 20 30 2c 20 74 6d 70 52 65  d, csr, 0, tmpRe
d5c0: 67 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  g);.        Vdbe
d5d0: 43 6f 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b  CoverageNeverTak
d5e0: 65 6e 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  en(v);.        s
d5f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
d600: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63  (v, OP_Column, c
d610: 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f  sr, pWin->iArgCo
d620: 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75  l, pWin->regResu
d630: 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  lt);.        sql
d640: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
d650: 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20 20  abel(v, lbl);.  
d660: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
d670: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
d680: 73 65 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20  se, tmpReg);.   
d690: 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65 20     }.      else 
d6a0: 69 66 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65  if( pFunc->zName
d6b0: 3d 3d 6c 65 61 64 4e 61 6d 65 20 7c 7c 20 70 46  ==leadName || pF
d6c0: 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 61 67 4e  unc->zName==lagN
d6d0: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ame ){.        i
d6e0: 6e 74 20 6e 41 72 67 20 3d 20 70 57 69 6e 2d 3e  nt nArg = pWin->
d6f0: 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 2d  pOwner->x.pList-
d700: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >nExpr;.        
d710: 69 6e 74 20 63 73 72 20 3d 20 70 57 69 6e 2d 3e  int csr = pWin->
d720: 63 73 72 41 70 70 3b 0a 20 20 20 20 20 20 20 20  csrApp;.        
d730: 69 6e 74 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65  int lbl = sqlite
d740: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70  3VdbeMakeLabel(p
d750: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
d760: 69 6e 74 20 74 6d 70 52 65 67 20 3d 20 73 71 6c  int tmpReg = sql
d770: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
d780: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
d790: 69 6e 74 20 69 45 70 68 20 3d 20 70 4d 57 69 6e  int iEph = pMWin
d7a0: 2d 3e 69 45 70 68 43 73 72 3b 0a 20 20 0a 20 20  ->iEphCsr;.  .  
d7b0: 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3c 33        if( nArg<3
d7c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
d7d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
d7e0: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70  v, OP_Null, 0, p
d7f0: 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b  Win->regResult);
d800: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
d810: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d820: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
d830: 50 5f 43 6f 6c 75 6d 6e 2c 20 69 45 70 68 2c 70  P_Column, iEph,p
d840: 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 32 2c 70  Win->iArgCol+2,p
d850: 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b  Win->regResult);
d860: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d870: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d880: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64  dOp2(v, OP_Rowid
d890: 2c 20 69 45 70 68 2c 20 74 6d 70 52 65 67 29 3b  , iEph, tmpReg);
d8a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 41 72  .        if( nAr
d8b0: 67 3c 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  g<2 ){.         
d8c0: 20 69 6e 74 20 76 61 6c 20 3d 20 28 70 46 75 6e   int val = (pFun
d8d0: 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61  c->zName==leadNa
d8e0: 6d 65 20 3f 20 31 20 3a 20 2d 31 29 3b 0a 20 20  me ? 1 : -1);.  
d8f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d900: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
d910: 41 64 64 49 6d 6d 2c 20 74 6d 70 52 65 67 2c 20  AddImm, tmpReg, 
d920: 76 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  val);.        }e
d930: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
d940: 6e 74 20 6f 70 20 3d 20 28 70 46 75 6e 63 2d 3e  nt op = (pFunc->
d950: 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65 20  zName==leadName 
d960: 3f 20 4f 50 5f 41 64 64 20 3a 20 4f 50 5f 53 75  ? OP_Add : OP_Su
d970: 62 74 72 61 63 74 29 3b 0a 20 20 20 20 20 20 20  btract);.       
d980: 20 20 20 69 6e 74 20 74 6d 70 52 65 67 32 20 3d     int tmpReg2 =
d990: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
d9a0: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
d9b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d9c0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
d9d0: 6c 75 6d 6e 2c 20 69 45 70 68 2c 20 70 57 69 6e  lumn, iEph, pWin
d9e0: 2d 3e 69 41 72 67 43 6f 6c 2b 31 2c 20 74 6d 70  ->iArgCol+1, tmp
d9f0: 52 65 67 32 29 3b 0a 20 20 20 20 20 20 20 20 20  Reg2);.         
da00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
da10: 70 33 28 76 2c 20 6f 70 2c 20 74 6d 70 52 65 67  p3(v, op, tmpReg
da20: 32 2c 20 74 6d 70 52 65 67 2c 20 74 6d 70 52 65  2, tmpReg, tmpRe
da30: 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  g);.          sq
da40: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
da50: 52 65 67 28 70 50 61 72 73 65 2c 20 74 6d 70 52  Reg(pParse, tmpR
da60: 65 67 32 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  eg2);.        }.
da70: 20 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74    .        sqlit
da80: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
da90: 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 63 73  OP_SeekRowid, cs
daa0: 72 2c 20 6c 62 6c 2c 20 74 6d 70 52 65 67 29 3b  r, lbl, tmpReg);
dab0: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
dac0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
dad0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
dae0: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
daf0: 2c 20 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72  , csr, pWin->iAr
db00: 67 43 6f 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 52  gCol, pWin->regR
db10: 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20  esult);.        
db20: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
db30: 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b  veLabel(v, lbl);
db40: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
db50: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
db60: 50 61 72 73 65 2c 20 74 6d 70 52 65 67 29 3b 0a  Parse, tmpReg);.
db70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
db80: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
db90: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
dba0: 62 2c 20 70 2d 3e 72 65 67 47 6f 73 75 62 2c 20  b, p->regGosub, 
dbb0: 70 2d 3e 61 64 64 72 47 6f 73 75 62 29 3b 0a 7d  p->addrGosub);.}
dbc0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
dbd0: 20 63 6f 64 65 20 74 6f 20 73 65 74 20 74 68 65   code to set the
dbe0: 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67   accumulator reg
dbf0: 69 73 74 65 72 20 66 6f 72 20 65 61 63 68 20 77  ister for each w
dc00: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 0a 2a  indow function.*
dc10: 2a 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20  * in the linked 
dc20: 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74  list passed as t
dc30: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
dc40: 6e 74 20 74 6f 20 4e 55 4c 4c 2e 20 41 6e 64 20  nt to NULL. And 
dc50: 70 65 72 66 6f 72 6d 0a 2a 2a 20 61 6e 79 20 65  perform.** any e
dc60: 71 75 69 76 61 6c 65 6e 74 20 69 6e 69 74 69 61  quivalent initia
dc70: 6c 69 7a 61 74 69 6f 6e 20 72 65 71 75 69 72 65  lization require
dc80: 64 20 62 79 20 61 6e 79 20 62 75 69 6c 74 2d 69  d by any built-i
dc90: 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  n window functio
dca0: 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 6c 69 73  ns.** in the lis
dcb0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
dcc0: 20 77 69 6e 64 6f 77 49 6e 69 74 41 63 63 75 6d   windowInitAccum
dcd0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
dce0: 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 29 7b 0a  Window *pMWin){.
dcf0: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
dd00: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
dd10: 65 29 3b 0a 20 20 69 6e 74 20 72 65 67 41 72 67  e);.  int regArg
dd20: 3b 0a 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 30  ;.  int nArg = 0
dd30: 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e  ;.  Window *pWin
dd40: 3b 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57  ;.  for(pWin=pMW
dd50: 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70  in; pWin; pWin=p
dd60: 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a  Win->pNextWin){.
dd70: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 46 75      FuncDef *pFu
dd80: 6e 63 20 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63  nc = pWin->pFunc
dd90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
dda0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
ddb0: 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67  ll, 0, pWin->reg
ddc0: 41 63 63 75 6d 29 3b 0a 20 20 20 20 6e 41 72 67  Accum);.    nArg
ddd0: 20 3d 20 4d 41 58 28 6e 41 72 67 2c 20 77 69 6e   = MAX(nArg, win
dde0: 64 6f 77 41 72 67 43 6f 75 6e 74 28 70 57 69 6e  dowArgCount(pWin
ddf0: 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 57 69  ));.    if( pMWi
de00: 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f 77 69 64  n->regStartRowid
de10: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
de20: 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e   pFunc->zName==n
de30: 74 68 5f 76 61 6c 75 65 4e 61 6d 65 20 7c 7c 20  th_valueName || 
de40: 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69  pFunc->zName==fi
de50: 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65 20 29 7b  rst_valueName ){
de60: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
de70: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
de80: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 57 69  _Integer, 0, pWi
de90: 6e 2d 3e 72 65 67 41 70 70 29 3b 0a 20 20 20 20  n->regApp);.    
dea0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
deb0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
dec0: 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65  ger, 0, pWin->re
ded0: 67 41 70 70 2b 31 29 3b 0a 20 20 20 20 20 20 7d  gApp+1);.      }
dee0: 0a 0a 20 20 20 20 20 20 69 66 28 20 28 70 46 75  ..      if( (pFu
def0: 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  nc->funcFlags & 
df00: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d  SQLITE_FUNC_MINM
df10: 41 58 29 20 26 26 20 70 57 69 6e 2d 3e 63 73 72  AX) && pWin->csr
df20: 41 70 70 20 29 7b 0a 20 20 20 20 20 20 20 20 61  App ){.        a
df30: 73 73 65 72 74 28 20 70 57 69 6e 2d 3e 65 53 74  ssert( pWin->eSt
df40: 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  art!=TK_UNBOUNDE
df50: 44 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  D );.        sql
df60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
df70: 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72  , OP_ResetSorter
df80: 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 29 3b  , pWin->csrApp);
df90: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
dfa0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
dfb0: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 57 69  _Integer, 0, pWi
dfc0: 6e 2d 3e 72 65 67 41 70 70 2b 31 29 3b 0a 20 20  n->regApp+1);.  
dfd0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
dfe0: 20 20 72 65 67 41 72 67 20 3d 20 70 50 61 72 73    regArg = pPars
dff0: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 70 50 61  e->nMem+1;.  pPa
e000: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 41 72  rse->nMem += nAr
e010: 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 67 41  g;.  return regA
e020: 72 67 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65  rg;.}../* .** Re
e030: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
e040: 20 63 75 72 72 65 6e 74 20 66 72 61 6d 65 20 73   current frame s
e050: 68 6f 75 6c 64 20 62 65 20 63 61 63 68 65 64 20  hould be cached 
e060: 69 6e 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  in the ephemeral
e070: 20 74 61 62 6c 65 2c 0a 2a 2a 20 65 76 65 6e 20   table,.** even 
e080: 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  if there are no 
e090: 78 49 6e 76 65 72 73 65 28 29 20 63 61 6c 6c 73  xInverse() calls
e0a0: 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74   required..*/.st
e0b0: 61 74 69 63 20 69 6e 74 20 77 69 6e 64 6f 77 43  atic int windowC
e0c0: 61 63 68 65 46 72 61 6d 65 28 57 69 6e 64 6f 77  acheFrame(Window
e0d0: 20 2a 70 4d 57 69 6e 29 7b 0a 20 20 57 69 6e 64   *pMWin){.  Wind
e0e0: 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 69 66 28 20  ow *pWin;.  if( 
e0f0: 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72 74 52  pMWin->regStartR
e100: 6f 77 69 64 20 29 20 72 65 74 75 72 6e 20 31 3b  owid ) return 1;
e110: 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69  .  for(pWin=pMWi
e120: 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57  n; pWin; pWin=pW
e130: 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20  in->pNextWin){. 
e140: 20 20 20 46 75 6e 63 44 65 66 20 2a 70 46 75 6e     FuncDef *pFun
e150: 63 20 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63 3b  c = pWin->pFunc;
e160: 0a 20 20 20 20 69 66 28 20 28 70 46 75 6e 63 2d  .    if( (pFunc-
e170: 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75  >zName==nth_valu
e180: 65 4e 61 6d 65 29 0a 20 20 20 20 20 7c 7c 20 28  eName).     || (
e190: 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69  pFunc->zName==fi
e1a0: 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65 29 0a 20  rst_valueName). 
e1b0: 20 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d 3e 7a      || (pFunc->z
e1c0: 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65 29 0a  Name==leadName).
e1d0: 20 20 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d 3e       || (pFunc->
e1e0: 7a 4e 61 6d 65 3d 3d 6c 61 67 4e 61 6d 65 29 0a  zName==lagName).
e1f0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
e200: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
e210: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
e220: 2f 2a 0a 2a 2a 20 72 65 67 4f 6c 64 20 61 6e 64  /*.** regOld and
e230: 20 72 65 67 4e 65 77 20 61 72 65 20 65 61 63 68   regNew are each
e240: 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73   the first regis
e250: 74 65 72 20 69 6e 20 61 6e 20 61 72 72 61 79 20  ter in an array 
e260: 6f 66 20 73 69 7a 65 0a 2a 2a 20 70 4f 72 64 65  of size.** pOrde
e270: 72 42 79 2d 3e 6e 45 78 70 72 2e 20 54 68 69 73  rBy->nExpr. This
e280: 20 66 75 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61   function genera
e290: 74 65 73 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70  tes code to comp
e2a0: 61 72 65 20 74 68 65 20 74 77 6f 0a 2a 2a 20 61  are the two.** a
e2b0: 72 72 61 79 73 20 6f 66 20 72 65 67 69 73 74 65  rrays of registe
e2c0: 72 73 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c  rs using the col
e2d0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73  lation sequences
e2e0: 20 61 6e 64 20 6f 74 68 65 72 20 63 6f 6d 70 61   and other compa
e2f0: 72 69 73 6f 6e 0a 2a 2a 20 70 61 72 61 6d 65 74  rison.** paramet
e300: 65 72 73 20 73 70 65 63 69 66 69 65 64 20 62 79  ers specified by
e310: 20 70 4f 72 64 65 72 42 79 2e 20 0a 2a 2a 0a 2a   pOrderBy. .**.*
e320: 2a 20 49 66 20 74 68 65 20 74 77 6f 20 61 72 72  * If the two arr
e330: 61 79 73 20 61 72 65 20 6e 6f 74 20 65 71 75 61  ays are not equa
e340: 6c 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  l, the contents 
e350: 6f 66 20 72 65 67 4e 65 77 20 69 73 20 63 6f 70  of regNew is cop
e360: 69 65 64 20 74 6f 20 0a 2a 2a 20 72 65 67 4f 6c  ied to .** regOl
e370: 64 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 66 61  d and control fa
e380: 6c 6c 73 20 74 68 72 6f 75 67 68 2e 20 4f 74 68  lls through. Oth
e390: 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 63  erwise, if the c
e3a0: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 61  ontents of the a
e3b0: 72 72 61 79 73 0a 2a 2a 20 61 72 65 20 65 71 75  rrays.** are equ
e3c0: 61 6c 2c 20 61 6e 20 4f 50 5f 47 6f 74 6f 20 69  al, an OP_Goto i
e3d0: 73 20 65 78 65 63 75 74 65 64 2e 20 54 68 65 20  s executed. The 
e3e0: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f  address of the O
e3f0: 50 5f 47 6f 74 6f 20 69 73 20 72 65 74 75 72 6e  P_Goto is return
e400: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
e410: 69 64 20 77 69 6e 64 6f 77 49 66 4e 65 77 50 65  id windowIfNewPe
e420: 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  er(.  Parse *pPa
e430: 72 73 65 2c 0a 20 20 45 78 70 72 4c 69 73 74 20  rse,.  ExprList 
e440: 2a 70 4f 72 64 65 72 42 79 2c 0a 20 20 69 6e 74  *pOrderBy,.  int
e450: 20 72 65 67 4e 65 77 2c 20 20 20 20 20 20 20 20   regNew,        
e460: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e470: 46 69 72 73 74 20 69 6e 20 61 72 72 61 79 20 6f  First in array o
e480: 66 20 6e 65 77 20 76 61 6c 75 65 73 20 2a 2f 0a  f new values */.
e490: 20 20 69 6e 74 20 72 65 67 4f 6c 64 2c 20 20 20    int regOld,   
e4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4b0: 20 20 2f 2a 20 46 69 72 73 74 20 69 6e 20 61 72    /* First in ar
e4c0: 72 61 79 20 6f 66 20 6f 6c 64 20 76 61 6c 75 65  ray of old value
e4d0: 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 20  s */.  int addr 
e4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4f0: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
e500: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  ere */.){.  Vdbe
e510: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
e520: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
e530: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
e540: 20 20 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 70      int nVal = p
e550: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
e560: 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
e570: 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
e580: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
e590: 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  st(pParse, pOrde
e5a0: 72 42 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  rBy, 0, 0);.    
e5b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e5c0: 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  3(v, OP_Compare,
e5d0: 20 72 65 67 4f 6c 64 2c 20 72 65 67 4e 65 77 2c   regOld, regNew,
e5e0: 20 6e 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69   nVal);.    sqli
e5f0: 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
e600: 76 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e  v, (void*)pKeyIn
e610: 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
e620: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
e630: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
e640: 70 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p, .      sqlite
e650: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
e660: 28 76 29 2b 31 2c 20 61 64 64 72 2c 20 73 71 6c  (v)+1, addr, sql
e670: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
e680: 64 64 72 28 76 29 2b 31 0a 20 20 20 20 29 3b 0a  ddr(v)+1.    );.
e690: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
e6a0: 45 71 4e 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  EqNe(v);.    sql
e6b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
e6c0: 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4e 65  , OP_Copy, regNe
e6d0: 77 2c 20 72 65 67 4f 6c 64 2c 20 6e 56 61 6c 2d  w, regOld, nVal-
e6e0: 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
e6f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e700: 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
e710: 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  , addr);.  }.}..
e720: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
e730: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73  ion is called as
e740: 20 70 61 72 74 20 6f 66 20 67 65 6e 65 72 61 74   part of generat
e750: 69 6e 67 20 56 4d 20 70 72 6f 67 72 61 6d 73 20  ing VM programs 
e760: 66 6f 72 20 52 41 4e 47 45 0a 2a 2a 20 6f 66 66  for RANGE.** off
e770: 73 65 74 20 50 52 45 43 45 44 49 4e 47 2f 46 4f  set PRECEDING/FO
e780: 4c 4c 4f 57 49 4e 47 20 66 72 61 6d 65 20 62 6f  LLOWING frame bo
e790: 75 6e 64 61 72 69 65 73 2e 20 41 73 73 75 6d 69  undaries. Assumi
e7a0: 6e 67 20 22 41 53 43 22 20 6f 72 64 65 72 20 66  ng "ASC" order f
e7b0: 6f 72 0a 2a 2a 20 74 68 65 20 4f 52 44 45 52 20  or.** the ORDER 
e7c0: 42 59 20 74 65 72 6d 20 69 6e 20 74 68 65 20 77  BY term in the w
e7d0: 69 6e 64 6f 77 2c 20 69 74 20 67 65 6e 65 72 61  indow, it genera
e7e0: 74 65 73 20 63 6f 64 65 20 65 71 75 69 76 61 6c  tes code equival
e7f0: 65 6e 74 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20  ent to:.**.**   
e800: 69 66 28 20 63 73 72 31 2e 70 65 65 72 56 61 6c  if( csr1.peerVal
e810: 20 2b 20 72 65 67 56 61 6c 20 3e 3d 20 63 73 72   + regVal >= csr
e820: 32 2e 70 65 65 72 56 61 6c 20 29 20 67 6f 74 6f  2.peerVal ) goto
e830: 20 6c 62 6c 3b 0a 2a 2a 0a 2a 2a 20 41 20 73 70   lbl;.**.** A sp
e840: 65 63 69 61 6c 20 74 79 70 65 20 6f 66 20 61 72  ecial type of ar
e850: 69 74 68 6d 65 74 69 63 20 69 73 20 75 73 65 64  ithmetic is used
e860: 20 73 75 63 68 20 74 68 61 74 20 69 66 20 63 73   such that if cs
e870: 72 2e 70 65 65 72 56 61 6c 20 69 73 20 6e 6f 74  r.peerVal is not
e880: 0a 2a 2a 20 61 20 6e 75 6d 65 72 69 63 20 74 79  .** a numeric ty
e890: 70 65 20 28 72 65 61 6c 20 6f 72 20 69 6e 74 65  pe (real or inte
e8a0: 67 65 72 29 2c 20 74 68 65 6e 20 74 68 65 20 72  ger), then the r
e8b0: 65 73 75 6c 74 20 6f 66 20 74 68 65 20 61 64 64  esult of the add
e8c0: 69 74 69 6f 6e 20 69 73 0a 2a 2a 20 61 20 63 6f  ition is.** a co
e8d0: 70 79 20 6f 66 20 63 73 72 31 2e 70 65 65 72 56  py of csr1.peerV
e8e0: 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  al..*/.static vo
e8f0: 69 64 20 77 69 6e 64 6f 77 43 6f 64 65 52 61 6e  id windowCodeRan
e900: 67 65 54 65 73 74 28 0a 20 20 57 69 6e 64 6f 77  geTest(.  Window
e910: 43 6f 64 65 41 72 67 20 2a 70 2c 20 0a 20 20 69  CodeArg *p, .  i
e920: 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
e930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e940: 2f 2a 20 4f 50 5f 47 65 20 6f 72 20 4f 50 5f 47  /* OP_Ge or OP_G
e950: 74 20 2a 2f 0a 20 20 69 6e 74 20 63 73 72 31 2c  t */.  int csr1,
e960: 20 0a 20 20 69 6e 74 20 72 65 67 56 61 6c 2c 20   .  int regVal, 
e970: 0a 20 20 69 6e 74 20 63 73 72 32 2c 0a 20 20 69  .  int csr2,.  i
e980: 6e 74 20 6c 62 6c 0a 29 7b 0a 20 20 50 61 72 73  nt lbl.){.  Pars
e990: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70  e *pParse = p->p
e9a0: 50 61 72 73 65 3b 0a 20 20 56 64 62 65 20 2a 76  Parse;.  Vdbe *v
e9b0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
e9c0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  e(pParse);.  int
e9d0: 20 72 65 67 31 20 3d 20 73 71 6c 69 74 65 33 47   reg1 = sqlite3G
e9e0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
e9f0: 29 3b 0a 20 20 69 6e 74 20 72 65 67 32 20 3d 20  );.  int reg2 = 
ea00: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
ea10: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  g(pParse);.  int
ea20: 20 61 72 69 74 68 20 3d 20 4f 50 5f 41 64 64 3b   arith = OP_Add;
ea30: 0a 20 20 69 6e 74 20 61 64 64 72 47 65 3b 0a 0a  .  int addrGe;..
ea40: 20 20 69 6e 74 20 72 65 67 53 74 72 69 6e 67 20    int regString 
ea50: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
ea60: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d  ;..  assert( op=
ea70: 3d 4f 50 5f 47 65 20 7c 7c 20 6f 70 3d 3d 4f 50  =OP_Ge || op==OP
ea80: 5f 47 74 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65  _Gt || op==OP_Le
ea90: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
eaa0: 3e 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79  >pMWin->pOrderBy
eab0: 20 26 26 20 70 2d 3e 70 4d 57 69 6e 2d 3e 70 4f   && p->pMWin->pO
eac0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 31  rderBy->nExpr==1
ead0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4d 57   );.  if( p->pMW
eae0: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b  in->pOrderBy->a[
eaf0: 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 7b 0a  0].sortOrder ){.
eb00: 20 20 20 20 73 77 69 74 63 68 28 20 6f 70 20 29      switch( op )
eb10: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  {.      case OP_
eb20: 47 65 3a 20 6f 70 20 3d 20 4f 50 5f 4c 65 3b 20  Ge: op = OP_Le; 
eb30: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
eb40: 65 20 4f 50 5f 47 74 3a 20 6f 70 20 3d 20 4f 50  e OP_Gt: op = OP
eb50: 5f 4c 74 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  _Lt; break;.    
eb60: 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72    default: asser
eb70: 74 28 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 20  t( op==OP_Le ); 
eb80: 6f 70 20 3d 20 4f 50 5f 47 65 3b 20 62 72 65 61  op = OP_Ge; brea
eb90: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 72 69  k;.    }.    ari
eba0: 74 68 20 3d 20 4f 50 5f 53 75 62 74 72 61 63 74  th = OP_Subtract
ebb0: 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 64 6f 77 52  ;.  }..  windowR
ebc0: 65 61 64 50 65 65 72 56 61 6c 75 65 73 28 70 2c  eadPeerValues(p,
ebd0: 20 63 73 72 31 2c 20 72 65 67 31 29 3b 0a 20 20   csr1, reg1);.  
ebe0: 77 69 6e 64 6f 77 52 65 61 64 50 65 65 72 56 61  windowReadPeerVa
ebf0: 6c 75 65 73 28 70 2c 20 63 73 72 32 2c 20 72 65  lues(p, csr2, re
ec00: 67 32 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  g2);..  /* Check
ec10: 20 69 66 20 74 68 65 20 70 65 65 72 20 76 61 6c   if the peer val
ec20: 75 65 20 66 6f 72 20 63 73 72 31 20 76 61 6c 75  ue for csr1 valu
ec30: 65 20 69 73 20 61 20 74 65 78 74 20 6f 72 20 62  e is a text or b
ec40: 6c 6f 62 20 62 79 20 63 6f 6d 70 61 72 69 6e 67  lob by comparing
ec50: 0a 20 20 2a 2a 20 69 74 20 74 6f 20 74 68 65 20  .  ** it to the 
ec60: 73 6d 61 6c 6c 65 73 74 20 70 6f 73 73 69 62 6c  smallest possibl
ec70: 65 20 73 74 72 69 6e 67 20 2d 20 27 27 2e 20 49  e string - ''. I
ec80: 66 20 69 74 20 69 73 2c 20 6a 75 6d 70 20 6f 76  f it is, jump ov
ec90: 65 72 20 74 68 65 0a 20 20 2a 2a 20 4f 50 5f 41  er the.  ** OP_A
eca0: 64 64 20 6f 72 20 4f 50 5f 53 75 62 74 72 61 63  dd or OP_Subtrac
ecb0: 74 20 6f 70 65 72 61 74 69 6f 6e 20 61 6e 64 20  t operation and 
ecc0: 70 72 6f 63 65 65 64 20 64 69 72 65 63 74 6c 79  proceed directly
ecd0: 20 74 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73   to the comparis
ece0: 6f 6e 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  on. */.  sqlite3
ecf0: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
ed00: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 72 65 67  _String8, 0, reg
ed10: 53 74 72 69 6e 67 2c 20 30 2c 20 22 22 2c 20 50  String, 0, "", P
ed20: 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 61 64 64  4_STATIC);.  add
ed30: 72 47 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  rGe = sqlite3Vdb
ed40: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 47 65  eAddOp3(v, OP_Ge
ed50: 2c 20 72 65 67 53 74 72 69 6e 67 2c 20 30 2c 20  , regString, 0, 
ed60: 72 65 67 31 29 3b 0a 20 20 56 64 62 65 43 6f 76  reg1);.  VdbeCov
ed70: 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
ed80: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
ed90: 20 61 72 69 74 68 2c 20 72 65 67 56 61 6c 2c 20   arith, regVal, 
eda0: 72 65 67 31 2c 20 72 65 67 31 29 3b 0a 20 20 73  reg1, reg1);.  s
edb0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
edc0: 72 65 28 76 2c 20 61 64 64 72 47 65 29 3b 0a 20  re(v, addrGe);. 
edd0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ede0: 70 33 28 76 2c 20 6f 70 2c 20 72 65 67 32 2c 20  p3(v, op, reg2, 
edf0: 6c 62 6c 2c 20 72 65 67 31 29 3b 20 56 64 62 65  lbl, reg1); Vdbe
ee00: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
ee10: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
ee20: 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c  P5(v, SQLITE_NUL
ee30: 4c 45 51 29 3b 0a 20 20 61 73 73 65 72 74 28 20  LEQ);.  assert( 
ee40: 6f 70 3d 3d 4f 50 5f 47 65 20 7c 7c 20 6f 70 3d  op==OP_Ge || op=
ee50: 3d 4f 50 5f 47 74 20 7c 7c 20 6f 70 3d 3d 4f 50  =OP_Gt || op==OP
ee60: 5f 4c 74 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65  _Lt || op==OP_Le
ee70: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 6f   );.  testcase(o
ee80: 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43  p==OP_Ge); VdbeC
ee90: 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
eea0: 3d 4f 50 5f 47 65 29 3b 0a 20 20 74 65 73 74 63  =OP_Ge);.  testc
eeb0: 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20  ase(op==OP_Lt); 
eec0: 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
eed0: 2c 20 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20  , op==OP_Lt);.  
eee0: 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
eef0: 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Le); VdbeCoverag
ef00: 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4c 65  eIf(v, op==OP_Le
ef10: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 6f 70  );.  testcase(op
ef20: 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f  ==OP_Gt); VdbeCo
ef30: 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
ef40: 4f 50 5f 47 74 29 3b 0a 0a 20 20 73 71 6c 69 74  OP_Gt);..  sqlit
ef50: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
ef60: 28 70 50 61 72 73 65 2c 20 72 65 67 31 29 3b 0a  (pParse, reg1);.
ef70: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
ef80: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
ef90: 72 65 67 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  reg2);.}../*.** 
efa0: 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20  Helper function 
efb0: 66 6f 72 20 73 71 6c 69 74 65 33 57 69 6e 64 6f  for sqlite3Windo
efc0: 77 43 6f 64 65 53 74 65 70 28 29 2e 20 45 61 63  wCodeStep(). Eac
efd0: 68 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 66  h call to this f
efe0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 67 65 6e 65 72  unction.** gener
eff0: 61 74 65 73 20 56 4d 20 63 6f 64 65 20 66 6f 72  ates VM code for
f000: 20 61 20 73 69 6e 67 6c 65 20 52 45 54 55 52 4e   a single RETURN
f010: 5f 52 4f 57 2c 20 41 47 47 53 54 45 50 20 6f 72  _ROW, AGGSTEP or
f020: 20 41 47 47 49 4e 56 45 52 53 45 20 0a 2a 2a 20   AGGINVERSE .** 
f030: 6f 70 65 72 61 74 69 6f 6e 2e 20 52 65 66 65 72  operation. Refer
f040: 20 74 6f 20 74 68 65 20 68 65 61 64 65 72 20 63   to the header c
f050: 6f 6d 6d 65 6e 74 20 66 6f 72 20 73 71 6c 69 74  omment for sqlit
f060: 65 33 57 69 6e 64 6f 77 43 6f 64 65 53 74 65 70  e3WindowCodeStep
f070: 28 29 20 66 6f 72 0a 2a 2a 20 64 65 74 61 69 6c  () for.** detail
f080: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
f090: 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 0a 20   windowCodeOp(. 
f0a0: 57 69 6e 64 6f 77 43 6f 64 65 41 72 67 20 2a 70  WindowCodeArg *p
f0b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f0c0: 20 2f 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65   /* Context obje
f0d0: 63 74 20 2a 2f 0a 20 69 6e 74 20 6f 70 2c 20 20  ct */. int op,  
f0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0f0: 20 20 20 20 20 20 20 20 2f 2a 20 57 49 4e 44 4f          /* WINDO
f100: 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 41 47  W_RETURN_ROW, AG
f110: 47 53 54 45 50 20 6f 72 20 41 47 47 49 4e 56 45  GSTEP or AGGINVE
f120: 52 53 45 20 2a 2f 0a 20 69 6e 74 20 72 65 67 43  RSE */. int regC
f130: 6f 75 6e 74 64 6f 77 6e 2c 20 20 20 20 20 20 20  ountdown,       
f140: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
f150: 73 74 65 72 20 66 6f 72 20 4f 50 5f 49 66 50 6f  ster for OP_IfPo
f160: 73 20 63 6f 75 6e 74 64 6f 77 6e 20 2a 2f 0a 20  s countdown */. 
f170: 69 6e 74 20 6a 75 6d 70 4f 6e 45 6f 66 20 20 20  int jumpOnEof   
f180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f190: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
f1a0: 20 73 74 65 70 70 65 64 20 63 75 72 73 6f 72 20   stepped cursor 
f1b0: 72 65 61 63 68 65 73 20 45 4f 46 20 2a 2f 0a 29  reaches EOF */.)
f1c0: 7b 0a 20 20 69 6e 74 20 63 73 72 2c 20 72 65 67  {.  int csr, reg
f1d0: 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  ;.  Parse *pPars
f1e0: 65 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a 20  e = p->pParse;. 
f1f0: 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d   Window *pMWin =
f200: 20 70 2d 3e 70 4d 57 69 6e 3b 0a 20 20 69 6e 74   p->pMWin;.  int
f210: 20 72 65 74 20 3d 20 30 3b 0a 20 20 56 64 62 65   ret = 0;.  Vdbe
f220: 20 2a 76 20 3d 20 70 2d 3e 70 56 64 62 65 3b 0a   *v = p->pVdbe;.
f230: 20 20 69 6e 74 20 61 64 64 72 49 66 20 3d 20 30    int addrIf = 0
f240: 3b 20 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e  ; .  int addrCon
f250: 74 69 6e 75 65 20 3d 20 30 3b 0a 20 20 69 6e 74  tinue = 0;.  int
f260: 20 61 64 64 72 47 6f 74 6f 20 3d 20 30 3b 0a 20   addrGoto = 0;. 
f270: 20 69 6e 74 20 62 50 65 65 72 20 3d 20 28 70 4d   int bPeer = (pM
f280: 57 69 6e 2d 3e 65 46 72 6d 54 79 70 65 21 3d 54  Win->eFrmType!=T
f290: 4b 5f 52 4f 57 53 29 3b 0a 0a 20 20 69 6e 74 20  K_ROWS);..  int 
f2a0: 6c 62 6c 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65  lblDone = sqlite
f2b0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70  3VdbeMakeLabel(p
f2c0: 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 61 64  Parse);.  int ad
f2d0: 64 72 4e 65 78 74 52 61 6e 67 65 20 3d 20 30 3b  drNextRange = 0;
f2e0: 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63  ..  /* Special c
f2f0: 61 73 65 20 2d 20 57 49 4e 44 4f 57 5f 41 47 47  ase - WINDOW_AGG
f300: 49 4e 56 45 52 53 45 20 69 73 20 61 6c 77 61 79  INVERSE is alway
f310: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
f320: 20 66 72 61 6d 65 0a 20 20 2a 2a 20 73 74 61 72   frame.  ** star
f330: 74 73 20 77 69 74 68 20 55 4e 42 4f 55 4e 44 45  ts with UNBOUNDE
f340: 44 20 50 52 45 43 45 44 49 4e 47 2e 20 2a 2f 0a  D PRECEDING. */.
f350: 20 20 69 66 28 20 6f 70 3d 3d 57 49 4e 44 4f 57    if( op==WINDOW
f360: 5f 41 47 47 49 4e 56 45 52 53 45 20 26 26 20 70  _AGGINVERSE && p
f370: 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
f380: 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20  _UNBOUNDED ){.  
f390: 20 20 61 73 73 65 72 74 28 20 72 65 67 43 6f 75    assert( regCou
f3a0: 6e 74 64 6f 77 6e 3d 3d 30 20 26 26 20 6a 75 6d  ntdown==0 && jum
f3b0: 70 4f 6e 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 20  pOnEof==0 );.   
f3c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
f3d0: 20 20 69 66 28 20 72 65 67 43 6f 75 6e 74 64 6f    if( regCountdo
f3e0: 77 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20  wn>0 ){.    if( 
f3f0: 70 4d 57 69 6e 2d 3e 65 46 72 6d 54 79 70 65 3d  pMWin->eFrmType=
f400: 3d 54 4b 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20  =TK_RANGE ){.   
f410: 20 20 20 61 64 64 72 4e 65 78 74 52 61 6e 67 65     addrNextRange
f420: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
f430: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
f440: 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d      assert( op==
f450: 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53  WINDOW_AGGINVERS
f460: 45 20 7c 7c 20 6f 70 3d 3d 57 49 4e 44 4f 57 5f  E || op==WINDOW_
f470: 41 47 47 53 54 45 50 20 29 3b 0a 20 20 20 20 20  AGGSTEP );.     
f480: 20 69 66 28 20 6f 70 3d 3d 57 49 4e 44 4f 57 5f   if( op==WINDOW_
f490: 41 47 47 49 4e 56 45 52 53 45 20 29 7b 0a 20 20  AGGINVERSE ){.  
f4a0: 20 20 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d        if( pMWin-
f4b0: 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c  >eStart==TK_FOLL
f4c0: 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 20  OWING ){.       
f4d0: 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 52 61 6e     windowCodeRan
f4e0: 67 65 54 65 73 74 28 0a 20 20 20 20 20 20 20 20  geTest(.        
f4f0: 20 20 20 20 20 20 70 2c 20 4f 50 5f 4c 65 2c 20        p, OP_Le, 
f500: 70 2d 3e 63 75 72 72 65 6e 74 2e 63 73 72 2c 20  p->current.csr, 
f510: 72 65 67 43 6f 75 6e 74 64 6f 77 6e 2c 20 70 2d  regCountdown, p-
f520: 3e 73 74 61 72 74 2e 63 73 72 2c 20 6c 62 6c 44  >start.csr, lblD
f530: 6f 6e 65 0a 20 20 20 20 20 20 20 20 20 20 29 3b  one.          );
f540: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
f550: 20 20 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77            window
f560: 43 6f 64 65 52 61 6e 67 65 54 65 73 74 28 0a 20  CodeRangeTest(. 
f570: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20               p, 
f580: 4f 50 5f 47 65 2c 20 70 2d 3e 73 74 61 72 74 2e  OP_Ge, p->start.
f590: 63 73 72 2c 20 72 65 67 43 6f 75 6e 74 64 6f 77  csr, regCountdow
f5a0: 6e 2c 20 70 2d 3e 63 75 72 72 65 6e 74 2e 63 73  n, p->current.cs
f5b0: 72 2c 20 6c 62 6c 44 6f 6e 65 0a 20 20 20 20 20  r, lblDone.     
f5c0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
f5d0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
f5e0: 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64         windowCod
f5f0: 65 52 61 6e 67 65 54 65 73 74 28 0a 20 20 20 20  eRangeTest(.    
f600: 20 20 20 20 20 20 20 20 70 2c 20 4f 50 5f 47 74          p, OP_Gt
f610: 2c 20 70 2d 3e 65 6e 64 2e 63 73 72 2c 20 72 65  , p->end.csr, re
f620: 67 43 6f 75 6e 74 64 6f 77 6e 2c 20 70 2d 3e 63  gCountdown, p->c
f630: 75 72 72 65 6e 74 2e 63 73 72 2c 20 6c 62 6c 44  urrent.csr, lblD
f640: 6f 6e 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  one.        );. 
f650: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
f660: 7b 0a 20 20 20 20 20 20 61 64 64 72 49 66 20 3d  {.      addrIf =
f670: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f680: 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p3(v, OP_IfPos, 
f690: 72 65 67 43 6f 75 6e 74 64 6f 77 6e 2c 20 30 2c  regCountdown, 0,
f6a0: 20 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43   1);.      VdbeC
f6b0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
f6c0: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f 70 3d  }.  }..  if( op=
f6d0: 3d 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52  =WINDOW_RETURN_R
f6e0: 4f 57 20 26 26 20 70 4d 57 69 6e 2d 3e 72 65 67  OW && pMWin->reg
f6f0: 53 74 61 72 74 52 6f 77 69 64 3d 3d 30 20 29 7b  StartRowid==0 ){
f700: 0a 20 20 20 20 77 69 6e 64 6f 77 41 67 67 46 69  .    windowAggFi
f710: 6e 61 6c 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20  nal(p, 0);.  }. 
f720: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 20 3d 20   addrContinue = 
f730: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
f740: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 73 77 69  ntAddr(v);.  swi
f750: 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
f760: 61 73 65 20 57 49 4e 44 4f 57 5f 52 45 54 55 52  ase WINDOW_RETUR
f770: 4e 5f 52 4f 57 3a 0a 20 20 20 20 20 20 63 73 72  N_ROW:.      csr
f780: 20 3d 20 70 2d 3e 63 75 72 72 65 6e 74 2e 63 73   = p->current.cs
f790: 72 3b 0a 20 20 20 20 20 20 72 65 67 20 3d 20 70  r;.      reg = p
f7a0: 2d 3e 63 75 72 72 65 6e 74 2e 72 65 67 3b 0a 20  ->current.reg;. 
f7b0: 20 20 20 20 20 77 69 6e 64 6f 77 52 65 74 75 72       windowRetur
f7c0: 6e 4f 6e 65 52 6f 77 28 70 29 3b 0a 20 20 20 20  nOneRow(p);.    
f7d0: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
f7e0: 73 65 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56  se WINDOW_AGGINV
f7f0: 45 52 53 45 3a 0a 20 20 20 20 20 20 63 73 72 20  ERSE:.      csr 
f800: 3d 20 70 2d 3e 73 74 61 72 74 2e 63 73 72 3b 0a  = p->start.csr;.
f810: 20 20 20 20 20 20 72 65 67 20 3d 20 70 2d 3e 73        reg = p->s
f820: 74 61 72 74 2e 72 65 67 3b 0a 20 20 20 20 20 20  tart.reg;.      
f830: 69 66 28 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74  if( pMWin->regSt
f840: 61 72 74 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  artRowid ){.    
f850: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 57 69      assert( pMWi
f860: 6e 2d 3e 72 65 67 45 6e 64 52 6f 77 69 64 20 29  n->regEndRowid )
f870: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
f880: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
f890: 50 5f 41 64 64 49 6d 6d 2c 20 70 4d 57 69 6e 2d  P_AddImm, pMWin-
f8a0: 3e 72 65 67 53 74 61 72 74 52 6f 77 69 64 2c 20  >regStartRowid, 
f8b0: 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
f8c0: 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 41  .        windowA
f8d0: 67 67 53 74 65 70 28 70 50 61 72 73 65 2c 20 70  ggStep(pParse, p
f8e0: 4d 57 69 6e 2c 20 63 73 72 2c 20 31 2c 20 70 2d  MWin, csr, 1, p-
f8f0: 3e 72 65 67 41 72 67 29 3b 0a 20 20 20 20 20 20  >regArg);.      
f900: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  }.      break;..
f910: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
f920: 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 57     assert( op==W
f930: 49 4e 44 4f 57 5f 41 47 47 53 54 45 50 20 29 3b  INDOW_AGGSTEP );
f940: 0a 20 20 20 20 20 20 63 73 72 20 3d 20 70 2d 3e  .      csr = p->
f950: 65 6e 64 2e 63 73 72 3b 0a 20 20 20 20 20 20 72  end.csr;.      r
f960: 65 67 20 3d 20 70 2d 3e 65 6e 64 2e 72 65 67 3b  eg = p->end.reg;
f970: 0a 20 20 20 20 20 20 69 66 28 20 70 4d 57 69 6e  .      if( pMWin
f980: 2d 3e 72 65 67 53 74 61 72 74 52 6f 77 69 64 20  ->regStartRowid 
f990: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
f9a0: 74 28 20 70 4d 57 69 6e 2d 3e 72 65 67 45 6e 64  t( pMWin->regEnd
f9b0: 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20  Rowid );.       
f9c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f9d0: 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
f9e0: 20 70 4d 57 69 6e 2d 3e 72 65 67 45 6e 64 52 6f   pMWin->regEndRo
f9f0: 77 69 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  wid, 1);.      }
fa00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 77 69  else{.        wi
fa10: 6e 64 6f 77 41 67 67 53 74 65 70 28 70 50 61 72  ndowAggStep(pPar
fa20: 73 65 2c 20 70 4d 57 69 6e 2c 20 63 73 72 2c 20  se, pMWin, csr, 
fa30: 30 2c 20 70 2d 3e 72 65 67 41 72 67 29 3b 0a 20  0, p->regArg);. 
fa40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
fa50: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f  ak;.  }..  if( o
fa60: 70 3d 3d 70 2d 3e 65 44 65 6c 65 74 65 20 29 7b  p==p->eDelete ){
fa70: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
fa80: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c  AddOp1(v, OP_Del
fa90: 65 74 65 2c 20 63 73 72 29 3b 0a 20 20 20 20 73  ete, csr);.    s
faa0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
fab0: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 53 41 56  P5(v, OPFLAG_SAV
fac0: 45 50 4f 53 49 54 49 4f 4e 29 3b 0a 20 20 7d 0a  EPOSITION);.  }.
fad0: 0a 20 20 69 66 28 20 6a 75 6d 70 4f 6e 45 6f 66  .  if( jumpOnEof
fae0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
faf0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
fb00: 4e 65 78 74 2c 20 63 73 72 2c 20 73 71 6c 69 74  Next, csr, sqlit
fb10: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
fb20: 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 56 64 62  r(v)+2);.    Vdb
fb30: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
fb40: 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33 56    ret = sqlite3V
fb50: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
fb60: 47 6f 74 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Goto);.  }else{.
fb70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fb80: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
fb90: 2c 20 63 73 72 2c 20 73 71 6c 69 74 65 33 56 64  , csr, sqlite3Vd
fba0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
fbb0: 2b 31 2b 62 50 65 65 72 29 3b 0a 20 20 20 20 56  +1+bPeer);.    V
fbc0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
fbd0: 20 20 20 20 69 66 28 20 62 50 65 65 72 20 29 7b      if( bPeer ){
fbe0: 0a 20 20 20 20 20 20 61 64 64 72 47 6f 74 6f 20  .      addrGoto 
fbf0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
fc00: 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b  Op0(v, OP_Goto);
fc10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
fc20: 28 20 62 50 65 65 72 20 29 7b 0a 20 20 20 20 69  ( bPeer ){.    i
fc30: 6e 74 20 6e 52 65 67 20 3d 20 28 70 4d 57 69 6e  nt nReg = (pMWin
fc40: 2d 3e 70 4f 72 64 65 72 42 79 20 3f 20 70 4d 57  ->pOrderBy ? pMW
fc50: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  in->pOrderBy->nE
fc60: 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 69 6e  xpr : 0);.    in
fc70: 74 20 72 65 67 54 6d 70 20 3d 20 28 6e 52 65 67  t regTmp = (nReg
fc80: 20 3f 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   ? sqlite3GetTem
fc90: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
fca0: 52 65 67 29 20 3a 20 30 29 3b 0a 20 20 20 20 77  Reg) : 0);.    w
fcb0: 69 6e 64 6f 77 52 65 61 64 50 65 65 72 56 61 6c  indowReadPeerVal
fcc0: 75 65 73 28 70 2c 20 63 73 72 2c 20 72 65 67 54  ues(p, csr, regT
fcd0: 6d 70 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 49  mp);.    windowI
fce0: 66 4e 65 77 50 65 65 72 28 70 50 61 72 73 65 2c  fNewPeer(pParse,
fcf0: 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79   pMWin->pOrderBy
fd00: 2c 20 72 65 67 54 6d 70 2c 20 72 65 67 2c 20 61  , regTmp, reg, a
fd10: 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  ddrContinue);.  
fd20: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
fd30: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
fd40: 2c 20 72 65 67 54 6d 70 2c 20 6e 52 65 67 29 3b  , regTmp, nReg);
fd50: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 61 64 64 72  .  }..  if( addr
fd60: 4e 65 78 74 52 61 6e 67 65 20 29 7b 0a 20 20 20  NextRange ){.   
fd70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fd80: 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
fd90: 2c 20 61 64 64 72 4e 65 78 74 52 61 6e 67 65 29  , addrNextRange)
fda0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
fdb0: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
fdc0: 76 2c 20 6c 62 6c 44 6f 6e 65 29 3b 0a 20 20 69  v, lblDone);.  i
fdd0: 66 28 20 61 64 64 72 47 6f 74 6f 20 29 20 73 71  f( addrGoto ) sq
fde0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
fdf0: 65 28 76 2c 20 61 64 64 72 47 6f 74 6f 29 3b 0a  e(v, addrGoto);.
fe00: 20 20 69 66 28 20 61 64 64 72 49 66 20 29 20 73    if( addrIf ) s
fe10: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
fe20: 72 65 28 76 2c 20 61 64 64 72 49 66 29 3b 0a 20  re(v, addrIf);. 
fe30: 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a   return ret;.}..
fe40: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
fe50: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64 75 70  and return a dup
fe60: 6c 69 63 61 74 65 20 6f 66 20 74 68 65 20 57 69  licate of the Wi
fe70: 6e 64 6f 77 20 6f 62 6a 65 63 74 20 69 6e 64 69  ndow object indi
fe80: 63 61 74 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  cated by the.** 
fe90: 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 2e 20  third argument. 
fea0: 53 65 74 20 74 68 65 20 57 69 6e 64 6f 77 2e 70  Set the Window.p
feb0: 4f 77 6e 65 72 20 66 69 65 6c 64 20 6f 66 20 74  Owner field of t
fec0: 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 74 6f  he new object to
fed0: 0a 2a 2a 20 70 4f 77 6e 65 72 2e 0a 2a 2f 0a 57  .** pOwner..*/.W
fee0: 69 6e 64 6f 77 20 2a 73 71 6c 69 74 65 33 57 69  indow *sqlite3Wi
fef0: 6e 64 6f 77 44 75 70 28 73 71 6c 69 74 65 33 20  ndowDup(sqlite3 
ff00: 2a 64 62 2c 20 45 78 70 72 20 2a 70 4f 77 6e 65  *db, Expr *pOwne
ff10: 72 2c 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20  r, Window *p){. 
ff20: 20 57 69 6e 64 6f 77 20 2a 70 4e 65 77 20 3d 20   Window *pNew = 
ff30: 30 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  0;.  if( ALWAYS(
ff40: 70 29 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d  p) ){.    pNew =
ff50: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
ff60: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
ff70: 57 69 6e 64 6f 77 29 29 3b 0a 20 20 20 20 69 66  Window));.    if
ff80: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
ff90: 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  pNew->zName = sq
ffa0: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
ffb0: 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  , p->zName);.   
ffc0: 20 20 20 70 4e 65 77 2d 3e 70 46 69 6c 74 65 72     pNew->pFilter
ffd0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
ffe0: 70 28 64 62 2c 20 70 2d 3e 70 46 69 6c 74 65 72  p(db, p->pFilter
fff0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  , 0);.      pNew
10000 2d 3e 70 46 75 6e 63 20 3d 20 70 2d 3e 70 46 75  ->pFunc = p->pFu
10010 6e 63 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  nc;.      pNew->
10020 70 50 61 72 74 69 74 69 6f 6e 20 3d 20 73 71 6c  pPartition = sql
10030 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
10040 64 62 2c 20 70 2d 3e 70 50 61 72 74 69 74 69 6f  db, p->pPartitio
10050 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65  n, 0);.      pNe
10060 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71  w->pOrderBy = sq
10070 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
10080 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
10090 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  , 0);.      pNew
100a0 2d 3e 65 46 72 6d 54 79 70 65 20 3d 20 70 2d 3e  ->eFrmType = p->
100b0 65 46 72 6d 54 79 70 65 3b 0a 20 20 20 20 20 20  eFrmType;.      
100c0 70 4e 65 77 2d 3e 65 45 6e 64 20 3d 20 70 2d 3e  pNew->eEnd = p->
100d0 65 45 6e 64 3b 0a 20 20 20 20 20 20 70 4e 65 77  eEnd;.      pNew
100e0 2d 3e 65 53 74 61 72 74 20 3d 20 70 2d 3e 65 53  ->eStart = p->eS
100f0 74 61 72 74 3b 0a 20 20 20 20 20 20 70 4e 65 77  tart;.      pNew
10100 2d 3e 65 45 78 63 6c 75 64 65 20 3d 20 70 2d 3e  ->eExclude = p->
10110 65 45 78 63 6c 75 64 65 3b 0a 20 20 20 20 20 20  eExclude;.      
10120 70 4e 65 77 2d 3e 70 53 74 61 72 74 20 3d 20 73  pNew->pStart = s
10130 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
10140 2c 20 70 2d 3e 70 53 74 61 72 74 2c 20 30 29 3b  , p->pStart, 0);
10150 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 45 6e  .      pNew->pEn
10160 64 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  d = sqlite3ExprD
10170 75 70 28 64 62 2c 20 70 2d 3e 70 45 6e 64 2c 20  up(db, p->pEnd, 
10180 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  0);.      pNew->
10190 70 4f 77 6e 65 72 20 3d 20 70 4f 77 6e 65 72 3b  pOwner = pOwner;
101a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
101b0 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
101c0 2a 2a 20 52 65 74 75 72 6e 20 61 20 63 6f 70 79  ** Return a copy
101d0 20 6f 66 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   of the linked l
101e0 69 73 74 20 6f 66 20 57 69 6e 64 6f 77 20 6f 62  ist of Window ob
101f0 6a 65 63 74 73 20 70 61 73 73 65 64 20 61 73 20  jects passed as 
10200 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 61 72  the.** second ar
10210 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 57 69 6e 64 6f  gument..*/.Windo
10220 77 20 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  w *sqlite3Window
10230 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20  ListDup(sqlite3 
10240 2a 64 62 2c 20 57 69 6e 64 6f 77 20 2a 70 29 7b  *db, Window *p){
10250 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b  .  Window *pWin;
10260 0a 20 20 57 69 6e 64 6f 77 20 2a 70 52 65 74 20  .  Window *pRet 
10270 3d 20 30 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 2a  = 0;.  Window **
10280 70 70 20 3d 20 26 70 52 65 74 3b 0a 0a 20 20 66  pp = &pRet;..  f
10290 6f 72 28 70 57 69 6e 3d 70 3b 20 70 57 69 6e 3b  or(pWin=p; pWin;
102a0 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78   pWin=pWin->pNex
102b0 74 57 69 6e 29 7b 0a 20 20 20 20 2a 70 70 20 3d  tWin){.    *pp =
102c0 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 75   sqlite3WindowDu
102d0 70 28 64 62 2c 20 30 2c 20 70 57 69 6e 29 3b 0a  p(db, 0, pWin);.
102e0 20 20 20 20 69 66 28 20 2a 70 70 3d 3d 30 20 29      if( *pp==0 )
102f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 70 20 3d   break;.    pp =
10300 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 57   &((*pp)->pNextW
10310 69 6e 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  in);.  }..  retu
10320 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pRet;.}../*.*
10330 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
10340 20 69 74 20 63 61 6e 20 62 65 20 64 65 74 65 72   it can be deter
10350 6d 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  mined at compile
10360 20 74 69 6d 65 20 74 68 61 74 20 65 78 70 72 65   time that expre
10370 73 73 69 6f 6e 20 0a 2a 2a 20 70 45 78 70 72 20  ssion .** pExpr 
10380 65 76 61 6c 75 61 74 65 73 20 74 6f 20 61 20 76  evaluates to a v
10390 61 6c 75 65 20 74 68 61 74 2c 20 77 68 65 6e 20  alue that, when 
103a0 63 61 73 74 20 74 6f 20 61 6e 20 69 6e 74 65 67  cast to an integ
103b0 65 72 2c 20 69 73 20 67 72 65 61 74 65 72 20 0a  er, is greater .
103c0 2a 2a 20 74 68 61 6e 20 7a 65 72 6f 2e 20 46 61  ** than zero. Fa
103d0 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  lse otherwise..*
103e0 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65  *.** If an OOM e
103f0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69  rror occurs, thi
10400 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20  s function sets 
10410 74 68 65 20 50 61 72 73 65 2e 64 62 2e 6d 61 6c  the Parse.db.mal
10420 6c 6f 63 46 61 69 6c 65 64 20 0a 2a 2a 20 66 6c  locFailed .** fl
10430 61 67 20 61 6e 64 20 72 65 74 75 72 6e 73 20 7a  ag and returns z
10440 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
10450 6e 74 20 77 69 6e 64 6f 77 45 78 70 72 47 74 5a  nt windowExprGtZ
10460 65 72 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73  ero(Parse *pPars
10470 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
10480 0a 20 20 69 6e 74 20 72 65 74 20 3d 20 30 3b 0a  .  int ret = 0;.
10490 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
104a0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73 71  pParse->db;.  sq
104b0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
104c0 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  l = 0;.  sqlite3
104d0 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 64 62  ValueFromExpr(db
104e0 2c 20 70 45 78 70 72 2c 20 64 62 2d 3e 65 6e 63  , pExpr, db->enc
104f0 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  , SQLITE_AFF_NUM
10500 45 52 49 43 2c 20 26 70 56 61 6c 29 3b 0a 20 20  ERIC, &pVal);.  
10510 69 66 28 20 70 56 61 6c 20 26 26 20 73 71 6c 69  if( pVal && sqli
10520 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 70 56  te3_value_int(pV
10530 61 6c 29 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  al)>0 ){.    ret
10540 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 1;.  }.  sqli
10550 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
10560 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 74  l);.  return ret
10570 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74  ;.}../*.** sqlit
10580 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 68  e3WhereBegin() h
10590 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
105a0 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 53  called for the S
105b0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
105c0 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74 68  .** passed as th
105d0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
105e0 74 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  t when this func
105f0 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 2e  tion is invoked.
10600 20 49 74 20 67 65 6e 65 72 61 74 65 73 0a 2a 2a   It generates.**
10610 20 63 6f 64 65 20 74 6f 20 70 6f 70 75 6c 61 74   code to populat
10620 65 20 74 68 65 20 57 69 6e 64 6f 77 2e 72 65 67  e the Window.reg
10630 52 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 20  Result register 
10640 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77 20  for each window 
10650 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 6e 64  function .** and
10660 20 69 6e 76 6f 6b 65 20 74 68 65 20 73 75 62 2d   invoke the sub-
10670 72 6f 75 74 69 6e 65 20 61 74 20 69 6e 73 74 72  routine at instr
10680 75 63 74 69 6f 6e 20 61 64 64 72 47 6f 73 75 62  uction addrGosub
10690 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 72   once for each r
106a0 6f 77 2e 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68  ow..** sqlite3Wh
106b0 65 72 65 45 6e 64 28 29 20 69 73 20 61 6c 77 61  ereEnd() is alwa
106c0 79 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  ys called before
106d0 20 72 65 74 75 72 6e 69 6e 67 2e 20 0a 2a 2a 0a   returning. .**.
106e0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
106f0 20 68 61 6e 64 6c 65 73 20 73 65 76 65 72 61 6c   handles several
10700 20 64 69 66 66 65 72 65 6e 74 20 74 79 70 65 73   different types
10710 20 6f 66 20 77 69 6e 64 6f 77 20 66 72 61 6d 65   of window frame
10720 73 2c 20 77 68 69 63 68 0a 2a 2a 20 72 65 71 75  s, which.** requ
10730 69 72 65 20 73 6c 69 67 68 74 6c 79 20 64 69 66  ire slightly dif
10740 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 69 6e  ferent processin
10750 67 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  g. The following
10760 20 70 73 65 75 64 6f 20 63 6f 64 65 20 69 73 0a   pseudo code is.
10770 2a 2a 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  ** used to imple
10780 6d 65 6e 74 20 77 69 6e 64 6f 77 20 66 72 61 6d  ment window fram
10790 65 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  es of the form:.
107a0 2a 2a 0a 2a 2a 20 20 20 52 4f 57 53 20 42 45 54  **.**   ROWS BET
107b0 57 45 45 4e 20 3c 65 78 70 72 31 3e 20 50 52 45  WEEN <expr1> PRE
107c0 43 45 44 49 4e 47 20 41 4e 44 20 3c 65 78 70 72  CEDING AND <expr
107d0 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a  2> FOLLOWING.**.
107e0 2a 2a 20 4f 74 68 65 72 20 77 69 6e 64 6f 77 20  ** Other window 
107f0 66 72 61 6d 65 20 74 79 70 65 73 20 75 73 65 20  frame types use 
10800 76 61 72 69 61 6e 74 73 20 6f 66 20 74 68 65 20  variants of the 
10810 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
10820 20 20 20 20 20 2e 2e 2e 20 6c 6f 6f 70 20 73 74       ... loop st
10830 61 72 74 65 64 20 62 79 20 73 71 6c 69 74 65 33  arted by sqlite3
10840 57 68 65 72 65 42 65 67 69 6e 28 29 20 2e 2e 2e  WhereBegin() ...
10850 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 6e 65  .**       if( ne
10860 77 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a  w partition ){.*
10870 2a 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20  *         Gosub 
10880 66 6c 75 73 68 0a 2a 2a 20 20 20 20 20 20 20 7d  flush.**       }
10890 0a 2a 2a 20 20 20 20 20 20 20 49 6e 73 65 72 74  .**       Insert
108a0 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20 65 70   new row into ep
108b0 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20  h table..**     
108c0 20 20 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20    .**       if( 
108d0 66 69 72 73 74 20 72 6f 77 20 6f 66 20 70 61 72  first row of par
108e0 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20  tition ){.**    
108f0 20 20 20 20 20 2f 2f 20 52 65 77 69 6e 64 20 74       // Rewind t
10900 68 72 65 65 20 63 75 72 73 6f 72 73 2c 20 61 6c  hree cursors, al
10910 6c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 65 70  l open on the ep
10920 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20  h table..**     
10930 20 20 20 20 52 65 77 69 6e 64 28 63 73 72 45 6e      Rewind(csrEn
10940 64 29 3b 0a 2a 2a 20 20 20 20 20 20 20 20 20 52  d);.**         R
10950 65 77 69 6e 64 28 63 73 72 53 74 61 72 74 29 3b  ewind(csrStart);
10960 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 65 77 69  .**         Rewi
10970 6e 64 28 63 73 72 43 75 72 72 65 6e 74 29 3b 0a  nd(csrCurrent);.
10980 2a 2a 20 20 20 20 20 20 20 0a 2a 2a 20 20 20 20  **       .**    
10990 20 20 20 20 20 72 65 67 45 6e 64 20 3d 20 3c 65       regEnd = <e
109a0 78 70 72 32 3e 20 20 20 20 20 20 20 20 20 20 2f  xpr2>          /
109b0 2f 20 46 4f 4c 4c 4f 57 49 4e 47 20 65 78 70 72  / FOLLOWING expr
109c0 65 73 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20  ession.**       
109d0 20 20 72 65 67 53 74 61 72 74 20 3d 20 3c 65 78    regStart = <ex
109e0 70 72 31 3e 20 20 20 20 20 20 20 20 2f 2f 20 50  pr1>        // P
109f0 52 45 43 45 44 49 4e 47 20 65 78 70 72 65 73 73  RECEDING express
10a00 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 7d 65 6c  ion.**       }el
10a10 73 65 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 2f  se{.**         /
10a20 2f 20 46 69 72 73 74 20 74 69 6d 65 20 74 68 69  / First time thi
10a30 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
10a40 6e 2c 20 74 68 65 20 65 70 68 20 74 61 62 6c 65  n, the eph table
10a50 20 63 6f 6e 74 61 69 6e 73 20 74 77 6f 20 0a 2a   contains two .*
10a60 2a 20 20 20 20 20 20 20 20 20 2f 2f 20 72 6f 77  *         // row
10a70 73 2e 20 54 68 65 20 66 69 72 73 74 20 72 6f 77  s. The first row
10a80 20 69 6e 20 74 68 65 20 70 61 72 74 69 74 69 6f   in the partitio
10a90 6e 2c 20 77 68 69 63 68 20 61 6c 6c 20 74 68 72  n, which all thr
10aa0 65 65 20 63 75 72 73 6f 72 73 0a 2a 2a 20 20 20  ee cursors.**   
10ab0 20 20 20 20 20 20 2f 2f 20 63 75 72 72 65 6e 74        // current
10ac0 6c 79 20 70 6f 69 6e 74 20 74 6f 2c 20 61 6e 64  ly point to, and
10ad0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   the following r
10ae0 6f 77 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 41  ow..**         A
10af0 47 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 20 20  GGSTEP.**       
10b00 20 20 69 66 28 20 28 72 65 67 45 6e 64 2d 2d 29    if( (regEnd--)
10b10 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  <=0 ){.**       
10b20 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a      RETURN_ROW.*
10b30 2a 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20  *           if( 
10b40 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20  (regStart--)<=0 
10b50 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ){.**           
10b60 20 20 41 47 47 49 4e 56 45 52 53 45 0a 2a 2a 20    AGGINVERSE.** 
10b70 20 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20            }.**  
10b80 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
10b90 20 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20    }.**     }.** 
10ba0 20 20 20 20 66 6c 75 73 68 3a 0a 2a 2a 20 20 20      flush:.**   
10bb0 20 20 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20      AGGSTEP.**  
10bc0 20 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b       while( 1 ){
10bd0 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 45 54 55  .**         RETU
10be0 52 4e 20 52 4f 57 0a 2a 2a 20 20 20 20 20 20 20  RN ROW.**       
10bf0 20 20 69 66 28 20 63 73 72 43 75 72 72 65 6e 74    if( csrCurrent
10c00 20 69 73 20 45 4f 46 20 29 20 62 72 65 61 6b 3b   is EOF ) break;
10c10 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 66 28 20  .**         if( 
10c20 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20  (regStart--)<=0 
10c30 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ){.**           
10c40 41 67 67 49 6e 76 65 72 73 65 28 63 73 72 53 74  AggInverse(csrSt
10c50 61 72 74 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  art).**         
10c60 20 20 4e 65 78 74 28 63 73 72 53 74 61 72 74 29    Next(csrStart)
10c70 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a  .**         }.**
10c80 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 54         }.**.** T
10c90 68 65 20 70 73 65 75 64 6f 2d 63 6f 64 65 20 61  he pseudo-code a
10ca0 62 6f 76 65 20 75 73 65 73 20 74 68 65 20 66 6f  bove uses the fo
10cb0 6c 6c 6f 77 69 6e 67 20 73 68 6f 72 74 68 61 6e  llowing shorthan
10cc0 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 41 47 47 53 54  d:.**.**   AGGST
10cd0 45 50 3a 20 20 20 20 69 6e 76 6f 6b 65 20 74 68  EP:    invoke th
10ce0 65 20 61 67 67 72 65 67 61 74 65 20 78 53 74 65  e aggregate xSte
10cf0 70 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  p() function for
10d00 20 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e   each window fun
10d10 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20  ction.**        
10d20 20 20 20 20 20 20 20 77 69 74 68 20 61 72 67 75         with argu
10d30 6d 65 6e 74 73 20 72 65 61 64 20 66 72 6f 6d 20  ments read from 
10d40 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
10d50 6f 66 20 63 75 72 73 6f 72 20 63 73 72 45 6e 64  of cursor csrEnd
10d60 2c 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20  , then.**       
10d70 20 20 20 20 20 20 20 20 73 74 65 70 20 63 75 72          step cur
10d80 73 6f 72 20 63 73 72 45 6e 64 20 66 6f 72 77 61  sor csrEnd forwa
10d90 72 64 20 6f 6e 65 20 72 6f 77 20 28 69 2e 65 2e  rd one row (i.e.
10da0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
10db0 74 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 52 45  t())..**.**   RE
10dc0 54 55 52 4e 5f 52 4f 57 3a 20 72 65 74 75 72 6e  TURN_ROW: return
10dd0 20 61 20 72 6f 77 20 74 6f 20 74 68 65 20 63 61   a row to the ca
10de0 6c 6c 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68  ller based on th
10df0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
10e00 65 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  e .**           
10e10 20 20 20 20 63 75 72 72 65 6e 74 20 72 6f 77 20      current row 
10e20 6f 66 20 63 73 72 43 75 72 72 65 6e 74 20 61 6e  of csrCurrent an
10e30 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  d the current st
10e40 61 74 65 20 6f 66 20 61 6c 6c 20 0a 2a 2a 20 20  ate of all .**  
10e50 20 20 20 20 20 20 20 20 20 20 20 20 20 61 67 67               agg
10e60 72 65 67 61 74 65 73 2e 20 54 68 65 6e 20 73 74  regates. Then st
10e70 65 70 20 63 75 72 73 6f 72 20 63 73 72 43 75 72  ep cursor csrCur
10e80 72 65 6e 74 20 66 6f 72 77 61 72 64 20 6f 6e 65  rent forward one
10e90 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 41 47   row..**.**   AG
10ea0 47 49 4e 56 45 52 53 45 3a 20 69 6e 76 6f 6b 65  GINVERSE: invoke
10eb0 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 78   the aggregate x
10ec0 49 6e 76 65 72 73 65 28 29 20 66 75 6e 63 74 69  Inverse() functi
10ed0 6f 6e 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64  on for each wind
10ee0 6f 77 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ow .**          
10ef0 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 73 20 77       functions w
10f00 69 74 68 20 61 72 67 75 6d 65 6e 74 73 20 72 65  ith arguments re
10f10 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72  ad from the curr
10f20 65 6e 74 20 72 6f 77 20 6f 66 20 63 75 72 73 6f  ent row of curso
10f30 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
10f40 20 20 20 63 73 72 53 74 61 72 74 2e 20 54 68 65     csrStart. The
10f50 6e 20 73 74 65 70 20 63 73 72 53 74 61 72 74 20  n step csrStart 
10f60 66 6f 72 77 61 72 64 20 6f 6e 65 20 72 6f 77 2e  forward one row.
10f70 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65  .**.** There are
10f80 20 74 77 6f 20 6f 74 68 65 72 20 52 4f 57 53 20   two other ROWS 
10f90 77 69 6e 64 6f 77 20 66 72 61 6d 65 73 20 74 68  window frames th
10fa0 61 74 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73  at are handled s
10fb0 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 2a 2a 20  ignificantly.** 
10fc0 64 69 66 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d  differently from
10fd0 20 74 68 65 20 61 62 6f 76 65 20 2d 20 22 42 45   the above - "BE
10fe0 54 57 45 45 4e 20 3c 65 78 70 72 3e 20 50 52 45  TWEEN <expr> PRE
10ff0 43 45 44 49 4e 47 20 41 4e 44 20 3c 65 78 70 72  CEDING AND <expr
11000 3e 20 50 52 45 43 45 44 49 4e 47 22 0a 2a 2a 20  > PRECEDING".** 
11010 61 6e 64 20 22 42 45 54 57 45 45 4e 20 3c 65 78  and "BETWEEN <ex
11020 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e  pr> FOLLOWING AN
11030 44 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49  D <expr> FOLLOWI
11040 4e 47 22 2e 20 54 68 65 73 65 20 61 72 65 20 73  NG". These are s
11050 70 65 63 69 61 6c 20 0a 2a 2a 20 63 61 73 65 73  pecial .** cases
11060 20 62 65 63 61 75 73 65 20 74 68 65 79 20 63 68   because they ch
11070 61 6e 67 65 20 74 68 65 20 6f 72 64 65 72 20 69  ange the order i
11080 6e 20 77 68 69 63 68 20 74 68 65 20 74 68 72 65  n which the thre
11090 65 20 63 75 72 73 6f 72 73 20 28 63 73 72 53 74  e cursors (csrSt
110a0 61 72 74 2c 0a 2a 2a 20 63 73 72 43 75 72 72 65  art,.** csrCurre
110b0 6e 74 20 61 6e 64 20 63 73 72 45 6e 64 29 20 69  nt and csrEnd) i
110c0 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
110d0 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  he ephemeral tab
110e0 6c 65 2e 20 43 61 73 65 73 20 74 68 61 74 0a 2a  le. Cases that.*
110f0 2a 20 75 73 65 20 55 4e 42 4f 55 4e 44 45 44 20  * use UNBOUNDED 
11100 6f 72 20 43 55 52 52 45 4e 54 20 52 4f 57 20 61  or CURRENT ROW a
11110 72 65 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20  re much simpler 
11120 76 61 72 69 61 74 69 6f 6e 73 20 6f 6e 20 6f 6e  variations on on
11130 65 20 6f 66 20 74 68 65 73 65 0a 2a 2a 20 74 68  e of these.** th
11140 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57  ree..**.**   ROW
11150 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31  S BETWEEN <expr1
11160 3e 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20  > PRECEDING AND 
11170 3c 65 78 70 72 32 3e 20 50 52 45 43 45 44 49 4e  <expr2> PRECEDIN
11180 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20  G.**.**     ... 
11190 6c 6f 6f 70 20 73 74 61 72 74 65 64 20 62 79 20  loop started by 
111a0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
111b0 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20  n() ....**      
111c0 20 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69   if( new partiti
111d0 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  on ){.**        
111e0 20 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20   Gosub flush.** 
111f0 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20        }.**      
11200 20 49 6e 73 65 72 74 20 6e 65 77 20 72 6f 77 20   Insert new row 
11210 69 6e 74 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a  into eph table..
11220 2a 2a 20 20 20 20 20 20 20 69 66 28 20 66 69 72  **       if( fir
11230 73 74 20 72 6f 77 20 6f 66 20 70 61 72 74 69 74  st row of partit
11240 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  ion ){.**       
11250 20 20 52 65 77 69 6e 64 28 63 73 72 45 6e 64 29    Rewind(csrEnd)
11260 20 3b 20 52 65 77 69 6e 64 28 63 73 72 53 74 61   ; Rewind(csrSta
11270 72 74 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72  rt) ; Rewind(csr
11280 43 75 72 72 65 6e 74 29 0a 2a 2a 20 20 20 20 20  Current).**     
11290 20 20 20 20 72 65 67 45 6e 64 20 3d 20 3c 65 78      regEnd = <ex
112a0 70 72 32 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20  pr2>.**         
112b0 72 65 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72  regStart = <expr
112c0 31 3e 0a 2a 2a 20 20 20 20 20 20 20 7d 65 6c 73  1>.**       }els
112d0 65 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 66  e{.**         if
112e0 28 20 28 72 65 67 45 6e 64 2d 2d 29 3c 3d 30 20  ( (regEnd--)<=0 
112f0 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ){.**           
11300 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 20  AGGSTEP.**      
11310 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20     }.**         
11320 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20  RETURN_ROW.**   
11330 20 20 20 20 20 20 69 66 28 20 28 72 65 67 53 74        if( (regSt
11340 61 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20  art--)<=0 ){.** 
11350 20 20 20 20 20 20 20 20 20 20 41 47 47 49 4e 56            AGGINV
11360 45 52 53 45 0a 2a 2a 20 20 20 20 20 20 20 20 20  ERSE.**         
11370 7d 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20  }.**       }.** 
11380 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 66 6c 75      }.**     flu
11390 73 68 3a 0a 2a 2a 20 20 20 20 20 20 20 69 66 28  sh:.**       if(
113a0 20 28 72 65 67 45 6e 64 2d 2d 29 3c 3d 30 20 29   (regEnd--)<=0 )
113b0 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 47 47  {.**         AGG
113c0 53 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 7d 0a  STEP.**       }.
113d0 2a 2a 20 20 20 20 20 20 20 52 45 54 55 52 4e 5f  **       RETURN_
113e0 52 4f 57 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 52  ROW.**.**.**   R
113f0 4f 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70  OWS BETWEEN <exp
11400 72 31 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e  r1> FOLLOWING AN
11410 44 20 3c 65 78 70 72 32 3e 20 46 4f 4c 4c 4f 57  D <expr2> FOLLOW
11420 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e  ING.**.**     ..
11430 2e 20 6c 6f 6f 70 20 73 74 61 72 74 65 64 20 62  . loop started b
11440 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
11450 67 69 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20  gin() ....**    
11460 20 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69   if( new partiti
11470 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 47  on ){.**       G
11480 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20 20  osub flush.**   
11490 20 20 7d 0a 2a 2a 20 20 20 20 20 49 6e 73 65 72    }.**     Inser
114a0 74 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20 65  t new row into e
114b0 70 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20  ph table..**    
114c0 20 69 66 28 20 66 69 72 73 74 20 72 6f 77 20 6f   if( first row o
114d0 66 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a  f partition ){.*
114e0 2a 20 20 20 20 20 20 20 52 65 77 69 6e 64 28 63  *       Rewind(c
114f0 73 72 45 6e 64 29 20 3b 20 52 65 77 69 6e 64 28  srEnd) ; Rewind(
11500 63 73 72 53 74 61 72 74 29 20 3b 20 52 65 77 69  csrStart) ; Rewi
11510 6e 64 28 63 73 72 43 75 72 72 65 6e 74 29 0a 2a  nd(csrCurrent).*
11520 2a 20 20 20 20 20 20 20 72 65 67 45 6e 64 20 3d  *       regEnd =
11530 20 3c 65 78 70 72 32 3e 0a 2a 2a 20 20 20 20 20   <expr2>.**     
11540 20 20 72 65 67 53 74 61 72 74 20 3d 20 72 65 67    regStart = reg
11550 45 6e 64 20 2d 20 3c 65 78 70 72 31 3e 0a 2a 2a  End - <expr1>.**
11560 20 20 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20       }else{.**  
11570 20 20 20 20 20 41 47 47 53 54 45 50 0a 2a 2a 20       AGGSTEP.** 
11580 20 20 20 20 20 20 69 66 28 20 28 72 65 67 45 6e        if( (regEn
11590 64 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20  d--)<=0 ){.**   
115a0 20 20 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57        RETURN_ROW
115b0 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  .**       }.**  
115c0 20 20 20 20 20 69 66 28 20 28 72 65 67 53 74 61       if( (regSta
115d0 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20  rt--)<=0 ){.**  
115e0 20 20 20 20 20 20 20 41 47 47 49 4e 56 45 52 53         AGGINVERS
115f0 45 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20  E.**       }.** 
11600 20 20 20 20 7d 0a 2a 2a 20 20 20 7d 0a 2a 2a 20      }.**   }.** 
11610 20 20 66 6c 75 73 68 3a 0a 2a 2a 20 20 20 20 20    flush:.**     
11620 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 77  AGGSTEP.**     w
11630 68 69 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20  hile( 1 ){.**   
11640 20 20 20 20 69 66 28 20 28 72 65 67 45 6e 64 2d      if( (regEnd-
11650 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20  -)<=0 ){.**     
11660 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a      RETURN_ROW.*
11670 2a 20 20 20 20 20 20 20 20 20 69 66 28 20 65 6f  *         if( eo
11680 66 20 29 20 62 72 65 61 6b 3b 0a 2a 2a 20 20 20  f ) break;.**   
11690 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 69      }.**       i
116a0 66 28 20 28 72 65 67 53 74 61 72 74 2d 2d 29 3c  f( (regStart--)<
116b0 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  =0 ){.**        
116c0 20 41 47 47 49 4e 56 45 52 53 45 0a 2a 2a 20 20   AGGINVERSE.**  
116d0 20 20 20 20 20 20 20 69 66 28 20 65 6f 66 20 29         if( eof )
116e0 20 62 72 65 61 6b 0a 2a 2a 20 20 20 20 20 20 20   break.**       
116f0 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20  }.**     }.**   
11700 20 20 77 68 69 6c 65 28 20 21 65 6f 66 20 63 73    while( !eof cs
11710 72 43 75 72 72 65 6e 74 20 29 7b 0a 2a 2a 20 20  rCurrent ){.**  
11720 20 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a       RETURN_ROW.
11730 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 46  **     }.**.** F
11740 6f 72 20 74 68 65 20 6d 6f 73 74 20 70 61 72 74  or the most part
11750 2c 20 74 68 65 20 70 61 74 74 65 72 6e 73 20 61  , the patterns a
11760 62 6f 76 65 20 61 72 65 20 61 64 61 70 74 65 64  bove are adapted
11770 20 74 6f 20 73 75 70 70 6f 72 74 20 55 4e 42 4f   to support UNBO
11780 55 4e 44 45 44 20 62 79 0a 2a 2a 20 61 73 73 75  UNDED by.** assu
11790 6d 69 6e 67 20 74 68 61 74 20 69 74 20 69 73 20  ming that it is 
117a0 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 22 69  equivalent to "i
117b0 6e 66 69 6e 69 74 79 20 50 52 45 43 45 44 49 4e  nfinity PRECEDIN
117c0 47 2f 46 4f 4c 4c 4f 57 49 4e 47 22 20 61 6e 64  G/FOLLOWING" and
117d0 0a 2a 2a 20 43 55 52 52 45 4e 54 20 52 4f 57 20  .** CURRENT ROW 
117e0 62 79 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  by assuming that
117f0 20 69 74 20 69 73 20 65 71 75 69 76 69 6c 65 6e   it is equivilen
11800 74 20 74 6f 20 22 30 20 50 52 45 43 45 44 49 4e  t to "0 PRECEDIN
11810 47 2f 46 4f 4c 4c 4f 57 49 4e 47 22 2e 0a 2a 2a  G/FOLLOWING"..**
11820 20 54 68 69 73 20 69 73 20 6f 70 74 69 6d 69 7a   This is optimiz
11830 65 64 20 6f 66 20 63 6f 75 72 73 65 20 2d 20 62  ed of course - b
11840 72 61 6e 63 68 65 73 20 74 68 61 74 20 77 69 6c  ranches that wil
11850 6c 20 6e 65 76 65 72 20 62 65 20 74 61 6b 65 6e  l never be taken
11860 20 61 6e 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f   and.** conditio
11870 6e 73 20 74 68 61 74 20 61 72 65 20 61 6c 77 61  ns that are alwa
11880 79 73 20 74 72 75 65 20 61 72 65 20 6f 6d 69 74  ys true are omit
11890 74 65 64 20 66 72 6f 6d 20 74 68 65 20 56 4d 20  ted from the VM 
118a0 63 6f 64 65 2e 20 54 68 65 20 6f 6e 6c 79 0a 2a  code. The only.*
118b0 2a 20 65 78 63 65 70 74 69 6f 6e 61 6c 20 63 61  * exceptional ca
118c0 73 65 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 52  se is:.**.**   R
118d0 4f 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70  OWS BETWEEN <exp
118e0 72 31 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e  r1> FOLLOWING AN
118f0 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c  D UNBOUNDED FOLL
11900 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20  OWING.**.**     
11910 2e 2e 2e 20 6c 6f 6f 70 20 73 74 61 72 74 65 64  ... loop started
11920 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
11930 42 65 67 69 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20  Begin() ....**  
11940 20 20 20 69 66 28 20 6e 65 77 20 70 61 72 74 69     if( new parti
11950 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20  tion ){.**      
11960 20 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20   Gosub flush.** 
11970 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 49 6e 73      }.**     Ins
11980 65 72 74 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f  ert new row into
11990 20 65 70 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20   eph table..**  
119a0 20 20 20 69 66 28 20 66 69 72 73 74 20 72 6f 77     if( first row
119b0 20 6f 66 20 70 61 72 74 69 74 69 6f 6e 20 29 7b   of partition ){
119c0 0a 2a 2a 20 20 20 20 20 20 20 52 65 77 69 6e 64  .**       Rewind
119d0 28 63 73 72 45 6e 64 29 20 3b 20 52 65 77 69 6e  (csrEnd) ; Rewin
119e0 64 28 63 73 72 53 74 61 72 74 29 20 3b 20 52 65  d(csrStart) ; Re
119f0 77 69 6e 64 28 63 73 72 43 75 72 72 65 6e 74 29  wind(csrCurrent)
11a00 0a 2a 2a 20 20 20 20 20 20 20 72 65 67 53 74 61  .**       regSta
11a10 72 74 20 3d 20 3c 65 78 70 72 31 3e 0a 2a 2a 20  rt = <expr1>.** 
11a20 20 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20      }else{.**   
11a30 20 20 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20      AGGSTEP.**  
11a40 20 20 20 7d 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20     }.**   }.**  
11a50 20 66 6c 75 73 68 3a 0a 2a 2a 20 20 20 20 20 41   flush:.**     A
11a60 47 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 77 68  GGSTEP.**     wh
11a70 69 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20  ile( 1 ){.**    
11a80 20 20 20 69 66 28 20 28 72 65 67 53 74 61 72 74     if( (regStart
11a90 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20  --)<=0 ){.**    
11aa0 20 20 20 20 20 41 47 47 49 4e 56 45 52 53 45 0a       AGGINVERSE.
11ab0 2a 2a 20 20 20 20 20 20 20 20 20 69 66 28 20 65  **         if( e
11ac0 6f 66 20 29 20 62 72 65 61 6b 0a 2a 2a 20 20 20  of ) break.**   
11ad0 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 52      }.**       R
11ae0 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20  ETURN_ROW.**    
11af0 20 7d 0a 2a 2a 20 20 20 20 20 77 68 69 6c 65 28   }.**     while(
11b00 20 21 65 6f 66 20 63 73 72 43 75 72 72 65 6e 74   !eof csrCurrent
11b10 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 52 45 54   ){.**       RET
11b20 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 7d  URN_ROW.**     }
11b30 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 71 75  .**.** Also requ
11b40 69 72 69 6e 67 20 73 70 65 63 69 61 6c 20 68 61  iring special ha
11b50 6e 64 6c 69 6e 67 20 61 72 65 20 74 68 65 20 63  ndling are the c
11b60 61 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 4f  ases:.**.**   RO
11b70 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72  WS BETWEEN <expr
11b80 31 3e 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44  1> PRECEDING AND
11b90 20 3c 65 78 70 72 32 3e 20 50 52 45 43 45 44 49   <expr2> PRECEDI
11ba0 4e 47 0a 2a 2a 20 20 20 52 4f 57 53 20 42 45 54  NG.**   ROWS BET
11bb0 57 45 45 4e 20 3c 65 78 70 72 31 3e 20 46 4f 4c  WEEN <expr1> FOL
11bc0 4c 4f 57 49 4e 47 20 41 4e 44 20 3c 65 78 70 72  LOWING AND <expr
11bd0 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a  2> FOLLOWING.**.
11be0 2a 2a 20 77 68 65 6e 20 28 65 78 70 72 31 20 3c  ** when (expr1 <
11bf0 20 65 78 70 72 32 29 2e 20 54 68 69 73 20 69 73   expr2). This is
11c00 20 64 65 74 65 63 74 65 64 20 61 74 20 72 75 6e   detected at run
11c10 74 69 6d 65 2c 20 6e 6f 74 20 62 79 20 74 68 69  time, not by thi
11c20 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 54  s function..** T
11c30 6f 20 68 61 6e 64 6c 65 20 74 68 69 73 20 63 61  o handle this ca
11c40 73 65 2c 20 74 68 65 20 70 73 65 75 64 6f 2d 63  se, the pseudo-c
11c50 6f 64 65 20 70 72 6f 67 72 61 6d 73 20 64 65 70  ode programs dep
11c60 69 63 74 65 64 20 61 62 6f 76 65 20 61 72 65 20  icted above are 
11c70 6d 6f 64 69 66 69 65 64 0a 2a 2a 20 73 6c 69 67  modified.** slig
11c80 68 74 6c 79 20 74 6f 20 62 65 3a 0a 2a 2a 0a 2a  htly to be:.**.*
11c90 2a 20 20 20 20 20 2e 2e 2e 20 6c 6f 6f 70 20 73  *     ... loop s
11ca0 74 61 72 74 65 64 20 62 79 20 73 71 6c 69 74 65  tarted by sqlite
11cb0 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2e 2e  3WhereBegin() ..
11cc0 2e 0a 2a 2a 20 20 20 20 20 69 66 28 20 6e 65 77  ..**     if( new
11cd0 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a   partition ){.**
11ce0 20 20 20 20 20 20 20 47 6f 73 75 62 20 66 6c 75         Gosub flu
11cf0 73 68 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20  sh.**     }.**  
11d00 20 20 20 49 6e 73 65 72 74 20 6e 65 77 20 72 6f     Insert new ro
11d10 77 20 69 6e 74 6f 20 65 70 68 20 74 61 62 6c 65  w into eph table
11d20 2e 0a 2a 2a 20 20 20 20 20 69 66 28 20 66 69 72  ..**     if( fir
11d30 73 74 20 72 6f 77 20 6f 66 20 70 61 72 74 69 74  st row of partit
11d40 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  ion ){.**       
11d50 52 65 77 69 6e 64 28 63 73 72 45 6e 64 29 20 3b  Rewind(csrEnd) ;
11d60 20 52 65 77 69 6e 64 28 63 73 72 53 74 61 72 74   Rewind(csrStart
11d70 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72 43 75  ) ; Rewind(csrCu
11d80 72 72 65 6e 74 29 0a 2a 2a 20 20 20 20 20 20 20  rrent).**       
11d90 72 65 67 45 6e 64 20 3d 20 3c 65 78 70 72 32 3e  regEnd = <expr2>
11da0 0a 2a 2a 20 20 20 20 20 20 20 72 65 67 53 74 61  .**       regSta
11db0 72 74 20 3d 20 3c 65 78 70 72 31 3e 0a 2a 2a 20  rt = <expr1>.** 
11dc0 20 20 20 20 20 20 69 66 28 20 72 65 67 45 6e 64        if( regEnd
11dd0 20 3c 20 72 65 67 53 74 61 72 74 20 29 7b 0a 2a   < regStart ){.*
11de0 2a 20 20 20 20 20 20 20 20 20 52 45 54 55 52 4e  *         RETURN
11df0 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 20 20 20 20  _ROW.**         
11e00 64 65 6c 65 74 65 20 65 70 68 20 74 61 62 6c 65  delete eph table
11e10 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 20 20 20   contents.**    
11e20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a       continue.**
11e30 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
11e40 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  ....**.** The ne
11e50 77 20 22 63 6f 6e 74 69 6e 75 65 22 20 73 74 61  w "continue" sta
11e60 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 61 62  tement in the ab
11e70 6f 76 65 20 6a 75 6d 70 73 20 74 6f 20 74 68 65  ove jumps to the
11e80 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 0a   next iteration.
11e90 2a 2a 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  ** of the outer 
11ea0 6c 6f 6f 70 20 2d 20 74 68 65 20 6f 6e 65 20 73  loop - the one s
11eb0 74 61 72 74 65 64 20 62 79 20 73 71 6c 69 74 65  tarted by sqlite
11ec0 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e 0a 2a  3WhereBegin()..*
11ed0 2a 0a 2a 2a 20 54 68 65 20 76 61 72 69 6f 75 73  *.** The various
11ee0 20 47 52 4f 55 50 53 20 63 61 73 65 73 20 61 72   GROUPS cases ar
11ef0 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73  e implemented us
11f00 69 6e 67 20 74 68 65 20 73 61 6d 65 20 70 61 74  ing the same pat
11f10 74 65 72 6e 73 20 61 73 0a 2a 2a 20 52 4f 57 53  terns as.** ROWS
11f20 2e 20 54 68 65 20 56 4d 20 63 6f 64 65 20 69 73  . The VM code is
11f30 20 6d 6f 64 69 66 69 65 64 20 73 6c 69 67 68 74   modified slight
11f40 6c 79 20 73 6f 20 74 68 61 74 3a 0a 2a 2a 0a 2a  ly so that:.**.*
11f50 2a 20 20 20 31 2e 20 54 68 65 20 65 6c 73 65 20  *   1. The else 
11f60 62 72 61 6e 63 68 20 69 6e 20 74 68 65 20 6d 61  branch in the ma
11f70 69 6e 20 6c 6f 6f 70 20 69 73 20 6f 6e 6c 79 20  in loop is only 
11f80 74 61 6b 65 6e 20 69 66 20 74 68 65 20 72 6f 77  taken if the row
11f90 20 6a 75 73 74 0a 2a 2a 20 20 20 20 20 20 61 64   just.**      ad
11fa0 64 65 64 20 74 6f 20 74 68 65 20 65 70 68 65 6d  ded to the ephem
11fb0 65 72 61 6c 20 74 61 62 6c 65 20 69 73 20 74 68  eral table is th
11fc0 65 20 73 74 61 72 74 20 6f 66 20 61 20 6e 65 77  e start of a new
11fd0 20 67 72 6f 75 70 2e 20 49 6e 0a 2a 2a 20 20 20   group. In.**   
11fe0 20 20 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20     other words, 
11ff0 69 74 20 62 65 63 6f 6d 65 73 3a 0a 2a 2a 0a 2a  it becomes:.**.*
12000 2a 20 20 20 20 20 20 20 20 20 2e 2e 2e 20 6c 6f  *         ... lo
12010 6f 70 20 73 74 61 72 74 65 64 20 62 79 20 73 71  op started by sq
12020 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
12030 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20  ) ....**        
12040 20 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69   if( new partiti
12050 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  on ){.**        
12060 20 20 20 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a     Gosub flush.*
12070 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  *         }.**  
12080 20 20 20 20 20 20 20 49 6e 73 65 72 74 20 6e 65         Insert ne
12090 77 20 72 6f 77 20 69 6e 74 6f 20 65 70 68 20 74  w row into eph t
120a0 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20  able..**        
120b0 20 69 66 28 20 66 69 72 73 74 20 72 6f 77 20 6f   if( first row o
120c0 66 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a  f partition ){.*
120d0 2a 20 20 20 20 20 20 20 20 20 20 20 52 65 77 69  *           Rewi
120e0 6e 64 28 63 73 72 45 6e 64 29 20 3b 20 52 65 77  nd(csrEnd) ; Rew
120f0 69 6e 64 28 63 73 72 53 74 61 72 74 29 20 3b 20  ind(csrStart) ; 
12100 52 65 77 69 6e 64 28 63 73 72 43 75 72 72 65 6e  Rewind(csrCurren
12110 74 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  t).**           
12120 72 65 67 45 6e 64 20 3d 20 3c 65 78 70 72 32 3e  regEnd = <expr2>
12130 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 72 65  .**           re
12140 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72 31 3e  gStart = <expr1>
12150 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 65 6c 73  .**         }els
12160 65 20 69 66 28 20 6e 65 77 20 67 72 6f 75 70 20  e if( new group 
12170 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ){.**           
12180 2e 2e 2e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ... .**         
12190 7d 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 0a  }.**       }.**.
121a0 2a 2a 20 20 20 32 2e 20 49 6e 73 74 65 61 64 20  **   2. Instead 
121b0 6f 66 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20  of processing a 
121c0 73 69 6e 67 6c 65 20 72 6f 77 2c 20 65 61 63 68  single row, each
121d0 20 52 45 54 55 52 4e 5f 52 4f 57 2c 20 41 47 47   RETURN_ROW, AGG
121e0 53 54 45 50 20 6f 72 20 0a 2a 2a 20 20 20 20 20  STEP or .**     
121f0 20 41 47 47 49 4e 56 45 52 53 45 20 73 74 65 70   AGGINVERSE step
12200 20 70 72 6f 63 65 73 73 65 73 20 74 68 65 20 63   processes the c
12210 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68  urrent row of th
12220 65 20 72 65 6c 65 76 61 6e 74 20 63 75 72 73 6f  e relevant curso
12230 72 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 61 6c  r and.**      al
12240 6c 20 73 75 62 73 65 71 75 65 6e 74 20 72 6f 77  l subsequent row
12250 73 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74  s belonging to t
12260 68 65 20 73 61 6d 65 20 67 72 6f 75 70 2e 0a 2a  he same group..*
12270 2a 0a 2a 2a 20 52 41 4e 47 45 20 77 69 6e 64 6f  *.** RANGE windo
12280 77 20 66 72 61 6d 65 73 20 61 72 65 20 61 20 6c  w frames are a l
12290 69 74 74 6c 65 20 64 69 66 66 65 72 65 6e 74 20  ittle different 
122a0 61 67 61 69 6e 2e 20 41 73 20 66 6f 72 20 47 52  again. As for GR
122b0 4f 55 50 53 2c 20 74 68 65 20 0a 2a 2a 20 6d 61  OUPS, the .** ma
122c0 69 6e 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63  in loop runs onc
122d0 65 20 70 65 72 20 67 72 6f 75 70 20 6f 6e 6c 79  e per group only
122e0 2e 20 41 6e 64 20 52 45 54 55 52 4e 5f 52 4f 57  . And RETURN_ROW
122f0 2c 20 41 47 47 53 54 45 50 20 61 6e 64 20 41 47  , AGGSTEP and AG
12300 47 49 4e 56 45 52 53 45 0a 2a 2a 20 64 65 61 6c  GINVERSE.** deal
12310 20 69 6e 20 67 72 6f 75 70 73 20 69 6e 73 74 65   in groups inste
12320 61 64 20 6f 66 20 72 6f 77 73 2e 20 41 73 20 66  ad of rows. As f
12330 6f 72 20 52 4f 57 53 20 61 6e 64 20 47 52 4f 55  or ROWS and GROU
12340 50 53 2c 20 74 68 65 72 65 20 61 72 65 20 74 68  PS, there are th
12350 72 65 65 0a 2a 2a 20 62 61 73 69 63 20 63 61 73  ree.** basic cas
12360 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e 47  es:.**.**   RANG
12370 45 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31  E BETWEEN <expr1
12380 3e 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20  > PRECEDING AND 
12390 3c 65 78 70 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e  <expr2> FOLLOWIN
123a0 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20  G.**.**     ... 
123b0 6c 6f 6f 70 20 73 74 61 72 74 65 64 20 62 79 20  loop started by 
123c0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
123d0 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20  n() ....**      
123e0 20 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69   if( new partiti
123f0 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  on ){.**        
12400 20 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20   Gosub flush.** 
12410 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20        }.**      
12420 20 49 6e 73 65 72 74 20 6e 65 77 20 72 6f 77 20   Insert new row 
12430 69 6e 74 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a  into eph table..
12440 2a 2a 20 20 20 20 20 20 20 69 66 28 20 66 69 72  **       if( fir
12450 73 74 20 72 6f 77 20 6f 66 20 70 61 72 74 69 74  st row of partit
12460 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  ion ){.**       
12470 20 20 52 65 77 69 6e 64 28 63 73 72 45 6e 64 29    Rewind(csrEnd)
12480 20 3b 20 52 65 77 69 6e 64 28 63 73 72 53 74 61   ; Rewind(csrSta
12490 72 74 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72  rt) ; Rewind(csr
124a0 43 75 72 72 65 6e 74 29 0a 2a 2a 20 20 20 20 20  Current).**     
124b0 20 20 20 20 72 65 67 45 6e 64 20 3d 20 3c 65 78      regEnd = <ex
124c0 70 72 32 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20  pr2>.**         
124d0 72 65 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72  regStart = <expr
124e0 31 3e 0a 2a 2a 20 20 20 20 20 20 20 7d 65 6c 73  1>.**       }els
124f0 65 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 47  e{.**         AG
12500 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 20  GSTEP.**        
12510 20 77 68 69 6c 65 28 20 28 63 73 72 43 75 72 72   while( (csrCurr
12520 65 6e 74 2e 6b 65 79 20 2b 20 72 65 67 45 6e 64  ent.key + regEnd
12530 29 20 3c 20 63 73 72 45 6e 64 2e 6b 65 79 20 29  ) < csrEnd.key )
12540 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 52  {.**           R
12550 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20  ETURN_ROW.**    
12560 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 63 73         while( cs
12570 72 53 74 61 72 74 2e 6b 65 79 20 2b 20 72 65 67  rStart.key + reg
12580 53 74 61 72 74 29 20 3c 20 63 73 72 43 75 72 72  Start) < csrCurr
12590 65 6e 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20  ent.key ){.**   
125a0 20 20 20 20 20 20 20 20 20 20 41 47 47 49 4e 56            AGGINV
125b0 45 52 53 45 0a 2a 2a 20 20 20 20 20 20 20 20 20  ERSE.**         
125c0 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d    }.**         }
125d0 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  .**       }.**  
125e0 20 20 20 7d 0a 2a 2a 20 20 20 20 20 66 6c 75 73     }.**     flus
125f0 68 3a 0a 2a 2a 20 20 20 20 20 20 20 41 47 47 53  h:.**       AGGS
12600 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 77 68 69  TEP.**       whi
12610 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20  le( 1 ){.**     
12620 20 20 20 20 52 45 54 55 52 4e 20 52 4f 57 0a 2a      RETURN ROW.*
12630 2a 20 20 20 20 20 20 20 20 20 69 66 28 20 63 73  *         if( cs
12640 72 43 75 72 72 65 6e 74 20 69 73 20 45 4f 46 20  rCurrent is EOF 
12650 29 20 62 72 65 61 6b 3b 0a 2a 2a 20 20 20 20 20  ) break;.**     
12660 20 20 20 20 20 20 77 68 69 6c 65 28 20 63 73 72        while( csr
12670 53 74 61 72 74 2e 6b 65 79 20 2b 20 72 65 67 53  Start.key + regS
12680 74 61 72 74 29 20 3c 20 63 73 72 43 75 72 72 65  tart) < csrCurre
12690 6e 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20  nt.key ){.**    
126a0 20 20 20 20 20 20 20 20 20 41 47 47 49 4e 56 45           AGGINVE
126b0 52 53 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  RSE.**          
126c0 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a   }.**         }.
126d0 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a  **       }.**.**
126e0 20 49 6e 20 74 68 65 20 61 62 6f 76 65 20 6e 6f   In the above no
126f0 74 61 74 69 6f 6e 2c 20 22 63 73 72 2e 6b 65 79  tation, "csr.key
12700 22 20 6d 65 61 6e 73 20 74 68 65 20 63 75 72 72  " means the curr
12710 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65  ent value of the
12720 20 4f 52 44 45 52 20 42 59 20 0a 2a 2a 20 65 78   ORDER BY .** ex
12730 70 72 65 73 73 69 6f 6e 20 28 74 68 65 72 65 20  pression (there 
12740 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 31 20 66  is only ever 1 f
12750 6f 72 20 61 20 52 41 4e 47 45 20 74 68 61 74 20  or a RANGE that 
12760 75 73 65 73 20 61 6e 20 3c 65 78 70 72 3e 20 46  uses an <expr> F
12770 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 20 6f 72 20 3c  OLLOWING.** or <
12780 65 78 70 72 20 50 52 45 43 45 44 49 4e 47 29 20  expr PRECEDING) 
12790 72 65 61 64 20 66 72 6f 6d 20 63 75 72 73 6f 72  read from cursor
127a0 20 63 73 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 52 41   csr..**.**   RA
127b0 4e 47 45 20 42 45 54 57 45 45 4e 20 3c 65 78 70  NGE BETWEEN <exp
127c0 72 31 3e 20 50 52 45 43 45 44 49 4e 47 20 41 4e  r1> PRECEDING AN
127d0 44 20 3c 65 78 70 72 32 3e 20 50 52 45 43 45 44  D <expr2> PRECED
127e0 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e  ING.**.**     ..
127f0 2e 20 6c 6f 6f 70 20 73 74 61 72 74 65 64 20 62  . loop started b
12800 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
12810 67 69 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20  gin() ....**    
12820 20 20 20 69 66 28 20 6e 65 77 20 70 61 72 74 69     if( new parti
12830 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20  tion ){.**      
12840 20 20 20 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a     Gosub flush.*
12850 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  *       }.**    
12860 20 20 20 49 6e 73 65 72 74 20 6e 65 77 20 72 6f     Insert new ro
12870 77 20 69 6e 74 6f 20 65 70 68 20 74 61 62 6c 65  w into eph table
12880 2e 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 66  ..**       if( f
12890 69 72 73 74 20 72 6f 77 20 6f 66 20 70 61 72 74  irst row of part
128a0 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20  ition ){.**     
128b0 20 20 20 20 52 65 77 69 6e 64 28 63 73 72 45 6e      Rewind(csrEn
128c0 64 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72 53  d) ; Rewind(csrS
128d0 74 61 72 74 29 20 3b 20 52 65 77 69 6e 64 28 63  tart) ; Rewind(c
128e0 73 72 43 75 72 72 65 6e 74 29 0a 2a 2a 20 20 20  srCurrent).**   
128f0 20 20 20 20 20 20 72 65 67 45 6e 64 20 3d 20 3c        regEnd = <
12900 65 78 70 72 32 3e 0a 2a 2a 20 20 20 20 20 20 20  expr2>.**       
12910 20 20 72 65 67 53 74 61 72 74 20 3d 20 3c 65 78    regStart = <ex
12920 70 72 31 3e 0a 2a 2a 20 20 20 20 20 20 20 7d 65  pr1>.**       }e
12930 6c 73 65 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  lse{.**         
12940 77 68 69 6c 65 28 20 28 63 73 72 45 6e 64 2e 6b  while( (csrEnd.k
12950 65 79 20 2b 20 72 65 67 45 6e 64 29 20 3c 3d 20  ey + regEnd) <= 
12960 63 73 72 43 75 72 72 65 6e 74 2e 6b 65 79 20 29  csrCurrent.key )
12970 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41  {.**           A
12980 47 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 20 20  GGSTEP.**       
12990 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 52    }.**         R
129a0 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20  ETURN_ROW.**    
129b0 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 73 72       while( (csr
129c0 53 74 61 72 74 2e 6b 65 79 20 2b 20 72 65 67 53  Start.key + regS
129d0 74 61 72 74 29 20 3c 20 63 73 72 43 75 72 72 65  tart) < csrCurre
129e0 6e 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20  nt.key ){.**    
129f0 20 20 20 20 20 20 20 41 47 47 49 4e 56 45 52 53         AGGINVERS
12a00 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a  E.**         }.*
12a10 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  *       }.**    
12a20 20 7d 0a 2a 2a 20 20 20 20 20 66 6c 75 73 68 3a   }.**     flush:
12a30 0a 2a 2a 20 20 20 20 20 20 20 77 68 69 6c 65 28  .**       while(
12a40 20 28 63 73 72 45 6e 64 2e 6b 65 79 20 2b 20 72   (csrEnd.key + r
12a50 65 67 45 6e 64 29 20 3c 3d 20 63 73 72 43 75 72  egEnd) <= csrCur
12a60 72 65 6e 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20  rent.key ){.**  
12a70 20 20 20 20 20 20 20 41 47 47 53 54 45 50 0a 2a         AGGSTEP.*
12a80 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  *       }.**    
12a90 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a     RETURN_ROW.**
12aa0 0a 2a 2a 20 20 20 52 41 4e 47 45 20 42 45 54 57  .**   RANGE BETW
12ab0 45 45 4e 20 3c 65 78 70 72 31 3e 20 46 4f 4c 4c  EEN <expr1> FOLL
12ac0 4f 57 49 4e 47 20 41 4e 44 20 3c 65 78 70 72 32  OWING AND <expr2
12ad0 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a  > FOLLOWING.**.*
12ae0 2a 20 20 20 20 20 2e 2e 2e 20 6c 6f 6f 70 20 73  *     ... loop s
12af0 74 61 72 74 65 64 20 62 79 20 73 71 6c 69 74 65  tarted by sqlite
12b00 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2e 2e  3WhereBegin() ..
12b10 2e 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 6e  ..**       if( n
12b20 65 77 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a  ew partition ){.
12b30 2a 2a 20 20 20 20 20 20 20 20 20 47 6f 73 75 62  **         Gosub
12b40 20 66 6c 75 73 68 0a 2a 2a 20 20 20 20 20 20 20   flush.**       
12b50 7d 0a 2a 2a 20 20 20 20 20 20 20 49 6e 73 65 72  }.**       Inser
12b60 74 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20 65  t new row into e
12b70 70 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20  ph table..**    
12b80 20 20 20 69 66 28 20 66 69 72 73 74 20 72 6f 77     if( first row
12b90 20 6f 66 20 70 61 72 74 69 74 69 6f 6e 20 29 7b   of partition ){
12ba0 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 65 77 69  .**         Rewi
12bb0 6e 64 28 63 73 72 45 6e 64 29 20 3b 20 52 65 77  nd(csrEnd) ; Rew
12bc0 69 6e 64 28 63 73 72 53 74 61 72 74 29 20 3b 20  ind(csrStart) ; 
12bd0 52 65 77 69 6e 64 28 63 73 72 43 75 72 72 65 6e  Rewind(csrCurren
12be0 74 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 72 65  t).**         re
12bf0 67 45 6e 64 20 3d 20 3c 65 78 70 72 32 3e 0a 2a  gEnd = <expr2>.*
12c00 2a 20 20 20 20 20 20 20 20 20 72 65 67 53 74 61  *         regSta
12c10 72 74 20 3d 20 3c 65 78 70 72 31 3e 0a 2a 2a 20  rt = <expr1>.** 
12c20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20        }else{.** 
12c30 20 20 20 20 20 20 20 20 41 47 47 53 54 45 50 0a          AGGSTEP.
12c40 2a 2a 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  **         while
12c50 28 20 28 63 73 72 43 75 72 72 65 6e 74 2e 6b 65  ( (csrCurrent.ke
12c60 79 20 2b 20 72 65 67 45 6e 64 29 20 3c 20 63 73  y + regEnd) < cs
12c70 72 45 6e 64 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20  rEnd.key ){.**  
12c80 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
12c90 28 63 73 72 43 75 72 72 65 6e 74 2e 6b 65 79 20  (csrCurrent.key 
12ca0 2b 20 72 65 67 53 74 61 72 74 29 20 3e 20 63 73  + regStart) > cs
12cb0 72 53 74 61 72 74 2e 6b 65 79 20 29 7b 0a 2a 2a  rStart.key ){.**
12cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 41 47 47               AGG
12cd0 49 4e 56 45 52 53 45 0a 2a 2a 20 20 20 20 20 20  INVERSE.**      
12ce0 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20       }.**       
12cf0 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a      RETURN_ROW.*
12d00 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  *         }.**  
12d10 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a       }.**     }.
12d20 2a 2a 20 20 20 20 20 66 6c 75 73 68 3a 0a 2a 2a  **     flush:.**
12d30 20 20 20 20 20 20 20 41 47 47 53 54 45 50 0a 2a         AGGSTEP.*
12d40 2a 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 31  *       while( 1
12d50 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 77   ){.**         w
12d60 68 69 6c 65 28 20 28 63 73 72 43 75 72 72 65 6e  hile( (csrCurren
12d70 74 2e 6b 65 79 20 2b 20 72 65 67 53 74 61 72 74  t.key + regStart
12d80 29 20 3e 20 63 73 72 53 74 61 72 74 2e 6b 65 79  ) > csrStart.key
12d90 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   ){.**          
12da0 20 41 47 47 49 4e 56 45 52 53 45 0a 2a 2a 20 20   AGGINVERSE.**  
12db0 20 20 20 20 20 20 20 20 20 69 66 28 20 65 6f 66           if( eof
12dc0 20 29 20 62 72 65 61 6b 20 22 77 68 69 6c 65 28   ) break "while(
12dd0 20 31 20 29 22 20 6c 6f 6f 70 2e 0a 2a 2a 20 20   1 )" loop..**  
12de0 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
12df0 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a      RETURN_ROW.*
12e00 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  *       }.**    
12e10 20 20 20 77 68 69 6c 65 28 20 21 65 6f 66 20 63     while( !eof c
12e20 73 72 43 75 72 72 65 6e 74 20 29 7b 0a 2a 2a 20  srCurrent ){.** 
12e30 20 20 20 20 20 20 20 20 52 45 54 55 52 4e 5f 52          RETURN_R
12e40 4f 57 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a  OW.**       }.**
12e50 0a 2a 2a 20 54 68 65 20 74 65 78 74 20 61 62 6f  .** The text abo
12e60 76 65 20 6c 65 61 76 65 73 20 6f 75 74 20 6d 61  ve leaves out ma
12e70 6e 79 20 64 65 74 61 69 6c 73 2e 20 52 65 66 65  ny details. Refe
12e80 72 20 74 6f 20 74 68 65 20 63 6f 64 65 20 61 6e  r to the code an
12e90 64 20 63 6f 6d 6d 65 6e 74 73 0a 2a 2a 20 62 65  d comments.** be
12ea0 6c 6f 77 20 66 6f 72 20 61 20 6d 6f 72 65 20 63  low for a more c
12eb0 6f 6d 70 6c 65 74 65 20 70 69 63 74 75 72 65 2e  omplete picture.
12ec0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
12ed0 57 69 6e 64 6f 77 43 6f 64 65 53 74 65 70 28 0a  WindowCodeStep(.
12ee0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
12ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f00 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
12f10 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
12f20 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
12f30 20 20 20 20 20 20 20 20 2f 2a 20 52 65 77 72 69          /* Rewri
12f40 74 74 65 6e 20 53 45 4c 45 43 54 20 73 74 61 74  tten SELECT stat
12f50 65 6d 65 6e 74 20 2a 2f 0a 20 20 57 68 65 72 65  ement */.  Where
12f60 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20  Info *pWInfo,   
12f70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
12f80 6e 74 65 78 74 20 72 65 74 75 72 6e 65 64 20 62  ntext returned b
12f90 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
12fa0 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 72  gin() */.  int r
12fb0 65 67 47 6f 73 75 62 2c 20 20 20 20 20 20 20 20  egGosub,        
12fc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
12fd0 67 69 73 74 65 72 20 66 6f 72 20 4f 50 5f 47 6f  gister for OP_Go
12fe0 73 75 62 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  sub */.  int add
12ff0 72 47 6f 73 75 62 20 20 20 20 20 20 20 20 20 20  rGosub          
13000 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 50 5f 47           /* OP_G
13010 6f 73 75 62 20 68 65 72 65 20 74 6f 20 72 65 74  osub here to ret
13020 75 72 6e 20 65 61 63 68 20 72 6f 77 20 2a 2f 0a  urn each row */.
13030 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57  ){.  Window *pMW
13040 69 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b 0a 20 20  in = p->pWin;.  
13050 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
13060 42 79 20 3d 20 70 4d 57 69 6e 2d 3e 70 4f 72 64  By = pMWin->pOrd
13070 65 72 42 79 3b 0a 20 20 56 64 62 65 20 2a 76 20  erBy;.  Vdbe *v 
13080 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
13090 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
130a0 63 73 72 57 72 69 74 65 3b 20 20 20 20 20 20 20  csrWrite;       
130b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
130c0 75 72 73 6f 72 20 75 73 65 64 20 74 6f 20 77 72  ursor used to wr
130d0 69 74 65 20 74 6f 20 65 70 68 2e 20 74 61 62 6c  ite to eph. tabl
130e0 65 20 2a 2f 0a 20 20 69 6e 74 20 63 73 72 49 6e  e */.  int csrIn
130f0 70 75 74 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  put = p->pSrc->a
13100 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 20 20 20 20  [0].iCursor;    
13110 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20 73 75   /* Cursor of su
13120 62 2d 73 65 6c 65 63 74 20 2a 2f 0a 20 20 69 6e  b-select */.  in
13130 74 20 6e 49 6e 70 75 74 20 3d 20 70 2d 3e 70 53  t nInput = p->pS
13140 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 2d 3e 6e  rc->a[0].pTab->n
13150 43 6f 6c 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65  Col;    /* Numbe
13160 72 20 6f 66 20 63 6f 6c 73 20 72 65 74 75 72 6e  r of cols return
13170 65 64 20 62 79 20 73 75 62 20 2a 2f 0a 20 20 69  ed by sub */.  i
13180 6e 74 20 69 49 6e 70 75 74 3b 20 20 20 20 20 20  nt iInput;      
13190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 20 69           /* To i
131b0 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 73  terate through s
131c0 75 62 20 63 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74  ub cols */.  int
131d0 20 61 64 64 72 4e 65 3b 20 20 20 20 20 20 20 20   addrNe;        
131e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
131f0 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4e 65  Address of OP_Ne
13200 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 47 6f   */.  int addrGo
13210 73 75 62 46 6c 75 73 68 20 3d 20 30 3b 20 20 20  subFlush = 0;   
13220 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
13230 20 6f 66 20 4f 50 5f 47 6f 73 75 62 20 74 6f 20   of OP_Gosub to 
13240 66 6c 75 73 68 3a 20 2a 2f 0a 20 20 69 6e 74 20  flush: */.  int 
13250 61 64 64 72 49 6e 74 65 67 65 72 20 3d 20 30 3b  addrInteger = 0;
13260 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
13270 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 49 6e 74  ddress of OP_Int
13280 65 67 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 64  eger */.  int ad
13290 64 72 45 6d 70 74 79 3b 20 20 20 20 20 20 20 20  drEmpty;        
132a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
132b0 72 65 73 73 20 6f 66 20 4f 50 5f 52 65 77 69 6e  ress of OP_Rewin
132c0 64 20 69 6e 20 66 6c 75 73 68 3a 20 2a 2f 0a 20  d in flush: */. 
132d0 20 69 6e 74 20 72 65 67 53 74 61 72 74 20 3d 20   int regStart = 
132e0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
132f0 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 3c 65 78   /* Value of <ex
13300 70 72 3e 20 50 52 45 43 45 44 49 4e 47 20 2a 2f  pr> PRECEDING */
13310 0a 20 20 69 6e 74 20 72 65 67 45 6e 64 20 3d 20  .  int regEnd = 
13320 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
13330 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 3c     /* Value of <
13340 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20  expr> FOLLOWING 
13350 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4e 65 77 3b  */.  int regNew;
13360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13370 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
13380 20 72 65 67 69 73 74 65 72 73 20 68 6f 6c 64 69   registers holdi
13390 6e 67 20 6e 65 77 20 69 6e 70 75 74 20 72 6f 77  ng new input row
133a0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63   */.  int regRec
133b0 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ord;            
133c0 20 20 20 20 20 20 2f 2a 20 72 65 67 4e 65 77 20        /* regNew 
133d0 61 72 72 61 79 20 69 6e 20 72 65 63 6f 72 64 20  array in record 
133e0 66 6f 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 72 65  form */.  int re
133f0 67 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20  gRowid;         
13400 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77            /* Row
13410 69 64 20 66 6f 72 20 72 65 67 52 65 63 6f 72 64  id for regRecord
13420 20 69 6e 20 65 70 68 20 74 61 62 6c 65 20 2a 2f   in eph table */
13430 0a 20 20 69 6e 74 20 72 65 67 4e 65 77 50 65 65  .  int regNewPee
13440 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
13450 20 20 20 2f 2a 20 50 65 65 72 20 76 61 6c 75 65     /* Peer value
13460 73 20 66 6f 72 20 6e 65 77 20 72 6f 77 20 28 70  s for new row (p
13470 61 72 74 20 6f 66 20 72 65 67 4e 65 77 29 20 2a  art of regNew) *
13480 2f 0a 20 20 69 6e 74 20 72 65 67 50 65 65 72 20  /.  int regPeer 
13490 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
134a0 20 20 20 20 2f 2a 20 50 65 65 72 20 76 61 6c 75      /* Peer valu
134b0 65 73 20 66 6f 72 20 63 75 72 72 65 6e 74 20 72  es for current r
134c0 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46  ow */.  int regF
134d0 6c 75 73 68 50 61 72 74 20 3d 20 30 3b 20 20 20  lushPart = 0;   
134e0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
134f0 74 65 72 20 66 6f 72 20 22 47 6f 73 75 62 20 66  ter for "Gosub f
13500 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 20  lush_partition" 
13510 2a 2f 0a 20 20 57 69 6e 64 6f 77 43 6f 64 65 41  */.  WindowCodeA
13520 72 67 20 73 3b 20 20 20 20 20 20 20 20 20 20 20  rg s;           
13530 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20       /* Context 
13540 6f 62 6a 65 63 74 20 66 6f 72 20 73 75 62 2d 72  object for sub-r
13550 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20 69 6e 74  outines */.  int
13560 20 6c 62 6c 57 68 65 72 65 45 6e 64 3b 20 20 20   lblWhereEnd;   
13570 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13580 4c 61 62 65 6c 20 6a 75 73 74 20 62 65 66 6f 72  Label just befor
13590 65 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  e sqlite3WhereEn
135a0 64 28 29 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61  d() code */..  a
135b0 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 53  ssert( pMWin->eS
135c0 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49  tart==TK_PRECEDI
135d0 4e 47 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74  NG || pMWin->eSt
135e0 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20  art==TK_CURRENT 
135f0 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e  .       || pMWin
13600 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c  ->eStart==TK_FOL
13610 4c 4f 57 49 4e 47 20 7c 7c 20 70 4d 57 69 6e 2d  LOWING || pMWin-
13620 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f  >eStart==TK_UNBO
13630 55 4e 44 45 44 20 0a 20 20 29 3b 0a 20 20 61 73  UNDED .  );.  as
13640 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 45 6e  sert( pMWin->eEn
13650 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  d==TK_FOLLOWING 
13660 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  || pMWin->eEnd==
13670 54 4b 5f 43 55 52 52 45 4e 54 20 0a 20 20 20 20  TK_CURRENT .    
13680 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e     || pMWin->eEn
13690 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20  d==TK_UNBOUNDED 
136a0 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  || pMWin->eEnd==
136b0 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 0a 20 20  TK_PRECEDING .  
136c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 57  );.  assert( pMW
136d0 69 6e 2d 3e 65 45 78 63 6c 75 64 65 3d 3d 30 20  in->eExclude==0 
136e0 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 78 63 6c 75  || pMWin->eExclu
136f0 64 65 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 0a 20  de==TK_CURRENT. 
13700 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e        || pMWin->
13710 65 45 78 63 6c 75 64 65 3d 3d 54 4b 5f 47 52 4f  eExclude==TK_GRO
13720 55 50 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 78  UP || pMWin->eEx
13730 63 6c 75 64 65 3d 3d 54 4b 5f 54 49 45 53 0a 20  clude==TK_TIES. 
13740 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e        || pMWin->
13750 65 45 78 63 6c 75 64 65 3d 3d 54 4b 5f 4e 4f 0a  eExclude==TK_NO.
13760 20 20 29 3b 0a 0a 20 20 6c 62 6c 57 68 65 72 65    );..  lblWhere
13770 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
13780 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
13790 65 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69  e);..  /* Fill i
137a0 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 62  n the context ob
137b0 6a 65 63 74 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  ject */.  memset
137c0 28 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57  (&s, 0, sizeof(W
137d0 69 6e 64 6f 77 43 6f 64 65 41 72 67 29 29 3b 0a  indowCodeArg));.
137e0 20 20 73 2e 70 50 61 72 73 65 20 3d 20 70 50 61    s.pParse = pPa
137f0 72 73 65 3b 0a 20 20 73 2e 70 4d 57 69 6e 20 3d  rse;.  s.pMWin =
13800 20 70 4d 57 69 6e 3b 0a 20 20 73 2e 70 56 64 62   pMWin;.  s.pVdb
13810 65 20 3d 20 76 3b 0a 20 20 73 2e 72 65 67 47 6f  e = v;.  s.regGo
13820 73 75 62 20 3d 20 72 65 67 47 6f 73 75 62 3b 0a  sub = regGosub;.
13830 20 20 73 2e 61 64 64 72 47 6f 73 75 62 20 3d 20    s.addrGosub = 
13840 61 64 64 72 47 6f 73 75 62 3b 0a 20 20 73 2e 63  addrGosub;.  s.c
13850 75 72 72 65 6e 74 2e 63 73 72 20 3d 20 70 4d 57  urrent.csr = pMW
13860 69 6e 2d 3e 69 45 70 68 43 73 72 3b 0a 20 20 63  in->iEphCsr;.  c
13870 73 72 57 72 69 74 65 20 3d 20 73 2e 63 75 72 72  srWrite = s.curr
13880 65 6e 74 2e 63 73 72 2b 31 3b 0a 20 20 73 2e 73  ent.csr+1;.  s.s
13890 74 61 72 74 2e 63 73 72 20 3d 20 73 2e 63 75 72  tart.csr = s.cur
138a0 72 65 6e 74 2e 63 73 72 2b 32 3b 0a 20 20 73 2e  rent.csr+2;.  s.
138b0 65 6e 64 2e 63 73 72 20 3d 20 73 2e 63 75 72 72  end.csr = s.curr
138c0 65 6e 74 2e 63 73 72 2b 33 3b 0a 0a 20 20 2f 2a  ent.csr+3;..  /*
138d0 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 6e   Figure out when
138e0 20 72 6f 77 73 20 6d 61 79 20 62 65 20 64 65 6c   rows may be del
138f0 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20 65 70  eted from the ep
13900 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20 54  hemeral table. T
13910 68 65 72 65 0a 20 20 2a 2a 20 61 72 65 20 66 6f  here.  ** are fo
13920 75 72 20 6f 70 74 69 6f 6e 73 20 2d 20 74 68 65  ur options - the
13930 79 20 6d 61 79 20 6e 65 76 65 72 20 62 65 20 64  y may never be d
13940 65 6c 65 74 65 64 20 28 65 44 65 6c 65 74 65 3d  eleted (eDelete=
13950 3d 30 29 2c 20 74 68 65 79 20 6d 61 79 20 0a 20  =0), they may . 
13960 20 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 61   ** be deleted a
13970 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 79 20 61  s soon as they a
13980 72 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 70 61 72  re no longer par
13990 74 20 6f 66 20 74 68 65 20 77 69 6e 64 6f 77 20  t of the window 
139a0 66 72 61 6d 65 0a 20 20 2a 2a 20 28 65 44 65 6c  frame.  ** (eDel
139b0 65 74 65 3d 3d 57 49 4e 44 4f 57 5f 41 47 47 49  ete==WINDOW_AGGI
139c0 4e 56 45 52 53 45 29 2c 20 74 68 65 79 20 6d 61  NVERSE), they ma
139d0 79 20 62 65 20 64 65 6c 65 74 65 64 20 61 73 20  y be deleted as 
139e0 61 66 74 65 72 20 74 68 65 20 72 6f 77 20 0a 20  after the row . 
139f0 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 65 74   ** has been ret
13a00 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
13a10 6c 65 72 20 28 57 49 4e 44 4f 57 5f 52 45 54 55  ler (WINDOW_RETU
13a20 52 4e 5f 52 4f 57 29 2c 20 6f 72 20 74 68 65 79  RN_ROW), or they
13a30 20 6d 61 79 0a 20 20 2a 2a 20 62 65 20 64 65 6c   may.  ** be del
13a40 65 74 65 64 20 61 66 74 65 72 20 74 68 65 79 20  eted after they 
13a50 65 6e 74 65 72 20 74 68 65 20 66 72 61 6d 65 20  enter the frame 
13a60 28 57 49 4e 44 4f 57 5f 41 47 47 53 54 45 50 29  (WINDOW_AGGSTEP)
13a70 2e 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70  . */.  switch( p
13a80 4d 57 69 6e 2d 3e 65 53 74 61 72 74 20 29 7b 0a  MWin->eStart ){.
13a90 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4f 4c 4c      case TK_FOLL
13aa0 4f 57 49 4e 47 3a 0a 20 20 20 20 20 20 69 66 28  OWING:.      if(
13ab0 20 70 4d 57 69 6e 2d 3e 65 46 72 6d 54 79 70 65   pMWin->eFrmType
13ac0 21 3d 54 4b 5f 52 41 4e 47 45 0a 20 20 20 20 20  !=TK_RANGE.     
13ad0 20 20 26 26 20 77 69 6e 64 6f 77 45 78 70 72 47    && windowExprG
13ae0 74 5a 65 72 6f 28 70 50 61 72 73 65 2c 20 70 4d  tZero(pParse, pM
13af0 57 69 6e 2d 3e 70 53 74 61 72 74 29 0a 20 20 20  Win->pStart).   
13b00 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 2e     ){.        s.
13b10 65 44 65 6c 65 74 65 20 3d 20 57 49 4e 44 4f 57  eDelete = WINDOW
13b20 5f 52 45 54 55 52 4e 5f 52 4f 57 3b 0a 20 20 20  _RETURN_ROW;.   
13b30 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
13b40 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e  ;.    case TK_UN
13b50 42 4f 55 4e 44 45 44 3a 0a 20 20 20 20 20 20 69  BOUNDED:.      i
13b60 66 28 20 77 69 6e 64 6f 77 43 61 63 68 65 46 72  f( windowCacheFr
13b70 61 6d 65 28 70 4d 57 69 6e 29 3d 3d 30 20 29 7b  ame(pMWin)==0 ){
13b80 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 57  .        if( pMW
13b90 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52 45  in->eEnd==TK_PRE
13ba0 43 45 44 49 4e 47 20 29 7b 0a 20 20 20 20 20 20  CEDING ){.      
13bb0 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65      if( pMWin->e
13bc0 46 72 6d 54 79 70 65 21 3d 54 4b 5f 52 41 4e 47  FrmType!=TK_RANG
13bd0 45 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  E.           && 
13be0 77 69 6e 64 6f 77 45 78 70 72 47 74 5a 65 72 6f  windowExprGtZero
13bf0 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2d 3e  (pParse, pMWin->
13c00 70 45 6e 64 29 0a 20 20 20 20 20 20 20 20 20 20  pEnd).          
13c10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
13c20 2e 65 44 65 6c 65 74 65 20 3d 20 57 49 4e 44 4f  .eDelete = WINDO
13c30 57 5f 41 47 47 53 54 45 50 3b 0a 20 20 20 20 20  W_AGGSTEP;.     
13c40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
13c50 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
13c60 73 2e 65 44 65 6c 65 74 65 20 3d 20 57 49 4e 44  s.eDelete = WIND
13c70 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 3b 0a 20  OW_RETURN_ROW;. 
13c80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
13c90 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
13ca0 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
13cb0 20 73 2e 65 44 65 6c 65 74 65 20 3d 20 57 49 4e   s.eDelete = WIN
13cc0 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 3b 0a  DOW_AGGINVERSE;.
13cd0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
13ce0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
13cf0 72 65 67 69 73 74 65 72 73 20 66 6f 72 20 74 68  registers for th
13d00 65 20 61 72 72 61 79 20 6f 66 20 76 61 6c 75 65  e array of value
13d10 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 71  s from the sub-q
13d20 75 65 72 79 2c 20 74 68 65 0a 20 20 2a 2a 20 73  uery, the.  ** s
13d30 61 6d 76 65 20 76 61 6c 75 65 73 20 69 6e 20 72  amve values in r
13d40 65 63 6f 72 64 20 66 6f 72 6d 2c 20 61 6e 64 20  ecord form, and 
13d50 74 68 65 20 72 6f 77 69 64 20 75 73 65 64 20 74  the rowid used t
13d60 6f 20 69 6e 73 65 72 74 20 73 61 69 64 20 72 65  o insert said re
13d70 63 6f 72 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 74  cord.  ** into t
13d80 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  he ephemeral tab
13d90 6c 65 2e 20 20 2a 2f 0a 20 20 72 65 67 4e 65 77  le.  */.  regNew
13da0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
13db0 31 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  1;.  pParse->nMe
13dc0 6d 20 2b 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 72  m += nInput;.  r
13dd0 65 67 52 65 63 6f 72 64 20 3d 20 2b 2b 70 50 61  egRecord = ++pPa
13de0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67  rse->nMem;.  reg
13df0 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65  Rowid = ++pParse
13e00 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 2f 2a 20 49 66  ->nMem;..  /* If
13e10 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61 6d   the window fram
13e20 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 3c  e contains an "<
13e30 65 78 70 72 3e 20 50 52 45 43 45 44 49 4e 47 22  expr> PRECEDING"
13e40 20 6f 72 20 22 3c 65 78 70 72 3e 20 46 4f 4c 4c   or "<expr> FOLL
13e50 4f 57 49 4e 47 22 0a 20 20 2a 2a 20 63 6c 61 75  OWING".  ** clau
13e60 73 65 2c 20 61 6c 6c 6f 63 61 74 65 20 72 65 67  se, allocate reg
13e70 69 73 74 65 72 73 20 74 6f 20 73 74 6f 72 65 20  isters to store 
13e80 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 65  the results of e
13e90 76 61 6c 75 61 74 69 6e 67 20 65 61 63 68 0a 20  valuating each. 
13ea0 20 2a 2a 20 3c 65 78 70 72 3e 2e 20 20 2a 2f 0a   ** <expr>.  */.
13eb0 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74    if( pMWin->eSt
13ec0 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e  art==TK_PRECEDIN
13ed0 47 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61  G || pMWin->eSta
13ee0 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  rt==TK_FOLLOWING
13ef0 20 29 7b 0a 20 20 20 20 72 65 67 53 74 61 72 74   ){.    regStart
13f00 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
13f10 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d 57  m;.  }.  if( pMW
13f20 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52 45  in->eEnd==TK_PRE
13f30 43 45 44 49 4e 47 20 7c 7c 20 70 4d 57 69 6e 2d  CEDING || pMWin-
13f40 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57  >eEnd==TK_FOLLOW
13f50 49 4e 47 20 29 7b 0a 20 20 20 20 72 65 67 45 6e  ING ){.    regEn
13f60 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  d = ++pParse->nM
13f70 65 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  em;.  }..  /* If
13f80 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 22   this is not a "
13f90 52 4f 57 53 20 42 45 54 57 45 45 4e 20 2e 2e 2e  ROWS BETWEEN ...
13fa0 22 20 66 72 61 6d 65 2c 20 74 68 65 6e 20 61 6c  " frame, then al
13fb0 6c 6f 63 61 74 65 20 61 72 72 61 79 73 20 6f 66  locate arrays of
13fc0 0a 20 20 2a 2a 20 72 65 67 69 73 74 65 72 73 20  .  ** registers 
13fd0 74 6f 20 73 74 6f 72 65 20 63 6f 70 69 65 73 20  to store copies 
13fe0 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
13ff0 65 78 70 72 65 73 73 69 6f 6e 73 20 28 70 65 65  expressions (pee
14000 72 20 76 61 6c 75 65 73 29 20 0a 20 20 2a 2a 20  r values) .  ** 
14010 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 6c 6f 6f  for the main loo
14020 70 2c 20 61 6e 64 20 66 6f 72 20 65 61 63 68 20  p, and for each 
14030 63 75 72 73 6f 72 20 28 73 74 61 72 74 2c 20 63  cursor (start, c
14040 75 72 72 65 6e 74 20 61 6e 64 20 65 6e 64 29 2e  urrent and end).
14050 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d   */.  if( pMWin-
14060 3e 65 46 72 6d 54 79 70 65 21 3d 54 4b 5f 52 4f  >eFrmType!=TK_RO
14070 57 53 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 50  WS ){.    int nP
14080 65 65 72 20 3d 20 28 70 4f 72 64 65 72 42 79 20  eer = (pOrderBy 
14090 3f 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ? pOrderBy->nExp
140a0 72 20 3a 20 30 29 3b 0a 20 20 20 20 72 65 67 4e  r : 0);.    regN
140b0 65 77 50 65 65 72 20 3d 20 72 65 67 4e 65 77 20  ewPeer = regNew 
140c0 2b 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72  + pMWin->nBuffer
140d0 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 70 4d 57  Col;.    if( pMW
140e0 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 29  in->pPartition )
140f0 20 72 65 67 4e 65 77 50 65 65 72 20 2b 3d 20 70   regNewPeer += p
14100 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e  MWin->pPartition
14110 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 72 65 67  ->nExpr;.    reg
14120 50 65 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Peer = pParse->n
14130 4d 65 6d 2b 31 3b 20 20 20 20 20 20 20 70 50 61  Mem+1;       pPa
14140 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 65  rse->nMem += nPe
14150 65 72 3b 0a 20 20 20 20 73 2e 73 74 61 72 74 2e  er;.    s.start.
14160 72 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  reg = pParse->nM
14170 65 6d 2b 31 3b 20 20 20 70 50 61 72 73 65 2d 3e  em+1;   pParse->
14180 6e 4d 65 6d 20 2b 3d 20 6e 50 65 65 72 3b 0a 20  nMem += nPeer;. 
14190 20 20 20 73 2e 63 75 72 72 65 6e 74 2e 72 65 67     s.current.reg
141a0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
141b0 31 3b 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  1; pParse->nMem 
141c0 2b 3d 20 6e 50 65 65 72 3b 0a 20 20 20 20 73 2e  += nPeer;.    s.
141d0 65 6e 64 2e 72 65 67 20 3d 20 70 50 61 72 73 65  end.reg = pParse
141e0 2d 3e 6e 4d 65 6d 2b 31 3b 20 20 20 20 20 70 50  ->nMem+1;     pP
141f0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50  arse->nMem += nP
14200 65 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  eer;.  }..  /* L
14210 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76  oad the column v
14220 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20 72 6f  alues for the ro
14230 77 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  w returned by th
14240 65 20 73 75 62 2d 73 65 6c 65 63 74 0a 20 20 2a  e sub-select.  *
14250 2a 20 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20  * into an array 
14260 6f 66 20 72 65 67 69 73 74 65 72 73 20 73 74 61  of registers sta
14270 72 74 69 6e 67 20 61 74 20 72 65 67 4e 65 77 2e  rting at regNew.
14280 20 41 73 73 65 6d 62 6c 65 20 74 68 65 6d 20 69   Assemble them i
14290 6e 74 6f 0a 20 20 2a 2a 20 61 20 72 65 63 6f 72  nto.  ** a recor
142a0 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 72 65  d in register re
142b0 67 52 65 63 6f 72 64 2e 20 2a 2f 0a 20 20 66 6f  gRecord. */.  fo
142c0 72 28 69 49 6e 70 75 74 3d 30 3b 20 69 49 6e 70  r(iInput=0; iInp
142d0 75 74 3c 6e 49 6e 70 75 74 3b 20 69 49 6e 70 75  ut<nInput; iInpu
142e0 74 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  t++){.    sqlite
142f0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
14300 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 49 6e 70  P_Column, csrInp
14310 75 74 2c 20 69 49 6e 70 75 74 2c 20 72 65 67 4e  ut, iInput, regN
14320 65 77 2b 69 49 6e 70 75 74 29 3b 0a 20 20 7d 0a  ew+iInput);.  }.
14330 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14340 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
14350 63 6f 72 64 2c 20 72 65 67 4e 65 77 2c 20 6e 49  cord, regNew, nI
14360 6e 70 75 74 2c 20 72 65 67 52 65 63 6f 72 64 29  nput, regRecord)
14370 3b 0a 0a 20 20 2f 2a 20 41 6e 20 69 6e 70 75 74  ;..  /* An input
14380 20 72 6f 77 20 68 61 73 20 6a 75 73 74 20 62 65   row has just be
14390 65 6e 20 72 65 61 64 20 69 6e 74 6f 20 61 6e 20  en read into an 
143a0 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  array of registe
143b0 72 73 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a  rs starting.  **
143c0 20 61 74 20 72 65 67 4e 65 77 2e 20 49 66 20 74   at regNew. If t
143d0 68 65 20 77 69 6e 64 6f 77 20 68 61 73 20 61 20  he window has a 
143e0 50 41 52 54 49 54 49 4f 4e 20 63 6c 61 75 73 65  PARTITION clause
143f0 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20 67 65 6e  , this block gen
14400 65 72 61 74 65 73 20 0a 20 20 2a 2a 20 56 4d 20  erates .  ** VM 
14410 63 6f 64 65 20 74 6f 20 63 68 65 63 6b 20 69 66  code to check if
14420 20 74 68 65 20 69 6e 70 75 74 20 72 6f 77 20 69   the input row i
14430 73 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  s the start of a
14440 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 2e 0a   new partition..
14450 20 20 2a 2a 20 49 66 20 73 6f 2c 20 69 74 20 64    ** If so, it d
14460 6f 65 73 20 61 6e 20 4f 50 5f 47 6f 73 75 62 20  oes an OP_Gosub 
14470 74 6f 20 61 6e 20 61 64 64 72 65 73 73 20 74 6f  to an address to
14480 20 62 65 20 66 69 6c 6c 65 64 20 69 6e 20 6c 61   be filled in la
14490 74 65 72 2e 20 54 68 65 0a 20 20 2a 2a 20 61 64  ter. The.  ** ad
144a0 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f  dress of the OP_
144b0 47 6f 73 75 62 20 69 73 20 73 74 6f 72 65 64 20  Gosub is stored 
144c0 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  in local variabl
144d0 65 20 61 64 64 72 47 6f 73 75 62 46 6c 75 73 68  e addrGosubFlush
144e0 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e  . */.  if( pMWin
144f0 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 29 7b 0a  ->pPartition ){.
14500 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
14510 20 20 45 78 70 72 4c 69 73 74 20 2a 70 50 61 72    ExprList *pPar
14520 74 20 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74  t = pMWin->pPart
14530 69 74 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 6e  ition;.    int n
14540 50 61 72 74 20 3d 20 70 50 61 72 74 2d 3e 6e 45  Part = pPart->nE
14550 78 70 72 3b 0a 20 20 20 20 69 6e 74 20 72 65 67  xpr;.    int reg
14560 4e 65 77 50 61 72 74 20 3d 20 72 65 67 4e 65 77  NewPart = regNew
14570 20 2b 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65   + pMWin->nBuffe
14580 72 43 6f 6c 3b 0a 20 20 20 20 4b 65 79 49 6e 66  rCol;.    KeyInf
14590 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71  o *pKeyInfo = sq
145a0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d  lite3KeyInfoFrom
145b0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
145c0 20 70 50 61 72 74 2c 20 30 2c 20 30 29 3b 0a 0a   pPart, 0, 0);..
145d0 20 20 20 20 72 65 67 46 6c 75 73 68 50 61 72 74      regFlushPart
145e0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
145f0 6d 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71  m;.    addr = sq
14600 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
14610 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72  v, OP_Compare, r
14620 65 67 4e 65 77 50 61 72 74 2c 20 70 4d 57 69 6e  egNewPart, pMWin
14630 2d 3e 72 65 67 50 61 72 74 2c 20 6e 50 61 72 74  ->regPart, nPart
14640 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
14650 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28 76  beAppendP4(v, (v
14660 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  oid*)pKeyInfo, P
14670 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
14680 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14690 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64  3(v, OP_Jump, ad
146a0 64 72 2b 32 2c 20 61 64 64 72 2b 34 2c 20 61 64  dr+2, addr+4, ad
146b0 64 72 2b 32 29 3b 0a 20 20 20 20 56 64 62 65 43  dr+2);.    VdbeC
146c0 6f 76 65 72 61 67 65 45 71 4e 65 28 76 29 3b 0a  overageEqNe(v);.
146d0 20 20 20 20 61 64 64 72 47 6f 73 75 62 46 6c 75      addrGosubFlu
146e0 73 68 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  sh = sqlite3Vdbe
146f0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 47 6f 73  AddOp1(v, OP_Gos
14700 75 62 2c 20 72 65 67 46 6c 75 73 68 50 61 72 74  ub, regFlushPart
14710 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
14720 6e 74 28 28 76 2c 20 22 63 61 6c 6c 20 66 6c 75  nt((v, "call flu
14730 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 29 29 3b  sh_partition"));
14740 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14750 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70  AddOp3(v, OP_Cop
14760 79 2c 20 72 65 67 4e 65 77 50 61 72 74 2c 20 70  y, regNewPart, p
14770 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c 20 6e  MWin->regPart, n
14780 50 61 72 74 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20  Part-1);.  }..  
14790 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65  /* Insert the ne
147a0 77 20 72 6f 77 20 69 6e 74 6f 20 74 68 65 20 65  w row into the e
147b0 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 2a  phemeral table *
147c0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  /.  sqlite3VdbeA
147d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
147e0 6f 77 69 64 2c 20 63 73 72 57 72 69 74 65 2c 20  owid, csrWrite, 
147f0 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c  regRowid);.  sql
14800 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
14810 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 63 73 72  , OP_Insert, csr
14820 57 72 69 74 65 2c 20 72 65 67 52 65 63 6f 72 64  Write, regRecord
14830 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 61  , regRowid);.  a
14840 64 64 72 4e 65 20 3d 20 73 71 6c 69 74 65 33 56  ddrNe = sqlite3V
14850 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
14860 4e 65 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 4f 6e  Ne, pMWin->regOn
14870 65 2c 20 30 2c 20 72 65 67 52 6f 77 69 64 29 3b  e, 0, regRowid);
14880 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  .  VdbeCoverage(
14890 76 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62  v);..  /* This b
148a0 6c 6f 63 6b 20 69 73 20 72 75 6e 20 66 6f 72 20  lock is run for 
148b0 74 68 65 20 66 69 72 73 74 20 72 6f 77 20 6f 66  the first row of
148c0 20 65 61 63 68 20 70 61 72 74 69 74 69 6f 6e 20   each partition 
148d0 2a 2f 0a 20 20 73 2e 72 65 67 41 72 67 20 3d 20  */.  s.regArg = 
148e0 77 69 6e 64 6f 77 49 6e 69 74 41 63 63 75 6d 28  windowInitAccum(
148f0 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 29 3b 0a  pParse, pMWin);.
14900 0a 20 20 69 66 28 20 72 65 67 53 74 61 72 74 20  .  if( regStart 
14910 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
14920 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
14930 4d 57 69 6e 2d 3e 70 53 74 61 72 74 2c 20 72 65  MWin->pStart, re
14940 67 53 74 61 72 74 29 3b 0a 20 20 20 20 77 69 6e  gStart);.    win
14950 64 6f 77 43 68 65 63 6b 56 61 6c 75 65 28 70 50  dowCheckValue(pP
14960 61 72 73 65 2c 20 72 65 67 53 74 61 72 74 2c 20  arse, regStart, 
14970 30 20 2b 20 28 70 4d 57 69 6e 2d 3e 65 46 72 6d  0 + (pMWin->eFrm
14980 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 3f  Type==TK_RANGE ?
14990 20 33 20 3a 20 30 29 29 3b 0a 20 20 7d 0a 20 20   3 : 0));.  }.  
149a0 69 66 28 20 72 65 67 45 6e 64 20 29 7b 0a 20 20  if( regEnd ){.  
149b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
149c0 65 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2d  e(pParse, pMWin-
149d0 3e 70 45 6e 64 2c 20 72 65 67 45 6e 64 29 3b 0a  >pEnd, regEnd);.
149e0 20 20 20 20 77 69 6e 64 6f 77 43 68 65 63 6b 56      windowCheckV
149f0 61 6c 75 65 28 70 50 61 72 73 65 2c 20 72 65 67  alue(pParse, reg
14a00 45 6e 64 2c 20 31 20 2b 20 28 70 4d 57 69 6e 2d  End, 1 + (pMWin-
14a10 3e 65 46 72 6d 54 79 70 65 3d 3d 54 4b 5f 52 41  >eFrmType==TK_RA
14a20 4e 47 45 20 3f 20 33 20 3a 20 30 29 29 3b 0a 20  NGE ? 3 : 0));. 
14a30 20 7d 0a 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d   }..  if( pMWin-
14a40 3e 65 53 74 61 72 74 3d 3d 70 4d 57 69 6e 2d 3e  >eStart==pMWin->
14a50 65 45 6e 64 20 26 26 20 72 65 67 53 74 61 72 74  eEnd && regStart
14a60 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d   ){.    int op =
14a70 20 28 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74   ((pMWin->eStart
14a80 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 29 20  ==TK_FOLLOWING) 
14a90 3f 20 4f 50 5f 47 65 20 3a 20 4f 50 5f 4c 65 29  ? OP_Ge : OP_Le)
14aa0 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 47 65  ;.    int addrGe
14ab0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
14ac0 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72 65 67 53  dOp3(v, op, regS
14ad0 74 61 72 74 2c 20 30 2c 20 72 65 67 45 6e 64 29  tart, 0, regEnd)
14ae0 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
14af0 67 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43  ge(v);.    VdbeC
14b00 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
14b10 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 56 64 62  =OP_Ge);.    Vdb
14b20 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
14b30 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 77  p==OP_Le);.    w
14b40 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 26 73  indowAggFinal(&s
14b50 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
14b60 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14b70 50 5f 52 65 77 69 6e 64 2c 20 73 2e 63 75 72 72  P_Rewind, s.curr
14b80 65 6e 74 2e 63 73 72 2c 20 31 29 3b 0a 20 20 20  ent.csr, 1);.   
14b90 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76   VdbeCoverageNev
14ba0 65 72 54 61 6b 65 6e 28 76 29 3b 0a 20 20 20 20  erTaken(v);.    
14bb0 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52  windowReturnOneR
14bc0 6f 77 28 26 73 29 3b 0a 20 20 20 20 73 71 6c 69  ow(&s);.    sqli
14bd0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
14be0 20 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c   OP_ResetSorter,
14bf0 20 73 2e 63 75 72 72 65 6e 74 2e 63 73 72 29 3b   s.current.csr);
14c00 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14c10 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
14c20 6f 2c 20 30 2c 20 6c 62 6c 57 68 65 72 65 45 6e  o, 0, lblWhereEn
14c30 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  d);.    sqlite3V
14c40 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
14c50 64 64 72 47 65 29 3b 0a 20 20 7d 0a 20 20 69 66  ddrGe);.  }.  if
14c60 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d  ( pMWin->eStart=
14c70 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 26 26  =TK_FOLLOWING &&
14c80 20 70 4d 57 69 6e 2d 3e 65 46 72 6d 54 79 70 65   pMWin->eFrmType
14c90 21 3d 54 4b 5f 52 41 4e 47 45 20 26 26 20 72 65  !=TK_RANGE && re
14ca0 67 45 6e 64 20 29 7b 0a 20 20 20 20 61 73 73 65  gEnd ){.    asse
14cb0 72 74 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d  rt( pMWin->eEnd=
14cc0 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 3b  =TK_FOLLOWING );
14cd0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14ce0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62  AddOp3(v, OP_Sub
14cf0 74 72 61 63 74 2c 20 72 65 67 53 74 61 72 74 2c  tract, regStart,
14d00 20 72 65 67 45 6e 64 2c 20 72 65 67 53 74 61 72   regEnd, regStar
14d10 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  t);.  }..  if( p
14d20 4d 57 69 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b  MWin->eStart!=TK
14d30 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20  _UNBOUNDED ){.  
14d40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14d50 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
14d60 2c 20 73 2e 73 74 61 72 74 2e 63 73 72 2c 20 31  , s.start.csr, 1
14d70 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
14d80 61 67 65 4e 65 76 65 72 54 61 6b 65 6e 28 76 29  ageNeverTaken(v)
14d90 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
14da0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14db0 52 65 77 69 6e 64 2c 20 73 2e 63 75 72 72 65 6e  Rewind, s.curren
14dc0 74 2e 63 73 72 2c 20 31 29 3b 0a 20 20 56 64 62  t.csr, 1);.  Vdb
14dd0 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72 54 61  eCoverageNeverTa
14de0 6b 65 6e 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  ken(v);.  sqlite
14df0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14e00 50 5f 52 65 77 69 6e 64 2c 20 73 2e 65 6e 64 2e  P_Rewind, s.end.
14e10 63 73 72 2c 20 31 29 3b 0a 20 20 56 64 62 65 43  csr, 1);.  VdbeC
14e20 6f 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b 65  overageNeverTake
14e30 6e 28 76 29 3b 0a 20 20 69 66 28 20 72 65 67 50  n(v);.  if( regP
14e40 65 65 72 20 26 26 20 70 4f 72 64 65 72 42 79 20  eer && pOrderBy 
14e50 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
14e60 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
14e70 6f 70 79 2c 20 72 65 67 4e 65 77 50 65 65 72 2c  opy, regNewPeer,
14e80 20 72 65 67 50 65 65 72 2c 20 70 4f 72 64 65 72   regPeer, pOrder
14e90 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20  By->nExpr-1);.  
14ea0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14eb0 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op3(v, OP_Copy, 
14ec0 72 65 67 50 65 65 72 2c 20 73 2e 73 74 61 72 74  regPeer, s.start
14ed0 2e 72 65 67 2c 20 70 4f 72 64 65 72 42 79 2d 3e  .reg, pOrderBy->
14ee0 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 73 71  nExpr-1);.    sq
14ef0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
14f00 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 50  v, OP_Copy, regP
14f10 65 65 72 2c 20 73 2e 63 75 72 72 65 6e 74 2e 72  eer, s.current.r
14f20 65 67 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  eg, pOrderBy->nE
14f30 78 70 72 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69  xpr-1);.    sqli
14f40 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
14f50 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 50 65 65   OP_Copy, regPee
14f60 72 2c 20 73 2e 65 6e 64 2e 72 65 67 2c 20 70 4f  r, s.end.reg, pO
14f70 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31 29  rderBy->nExpr-1)
14f80 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
14f90 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14fa0 5f 47 6f 74 6f 2c 20 30 2c 20 6c 62 6c 57 68 65  _Goto, 0, lblWhe
14fb0 72 65 45 6e 64 29 3b 0a 0a 20 20 73 71 6c 69 74  reEnd);..  sqlit
14fc0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
14fd0 2c 20 61 64 64 72 4e 65 29 3b 0a 20 20 69 66 28  , addrNe);.  if(
14fe0 20 72 65 67 50 65 65 72 20 29 7b 0a 20 20 20 20   regPeer ){.    
14ff0 77 69 6e 64 6f 77 49 66 4e 65 77 50 65 65 72 28  windowIfNewPeer(
15000 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
15010 2c 20 72 65 67 4e 65 77 50 65 65 72 2c 20 72 65  , regNewPeer, re
15020 67 50 65 65 72 2c 20 6c 62 6c 57 68 65 72 65 45  gPeer, lblWhereE
15030 6e 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  nd);.  }.  if( p
15040 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
15050 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20  _FOLLOWING ){.  
15060 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26    windowCodeOp(&
15070 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 53 54 45  s, WINDOW_AGGSTE
15080 50 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  P, 0, 0);.    if
15090 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 21 3d 54  ( pMWin->eEnd!=T
150a0 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20  K_UNBOUNDED ){. 
150b0 20 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e       if( pMWin->
150c0 65 46 72 6d 54 79 70 65 3d 3d 54 4b 5f 52 41 4e  eFrmType==TK_RAN
150d0 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  GE ){.        in
150e0 74 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33 56  t lbl = sqlite3V
150f0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
15100 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  rse);.        in
15110 74 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c  t addrNext = sql
15120 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
15130 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20  ddr(v);.        
15140 77 69 6e 64 6f 77 43 6f 64 65 52 61 6e 67 65 54  windowCodeRangeT
15150 65 73 74 28 26 73 2c 20 4f 50 5f 47 65 2c 20 73  est(&s, OP_Ge, s
15160 2e 63 75 72 72 65 6e 74 2e 63 73 72 2c 20 72 65  .current.csr, re
15170 67 45 6e 64 2c 20 73 2e 65 6e 64 2e 63 73 72 2c  gEnd, s.end.csr,
15180 20 6c 62 6c 29 3b 0a 20 20 20 20 20 20 20 20 77   lbl);.        w
15190 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20  indowCodeOp(&s, 
151a0 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53  WINDOW_AGGINVERS
151b0 45 2c 20 72 65 67 53 74 61 72 74 2c 20 30 29 3b  E, regStart, 0);
151c0 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43  .        windowC
151d0 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57  odeOp(&s, WINDOW
151e0 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 30 2c 20  _RETURN_ROW, 0, 
151f0 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
15200 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15210 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
15220 72 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20  rNext);.        
15230 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
15240 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b  veLabel(v, lbl);
15250 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
15260 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65        windowCode
15270 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45  Op(&s, WINDOW_RE
15280 54 55 52 4e 5f 52 4f 57 2c 20 72 65 67 45 6e 64  TURN_ROW, regEnd
15290 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 77 69  , 0);.        wi
152a0 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57  ndowCodeOp(&s, W
152b0 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45  INDOW_AGGINVERSE
152c0 2c 20 72 65 67 53 74 61 72 74 2c 20 30 29 3b 0a  , regStart, 0);.
152d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
152e0 7d 65 6c 73 65 0a 20 20 69 66 28 20 70 4d 57 69  }else.  if( pMWi
152f0 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43  n->eEnd==TK_PREC
15300 45 44 49 4e 47 20 29 7b 0a 20 20 20 20 77 69 6e  EDING ){.    win
15310 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49  dowCodeOp(&s, WI
15320 4e 44 4f 57 5f 41 47 47 53 54 45 50 2c 20 72 65  NDOW_AGGSTEP, re
15330 67 45 6e 64 2c 20 30 29 3b 0a 20 20 20 20 77 69  gEnd, 0);.    wi
15340 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57  ndowCodeOp(&s, W
15350 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57  INDOW_RETURN_ROW
15360 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 77 69 6e  , 0, 0);.    win
15370 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49  dowCodeOp(&s, WI
15380 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 2c  NDOW_AGGINVERSE,
15390 20 72 65 67 53 74 61 72 74 2c 20 30 29 3b 0a 20   regStart, 0);. 
153a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
153b0 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 77 69  addr = 0;.    wi
153c0 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57  ndowCodeOp(&s, W
153d0 49 4e 44 4f 57 5f 41 47 47 53 54 45 50 2c 20 30  INDOW_AGGSTEP, 0
153e0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 4d  , 0);.    if( pM
153f0 57 69 6e 2d 3e 65 45 6e 64 21 3d 54 4b 5f 55 4e  Win->eEnd!=TK_UN
15400 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20 20 20  BOUNDED ){.     
15410 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 46 72 6d   if( pMWin->eFrm
15420 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 29  Type==TK_RANGE )
15430 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 62  {.        int lb
15440 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61  l = 0;.        a
15450 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
15460 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
15470 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65 67  .        if( reg
15480 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  End ){.         
15490 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33 56 64   lbl = sqlite3Vd
154a0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
154b0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 77  se);.          w
154c0 69 6e 64 6f 77 43 6f 64 65 52 61 6e 67 65 54 65  indowCodeRangeTe
154d0 73 74 28 26 73 2c 20 4f 50 5f 47 65 2c 20 73 2e  st(&s, OP_Ge, s.
154e0 63 75 72 72 65 6e 74 2e 63 73 72 2c 20 72 65 67  current.csr, reg
154f0 45 6e 64 2c 20 73 2e 65 6e 64 2e 63 73 72 2c 20  End, s.end.csr, 
15500 6c 62 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lbl);.        }.
15510 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f          windowCo
15520 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f  deOp(&s, WINDOW_
15530 52 45 54 55 52 4e 5f 52 4f 57 2c 20 30 2c 20 30  RETURN_ROW, 0, 0
15540 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f  );.        windo
15550 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44  wCodeOp(&s, WIND
15560 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 2c 20 72  OW_AGGINVERSE, r
15570 65 67 53 74 61 72 74 2c 20 30 29 3b 0a 20 20 20  egStart, 0);.   
15580 20 20 20 20 20 69 66 28 20 72 65 67 45 6e 64 20       if( regEnd 
15590 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
155a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
155b0 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
155c0 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  dr);.          s
155d0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
155e0 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a  eLabel(v, lbl);.
155f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15600 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
15610 66 28 20 72 65 67 45 6e 64 20 29 7b 0a 20 20 20  f( regEnd ){.   
15620 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71         addr = sq
15630 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
15640 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 72 65 67  v, OP_IfPos, reg
15650 45 6e 64 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20  End, 0, 1);.    
15660 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
15670 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 7d  ge(v);.        }
15680 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43  .        windowC
15690 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57  odeOp(&s, WINDOW
156a0 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 30 2c 20  _RETURN_ROW, 0, 
156b0 30 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 64  0);.        wind
156c0 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e  owCodeOp(&s, WIN
156d0 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 2c 20  DOW_AGGINVERSE, 
156e0 72 65 67 53 74 61 72 74 2c 20 30 29 3b 0a 20 20  regStart, 0);.  
156f0 20 20 20 20 20 20 69 66 28 20 72 65 67 45 6e 64        if( regEnd
15700 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75   ) sqlite3VdbeJu
15710 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
15720 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
15730 20 7d 0a 0a 20 20 2f 2a 20 45 6e 64 20 6f 66 20   }..  /* End of 
15740 74 68 65 20 6d 61 69 6e 20 69 6e 70 75 74 20 6c  the main input l
15750 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  oop */.  sqlite3
15760 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
15770 28 76 2c 20 6c 62 6c 57 68 65 72 65 45 6e 64 29  (v, lblWhereEnd)
15780 3b 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65  ;.  sqlite3Where
15790 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a 20 20  End(pWInfo);..  
157a0 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20  /* Fall through 
157b0 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  */.  if( pMWin->
157c0 70 50 61 72 74 69 74 69 6f 6e 20 29 7b 0a 20 20  pPartition ){.  
157d0 20 20 61 64 64 72 49 6e 74 65 67 65 72 20 3d 20    addrInteger = 
157e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
157f0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
15800 20 30 2c 20 72 65 67 46 6c 75 73 68 50 61 72 74   0, regFlushPart
15810 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
15820 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
15830 64 72 47 6f 73 75 62 46 6c 75 73 68 29 3b 0a 20  drGosubFlush);. 
15840 20 7d 0a 0a 20 20 61 64 64 72 45 6d 70 74 79 20   }..  addrEmpty 
15850 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
15860 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op1(v, OP_Rewind
15870 2c 20 63 73 72 57 72 69 74 65 29 3b 0a 20 20 56  , csrWrite);.  V
15880 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
15890 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e    if( pMWin->eEn
158a0 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20  d==TK_PRECEDING 
158b0 29 7b 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f 64  ){.    windowCod
158c0 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41  eOp(&s, WINDOW_A
158d0 47 47 53 54 45 50 2c 20 72 65 67 45 6e 64 2c 20  GGSTEP, regEnd, 
158e0 30 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f  0);.    windowCo
158f0 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f  deOp(&s, WINDOW_
15900 52 45 54 55 52 4e 5f 52 4f 57 2c 20 30 2c 20 30  RETURN_ROW, 0, 0
15910 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
15920 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
15930 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20  _FOLLOWING ){.  
15940 20 20 69 6e 74 20 61 64 64 72 53 74 61 72 74 3b    int addrStart;
15950 0a 20 20 20 20 69 6e 74 20 61 64 64 72 42 72 65  .    int addrBre
15960 61 6b 31 3b 0a 20 20 20 20 69 6e 74 20 61 64 64  ak1;.    int add
15970 72 42 72 65 61 6b 32 3b 0a 20 20 20 20 69 6e 74  rBreak2;.    int
15980 20 61 64 64 72 42 72 65 61 6b 33 3b 0a 20 20 20   addrBreak3;.   
15990 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73   windowCodeOp(&s
159a0 2c 20 57 49 4e 44 4f 57 5f 41 47 47 53 54 45 50  , WINDOW_AGGSTEP
159b0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
159c0 20 70 4d 57 69 6e 2d 3e 65 46 72 6d 54 79 70 65   pMWin->eFrmType
159d0 3d 3d 54 4b 5f 52 41 4e 47 45 20 29 7b 0a 20 20  ==TK_RANGE ){.  
159e0 20 20 20 20 61 64 64 72 53 74 61 72 74 20 3d 20      addrStart = 
159f0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
15a00 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
15a10 20 61 64 64 72 42 72 65 61 6b 32 20 3d 20 77 69   addrBreak2 = wi
15a20 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57  ndowCodeOp(&s, W
15a30 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45  INDOW_AGGINVERSE
15a40 2c 20 72 65 67 53 74 61 72 74 2c 20 31 29 3b 0a  , regStart, 1);.
15a50 20 20 20 20 20 20 61 64 64 72 42 72 65 61 6b 31        addrBreak1
15a60 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28   = windowCodeOp(
15a70 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55 52  &s, WINDOW_RETUR
15a80 4e 5f 52 4f 57 2c 20 30 2c 20 31 29 3b 0a 20 20  N_ROW, 0, 1);.  
15a90 20 20 7d 65 6c 73 65 0a 20 20 20 20 69 66 28 20    }else.    if( 
15aa0 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f  pMWin->eEnd==TK_
15ab0 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20  UNBOUNDED ){.   
15ac0 20 20 20 61 64 64 72 53 74 61 72 74 20 3d 20 73     addrStart = s
15ad0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
15ae0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
15af0 61 64 64 72 42 72 65 61 6b 31 20 3d 20 77 69 6e  addrBreak1 = win
15b00 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49  dowCodeOp(&s, WI
15b10 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c  NDOW_RETURN_ROW,
15b20 20 72 65 67 53 74 61 72 74 2c 20 31 29 3b 0a 20   regStart, 1);. 
15b30 20 20 20 20 20 61 64 64 72 42 72 65 61 6b 32 20       addrBreak2 
15b40 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26  = windowCodeOp(&
15b50 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56  s, WINDOW_AGGINV
15b60 45 52 53 45 2c 20 30 2c 20 31 29 3b 0a 20 20 20  ERSE, 0, 1);.   
15b70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
15b80 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 45 6e  sert( pMWin->eEn
15b90 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  d==TK_FOLLOWING 
15ba0 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53 74 61  );.      addrSta
15bb0 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
15bc0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
15bd0 20 20 20 20 20 20 61 64 64 72 42 72 65 61 6b 31        addrBreak1
15be0 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28   = windowCodeOp(
15bf0 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55 52  &s, WINDOW_RETUR
15c00 4e 5f 52 4f 57 2c 20 72 65 67 45 6e 64 2c 20 31  N_ROW, regEnd, 1
15c10 29 3b 0a 20 20 20 20 20 20 61 64 64 72 42 72 65  );.      addrBre
15c20 61 6b 32 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65  ak2 = windowCode
15c30 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47  Op(&s, WINDOW_AG
15c40 47 49 4e 56 45 52 53 45 2c 20 72 65 67 53 74 61  GINVERSE, regSta
15c50 72 74 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  rt, 1);.    }.  
15c60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15c70 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
15c80 30 2c 20 61 64 64 72 53 74 61 72 74 29 3b 0a 20  0, addrStart);. 
15c90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
15ca0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 42 72  mpHere(v, addrBr
15cb0 65 61 6b 32 29 3b 0a 20 20 20 20 61 64 64 72 53  eak2);.    addrS
15cc0 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
15cd0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
15ce0 3b 0a 20 20 20 20 61 64 64 72 42 72 65 61 6b 33  ;.    addrBreak3
15cf0 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28   = windowCodeOp(
15d00 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55 52  &s, WINDOW_RETUR
15d10 4e 5f 52 4f 57 2c 20 30 2c 20 31 29 3b 0a 20 20  N_ROW, 0, 1);.  
15d20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15d30 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
15d40 30 2c 20 61 64 64 72 53 74 61 72 74 29 3b 0a 20  0, addrStart);. 
15d50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
15d60 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 42 72  mpHere(v, addrBr
15d70 65 61 6b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  eak1);.    sqlit
15d80 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
15d90 2c 20 61 64 64 72 42 72 65 61 6b 33 29 3b 0a 20  , addrBreak3);. 
15da0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
15db0 61 64 64 72 42 72 65 61 6b 3b 0a 20 20 20 20 69  addrBreak;.    i
15dc0 6e 74 20 61 64 64 72 53 74 61 72 74 3b 0a 20 20  nt addrStart;.  
15dd0 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26    windowCodeOp(&
15de0 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 53 54 45  s, WINDOW_AGGSTE
15df0 50 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 61 64  P, 0, 0);.    ad
15e00 64 72 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65  drStart = sqlite
15e10 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
15e20 28 76 29 3b 0a 20 20 20 20 61 64 64 72 42 72 65  (v);.    addrBre
15e30 61 6b 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f  ak = windowCodeO
15e40 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54  p(&s, WINDOW_RET
15e50 55 52 4e 5f 52 4f 57 2c 20 30 2c 20 31 29 3b 0a  URN_ROW, 0, 1);.
15e60 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70      windowCodeOp
15e70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49  (&s, WINDOW_AGGI
15e80 4e 56 45 52 53 45 2c 20 72 65 67 53 74 61 72 74  NVERSE, regStart
15e90 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
15ea0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15eb0 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 53  P_Goto, 0, addrS
15ec0 74 61 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  tart);.    sqlit
15ed0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
15ee0 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
15ef0 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  }.  sqlite3VdbeJ
15f00 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 45  umpHere(v, addrE
15f10 6d 70 74 79 29 3b 0a 0a 20 20 73 71 6c 69 74 65  mpty);..  sqlite
15f20 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
15f30 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20 73  P_ResetSorter, s
15f40 2e 63 75 72 72 65 6e 74 2e 63 73 72 29 3b 0a 20  .current.csr);. 
15f50 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70 50 61 72   if( pMWin->pPar
15f60 74 69 74 69 6f 6e 20 29 7b 0a 20 20 20 20 69 66  tition ){.    if
15f70 28 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72  ( pMWin->regStar
15f80 74 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  tRowid ){.      
15f90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15fa0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
15fb0 20 31 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74   1, pMWin->regSt
15fc0 61 72 74 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  artRowid);.     
15fd0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15fe0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
15ff0 2c 20 30 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 45  , 0, pMWin->regE
16000 6e 64 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a  ndRowid);.    }.
16010 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
16020 68 61 6e 67 65 50 31 28 76 2c 20 61 64 64 72 49  hangeP1(v, addrI
16030 6e 74 65 67 65 72 2c 20 73 71 6c 69 74 65 33 56  nteger, sqlite3V
16040 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
16050 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ));.    sqlite3V
16060 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
16070 52 65 74 75 72 6e 2c 20 72 65 67 46 6c 75 73 68  Return, regFlush
16080 50 61 72 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 65  Part);.  }.}..#e
16090 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
160a0 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a  MIT_WINDOWFUNC *
160b0 2f 0a                                            /.