/ Hex Artifact Content
Login

Artifact ac687a055121a757d951584285d1ae4554245f98cd17f6092118b29c17340d8f:


0000: 2f 2a 0a 2a 2a 20 32 30 31 38 20 4d 61 79 20 30  /*.** 2018 May 0
0010: 38 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  8.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
0180: 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 6e  liteInt.h"..#ifn
0190: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
01a0: 57 49 4e 44 4f 57 46 55 4e 43 0a 0a 2f 2a 0a 2a  WINDOWFUNC../*.*
01b0: 2a 20 53 45 4c 45 43 54 20 52 45 57 52 49 54 49  * SELECT REWRITI
01c0: 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 41 6e 79 20 53  NG.**.**   Any S
01d0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
01e0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  that contains on
01f0: 65 20 6f 72 20 6d 6f 72 65 20 77 69 6e 64 6f 77  e or more window
0200: 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 0a 2a 2a   functions in.**
0210: 20 20 20 65 69 74 68 65 72 20 74 68 65 20 73 65     either the se
0220: 6c 65 63 74 20 6c 69 73 74 20 6f 72 20 4f 52 44  lect list or ORD
0230: 45 52 20 42 59 20 63 6c 61 75 73 65 20 28 74 68  ER BY clause (th
0240: 65 20 6f 6e 6c 79 20 74 77 6f 20 70 6c 61 63 65  e only two place
0250: 73 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20 66 75  s window.**   fu
0260: 6e 63 74 69 6f 6e 73 20 6d 61 79 20 62 65 20 75  nctions may be u
0270: 73 65 64 29 20 69 73 20 74 72 61 6e 73 66 6f 72  sed) is transfor
0280: 6d 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20  med by function 
0290: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 52 65 77  sqlite3WindowRew
02a0: 72 69 74 65 28 29 0a 2a 2a 20 20 20 69 6e 20 6f  rite().**   in o
02b0: 72 64 65 72 20 74 6f 20 73 75 70 70 6f 72 74 20  rder to support 
02c0: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
02d0: 70 72 6f 63 65 73 73 69 6e 67 2e 20 46 6f 72 20  processing. For 
02e0: 65 78 61 6d 70 6c 65 2c 20 77 69 74 68 20 74 68  example, with th
02f0: 65 0a 2a 2a 20 20 20 73 63 68 65 6d 61 3a 0a 2a  e.**   schema:.*
0300: 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20  *.**     CREATE 
0310: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63  TABLE t1(a, b, c
0320: 2c 20 64 2c 20 65 2c 20 66 2c 20 67 29 3b 0a 2a  , d, e, f, g);.*
0330: 2a 0a 2a 2a 20 20 20 74 68 65 20 73 74 61 74 65  *.**   the state
0340: 6d 65 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment:.**.**     
0350: 53 45 4c 45 43 54 20 61 2b 31 2c 20 6d 61 78 28  SELECT a+1, max(
0360: 62 29 20 4f 56 45 52 20 28 50 41 52 54 49 54 49  b) OVER (PARTITI
0370: 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20 42 59  ON BY c ORDER BY
0380: 20 64 29 20 46 52 4f 4d 20 74 31 20 4f 52 44 45   d) FROM t1 ORDE
0390: 52 20 42 59 20 65 3b 0a 2a 2a 0a 2a 2a 20 20 20  R BY e;.**.**   
03a0: 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74  is transformed t
03b0: 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  o:.**.**     SEL
03c0: 45 43 54 20 61 2b 31 2c 20 6d 61 78 28 62 29 20  ECT a+1, max(b) 
03d0: 4f 56 45 52 20 28 50 41 52 54 49 54 49 4f 4e 20  OVER (PARTITION 
03e0: 42 59 20 63 20 4f 52 44 45 52 20 42 59 20 64 29  BY c ORDER BY d)
03f0: 20 46 52 4f 4d 20 28 0a 2a 2a 20 20 20 20 20 20   FROM (.**      
0400: 20 20 20 53 45 4c 45 43 54 20 61 2c 20 65 2c 20     SELECT a, e, 
0410: 63 2c 20 64 2c 20 62 20 46 52 4f 4d 20 74 31 20  c, d, b FROM t1 
0420: 4f 52 44 45 52 20 42 59 20 63 2c 20 64 0a 2a 2a  ORDER BY c, d.**
0430: 20 20 20 20 20 29 20 4f 52 44 45 52 20 42 59 20       ) ORDER BY 
0440: 65 3b 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66  e;.**.**   The f
0450: 6c 61 74 74 65 6e 69 6e 67 20 6f 70 74 69 6d 69  lattening optimi
0460: 7a 61 74 69 6f 6e 20 69 73 20 64 69 73 61 62 6c  zation is disabl
0470: 65 64 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69  ed when processi
0480: 6e 67 20 74 68 69 73 20 74 72 61 6e 73 66 6f 72  ng this transfor
0490: 6d 65 64 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  med.**   SELECT 
04a0: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
04b0: 61 6c 6c 6f 77 73 20 74 68 65 20 69 6d 70 6c 65  allows the imple
04c0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
04d0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
04e0: 0a 2a 2a 20 20 20 28 69 6e 20 74 68 69 73 20 63  .**   (in this c
04f0: 61 73 65 20 6d 61 78 28 29 29 20 74 6f 20 70 72  ase max()) to pr
0500: 6f 63 65 73 73 20 72 6f 77 73 20 73 6f 72 74 65  ocess rows sorte
0510: 64 20 69 6e 20 6f 72 64 65 72 20 6f 66 20 28 63  d in order of (c
0520: 2c 20 64 29 2c 20 77 68 69 63 68 0a 2a 2a 20 20  , d), which.**  
0530: 20 6d 61 6b 65 73 20 74 68 69 6e 67 73 20 65 61   makes things ea
0540: 73 69 65 72 20 66 6f 72 20 6f 62 76 69 6f 75 73  sier for obvious
0550: 20 72 65 61 73 6f 6e 73 2e 20 4d 6f 72 65 20 67   reasons. More g
0560: 65 6e 65 72 61 6c 6c 79 3a 0a 2a 2a 0a 2a 2a 20  enerally:.**.** 
0570: 20 20 20 20 2a 20 46 52 4f 4d 2c 20 57 48 45 52      * FROM, WHER
0580: 45 2c 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20  E, GROUP BY and 
0590: 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73 20 61  HAVING clauses a
05a0: 72 65 20 61 6c 6c 20 6d 6f 76 65 64 20 74 6f 20  re all moved to 
05b0: 0a 2a 2a 20 20 20 20 20 20 20 74 68 65 20 73 75  .**       the su
05c0: 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  b-query..**.**  
05d0: 20 20 20 2a 20 4f 52 44 45 52 20 42 59 2c 20 4c     * ORDER BY, L
05e0: 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
05f0: 72 65 6d 61 69 6e 20 70 61 72 74 20 6f 66 20 74  remain part of t
0600: 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 2e  he parent query.
0610: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 65 72  .**.**     * Ter
0620: 6d 69 6e 61 6c 73 20 66 72 6f 6d 20 65 61 63 68  minals from each
0630: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
0640: 6f 6e 20 74 72 65 65 73 20 74 68 61 74 20 6d 61  on trees that ma
0650: 6b 65 20 75 70 20 74 68 65 20 0a 2a 2a 20 20 20  ke up the .**   
0660: 20 20 20 20 73 65 6c 65 63 74 2d 6c 69 73 74 20      select-list 
0670: 61 6e 64 20 4f 52 44 45 52 20 42 59 20 65 78 70  and ORDER BY exp
0680: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20  ressions in the 
0690: 70 61 72 65 6e 74 20 71 75 65 72 79 20 61 72 65  parent query are
06a0: 0a 2a 2a 20 20 20 20 20 20 20 73 65 6c 65 63 74  .**       select
06b0: 65 64 20 62 79 20 74 68 65 20 73 75 62 2d 71 75  ed by the sub-qu
06c0: 65 72 79 2e 20 46 6f 72 20 74 68 65 20 70 75 72  ery. For the pur
06d0: 70 6f 73 65 73 20 6f 66 20 74 68 65 20 74 72 61  poses of the tra
06e0: 6e 73 66 6f 72 6d 61 74 69 6f 6e 2c 0a 2a 2a 20  nsformation,.** 
06f0: 20 20 20 20 20 20 74 65 72 6d 69 6e 61 6c 73 20        terminals 
0700: 61 72 65 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72  are column refer
0710: 65 6e 63 65 73 20 61 6e 64 20 61 67 67 72 65 67  ences and aggreg
0720: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  ate functions..*
0730: 2a 0a 2a 2a 20 20 20 49 66 20 74 68 65 72 65 20  *.**   If there 
0740: 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  is more than one
0750: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
0760: 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 74   in the SELECT t
0770: 68 61 74 20 75 73 65 73 0a 2a 2a 20 20 20 74 68  hat uses.**   th
0780: 65 20 73 61 6d 65 20 77 69 6e 64 6f 77 20 64 65  e same window de
0790: 63 6c 61 72 61 74 69 6f 6e 20 28 74 68 65 20 4f  claration (the O
07a0: 56 45 52 20 62 69 74 29 2c 20 74 68 65 6e 20 61  VER bit), then a
07b0: 20 73 69 6e 67 6c 65 20 73 63 61 6e 20 6d 61 79   single scan may
07c0: 0a 2a 2a 20 20 20 62 65 20 75 73 65 64 20 74 6f  .**   be used to
07d0: 20 70 72 6f 63 65 73 73 20 6d 6f 72 65 20 74 68   process more th
07e0: 61 6e 20 6f 6e 65 20 77 69 6e 64 6f 77 20 66 75  an one window fu
07f0: 6e 63 74 69 6f 6e 2e 20 46 6f 72 20 65 78 61 6d  nction. For exam
0800: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ple:.**.**     S
0810: 45 4c 45 43 54 20 6d 61 78 28 62 29 20 4f 56 45  ELECT max(b) OVE
0820: 52 20 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20  R (PARTITION BY 
0830: 63 20 4f 52 44 45 52 20 42 59 20 64 29 2c 20 0a  c ORDER BY d), .
0840: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 6d 69  **            mi
0850: 6e 28 65 29 20 4f 56 45 52 20 28 50 41 52 54 49  n(e) OVER (PARTI
0860: 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20  TION BY c ORDER 
0870: 42 59 20 64 29 20 0a 2a 2a 20 20 20 20 20 46 52  BY d) .**     FR
0880: 4f 4d 20 74 31 3b 0a 2a 2a 0a 2a 2a 20 20 20 69  OM t1;.**.**   i
0890: 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  s transformed in
08a0: 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73   the same way as
08b0: 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f   the example abo
08c0: 76 65 2e 20 48 6f 77 65 76 65 72 3a 0a 2a 2a 0a  ve. However:.**.
08d0: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 6d 61  **     SELECT ma
08e0: 78 28 62 29 20 4f 56 45 52 20 28 50 41 52 54 49  x(b) OVER (PARTI
08f0: 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20  TION BY c ORDER 
0900: 42 59 20 64 29 2c 20 0a 2a 2a 20 20 20 20 20 20  BY d), .**      
0910: 20 20 20 20 20 20 6d 69 6e 28 65 29 20 4f 56 45        min(e) OVE
0920: 52 20 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20  R (PARTITION BY 
0930: 61 20 4f 52 44 45 52 20 42 59 20 62 29 20 0a 2a  a ORDER BY b) .*
0940: 2a 20 20 20 20 20 46 52 4f 4d 20 74 31 3b 0a 2a  *     FROM t1;.*
0950: 2a 0a 2a 2a 20 20 20 4d 75 73 74 20 62 65 20 74  *.**   Must be t
0960: 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 2a  ransformed to:.*
0970: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
0980: 6d 61 78 28 62 29 20 4f 56 45 52 20 28 50 41 52  max(b) OVER (PAR
0990: 54 49 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45  TITION BY c ORDE
09a0: 52 20 42 59 20 64 29 20 46 52 4f 4d 20 28 0a 2a  R BY d) FROM (.*
09b0: 2a 20 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  *         SELECT
09c0: 20 65 2c 20 6d 69 6e 28 65 29 20 4f 56 45 52 20   e, min(e) OVER 
09d0: 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20 61 20  (PARTITION BY a 
09e0: 4f 52 44 45 52 20 42 59 20 62 29 2c 20 63 2c 20  ORDER BY b), c, 
09f0: 64 2c 20 62 20 46 52 4f 4d 0a 2a 2a 20 20 20 20  d, b FROM.**    
0a00: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 2c         SELECT a,
0a10: 20 65 2c 20 63 2c 20 64 2c 20 62 20 46 52 4f 4d   e, c, d, b FROM
0a20: 20 74 31 20 4f 52 44 45 52 20 42 59 20 61 2c 20   t1 ORDER BY a, 
0a30: 62 0a 2a 2a 20 20 20 20 20 20 20 20 20 29 20 4f  b.**         ) O
0a40: 52 44 45 52 20 42 59 20 63 2c 20 64 0a 2a 2a 20  RDER BY c, d.** 
0a50: 20 20 20 20 29 20 4f 52 44 45 52 20 42 59 20 65      ) ORDER BY e
0a60: 3b 0a 2a 2a 0a 2a 2a 20 20 20 73 6f 20 74 68 61  ;.**.**   so tha
0a70: 74 20 62 6f 74 68 20 6d 69 6e 28 29 20 61 6e 64  t both min() and
0a80: 20 6d 61 78 28 29 20 6d 61 79 20 70 72 6f 63 65   max() may proce
0a90: 73 73 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6f  ss rows in the o
0aa0: 72 64 65 72 20 64 65 66 69 6e 65 64 20 62 79 0a  rder defined by.
0ab0: 2a 2a 20 20 20 74 68 65 69 72 20 72 65 73 70 65  **   their respe
0ac0: 63 74 69 76 65 20 77 69 6e 64 6f 77 20 64 65 63  ctive window dec
0ad0: 6c 61 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  larations..**.**
0ae0: 20 49 4e 54 45 52 46 41 43 45 20 57 49 54 48 20   INTERFACE WITH 
0af0: 53 45 4c 45 43 54 2e 43 0a 2a 2a 0a 2a 2a 20 20  SELECT.C.**.**  
0b00: 20 57 68 65 6e 20 70 72 6f 63 65 73 73 69 6e 67   When processing
0b10: 20 74 68 65 20 72 65 77 72 69 74 74 65 6e 20 53   the rewritten S
0b20: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
0b30: 20 63 6f 64 65 20 69 6e 20 73 65 6c 65 63 74 2e   code in select.
0b40: 63 20 63 61 6c 6c 73 0a 2a 2a 20 20 20 73 71 6c  c calls.**   sql
0b50: 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
0b60: 20 74 6f 20 62 65 67 69 6e 20 69 74 65 72 61 74   to begin iterat
0b70: 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68 65 20  ing through the 
0b80: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 0a 2a  results of the.*
0b90: 2a 20 20 20 73 75 62 2d 71 75 65 72 79 2c 20 77  *   sub-query, w
0ba0: 68 69 63 68 20 69 73 20 61 6c 77 61 79 73 20 69  hich is always i
0bb0: 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
0bc0: 63 6f 2d 72 6f 75 74 69 6e 65 2e 20 49 74 20 74  co-routine. It t
0bd0: 68 65 6e 20 63 61 6c 6c 73 0a 2a 2a 20 20 20 73  hen calls.**   s
0be0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65  qlite3WindowCode
0bf0: 53 74 65 70 28 29 20 74 6f 20 70 72 6f 63 65 73  Step() to proces
0c00: 73 20 72 6f 77 73 20 61 6e 64 20 66 69 6e 69 73  s rows and finis
0c10: 68 20 74 68 65 20 73 63 61 6e 20 62 79 20 63 61  h the scan by ca
0c20: 6c 6c 69 6e 67 0a 2a 2a 20 20 20 73 71 6c 69 74  lling.**   sqlit
0c30: 65 33 57 68 65 72 65 45 6e 64 28 29 2e 0a 2a 2a  e3WhereEnd()..**
0c40: 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 57 69 6e  .**   sqlite3Win
0c50: 64 6f 77 43 6f 64 65 53 74 65 70 28 29 20 67 65  dowCodeStep() ge
0c60: 6e 65 72 61 74 65 73 20 56 4d 20 63 6f 64 65 20  nerates VM code 
0c70: 73 6f 20 74 68 61 74 2c 20 66 6f 72 20 65 61 63  so that, for eac
0c80: 68 20 72 6f 77 20 72 65 74 75 72 6e 65 64 0a 2a  h row returned.*
0c90: 2a 20 20 20 62 79 20 74 68 65 20 73 75 62 2d 71  *   by the sub-q
0ca0: 75 65 72 79 20 61 20 73 75 62 2d 72 6f 75 74 69  uery a sub-routi
0cb0: 6e 65 20 28 4f 50 5f 47 6f 73 75 62 29 20 63 6f  ne (OP_Gosub) co
0cc0: 64 65 64 20 62 79 20 73 65 6c 65 63 74 2e 63 20  ded by select.c 
0cd0: 69 73 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2a 20 20  is invoked..**  
0ce0: 20 57 68 65 6e 20 74 68 65 20 73 75 62 2d 72 6f   When the sub-ro
0cf0: 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64  utine is invoked
0d00: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 68  :.**.**     * Th
0d10: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 61 6c 6c  e results of all
0d20: 20 77 69 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e   window-function
0d30: 73 20 66 6f 72 20 74 68 65 20 72 6f 77 20 61 72  s for the row ar
0d40: 65 20 73 74 6f 72 65 64 0a 2a 2a 20 20 20 20 20  e stored.**     
0d50: 20 20 69 6e 20 74 68 65 20 61 73 73 6f 63 69 61    in the associa
0d60: 74 65 64 20 57 69 6e 64 6f 77 2e 72 65 67 52 65  ted Window.regRe
0d70: 73 75 6c 74 20 72 65 67 69 73 74 65 72 73 2e 0a  sult registers..
0d80: 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 68 65 20  **.**     * The 
0d90: 72 65 71 75 69 72 65 64 20 74 65 72 6d 69 6e 61  required termina
0da0: 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f  l values are sto
0db0: 72 65 64 20 69 6e 20 74 68 65 20 63 75 72 72 65  red in the curre
0dc0: 6e 74 20 72 6f 77 20 6f 66 0a 2a 2a 20 20 20 20  nt row of.**    
0dd0: 20 20 20 74 65 6d 70 20 74 61 62 6c 65 20 57 69     temp table Wi
0de0: 6e 64 6f 77 2e 69 45 70 68 43 73 72 2e 0a 2a 2a  ndow.iEphCsr..**
0df0: 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 63 61  .**   In some ca
0e00: 73 65 73 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  ses, depending o
0e10: 6e 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61  n the window fra
0e20: 6d 65 20 61 6e 64 20 74 68 65 20 73 70 65 63 69  me and the speci
0e30: 66 69 63 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20  fic window.**   
0e40: 66 75 6e 63 74 69 6f 6e 73 20 69 6e 76 6f 6b 65  functions invoke
0e50: 64 2c 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  d, sqlite3Window
0e60: 43 6f 64 65 53 74 65 70 28 29 20 63 61 63 68 65  CodeStep() cache
0e70: 73 20 65 61 63 68 20 65 6e 74 69 72 65 20 70 61  s each entire pa
0e80: 72 74 69 74 69 6f 6e 0a 2a 2a 20 20 20 69 6e 20  rtition.**   in 
0e90: 61 20 74 65 6d 70 20 74 61 62 6c 65 20 62 65 66  a temp table bef
0ea0: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 61 6e  ore returning an
0eb0: 79 20 72 6f 77 73 2e 20 49 6e 20 6f 74 68 65 72  y rows. In other
0ec0: 20 63 61 73 65 73 20 69 74 20 64 6f 65 73 20 6e   cases it does n
0ed0: 6f 74 2e 0a 2a 2a 20 20 20 54 68 69 73 20 64 65  ot..**   This de
0ee0: 74 61 69 6c 20 69 73 20 65 6e 63 61 70 73 75 6c  tail is encapsul
0ef0: 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 69 73  ated within this
0f00: 20 66 69 6c 65 2c 20 74 68 65 20 63 6f 64 65 20   file, the code 
0f10: 67 65 6e 65 72 61 74 65 64 20 62 79 0a 2a 2a 20  generated by.** 
0f20: 20 20 73 65 6c 65 63 74 2e 63 20 69 73 20 74 68    select.c is th
0f30: 65 20 73 61 6d 65 20 69 6e 20 65 69 74 68 65 72  e same in either
0f40: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 55 49   case..**.** BUI
0f50: 4c 54 2d 49 4e 20 57 49 4e 44 4f 57 20 46 55 4e  LT-IN WINDOW FUN
0f60: 43 54 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 54  CTIONS.**.**   T
0f70: 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  his implementati
0f80: 6f 6e 20 66 65 61 74 75 72 65 73 20 74 68 65 20  on features the 
0f90: 66 6f 6c 6c 6f 77 69 6e 67 20 62 75 69 6c 74 2d  following built-
0fa0: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
0fb0: 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72  ons:.**.**     r
0fc0: 6f 77 5f 6e 75 6d 62 65 72 28 29 0a 2a 2a 20 20  ow_number().**  
0fd0: 20 20 20 72 61 6e 6b 28 29 0a 2a 2a 20 20 20 20     rank().**    
0fe0: 20 64 65 6e 73 65 5f 72 61 6e 6b 28 29 0a 2a 2a   dense_rank().**
0ff0: 20 20 20 20 20 70 65 72 63 65 6e 74 5f 72 61 6e       percent_ran
1000: 6b 28 29 0a 2a 2a 20 20 20 20 20 63 75 6d 65 5f  k().**     cume_
1010: 64 69 73 74 28 29 0a 2a 2a 20 20 20 20 20 6e 74  dist().**     nt
1020: 69 6c 65 28 4e 29 0a 2a 2a 20 20 20 20 20 6c 65  ile(N).**     le
1030: 61 64 28 65 78 70 72 20 5b 2c 20 6f 66 66 73 65  ad(expr [, offse
1040: 74 20 5b 2c 20 64 65 66 61 75 6c 74 5d 5d 29 0a  t [, default]]).
1050: 2a 2a 20 20 20 20 20 6c 61 67 28 65 78 70 72 20  **     lag(expr 
1060: 5b 2c 20 6f 66 66 73 65 74 20 5b 2c 20 64 65 66  [, offset [, def
1070: 61 75 6c 74 5d 5d 29 0a 2a 2a 20 20 20 20 20 66  ault]]).**     f
1080: 69 72 73 74 5f 76 61 6c 75 65 28 65 78 70 72 29  irst_value(expr)
1090: 0a 2a 2a 20 20 20 20 20 6c 61 73 74 5f 76 61 6c  .**     last_val
10a0: 75 65 28 65 78 70 72 29 0a 2a 2a 20 20 20 20 20  ue(expr).**     
10b0: 6e 74 68 5f 76 61 6c 75 65 28 65 78 70 72 2c 20  nth_value(expr, 
10c0: 4e 29 0a 2a 2a 20 20 20 0a 2a 2a 20 20 20 54 68  N).**   .**   Th
10d0: 65 73 65 20 61 72 65 20 74 68 65 20 73 61 6d 65  ese are the same
10e0: 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77   built-in window
10f0: 20 66 75 6e 63 74 69 6f 6e 73 20 73 75 70 70 6f   functions suppo
1100: 72 74 65 64 20 62 79 20 50 6f 73 74 67 72 65 73  rted by Postgres
1110: 2e 20 0a 2a 2a 20 20 20 41 6c 74 68 6f 75 67 68  . .**   Although
1120: 20 74 68 65 20 62 65 68 61 76 69 6f 75 72 20 6f   the behaviour o
1130: 66 20 61 67 67 72 65 67 61 74 65 20 77 69 6e 64  f aggregate wind
1140: 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 28 66 75  ow functions (fu
1150: 6e 63 74 69 6f 6e 73 20 74 68 61 74 0a 2a 2a 20  nctions that.** 
1160: 20 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 73    can be used as
1170: 20 65 69 74 68 65 72 20 61 67 67 72 65 67 61 74   either aggregat
1180: 65 73 20 6f 72 20 77 69 6e 64 6f 77 20 66 75 6e  es or window fun
1190: 74 69 6f 6e 73 29 20 61 6c 6c 6f 77 73 20 74 68  tions) allows th
11a0: 65 6d 20 74 6f 0a 2a 2a 20 20 20 62 65 20 69 6d  em to.**   be im
11b0: 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20  plemented using 
11c0: 61 6e 20 41 50 49 2c 20 62 75 69 6c 74 2d 69 6e  an API, built-in
11d0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
11e0: 73 20 61 72 65 20 6d 75 63 68 20 6d 6f 72 65 0a  s are much more.
11f0: 2a 2a 20 20 20 65 73 6f 74 65 72 69 63 2e 20 41  **   esoteric. A
1200: 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 73 6f 6d  dditionally, som
1210: 65 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  e window functio
1220: 6e 73 20 28 65 2e 67 2e 20 6e 74 68 5f 76 61 6c  ns (e.g. nth_val
1230: 75 65 28 29 29 20 0a 2a 2a 20 20 20 6d 61 79 20  ue()) .**   may 
1240: 6f 6e 6c 79 20 62 65 20 69 6d 70 6c 65 6d 65 6e  only be implemen
1250: 74 65 64 20 62 79 20 63 61 63 68 69 6e 67 20 74  ted by caching t
1260: 68 65 20 65 6e 74 69 72 65 20 70 61 72 74 69 74  he entire partit
1270: 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a  ion in memory..*
1280: 2a 20 20 20 41 73 20 73 75 63 68 2c 20 73 6f 6d  *   As such, som
1290: 65 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  e built-in windo
12a0: 77 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 20  w functions use 
12b0: 74 68 65 20 73 61 6d 65 20 41 50 49 20 61 73 20  the same API as 
12c0: 61 67 67 72 65 67 61 74 65 0a 2a 2a 20 20 20 77  aggregate.**   w
12d0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
12e0: 61 6e 64 20 73 6f 6d 65 20 61 72 65 20 69 6d 70  and some are imp
12f0: 6c 65 6d 65 6e 74 65 64 20 64 69 72 65 63 74 6c  lemented directl
1300: 79 20 75 73 69 6e 67 20 56 44 42 45 20 0a 2a 2a  y using VDBE .**
1310: 20 20 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e     instructions.
1320: 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 66   Additionally, f
1330: 6f 72 20 74 68 6f 73 65 20 66 75 6e 63 74 69 6f  or those functio
1340: 6e 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20  ns that use the 
1350: 41 50 49 2c 20 74 68 65 0a 2a 2a 20 20 20 77 69  API, the.**   wi
1360: 6e 64 6f 77 20 66 72 61 6d 65 20 69 73 20 73 6f  ndow frame is so
1370: 6d 65 74 69 6d 65 73 20 6d 6f 64 69 66 69 65 64  metimes modified
1380: 20 62 65 66 6f 72 65 20 74 68 65 20 53 45 4c 45   before the SELE
1390: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a  CT statement is.
13a0: 2a 2a 20 20 20 72 65 77 72 69 74 74 65 6e 2e 20  **   rewritten. 
13b0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 72 65 67  For example, reg
13c0: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 73  ardless of the s
13d0: 70 65 63 69 66 69 65 64 20 77 69 6e 64 6f 77 20  pecified window 
13e0: 66 72 61 6d 65 2c 20 74 68 65 0a 2a 2a 20 20 20  frame, the.**   
13f0: 72 6f 77 5f 6e 75 6d 62 65 72 28 29 20 66 75 6e  row_number() fun
1400: 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 75 73 65  ction always use
1410: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 4f 57  s:.**.**     ROW
1420: 53 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e  S BETWEEN UNBOUN
1430: 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e  DED PRECEDING AN
1440: 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a  D CURRENT ROW.**
1450: 0a 2a 2a 20 20 20 53 65 65 20 73 71 6c 69 74 65  .**   See sqlite
1460: 33 57 69 6e 64 6f 77 55 70 64 61 74 65 28 29 20  3WindowUpdate() 
1470: 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  for details..**.
1480: 2a 2a 20 20 20 41 73 20 77 65 6c 6c 20 61 73 20  **   As well as 
1490: 73 6f 6d 65 20 6f 66 20 74 68 65 20 62 75 69 6c  some of the buil
14a0: 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63  t-in window func
14b0: 74 69 6f 6e 73 2c 20 61 67 67 72 65 67 61 74 65  tions, aggregate
14c0: 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20 66 75 6e   window.**   fun
14d0: 63 74 69 6f 6e 73 20 6d 69 6e 28 29 20 61 6e 64  ctions min() and
14e0: 20 6d 61 78 28 29 20 61 72 65 20 69 6d 70 6c 65   max() are imple
14f0: 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 56 44 42  mented using VDB
1500: 45 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 69  E instructions i
1510: 66 0a 2a 2a 20 20 20 74 68 65 20 73 74 61 72 74  f.**   the start
1520: 20 6f 66 20 74 68 65 20 77 69 6e 64 6f 77 20 66   of the window f
1530: 72 61 6d 65 20 69 73 20 64 65 63 6c 61 72 65 64  rame is declared
1540: 20 61 73 20 61 6e 79 74 68 69 6e 67 20 6f 74 68   as anything oth
1550: 65 72 20 74 68 61 6e 20 0a 2a 2a 20 20 20 55 4e  er than .**   UN
1560: 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e  BOUNDED PRECEDIN
1570: 47 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  G..*/../*.** Imp
1580: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 62  lementation of b
1590: 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66  uilt-in window f
15a0: 75 6e 63 74 69 6f 6e 20 72 6f 77 5f 6e 75 6d 62  unction row_numb
15b0: 65 72 28 29 2e 20 41 73 73 75 6d 65 73 20 74 68  er(). Assumes th
15c0: 61 74 20 74 68 65 0a 2a 2a 20 77 69 6e 64 6f 77  at the.** window
15d0: 20 66 72 61 6d 65 20 68 61 73 20 62 65 65 6e 20   frame has been 
15e0: 63 6f 65 72 63 65 64 20 74 6f 3a 0a 2a 2a 0a 2a  coerced to:.**.*
15f0: 2a 20 20 20 52 4f 57 53 20 42 45 54 57 45 45 4e  *   ROWS BETWEEN
1600: 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45   UNBOUNDED PRECE
1610: 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54  DING AND CURRENT
1620: 20 52 4f 57 0a 2a 2f 0a 73 74 61 74 69 63 20 76   ROW.*/.static v
1630: 6f 69 64 20 72 6f 77 5f 6e 75 6d 62 65 72 53 74  oid row_numberSt
1640: 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  epFunc(.  sqlite
1650: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
1660: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
1670: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
1680: 61 70 41 72 67 0a 29 7b 0a 20 20 69 36 34 20 2a  apArg.){.  i64 *
1690: 70 20 3d 20 28 69 36 34 2a 29 73 71 6c 69 74 65  p = (i64*)sqlite
16a0: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
16b0: 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66  ext(pCtx, sizeof
16c0: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29  (*p));.  if( p )
16d0: 20 28 2a 70 29 2b 2b 3b 0a 20 20 55 4e 55 53 45   (*p)++;.  UNUSE
16e0: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72 67  D_PARAMETER(nArg
16f0: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1700: 4d 45 54 45 52 28 61 70 41 72 67 29 3b 0a 7d 0a  METER(apArg);.}.
1710: 73 74 61 74 69 63 20 76 6f 69 64 20 72 6f 77 5f  static void row_
1720: 6e 75 6d 62 65 72 56 61 6c 75 65 46 75 6e 63 28  numberValueFunc(
1730: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1740: 2a 70 43 74 78 29 7b 0a 20 20 69 36 34 20 2a 70  *pCtx){.  i64 *p
1750: 20 3d 20 28 69 36 34 2a 29 73 71 6c 69 74 65 33   = (i64*)sqlite3
1760: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
1770: 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28  xt(pCtx, sizeof(
1780: 2a 70 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  *p));.  sqlite3_
1790: 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74  result_int64(pCt
17a0: 78 2c 20 28 70 20 3f 20 2a 70 20 3a 20 30 29 29  x, (p ? *p : 0))
17b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65  ;.}../*.** Conte
17c0: 78 74 20 6f 62 6a 65 63 74 20 74 79 70 65 20 75  xt object type u
17d0: 73 65 64 20 62 79 20 72 61 6e 6b 28 29 2c 20 64  sed by rank(), d
17e0: 65 6e 73 65 5f 72 61 6e 6b 28 29 2c 20 70 65 72  ense_rank(), per
17f0: 63 65 6e 74 5f 72 61 6e 6b 28 29 20 61 6e 64 0a  cent_rank() and.
1800: 2a 2a 20 63 75 6d 65 5f 64 69 73 74 28 29 2e 0a  ** cume_dist()..
1810: 2a 2f 0a 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  */.struct CallCo
1820: 75 6e 74 20 7b 0a 20 20 69 36 34 20 6e 56 61 6c  unt {.  i64 nVal
1830: 75 65 3b 0a 20 20 69 36 34 20 6e 53 74 65 70 3b  ue;.  i64 nStep;
1840: 0a 20 20 69 36 34 20 6e 54 6f 74 61 6c 3b 0a 7d  .  i64 nTotal;.}
1850: 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  ;../*.** Impleme
1860: 6e 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74  ntation of built
1870: 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  -in window funct
1880: 69 6f 6e 20 64 65 6e 73 65 5f 72 61 6e 6b 28 29  ion dense_rank()
1890: 2e 20 41 73 73 75 6d 65 73 20 74 68 61 74 0a 2a  . Assumes that.*
18a0: 2a 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61  * the window fra
18b0: 6d 65 20 68 61 73 20 62 65 65 6e 20 73 65 74 20  me has been set 
18c0: 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e 47  to:.**.**   RANG
18d0: 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e  E BETWEEN UNBOUN
18e0: 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e  DED PRECEDING AN
18f0: 44 20 43 55 52 52 45 4e 54 20 52 4f 57 20 0a 2a  D CURRENT ROW .*
1900: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65  /.static void de
1910: 6e 73 65 5f 72 61 6e 6b 53 74 65 70 46 75 6e 63  nse_rankStepFunc
1920: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
1930: 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e  ext *pCtx, .  in
1940: 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65  t nArg,.  sqlite
1950: 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a  3_value **apArg.
1960: 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61 6c 6c  ){.  struct Call
1970: 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70 20 3d 20  Count *p;.  p = 
1980: 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e  (struct CallCoun
1990: 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65  t*)sqlite3_aggre
19a0: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74  gate_context(pCt
19b0: 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  x, sizeof(*p));.
19c0: 20 20 69 66 28 20 70 20 29 20 70 2d 3e 6e 53 74    if( p ) p->nSt
19d0: 65 70 20 3d 20 31 3b 0a 20 20 55 4e 55 53 45 44  ep = 1;.  UNUSED
19e0: 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72 67 29  _PARAMETER(nArg)
19f0: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1a00: 45 54 45 52 28 61 70 41 72 67 29 3b 0a 7d 0a 73  ETER(apArg);.}.s
1a10: 74 61 74 69 63 20 76 6f 69 64 20 64 65 6e 73 65  tatic void dense
1a20: 5f 72 61 6e 6b 56 61 6c 75 65 46 75 6e 63 28 73  _rankValueFunc(s
1a30: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1a40: 70 43 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20  pCtx){.  struct 
1a50: 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20  CallCount *p;.  
1a60: 70 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c  p = (struct Call
1a70: 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61  Count*)sqlite3_a
1a80: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
1a90: 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70  (pCtx, sizeof(*p
1aa0: 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ));.  if( p ){. 
1ab0: 20 20 20 69 66 28 20 70 2d 3e 6e 53 74 65 70 20     if( p->nStep 
1ac0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61 6c  ){.      p->nVal
1ad0: 75 65 2b 2b 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  ue++;.      p->n
1ae0: 53 74 65 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Step = 0;.    }.
1af0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
1b00: 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 70  lt_int64(pCtx, p
1b10: 2d 3e 6e 56 61 6c 75 65 29 3b 0a 20 20 7d 0a 7d  ->nValue);.  }.}
1b20: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
1b30: 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74 2d  tation of built-
1b40: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
1b50: 6f 6e 20 72 61 6e 6b 28 29 2e 20 41 73 73 75 6d  on rank(). Assum
1b60: 65 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 77  es that.** the w
1b70: 69 6e 64 6f 77 20 66 72 61 6d 65 20 68 61 73 20  indow frame has 
1b80: 62 65 65 6e 20 73 65 74 20 74 6f 3a 0a 2a 2a 0a  been set to:.**.
1b90: 2a 2a 20 20 20 52 41 4e 47 45 20 42 45 54 57 45  **   RANGE BETWE
1ba0: 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  EN UNBOUNDED PRE
1bb0: 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45  CEDING AND CURRE
1bc0: 4e 54 20 52 4f 57 20 0a 2a 2f 0a 73 74 61 74 69  NT ROW .*/.stati
1bd0: 63 20 76 6f 69 64 20 72 61 6e 6b 53 74 65 70 46  c void rankStepF
1be0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
1bf0: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
1c00: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
1c10: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41  ite3_value **apA
1c20: 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 43  rg.){.  struct C
1c30: 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70  allCount *p;.  p
1c40: 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43   = (struct CallC
1c50: 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67  ount*)sqlite3_ag
1c60: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
1c70: 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29  pCtx, sizeof(*p)
1c80: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
1c90: 20 20 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 20 20    p->nStep++;.  
1ca0: 20 20 69 66 28 20 70 2d 3e 6e 56 61 6c 75 65 3d    if( p->nValue=
1cb0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  =0 ){.      p->n
1cc0: 56 61 6c 75 65 20 3d 20 70 2d 3e 6e 53 74 65 70  Value = p->nStep
1cd0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 55 4e  ;.    }.  }.  UN
1ce0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
1cf0: 41 72 67 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  Arg);.  UNUSED_P
1d00: 41 52 41 4d 45 54 45 52 28 61 70 41 72 67 29 3b  ARAMETER(apArg);
1d10: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  .}.static void r
1d20: 61 6e 6b 56 61 6c 75 65 46 75 6e 63 28 73 71 6c  ankValueFunc(sql
1d30: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
1d40: 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61  tx){.  struct Ca
1d50: 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70 20  llCount *p;.  p 
1d60: 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  = (struct CallCo
1d70: 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67  unt*)sqlite3_agg
1d80: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70  regate_context(p
1d90: 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  Ctx, sizeof(*p))
1da0: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
1db0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1dc0: 69 6e 74 36 34 28 70 43 74 78 2c 20 70 2d 3e 6e  int64(pCtx, p->n
1dd0: 56 61 6c 75 65 29 3b 0a 20 20 20 20 70 2d 3e 6e  Value);.    p->n
1de0: 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d  Value = 0;.  }.}
1df0: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
1e00: 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74 2d  tation of built-
1e10: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
1e20: 6f 6e 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b 28  on percent_rank(
1e30: 29 2e 20 41 73 73 75 6d 65 73 20 74 68 61 74 0a  ). Assumes that.
1e40: 2a 2a 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72  ** the window fr
1e50: 61 6d 65 20 68 61 73 20 62 65 65 6e 20 73 65 74  ame has been set
1e60: 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 47 52 4f   to:.**.**   GRO
1e70: 55 50 53 20 42 45 54 57 45 45 4e 20 43 55 52 52  UPS BETWEEN CURR
1e80: 45 4e 54 20 52 4f 57 20 41 4e 44 20 55 4e 42 4f  ENT ROW AND UNBO
1e90: 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a  UNDED FOLLOWING.
1ea0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
1eb0: 65 72 63 65 6e 74 5f 72 61 6e 6b 53 74 65 70 46  ercent_rankStepF
1ec0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
1ed0: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
1ee0: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
1ef0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41  ite3_value **apA
1f00: 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 43  rg.){.  struct C
1f10: 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 55  allCount *p;.  U
1f20: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1f30: 6e 41 72 67 29 3b 20 61 73 73 65 72 74 28 20 6e  nArg); assert( n
1f40: 41 72 67 3d 3d 30 20 29 3b 0a 20 20 70 20 3d 20  Arg==0 );.  p = 
1f50: 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e  (struct CallCoun
1f60: 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65  t*)sqlite3_aggre
1f70: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74  gate_context(pCt
1f80: 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  x, sizeof(*p));.
1f90: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70    if( p ){.    p
1fa0: 2d 3e 6e 54 6f 74 61 6c 2b 2b 3b 0a 20 20 7d 0a  ->nTotal++;.  }.
1fb0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 65  }.static void pe
1fc0: 72 63 65 6e 74 5f 72 61 6e 6b 49 6e 76 46 75 6e  rcent_rankInvFun
1fd0: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
1fe0: 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69  text *pCtx, .  i
1ff0: 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74  nt nArg,.  sqlit
2000: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72 67  e3_value **apArg
2010: 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61 6c  .){.  struct Cal
2020: 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 55 4e 55  lCount *p;.  UNU
2030: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 41  SED_PARAMETER(nA
2040: 72 67 29 3b 20 61 73 73 65 72 74 28 20 6e 41 72  rg); assert( nAr
2050: 67 3d 3d 30 20 29 3b 0a 20 20 70 20 3d 20 28 73  g==0 );.  p = (s
2060: 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a  truct CallCount*
2070: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
2080: 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c  te_context(pCtx,
2090: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
20a0: 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 7d 0a 73 74  p->nStep++;.}.st
20b0: 61 74 69 63 20 76 6f 69 64 20 70 65 72 63 65 6e  atic void percen
20c0: 74 5f 72 61 6e 6b 56 61 6c 75 65 46 75 6e 63 28  t_rankValueFunc(
20d0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
20e0: 2a 70 43 74 78 29 7b 0a 20 20 73 74 72 75 63 74  *pCtx){.  struct
20f0: 20 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20   CallCount *p;. 
2100: 20 70 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c   p = (struct Cal
2110: 6c 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f  lCount*)sqlite3_
2120: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
2130: 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a  t(pCtx, sizeof(*
2140: 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  p));.  if( p ){.
2150: 20 20 20 20 70 2d 3e 6e 56 61 6c 75 65 20 3d 20      p->nValue = 
2160: 70 2d 3e 6e 53 74 65 70 3b 0a 20 20 20 20 69 66  p->nStep;.    if
2170: 28 20 70 2d 3e 6e 54 6f 74 61 6c 3e 31 20 29 7b  ( p->nTotal>1 ){
2180: 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20  .      double r 
2190: 3d 20 28 64 6f 75 62 6c 65 29 70 2d 3e 6e 56 61  = (double)p->nVa
21a0: 6c 75 65 20 2f 20 28 64 6f 75 62 6c 65 29 28 70  lue / (double)(p
21b0: 2d 3e 6e 54 6f 74 61 6c 2d 31 29 3b 0a 20 20 20  ->nTotal-1);.   
21c0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
21d0: 74 5f 64 6f 75 62 6c 65 28 70 43 74 78 2c 20 72  t_double(pCtx, r
21e0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
21f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
2200: 6c 74 5f 64 6f 75 62 6c 65 28 70 43 74 78 2c 20  lt_double(pCtx, 
2210: 30 2e 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  0.0);.    }.  }.
2220: 7d 0a 23 64 65 66 69 6e 65 20 70 65 72 63 65 6e  }.#define percen
2230: 74 5f 72 61 6e 6b 46 69 6e 61 6c 69 7a 65 46 75  t_rankFinalizeFu
2240: 6e 63 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b 56  nc percent_rankV
2250: 61 6c 75 65 46 75 6e 63 0a 0a 2f 2a 0a 2a 2a 20  alueFunc../*.** 
2260: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
2270: 66 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  f built-in windo
2280: 77 20 66 75 6e 63 74 69 6f 6e 20 63 75 6d 65 5f  w function cume_
2290: 64 69 73 74 28 29 2e 20 41 73 73 75 6d 65 73 20  dist(). Assumes 
22a0: 74 68 61 74 0a 2a 2a 20 74 68 65 20 77 69 6e 64  that.** the wind
22b0: 6f 77 20 66 72 61 6d 65 20 68 61 73 20 62 65 65  ow frame has bee
22c0: 6e 20 73 65 74 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20  n set to:.**.** 
22d0: 20 20 47 52 4f 55 50 53 20 42 45 54 57 45 45 4e    GROUPS BETWEEN
22e0: 20 31 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e 44   1 FOLLOWING AND
22f0: 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f   UNBOUNDED FOLLO
2300: 57 49 4e 47 0a 2a 2f 0a 73 74 61 74 69 63 20 76  WING.*/.static v
2310: 6f 69 64 20 63 75 6d 65 5f 64 69 73 74 53 74 65  oid cume_distSte
2320: 70 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  pFunc(.  sqlite3
2330: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20  _context *pCtx, 
2340: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73  .  int nArg,.  s
2350: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
2360: 70 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74  pArg.){.  struct
2370: 20 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20   CallCount *p;. 
2380: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2390: 52 28 6e 41 72 67 29 3b 20 61 73 73 65 72 74 28  R(nArg); assert(
23a0: 20 6e 41 72 67 3d 3d 30 20 29 3b 0a 20 20 70 20   nArg==0 );.  p 
23b0: 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  = (struct CallCo
23c0: 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67  unt*)sqlite3_agg
23d0: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70  regate_context(p
23e0: 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  Ctx, sizeof(*p))
23f0: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
2400: 20 70 2d 3e 6e 54 6f 74 61 6c 2b 2b 3b 0a 20 20   p->nTotal++;.  
2410: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
2420: 63 75 6d 65 5f 64 69 73 74 49 6e 76 46 75 6e 63  cume_distInvFunc
2430: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
2440: 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e  ext *pCtx, .  in
2450: 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65  t nArg,.  sqlite
2460: 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a  3_value **apArg.
2470: 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61 6c 6c  ){.  struct Call
2480: 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 55 4e 55 53  Count *p;.  UNUS
2490: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72  ED_PARAMETER(nAr
24a0: 67 29 3b 20 61 73 73 65 72 74 28 20 6e 41 72 67  g); assert( nArg
24b0: 3d 3d 30 20 29 3b 0a 20 20 70 20 3d 20 28 73 74  ==0 );.  p = (st
24c0: 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29  ruct CallCount*)
24d0: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
24e0: 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20  e_context(pCtx, 
24f0: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 70  sizeof(*p));.  p
2500: 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 7d 0a 73 74 61  ->nStep++;.}.sta
2510: 74 69 63 20 76 6f 69 64 20 63 75 6d 65 5f 64 69  tic void cume_di
2520: 73 74 56 61 6c 75 65 46 75 6e 63 28 73 71 6c 69  stValueFunc(sqli
2530: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
2540: 78 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61 6c  x){.  struct Cal
2550: 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70 20 3d  lCount *p;.  p =
2560: 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75   (struct CallCou
2570: 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72  nt*)sqlite3_aggr
2580: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43  egate_context(pC
2590: 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b  tx, sizeof(*p));
25a0: 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 6e  .  if( p && p->n
25b0: 54 6f 74 61 6c 20 29 7b 0a 20 20 20 20 64 6f 75  Total ){.    dou
25c0: 62 6c 65 20 72 20 3d 20 28 64 6f 75 62 6c 65 29  ble r = (double)
25d0: 28 70 2d 3e 6e 53 74 65 70 29 20 2f 20 28 64 6f  (p->nStep) / (do
25e0: 75 62 6c 65 29 28 70 2d 3e 6e 54 6f 74 61 6c 29  uble)(p->nTotal)
25f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  ;.    sqlite3_re
2600: 73 75 6c 74 5f 64 6f 75 62 6c 65 28 70 43 74 78  sult_double(pCtx
2610: 2c 20 72 29 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66  , r);.  }.}.#def
2620: 69 6e 65 20 63 75 6d 65 5f 64 69 73 74 46 69 6e  ine cume_distFin
2630: 61 6c 69 7a 65 46 75 6e 63 20 63 75 6d 65 5f 64  alizeFunc cume_d
2640: 69 73 74 56 61 6c 75 65 46 75 6e 63 0a 0a 2f 2a  istValueFunc../*
2650: 0a 2a 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65  .** Context obje
2660: 63 74 20 66 6f 72 20 6e 74 69 6c 65 28 29 20 77  ct for ntile() w
2670: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 2e 0a  indow function..
2680: 2a 2f 0a 73 74 72 75 63 74 20 4e 74 69 6c 65 43  */.struct NtileC
2690: 74 78 20 7b 0a 20 20 69 36 34 20 6e 54 6f 74 61  tx {.  i64 nTota
26a0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
26b0: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
26c0: 72 6f 77 73 20 69 6e 20 70 61 72 74 69 74 69 6f  rows in partitio
26d0: 6e 20 2a 2f 0a 20 20 69 36 34 20 6e 50 61 72 61  n */.  i64 nPara
26e0: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
26f0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 61 6d 65         /* Parame
2700: 74 65 72 20 70 61 73 73 65 64 20 74 6f 20 6e 74  ter passed to nt
2710: 69 6c 65 28 4e 29 20 2a 2f 0a 20 20 69 36 34 20  ile(N) */.  i64 
2720: 69 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20  iRow;           
2730: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2740: 75 72 72 65 6e 74 20 72 6f 77 20 2a 2f 0a 7d 3b  urrent row */.};
2750: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
2760: 74 61 74 69 6f 6e 20 6f 66 20 6e 74 69 6c 65 28  tation of ntile(
2770: 29 2e 20 54 68 69 73 20 61 73 73 75 6d 65 73 20  ). This assumes 
2780: 74 68 61 74 20 74 68 65 20 77 69 6e 64 6f 77 20  that the window 
2790: 66 72 61 6d 65 20 68 61 73 0a 2a 2a 20 62 65 65  frame has.** bee
27a0: 6e 20 63 6f 65 72 63 65 64 20 74 6f 3a 0a 2a 2a  n coerced to:.**
27b0: 0a 2a 2a 20 20 20 52 4f 57 53 20 43 55 52 52 45  .**   ROWS CURRE
27c0: 4e 54 20 52 4f 57 20 41 4e 44 20 55 4e 42 4f 55  NT ROW AND UNBOU
27d0: 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a  NDED FOLLOWING.*
27e0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e 74  /.static void nt
27f0: 69 6c 65 53 74 65 70 46 75 6e 63 28 0a 20 20 73  ileStepFunc(.  s
2800: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
2810: 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72  pCtx, .  int nAr
2820: 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  g,.  sqlite3_val
2830: 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20  ue **apArg.){.  
2840: 73 74 72 75 63 74 20 4e 74 69 6c 65 43 74 78 20  struct NtileCtx 
2850: 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 41  *p;.  assert( nA
2860: 72 67 3d 3d 31 20 29 3b 20 55 4e 55 53 45 44 5f  rg==1 ); UNUSED_
2870: 50 41 52 41 4d 45 54 45 52 28 6e 41 72 67 29 3b  PARAMETER(nArg);
2880: 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74 20 4e  .  p = (struct N
2890: 74 69 6c 65 43 74 78 2a 29 73 71 6c 69 74 65 33  tileCtx*)sqlite3
28a0: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
28b0: 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28  xt(pCtx, sizeof(
28c0: 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b  *p));.  if( p ){
28d0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 54 6f 74  .    if( p->nTot
28e0: 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  al==0 ){.      p
28f0: 2d 3e 6e 50 61 72 61 6d 20 3d 20 73 71 6c 69 74  ->nParam = sqlit
2900: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61  e3_value_int64(a
2910: 70 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20  pArg[0]);.      
2920: 69 66 28 20 70 2d 3e 6e 50 61 72 61 6d 3c 3d 30  if( p->nParam<=0
2930: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2940: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
2950: 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  (.            pC
2960: 74 78 2c 20 22 61 72 67 75 6d 65 6e 74 20 6f 66  tx, "argument of
2970: 20 6e 74 69 6c 65 20 6d 75 73 74 20 62 65 20 61   ntile must be a
2980: 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65   positive intege
2990: 72 22 2c 20 2d 31 0a 20 20 20 20 20 20 20 20 29  r", -1.        )
29a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
29b0: 20 20 20 20 70 2d 3e 6e 54 6f 74 61 6c 2b 2b 3b      p->nTotal++;
29c0: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
29d0: 69 64 20 6e 74 69 6c 65 49 6e 76 46 75 6e 63 28  id ntileInvFunc(
29e0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
29f0: 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74  xt *pCtx, .  int
2a00: 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33   nArg,.  sqlite3
2a10: 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29  _value **apArg.)
2a20: 7b 0a 20 20 73 74 72 75 63 74 20 4e 74 69 6c 65  {.  struct Ntile
2a30: 43 74 78 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  Ctx *p;.  assert
2a40: 28 20 6e 41 72 67 3d 3d 31 20 29 3b 20 55 4e 55  ( nArg==1 ); UNU
2a50: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 41  SED_PARAMETER(nA
2a60: 72 67 29 3b 0a 20 20 70 20 3d 20 28 73 74 72 75  rg);.  p = (stru
2a70: 63 74 20 4e 74 69 6c 65 43 74 78 2a 29 73 71 6c  ct NtileCtx*)sql
2a80: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
2a90: 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a  ontext(pCtx, siz
2aa0: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 70 2d 3e 69  eof(*p));.  p->i
2ab0: 52 6f 77 2b 2b 3b 0a 7d 0a 73 74 61 74 69 63 20  Row++;.}.static 
2ac0: 76 6f 69 64 20 6e 74 69 6c 65 56 61 6c 75 65 46  void ntileValueF
2ad0: 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
2ae0: 65 78 74 20 2a 70 43 74 78 29 7b 0a 20 20 73 74  ext *pCtx){.  st
2af0: 72 75 63 74 20 4e 74 69 6c 65 43 74 78 20 2a 70  ruct NtileCtx *p
2b00: 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74 20  ;.  p = (struct 
2b10: 4e 74 69 6c 65 43 74 78 2a 29 73 71 6c 69 74 65  NtileCtx*)sqlite
2b20: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
2b30: 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66  ext(pCtx, sizeof
2b40: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 26  (*p));.  if( p &
2b50: 26 20 70 2d 3e 6e 50 61 72 61 6d 3e 30 20 29 7b  & p->nParam>0 ){
2b60: 0a 20 20 20 20 69 6e 74 20 6e 53 69 7a 65 20 3d  .    int nSize =
2b70: 20 28 70 2d 3e 6e 54 6f 74 61 6c 20 2f 20 70 2d   (p->nTotal / p-
2b80: 3e 6e 50 61 72 61 6d 29 3b 0a 20 20 20 20 69 66  >nParam);.    if
2b90: 28 20 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20  ( nSize==0 ){.  
2ba0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
2bb0: 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 70  lt_int64(pCtx, p
2bc0: 2d 3e 69 52 6f 77 2b 31 29 3b 0a 20 20 20 20 7d  ->iRow+1);.    }
2bd0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 36 34 20  else{.      i64 
2be0: 6e 4c 61 72 67 65 20 3d 20 70 2d 3e 6e 54 6f 74  nLarge = p->nTot
2bf0: 61 6c 20 2d 20 70 2d 3e 6e 50 61 72 61 6d 2a 6e  al - p->nParam*n
2c00: 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 36 34 20  Size;.      i64 
2c10: 69 53 6d 61 6c 6c 20 3d 20 6e 4c 61 72 67 65 2a  iSmall = nLarge*
2c20: 28 6e 53 69 7a 65 2b 31 29 3b 0a 20 20 20 20 20  (nSize+1);.     
2c30: 20 69 36 34 20 69 52 6f 77 20 3d 20 70 2d 3e 69   i64 iRow = p->i
2c40: 52 6f 77 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  Row;..      asse
2c50: 72 74 28 20 28 6e 4c 61 72 67 65 2a 28 6e 53 69  rt( (nLarge*(nSi
2c60: 7a 65 2b 31 29 20 2b 20 28 70 2d 3e 6e 50 61 72  ze+1) + (p->nPar
2c70: 61 6d 2d 6e 4c 61 72 67 65 29 2a 6e 53 69 7a 65  am-nLarge)*nSize
2c80: 29 3d 3d 70 2d 3e 6e 54 6f 74 61 6c 20 29 3b 0a  )==p->nTotal );.
2c90: 0a 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 3c  .      if( iRow<
2ca0: 69 53 6d 61 6c 6c 20 29 7b 0a 20 20 20 20 20 20  iSmall ){.      
2cb0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
2cc0: 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 31 20 2b  _int64(pCtx, 1 +
2cd0: 20 69 52 6f 77 2f 28 6e 53 69 7a 65 2b 31 29 29   iRow/(nSize+1))
2ce0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2cf0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
2d00: 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78  esult_int64(pCtx
2d10: 2c 20 31 20 2b 20 6e 4c 61 72 67 65 20 2b 20 28  , 1 + nLarge + (
2d20: 69 52 6f 77 2d 69 53 6d 61 6c 6c 29 2f 6e 53 69  iRow-iSmall)/nSi
2d30: 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ze);.      }.   
2d40: 20 7d 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65   }.  }.}.#define
2d50: 20 6e 74 69 6c 65 46 69 6e 61 6c 69 7a 65 46 75   ntileFinalizeFu
2d60: 6e 63 20 6e 74 69 6c 65 56 61 6c 75 65 46 75 6e  nc ntileValueFun
2d70: 63 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65 78 74  c../*.** Context
2d80: 20 6f 62 6a 65 63 74 20 66 6f 72 20 6c 61 73 74   object for last
2d90: 5f 76 61 6c 75 65 28 29 20 77 69 6e 64 6f 77 20  _value() window 
2da0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 72  function..*/.str
2db0: 75 63 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78  uct LastValueCtx
2dc0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c   {.  sqlite3_val
2dd0: 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 20  ue *pVal;.  int 
2de0: 6e 56 61 6c 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  nVal;.};../*.** 
2df0: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
2e00: 66 20 6c 61 73 74 5f 76 61 6c 75 65 28 29 2e 0a  f last_value()..
2e10: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  */.static void l
2e20: 61 73 74 5f 76 61 6c 75 65 53 74 65 70 46 75 6e  ast_valueStepFun
2e30: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
2e40: 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69  text *pCtx, .  i
2e50: 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74  nt nArg,.  sqlit
2e60: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72 67  e3_value **apArg
2e70: 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 4c 61 73  .){.  struct Las
2e80: 74 56 61 6c 75 65 43 74 78 20 2a 70 3b 0a 20 20  tValueCtx *p;.  
2e90: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2ea0: 28 6e 41 72 67 29 3b 0a 20 20 70 20 3d 20 28 73  (nArg);.  p = (s
2eb0: 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75 65 43  truct LastValueC
2ec0: 74 78 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72  tx*)sqlite3_aggr
2ed0: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43  egate_context(pC
2ee0: 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b  tx, sizeof(*p));
2ef0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
2f00: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 66 72  sqlite3_value_fr
2f10: 65 65 28 70 2d 3e 70 56 61 6c 29 3b 0a 20 20 20  ee(p->pVal);.   
2f20: 20 70 2d 3e 70 56 61 6c 20 3d 20 73 71 6c 69 74   p->pVal = sqlit
2f30: 65 33 5f 76 61 6c 75 65 5f 64 75 70 28 61 70 41  e3_value_dup(apA
2f40: 72 67 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20  rg[0]);.    if( 
2f50: 70 2d 3e 70 56 61 6c 3d 3d 30 20 29 7b 0a 20 20  p->pVal==0 ){.  
2f60: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
2f70: 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 70  lt_error_nomem(p
2f80: 43 74 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Ctx);.    }else{
2f90: 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61 6c 2b 2b  .      p->nVal++
2fa0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74  ;.    }.  }.}.st
2fb0: 61 74 69 63 20 76 6f 69 64 20 6c 61 73 74 5f 76  atic void last_v
2fc0: 61 6c 75 65 49 6e 76 46 75 6e 63 28 0a 20 20 73  alueInvFunc(.  s
2fd0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
2fe0: 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72  pCtx, .  int nAr
2ff0: 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  g,.  sqlite3_val
3000: 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20  ue **apArg.){.  
3010: 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75 65  struct LastValue
3020: 43 74 78 20 2a 70 3b 0a 20 20 55 4e 55 53 45 44  Ctx *p;.  UNUSED
3030: 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72 67 29  _PARAMETER(nArg)
3040: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
3050: 45 54 45 52 28 61 70 41 72 67 29 3b 0a 20 20 70  ETER(apArg);.  p
3060: 20 3d 20 28 73 74 72 75 63 74 20 4c 61 73 74 56   = (struct LastV
3070: 61 6c 75 65 43 74 78 2a 29 73 71 6c 69 74 65 33  alueCtx*)sqlite3
3080: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
3090: 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28  xt(pCtx, sizeof(
30a0: 2a 70 29 29 3b 0a 20 20 69 66 28 20 41 4c 57 41  *p));.  if( ALWA
30b0: 59 53 28 70 29 20 29 7b 0a 20 20 20 20 70 2d 3e  YS(p) ){.    p->
30c0: 6e 56 61 6c 2d 2d 3b 0a 20 20 20 20 69 66 28 20  nVal--;.    if( 
30d0: 70 2d 3e 6e 56 61 6c 3d 3d 30 20 29 7b 0a 20 20  p->nVal==0 ){.  
30e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
30f0: 65 5f 66 72 65 65 28 70 2d 3e 70 56 61 6c 29 3b  e_free(p->pVal);
3100: 0a 20 20 20 20 20 20 70 2d 3e 70 56 61 6c 20 3d  .      p->pVal =
3110: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
3120: 73 74 61 74 69 63 20 76 6f 69 64 20 6c 61 73 74  static void last
3130: 5f 76 61 6c 75 65 56 61 6c 75 65 46 75 6e 63 28  _valueValueFunc(
3140: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
3150: 2a 70 43 74 78 29 7b 0a 20 20 73 74 72 75 63 74  *pCtx){.  struct
3160: 20 4c 61 73 74 56 61 6c 75 65 43 74 78 20 2a 70   LastValueCtx *p
3170: 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74 20  ;.  p = (struct 
3180: 4c 61 73 74 56 61 6c 75 65 43 74 78 2a 29 73 71  LastValueCtx*)sq
3190: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
31a0: 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69  context(pCtx, si
31b0: 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28  zeof(*p));.  if(
31c0: 20 70 20 26 26 20 70 2d 3e 70 56 61 6c 20 29 7b   p && p->pVal ){
31d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
31e0: 75 6c 74 5f 76 61 6c 75 65 28 70 43 74 78 2c 20  ult_value(pCtx, 
31f0: 70 2d 3e 70 56 61 6c 29 3b 0a 20 20 7d 0a 7d 0a  p->pVal);.  }.}.
3200: 73 74 61 74 69 63 20 76 6f 69 64 20 6c 61 73 74  static void last
3210: 5f 76 61 6c 75 65 46 69 6e 61 6c 69 7a 65 46 75  _valueFinalizeFu
3220: 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  nc(sqlite3_conte
3230: 78 74 20 2a 70 43 74 78 29 7b 0a 20 20 73 74 72  xt *pCtx){.  str
3240: 75 63 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78  uct LastValueCtx
3250: 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75   *p;.  p = (stru
3260: 63 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 2a  ct LastValueCtx*
3270: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
3280: 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c  te_context(pCtx,
3290: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
32a0: 69 66 28 20 70 20 26 26 20 70 2d 3e 70 56 61 6c  if( p && p->pVal
32b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
32c0: 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 70 43 74  result_value(pCt
32d0: 78 2c 20 70 2d 3e 70 56 61 6c 29 3b 0a 20 20 20  x, p->pVal);.   
32e0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 66   sqlite3_value_f
32f0: 72 65 65 28 70 2d 3e 70 56 61 6c 29 3b 0a 20 20  ree(p->pVal);.  
3300: 20 20 70 2d 3e 70 56 61 6c 20 3d 20 30 3b 0a 20    p->pVal = 0;. 
3310: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 74   }.}../*.** Stat
3320: 69 63 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 65  ic names for the
3330: 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77   built-in window
3340: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 2e   function names.
3350: 20 20 54 68 65 73 65 20 73 74 61 74 69 63 0a 2a    These static.*
3360: 2a 20 6e 61 6d 65 73 20 61 72 65 20 75 73 65 64  * names are used
3370: 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20 73 74  , rather than st
3380: 72 69 6e 67 20 6c 69 74 65 72 61 6c 73 2c 20 73  ring literals, s
3390: 6f 20 74 68 61 74 20 46 75 6e 63 44 65 66 20 6f  o that FuncDef o
33a0: 62 6a 65 63 74 73 0a 2a 2a 20 63 61 6e 20 62 65  bjects.** can be
33b0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
33c0: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 77 69   a particular wi
33d0: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 62 79  ndow function by
33e0: 20 64 69 72 65 63 74 0a 2a 2a 20 63 6f 6d 70 61   direct.** compa
33f0: 72 69 73 6f 6e 20 6f 66 20 74 68 65 20 7a 4e 61  rison of the zNa
3400: 6d 65 20 70 6f 69 6e 74 65 72 2e 20 20 45 78 61  me pointer.  Exa
3410: 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mple:.**.**     
3420: 20 20 69 66 28 20 70 46 75 6e 63 44 65 66 2d 3e    if( pFuncDef->
3430: 7a 4e 61 6d 65 3d 3d 72 6f 77 5f 76 61 6c 75 65  zName==row_value
3440: 4e 61 6d 65 20 29 7b 20 2e 2e 2e 20 7d 0a 2a 2f  Name ){ ... }.*/
3450: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
3460: 61 72 20 72 6f 77 5f 6e 75 6d 62 65 72 4e 61 6d  ar row_numberNam
3470: 65 5b 5d 20 3d 20 20 20 22 72 6f 77 5f 6e 75 6d  e[] =   "row_num
3480: 62 65 72 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e  ber";.static con
3490: 73 74 20 63 68 61 72 20 64 65 6e 73 65 5f 72 61  st char dense_ra
34a0: 6e 6b 4e 61 6d 65 5b 5d 20 3d 20 20 20 22 64 65  nkName[] =   "de
34b0: 6e 73 65 5f 72 61 6e 6b 22 3b 0a 73 74 61 74 69  nse_rank";.stati
34c0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 72 61 6e  c const char ran
34d0: 6b 4e 61 6d 65 5b 5d 20 3d 20 20 20 20 20 20 20  kName[] =       
34e0: 20 20 22 72 61 6e 6b 22 3b 0a 73 74 61 74 69 63    "rank";.static
34f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 70 65 72 63   const char perc
3500: 65 6e 74 5f 72 61 6e 6b 4e 61 6d 65 5b 5d 20 3d  ent_rankName[] =
3510: 20 22 70 65 72 63 65 6e 74 5f 72 61 6e 6b 22 3b   "percent_rank";
3520: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
3530: 61 72 20 63 75 6d 65 5f 64 69 73 74 4e 61 6d 65  ar cume_distName
3540: 5b 5d 20 3d 20 20 20 20 22 63 75 6d 65 5f 64 69  [] =    "cume_di
3550: 73 74 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73  st";.static cons
3560: 74 20 63 68 61 72 20 6e 74 69 6c 65 4e 61 6d 65  t char ntileName
3570: 5b 5d 20 3d 20 20 20 20 20 20 20 20 22 6e 74 69  [] =        "nti
3580: 6c 65 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73  le";.static cons
3590: 74 20 63 68 61 72 20 6c 61 73 74 5f 76 61 6c 75  t char last_valu
35a0: 65 4e 61 6d 65 5b 5d 20 3d 20 20 20 22 6c 61 73  eName[] =   "las
35b0: 74 5f 76 61 6c 75 65 22 3b 0a 73 74 61 74 69 63  t_value";.static
35c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 6e 74 68 5f   const char nth_
35d0: 76 61 6c 75 65 4e 61 6d 65 5b 5d 20 3d 20 20 20  valueName[] =   
35e0: 20 22 6e 74 68 5f 76 61 6c 75 65 22 3b 0a 73 74   "nth_value";.st
35f0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
3600: 66 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65 5b  first_valueName[
3610: 5d 20 3d 20 20 22 66 69 72 73 74 5f 76 61 6c 75  ] =  "first_valu
3620: 65 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  e";.static const
3630: 20 63 68 61 72 20 6c 65 61 64 4e 61 6d 65 5b 5d   char leadName[]
3640: 20 3d 20 20 20 20 20 20 20 20 20 22 6c 65 61 64   =         "lead
3650: 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  ";.static const 
3660: 63 68 61 72 20 6c 61 67 4e 61 6d 65 5b 5d 20 3d  char lagName[] =
3670: 20 20 20 20 20 20 20 20 20 20 22 6c 61 67 22 3b            "lag";
3680: 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 69 6d  ../*.** No-op im
3690: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66  plementations of
36a0: 20 78 53 74 65 70 28 29 20 61 6e 64 20 78 46 69   xStep() and xFi
36b0: 6e 61 6c 69 7a 65 28 29 2e 20 20 55 73 65 64 20  nalize().  Used 
36c0: 61 73 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72 73  as place-holders
36d0: 0a 2a 2a 20 66 6f 72 20 62 75 69 6c 74 2d 69 6e  .** for built-in
36e0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
36f0: 73 20 74 68 61 74 20 6e 65 76 65 72 20 63 61 6c  s that never cal
3700: 6c 20 74 68 6f 73 65 20 69 6e 74 65 72 66 61 63  l those interfac
3710: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 6f  es..**.** The no
3720: 6f 70 56 61 6c 75 65 46 75 6e 63 28 29 20 69 73  opValueFunc() is
3730: 20 63 61 6c 6c 65 64 20 62 75 74 20 69 73 20 65   called but is e
3740: 78 70 65 63 74 65 64 20 74 6f 20 64 6f 20 6e 6f  xpected to do no
3750: 74 68 69 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 6e  thing.  The.** n
3760: 6f 6f 70 53 74 65 70 46 75 6e 63 28 29 20 69 73  oopStepFunc() is
3770: 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2c 20 61   never called, a
3780: 6e 64 20 73 6f 20 69 74 20 69 73 20 6d 61 72 6b  nd so it is mark
3790: 65 64 20 77 69 74 68 20 4e 4f 5f 54 45 53 54 20  ed with NO_TEST 
37a0: 74 6f 0a 2a 2a 20 6c 65 74 20 74 68 65 20 74 65  to.** let the te
37b0: 73 74 20 63 6f 76 65 72 61 67 65 20 72 6f 75 74  st coverage rout
37c0: 69 6e 65 20 6b 6e 6f 77 20 6e 6f 74 20 74 6f 20  ine know not to 
37d0: 65 78 70 65 63 74 20 74 68 69 73 20 66 75 6e 63  expect this func
37e0: 74 69 6f 6e 20 74 6f 20 62 65 0a 2a 2a 20 69 6e  tion to be.** in
37f0: 76 6f 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  voked..*/.static
3800: 20 76 6f 69 64 20 6e 6f 6f 70 53 74 65 70 46 75   void noopStepFu
3810: 6e 63 28 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54  nc(    /*NO_TEST
3820: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  */.  sqlite3_con
3830: 74 65 78 74 20 2a 70 2c 20 20 20 20 20 20 20 20  text *p,        
3840: 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 69 6e  /*NO_TEST*/.  in
3850: 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  t n,            
3860: 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45           /*NO_TE
3870: 53 54 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  ST*/.  sqlite3_v
3880: 61 6c 75 65 20 2a 2a 61 20 20 20 20 20 20 20 20  alue **a        
3890: 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 29 7b    /*NO_TEST*/.){
38a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f             /*NO_
38c0: 54 45 53 54 2a 2f 0a 20 20 55 4e 55 53 45 44 5f  TEST*/.  UNUSED_
38d0: 50 41 52 41 4d 45 54 45 52 28 70 29 3b 20 20 20  PARAMETER(p);   
38e0: 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a      /*NO_TEST*/.
38f0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
3900: 45 52 28 6e 29 3b 20 20 20 20 20 20 20 2f 2a 4e  ER(n);       /*N
3910: 4f 5f 54 45 53 54 2a 2f 0a 20 20 55 4e 55 53 45  O_TEST*/.  UNUSE
3920: 44 5f 50 41 52 41 4d 45 54 45 52 28 61 29 3b 20  D_PARAMETER(a); 
3930: 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a        /*NO_TEST*
3940: 2f 0a 20 20 61 73 73 65 72 74 28 30 29 3b 20 20  /.  assert(0);  
3950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3960: 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 7d 20 20 20 20  *NO_TEST*/.}    
3970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3980: 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53          /*NO_TES
3990: 54 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  T*/.static void 
39a0: 6e 6f 6f 70 56 61 6c 75 65 46 75 6e 63 28 73 71  noopValueFunc(sq
39b0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
39c0: 29 7b 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  ){ UNUSED_PARAME
39d0: 54 45 52 28 70 29 3b 20 2f 2a 6e 6f 2d 6f 70 2a  TER(p); /*no-op*
39e0: 2f 20 7d 0a 0a 2f 2a 20 57 69 6e 64 6f 77 20 66  / }../* Window f
39f0: 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 75 73  unctions that us
3a00: 65 20 61 6c 6c 20 77 69 6e 64 6f 77 20 69 6e 74  e all window int
3a10: 65 72 66 61 63 65 73 3a 20 78 53 74 65 70 2c 20  erfaces: xStep, 
3a20: 78 46 69 6e 61 6c 2c 0a 2a 2a 20 78 56 61 6c 75  xFinal,.** xValu
3a30: 65 2c 20 61 6e 64 20 78 49 6e 76 65 72 73 65 20  e, and xInverse 
3a40: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 44 4f  */.#define WINDO
3a50: 57 46 55 4e 43 41 4c 4c 28 6e 61 6d 65 2c 6e 41  WFUNCALL(name,nA
3a60: 72 67 2c 65 78 74 72 61 29 20 7b 20 20 20 20 20  rg,extra) {     
3a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
3a90: 20 20 6e 41 72 67 2c 20 28 53 51 4c 49 54 45 5f    nArg, (SQLITE_
3aa0: 55 54 46 38 7c 53 51 4c 49 54 45 5f 46 55 4e 43  UTF8|SQLITE_FUNC
3ab0: 5f 57 49 4e 44 4f 57 7c 65 78 74 72 61 29 2c 20  _WINDOW|extra), 
3ac0: 30 2c 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  0, 0,           
3ad0: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6e             \.  n
3ae0: 61 6d 65 20 23 23 20 53 74 65 70 46 75 6e 63 2c  ame ## StepFunc,
3af0: 20 6e 61 6d 65 20 23 23 20 46 69 6e 61 6c 69 7a   name ## Finaliz
3b00: 65 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20 56  eFunc, name ## V
3b10: 61 6c 75 65 46 75 6e 63 2c 20 20 20 20 20 20 20  alueFunc,       
3b20: 20 20 20 20 20 20 20 20 5c 0a 20 20 6e 61 6d 65          \.  name
3b30: 20 23 23 20 49 6e 76 46 75 6e 63 2c 20 6e 61 6d   ## InvFunc, nam
3b40: 65 20 23 23 20 4e 61 6d 65 2c 20 7b 30 7d 20 20  e ## Name, {0}  
3b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b70: 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 20 57 69 6e       \.}../* Win
3b80: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  dow functions th
3b90: 61 74 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74  at are implement
3ba0: 65 64 20 75 73 69 6e 67 20 62 79 74 65 63 6f 64  ed using bytecod
3bb0: 65 20 61 6e 64 20 74 68 75 73 20 68 61 76 65 0a  e and thus have.
3bc0: 2a 2a 20 6e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65  ** no-op routine
3bd0: 73 20 66 6f 72 20 74 68 65 69 72 20 6d 65 74 68  s for their meth
3be0: 6f 64 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ods */.#define W
3bf0: 49 4e 44 4f 57 46 55 4e 43 4e 4f 4f 50 28 6e 61  INDOWFUNCNOOP(na
3c00: 6d 65 2c 6e 41 72 67 2c 65 78 74 72 61 29 20 7b  me,nArg,extra) {
3c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c30: 20 20 5c 0a 20 20 6e 41 72 67 2c 20 28 53 51 4c    \.  nArg, (SQL
3c40: 49 54 45 5f 55 54 46 38 7c 53 51 4c 49 54 45 5f  ITE_UTF8|SQLITE_
3c50: 46 55 4e 43 5f 57 49 4e 44 4f 57 7c 65 78 74 72  FUNC_WINDOW|extr
3c60: 61 29 2c 20 30 2c 20 30 2c 20 20 20 20 20 20 20  a), 0, 0,       
3c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
3c80: 0a 20 20 6e 6f 6f 70 53 74 65 70 46 75 6e 63 2c  .  noopStepFunc,
3c90: 20 6e 6f 6f 70 56 61 6c 75 65 46 75 6e 63 2c 20   noopValueFunc, 
3ca0: 6e 6f 6f 70 56 61 6c 75 65 46 75 6e 63 2c 20 20  noopValueFunc,  
3cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cc0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
3cd0: 6e 6f 6f 70 53 74 65 70 46 75 6e 63 2c 20 6e 61  noopStepFunc, na
3ce0: 6d 65 20 23 23 20 4e 61 6d 65 2c 20 7b 30 7d 20  me ## Name, {0} 
3cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d10: 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a           \.}../*
3d20: 20 57 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   Window function
3d30: 73 20 74 68 61 74 20 75 73 65 20 61 6c 6c 20 77  s that use all w
3d40: 69 6e 64 6f 77 20 69 6e 74 65 72 66 61 63 65 73  indow interfaces
3d50: 3a 20 78 53 74 65 70 2c 20 74 68 65 0a 2a 2a 20  : xStep, the.** 
3d60: 73 61 6d 65 20 72 6f 75 74 69 6e 65 20 66 6f 72  same routine for
3d70: 20 78 46 69 6e 61 6c 69 7a 65 20 61 6e 64 20 78   xFinalize and x
3d80: 56 61 6c 75 65 20 61 6e 64 20 77 68 69 63 68 20  Value and which 
3d90: 6e 65 76 65 72 20 63 61 6c 6c 0a 2a 2a 20 78 49  never call.** xI
3da0: 6e 76 65 72 73 65 2e 20 2a 2f 0a 23 64 65 66 69  nverse. */.#defi
3db0: 6e 65 20 57 49 4e 44 4f 57 46 55 4e 43 58 28 6e  ne WINDOWFUNCX(n
3dc0: 61 6d 65 2c 6e 41 72 67 2c 65 78 74 72 61 29 20  ame,nArg,extra) 
3dd0: 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
3de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3df0: 20 20 20 20 20 20 5c 0a 20 20 6e 41 72 67 2c 20        \.  nArg, 
3e00: 28 53 51 4c 49 54 45 5f 55 54 46 38 7c 53 51 4c  (SQLITE_UTF8|SQL
3e10: 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 7c  ITE_FUNC_WINDOW|
3e20: 65 78 74 72 61 29 2c 20 30 2c 20 30 2c 20 20 20  extra), 0, 0,   
3e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e40: 20 20 20 5c 0a 20 20 6e 61 6d 65 20 23 23 20 53     \.  name ## S
3e50: 74 65 70 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23  tepFunc, name ##
3e60: 20 56 61 6c 75 65 46 75 6e 63 2c 20 6e 61 6d 65   ValueFunc, name
3e70: 20 23 23 20 56 61 6c 75 65 46 75 6e 63 2c 20 20   ## ValueFunc,  
3e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e90: 5c 0a 20 20 6e 6f 6f 70 53 74 65 70 46 75 6e 63  \.  noopStepFunc
3ea0: 2c 20 6e 61 6d 65 20 23 23 20 4e 61 6d 65 2c 20  , name ## Name, 
3eb0: 7b 30 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  {0}             
3ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d               \.}
3ee0: 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  .../*.** Registe
3ef0: 72 20 74 68 6f 73 65 20 62 75 69 6c 74 2d 69 6e  r those built-in
3f00: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
3f10: 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61  s that are not a
3f20: 6c 73 6f 20 61 67 67 72 65 67 61 74 65 73 2e 0a  lso aggregates..
3f30: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57  */.void sqlite3W
3f40: 69 6e 64 6f 77 46 75 6e 63 74 69 6f 6e 73 28 76  indowFunctions(v
3f50: 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 46  oid){.  static F
3f60: 75 6e 63 44 65 66 20 61 57 69 6e 64 6f 77 46 75  uncDef aWindowFu
3f70: 6e 63 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 57 49  ncs[] = {.    WI
3f80: 4e 44 4f 57 46 55 4e 43 58 28 72 6f 77 5f 6e 75  NDOWFUNCX(row_nu
3f90: 6d 62 65 72 2c 20 30 2c 20 30 29 2c 0a 20 20 20  mber, 0, 0),.   
3fa0: 20 57 49 4e 44 4f 57 46 55 4e 43 58 28 64 65 6e   WINDOWFUNCX(den
3fb0: 73 65 5f 72 61 6e 6b 2c 20 30 2c 20 30 29 2c 0a  se_rank, 0, 0),.
3fc0: 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 58 28      WINDOWFUNCX(
3fd0: 72 61 6e 6b 2c 20 30 2c 20 30 29 2c 0a 20 20 20  rank, 0, 0),.   
3fe0: 20 2f 2f 20 57 49 4e 44 4f 57 46 55 4e 43 58 28   // WINDOWFUNCX(
3ff0: 70 65 72 63 65 6e 74 5f 72 61 6e 6b 2c 20 30 2c  percent_rank, 0,
4000: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e   SQLITE_FUNC_WIN
4010: 44 4f 57 5f 53 49 5a 45 29 2c 0a 20 20 20 20 57  DOW_SIZE),.    W
4020: 49 4e 44 4f 57 46 55 4e 43 41 4c 4c 28 70 65 72  INDOWFUNCALL(per
4030: 63 65 6e 74 5f 72 61 6e 6b 2c 20 30 2c 20 30 29  cent_rank, 0, 0)
4040: 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43  ,.    WINDOWFUNC
4050: 41 4c 4c 28 63 75 6d 65 5f 64 69 73 74 2c 20 30  ALL(cume_dist, 0
4060: 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57  , 0),.    WINDOW
4070: 46 55 4e 43 41 4c 4c 28 6e 74 69 6c 65 2c 20 31  FUNCALL(ntile, 1
4080: 2c 20 30 29 2c 0a 20 20 20 20 2f 2f 20 57 49 4e  , 0),.    // WIN
4090: 44 4f 57 46 55 4e 43 58 28 63 75 6d 65 5f 64 69  DOWFUNCX(cume_di
40a0: 73 74 2c 20 30 2c 20 53 51 4c 49 54 45 5f 46 55  st, 0, SQLITE_FU
40b0: 4e 43 5f 57 49 4e 44 4f 57 5f 53 49 5a 45 29 2c  NC_WINDOW_SIZE),
40c0: 0a 20 20 20 20 2f 2f 20 57 49 4e 44 4f 57 46 55  .    // WINDOWFU
40d0: 4e 43 58 28 6e 74 69 6c 65 2c 20 31 2c 20 53 51  NCX(ntile, 1, SQ
40e0: 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57  LITE_FUNC_WINDOW
40f0: 5f 53 49 5a 45 29 2c 0a 20 20 20 20 57 49 4e 44  _SIZE),.    WIND
4100: 4f 57 46 55 4e 43 41 4c 4c 28 6c 61 73 74 5f 76  OWFUNCALL(last_v
4110: 61 6c 75 65 2c 20 31 2c 20 30 29 2c 0a 20 20 20  alue, 1, 0),.   
4120: 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f 4f 50 28   WINDOWFUNCNOOP(
4130: 6e 74 68 5f 76 61 6c 75 65 2c 20 32 2c 20 30 29  nth_value, 2, 0)
4140: 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43  ,.    WINDOWFUNC
4150: 4e 4f 4f 50 28 66 69 72 73 74 5f 76 61 6c 75 65  NOOP(first_value
4160: 2c 20 31 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e  , 1, 0),.    WIN
4170: 44 4f 57 46 55 4e 43 4e 4f 4f 50 28 6c 65 61 64  DOWFUNCNOOP(lead
4180: 2c 20 31 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e  , 1, 0),.    WIN
4190: 44 4f 57 46 55 4e 43 4e 4f 4f 50 28 6c 65 61 64  DOWFUNCNOOP(lead
41a0: 2c 20 32 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e  , 2, 0),.    WIN
41b0: 44 4f 57 46 55 4e 43 4e 4f 4f 50 28 6c 65 61 64  DOWFUNCNOOP(lead
41c0: 2c 20 33 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e  , 3, 0),.    WIN
41d0: 44 4f 57 46 55 4e 43 4e 4f 4f 50 28 6c 61 67 2c  DOWFUNCNOOP(lag,
41e0: 20 31 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44   1, 0),.    WIND
41f0: 4f 57 46 55 4e 43 4e 4f 4f 50 28 6c 61 67 2c 20  OWFUNCNOOP(lag, 
4200: 32 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f  2, 0),.    WINDO
4210: 57 46 55 4e 43 4e 4f 4f 50 28 6c 61 67 2c 20 33  WFUNCNOOP(lag, 3
4220: 2c 20 30 29 2c 0a 20 20 7d 3b 0a 20 20 73 71 6c  , 0),.  };.  sql
4230: 69 74 65 33 49 6e 73 65 72 74 42 75 69 6c 74 69  ite3InsertBuilti
4240: 6e 46 75 6e 63 73 28 61 57 69 6e 64 6f 77 46 75  nFuncs(aWindowFu
4250: 6e 63 73 2c 20 41 72 72 61 79 53 69 7a 65 28 61  ncs, ArraySize(a
4260: 57 69 6e 64 6f 77 46 75 6e 63 73 29 29 3b 0a 7d  WindowFuncs));.}
4270: 0a 0a 73 74 61 74 69 63 20 57 69 6e 64 6f 77 20  ..static Window 
4280: 2a 77 69 6e 64 6f 77 46 69 6e 64 28 50 61 72 73  *windowFind(Pars
4290: 65 20 2a 70 50 61 72 73 65 2c 20 57 69 6e 64 6f  e *pParse, Windo
42a0: 77 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20  w *pList, const 
42b0: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
42c0: 57 69 6e 64 6f 77 20 2a 70 3b 0a 20 20 66 6f 72  Window *p;.  for
42d0: 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70  (p=pList; p; p=p
42e0: 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20  ->pNextWin){.   
42f0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
4300: 43 6d 70 28 70 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e  Cmp(p->zName, zN
4310: 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ame)==0 ) break;
4320: 0a 20 20 7d 0a 20 20 69 66 28 20 70 3d 3d 30 20  .  }.  if( p==0 
4330: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
4340: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
4350: 6e 6f 20 73 75 63 68 20 77 69 6e 64 6f 77 3a 20  no such window: 
4360: 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d  %s", zName);.  }
4370: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
4380: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
4390: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 69 6d  ion is called im
43a0: 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
43b0: 72 65 73 6f 6c 76 69 6e 67 20 74 68 65 20 66 75  resolving the fu
43c0: 6e 63 74 69 6f 6e 20 6e 61 6d 65 0a 2a 2a 20 66  nction name.** f
43d0: 6f 72 20 61 20 77 69 6e 64 6f 77 20 66 75 6e 63  or a window func
43e0: 74 69 6f 6e 20 77 69 74 68 69 6e 20 61 20 53 45  tion within a SE
43f0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
4400: 41 72 67 75 6d 65 6e 74 20 70 4c 69 73 74 20 69  Argument pList i
4410: 73 20 61 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69  s a.** linked li
4420: 73 74 20 6f 66 20 57 49 4e 44 4f 57 20 64 65 66  st of WINDOW def
4430: 69 6e 69 74 69 6f 6e 73 20 66 6f 72 20 74 68 65  initions for the
4440: 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
4450: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 41 72  statement..** Ar
4460: 67 75 6d 65 6e 74 20 70 46 75 6e 63 20 69 73 20  gument pFunc is 
4470: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 65 66  the function def
4480: 69 6e 69 74 69 6f 6e 20 6a 75 73 74 20 72 65 73  inition just res
4490: 6f 6c 76 65 64 20 61 6e 64 20 70 57 69 6e 0a 2a  olved and pWin.*
44a0: 2a 20 69 73 20 74 68 65 20 57 69 6e 64 6f 77 20  * is the Window 
44b0: 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74  object represent
44c0: 69 6e 67 20 74 68 65 20 61 73 73 6f 63 69 61 74  ing the associat
44d0: 65 64 20 4f 56 45 52 20 63 6c 61 75 73 65 2e 20  ed OVER clause. 
44e0: 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
44f0: 20 75 70 64 61 74 65 73 20 74 68 65 20 63 6f 6e   updates the con
4500: 74 65 6e 74 73 20 6f 66 20 70 57 69 6e 20 61 73  tents of pWin as
4510: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
4520: 20 20 2a 20 49 66 20 74 68 65 20 4f 56 45 52 20    * If the OVER 
4530: 63 6c 61 75 73 65 20 72 65 66 65 72 65 64 20 74  clause refered t
4540: 6f 20 61 20 6e 61 6d 65 64 20 77 69 6e 64 6f 77  o a named window
4550: 20 28 61 73 20 69 6e 20 22 6d 61 78 28 78 29 20   (as in "max(x) 
4560: 4f 56 45 52 20 77 69 6e 22 29 2c 0a 2a 2a 20 20  OVER win"),.**  
4570: 20 20 20 73 65 61 72 63 68 20 6c 69 73 74 20 70     search list p
4580: 4c 69 73 74 20 66 6f 72 20 61 20 6d 61 74 63 68  List for a match
4590: 69 6e 67 20 57 49 4e 44 4f 57 20 64 65 66 69 6e  ing WINDOW defin
45a0: 69 74 69 6f 6e 2c 20 61 6e 64 20 75 70 64 61 74  ition, and updat
45b0: 65 20 70 57 69 6e 0a 2a 2a 20 20 20 20 20 61 63  e pWin.**     ac
45c0: 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20 6e 6f  cordingly. If no
45d0: 20 73 75 63 68 20 57 49 4e 44 4f 57 20 63 6c 61   such WINDOW cla
45e0: 75 73 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  use can be found
45f0: 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
4600: 0a 2a 2a 20 20 20 20 20 69 6e 20 70 50 61 72 73  .**     in pPars
4610: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20  e..**.**   * If 
4620: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  the function is 
4630: 61 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  a built-in windo
4640: 77 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  w function that 
4650: 72 65 71 75 69 72 65 73 20 74 68 65 0a 2a 2a 20  requires the.** 
4660: 20 20 20 20 77 69 6e 64 6f 77 20 74 6f 20 62 65      window to be
4670: 20 63 6f 65 72 63 65 64 20 28 73 65 65 20 22 42   coerced (see "B
4680: 55 49 4c 54 2d 49 4e 20 57 49 4e 44 4f 57 20 46  UILT-IN WINDOW F
4690: 55 4e 43 54 49 4f 4e 53 22 20 61 74 20 74 68 65  UNCTIONS" at the
46a0: 20 74 6f 70 0a 2a 2a 20 20 20 20 20 6f 66 20 74   top.**     of t
46b0: 68 69 73 20 66 69 6c 65 29 2c 20 70 57 69 6e 20  his file), pWin 
46c0: 69 73 20 75 70 64 61 74 65 64 20 68 65 72 65 2e  is updated here.
46d0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
46e0: 57 69 6e 64 6f 77 55 70 64 61 74 65 28 0a 20 20  WindowUpdate(.  
46f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a  Parse *pParse, .
4700: 20 20 57 69 6e 64 6f 77 20 2a 70 4c 69 73 74 2c    Window *pList,
4710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4720: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6e 61 6d    /* List of nam
4730: 65 64 20 77 69 6e 64 6f 77 73 20 66 6f 72 20 74  ed windows for t
4740: 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  his SELECT */.  
4750: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 2c 20 20 20  Window *pWin,   
4760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4770: 2f 2a 20 57 69 6e 64 6f 77 20 66 72 61 6d 65 20  /* Window frame 
4780: 74 6f 20 75 70 64 61 74 65 20 2a 2f 0a 20 20 46  to update */.  F
4790: 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20 20 20  uncDef *pFunc   
47a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
47b0: 2a 20 57 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  * Window functio
47c0: 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 2a 2f 0a  n definition */.
47d0: 29 7b 0a 20 20 69 66 28 20 70 57 69 6e 2d 3e 7a  ){.  if( pWin->z
47e0: 4e 61 6d 65 20 26 26 20 70 57 69 6e 2d 3e 65 54  Name && pWin->eT
47f0: 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 57 69  ype==0 ){.    Wi
4800: 6e 64 6f 77 20 2a 70 20 3d 20 77 69 6e 64 6f 77  ndow *p = window
4810: 46 69 6e 64 28 70 50 61 72 73 65 2c 20 70 4c 69  Find(pParse, pLi
4820: 73 74 2c 20 70 57 69 6e 2d 3e 7a 4e 61 6d 65 29  st, pWin->zName)
4830: 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29  ;.    if( p==0 )
4840: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 57 69   return;.    pWi
4850: 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 3d 20  n->pPartition = 
4860: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
4870: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
4880: 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20 30 29  ->pPartition, 0)
4890: 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70 4f 72 64  ;.    pWin->pOrd
48a0: 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
48b0: 70 72 4c 69 73 74 44 75 70 28 70 50 61 72 73 65  prListDup(pParse
48c0: 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  ->db, p->pOrderB
48d0: 79 2c 20 30 29 3b 0a 20 20 20 20 70 57 69 6e 2d  y, 0);.    pWin-
48e0: 3e 70 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65  >pStart = sqlite
48f0: 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d  3ExprDup(pParse-
4900: 3e 64 62 2c 20 70 2d 3e 70 53 74 61 72 74 2c 20  >db, p->pStart, 
4910: 30 29 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70 45  0);.    pWin->pE
4920: 6e 64 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  nd = sqlite3Expr
4930: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
4940: 70 2d 3e 70 45 6e 64 2c 20 30 29 3b 0a 20 20 20  p->pEnd, 0);.   
4950: 20 70 57 69 6e 2d 3e 65 53 74 61 72 74 20 3d 20   pWin->eStart = 
4960: 70 2d 3e 65 53 74 61 72 74 3b 0a 20 20 20 20 70  p->eStart;.    p
4970: 57 69 6e 2d 3e 65 45 6e 64 20 3d 20 70 2d 3e 65  Win->eEnd = p->e
4980: 45 6e 64 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 65  End;.    pWin->e
4990: 54 79 70 65 20 3d 20 70 2d 3e 65 54 79 70 65 3b  Type = p->eType;
49a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
49b0: 6c 69 74 65 33 57 69 6e 64 6f 77 43 68 61 69 6e  lite3WindowChain
49c0: 28 70 50 61 72 73 65 2c 20 70 57 69 6e 2c 20 70  (pParse, pWin, p
49d0: 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  List);.  }.  if(
49e0: 20 28 70 57 69 6e 2d 3e 65 54 79 70 65 3d 3d 54   (pWin->eType==T
49f0: 4b 5f 52 41 4e 47 45 29 0a 20 20 20 26 26 20 28  K_RANGE).   && (
4a00: 70 57 69 6e 2d 3e 70 53 74 61 72 74 20 7c 7c 20  pWin->pStart || 
4a10: 70 57 69 6e 2d 3e 70 45 6e 64 29 20 0a 20 20 20  pWin->pEnd) .   
4a20: 26 26 20 28 70 57 69 6e 2d 3e 70 4f 72 64 65 72  && (pWin->pOrder
4a30: 42 79 3d 3d 30 20 7c 7c 20 70 57 69 6e 2d 3e 70  By==0 || pWin->p
4a40: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 21 3d  OrderBy->nExpr!=
4a50: 31 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69  1).  ){.    sqli
4a60: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
4a70: 73 65 2c 20 0a 20 20 20 20 20 20 22 52 41 4e 47  se, .      "RANG
4a80: 45 20 77 69 74 68 20 6f 66 66 73 65 74 20 50 52  E with offset PR
4a90: 45 43 45 44 49 4e 47 2f 46 4f 4c 4c 4f 57 49 4e  ECEDING/FOLLOWIN
4aa0: 47 20 72 65 71 75 69 72 65 73 20 6f 6e 65 20 4f  G requires one O
4ab0: 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69  RDER BY expressi
4ac0: 6f 6e 22 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c  on".    );.  }el
4ad0: 73 65 0a 20 20 69 66 28 20 70 46 75 6e 63 2d 3e  se.  if( pFunc->
4ae0: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
4af0: 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 20 29  TE_FUNC_WINDOW )
4b00: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
4b10: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
4b20: 20 20 20 20 69 66 28 20 70 57 69 6e 2d 3e 70 46      if( pWin->pF
4b30: 69 6c 74 65 72 20 29 7b 0a 20 20 20 20 20 20 73  ilter ){.      s
4b40: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
4b50: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
4b60: 20 20 22 46 49 4c 54 45 52 20 63 6c 61 75 73 65    "FILTER clause
4b70: 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65   may only be use
4b80: 64 20 77 69 74 68 20 61 67 67 72 65 67 61 74 65  d with aggregate
4b90: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
4ba0: 73 22 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  s".      );.    
4bb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 72  }else{.      str
4bc0: 75 63 74 20 57 69 6e 64 6f 77 55 70 64 61 74 65  uct WindowUpdate
4bd0: 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74   {.        const
4be0: 20 63 68 61 72 20 2a 7a 46 75 6e 63 3b 0a 20 20   char *zFunc;.  
4bf0: 20 20 20 20 20 20 69 6e 74 20 65 54 79 70 65 3b        int eType;
4c00: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65 53 74  .        int eSt
4c10: 61 72 74 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  art;.        int
4c20: 20 65 45 6e 64 3b 0a 20 20 20 20 20 20 7d 20 61   eEnd;.      } a
4c30: 55 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  Up[] = {.       
4c40: 20 7b 20 72 6f 77 5f 6e 75 6d 62 65 72 4e 61 6d   { row_numberNam
4c50: 65 2c 20 20 20 54 4b 5f 52 4f 57 53 2c 20 20 20  e,   TK_ROWS,   
4c60: 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 2c 20 54 4b  TK_UNBOUNDED, TK
4c70: 5f 43 55 52 52 45 4e 54 20 7d 2c 20 0a 20 20 20  _CURRENT }, .   
4c80: 20 20 20 20 20 7b 20 64 65 6e 73 65 5f 72 61 6e       { dense_ran
4c90: 6b 4e 61 6d 65 2c 20 20 20 54 4b 5f 52 41 4e 47  kName,   TK_RANG
4ca0: 45 2c 20 20 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  E,  TK_UNBOUNDED
4cb0: 2c 20 54 4b 5f 43 55 52 52 45 4e 54 20 7d 2c 20  , TK_CURRENT }, 
4cc0: 0a 20 20 20 20 20 20 20 20 7b 20 72 61 6e 6b 4e  .        { rankN
4cd0: 61 6d 65 2c 20 20 20 20 20 20 20 20 20 54 4b 5f  ame,         TK_
4ce0: 52 41 4e 47 45 2c 20 20 54 4b 5f 55 4e 42 4f 55  RANGE,  TK_UNBOU
4cf0: 4e 44 45 44 2c 20 54 4b 5f 43 55 52 52 45 4e 54  NDED, TK_CURRENT
4d00: 20 7d 2c 20 0a 20 20 20 20 20 20 20 20 7b 20 70   }, .        { p
4d10: 65 72 63 65 6e 74 5f 72 61 6e 6b 4e 61 6d 65 2c  ercent_rankName,
4d20: 20 54 4b 5f 47 52 4f 55 50 53 2c 20 54 4b 5f 43   TK_GROUPS, TK_C
4d30: 55 52 52 45 4e 54 2c 20 20 20 54 4b 5f 55 4e 42  URRENT,   TK_UNB
4d40: 4f 55 4e 44 45 44 20 7d 2c 20 0a 20 20 20 20 20  OUNDED }, .     
4d50: 20 20 20 7b 20 63 75 6d 65 5f 64 69 73 74 4e 61     { cume_distNa
4d60: 6d 65 2c 20 20 20 20 54 4b 5f 47 52 4f 55 50 53  me,    TK_GROUPS
4d70: 2c 20 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 2c 20  , TK_FOLLOWING, 
4d80: 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 7d 2c 20  TK_UNBOUNDED }, 
4d90: 0a 20 20 20 20 20 20 20 20 7b 20 6e 74 69 6c 65  .        { ntile
4da0: 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 54 4b 5f  Name,        TK_
4db0: 52 4f 57 53 2c 20 20 20 54 4b 5f 43 55 52 52 45  ROWS,   TK_CURRE
4dc0: 4e 54 2c 20 20 20 54 4b 5f 55 4e 42 4f 55 4e 44  NT,   TK_UNBOUND
4dd0: 45 44 20 7d 2c 20 0a 20 20 20 20 20 20 20 20 7b  ED }, .        {
4de0: 20 6c 65 61 64 4e 61 6d 65 2c 20 20 20 20 20 20   leadName,      
4df0: 20 20 20 54 4b 5f 52 4f 57 53 2c 20 20 20 54 4b     TK_ROWS,   TK
4e00: 5f 55 4e 42 4f 55 4e 44 45 44 2c 20 54 4b 5f 55  _UNBOUNDED, TK_U
4e10: 4e 42 4f 55 4e 44 45 44 20 7d 2c 20 0a 20 20 20  NBOUNDED }, .   
4e20: 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 6e 74 20     };.      int 
4e30: 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  i;.      for(i=0
4e40: 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 55  ; i<ArraySize(aU
4e50: 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  p); i++){.      
4e60: 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 7a 4e 61    if( pFunc->zNa
4e70: 6d 65 3d 3d 61 55 70 5b 69 5d 2e 7a 46 75 6e 63  me==aUp[i].zFunc
4e80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
4e90: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
4ea0: 64 62 2c 20 70 57 69 6e 2d 3e 70 53 74 61 72 74  db, pWin->pStart
4eb0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
4ec0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
4ed0: 62 2c 20 70 57 69 6e 2d 3e 70 45 6e 64 29 3b 0a  b, pWin->pEnd);.
4ee0: 20 20 20 20 20 20 20 20 20 20 70 57 69 6e 2d 3e            pWin->
4ef0: 70 45 6e 64 20 3d 20 70 57 69 6e 2d 3e 70 53 74  pEnd = pWin->pSt
4f00: 61 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  art = 0;.       
4f10: 20 20 20 70 57 69 6e 2d 3e 65 54 79 70 65 20 3d     pWin->eType =
4f20: 20 61 55 70 5b 69 5d 2e 65 54 79 70 65 3b 0a 20   aUp[i].eType;. 
4f30: 20 20 20 20 20 20 20 20 20 70 57 69 6e 2d 3e 65           pWin->e
4f40: 53 74 61 72 74 20 3d 20 61 55 70 5b 69 5d 2e 65  Start = aUp[i].e
4f50: 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 20  Start;.         
4f60: 20 70 57 69 6e 2d 3e 65 45 6e 64 20 3d 20 61 55   pWin->eEnd = aU
4f70: 70 5b 69 5d 2e 65 45 6e 64 3b 0a 20 20 20 20 20  p[i].eEnd;.     
4f80: 20 20 20 20 20 69 66 28 20 70 57 69 6e 2d 3e 65       if( pWin->e
4f90: 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57  Start==TK_FOLLOW
4fa0: 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ING ){.         
4fb0: 20 20 20 70 57 69 6e 2d 3e 70 53 74 61 72 74 20     pWin->pStart 
4fc0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
4fd0: 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 22 31  , TK_INTEGER, "1
4fe0: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ");.          }.
4ff0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
5000: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5010: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70   }.    }.  }.  p
5020: 57 69 6e 2d 3e 70 46 75 6e 63 20 3d 20 70 46 75  Win->pFunc = pFu
5030: 6e 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  nc;.}../*.** Con
5040: 74 65 78 74 20 6f 62 6a 65 63 74 20 70 61 73 73  text object pass
5050: 65 64 20 74 68 72 6f 75 67 68 20 73 71 6c 69 74  ed through sqlit
5060: 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 29  e3WalkExprList()
5070: 20 74 6f 0a 2a 2a 20 73 65 6c 65 63 74 57 69 6e   to.** selectWin
5080: 64 6f 77 52 65 77 72 69 74 65 45 78 70 72 43 62  dowRewriteExprCb
5090: 28 29 20 62 79 20 73 65 6c 65 63 74 57 69 6e 64  () by selectWind
50a0: 6f 77 52 65 77 72 69 74 65 45 4c 69 73 74 28 29  owRewriteEList()
50b0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
50c0: 75 63 74 20 57 69 6e 64 6f 77 52 65 77 72 69 74  uct WindowRewrit
50d0: 65 20 57 69 6e 64 6f 77 52 65 77 72 69 74 65 3b  e WindowRewrite;
50e0: 0a 73 74 72 75 63 74 20 57 69 6e 64 6f 77 52 65  .struct WindowRe
50f0: 77 72 69 74 65 20 7b 0a 20 20 57 69 6e 64 6f 77  write {.  Window
5100: 20 2a 70 57 69 6e 3b 0a 20 20 53 72 63 4c 69 73   *pWin;.  SrcLis
5110: 74 20 2a 70 53 72 63 3b 0a 20 20 45 78 70 72 4c  t *pSrc;.  ExprL
5120: 69 73 74 20 2a 70 53 75 62 3b 0a 20 20 53 65 6c  ist *pSub;.  Sel
5130: 65 63 74 20 2a 70 53 75 62 53 65 6c 65 63 74 3b  ect *pSubSelect;
5140: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5150: 43 75 72 72 65 6e 74 20 73 75 62 2d 73 65 6c 65  Current sub-sele
5160: 63 74 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 7d 3b  ct, if any */.};
5170: 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 62 61 63 6b  ../*.** Callback
5180: 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 64 20 62   function used b
5190: 79 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65  y selectWindowRe
51a0: 77 72 69 74 65 45 4c 69 73 74 28 29 2e 20 49 66  writeEList(). If
51b0: 20 6e 65 63 65 73 73 61 72 79 2c 0a 2a 2a 20 74   necessary,.** t
51c0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 70 70  his function app
51d0: 65 6e 64 73 20 74 6f 20 74 68 65 20 6f 75 74 70  ends to the outp
51e0: 75 74 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69  ut expression-li
51f0: 73 74 20 61 6e 64 20 75 70 64 61 74 65 73 20 0a  st and updates .
5200: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 28 2a  ** expression (*
5210: 70 70 45 78 70 72 29 20 69 6e 20 70 6c 61 63 65  ppExpr) in place
5220: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5230: 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72  selectWindowRewr
5240: 69 74 65 45 78 70 72 43 62 28 57 61 6c 6b 65 72  iteExprCb(Walker
5250: 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
5260: 2a 70 45 78 70 72 29 7b 0a 20 20 73 74 72 75 63  *pExpr){.  struc
5270: 74 20 57 69 6e 64 6f 77 52 65 77 72 69 74 65 20  t WindowRewrite 
5280: 2a 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  *p = pWalker->u.
5290: 70 52 65 77 72 69 74 65 3b 0a 20 20 50 61 72 73  pRewrite;.  Pars
52a0: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c  e *pParse = pWal
52b0: 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 0a 20 20  ker->pParse;..  
52c0: 2f 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74  /* If this funct
52d0: 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c  ion is being cal
52e0: 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  led from within 
52f0: 61 20 73 63 61 6c 61 72 20 73 75 62 2d 73 65 6c  a scalar sub-sel
5300: 65 63 74 0a 20 20 2a 2a 20 74 68 61 74 20 75 73  ect.  ** that us
5310: 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54  ed by the SELECT
5320: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
5330: 20 70 72 6f 63 65 73 73 65 64 2c 20 6f 6e 6c 79   processed, only
5340: 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 54 4b   process.  ** TK
5350: 5f 43 4f 4c 55 4d 4e 20 65 78 70 72 65 73 73 69  _COLUMN expressi
5360: 6f 6e 73 20 74 68 61 74 20 72 65 66 65 72 20 74  ons that refer t
5370: 6f 20 69 74 20 28 74 68 65 20 6f 75 74 65 72 20  o it (the outer 
5380: 53 45 4c 45 43 54 29 2e 20 44 6f 0a 20 20 2a 2a  SELECT). Do.  **
5390: 20 6e 6f 74 20 70 72 6f 63 65 73 73 20 61 67 67   not process agg
53a0: 72 65 67 61 74 65 73 20 6f 72 20 77 69 6e 64 6f  regates or windo
53b0: 77 20 66 75 6e 63 74 69 6f 6e 73 20 61 74 20 61  w functions at a
53c0: 6c 6c 2c 20 61 73 20 74 68 65 79 20 62 65 6c 6f  ll, as they belo
53d0: 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 73  ng.  ** to the s
53e0: 63 61 6c 61 72 20 73 75 62 2d 73 65 6c 65 63 74  calar sub-select
53f0: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
5400: 53 75 62 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  SubSelect ){.   
5410: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
5420: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
5430: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
5440: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 65 6c 73  ntinue;.    }els
5450: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 72  e{.      int nSr
5460: 63 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72  c = p->pSrc->nSr
5470: 63 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  c;.      int i;.
5480: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
5490: 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nSrc; i++){.   
54a0: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
54b0: 69 54 61 62 6c 65 3d 3d 70 2d 3e 70 53 72 63 2d  iTable==p->pSrc-
54c0: 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 29 20  >a[i].iCursor ) 
54d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
54e0: 20 20 20 20 20 69 66 28 20 69 3d 3d 6e 53 72 63       if( i==nSrc
54f0: 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f   ) return WRC_Co
5500: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
5510: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  }..  switch( pEx
5520: 70 72 2d 3e 6f 70 20 29 7b 0a 0a 20 20 20 20 63  pr->op ){..    c
5530: 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
5540: 0a 20 20 20 20 20 20 69 66 28 20 21 45 78 70 72  .      if( !Expr
5550: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
5560: 72 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29  r, EP_WinFunc) )
5570: 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
5580: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5590: 20 20 20 20 20 20 57 69 6e 64 6f 77 20 2a 70 57        Window *pW
55a0: 69 6e 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  in;.        for(
55b0: 70 57 69 6e 3d 70 2d 3e 70 57 69 6e 3b 20 70 57  pWin=p->pWin; pW
55c0: 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70  in; pWin=pWin->p
55d0: 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 20 20  NextWin){.      
55e0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 79      if( pExpr->y
55f0: 2e 70 57 69 6e 3d 3d 70 57 69 6e 20 29 7b 0a 20  .pWin==pWin ){. 
5600: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
5610: 74 28 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 3d  t( pWin->pOwner=
5620: 3d 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  =pExpr );.      
5630: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
5640: 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 20 20  _Prune;.        
5650: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
5660: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46      }.      /* F
5670: 61 6c 6c 20 74 68 72 6f 75 67 68 2e 20 20 2a 2f  all through.  */
5680: 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  ..    case TK_AG
5690: 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  G_FUNCTION:.    
56a0: 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
56b0: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 44  {.      Expr *pD
56c0: 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  up = sqlite3Expr
56d0: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
56e0: 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  pExpr, 0);.     
56f0: 20 70 2d 3e 70 53 75 62 20 3d 20 73 71 6c 69 74   p->pSub = sqlit
5700: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
5710: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 53 75 62  (pParse, p->pSub
5720: 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 69  , pDup);.      i
5730: 66 28 20 70 2d 3e 70 53 75 62 20 29 7b 0a 20 20  f( p->pSub ){.  
5740: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78        assert( Ex
5750: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
5760: 78 70 72 2c 20 45 50 5f 53 74 61 74 69 63 29 3d  xpr, EP_Static)=
5770: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 45 78  =0 );.        Ex
5780: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
5790: 78 70 72 2c 20 45 50 5f 53 74 61 74 69 63 29 3b  xpr, EP_Static);
57a0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
57b0: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
57c0: 65 2d 3e 64 62 2c 20 70 45 78 70 72 29 3b 0a 20  e->db, pExpr);. 
57d0: 20 20 20 20 20 20 20 45 78 70 72 43 6c 65 61 72         ExprClear
57e0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
57f0: 45 50 5f 53 74 61 74 69 63 29 3b 0a 20 20 20 20  EP_Static);.    
5800: 20 20 20 20 6d 65 6d 73 65 74 28 70 45 78 70 72      memset(pExpr
5810: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  , 0, sizeof(Expr
5820: 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 70 45 78  ));..        pEx
5830: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55  pr->op = TK_COLU
5840: 4d 4e 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70  MN;.        pExp
5850: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 2d 3e  r->iColumn = p->
5860: 70 53 75 62 2d 3e 6e 45 78 70 72 2d 31 3b 0a 20  pSub->nExpr-1;. 
5870: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
5880: 61 62 6c 65 20 3d 20 70 2d 3e 70 57 69 6e 2d 3e  able = p->pWin->
5890: 69 45 70 68 43 73 72 3b 0a 20 20 20 20 20 20 7d  iEphCsr;.      }
58a0: 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ..      break;. 
58b0: 20 20 20 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c     }..    defaul
58c0: 74 3a 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20  t: /* no-op */. 
58d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
58e0: 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
58f0: 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63  ntinue;.}.static
5900: 20 69 6e 74 20 73 65 6c 65 63 74 57 69 6e 64 6f   int selectWindo
5910: 77 52 65 77 72 69 74 65 53 65 6c 65 63 74 43 62  wRewriteSelectCb
5920: 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
5930: 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
5940: 74 29 7b 0a 20 20 73 74 72 75 63 74 20 57 69 6e  t){.  struct Win
5950: 64 6f 77 52 65 77 72 69 74 65 20 2a 70 20 3d 20  dowRewrite *p = 
5960: 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 52 65 77 72  pWalker->u.pRewr
5970: 69 74 65 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  ite;.  Select *p
5980: 53 61 76 65 20 3d 20 70 2d 3e 70 53 75 62 53 65  Save = p->pSubSe
5990: 6c 65 63 74 3b 0a 20 20 69 66 28 20 70 53 61 76  lect;.  if( pSav
59a0: 65 3d 3d 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  e==pSelect ){.  
59b0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
59c0: 74 69 6e 75 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tinue;.  }else{.
59d0: 20 20 20 20 70 2d 3e 70 53 75 62 53 65 6c 65 63      p->pSubSelec
59e0: 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20 20  t = pSelect;.   
59f0: 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
5a00: 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c  ct(pWalker, pSel
5a10: 65 63 74 29 3b 0a 20 20 20 20 70 2d 3e 70 53 75  ect);.    p->pSu
5a20: 62 53 65 6c 65 63 74 20 3d 20 70 53 61 76 65 3b  bSelect = pSave;
5a30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
5a40: 43 5f 50 72 75 6e 65 3b 0a 7d 0a 0a 0a 2f 2a 0a  C_Prune;.}.../*.
5a50: 2a 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75  ** Iterate throu
5a60: 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69  gh each expressi
5a70: 6f 6e 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  on in expression
5a80: 2d 6c 69 73 74 20 70 45 4c 69 73 74 2e 20 46 6f  -list pEList. Fo
5a90: 72 20 65 61 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20  r each:.**.**   
5aa0: 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 2c 0a 2a 2a 20  * TK_COLUMN,.** 
5ab0: 20 20 2a 20 61 67 67 72 65 67 61 74 65 20 66 75    * aggregate fu
5ac0: 6e 63 74 69 6f 6e 2c 20 6f 72 0a 2a 2a 20 20 20  nction, or.**   
5ad0: 2a 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  * window functio
5ae0: 6e 20 77 69 74 68 20 61 20 57 69 6e 64 6f 77 20  n with a Window 
5af0: 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73 20 6e  object that is n
5b00: 6f 74 20 61 20 6d 65 6d 62 65 72 20 6f 66 20 74  ot a member of t
5b10: 68 65 20 0a 2a 2a 20 20 20 20 20 57 69 6e 64 6f  he .**     Windo
5b20: 77 20 6c 69 73 74 20 70 61 73 73 65 64 20 61 73  w list passed as
5b30: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
5b40: 6d 65 6e 74 20 28 70 57 69 6e 29 2e 0a 2a 2a 0a  ment (pWin)..**.
5b50: 2a 2a 20 41 70 70 65 6e 64 20 74 68 65 20 6e 6f  ** Append the no
5b60: 64 65 20 74 6f 20 6f 75 74 70 75 74 20 65 78 70  de to output exp
5b70: 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 28 2a 70  ression-list (*p
5b80: 70 53 75 62 29 2e 20 41 6e 64 20 72 65 70 6c 61  pSub). And repla
5b90: 63 65 20 69 74 0a 2a 2a 20 77 69 74 68 20 61 20  ce it.** with a 
5ba0: 54 4b 5f 43 4f 4c 55 4d 4e 20 74 68 61 74 20 72  TK_COLUMN that r
5bb0: 65 61 64 73 20 74 68 65 20 28 4e 2d 31 29 74 68  eads the (N-1)th
5bc0: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 61 62 6c   element of tabl
5bd0: 65 20 0a 2a 2a 20 70 57 69 6e 2d 3e 69 45 70 68  e .** pWin->iEph
5be0: 43 73 72 2c 20 77 68 65 72 65 20 4e 20 69 73 20  Csr, where N is 
5bf0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
5c00: 65 6d 65 6e 74 73 20 69 6e 20 28 2a 70 70 53 75  ements in (*ppSu
5c10: 62 29 20 61 66 74 65 72 0a 2a 2a 20 61 70 70 65  b) after.** appe
5c20: 6e 64 69 6e 67 20 74 68 65 20 6e 65 77 20 6f 6e  nding the new on
5c30: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
5c40: 64 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65  d selectWindowRe
5c50: 77 72 69 74 65 45 4c 69 73 74 28 0a 20 20 50 61  writeEList(.  Pa
5c60: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20  rse *pParse, .  
5c70: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 2c 0a 20 20  Window *pWin,.  
5c80: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 0a 20  SrcList *pSrc,. 
5c90: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
5ca0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
5cb0: 20 2f 2a 20 52 65 77 72 69 74 65 20 65 78 70 72   /* Rewrite expr
5cc0: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 69 73 20  essions in this 
5cd0: 6c 69 73 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  list */.  ExprLi
5ce0: 73 74 20 2a 2a 70 70 53 75 62 20 20 20 20 20 20  st **ppSub      
5cf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
5d00: 4f 55 54 3a 20 53 75 62 2d 73 65 6c 65 63 74 20  OUT: Sub-select 
5d10: 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20  expression-list 
5d20: 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65 72 20 73  */.){.  Walker s
5d30: 57 61 6c 6b 65 72 3b 0a 20 20 57 69 6e 64 6f 77  Walker;.  Window
5d40: 52 65 77 72 69 74 65 20 73 52 65 77 72 69 74 65  Rewrite sRewrite
5d50: 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 61  ;..  memset(&sWa
5d60: 6c 6b 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  lker, 0, sizeof(
5d70: 57 61 6c 6b 65 72 29 29 3b 0a 20 20 6d 65 6d 73  Walker));.  mems
5d80: 65 74 28 26 73 52 65 77 72 69 74 65 2c 20 30 2c  et(&sRewrite, 0,
5d90: 20 73 69 7a 65 6f 66 28 57 69 6e 64 6f 77 52 65   sizeof(WindowRe
5da0: 77 72 69 74 65 29 29 3b 0a 0a 20 20 73 52 65 77  write));..  sRew
5db0: 72 69 74 65 2e 70 53 75 62 20 3d 20 2a 70 70 53  rite.pSub = *ppS
5dc0: 75 62 3b 0a 20 20 73 52 65 77 72 69 74 65 2e 70  ub;.  sRewrite.p
5dd0: 57 69 6e 20 3d 20 70 57 69 6e 3b 0a 20 20 73 52  Win = pWin;.  sR
5de0: 65 77 72 69 74 65 2e 70 53 72 63 20 3d 20 70 53  ewrite.pSrc = pS
5df0: 72 63 3b 0a 0a 20 20 73 57 61 6c 6b 65 72 2e 70  rc;..  sWalker.p
5e00: 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
5e10: 20 20 73 57 61 6c 6b 65 72 2e 78 45 78 70 72 43    sWalker.xExprC
5e20: 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74  allback = select
5e30: 57 69 6e 64 6f 77 52 65 77 72 69 74 65 45 78 70  WindowRewriteExp
5e40: 72 43 62 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 78  rCb;.  sWalker.x
5e50: 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
5e60: 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77   selectWindowRew
5e70: 72 69 74 65 53 65 6c 65 63 74 43 62 3b 0a 20 20  riteSelectCb;.  
5e80: 73 57 61 6c 6b 65 72 2e 75 2e 70 52 65 77 72 69  sWalker.u.pRewri
5e90: 74 65 20 3d 20 26 73 52 65 77 72 69 74 65 3b 0a  te = &sRewrite;.
5ea0: 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33  .  (void)sqlite3
5eb0: 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 26 73 57  WalkExprList(&sW
5ec0: 61 6c 6b 65 72 2c 20 70 45 4c 69 73 74 29 3b 0a  alker, pEList);.
5ed0: 0a 20 20 2a 70 70 53 75 62 20 3d 20 73 52 65 77  .  *ppSub = sRew
5ee0: 72 69 74 65 2e 70 53 75 62 3b 0a 7d 0a 0a 2f 2a  rite.pSub;.}../*
5ef0: 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 63 6f 70  .** Append a cop
5f00: 79 20 6f 66 20 65 61 63 68 20 65 78 70 72 65 73  y of each expres
5f10: 73 69 6f 6e 20 69 6e 20 65 78 70 72 65 73 73 69  sion in expressi
5f20: 6f 6e 2d 6c 69 73 74 20 70 41 70 70 65 6e 64 20  on-list pAppend 
5f30: 74 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  to.** expression
5f40: 20 6c 69 73 74 20 70 4c 69 73 74 2e 20 52 65 74   list pList. Ret
5f50: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
5f60: 20 74 68 65 20 72 65 73 75 6c 74 20 6c 69 73 74   the result list
5f70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72  ..*/.static Expr
5f80: 4c 69 73 74 20 2a 65 78 70 72 4c 69 73 74 41 70  List *exprListAp
5f90: 70 65 6e 64 4c 69 73 74 28 0a 20 20 50 61 72 73  pendList(.  Pars
5fa0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
5fb0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
5fc0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
5fd0: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
5fe0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77      /* List to w
5ff0: 68 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20  hich to append. 
6000: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
6010: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 41 70  .  ExprList *pAp
6020: 70 65 6e 64 20 20 20 20 20 20 20 2f 2a 20 4c 69  pend       /* Li
6030: 73 74 20 6f 66 20 76 61 6c 75 65 73 20 74 6f 20  st of values to 
6040: 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65  append. Might be
6050: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66   NULL */.){.  if
6060: 28 20 70 41 70 70 65 6e 64 20 29 7b 0a 20 20 20  ( pAppend ){.   
6070: 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
6080: 6e 49 6e 69 74 20 3d 20 70 4c 69 73 74 20 3f 20  nInit = pList ? 
6090: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
60a0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
60b0: 3c 70 41 70 70 65 6e 64 2d 3e 6e 45 78 70 72 3b  <pAppend->nExpr;
60c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70   i++){.      Exp
60d0: 72 20 2a 70 44 75 70 20 3d 20 73 71 6c 69 74 65  r *pDup = sqlite
60e0: 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d  3ExprDup(pParse-
60f0: 3e 64 62 2c 20 70 41 70 70 65 6e 64 2d 3e 61 5b  >db, pAppend->a[
6100: 69 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  i].pExpr, 0);.  
6110: 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
6120: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
6130: 64 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c  d(pParse, pList,
6140: 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 69 66   pDup);.      if
6150: 28 20 70 4c 69 73 74 20 29 20 70 4c 69 73 74 2d  ( pList ) pList-
6160: 3e 61 5b 6e 49 6e 69 74 2b 69 5d 2e 73 6f 72 74  >a[nInit+i].sort
6170: 4f 72 64 65 72 20 3d 20 70 41 70 70 65 6e 64 2d  Order = pAppend-
6180: 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
6190: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
61a0: 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
61b0: 0a 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43  .** If the SELEC
61c0: 54 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  T statement pass
61d0: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
61e0: 20 61 72 67 75 6d 65 6e 74 20 64 6f 65 73 20 6e   argument does n
61f0: 6f 74 20 69 6e 76 6f 6b 65 0a 2a 2a 20 61 6e 79  ot invoke.** any
6200: 20 53 51 4c 20 77 69 6e 64 6f 77 20 66 75 6e 63   SQL window func
6210: 74 69 6f 6e 73 2c 20 74 68 69 73 20 66 75 6e 63  tions, this func
6220: 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
6230: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 0a   Otherwise, it .
6240: 2a 2a 20 72 65 77 72 69 74 65 73 20 74 68 65 20  ** rewrites the 
6250: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
6260: 20 73 6f 20 74 68 61 74 20 77 69 6e 64 6f 77 20   so that window 
6270: 66 75 6e 63 74 69 6f 6e 20 78 53 74 65 70 20 66  function xStep f
6280: 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 61 72 65 20  unctions.** are 
6290: 69 6e 76 6f 6b 65 64 20 69 6e 20 74 68 65 20 63  invoked in the c
62a0: 6f 72 72 65 63 74 20 6f 72 64 65 72 20 61 73 20  orrect order as 
62b0: 64 65 73 63 72 69 62 65 64 20 75 6e 64 65 72 20  described under 
62c0: 22 53 45 4c 45 43 54 20 52 45 57 52 49 54 49 4e  "SELECT REWRITIN
62d0: 47 22 0a 2a 2a 20 61 74 20 74 68 65 20 74 6f 70  G".** at the top
62e0: 20 6f 66 20 74 68 69 73 20 66 69 6c 65 2e 0a 2a   of this file..*
62f0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 69 6e  /.int sqlite3Win
6300: 64 6f 77 52 65 77 72 69 74 65 28 50 61 72 73 65  dowRewrite(Parse
6310: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
6320: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d   *p){.  int rc =
6330: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
6340: 28 20 70 2d 3e 70 57 69 6e 20 26 26 20 70 2d 3e  ( p->pWin && p->
6350: 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20  pPrior==0 ){.   
6360: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
6370: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
6380: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  );.    sqlite3 *
6390: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
63a0: 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75  .    Select *pSu
63b0: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
63c0: 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65     /* The subque
63d0: 72 79 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73  ry */.    SrcLis
63e0: 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  t *pSrc = p->pSr
63f0: 63 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 57 68  c;.    Expr *pWh
6400: 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ere = p->pWhere;
6410: 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
6420: 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
6430: 6f 75 70 42 79 3b 0a 20 20 20 20 45 78 70 72 20  oupBy;.    Expr 
6440: 2a 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48  *pHaving = p->pH
6450: 61 76 69 6e 67 3b 0a 20 20 20 20 45 78 70 72 4c  aving;.    ExprL
6460: 69 73 74 20 2a 70 53 6f 72 74 20 3d 20 30 3b 0a  ist *pSort = 0;.
6470: 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
6480: 53 75 62 6c 69 73 74 20 3d 20 30 3b 20 20 20 20  Sublist = 0;    
6490: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
64a0: 20 6c 69 73 74 20 66 6f 72 20 73 75 62 2d 71 75   list for sub-qu
64b0: 65 72 79 20 2a 2f 0a 20 20 20 20 57 69 6e 64 6f  ery */.    Windo
64c0: 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57  w *pMWin = p->pW
64d0: 69 6e 3b 20 20 20 20 20 20 2f 2a 20 4d 61 73 74  in;      /* Mast
64e0: 65 72 20 77 69 6e 64 6f 77 20 6f 62 6a 65 63 74  er window object
64f0: 20 2a 2f 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a   */.    Window *
6500: 70 57 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20  pWin;           
6510: 20 20 20 20 20 20 2f 2a 20 57 69 6e 64 6f 77 20        /* Window 
6520: 6f 62 6a 65 63 74 20 69 74 65 72 61 74 6f 72 20  object iterator 
6530: 2a 2f 0a 0a 20 20 20 20 70 2d 3e 70 53 72 63 20  */..    p->pSrc 
6540: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65  = 0;.    p->pWhe
6550: 72 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  re = 0;.    p->p
6560: 47 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20 20  GroupBy = 0;.   
6570: 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b   p->pHaving = 0;
6580: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
6590: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
65a0: 75 73 65 20 66 6f 72 20 74 68 65 20 73 75 62 2d  use for the sub-
65b0: 73 65 6c 65 63 74 2e 20 54 68 69 73 20 69 73 20  select. This is 
65c0: 74 68 65 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f  the concatenatio
65d0: 6e 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  n.    ** of the 
65e0: 77 69 6e 64 6f 77 20 50 41 52 54 49 54 49 4f 4e  window PARTITION
65f0: 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 63 6c   and ORDER BY cl
6600: 61 75 73 65 73 2e 20 54 68 65 6e 2c 20 69 66 20  auses. Then, if 
6610: 74 68 69 73 20 6d 61 6b 65 73 20 69 74 0a 20 20  this makes it.  
6620: 20 20 2a 2a 20 72 65 64 75 6e 64 61 6e 74 2c 20    ** redundant, 
6630: 72 65 6d 6f 76 65 20 74 68 65 20 4f 52 44 45 52  remove the ORDER
6640: 20 42 59 20 66 72 6f 6d 20 74 68 65 20 70 61 72   BY from the par
6650: 65 6e 74 20 53 45 4c 45 43 54 2e 20 20 2a 2f 0a  ent SELECT.  */.
6660: 20 20 20 20 70 53 6f 72 74 20 3d 20 73 71 6c 69      pSort = sqli
6670: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
6680: 62 2c 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69  b, pMWin->pParti
6690: 74 69 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 70 53  tion, 0);.    pS
66a0: 6f 72 74 20 3d 20 65 78 70 72 4c 69 73 74 41 70  ort = exprListAp
66b0: 70 65 6e 64 4c 69 73 74 28 70 50 61 72 73 65 2c  pendList(pParse,
66c0: 20 70 53 6f 72 74 2c 20 70 4d 57 69 6e 2d 3e 70   pSort, pMWin->p
66d0: 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66  OrderBy);.    if
66e0: 28 20 70 53 6f 72 74 20 26 26 20 70 2d 3e 70 4f  ( pSort && p->pO
66f0: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
6700: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c  if( sqlite3ExprL
6710: 69 73 74 43 6f 6d 70 61 72 65 28 70 53 6f 72 74  istCompare(pSort
6720: 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d  , p->pOrderBy, -
6730: 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1)==0 ){.       
6740: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
6750: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f  Delete(db, p->pO
6760: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 20  rderBy);.       
6770: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30   p->pOrderBy = 0
6780: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6790: 0a 20 20 20 20 2f 2a 20 41 73 73 69 67 6e 20 61  .    /* Assign a
67a0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
67b0: 6f 72 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  or the ephemeral
67c0: 20 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20 62   table used to b
67d0: 75 66 66 65 72 20 72 6f 77 73 2e 0a 20 20 20 20  uffer rows..    
67e0: 2a 2a 20 54 68 65 20 4f 70 65 6e 45 70 68 65 6d  ** The OpenEphem
67f0: 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  eral instruction
6800: 20 69 73 20 63 6f 64 65 64 20 6c 61 74 65 72 2c   is coded later,
6810: 20 61 66 74 65 72 20 69 74 20 69 73 20 6b 6e 6f   after it is kno
6820: 77 6e 20 68 6f 77 0a 20 20 20 20 2a 2a 20 6d 61  wn how.    ** ma
6830: 6e 79 20 63 6f 6c 75 6d 6e 73 20 74 68 65 20 74  ny columns the t
6840: 61 62 6c 65 20 77 69 6c 6c 20 68 61 76 65 2e 20  able will have. 
6850: 20 2a 2f 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 69   */.    pMWin->i
6860: 45 70 68 43 73 72 20 3d 20 70 50 61 72 73 65 2d  EphCsr = pParse-
6870: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70 50 61  >nTab++;.    pPa
6880: 72 73 65 2d 3e 6e 54 61 62 20 2b 3d 20 33 3b 0a  rse->nTab += 3;.
6890: 0a 20 20 20 20 73 65 6c 65 63 74 57 69 6e 64 6f  .    selectWindo
68a0: 77 52 65 77 72 69 74 65 45 4c 69 73 74 28 70 50  wRewriteEList(pP
68b0: 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 70 53 72  arse, pMWin, pSr
68c0: 63 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 26 70  c, p->pEList, &p
68d0: 53 75 62 6c 69 73 74 29 3b 0a 20 20 20 20 73 65  Sublist);.    se
68e0: 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74  lectWindowRewrit
68f0: 65 45 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  eEList(pParse, p
6900: 4d 57 69 6e 2c 20 70 53 72 63 2c 20 70 2d 3e 70  MWin, pSrc, p->p
6910: 4f 72 64 65 72 42 79 2c 20 26 70 53 75 62 6c 69  OrderBy, &pSubli
6920: 73 74 29 3b 0a 20 20 20 20 70 4d 57 69 6e 2d 3e  st);.    pMWin->
6930: 6e 42 75 66 66 65 72 43 6f 6c 20 3d 20 28 70 53  nBufferCol = (pS
6940: 75 62 6c 69 73 74 20 3f 20 70 53 75 62 6c 69 73  ublist ? pSublis
6950: 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 0a  t->nExpr : 0);..
6960: 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68      /* Append th
6970: 65 20 50 41 52 54 49 54 49 4f 4e 20 42 59 20 61  e PARTITION BY a
6980: 6e 64 20 4f 52 44 45 52 20 42 59 20 65 78 70 72  nd ORDER BY expr
6990: 65 73 73 69 6f 6e 73 20 74 6f 20 74 68 65 20 74  essions to the t
69a0: 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 75  o the .    ** su
69b0: 62 2d 73 65 6c 65 63 74 20 65 78 70 72 65 73 73  b-select express
69c0: 69 6f 6e 20 6c 69 73 74 2e 20 54 68 65 79 20 61  ion list. They a
69d0: 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 66  re required to f
69e0: 69 67 75 72 65 20 6f 75 74 20 77 68 65 72 65 20  igure out where 
69f0: 0a 20 20 20 20 2a 2a 20 62 6f 75 6e 64 61 72 69  .    ** boundari
6a00: 65 73 20 66 6f 72 20 70 61 72 74 69 74 69 6f 6e  es for partition
6a10: 73 20 61 6e 64 20 73 65 74 73 20 6f 66 20 70 65  s and sets of pe
6a20: 65 72 20 72 6f 77 73 20 6c 69 65 2e 20 20 2a 2f  er rows lie.  */
6a30: 0a 20 20 20 20 70 53 75 62 6c 69 73 74 20 3d 20  .    pSublist = 
6a40: 65 78 70 72 4c 69 73 74 41 70 70 65 6e 64 4c 69  exprListAppendLi
6a50: 73 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 6c  st(pParse, pSubl
6a60: 69 73 74 2c 20 70 4d 57 69 6e 2d 3e 70 50 61 72  ist, pMWin->pPar
6a70: 74 69 74 69 6f 6e 29 3b 0a 20 20 20 20 70 53 75  tition);.    pSu
6a80: 62 6c 69 73 74 20 3d 20 65 78 70 72 4c 69 73 74  blist = exprList
6a90: 41 70 70 65 6e 64 4c 69 73 74 28 70 50 61 72 73  AppendList(pPars
6aa0: 65 2c 20 70 53 75 62 6c 69 73 74 2c 20 70 4d 57  e, pSublist, pMW
6ab0: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 0a  in->pOrderBy);..
6ac0: 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68      /* Append th
6ad0: 65 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73  e arguments pass
6ae0: 65 64 20 74 6f 20 65 61 63 68 20 77 69 6e 64 6f  ed to each windo
6af0: 77 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 74 68  w function to th
6b00: 65 0a 20 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c  e.    ** sub-sel
6b10: 65 63 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  ect expression l
6b20: 69 73 74 2e 20 41 6c 73 6f 20 61 6c 6c 6f 63 61  ist. Also alloca
6b30: 74 65 20 74 77 6f 20 72 65 67 69 73 74 65 72 73  te two registers
6b40: 20 66 6f 72 20 65 61 63 68 0a 20 20 20 20 2a 2a   for each.    **
6b50: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
6b60: 20 2d 20 6f 6e 65 20 66 6f 72 20 74 68 65 20 61   - one for the a
6b70: 63 63 75 6d 75 6c 61 74 6f 72 2c 20 61 6e 6f 74  ccumulator, anot
6b80: 68 65 72 20 66 6f 72 20 69 6e 74 65 72 69 6d 0a  her for interim.
6b90: 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 73 2e 20      ** results. 
6ba0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 57 69 6e   */.    for(pWin
6bb0: 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57  =pMWin; pWin; pW
6bc0: 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69  in=pWin->pNextWi
6bd0: 6e 29 7b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e  n){.      pWin->
6be0: 69 41 72 67 43 6f 6c 20 3d 20 28 70 53 75 62 6c  iArgCol = (pSubl
6bf0: 69 73 74 20 3f 20 70 53 75 62 6c 69 73 74 2d 3e  ist ? pSublist->
6c00: 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20  nExpr : 0);.    
6c10: 20 20 70 53 75 62 6c 69 73 74 20 3d 20 65 78 70    pSublist = exp
6c20: 72 4c 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28  rListAppendList(
6c30: 70 50 61 72 73 65 2c 20 70 53 75 62 6c 69 73 74  pParse, pSublist
6c40: 2c 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e  , pWin->pOwner->
6c50: 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  x.pList);.      
6c60: 69 66 28 20 70 57 69 6e 2d 3e 70 46 69 6c 74 65  if( pWin->pFilte
6c70: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  r ){.        Exp
6c80: 72 20 2a 70 46 69 6c 74 65 72 20 3d 20 73 71 6c  r *pFilter = sql
6c90: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
6ca0: 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72 2c 20 30  pWin->pFilter, 0
6cb0: 29 3b 0a 20 20 20 20 20 20 20 20 70 53 75 62 6c  );.        pSubl
6cc0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
6cd0: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
6ce0: 73 65 2c 20 70 53 75 62 6c 69 73 74 2c 20 70 46  se, pSublist, pF
6cf0: 69 6c 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  ilter);.      }.
6d00: 20 20 20 20 20 20 70 57 69 6e 2d 3e 72 65 67 41        pWin->regA
6d10: 63 63 75 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  ccum = ++pParse-
6d20: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 57 69  >nMem;.      pWi
6d30: 6e 2d 3e 72 65 67 52 65 73 75 6c 74 20 3d 20 2b  n->regResult = +
6d40: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
6d50: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6d60: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
6d70: 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41  l, 0, pWin->regA
6d80: 63 63 75 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ccum);.    }..  
6d90: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
6da0: 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20   no ORDER BY or 
6db0: 50 41 52 54 49 54 49 4f 4e 20 42 59 20 63 6c 61  PARTITION BY cla
6dc0: 75 73 65 2c 20 61 6e 64 20 74 68 65 20 77 69 6e  use, and the win
6dd0: 64 6f 77 0a 20 20 20 20 2a 2a 20 66 75 6e 63 74  dow.    ** funct
6de0: 69 6f 6e 20 61 63 63 65 70 74 73 20 7a 65 72 6f  ion accepts zero
6df0: 20 61 72 67 75 6d 65 6e 74 73 2c 20 61 6e 64 20   arguments, and 
6e00: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 74 68  there are no oth
6e10: 65 72 20 63 6f 6c 75 6d 6e 73 0a 20 20 20 20 2a  er columns.    *
6e20: 2a 20 73 65 6c 65 63 74 65 64 20 28 65 2e 67 2e  * selected (e.g.
6e30: 20 22 53 45 4c 45 43 54 20 72 6f 77 5f 6e 75 6d   "SELECT row_num
6e40: 62 65 72 28 29 20 4f 56 45 52 20 28 29 20 46 52  ber() OVER () FR
6e50: 4f 4d 20 74 31 22 29 2c 20 69 74 20 69 73 20 70  OM t1"), it is p
6e60: 6f 73 73 69 62 6c 65 0a 20 20 20 20 2a 2a 20 74  ossible.    ** t
6e70: 68 61 74 20 70 53 75 62 6c 69 73 74 20 69 73 20  hat pSublist is 
6e80: 73 74 69 6c 6c 20 4e 55 4c 4c 20 68 65 72 65 2e  still NULL here.
6e90: 20 41 64 64 20 61 20 63 6f 6e 73 74 61 6e 74 20   Add a constant 
6ea0: 65 78 70 72 65 73 73 69 6f 6e 20 68 65 72 65 20  expression here 
6eb0: 74 6f 20 0a 20 20 20 20 2a 2a 20 6b 65 65 70 20  to .    ** keep 
6ec0: 65 76 65 72 79 74 68 69 6e 67 20 6c 65 67 61 6c  everything legal
6ed0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 0a   in this case. .
6ee0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
6ef0: 53 75 62 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  Sublist==0 ){.  
6f00: 20 20 20 20 70 53 75 62 6c 69 73 74 20 3d 20 73      pSublist = s
6f10: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
6f20: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20  pend(pParse, 0, 
6f30: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
6f40: 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20  e3ExprAlloc(db, 
6f50: 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73 71 6c  TK_INTEGER, &sql
6f60: 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 30 5d  ite3IntTokens[0]
6f70: 2c 20 30 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  , 0).      );.  
6f80: 20 20 7d 0a 0a 20 20 20 20 70 53 75 62 20 3d 20    }..    pSub = 
6f90: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77  sqlite3SelectNew
6fa0: 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  (.        pParse
6fb0: 2c 20 70 53 75 62 6c 69 73 74 2c 20 70 53 72 63  , pSublist, pSrc
6fc0: 2c 20 70 57 68 65 72 65 2c 20 70 47 72 6f 75 70  , pWhere, pGroup
6fd0: 42 79 2c 20 70 48 61 76 69 6e 67 2c 20 70 53 6f  By, pHaving, pSo
6fe0: 72 74 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a  rt, 0, 0.    );.
6ff0: 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 73 71      p->pSrc = sq
7000: 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
7010: 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c  nd(pParse, 0, 0,
7020: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e   0);.    if( p->
7030: 70 53 72 63 20 29 7b 0a 20 20 20 20 20 20 70 2d  pSrc ){.      p-
7040: 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c  >pSrc->a[0].pSel
7050: 65 63 74 20 3d 20 70 53 75 62 3b 0a 20 20 20 20  ect = pSub;.    
7060: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
7070: 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50  AssignCursors(pP
7080: 61 72 73 65 2c 20 70 2d 3e 70 53 72 63 29 3b 0a  arse, p->pSrc);.
7090: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
70a0: 33 45 78 70 61 6e 64 53 75 62 71 75 65 72 79 28  3ExpandSubquery(
70b0: 70 50 61 72 73 65 2c 20 26 70 2d 3e 70 53 72 63  pParse, &p->pSrc
70c0: 2d 3e 61 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  ->a[0]) ){.     
70d0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
70e0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  OMEM;.      }els
70f0: 65 7b 0a 20 20 20 20 20 20 20 20 70 53 75 62 2d  e{.        pSub-
7100: 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
7110: 45 78 70 61 6e 64 65 64 3b 0a 20 20 20 20 20 20  Expanded;.      
7120: 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d    p->selFlags &=
7130: 20 7e 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a   ~SF_Aggregate;.
7140: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
7150: 65 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65  electPrep(pParse
7160: 2c 20 70 53 75 62 2c 20 30 29 3b 0a 20 20 20 20  , pSub, 0);.    
7170: 20 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69 74    }..      sqlit
7180: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
7190: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
71a0: 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
71b0: 2c 20 70 53 75 62 6c 69 73 74 2d 3e 6e 45 78 70  , pSublist->nExp
71c0: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
71d0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
71e0: 50 5f 4f 70 65 6e 44 75 70 2c 20 70 4d 57 69 6e  P_OpenDup, pMWin
71f0: 2d 3e 69 45 70 68 43 73 72 2b 31 2c 20 70 4d 57  ->iEphCsr+1, pMW
7200: 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20  in->iEphCsr);.  
7210: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7220: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
7230: 44 75 70 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  Dup, pMWin->iEph
7240: 43 73 72 2b 32 2c 20 70 4d 57 69 6e 2d 3e 69 45  Csr+2, pMWin->iE
7250: 70 68 43 73 72 29 3b 0a 20 20 20 20 20 20 73 71  phCsr);.      sq
7260: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7270: 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70  v, OP_OpenDup, p
7280: 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2b 33 2c  MWin->iEphCsr+3,
7290: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29   pMWin->iEphCsr)
72a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
72b0: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
72c0: 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 29  Delete(db, pSub)
72d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
72e0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
72f0: 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e   ) rc = SQLITE_N
7300: 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  OMEM;.  }..  ret
7310: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
7320: 20 46 72 65 65 20 74 68 65 20 57 69 6e 64 6f 77   Free the Window
7330: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
7340: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
7350: 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ument..*/.void s
7360: 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65  qlite3WindowDele
7370: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
7380: 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 69 66  Window *p){.  if
7390: 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( p ){.    sqlit
73a0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
73b0: 20 70 2d 3e 70 46 69 6c 74 65 72 29 3b 0a 20 20   p->pFilter);.  
73c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
73d0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
73e0: 50 61 72 74 69 74 69 6f 6e 29 3b 0a 20 20 20 20  Partition);.    
73f0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
7400: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
7410: 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71 6c 69  derBy);.    sqli
7420: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
7430: 2c 20 70 2d 3e 70 45 6e 64 29 3b 0a 20 20 20 20  , p->pEnd);.    
7440: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
7450: 65 28 64 62 2c 20 70 2d 3e 70 53 74 61 72 74 29  e(db, p->pStart)
7460: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
7470: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4e 61 6d 65  ree(db, p->zName
7480: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
7490: 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 42 61 73  Free(db, p->zBas
74a0: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  e);.    sqlite3D
74b0: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
74c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
74d0: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
74e0: 6f 66 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74  of Window object
74f0: 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 74 68  s starting at th
7500: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
7510: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
7520: 65 33 57 69 6e 64 6f 77 4c 69 73 74 44 65 6c 65  e3WindowListDele
7530: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
7540: 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 77 68  Window *p){.  wh
7550: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 57 69  ile( p ){.    Wi
7560: 6e 64 6f 77 20 2a 70 4e 65 78 74 20 3d 20 70 2d  ndow *pNext = p-
7570: 3e 70 4e 65 78 74 57 69 6e 3b 0a 20 20 20 20 73  >pNextWin;.    s
7580: 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65  qlite3WindowDele
7590: 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 70  te(db, p);.    p
75a0: 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 7d 0a   = pNext;.  }.}.
75b0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  ./*.** The argum
75c0: 65 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ent expression i
75d0: 73 20 61 6e 20 50 52 45 43 45 44 49 4e 47 20 6f  s an PRECEDING o
75e0: 72 20 46 4f 4c 4c 4f 57 49 4e 47 20 6f 66 66 73  r FOLLOWING offs
75f0: 65 74 2e 20 20 54 68 65 0a 2a 2a 20 76 61 6c 75  et.  The.** valu
7600: 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f  e should be a no
7610: 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67  n-negative integ
7620: 65 72 2e 20 20 49 66 20 74 68 65 20 76 61 6c 75  er.  If the valu
7630: 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 63 6f  e is not a.** co
7640: 6e 73 74 61 6e 74 2c 20 63 68 61 6e 67 65 20 69  nstant, change i
7650: 74 20 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 65 20  t to NULL.  The 
7660: 66 61 63 74 20 74 68 61 74 20 69 74 20 69 73 20  fact that it is 
7670: 74 68 65 6e 20 61 20 6e 6f 6e 2d 6e 65 67 61 74  then a non-negat
7680: 69 76 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 77  ive.** integer w
7690: 69 6c 6c 20 62 65 20 63 61 75 67 68 74 20 6c 61  ill be caught la
76a0: 74 65 72 2e 20 20 42 75 74 20 69 74 20 69 73 20  ter.  But it is 
76b0: 69 6d 70 6f 72 74 61 6e 74 20 6e 6f 74 20 74 6f  important not to
76c0: 20 6c 65 61 76 65 0a 2a 2a 20 76 61 72 69 61 62   leave.** variab
76d0: 6c 65 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65  le values in the
76e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
76f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72  ..*/.static Expr
7700: 20 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4f   *sqlite3WindowO
7710: 66 66 73 65 74 45 78 70 72 28 50 61 72 73 65 20  ffsetExpr(Parse 
7720: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
7730: 45 78 70 72 29 7b 0a 20 20 69 66 28 20 30 3d 3d  Expr){.  if( 0==
7740: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
7750: 73 74 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a  stant(pExpr) ){.
7760: 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d      if( IN_RENAM
7770: 45 5f 4f 42 4a 45 43 54 20 29 20 73 71 6c 69 74  E_OBJECT ) sqlit
7780: 65 33 52 65 6e 61 6d 65 45 78 70 72 55 6e 6d 61  e3RenameExprUnma
7790: 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  p(pParse, pExpr)
77a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
77b0: 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
77c0: 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  db, pExpr);.    
77d0: 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
77e0: 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d  xprAlloc(pParse-
77f0: 3e 64 62 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c  >db, TK_NULL, 0,
7800: 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
7810: 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pExpr;.}../*.*
7820: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72  * Allocate and r
7830: 65 74 75 72 6e 20 61 20 6e 65 77 20 57 69 6e 64  eturn a new Wind
7840: 6f 77 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69  ow object descri
7850: 62 69 6e 67 20 61 20 57 69 6e 64 6f 77 20 44 65  bing a Window De
7860: 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 57 69 6e  finition..*/.Win
7870: 64 6f 77 20 2a 73 71 6c 69 74 65 33 57 69 6e 64  dow *sqlite3Wind
7880: 6f 77 41 6c 6c 6f 63 28 0a 20 20 50 61 72 73 65  owAlloc(.  Parse
7890: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
78a0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
78b0: 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 2c 20  */.  int eType, 
78c0: 20 20 20 20 20 20 20 2f 2a 20 46 72 61 6d 65 20         /* Frame 
78d0: 74 79 70 65 2e 20 54 4b 5f 52 41 4e 47 45 20 6f  type. TK_RANGE o
78e0: 72 20 54 4b 5f 52 4f 57 53 20 2a 2f 0a 20 20 69  r TK_ROWS */.  i
78f0: 6e 74 20 65 53 74 61 72 74 2c 20 20 20 20 20 20  nt eStart,      
7900: 20 2f 2a 20 53 74 61 72 74 20 74 79 70 65 3a 20   /* Start type: 
7910: 43 55 52 52 45 4e 54 2c 20 50 52 45 43 45 44 49  CURRENT, PRECEDI
7920: 4e 47 2c 20 46 4f 4c 4c 4f 57 49 4e 47 2c 20 55  NG, FOLLOWING, U
7930: 4e 42 4f 55 4e 44 45 44 20 2a 2f 0a 20 20 45 78  NBOUNDED */.  Ex
7940: 70 72 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20  pr *pStart,     
7950: 2f 2a 20 53 74 61 72 74 20 77 69 6e 64 6f 77 20  /* Start window 
7960: 73 69 7a 65 20 69 66 20 54 4b 5f 50 52 45 43 45  size if TK_PRECE
7970: 44 49 4e 47 20 6f 72 20 46 4f 4c 4c 4f 57 49 4e  DING or FOLLOWIN
7980: 47 20 2a 2f 0a 20 20 69 6e 74 20 65 45 6e 64 2c  G */.  int eEnd,
7990: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20           /* End 
79a0: 74 79 70 65 3a 20 43 55 52 52 45 4e 54 2c 20 46  type: CURRENT, F
79b0: 4f 4c 4c 4f 57 49 4e 47 2c 20 54 4b 5f 55 4e 42  OLLOWING, TK_UNB
79c0: 4f 55 4e 44 45 44 2c 20 50 52 45 43 45 44 49 4e  OUNDED, PRECEDIN
79d0: 47 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 6e  G */.  Expr *pEn
79e0: 64 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20  d        /* End 
79f0: 77 69 6e 64 6f 77 20 73 69 7a 65 20 69 66 20 54  window size if T
7a00: 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 6f 72 20 50  K_FOLLOWING or P
7a10: 52 45 43 45 44 49 4e 47 20 2a 2f 0a 29 7b 0a 20  RECEDING */.){. 
7a20: 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 20 3d 20   Window *pWin = 
7a30: 30 3b 0a 20 20 69 6e 74 20 62 49 6d 70 6c 69 63  0;.  int bImplic
7a40: 69 74 46 72 61 6d 65 20 3d 20 30 3b 0a 0a 20 20  itFrame = 0;..  
7a50: 2f 2a 20 50 61 72 73 65 72 20 61 73 73 75 72 65  /* Parser assure
7a60: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
7a70: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54   */.  assert( eT
7a80: 79 70 65 3d 3d 30 20 7c 7c 20 65 54 79 70 65 3d  ype==0 || eType=
7a90: 3d 54 4b 5f 52 41 4e 47 45 20 7c 7c 20 65 54 79  =TK_RANGE || eTy
7aa0: 70 65 3d 3d 54 4b 5f 52 4f 57 53 20 7c 7c 20 65  pe==TK_ROWS || e
7ab0: 54 79 70 65 3d 3d 54 4b 5f 47 52 4f 55 50 53 20  Type==TK_GROUPS 
7ac0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 53 74  );.  assert( eSt
7ad0: 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20  art==TK_CURRENT 
7ae0: 7c 7c 20 65 53 74 61 72 74 3d 3d 54 4b 5f 50 52  || eStart==TK_PR
7af0: 45 43 45 44 49 4e 47 0a 20 20 20 20 20 20 20 20  ECEDING.        
7b00: 20 20 20 7c 7c 20 65 53 74 61 72 74 3d 3d 54 4b     || eStart==TK
7b10: 5f 55 4e 42 4f 55 4e 44 45 44 20 7c 7c 20 65 53  _UNBOUNDED || eS
7b20: 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49  tart==TK_FOLLOWI
7b30: 4e 47 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  NG );.  assert( 
7b40: 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54  eEnd==TK_CURRENT
7b50: 20 7c 7c 20 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c   || eEnd==TK_FOL
7b60: 4c 4f 57 49 4e 47 0a 20 20 20 20 20 20 20 20 20  LOWING.         
7b70: 20 20 7c 7c 20 65 45 6e 64 3d 3d 54 4b 5f 55 4e    || eEnd==TK_UN
7b80: 42 4f 55 4e 44 45 44 20 7c 7c 20 65 45 6e 64 3d  BOUNDED || eEnd=
7b90: 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 29 3b  =TK_PRECEDING );
7ba0: 0a 20 20 61 73 73 65 72 74 28 20 28 65 53 74 61  .  assert( (eSta
7bb0: 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47  rt==TK_PRECEDING
7bc0: 20 7c 7c 20 65 53 74 61 72 74 3d 3d 54 4b 5f 46   || eStart==TK_F
7bd0: 4f 4c 4c 4f 57 49 4e 47 29 3d 3d 28 70 53 74 61  OLLOWING)==(pSta
7be0: 72 74 21 3d 30 29 20 29 3b 0a 20 20 61 73 73 65  rt!=0) );.  asse
7bf0: 72 74 28 20 28 65 45 6e 64 3d 3d 54 4b 5f 46 4f  rt( (eEnd==TK_FO
7c00: 4c 4c 4f 57 49 4e 47 20 7c 7c 20 65 45 6e 64 3d  LLOWING || eEnd=
7c10: 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 29 3d 3d  =TK_PRECEDING)==
7c20: 28 70 45 6e 64 21 3d 30 29 20 29 3b 0a 0a 20 20  (pEnd!=0) );..  
7c30: 69 66 28 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a  if( eType==0 ){.
7c40: 20 20 20 20 62 49 6d 70 6c 69 63 69 74 46 72 61      bImplicitFra
7c50: 6d 65 20 3d 20 31 3b 0a 20 20 20 20 65 54 79 70  me = 1;.    eTyp
7c60: 65 20 3d 20 54 4b 5f 52 41 4e 47 45 3b 0a 20 20  e = TK_RANGE;.  
7c70: 7d 0a 0a 20 20 2f 2a 20 41 64 64 69 74 69 6f 6e  }..  /* Addition
7c80: 61 6c 6c 79 2c 20 74 68 65 0a 20 20 2a 2a 20 73  ally, the.  ** s
7c90: 74 61 72 74 69 6e 67 20 62 6f 75 6e 64 61 72 79  tarting boundary
7ca0: 20 74 79 70 65 20 6d 61 79 20 6e 6f 74 20 6f 63   type may not oc
7cb0: 63 75 72 20 65 61 72 6c 69 65 72 20 69 6e 20 74  cur earlier in t
7cc0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 69 73  he following lis
7cd0: 74 20 74 68 61 6e 0a 20 20 2a 2a 20 74 68 65 20  t than.  ** the 
7ce0: 65 6e 64 69 6e 67 20 62 6f 75 6e 64 61 72 79 20  ending boundary 
7cf0: 74 79 70 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  type:.  **.  ** 
7d00: 20 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43    UNBOUNDED PREC
7d10: 45 44 49 4e 47 0a 20 20 2a 2a 20 20 20 3c 65 78  EDING.  **   <ex
7d20: 70 72 3e 20 50 52 45 43 45 44 49 4e 47 0a 20 20  pr> PRECEDING.  
7d30: 2a 2a 20 20 20 43 55 52 52 45 4e 54 20 52 4f 57  **   CURRENT ROW
7d40: 0a 20 20 2a 2a 20 20 20 3c 65 78 70 72 3e 20 46  .  **   <expr> F
7d50: 4f 4c 4c 4f 57 49 4e 47 0a 20 20 2a 2a 20 20 20  OLLOWING.  **   
7d60: 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57  UNBOUNDED FOLLOW
7d70: 49 4e 47 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ING.  **.  ** Th
7d80: 65 20 70 61 72 73 65 72 20 65 6e 73 75 72 65 73  e parser ensures
7d90: 20 74 68 61 74 20 22 55 4e 42 4f 55 4e 44 45 44   that "UNBOUNDED
7da0: 20 50 52 45 43 45 44 49 4e 47 22 20 63 61 6e 6e   PRECEDING" cann
7db0: 6f 74 20 62 65 20 75 73 65 64 20 61 73 20 61 6e  ot be used as an
7dc0: 20 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 6f 75   ending.  ** bou
7dd0: 6e 64 61 72 79 2c 20 61 6e 64 20 74 68 61 6e 20  ndary, and than 
7de0: 22 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f  "UNBOUNDED FOLLO
7df0: 57 49 4e 47 22 20 63 61 6e 6e 6f 74 20 62 65 20  WING" cannot be 
7e00: 75 73 65 64 20 61 73 20 61 20 73 74 61 72 74 69  used as a starti
7e10: 6e 67 0a 20 20 2a 2a 20 66 72 61 6d 65 20 62 6f  ng.  ** frame bo
7e20: 75 6e 64 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69  undary..  */.  i
7e30: 66 28 20 28 65 53 74 61 72 74 3d 3d 54 4b 5f 43  f( (eStart==TK_C
7e40: 55 52 52 45 4e 54 20 26 26 20 65 45 6e 64 3d 3d  URRENT && eEnd==
7e50: 54 4b 5f 50 52 45 43 45 44 49 4e 47 29 0a 20 20  TK_PRECEDING).  
7e60: 20 7c 7c 20 28 65 53 74 61 72 74 3d 3d 54 4b 5f   || (eStart==TK_
7e70: 46 4f 4c 4c 4f 57 49 4e 47 20 26 26 20 28 65 45  FOLLOWING && (eE
7e80: 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47  nd==TK_PRECEDING
7e90: 20 7c 7c 20 65 45 6e 64 3d 3d 54 4b 5f 43 55 52   || eEnd==TK_CUR
7ea0: 52 45 4e 54 29 29 0a 20 20 29 7b 0a 20 20 20 20  RENT)).  ){.    
7eb0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
7ec0: 70 50 61 72 73 65 2c 20 22 75 6e 73 75 70 70 6f  pParse, "unsuppo
7ed0: 72 74 65 64 20 66 72 61 6d 65 20 73 70 65 63 69  rted frame speci
7ee0: 66 69 63 61 74 69 6f 6e 22 29 3b 0a 20 20 20 20  fication");.    
7ef0: 67 6f 74 6f 20 77 69 6e 64 6f 77 41 6c 6c 6f 63  goto windowAlloc
7f00: 45 72 72 3b 0a 20 20 7d 0a 0a 20 20 70 57 69 6e  Err;.  }..  pWin
7f10: 20 3d 20 28 57 69 6e 64 6f 77 2a 29 73 71 6c 69   = (Window*)sqli
7f20: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
7f30: 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65  pParse->db, size
7f40: 6f 66 28 57 69 6e 64 6f 77 29 29 3b 0a 20 20 69  of(Window));.  i
7f50: 66 28 20 70 57 69 6e 3d 3d 30 20 29 20 67 6f 74  f( pWin==0 ) got
7f60: 6f 20 77 69 6e 64 6f 77 41 6c 6c 6f 63 45 72 72  o windowAllocErr
7f70: 3b 0a 20 20 70 57 69 6e 2d 3e 65 54 79 70 65 20  ;.  pWin->eType 
7f80: 3d 20 65 54 79 70 65 3b 0a 20 20 70 57 69 6e 2d  = eType;.  pWin-
7f90: 3e 65 53 74 61 72 74 20 3d 20 65 53 74 61 72 74  >eStart = eStart
7fa0: 3b 0a 20 20 70 57 69 6e 2d 3e 65 45 6e 64 20 3d  ;.  pWin->eEnd =
7fb0: 20 65 45 6e 64 3b 0a 20 20 70 57 69 6e 2d 3e 62   eEnd;.  pWin->b
7fc0: 49 6d 70 6c 69 63 69 74 46 72 61 6d 65 20 3d 20  ImplicitFrame = 
7fd0: 62 49 6d 70 6c 69 63 69 74 46 72 61 6d 65 3b 0a  bImplicitFrame;.
7fe0: 20 20 70 57 69 6e 2d 3e 70 45 6e 64 20 3d 20 73    pWin->pEnd = s
7ff0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 4f 66 66 73  qlite3WindowOffs
8000: 65 74 45 78 70 72 28 70 50 61 72 73 65 2c 20 70  etExpr(pParse, p
8010: 45 6e 64 29 3b 0a 20 20 70 57 69 6e 2d 3e 70 53  End);.  pWin->pS
8020: 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 57 69  tart = sqlite3Wi
8030: 6e 64 6f 77 4f 66 66 73 65 74 45 78 70 72 28 70  ndowOffsetExpr(p
8040: 50 61 72 73 65 2c 20 70 53 74 61 72 74 29 3b 0a  Parse, pStart);.
8050: 20 20 72 65 74 75 72 6e 20 70 57 69 6e 3b 0a 0a    return pWin;..
8060: 77 69 6e 64 6f 77 41 6c 6c 6f 63 45 72 72 3a 0a  windowAllocErr:.
8070: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
8080: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
8090: 70 45 6e 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  pEnd);.  sqlite3
80a0: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
80b0: 65 2d 3e 64 62 2c 20 70 53 74 61 72 74 29 3b 0a  e->db, pStart);.
80c0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
80d0: 2a 0a 2a 2a 20 41 74 74 61 63 68 20 50 41 52 54  *.** Attach PART
80e0: 49 54 49 4f 4e 20 61 6e 64 20 4f 52 44 45 52 20  ITION and ORDER 
80f0: 42 59 20 63 6c 61 75 73 65 73 20 70 50 61 72 74  BY clauses pPart
8100: 69 74 69 6f 6e 20 61 6e 64 20 70 4f 72 64 65 72  ition and pOrder
8110: 42 79 20 74 6f 20 77 69 6e 64 6f 77 0a 2a 2a 20  By to window.** 
8120: 70 57 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 70  pWin. Also, if p
8130: 61 72 61 6d 65 74 65 72 20 70 42 61 73 65 20 69  arameter pBase i
8140: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 65 74 20  s not NULL, set 
8150: 70 57 69 6e 2d 3e 7a 42 61 73 65 20 74 6f 20 74  pWin->zBase to t
8160: 68 65 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74  he.** equivalent
8170: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
8180: 73 74 72 69 6e 67 2e 0a 2a 2f 0a 57 69 6e 64 6f  string..*/.Windo
8190: 77 20 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  w *sqlite3Window
81a0: 41 73 73 65 6d 62 6c 65 28 0a 20 20 50 61 72 73  Assemble(.  Pars
81b0: 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 57 69  e *pParse, .  Wi
81c0: 6e 64 6f 77 20 2a 70 57 69 6e 2c 20 0a 20 20 45  ndow *pWin, .  E
81d0: 78 70 72 4c 69 73 74 20 2a 70 50 61 72 74 69 74  xprList *pPartit
81e0: 69 6f 6e 2c 20 0a 20 20 45 78 70 72 4c 69 73 74  ion, .  ExprList
81f0: 20 2a 70 4f 72 64 65 72 42 79 2c 20 0a 20 20 54   *pOrderBy, .  T
8200: 6f 6b 65 6e 20 2a 70 42 61 73 65 0a 29 7b 0a 20  oken *pBase.){. 
8210: 20 69 66 28 20 70 57 69 6e 20 29 7b 0a 20 20 20   if( pWin ){.   
8220: 20 70 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f   pWin->pPartitio
8230: 6e 20 3d 20 70 50 61 72 74 69 74 69 6f 6e 3b 0a  n = pPartition;.
8240: 20 20 20 20 70 57 69 6e 2d 3e 70 4f 72 64 65 72      pWin->pOrder
8250: 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
8260: 20 20 20 69 66 28 20 70 42 61 73 65 20 29 7b 0a     if( pBase ){.
8270: 20 20 20 20 20 20 70 57 69 6e 2d 3e 7a 42 61 73        pWin->zBas
8280: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
8290: 4e 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  NDup(pParse->db,
82a0: 20 70 42 61 73 65 2d 3e 7a 2c 20 70 42 61 73 65   pBase->z, pBase
82b0: 2d 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ->n);.    }.  }e
82c0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
82d0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
82e0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 50 61 72 74  Parse->db, pPart
82f0: 69 74 69 6f 6e 29 3b 0a 20 20 20 20 73 71 6c 69  ition);.    sqli
8300: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
8310: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f  e(pParse->db, pO
8320: 72 64 65 72 42 79 29 3b 0a 20 20 7d 0a 20 20 72  rderBy);.  }.  r
8330: 65 74 75 72 6e 20 70 57 69 6e 3b 0a 7d 0a 0a 2f  eturn pWin;.}../
8340: 2a 0a 2a 2a 20 57 69 6e 64 6f 77 20 2a 70 57 69  *.** Window *pWi
8350: 6e 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  n has just been 
8360: 63 72 65 61 74 65 64 20 66 72 6f 6d 20 61 20 57  created from a W
8370: 49 4e 44 4f 57 20 63 6c 61 75 73 65 2e 20 54 6f  INDOW clause. To
8380: 6b 6e 65 20 70 42 61 73 65 0a 2a 2a 20 69 73 20  kne pBase.** is 
8390: 74 68 65 20 62 61 73 65 20 77 69 6e 64 6f 77 2e  the base window.
83a0: 20 45 61 72 6c 69 65 72 20 77 69 6e 64 6f 77 73   Earlier windows
83b0: 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 20 57   from the same W
83c0: 49 4e 44 4f 57 20 63 6c 61 75 73 65 20 61 72 65  INDOW clause are
83d0: 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68  .** stored in th
83e0: 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74  e linked list st
83f0: 61 72 74 69 6e 67 20 61 74 20 70 57 69 6e 2d 3e  arting at pWin->
8400: 70 4e 65 78 74 57 69 6e 2e 20 54 68 69 73 20 66  pNextWin. This f
8410: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 65 69 74 68 65  unction.** eithe
8420: 72 20 75 70 64 61 74 65 73 20 2a 70 57 69 6e 20  r updates *pWin 
8430: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
8440: 20 62 61 73 65 20 73 70 65 63 69 66 69 63 61 74   base specificat
8450: 69 6f 6e 2c 20 6f 72 20 65 6c 73 65 0a 2a 2a 20  ion, or else.** 
8460: 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72 20  leaves an error 
8470: 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f  in pParse..*/.vo
8480: 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  id sqlite3Window
8490: 43 68 61 69 6e 28 50 61 72 73 65 20 2a 70 50 61  Chain(Parse *pPa
84a0: 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70 57 69  rse, Window *pWi
84b0: 6e 2c 20 57 69 6e 64 6f 77 20 2a 70 4c 69 73 74  n, Window *pList
84c0: 29 7b 0a 20 20 69 66 28 20 70 57 69 6e 2d 3e 7a  ){.  if( pWin->z
84d0: 42 61 73 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Base ){.    sqli
84e0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
84f0: 2d 3e 64 62 3b 0a 20 20 20 20 57 69 6e 64 6f 77  ->db;.    Window
8500: 20 2a 70 45 78 69 73 74 20 3d 20 77 69 6e 64 6f   *pExist = windo
8510: 77 46 69 6e 64 28 70 50 61 72 73 65 2c 20 70 4c  wFind(pParse, pL
8520: 69 73 74 2c 20 70 57 69 6e 2d 3e 7a 42 61 73 65  ist, pWin->zBase
8530: 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78 69 73  );.    if( pExis
8540: 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  t ){.      const
8550: 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b   char *zErr = 0;
8560: 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
8570: 66 6f 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  for errors */.  
8580: 20 20 20 20 69 66 28 20 70 57 69 6e 2d 3e 70 50      if( pWin->pP
8590: 61 72 74 69 74 69 6f 6e 20 29 7b 0a 20 20 20 20  artition ){.    
85a0: 20 20 20 20 7a 45 72 72 20 3d 20 22 50 41 52 54      zErr = "PART
85b0: 49 54 49 4f 4e 20 63 6c 61 75 73 65 22 3b 0a 20  ITION clause";. 
85c0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
85d0: 45 78 69 73 74 2d 3e 70 4f 72 64 65 72 42 79 20  Exist->pOrderBy 
85e0: 26 26 20 70 57 69 6e 2d 3e 70 4f 72 64 65 72 42  && pWin->pOrderB
85f0: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 72  y ){.        zEr
8600: 72 20 3d 20 22 4f 52 44 45 52 20 42 59 20 63 6c  r = "ORDER BY cl
8610: 61 75 73 65 22 3b 0a 20 20 20 20 20 20 7d 65 6c  ause";.      }el
8620: 73 65 20 69 66 28 20 70 45 78 69 73 74 2d 3e 62  se if( pExist->b
8630: 49 6d 70 6c 69 63 69 74 46 72 61 6d 65 3d 3d 30  ImplicitFrame==0
8640: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 72 72   ){.        zErr
8650: 20 3d 20 22 66 72 61 6d 65 20 73 70 65 63 69 66   = "frame specif
8660: 69 63 61 74 69 6f 6e 22 3b 0a 20 20 20 20 20 20  ication";.      
8670: 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 45 72 72  }.      if( zErr
8680: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
8690: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
86a0: 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
86b0: 20 22 63 61 6e 6e 6f 74 20 6f 76 65 72 72 69 64   "cannot overrid
86c0: 65 20 25 73 20 6f 66 20 77 69 6e 64 6f 77 3a 20  e %s of window: 
86d0: 25 73 22 2c 20 7a 45 72 72 2c 20 70 57 69 6e 2d  %s", zErr, pWin-
86e0: 3e 7a 42 61 73 65 0a 20 20 20 20 20 20 20 20 29  >zBase.        )
86f0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
8700: 20 20 20 20 20 20 20 70 57 69 6e 2d 3e 70 50 61         pWin->pPa
8710: 72 74 69 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65  rtition = sqlite
8720: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
8730: 20 70 45 78 69 73 74 2d 3e 70 50 61 72 74 69 74   pExist->pPartit
8740: 69 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ion, 0);.       
8750: 20 69 66 28 20 70 45 78 69 73 74 2d 3e 70 4f 72   if( pExist->pOr
8760: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
8770: 20 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 2d     assert( pWin-
8780: 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
8790: 20 20 20 20 20 20 20 20 20 20 70 57 69 6e 2d 3e            pWin->
87a0: 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74  pOrderBy = sqlit
87b0: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
87c0: 2c 20 70 45 78 69 73 74 2d 3e 70 4f 72 64 65 72  , pExist->pOrder
87d0: 42 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  By, 0);.        
87e0: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
87f0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 69 6e  3DbFree(db, pWin
8800: 2d 3e 7a 42 61 73 65 29 3b 0a 20 20 20 20 20 20  ->zBase);.      
8810: 20 20 70 57 69 6e 2d 3e 7a 42 61 73 65 20 3d 20    pWin->zBase = 
8820: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
8830: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  .  }.}../*.** At
8840: 74 61 63 68 20 77 69 6e 64 6f 77 20 6f 62 6a 65  tach window obje
8850: 63 74 20 70 57 69 6e 20 74 6f 20 65 78 70 72 65  ct pWin to expre
8860: 73 73 69 6f 6e 20 70 2e 0a 2a 2f 0a 76 6f 69 64  ssion p..*/.void
8870: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 41 74   sqlite3WindowAt
8880: 74 61 63 68 28 50 61 72 73 65 20 2a 70 50 61 72  tach(Parse *pPar
8890: 73 65 2c 20 45 78 70 72 20 2a 70 2c 20 57 69 6e  se, Expr *p, Win
88a0: 64 6f 77 20 2a 70 57 69 6e 29 7b 0a 20 20 69 66  dow *pWin){.  if
88b0: 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ( p ){.    asser
88c0: 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e  t( p->op==TK_FUN
88d0: 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 2f 2a 20  CTION );.    /* 
88e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
88f0: 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20  only called for 
8900: 74 68 65 20 70 61 72 73 65 72 2e 20 20 49 66 20  the parser.  If 
8910: 70 57 69 6e 20 77 61 73 20 6e 6f 74 0a 20 20 20  pWin was not.   
8920: 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 64 75   ** allocated du
8930: 65 20 74 6f 20 61 6e 20 4f 4f 4d 2c 20 74 68 65  e to an OOM, the
8940: 6e 20 74 68 65 20 70 61 72 73 65 72 20 77 6f 75  n the parser wou
8950: 6c 64 20 66 61 69 6c 20 62 65 66 6f 72 65 20 65  ld fail before e
8960: 76 65 72 0a 20 20 20 20 2a 2a 20 69 6e 76 6f 6b  ver.    ** invok
8970: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
8980: 20 2a 2f 0a 20 20 20 20 69 66 28 20 41 4c 57 41   */.    if( ALWA
8990: 59 53 28 70 57 69 6e 29 20 29 7b 0a 20 20 20 20  YS(pWin) ){.    
89a0: 20 20 70 2d 3e 79 2e 70 57 69 6e 20 3d 20 70 57    p->y.pWin = pW
89b0: 69 6e 3b 0a 20 20 20 20 20 20 45 78 70 72 53 65  in;.      ExprSe
89c0: 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  tProperty(p, EP_
89d0: 57 69 6e 46 75 6e 63 29 3b 0a 20 20 20 20 20 20  WinFunc);.      
89e0: 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 20 3d 20 70  pWin->pOwner = p
89f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66  ;.      if( p->f
8a00: 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e  lags & EP_Distin
8a10: 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ct ){.        sq
8a20: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8a30: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
8a40: 20 22 44 49 53 54 49 4e 43 54 20 69 73 20 6e 6f   "DISTINCT is no
8a50: 74 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20  t supported for 
8a60: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73  window functions
8a70: 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
8a80: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  }.  }else{.    s
8a90: 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65  qlite3WindowDele
8aa0: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
8ab0: 57 69 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Win);.  }.}../*.
8ac0: 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 74  ** Return 0 if t
8ad0: 68 65 20 74 77 6f 20 77 69 6e 64 6f 77 20 6f 62  he two window ob
8ae0: 6a 65 63 74 73 20 61 72 65 20 69 64 65 6e 74 69  jects are identi
8af0: 63 61 6c 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  cal, or non-zero
8b00: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 20 49   otherwise..** I
8b10: 64 65 6e 74 69 63 61 6c 20 77 69 6e 64 6f 77 20  dentical window 
8b20: 6f 62 6a 65 63 74 73 20 63 61 6e 20 62 65 20 70  objects can be p
8b30: 72 6f 63 65 73 73 65 64 20 69 6e 20 61 20 73 69  rocessed in a si
8b40: 6e 67 6c 65 20 73 63 61 6e 2e 0a 2a 2f 0a 69 6e  ngle scan..*/.in
8b50: 74 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43  t sqlite3WindowC
8b60: 6f 6d 70 61 72 65 28 50 61 72 73 65 20 2a 70 50  ompare(Parse *pP
8b70: 61 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70 31  arse, Window *p1
8b80: 2c 20 57 69 6e 64 6f 77 20 2a 70 32 29 7b 0a 20  , Window *p2){. 
8b90: 20 69 66 28 20 70 31 2d 3e 65 54 79 70 65 21 3d   if( p1->eType!=
8ba0: 70 32 2d 3e 65 54 79 70 65 20 29 20 72 65 74 75  p2->eType ) retu
8bb0: 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 31 2d 3e  rn 1;.  if( p1->
8bc0: 65 53 74 61 72 74 21 3d 70 32 2d 3e 65 53 74 61  eStart!=p2->eSta
8bd0: 72 74 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  rt ) return 1;. 
8be0: 20 69 66 28 20 70 31 2d 3e 65 45 6e 64 21 3d 70   if( p1->eEnd!=p
8bf0: 32 2d 3e 65 45 6e 64 20 29 20 72 65 74 75 72 6e  2->eEnd ) return
8c00: 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   1;.  if( sqlite
8c10: 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61  3ExprCompare(pPa
8c20: 72 73 65 2c 20 70 31 2d 3e 70 53 74 61 72 74 2c  rse, p1->pStart,
8c30: 20 70 32 2d 3e 70 53 74 61 72 74 2c 20 2d 31 29   p2->pStart, -1)
8c40: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
8c50: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
8c60: 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 31  mpare(pParse, p1
8c70: 2d 3e 70 45 6e 64 2c 20 70 32 2d 3e 70 45 6e 64  ->pEnd, p2->pEnd
8c80: 2c 20 2d 31 29 20 29 20 72 65 74 75 72 6e 20 31  , -1) ) return 1
8c90: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  ;.  if( sqlite3E
8ca0: 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70  xprListCompare(p
8cb0: 31 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20 70  1->pPartition, p
8cc0: 32 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20 2d  2->pPartition, -
8cd0: 31 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  1) ) return 1;. 
8ce0: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
8cf0: 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 31 2d 3e  ListCompare(p1->
8d00: 70 4f 72 64 65 72 42 79 2c 20 70 32 2d 3e 70 4f  pOrderBy, p2->pO
8d10: 72 64 65 72 42 79 2c 20 2d 31 29 20 29 20 72 65  rderBy, -1) ) re
8d20: 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e  turn 1;.  return
8d30: 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68   0;.}.../*.** Th
8d40: 69 73 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  is is called by 
8d50: 63 6f 64 65 20 69 6e 20 73 65 6c 65 63 74 2e 63  code in select.c
8d60: 20 62 65 66 6f 72 65 20 69 74 20 63 61 6c 6c 73   before it calls
8d70: 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
8d80: 69 6e 28 29 0a 2a 2a 20 74 6f 20 62 65 67 69 6e  in().** to begin
8d90: 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75   iterating throu
8da0: 67 68 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  gh the sub-query
8db0: 20 72 65 73 75 6c 74 73 2e 20 49 74 20 69 73 20   results. It is 
8dc0: 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  used to allocate
8dd0: 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  .** and initiali
8de0: 7a 65 20 72 65 67 69 73 74 65 72 73 20 61 6e 64  ze registers and
8df0: 20 63 75 72 73 6f 72 73 20 75 73 65 64 20 62 79   cursors used by
8e00: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f   sqlite3WindowCo
8e10: 64 65 53 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69  deStep()..*/.voi
8e20: 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43  d sqlite3WindowC
8e30: 6f 64 65 49 6e 69 74 28 50 61 72 73 65 20 2a 70  odeInit(Parse *p
8e40: 50 61 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70  Parse, Window *p
8e50: 4d 57 69 6e 29 7b 0a 20 20 57 69 6e 64 6f 77 20  MWin){.  Window 
8e60: 2a 70 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76  *pWin;.  Vdbe *v
8e70: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
8e80: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  e(pParse);.  int
8e90: 20 6e 50 61 72 74 20 3d 20 28 70 4d 57 69 6e 2d   nPart = (pMWin-
8ea0: 3e 70 50 61 72 74 69 74 69 6f 6e 20 3f 20 70 4d  >pPartition ? pM
8eb0: 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2d  Win->pPartition-
8ec0: 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 6e  >nExpr : 0);.  n
8ed0: 50 61 72 74 20 2b 3d 20 28 70 4d 57 69 6e 2d 3e  Part += (pMWin->
8ee0: 70 4f 72 64 65 72 42 79 20 3f 20 70 4d 57 69 6e  pOrderBy ? pMWin
8ef0: 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
8f00: 72 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 6e 50  r : 0);.  if( nP
8f10: 61 72 74 20 29 7b 0a 20 20 20 20 70 4d 57 69 6e  art ){.    pMWin
8f20: 2d 3e 72 65 67 50 61 72 74 20 3d 20 70 50 61 72  ->regPart = pPar
8f30: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
8f40: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
8f50: 6e 50 61 72 74 3b 0a 20 20 20 20 73 71 6c 69 74  nPart;.    sqlit
8f60: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
8f70: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 4d 57 69  OP_Null, 0, pMWi
8f80: 6e 2d 3e 72 65 67 50 61 72 74 2c 20 70 4d 57 69  n->regPart, pMWi
8f90: 6e 2d 3e 72 65 67 50 61 72 74 2b 6e 50 61 72 74  n->regPart+nPart
8fa0: 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 70 4d 57 69  -1);.  }..  pMWi
8fb0: 6e 2d 3e 72 65 67 46 69 72 73 74 20 3d 20 2b 2b  n->regFirst = ++
8fc0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
8fd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8fe0: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
8ff0: 20 31 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 46 69   1, pMWin->regFi
9000: 72 73 74 29 3b 0a 0a 20 20 66 6f 72 28 70 57 69  rst);..  for(pWi
9010: 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70  n=pMWin; pWin; p
9020: 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57  Win=pWin->pNextW
9030: 69 6e 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66  in){.    FuncDef
9040: 20 2a 70 20 3d 20 70 57 69 6e 2d 3e 70 46 75 6e   *p = pWin->pFun
9050: 63 3b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 66  c;.    if( (p->f
9060: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
9070: 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 20 26  E_FUNC_MINMAX) &
9080: 26 20 70 57 69 6e 2d 3e 65 53 74 61 72 74 21 3d  & pWin->eStart!=
9090: 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a  TK_UNBOUNDED ){.
90a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6c        /* The inl
90b0: 69 6e 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ine versions of 
90c0: 6d 69 6e 28 29 20 61 6e 64 20 6d 61 78 28 29 20  min() and max() 
90d0: 72 65 71 75 69 72 65 20 61 20 73 69 6e 67 6c 65  require a single
90e0: 20 65 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 20   ephemeral.     
90f0: 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 33 20   ** table and 3 
9100: 72 65 67 69 73 74 65 72 73 2e 20 54 68 65 20 72  registers. The r
9110: 65 67 69 73 74 65 72 73 20 61 72 65 20 75 73 65  egisters are use
9120: 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  d as follows:.  
9130: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
9140: 20 20 72 65 67 41 70 70 2b 30 3a 20 73 6c 6f 74    regApp+0: slot
9150: 20 74 6f 20 63 6f 70 79 20 6d 69 6e 28 29 2f 6d   to copy min()/m
9160: 61 78 28 29 20 61 72 67 75 6d 65 6e 74 20 74 6f  ax() argument to
9170: 20 66 6f 72 20 4d 61 6b 65 52 65 63 6f 72 64 0a   for MakeRecord.
9180: 20 20 20 20 20 20 2a 2a 20 20 20 72 65 67 41 70        **   regAp
9190: 70 2b 31 3a 20 69 6e 74 65 67 65 72 20 76 61 6c  p+1: integer val
91a0: 75 65 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72  ue used to ensur
91b0: 65 20 6b 65 79 73 20 61 72 65 20 75 6e 69 71 75  e keys are uniqu
91c0: 65 0a 20 20 20 20 20 20 2a 2a 20 20 20 72 65 67  e.      **   reg
91d0: 41 70 70 2b 32 3a 20 6f 75 74 70 75 74 20 6f 66  App+2: output of
91e0: 20 4d 61 6b 65 52 65 63 6f 72 64 0a 20 20 20 20   MakeRecord.    
91f0: 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c    */.      ExprL
9200: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 57 69  ist *pList = pWi
9210: 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69  n->pOwner->x.pLi
9220: 73 74 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66  st;.      KeyInf
9230: 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71  o *pKeyInfo = sq
9240: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d  lite3KeyInfoFrom
9250: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
9260: 20 70 4c 69 73 74 2c 20 30 2c 20 30 29 3b 0a 20   pList, 0, 0);. 
9270: 20 20 20 20 20 70 57 69 6e 2d 3e 63 73 72 41 70       pWin->csrAp
9280: 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  p = pParse->nTab
9290: 2b 2b 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e  ++;.      pWin->
92a0: 72 65 67 41 70 70 20 3d 20 70 50 61 72 73 65 2d  regApp = pParse-
92b0: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 70  >nMem+1;.      p
92c0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 33  Parse->nMem += 3
92d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79  ;.      if( pKey
92e0: 49 6e 66 6f 20 26 26 20 70 57 69 6e 2d 3e 70 46  Info && pWin->pF
92f0: 75 6e 63 2d 3e 7a 4e 61 6d 65 5b 31 5d 3d 3d 27  unc->zName[1]=='
9300: 69 27 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  i' ){.        as
9310: 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  sert( pKeyInfo->
9320: 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 3d 3d 30  aSortOrder[0]==0
9330: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79   );.        pKey
9340: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
9350: 5b 30 5d 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  [0] = 1;.      }
9360: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
9370: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
9380: 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 57  penEphemeral, pW
9390: 69 6e 2d 3e 63 73 72 41 70 70 2c 20 32 29 3b 0a  in->csrApp, 2);.
93a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
93b0: 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 4b 65  eAppendP4(v, pKe
93c0: 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
93d0: 4f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  O);.      sqlite
93e0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
93f0: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 57  P_Integer, 0, pW
9400: 69 6e 2d 3e 72 65 67 41 70 70 2b 31 29 3b 0a 20  in->regApp+1);. 
9410: 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66     }.    else if
9420: 28 20 70 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f  ( p->zName==nth_
9430: 76 61 6c 75 65 4e 61 6d 65 20 7c 7c 20 70 2d 3e  valueName || p->
9440: 7a 4e 61 6d 65 3d 3d 66 69 72 73 74 5f 76 61 6c  zName==first_val
9450: 75 65 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  ueName ){.      
9460: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 77 6f 20  /* Allocate two 
9470: 72 65 67 69 73 74 65 72 73 20 61 74 20 70 57 69  registers at pWi
9480: 6e 2d 3e 72 65 67 41 70 70 2e 20 54 68 65 73 65  n->regApp. These
9490: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
94a0: 0a 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 20  .      ** store 
94b0: 74 68 65 20 73 74 61 72 74 20 61 6e 64 20 65 6e  the start and en
94c0: 64 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63  d index of the c
94d0: 75 72 72 65 6e 74 20 66 72 61 6d 65 2e 20 20 2a  urrent frame.  *
94e0: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
94f0: 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 20 29  pMWin->iEphCsr )
9500: 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 72 65  ;.      pWin->re
9510: 67 41 70 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e  gApp = pParse->n
9520: 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 70 57 69  Mem+1;.      pWi
9530: 6e 2d 3e 63 73 72 41 70 70 20 3d 20 70 50 61 72  n->csrApp = pPar
9540: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
9550: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
9560: 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 2;.      sqlit
9570: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
9580: 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70 57 69 6e  OP_OpenDup, pWin
9590: 2d 3e 63 73 72 41 70 70 2c 20 70 4d 57 69 6e 2d  ->csrApp, pMWin-
95a0: 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 20 20 7d  >iEphCsr);.    }
95b0: 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 2d  .    else if( p-
95c0: 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65  >zName==leadName
95d0: 20 7c 7c 20 70 2d 3e 7a 4e 61 6d 65 3d 3d 6c 61   || p->zName==la
95e0: 67 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 61  gName ){.      a
95f0: 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 69 45  ssert( pMWin->iE
9600: 70 68 43 73 72 20 29 3b 0a 20 20 20 20 20 20 70  phCsr );.      p
9610: 57 69 6e 2d 3e 63 73 72 41 70 70 20 3d 20 70 50  Win->csrApp = pP
9620: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
9630: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9640: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
9650: 44 75 70 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70  Dup, pWin->csrAp
9660: 70 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  p, pMWin->iEphCs
9670: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  r);.    }.  }.}.
9680: 0a 23 64 65 66 69 6e 65 20 57 49 4e 44 4f 57 5f  .#define WINDOW_
9690: 53 54 41 52 54 49 4e 47 5f 49 4e 54 20 20 30 0a  STARTING_INT  0.
96a0: 23 64 65 66 69 6e 65 20 57 49 4e 44 4f 57 5f 45  #define WINDOW_E
96b0: 4e 44 49 4e 47 5f 49 4e 54 20 20 20 20 31 0a 23  NDING_INT    1.#
96c0: 64 65 66 69 6e 65 20 57 49 4e 44 4f 57 5f 4e 54  define WINDOW_NT
96d0: 48 5f 56 41 4c 55 45 5f 49 4e 54 20 32 0a 23 64  H_VALUE_INT 2.#d
96e0: 65 66 69 6e 65 20 57 49 4e 44 4f 57 5f 53 54 41  efine WINDOW_STA
96f0: 52 54 49 4e 47 5f 4e 55 4d 20 20 33 0a 23 64 65  RTING_NUM  3.#de
9700: 66 69 6e 65 20 57 49 4e 44 4f 57 5f 45 4e 44 49  fine WINDOW_ENDI
9710: 4e 47 5f 4e 55 4d 20 20 20 20 34 0a 0a 2f 2a 0a  NG_NUM    4../*.
9720: 2a 2a 20 41 20 22 50 52 45 43 45 44 49 4e 47 20  ** A "PRECEDING 
9730: 3c 65 78 70 72 3e 22 20 28 65 43 6f 6e 64 3d 3d  <expr>" (eCond==
9740: 30 29 20 6f 72 20 22 46 4f 4c 4c 4f 57 49 4e 47  0) or "FOLLOWING
9750: 20 3c 65 78 70 72 3e 22 20 28 65 43 6f 6e 64 3d   <expr>" (eCond=
9760: 3d 31 29 20 6f 72 20 74 68 65 0a 2a 2a 20 76 61  =1) or the.** va
9770: 6c 75 65 20 6f 66 20 74 68 65 20 73 65 63 6f 6e  lue of the secon
9780: 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6e 74  d argument to nt
9790: 68 5f 76 61 6c 75 65 28 29 20 28 65 43 6f 6e 64  h_value() (eCond
97a0: 3d 3d 32 29 20 68 61 73 20 6a 75 73 74 20 62 65  ==2) has just be
97b0: 65 6e 0a 2a 2a 20 65 76 61 6c 75 61 74 65 64 20  en.** evaluated 
97c0: 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 20 6c  and the result l
97d0: 65 66 74 20 69 6e 20 72 65 67 69 73 74 65 72 20  eft in register 
97e0: 72 65 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69  reg. This functi
97f0: 6f 6e 20 67 65 6e 65 72 61 74 65 73 20 56 4d 0a  on generates VM.
9800: 2a 2a 20 63 6f 64 65 20 74 6f 20 63 68 65 63 6b  ** code to check
9810: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20   that the value 
9820: 69 73 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  is a non-negativ
9830: 65 20 69 6e 74 65 67 65 72 20 61 6e 64 20 74 68  e integer and th
9840: 72 6f 77 73 20 61 6e 0a 2a 2a 20 65 78 63 65 70  rows an.** excep
9850: 74 69 6f 6e 20 69 66 20 69 74 20 69 73 20 6e 6f  tion if it is no
9860: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
9870: 64 20 77 69 6e 64 6f 77 43 68 65 63 6b 56 61 6c  d windowCheckVal
9880: 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ue(Parse *pParse
9890: 2c 20 69 6e 74 20 72 65 67 2c 20 69 6e 74 20 65  , int reg, int e
98a0: 43 6f 6e 64 29 7b 0a 20 20 73 74 61 74 69 63 20  Cond){.  static 
98b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 45 72  const char *azEr
98c0: 72 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 66 72 61  r[] = {.    "fra
98d0: 6d 65 20 73 74 61 72 74 69 6e 67 20 6f 66 66 73  me starting offs
98e0: 65 74 20 6d 75 73 74 20 62 65 20 61 20 6e 6f 6e  et must be a non
98f0: 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67 65  -negative intege
9900: 72 22 2c 0a 20 20 20 20 22 66 72 61 6d 65 20 65  r",.    "frame e
9910: 6e 64 69 6e 67 20 6f 66 66 73 65 74 20 6d 75 73  nding offset mus
9920: 74 20 62 65 20 61 20 6e 6f 6e 2d 6e 65 67 61 74  t be a non-negat
9930: 69 76 65 20 69 6e 74 65 67 65 72 22 2c 0a 20 20  ive integer",.  
9940: 20 20 22 73 65 63 6f 6e 64 20 61 72 67 75 6d 65    "second argume
9950: 6e 74 20 74 6f 20 6e 74 68 5f 76 61 6c 75 65 20  nt to nth_value 
9960: 6d 75 73 74 20 62 65 20 61 20 70 6f 73 69 74 69  must be a positi
9970: 76 65 20 69 6e 74 65 67 65 72 22 2c 0a 20 20 20  ve integer",.   
9980: 20 22 66 72 61 6d 65 20 73 74 61 72 74 69 6e 67   "frame starting
9990: 20 6f 66 66 73 65 74 20 6d 75 73 74 20 62 65 20   offset must be 
99a0: 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 6e  a non-negative n
99b0: 75 6d 62 65 72 22 2c 0a 20 20 20 20 22 66 72 61  umber",.    "fra
99c0: 6d 65 20 65 6e 64 69 6e 67 20 6f 66 66 73 65 74  me ending offset
99d0: 20 6d 75 73 74 20 62 65 20 61 20 6e 6f 6e 2d 6e   must be a non-n
99e0: 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 22 2c  egative number",
99f0: 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 69  .  };.  static i
9a00: 6e 74 20 61 4f 70 5b 5d 20 3d 20 7b 20 4f 50 5f  nt aOp[] = { OP_
9a10: 47 65 2c 20 4f 50 5f 47 65 2c 20 4f 50 5f 47 74  Ge, OP_Ge, OP_Gt
9a20: 2c 20 4f 50 5f 47 65 2c 20 4f 50 5f 47 65 20 7d  , OP_Ge, OP_Ge }
9a30: 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  ;.  Vdbe *v = sq
9a40: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
9a50: 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 65 67 5a  rse);.  int regZ
9a60: 65 72 6f 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ero = sqlite3Get
9a70: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
9a80: 0a 20 20 61 73 73 65 72 74 28 20 65 43 6f 6e 64  .  assert( eCond
9a90: 3e 3d 30 20 26 26 20 65 43 6f 6e 64 3c 41 72 72  >=0 && eCond<Arr
9aa0: 61 79 53 69 7a 65 28 61 7a 45 72 72 29 20 29 3b  aySize(azErr) );
9ab0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
9ac0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
9ad0: 65 72 2c 20 30 2c 20 72 65 67 5a 65 72 6f 29 3b  er, 0, regZero);
9ae0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
9af0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp2(v, OP_MustB
9b00: 65 49 6e 74 2c 20 72 65 67 2c 20 73 71 6c 69 74  eInt, reg, sqlit
9b10: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
9b20: 72 28 76 29 2b 32 29 3b 0a 20 20 69 66 28 20 65  r(v)+2);.  if( e
9b30: 43 6f 6e 64 3e 3d 57 49 4e 44 4f 57 5f 53 54 41  Cond>=WINDOW_STA
9b40: 52 54 49 4e 47 5f 4e 55 4d 20 29 20 73 71 6c 69  RTING_NUM ) sqli
9b50: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
9b60: 76 2c 20 31 29 3b 0a 20 20 56 64 62 65 43 6f 76  v, 1);.  VdbeCov
9b70: 65 72 61 67 65 49 66 28 76 2c 20 65 43 6f 6e 64  erageIf(v, eCond
9b80: 3d 3d 30 29 3b 0a 20 20 56 64 62 65 43 6f 76 65  ==0);.  VdbeCove
9b90: 72 61 67 65 49 66 28 76 2c 20 65 43 6f 6e 64 3d  rageIf(v, eCond=
9ba0: 3d 31 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72  =1);.  VdbeCover
9bb0: 61 67 65 49 66 28 76 2c 20 65 43 6f 6e 64 3d 3d  ageIf(v, eCond==
9bc0: 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  2);.  sqlite3Vdb
9bd0: 65 41 64 64 4f 70 33 28 76 2c 20 61 4f 70 5b 65  eAddOp3(v, aOp[e
9be0: 43 6f 6e 64 5d 2c 20 72 65 67 5a 65 72 6f 2c 20  Cond], regZero, 
9bf0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
9c00: 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 72 65 67  ntAddr(v)+2, reg
9c10: 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67  );.  VdbeCoverag
9c20: 65 4e 65 76 65 72 4e 75 6c 6c 49 66 28 76 2c 20  eNeverNullIf(v, 
9c30: 65 43 6f 6e 64 3d 3d 30 29 3b 0a 20 20 56 64 62  eCond==0);.  Vdb
9c40: 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72 4e 75  eCoverageNeverNu
9c50: 6c 6c 49 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 31  llIf(v, eCond==1
9c60: 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67  );.  VdbeCoverag
9c70: 65 4e 65 76 65 72 4e 75 6c 6c 49 66 28 76 2c 20  eNeverNullIf(v, 
9c80: 65 43 6f 6e 64 3d 3d 32 29 3b 0a 20 20 73 71 6c  eCond==2);.  sql
9c90: 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61  ite3MayAbort(pPa
9ca0: 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  rse);.  sqlite3V
9cb0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
9cc0: 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 45 52 52  Halt, SQLITE_ERR
9cd0: 4f 52 2c 20 4f 45 5f 41 62 6f 72 74 29 3b 0a 20  OR, OE_Abort);. 
9ce0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65   sqlite3VdbeAppe
9cf0: 6e 64 50 34 28 76 2c 20 28 76 6f 69 64 2a 29 61  ndP4(v, (void*)a
9d00: 7a 45 72 72 5b 65 43 6f 6e 64 5d 2c 20 50 34 5f  zErr[eCond], P4_
9d10: 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74  STATIC);.  sqlit
9d20: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
9d30: 28 70 50 61 72 73 65 2c 20 72 65 67 5a 65 72 6f  (pParse, regZero
9d40: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
9d50: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
9d60: 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65   arguments passe
9d70: 64 20 74 6f 20 74 68 65 20 77 69 6e 64 6f 77 2d  d to the window-
9d80: 66 75 6e 63 74 69 6f 6e 20 61 73 73 6f 63 69 61  function associa
9d90: 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ted.** with the 
9da0: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
9db0: 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
9dc0: 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
9dd0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
9de0: 6e 74 20 77 69 6e 64 6f 77 41 72 67 43 6f 75 6e  nt windowArgCoun
9df0: 74 28 57 69 6e 64 6f 77 20 2a 70 57 69 6e 29 7b  t(Window *pWin){
9e00: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
9e10: 73 74 20 3d 20 70 57 69 6e 2d 3e 70 4f 77 6e 65  st = pWin->pOwne
9e20: 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 72 65  r->x.pList;.  re
9e30: 74 75 72 6e 20 28 70 4c 69 73 74 20 3f 20 70 4c  turn (pList ? pL
9e40: 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b  ist->nExpr : 0);
9e50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
9e60: 74 65 20 56 4d 20 63 6f 64 65 20 74 6f 20 69 6e  te VM code to in
9e70: 76 6f 6b 65 20 65 69 74 68 65 72 20 78 53 74 65  voke either xSte
9e80: 70 28 29 20 28 69 66 20 62 49 6e 76 65 72 73 65  p() (if bInverse
9e90: 20 69 73 20 30 29 20 6f 72 20 0a 2a 2a 20 78 49   is 0) or .** xI
9ea0: 6e 76 65 72 73 65 20 28 69 66 20 62 49 6e 76 65  nverse (if bInve
9eb0: 72 73 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 29  rse is non-zero)
9ec0: 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77   for each window
9ed0: 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 74 68 65   function in the
9ee0: 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74   .** linked list
9ef0: 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 4d 57   starting at pMW
9f00: 69 6e 2e 20 4f 72 2c 20 66 6f 72 20 62 75 69 6c  in. Or, for buil
9f10: 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63  t-in window func
9f20: 74 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 64 6f  tions.** that do
9f30: 20 6e 6f 74 20 75 73 65 20 74 68 65 20 73 74 61   not use the sta
9f40: 6e 64 61 72 64 20 66 75 6e 63 74 69 6f 6e 20 41  ndard function A
9f50: 50 49 2c 20 67 65 6e 65 72 61 74 65 20 74 68 65  PI, generate the
9f60: 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 69 6e 6c   required.** inl
9f70: 69 6e 65 20 56 4d 20 63 6f 64 65 2e 0a 2a 2a 0a  ine VM code..**.
9f80: 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 63  ** If argument c
9f90: 73 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68  sr is greater th
9fa0: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 30  an or equal to 0
9fb0: 2c 20 74 68 65 6e 20 61 72 67 75 6d 65 6e 74 20  , then argument 
9fc0: 72 65 67 20 69 73 0a 2a 2a 20 74 68 65 20 66 69  reg is.** the fi
9fd0: 72 73 74 20 72 65 67 69 73 74 65 72 20 69 6e 20  rst register in 
9fe0: 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69  an array of regi
9ff0: 73 74 65 72 73 20 67 75 61 72 61 6e 74 65 65 64  sters guaranteed
a000: 20 74 6f 20 62 65 20 6c 61 72 67 65 0a 2a 2a 20   to be large.** 
a010: 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74  enough to hold t
a020: 68 65 20 61 72 72 61 79 20 6f 66 20 61 72 67 75  he array of argu
a030: 6d 65 6e 74 73 20 66 6f 72 20 65 61 63 68 20 66  ments for each f
a040: 75 6e 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73  unction. In this
a050: 20 63 61 73 65 0a 2a 2a 20 74 68 65 20 61 72 67   case.** the arg
a060: 75 6d 65 6e 74 73 20 61 72 65 20 65 78 74 72 61  uments are extra
a070: 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 63 75  cted from the cu
a080: 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 63 73 72  rrent row of csr
a090: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 61 72 72   into the.** arr
a0a0: 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ay of registers 
a0b0: 62 65 66 6f 72 65 20 69 6e 76 6f 6b 69 6e 67 20  before invoking 
a0c0: 4f 50 5f 41 67 67 53 74 65 70 20 6f 72 20 4f 50  OP_AggStep or OP
a0d0: 5f 41 67 67 49 6e 76 65 72 73 65 0a 2a 2a 0a 2a  _AggInverse.**.*
a0e0: 2a 20 4f 72 2c 20 69 66 20 63 73 72 20 69 73 20  * Or, if csr is 
a0f0: 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
a100: 74 68 65 6e 20 74 68 65 20 61 72 72 61 79 20 6f  then the array o
a110: 66 20 72 65 67 69 73 74 65 72 73 20 61 74 20 72  f registers at r
a120: 65 67 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64 79  eg is.** already
a130: 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
a140: 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d  all columns from
a150: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
a160: 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   of the sub-quer
a170: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75  y..**.** If argu
a180: 6d 65 6e 74 20 72 65 67 50 61 72 74 53 69 7a 65  ment regPartSize
a190: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
a1a0: 65 6e 20 69 74 20 69 73 20 61 20 72 65 67 69 73  en it is a regis
a1b0: 74 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ter containing t
a1c0: 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
a1d0: 72 6f 77 73 20 69 6e 20 74 68 65 20 63 75 72 72  rows in the curr
a1e0: 65 6e 74 20 70 61 72 74 69 74 69 6f 6e 2e 0a 2a  ent partition..*
a1f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
a200: 6e 64 6f 77 41 67 67 53 74 65 70 28 0a 20 20 50  ndowAggStep(.  P
a210: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20  arse *pParse, . 
a220: 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 2c 20   Window *pMWin, 
a230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a240: 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20   /* Linked list 
a250: 6f 66 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  of window functi
a260: 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 63 73 72  ons */.  int csr
a270: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
a280: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
a290: 20 61 72 67 75 6d 65 6e 74 73 20 66 72 6f 6d 20   arguments from 
a2a0: 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20  this cursor */. 
a2b0: 20 69 6e 74 20 62 49 6e 76 65 72 73 65 2c 20 20   int bInverse,  
a2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2d0: 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 76 6f   /* True to invo
a2e0: 6b 65 20 78 49 6e 76 65 72 73 65 20 69 6e 73 74  ke xInverse inst
a2f0: 65 61 64 20 6f 66 20 78 53 74 65 70 20 2a 2f 0a  ead of xStep */.
a300: 20 20 69 6e 74 20 72 65 67 2c 20 20 20 20 20 20    int reg,      
a310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a320: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 72 65    /* Array of re
a330: 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  gisters */.  int
a340: 20 72 65 67 50 61 72 74 53 69 7a 65 20 20 20 20   regPartSize    
a350: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a360: 52 65 67 69 73 74 65 72 20 63 6f 6e 74 61 69 6e  Register contain
a370: 69 6e 67 20 73 69 7a 65 20 6f 66 20 70 61 72 74  ing size of part
a380: 69 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 56 64  ition */.){.  Vd
a390: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
a3a0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
a3b0: 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a    Window *pWin;.
a3c0: 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e    for(pWin=pMWin
a3d0: 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69  ; pWin; pWin=pWi
a3e0: 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20  n->pNextWin){.  
a3f0: 20 20 69 6e 74 20 72 65 67 41 72 67 3b 0a 20 20    int regArg;.  
a400: 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 77 69 6e    int nArg = win
a410: 64 6f 77 41 72 67 43 6f 75 6e 74 28 70 57 69 6e  dowArgCount(pWin
a420: 29 3b 0a 0a 20 20 20 20 69 66 28 20 63 73 72 3e  );..    if( csr>
a430: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
a440: 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  i;.      for(i=0
a450: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
a460: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
a470: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
a480: 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20 70 57 69  Column, csr, pWi
a490: 6e 2d 3e 69 41 72 67 43 6f 6c 2b 69 2c 20 72 65  n->iArgCol+i, re
a4a0: 67 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  g+i);.      }.  
a4b0: 20 20 20 20 72 65 67 41 72 67 20 3d 20 72 65 67      regArg = reg
a4c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a4d0: 20 20 20 72 65 67 41 72 67 20 3d 20 72 65 67 20     regArg = reg 
a4e0: 2b 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 3b  + pWin->iArgCol;
a4f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
a500: 28 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66 75  (pWin->pFunc->fu
a510: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
a520: 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 20 0a 20  _FUNC_MINMAX) . 
a530: 20 20 20 20 20 26 26 20 70 57 69 6e 2d 3e 65 53       && pWin->eS
a540: 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44  tart!=TK_UNBOUND
a550: 45 44 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ED .    ){.     
a560: 20 69 6e 74 20 61 64 64 72 49 73 4e 75 6c 6c 20   int addrIsNull 
a570: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
a580: 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op1(v, OP_IsNull
a590: 2c 20 72 65 67 41 72 67 29 3b 0a 20 20 20 20 20  , regArg);.     
a5a0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
a5b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 62 49 6e 76  ;.      if( bInv
a5c0: 65 72 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  erse==0 ){.     
a5d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a5e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
a5f0: 6d 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b  m, pWin->regApp+
a600: 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73  1, 1);.        s
a610: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
a620: 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 65  (v, OP_SCopy, re
a630: 67 41 72 67 2c 20 70 57 69 6e 2d 3e 72 65 67 41  gArg, pWin->regA
a640: 70 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  pp);.        sql
a650: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
a660: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
a670: 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2c 20 32   pWin->regApp, 2
a680: 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 32  , pWin->regApp+2
a690: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
a6a0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
a6b0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 57  OP_IdxInsert, pW
a6c0: 69 6e 2d 3e 63 73 72 41 70 70 2c 20 70 57 69 6e  in->csrApp, pWin
a6d0: 2d 3e 72 65 67 41 70 70 2b 32 29 3b 0a 20 20 20  ->regApp+2);.   
a6e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a6f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a700: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 53 65 65  Op4Int(v, OP_See
a710: 6b 47 45 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70  kGE, pWin->csrAp
a720: 70 2c 20 30 2c 20 72 65 67 41 72 67 2c 20 31 29  p, 0, regArg, 1)
a730: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
a740: 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b 65 6e  verageNeverTaken
a750: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
a760: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
a770: 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 70 57 69  , OP_Delete, pWi
a780: 6e 2d 3e 63 73 72 41 70 70 29 3b 0a 20 20 20 20  n->csrApp);.    
a790: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
a7a0: 75 6d 70 48 65 72 65 28 76 2c 20 73 71 6c 69 74  umpHere(v, sqlit
a7b0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
a7c0: 72 28 76 29 2d 32 29 3b 0a 20 20 20 20 20 20 7d  r(v)-2);.      }
a7d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a7e0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
a7f0: 64 72 49 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d  drIsNull);.    }
a800: 65 6c 73 65 20 69 66 28 20 70 57 69 6e 2d 3e 72  else if( pWin->r
a810: 65 67 41 70 70 20 29 7b 0a 20 20 20 20 20 20 61  egApp ){.      a
a820: 73 73 65 72 74 28 20 70 57 69 6e 2d 3e 70 46 75  ssert( pWin->pFu
a830: 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76  nc->zName==nth_v
a840: 61 6c 75 65 4e 61 6d 65 0a 20 20 20 20 20 20 20  alueName.       
a850: 20 20 20 20 7c 7c 20 70 57 69 6e 2d 3e 70 46 75      || pWin->pFu
a860: 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72 73 74  nc->zName==first
a870: 5f 76 61 6c 75 65 4e 61 6d 65 0a 20 20 20 20 20  _valueName.     
a880: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a890: 28 20 62 49 6e 76 65 72 73 65 3d 3d 30 20 7c 7c  ( bInverse==0 ||
a8a0: 20 62 49 6e 76 65 72 73 65 3d 3d 31 20 29 3b 0a   bInverse==1 );.
a8b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a8c0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
a8d0: 64 49 6d 6d 2c 20 70 57 69 6e 2d 3e 72 65 67 41  dImm, pWin->regA
a8e0: 70 70 2b 31 2d 62 49 6e 76 65 72 73 65 2c 20 31  pp+1-bInverse, 1
a8f0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
a900: 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 7a 4e   pWin->pFunc->zN
a910: 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65 0a 20 20  ame==leadName.  
a920: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 57 69 6e           || pWin
a930: 2d 3e 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d  ->pFunc->zName==
a940: 6c 61 67 4e 61 6d 65 0a 20 20 20 20 29 7b 0a 20  lagName.    ){. 
a950: 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f       /* no-op */
a960: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a970: 20 20 69 6e 74 20 61 64 64 72 49 66 20 3d 20 30    int addrIf = 0
a980: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 69 6e  ;.      if( pWin
a990: 2d 3e 70 46 69 6c 74 65 72 20 29 7b 0a 20 20 20  ->pFilter ){.   
a9a0: 20 20 20 20 20 69 6e 74 20 72 65 67 54 6d 70 3b       int regTmp;
a9b0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
a9c0: 20 6e 41 72 67 3d 3d 30 20 7c 7c 20 6e 41 72 67   nArg==0 || nArg
a9d0: 3d 3d 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e  ==pWin->pOwner->
a9e0: 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  x.pList->nExpr )
a9f0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
aa00: 28 20 6e 41 72 67 20 7c 7c 20 70 57 69 6e 2d 3e  ( nArg || pWin->
aa10: 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 3d  pOwner->x.pList=
aa20: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =0 );.        if
aa30: 28 20 63 73 72 3e 30 20 29 7b 0a 20 20 20 20 20  ( csr>0 ){.     
aa40: 20 20 20 20 20 72 65 67 54 6d 70 20 3d 20 73 71       regTmp = sq
aa50: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
aa60: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
aa70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
aa80: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
aa90: 6e 2c 20 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41  n, csr, pWin->iA
aaa0: 72 67 43 6f 6c 2b 6e 41 72 67 2c 72 65 67 54 6d  rgCol+nArg,regTm
aab0: 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  p);.        }els
aac0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 67  e{.          reg
aad0: 54 6d 70 20 3d 20 72 65 67 41 72 67 20 2b 20 6e  Tmp = regArg + n
aae0: 41 72 67 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Arg;.        }. 
aaf0: 20 20 20 20 20 20 20 61 64 64 72 49 66 20 3d 20         addrIf = 
ab00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ab10: 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72  3(v, OP_IfNot, r
ab20: 65 67 54 6d 70 2c 20 30 2c 20 31 29 3b 0a 20 20  egTmp, 0, 1);.  
ab30: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
ab40: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69  ge(v);.        i
ab50: 66 28 20 63 73 72 3e 30 20 29 7b 0a 20 20 20 20  f( csr>0 ){.    
ab60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
ab70: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
ab80: 73 65 2c 20 72 65 67 54 6d 70 29 3b 0a 20 20 20  se, regTmp);.   
ab90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
aba0: 20 20 20 20 20 69 66 28 20 70 57 69 6e 2d 3e 70       if( pWin->p
abb0: 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20  Func->funcFlags 
abc0: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45  & SQLITE_FUNC_NE
abd0: 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20  EDCOLL ){.      
abe0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
abf0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
ac00: 28 20 6e 41 72 67 3e 30 20 29 3b 0a 20 20 20 20  ( nArg>0 );.    
ac10: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
ac20: 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71  te3ExprNNCollSeq
ac30: 28 70 50 61 72 73 65 2c 20 70 57 69 6e 2d 3e 70  (pParse, pWin->p
ac40: 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  Owner->x.pList->
ac50: 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[0].pExpr);.   
ac60: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ac70: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp4(v, OP_Col
ac80: 6c 53 65 71 2c 20 30 2c 30 2c 30 2c 20 28 63 6f  lSeq, 0,0,0, (co
ac90: 6e 73 74 20 63 68 61 72 2a 29 70 43 6f 6c 6c 2c  nst char*)pColl,
aca0: 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
acb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
acc0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
acd0: 20 62 49 6e 76 65 72 73 65 3f 20 4f 50 5f 41 67   bInverse? OP_Ag
ace0: 67 49 6e 76 65 72 73 65 20 3a 20 4f 50 5f 41 67  gInverse : OP_Ag
acf0: 67 53 74 65 70 2c 20 0a 20 20 20 20 20 20 20 20  gStep, .        
ad00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad10: 62 49 6e 76 65 72 73 65 2c 20 72 65 67 41 72 67  bInverse, regArg
ad20: 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d  , pWin->regAccum
ad30: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ad40: 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20  VdbeAppendP4(v, 
ad50: 70 57 69 6e 2d 3e 70 46 75 6e 63 2c 20 50 34 5f  pWin->pFunc, P4_
ad60: 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20  FUNCDEF);.      
ad70: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
ad80: 65 50 35 28 76 2c 20 28 75 38 29 6e 41 72 67 29  eP5(v, (u8)nArg)
ad90: 3b 0a 20 20 20 20 20 20 69 66 28 20 61 64 64 72  ;.      if( addr
ada0: 49 66 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  If ) sqlite3Vdbe
adb0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
adc0: 49 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  If);.    }.  }.}
add0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
ade0: 20 56 4d 20 63 6f 64 65 20 74 6f 20 69 6e 76 6f   VM code to invo
adf0: 6b 65 20 65 69 74 68 65 72 20 78 56 61 6c 75 65  ke either xValue
ae00: 28 29 20 28 62 46 69 6e 61 6c 3d 3d 30 29 20 6f  () (bFinal==0) o
ae10: 72 20 78 46 69 6e 61 6c 69 7a 65 28 29 0a 2a 2a  r xFinalize().**
ae20: 20 28 62 46 69 6e 61 6c 3d 3d 31 29 20 66 6f 72   (bFinal==1) for
ae30: 20 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e   each window fun
ae40: 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 6c 69 6e  ction in the lin
ae50: 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e  ked list startin
ae60: 67 20 61 74 0a 2a 2a 20 70 4d 57 69 6e 2e 20 4f  g at.** pMWin. O
ae70: 72 2c 20 66 6f 72 20 62 75 69 6c 74 2d 69 6e 20  r, for built-in 
ae80: 77 69 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e 73  window-functions
ae90: 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 75 73 65   that do not use
aea0: 20 74 68 65 20 73 74 61 6e 64 61 72 64 0a 2a 2a   the standard.**
aeb0: 20 41 50 49 2c 20 67 65 6e 65 72 61 74 65 20 74   API, generate t
aec0: 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 56 4d  he equivalent VM
aed0: 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
aee0: 20 76 6f 69 64 20 77 69 6e 64 6f 77 41 67 67 46   void windowAggF
aef0: 69 6e 61 6c 28 50 61 72 73 65 20 2a 70 50 61 72  inal(Parse *pPar
af00: 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69  se, Window *pMWi
af10: 6e 2c 20 69 6e 74 20 62 46 69 6e 61 6c 29 7b 0a  n, int bFinal){.
af20: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
af30: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
af40: 65 29 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57  e);.  Window *pW
af50: 69 6e 3b 0a 0a 20 20 66 6f 72 28 70 57 69 6e 3d  in;..  for(pWin=
af60: 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69  pMWin; pWin; pWi
af70: 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e  n=pWin->pNextWin
af80: 29 7b 0a 20 20 20 20 69 66 28 20 28 70 57 69 6e  ){.    if( (pWin
af90: 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61  ->pFunc->funcFla
afa0: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
afb0: 5f 4d 49 4e 4d 41 58 29 20 0a 20 20 20 20 20 26  _MINMAX) .     &
afc0: 26 20 70 57 69 6e 2d 3e 65 53 74 61 72 74 21 3d  & pWin->eStart!=
afd0: 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 0a 20 20  TK_UNBOUNDED .  
afe0: 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74    ){.      sqlit
aff0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b000: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e  OP_Null, 0, pWin
b010: 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20  ->regResult);.  
b020: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b030: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61 73 74  ddOp1(v, OP_Last
b040: 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 29 3b  , pWin->csrApp);
b050: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
b060: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71  age(v);.      sq
b070: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
b080: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 57  v, OP_Column, pW
b090: 69 6e 2d 3e 63 73 72 41 70 70 2c 20 30 2c 20 70  in->csrApp, 0, p
b0a0: 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b  Win->regResult);
b0b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b0c0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 73 71  beJumpHere(v, sq
b0d0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
b0e0: 41 64 64 72 28 76 29 2d 32 29 3b 0a 20 20 20 20  Addr(v)-2);.    
b0f0: 20 20 69 66 28 20 62 46 69 6e 61 6c 20 29 7b 0a    if( bFinal ){.
b100: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b110: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
b120: 52 65 73 65 74 53 6f 72 74 65 72 2c 20 70 57 69  ResetSorter, pWi
b130: 6e 2d 3e 63 73 72 41 70 70 29 3b 0a 20 20 20 20  n->csrApp);.    
b140: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
b150: 28 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 20 29  ( pWin->regApp )
b160: 7b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  {.    }else{.   
b170: 20 20 20 69 66 28 20 62 46 69 6e 61 6c 20 29 7b     if( bFinal ){
b180: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b190: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
b1a0: 5f 41 67 67 46 69 6e 61 6c 2c 20 70 57 69 6e 2d  _AggFinal, pWin-
b1b0: 3e 72 65 67 41 63 63 75 6d 2c 20 77 69 6e 64 6f  >regAccum, windo
b1c0: 77 41 72 67 43 6f 75 6e 74 28 70 57 69 6e 29 29  wArgCount(pWin))
b1d0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
b1e0: 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c  3VdbeAppendP4(v,
b1f0: 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2c 20 50 34   pWin->pFunc, P4
b200: 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20  _FUNCDEF);.     
b210: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b220: 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
b230: 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 2c   pWin->regAccum,
b240: 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74   pWin->regResult
b250: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
b260: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b270: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e  OP_Null, 0, pWin
b280: 2d 3e 72 65 67 41 63 63 75 6d 29 3b 0a 20 20 20  ->regAccum);.   
b290: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b2a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b2b0: 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67 56 61 6c  Op3(v, OP_AggVal
b2c0: 75 65 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63  ue, pWin->regAcc
b2d0: 75 6d 2c 20 77 69 6e 64 6f 77 41 72 67 43 6f 75  um, windowArgCou
b2e0: 6e 74 28 70 57 69 6e 29 2c 0a 20 20 20 20 20 20  nt(pWin),.      
b2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b300: 20 20 20 20 20 20 20 70 57 69 6e 2d 3e 72 65 67         pWin->reg
b310: 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 20  Result);.       
b320: 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65   sqlite3VdbeAppe
b330: 6e 64 50 34 28 76 2c 20 70 57 69 6e 2d 3e 70 46  ndP4(v, pWin->pF
b340: 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  unc, P4_FUNCDEF)
b350: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b360: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76    }.}../*.** Inv
b370: 6f 6b 65 20 74 68 65 20 73 75 62 2d 72 6f 75 74  oke the sub-rout
b380: 69 6e 65 20 61 74 20 72 65 67 47 6f 73 75 62 20  ine at regGosub 
b390: 28 67 65 6e 65 72 61 74 65 64 20 62 79 20 63 6f  (generated by co
b3a0: 64 65 20 69 6e 20 73 65 6c 65 63 74 2e 63 29 20  de in select.c) 
b3b0: 74 6f 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65  to.** return the
b3c0: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
b3d0: 57 69 6e 64 6f 77 2e 69 45 70 68 43 73 72 2e 20  Window.iEphCsr. 
b3e0: 49 66 20 61 6c 6c 20 77 69 6e 64 6f 77 20 66 75  If all window fu
b3f0: 6e 63 74 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 61  nctions are.** a
b400: 67 67 72 65 67 61 74 65 20 77 69 6e 64 6f 77 20  ggregate window 
b410: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 75  functions that u
b420: 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  se the standard 
b430: 41 50 49 2c 20 61 20 73 69 6e 67 6c 65 0a 2a 2a  API, a single.**
b440: 20 4f 50 5f 47 6f 73 75 62 20 69 6e 73 74 72 75   OP_Gosub instru
b450: 63 74 69 6f 6e 20 69 73 20 61 6c 6c 20 74 68 61  ction is all tha
b460: 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67  t this routine g
b470: 65 6e 65 72 61 74 65 73 2e 20 45 78 74 72 61 20  enerates. Extra 
b480: 56 4d 20 63 6f 64 65 0a 2a 2a 20 66 6f 72 20 70  VM code.** for p
b490: 65 72 2d 72 6f 77 20 70 72 6f 63 65 73 73 69 6e  er-row processin
b4a0: 67 20 69 73 20 6f 6e 6c 79 20 67 65 6e 65 72 61  g is only genera
b4b0: 74 65 64 20 66 6f 72 20 74 68 65 20 66 6f 6c 6c  ted for the foll
b4c0: 6f 77 69 6e 67 20 62 75 69 6c 74 2d 69 6e 20 77  owing built-in w
b4d0: 69 6e 64 6f 77 0a 2a 2a 20 66 75 6e 63 74 69 6f  indow.** functio
b4e0: 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6e 74 68 5f  ns:.**.**   nth_
b4f0: 76 61 6c 75 65 28 29 0a 2a 2a 20 20 20 66 69 72  value().**   fir
b500: 73 74 5f 76 61 6c 75 65 28 29 0a 2a 2a 20 20 20  st_value().**   
b510: 6c 61 67 28 29 0a 2a 2a 20 20 20 6c 65 61 64 28  lag().**   lead(
b520: 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ).*/.static void
b530: 20 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65   windowReturnOne
b540: 52 6f 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Row(.  Parse *pP
b550: 61 72 73 65 2c 0a 20 20 57 69 6e 64 6f 77 20 2a  arse,.  Window *
b560: 70 4d 57 69 6e 2c 0a 20 20 69 6e 74 20 72 65 67  pMWin,.  int reg
b570: 47 6f 73 75 62 2c 0a 20 20 69 6e 74 20 61 64 64  Gosub,.  int add
b580: 72 47 6f 73 75 62 0a 29 7b 0a 20 20 56 64 62 65  rGosub.){.  Vdbe
b590: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
b5a0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
b5b0: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20  Window *pWin;.  
b5c0: 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20  for(pWin=pMWin; 
b5d0: 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d  pWin; pWin=pWin-
b5e0: 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20  >pNextWin){.    
b5f0: 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20 3d  FuncDef *pFunc =
b600: 20 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20   pWin->pFunc;.  
b610: 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 7a 4e 61    if( pFunc->zNa
b620: 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d  me==nth_valueNam
b630: 65 0a 20 20 20 20 20 7c 7c 20 70 46 75 6e 63 2d  e.     || pFunc-
b640: 3e 7a 4e 61 6d 65 3d 3d 66 69 72 73 74 5f 76 61  >zName==first_va
b650: 6c 75 65 4e 61 6d 65 0a 20 20 20 20 29 7b 0a 20  lueName.    ){. 
b660: 20 20 20 20 20 69 6e 74 20 63 73 72 20 3d 20 70       int csr = p
b670: 57 69 6e 2d 3e 63 73 72 41 70 70 3b 0a 20 20 20  Win->csrApp;.   
b680: 20 20 20 69 6e 74 20 6c 62 6c 20 3d 20 73 71 6c     int lbl = sql
b690: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
b6a0: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
b6b0: 20 69 6e 74 20 74 6d 70 52 65 67 20 3d 20 73 71   int tmpReg = sq
b6c0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
b6d0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
b6e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
b6f0: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
b700: 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29  pWin->regResult)
b710: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 46 75  ;..      if( pFu
b720: 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76  nc->zName==nth_v
b730: 61 6c 75 65 4e 61 6d 65 20 29 7b 0a 20 20 20 20  alueName ){.    
b740: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b750: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
b760: 6d 6e 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43  mn, pMWin->iEphC
b770: 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f  sr, pWin->iArgCo
b780: 6c 2b 31 2c 74 6d 70 52 65 67 29 3b 0a 20 20 20  l+1,tmpReg);.   
b790: 20 20 20 20 20 77 69 6e 64 6f 77 43 68 65 63 6b       windowCheck
b7a0: 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 74 6d  Value(pParse, tm
b7b0: 70 52 65 67 2c 20 32 29 3b 0a 20 20 20 20 20 20  pReg, 2);.      
b7c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
b7d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
b7e0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
b7f0: 31 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20  1, tmpReg);.    
b800: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
b810: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
b820: 50 5f 41 64 64 2c 20 74 6d 70 52 65 67 2c 20 70  P_Add, tmpReg, p
b830: 57 69 6e 2d 3e 72 65 67 41 70 70 2c 20 74 6d 70  Win->regApp, tmp
b840: 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
b850: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
b860: 20 4f 50 5f 47 74 2c 20 70 57 69 6e 2d 3e 72 65   OP_Gt, pWin->re
b870: 67 41 70 70 2b 31 2c 20 6c 62 6c 2c 20 74 6d 70  gApp+1, lbl, tmp
b880: 52 65 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Reg);.      Vdbe
b890: 43 6f 76 65 72 61 67 65 4e 65 76 65 72 4e 75 6c  CoverageNeverNul
b8a0: 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  l(v);.      sqli
b8b0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
b8c0: 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 63   OP_SeekRowid, c
b8d0: 73 72 2c 20 30 2c 20 74 6d 70 52 65 67 29 3b 0a  sr, 0, tmpReg);.
b8e0: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
b8f0: 67 65 4e 65 76 65 72 54 61 6b 65 6e 28 76 29 3b  geNeverTaken(v);
b900: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b910: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
b920: 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20 70 57 69 6e  olumn, csr, pWin
b930: 2d 3e 69 41 72 67 43 6f 6c 2c 20 70 57 69 6e 2d  ->iArgCol, pWin-
b940: 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20  >regResult);.   
b950: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
b960: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62  solveLabel(v, lb
b970: 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
b980: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
b990: 70 50 61 72 73 65 2c 20 74 6d 70 52 65 67 29 3b  pParse, tmpReg);
b9a0: 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20  .    }.    else 
b9b0: 69 66 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65  if( pFunc->zName
b9c0: 3d 3d 6c 65 61 64 4e 61 6d 65 20 7c 7c 20 70 46  ==leadName || pF
b9d0: 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 61 67 4e  unc->zName==lagN
b9e0: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ame ){.      int
b9f0: 20 6e 41 72 67 20 3d 20 70 57 69 6e 2d 3e 70 4f   nArg = pWin->pO
ba00: 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  wner->x.pList->n
ba10: 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20  Expr;.      int 
ba20: 63 73 72 20 3d 20 70 57 69 6e 2d 3e 63 73 72 41  csr = pWin->csrA
ba30: 70 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 62  pp;.      int lb
ba40: 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  l = sqlite3VdbeM
ba50: 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
ba60: 3b 0a 20 20 20 20 20 20 69 6e 74 20 74 6d 70 52  ;.      int tmpR
ba70: 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  eg = sqlite3GetT
ba80: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
ba90: 20 20 20 20 20 20 69 6e 74 20 69 45 70 68 20 3d        int iEph =
baa0: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 3b   pMWin->iEphCsr;
bab0: 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67  ..      if( nArg
bac0: 3c 33 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  <3 ){.        sq
bad0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
bae0: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70  v, OP_Null, 0, p
baf0: 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b  Win->regResult);
bb00: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
bb10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
bb20: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
bb30: 6c 75 6d 6e 2c 20 69 45 70 68 2c 20 70 57 69 6e  lumn, iEph, pWin
bb40: 2d 3e 69 41 72 67 43 6f 6c 2b 32 2c 20 70 57 69  ->iArgCol+2, pWi
bb50: 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20  n->regResult);. 
bb60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
bb70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
bb80: 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 45 70 68  , OP_Rowid, iEph
bb90: 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20  , tmpReg);.     
bba0: 20 69 66 28 20 6e 41 72 67 3c 32 20 29 7b 0a 20   if( nArg<2 ){. 
bbb0: 20 20 20 20 20 20 20 69 6e 74 20 76 61 6c 20 3d         int val =
bbc0: 20 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d   (pFunc->zName==
bbd0: 6c 65 61 64 4e 61 6d 65 20 3f 20 31 20 3a 20 2d  leadName ? 1 : -
bbe0: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
bbf0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
bc00: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 6d 70 52   OP_AddImm, tmpR
bc10: 65 67 2c 20 76 61 6c 29 3b 0a 20 20 20 20 20 20  eg, val);.      
bc20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
bc30: 6e 74 20 6f 70 20 3d 20 28 70 46 75 6e 63 2d 3e  nt op = (pFunc->
bc40: 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65 20  zName==leadName 
bc50: 3f 20 4f 50 5f 41 64 64 20 3a 20 4f 50 5f 53 75  ? OP_Add : OP_Su
bc60: 62 74 72 61 63 74 29 3b 0a 20 20 20 20 20 20 20  btract);.       
bc70: 20 69 6e 74 20 74 6d 70 52 65 67 32 20 3d 20 73   int tmpReg2 = s
bc80: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
bc90: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
bca0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bcb0: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
bcc0: 2c 20 69 45 70 68 2c 20 70 57 69 6e 2d 3e 69 41  , iEph, pWin->iA
bcd0: 72 67 43 6f 6c 2b 31 2c 20 74 6d 70 52 65 67 32  rgCol+1, tmpReg2
bce0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
bcf0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
bd00: 6f 70 2c 20 74 6d 70 52 65 67 32 2c 20 74 6d 70  op, tmpReg2, tmp
bd10: 52 65 67 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20  Reg, tmpReg);.  
bd20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
bd30: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
bd40: 73 65 2c 20 74 6d 70 52 65 67 32 29 3b 0a 20 20  se, tmpReg2);.  
bd50: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c      }..      sql
bd60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
bd70: 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20  , OP_SeekRowid, 
bd80: 63 73 72 2c 20 6c 62 6c 2c 20 74 6d 70 52 65 67  csr, lbl, tmpReg
bd90: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
bda0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
bdb0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
bdc0: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
bdd0: 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43  csr, pWin->iArgC
bde0: 6f 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73  ol, pWin->regRes
bdf0: 75 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ult);.      sqli
be00: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
be10: 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20 20 20  bel(v, lbl);.   
be20: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
be30: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
be40: 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 7d 0a   tmpReg);.    }.
be50: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
be60: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
be70: 73 75 62 2c 20 72 65 67 47 6f 73 75 62 2c 20 61  sub, regGosub, a
be80: 64 64 72 47 6f 73 75 62 29 3b 0a 7d 0a 0a 2f 2a  ddrGosub);.}../*
be90: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
bea0: 65 20 74 6f 20 73 65 74 20 74 68 65 20 61 63 63  e to set the acc
beb0: 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65  umulator registe
bec0: 72 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f  r for each windo
bed0: 77 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e  w function.** in
bee0: 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
bef0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
bf00: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
bf10: 6f 20 4e 55 4c 4c 2e 20 41 6e 64 20 70 65 72 66  o NULL. And perf
bf20: 6f 72 6d 0a 2a 2a 20 61 6e 79 20 65 71 75 69 76  orm.** any equiv
bf30: 61 6c 65 6e 74 20 69 6e 69 74 69 61 6c 69 7a 61  alent initializa
bf40: 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79  tion required by
bf50: 20 61 6e 79 20 62 75 69 6c 74 2d 69 6e 20 77 69   any built-in wi
bf60: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 0a 2a  ndow functions.*
bf70: 2a 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a  * in the list..*
bf80: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
bf90: 64 6f 77 49 6e 69 74 41 63 63 75 6d 28 50 61 72  dowInitAccum(Par
bfa0: 73 65 20 2a 70 50 61 72 73 65 2c 20 57 69 6e 64  se *pParse, Wind
bfb0: 6f 77 20 2a 70 4d 57 69 6e 29 7b 0a 20 20 56 64  ow *pMWin){.  Vd
bfc0: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
bfd0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
bfe0: 20 20 69 6e 74 20 72 65 67 41 72 67 3b 0a 20 20    int regArg;.  
bff0: 69 6e 74 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20  int nArg = 0;.  
c000: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20  Window *pWin;.  
c010: 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20  for(pWin=pMWin; 
c020: 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d  pWin; pWin=pWin-
c030: 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20  >pNextWin){.    
c040: 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20 3d  FuncDef *pFunc =
c050: 20 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20   pWin->pFunc;.  
c060: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c070: 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
c080: 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75  0, pWin->regAccu
c090: 6d 29 3b 0a 20 20 20 20 6e 41 72 67 20 3d 20 4d  m);.    nArg = M
c0a0: 41 58 28 6e 41 72 67 2c 20 77 69 6e 64 6f 77 41  AX(nArg, windowA
c0b0: 72 67 43 6f 75 6e 74 28 70 57 69 6e 29 29 3b 0a  rgCount(pWin));.
c0c0: 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 7a      if( pFunc->z
c0d0: 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e  Name==nth_valueN
c0e0: 61 6d 65 0a 20 20 20 20 20 7c 7c 20 70 46 75 6e  ame.     || pFun
c0f0: 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72 73 74 5f  c->zName==first_
c100: 76 61 6c 75 65 4e 61 6d 65 0a 20 20 20 20 29 7b  valueName.    ){
c110: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c120: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
c130: 6e 74 65 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d  nteger, 0, pWin-
c140: 3e 72 65 67 41 70 70 29 3b 0a 20 20 20 20 20 20  >regApp);.      
c150: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c160: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
c170: 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70   0, pWin->regApp
c180: 2b 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  +1);.    }..    
c190: 69 66 28 20 28 70 46 75 6e 63 2d 3e 66 75 6e 63  if( (pFunc->func
c1a0: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
c1b0: 55 4e 43 5f 4d 49 4e 4d 41 58 29 20 26 26 20 70  UNC_MINMAX) && p
c1c0: 57 69 6e 2d 3e 63 73 72 41 70 70 20 29 7b 0a 20  Win->csrApp ){. 
c1d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69       assert( pWi
c1e0: 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b 5f 55 4e  n->eStart!=TK_UN
c1f0: 42 4f 55 4e 44 45 44 20 29 3b 0a 20 20 20 20 20  BOUNDED );.     
c200: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c210: 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f  p1(v, OP_ResetSo
c220: 72 74 65 72 2c 20 70 57 69 6e 2d 3e 63 73 72 41  rter, pWin->csrA
c230: 70 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pp);.      sqlit
c240: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
c250: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70  OP_Integer, 0, p
c260: 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31 29 3b 0a  Win->regApp+1);.
c270: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 67 41      }.  }.  regA
c280: 72 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  rg = pParse->nMe
c290: 6d 2b 31 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  m+1;.  pParse->n
c2a0: 4d 65 6d 20 2b 3d 20 6e 41 72 67 3b 0a 20 20 72  Mem += nArg;.  r
c2b0: 65 74 75 72 6e 20 72 65 67 41 72 67 3b 0a 7d 0a  eturn regArg;.}.
c2c0: 0a 23 69 66 20 30 0a 2f 2a 20 0a 2a 2a 20 52 65  .#if 0./* .** Re
c2d0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
c2e0: 20 63 75 72 72 65 6e 74 20 66 72 61 6d 65 20 73   current frame s
c2f0: 68 6f 75 6c 64 20 62 65 20 63 61 63 68 65 64 20  hould be cached 
c300: 69 6e 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  in the ephemeral
c310: 20 74 61 62 6c 65 2c 0a 2a 2a 20 65 76 65 6e 20   table,.** even 
c320: 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  if there are no 
c330: 78 49 6e 76 65 72 73 65 28 29 20 63 61 6c 6c 73  xInverse() calls
c340: 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74   required..*/.st
c350: 61 74 69 63 20 69 6e 74 20 77 69 6e 64 6f 77 43  atic int windowC
c360: 61 63 68 65 46 72 61 6d 65 28 57 69 6e 64 6f 77  acheFrame(Window
c370: 20 2a 70 4d 57 69 6e 29 7b 0a 20 20 57 69 6e 64   *pMWin){.  Wind
c380: 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 66 6f 72 28  ow *pWin;.  for(
c390: 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e  pWin=pMWin; pWin
c3a0: 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65  ; pWin=pWin->pNe
c3b0: 78 74 57 69 6e 29 7b 0a 20 20 20 20 46 75 6e 63  xtWin){.    Func
c3c0: 44 65 66 20 2a 70 46 75 6e 63 20 3d 20 70 57 69  Def *pFunc = pWi
c3d0: 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 69 66  n->pFunc;.    if
c3e0: 28 20 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d  ( (pFunc->zName=
c3f0: 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 29 0a  =nth_valueName).
c400: 20 20 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d 3e       || (pFunc->
c410: 7a 4e 61 6d 65 3d 3d 66 69 72 73 74 5f 76 61 6c  zName==first_val
c420: 75 65 4e 61 6d 65 29 0a 20 20 20 20 20 7c 7c 20  ueName).     || 
c430: 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c  (pFunc->zName==l
c440: 65 61 64 4e 61 6d 65 29 20 2a 2f 0a 20 20 20 20  eadName) */.    
c450: 20 7c 7c 20 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d   || (pFunc->zNam
c460: 65 3d 3d 6c 61 67 4e 61 6d 65 29 0a 20 20 20 20  e==lagName).    
c470: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
c480: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
c490: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
c4a0: 66 0a 0a 2f 2a 0a 2a 2a 20 72 65 67 4f 6c 64 20  f../*.** regOld 
c4b0: 61 6e 64 20 72 65 67 4e 65 77 20 61 72 65 20 65  and regNew are e
c4c0: 61 63 68 20 74 68 65 20 66 69 72 73 74 20 72 65  ach the first re
c4d0: 67 69 73 74 65 72 20 69 6e 20 61 6e 20 61 72 72  gister in an arr
c4e0: 61 79 20 6f 66 20 73 69 7a 65 0a 2a 2a 20 70 4f  ay of size.** pO
c4f0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2e 20 54  rderBy->nExpr. T
c500: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 67 65 6e  his function gen
c510: 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20 63  erates code to c
c520: 6f 6d 70 61 72 65 20 74 68 65 20 74 77 6f 0a 2a  ompare the two.*
c530: 2a 20 61 72 72 61 79 73 20 6f 66 20 72 65 67 69  * arrays of regi
c540: 73 74 65 72 73 20 75 73 69 6e 67 20 74 68 65 20  sters using the 
c550: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
c560: 63 65 73 20 61 6e 64 20 6f 74 68 65 72 20 63 6f  ces and other co
c570: 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 70 61 72 61  mparison.** para
c580: 6d 65 74 65 72 73 20 73 70 65 63 69 66 69 65 64  meters specified
c590: 20 62 79 20 70 4f 72 64 65 72 42 79 2e 20 0a 2a   by pOrderBy. .*
c5a0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 77 6f 20  *.** If the two 
c5b0: 61 72 72 61 79 73 20 61 72 65 20 6e 6f 74 20 65  arrays are not e
c5c0: 71 75 61 6c 2c 20 74 68 65 20 63 6f 6e 74 65 6e  qual, the conten
c5d0: 74 73 20 6f 66 20 72 65 67 4e 65 77 20 69 73 20  ts of regNew is 
c5e0: 63 6f 70 69 65 64 20 74 6f 20 0a 2a 2a 20 72 65  copied to .** re
c5f0: 67 4f 6c 64 20 61 6e 64 20 63 6f 6e 74 72 6f 6c  gOld and control
c600: 20 66 61 6c 6c 73 20 74 68 72 6f 75 67 68 2e 20   falls through. 
c610: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
c620: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
c630: 65 20 61 72 72 61 79 73 0a 2a 2a 20 61 72 65 20  e arrays.** are 
c640: 65 71 75 61 6c 2c 20 61 6e 20 4f 50 5f 47 6f 74  equal, an OP_Got
c650: 6f 20 69 73 20 65 78 65 63 75 74 65 64 2e 20 54  o is executed. T
c660: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
c670: 65 20 4f 50 5f 47 6f 74 6f 20 69 73 20 72 65 74  e OP_Goto is ret
c680: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
c690: 20 76 6f 69 64 20 77 69 6e 64 6f 77 49 66 4e 65   void windowIfNe
c6a0: 77 50 65 65 72 28 0a 20 20 50 61 72 73 65 20 2a  wPeer(.  Parse *
c6b0: 70 50 61 72 73 65 2c 0a 20 20 45 78 70 72 4c 69  pParse,.  ExprLi
c6c0: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 0a 20 20  st *pOrderBy,.  
c6d0: 69 6e 74 20 72 65 67 4e 65 77 2c 20 20 20 20 20  int regNew,     
c6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6f0: 2f 2a 20 46 69 72 73 74 20 69 6e 20 61 72 72 61  /* First in arra
c700: 79 20 6f 66 20 6e 65 77 20 76 61 6c 75 65 73 20  y of new values 
c710: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 6c 64 2c  */.  int regOld,
c720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c730: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 69 6e       /* First in
c740: 20 61 72 72 61 79 20 6f 66 20 6f 6c 64 20 76 61   array of old va
c750: 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64  lues */.  int ad
c760: 64 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  dr              
c770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
c780: 70 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56  p here */.){.  V
c790: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
c7a0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
c7b0: 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
c7c0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 56 61 6c 20  ){.    int nVal 
c7d0: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
c7e0: 72 3b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  r;.    KeyInfo *
c7f0: 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
c800: 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  e3KeyInfoFromExp
c810: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f  rList(pParse, pO
c820: 72 64 65 72 42 79 2c 20 30 2c 20 30 29 3b 0a 20  rderBy, 0, 0);. 
c830: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c840: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp3(v, OP_Compa
c850: 72 65 2c 20 72 65 67 4f 6c 64 2c 20 72 65 67 4e  re, regOld, regN
c860: 65 77 2c 20 6e 56 61 6c 29 3b 0a 20 20 20 20 73  ew, nVal);.    s
c870: 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64  qlite3VdbeAppend
c880: 50 34 28 76 2c 20 28 76 6f 69 64 2a 29 70 4b 65  P4(v, (void*)pKe
c890: 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
c8a0: 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  O);.    sqlite3V
c8b0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
c8c0: 4a 75 6d 70 2c 20 0a 20 20 20 20 20 20 73 71 6c  Jump, .      sql
c8d0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
c8e0: 64 64 72 28 76 29 2b 31 2c 20 61 64 64 72 2c 20  ddr(v)+1, addr, 
c8f0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
c900: 6e 74 41 64 64 72 28 76 29 2b 31 0a 20 20 20 20  ntAddr(v)+1.    
c910: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
c920: 61 67 65 45 71 4e 65 28 76 29 3b 0a 20 20 20 20  ageEqNe(v);.    
c930: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c940: 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65  3(v, OP_Copy, re
c950: 67 4e 65 77 2c 20 72 65 67 4f 6c 64 2c 20 6e 56  gNew, regOld, nV
c960: 61 6c 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  al-1);.  }else{.
c970: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c980: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
c990: 2c 20 30 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a  , 0, addr);.  }.
c9a0: 7d 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  }..typedef struc
c9b0: 74 20 57 69 6e 64 6f 77 43 6f 64 65 41 72 67 20  t WindowCodeArg 
c9c0: 57 69 6e 64 6f 77 43 6f 64 65 41 72 67 3b 0a 74  WindowCodeArg;.t
c9d0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57 69  ypedef struct Wi
c9e0: 6e 64 6f 77 43 73 72 41 6e 64 52 65 67 20 57 69  ndowCsrAndReg Wi
c9f0: 6e 64 6f 77 43 73 72 41 6e 64 52 65 67 3b 0a 73  ndowCsrAndReg;.s
ca00: 74 72 75 63 74 20 57 69 6e 64 6f 77 43 73 72 41  truct WindowCsrA
ca10: 6e 64 52 65 67 20 7b 0a 20 20 69 6e 74 20 63 73  ndReg {.  int cs
ca20: 72 3b 0a 20 20 69 6e 74 20 72 65 67 3b 0a 7d 3b  r;.  int reg;.};
ca30: 0a 73 74 72 75 63 74 20 57 69 6e 64 6f 77 43 6f  .struct WindowCo
ca40: 64 65 41 72 67 20 7b 0a 20 20 50 61 72 73 65 20  deArg {.  Parse 
ca50: 2a 70 50 61 72 73 65 3b 0a 20 20 57 69 6e 64 6f  *pParse;.  Windo
ca60: 77 20 2a 70 4d 57 69 6e 3b 0a 20 20 56 64 62 65  w *pMWin;.  Vdbe
ca70: 20 2a 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 72   *pVdbe;.  int r
ca80: 65 67 47 6f 73 75 62 3b 0a 20 20 69 6e 74 20 61  egGosub;.  int a
ca90: 64 64 72 47 6f 73 75 62 3b 0a 20 20 69 6e 74 20  ddrGosub;.  int 
caa0: 72 65 67 41 72 67 3b 0a 0a 20 20 57 69 6e 64 6f  regArg;..  Windo
cab0: 77 43 73 72 41 6e 64 52 65 67 20 73 74 61 72 74  wCsrAndReg start
cac0: 3b 0a 20 20 57 69 6e 64 6f 77 43 73 72 41 6e 64  ;.  WindowCsrAnd
cad0: 52 65 67 20 63 75 72 72 65 6e 74 3b 0a 20 20 57  Reg current;.  W
cae0: 69 6e 64 6f 77 43 73 72 41 6e 64 52 65 67 20 65  indowCsrAndReg e
caf0: 6e 64 3b 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20  nd;.};..#define 
cb00: 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f  WINDOW_RETURN_RO
cb10: 57 20 31 0a 23 64 65 66 69 6e 65 20 57 49 4e 44  W 1.#define WIND
cb20: 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 20 32 0a  OW_AGGINVERSE 2.
cb30: 23 64 65 66 69 6e 65 20 57 49 4e 44 4f 57 5f 41  #define WINDOW_A
cb40: 47 47 53 54 45 50 20 20 20 20 33 0a 0a 2f 2a 0a  GGSTEP    3../*.
cb50: 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 4d 20 63  ** Generate VM c
cb60: 6f 64 65 20 74 6f 20 72 65 61 64 20 74 68 65 20  ode to read the 
cb70: 77 69 6e 64 6f 77 20 66 72 61 6d 65 73 20 70 65  window frames pe
cb80: 65 72 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 63  er values from c
cb90: 75 72 73 6f 72 20 63 73 72 20 69 6e 74 6f 0a 2a  ursor csr into.*
cba0: 2a 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65  * an array of re
cbb0: 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
cbc0: 20 61 74 20 72 65 67 2e 0a 2a 2f 0a 73 74 61 74   at reg..*/.stat
cbd0: 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 52 65  ic void windowRe
cbe0: 61 64 50 65 65 72 56 61 6c 75 65 73 28 0a 20 20  adPeerValues(.  
cbf0: 57 69 6e 64 6f 77 43 6f 64 65 41 72 67 20 2a 70  WindowCodeArg *p
cc00: 2c 0a 20 20 69 6e 74 20 63 73 72 2c 0a 20 20 69  ,.  int csr,.  i
cc10: 6e 74 20 72 65 67 0a 29 7b 0a 20 20 57 69 6e 64  nt reg.){.  Wind
cc20: 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70  ow *pMWin = p->p
cc30: 4d 57 69 6e 3b 0a 20 20 45 78 70 72 4c 69 73 74  MWin;.  ExprList
cc40: 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 4d 57   *pOrderBy = pMW
cc50: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  in->pOrderBy;.  
cc60: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
cc70: 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71      Vdbe *v = sq
cc80: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 2d 3e  lite3GetVdbe(p->
cc90: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 45 78 70  pParse);.    Exp
cca0: 72 4c 69 73 74 20 2a 70 50 61 72 74 20 3d 20 70  rList *pPart = p
ccb0: 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e  MWin->pPartition
ccc0: 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 4f 66  ;.    int iColOf
ccd0: 66 20 3d 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66  f = pMWin->nBuff
cce0: 65 72 43 6f 6c 20 2b 20 28 70 50 61 72 74 20 3f  erCol + (pPart ?
ccf0: 20 70 50 61 72 74 2d 3e 6e 45 78 70 72 20 3a 20   pPart->nExpr : 
cd00: 30 29 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  0);.    int i;. 
cd10: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f     for(i=0; i<pO
cd20: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
cd30: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
cd40: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
cd50: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20  OP_Column, csr, 
cd60: 69 43 6f 6c 4f 66 66 2b 69 2c 20 72 65 67 2b 69  iColOff+i, reg+i
cd70: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
cd80: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
cd90: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73  ion is called as
cda0: 20 70 61 72 74 20 6f 66 20 67 65 6e 65 72 61 74   part of generat
cdb0: 69 6e 67 20 56 4d 20 70 72 6f 67 72 61 6d 73 20  ing VM programs 
cdc0: 66 6f 72 20 52 41 4e 47 45 0a 2a 2a 20 6f 66 66  for RANGE.** off
cdd0: 73 65 74 20 50 52 45 43 45 44 49 4e 47 2f 46 4f  set PRECEDING/FO
cde0: 4c 4c 4f 57 49 4e 47 20 66 72 61 6d 65 20 62 6f  LLOWING frame bo
cdf0: 75 6e 64 61 72 69 65 73 2e 20 49 74 20 67 65 6e  undaries. It gen
ce00: 65 72 61 74 65 73 20 63 6f 64 65 20 65 71 75 69  erates code equi
ce10: 76 61 6c 65 6e 74 0a 2a 2a 20 74 6f 3a 0a 2a 2a  valent.** to:.**
ce20: 0a 2a 2a 20 20 20 69 66 28 20 63 73 72 31 2e 70  .**   if( csr1.p
ce30: 65 65 72 56 61 6c 20 2b 20 72 65 67 56 61 6c 20  eerVal + regVal 
ce40: 3e 3d 20 63 73 72 32 2e 70 65 65 72 56 61 6c 20  >= csr2.peerVal 
ce50: 29 20 67 6f 74 6f 20 6c 62 6c 3b 0a 2a 2a 20 20  ) goto lbl;.**  
ce60: 20 69 66 28 20 63 73 72 31 2e 72 6f 77 69 64 20   if( csr1.rowid 
ce70: 3e 3d 20 63 73 72 32 2e 72 6f 77 69 64 20 29 20  >= csr2.rowid ) 
ce80: 67 6f 74 6f 20 6c 62 6c 3b 0a 2a 2f 0a 73 74 61  goto lbl;.*/.sta
ce90: 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 43  tic void windowC
cea0: 6f 64 65 52 61 6e 67 65 54 65 73 74 28 0a 20 20  odeRangeTest(.  
ceb0: 57 69 6e 64 6f 77 43 6f 64 65 41 72 67 20 2a 70  WindowCodeArg *p
cec0: 2c 20 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  , .  int op,    
ced0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cee0: 20 20 20 20 20 20 2f 2a 20 4f 50 5f 47 65 20 6f        /* OP_Ge o
cef0: 72 20 4f 50 5f 47 74 20 2a 2f 0a 20 20 69 6e 74  r OP_Gt */.  int
cf00: 20 63 73 72 31 2c 20 0a 20 20 69 6e 74 20 72 65   csr1, .  int re
cf10: 67 56 61 6c 2c 20 0a 20 20 69 6e 74 20 63 73 72  gVal, .  int csr
cf20: 32 2c 0a 20 20 69 6e 74 20 6c 62 6c 0a 29 7b 0a  2,.  int lbl.){.
cf30: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
cf40: 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 56  = p->pParse;.  V
cf50: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
cf60: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
cf70: 0a 20 20 69 6e 74 20 72 65 67 31 20 3d 20 73 71  .  int reg1 = sq
cf80: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
cf90: 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72  pParse);.  int r
cfa0: 65 67 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74  eg2 = sqlite3Get
cfb0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
cfc0: 0a 20 20 69 6e 74 20 61 72 69 74 68 20 3d 20 4f  .  int arith = O
cfd0: 50 5f 41 64 64 3b 0a 0a 20 20 61 73 73 65 72 74  P_Add;..  assert
cfe0: 28 20 6f 70 3d 3d 4f 50 5f 47 65 20 7c 7c 20 6f  ( op==OP_Ge || o
cff0: 70 3d 3d 4f 50 5f 47 74 20 7c 7c 20 6f 70 3d 3d  p==OP_Gt || op==
d000: 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Le );.  asser
d010: 74 28 20 70 2d 3e 70 4d 57 69 6e 2d 3e 70 4f 72  t( p->pMWin->pOr
d020: 64 65 72 42 79 20 26 26 20 70 2d 3e 70 4d 57 69  derBy && p->pMWi
d030: 6e 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  n->pOrderBy->nEx
d040: 70 72 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70  pr==1 );.  if( p
d050: 2d 3e 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42  ->pMWin->pOrderB
d060: 79 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65  y->a[0].sortOrde
d070: 72 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28  r ){.    switch(
d080: 20 6f 70 20 29 7b 0a 20 20 20 20 20 20 63 61 73   op ){.      cas
d090: 65 20 4f 50 5f 47 65 3a 20 6f 70 20 3d 20 4f 50  e OP_Ge: op = OP
d0a0: 5f 4c 65 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  _Le; break;.    
d0b0: 20 20 63 61 73 65 20 4f 50 5f 47 74 3a 20 6f 70    case OP_Gt: op
d0c0: 20 3d 20 4f 50 5f 4c 74 3b 20 62 72 65 61 6b 3b   = OP_Lt; break;
d0d0: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20  .      default: 
d0e0: 61 73 73 65 72 74 28 20 6f 70 3d 3d 4f 50 5f 4c  assert( op==OP_L
d0f0: 65 20 29 3b 20 6f 70 20 3d 20 4f 50 5f 47 65 3b  e ); op = OP_Ge;
d100: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
d110: 20 20 61 72 69 74 68 20 3d 20 4f 50 5f 53 75 62    arith = OP_Sub
d120: 74 72 61 63 74 3b 0a 20 20 7d 0a 0a 20 20 77 69  tract;.  }..  wi
d130: 6e 64 6f 77 52 65 61 64 50 65 65 72 56 61 6c 75  ndowReadPeerValu
d140: 65 73 28 70 2c 20 63 73 72 31 2c 20 72 65 67 31  es(p, csr1, reg1
d150: 29 3b 0a 20 20 77 69 6e 64 6f 77 52 65 61 64 50  );.  windowReadP
d160: 65 65 72 56 61 6c 75 65 73 28 70 2c 20 63 73 72  eerValues(p, csr
d170: 32 2c 20 72 65 67 32 29 3b 0a 20 20 73 71 6c 69  2, reg2);.  sqli
d180: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
d190: 20 61 72 69 74 68 2c 20 72 65 67 56 61 6c 2c 20   arith, regVal, 
d1a0: 72 65 67 31 2c 20 72 65 67 31 29 3b 0a 20 20 73  reg1, reg1);.  s
d1b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
d1c0: 28 76 2c 20 6f 70 2c 20 72 65 67 32 2c 20 6c 62  (v, op, reg2, lb
d1d0: 6c 2c 20 72 65 67 31 29 3b 0a 20 20 73 71 6c 69  l, reg1);.  sqli
d1e0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
d1f0: 20 4f 50 5f 52 6f 77 69 64 2c 20 63 73 72 31 2c   OP_Rowid, csr1,
d200: 20 72 65 67 31 29 3b 0a 20 20 73 71 6c 69 74 65   reg1);.  sqlite
d210: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
d220: 50 5f 52 6f 77 69 64 2c 20 63 73 72 32 2c 20 72  P_Rowid, csr2, r
d230: 65 67 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  eg2);.  sqlite3V
d240: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
d250: 47 74 2c 20 72 65 67 32 2c 20 6c 62 6c 2c 20 72  Gt, reg2, lbl, r
d260: 65 67 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  eg1);.  sqlite3R
d270: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
d280: 61 72 73 65 2c 20 72 65 67 31 29 3b 0a 20 20 73  arse, reg1);.  s
d290: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
d2a0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
d2b0: 32 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  2);.}..static in
d2c0: 74 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 0a  t windowCodeOp(.
d2d0: 20 57 69 6e 64 6f 77 43 6f 64 65 41 72 67 20 2a   WindowCodeArg *
d2e0: 70 2c 0a 20 69 6e 74 20 6f 70 2c 0a 20 69 6e 74  p,. int op,. int
d2f0: 20 72 65 67 43 6f 75 6e 74 64 6f 77 6e 2c 0a 20   regCountdown,. 
d300: 69 6e 74 20 6a 75 6d 70 4f 6e 45 6f 66 0a 29 7b  int jumpOnEof.){
d310: 0a 20 20 69 6e 74 20 63 73 72 2c 20 72 65 67 3b  .  int csr, reg;
d320: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
d330: 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20   = p->pParse;.  
d340: 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20  Window *pMWin = 
d350: 70 2d 3e 70 4d 57 69 6e 3b 0a 20 20 69 6e 74 20  p->pMWin;.  int 
d360: 72 65 74 20 3d 20 30 3b 0a 20 20 56 64 62 65 20  ret = 0;.  Vdbe 
d370: 2a 76 20 3d 20 70 2d 3e 70 56 64 62 65 3b 0a 20  *v = p->pVdbe;. 
d380: 20 69 6e 74 20 61 64 64 72 49 66 20 3d 20 30 3b   int addrIf = 0;
d390: 20 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74   .  int addrCont
d3a0: 69 6e 75 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  inue = 0;.  int 
d3b0: 61 64 64 72 47 6f 74 6f 20 3d 20 30 3b 0a 20 20  addrGoto = 0;.  
d3c0: 69 6e 74 20 62 50 65 65 72 20 3d 20 28 70 4d 57  int bPeer = (pMW
d3d0: 69 6e 2d 3e 65 54 79 70 65 21 3d 54 4b 5f 52 4f  in->eType!=TK_RO
d3e0: 57 53 29 3b 0a 0a 20 20 69 6e 74 20 6c 62 6c 44  WS);..  int lblD
d3f0: 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  one = sqlite3Vdb
d400: 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
d410: 65 29 3b 0a 20 20 69 6e 74 20 61 64 64 72 4e 65  e);.  int addrNe
d420: 78 74 52 61 6e 67 65 20 3d 20 30 3b 0a 0a 20 20  xtRange = 0;..  
d430: 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 20  /* Special case 
d440: 2d 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45  - WINDOW_AGGINVE
d450: 52 53 45 20 69 73 20 61 6c 77 61 79 73 20 61 20  RSE is always a 
d460: 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 66 72 61  no-op if the fra
d470: 6d 65 0a 20 20 2a 2a 20 73 74 61 72 74 73 20 77  me.  ** starts w
d480: 69 74 68 20 55 4e 42 4f 55 4e 44 45 44 20 50 52  ith UNBOUNDED PR
d490: 45 43 45 44 49 4e 47 2e 20 2a 2f 0a 20 20 69 66  ECEDING. */.  if
d4a0: 28 20 6f 70 3d 3d 57 49 4e 44 4f 57 5f 41 47 47  ( op==WINDOW_AGG
d4b0: 49 4e 56 45 52 53 45 20 26 26 20 70 4d 57 69 6e  INVERSE && pMWin
d4c0: 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42  ->eStart==TK_UNB
d4d0: 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20 20 61 73  OUNDED ){.    as
d4e0: 73 65 72 74 28 20 72 65 67 43 6f 75 6e 74 64 6f  sert( regCountdo
d4f0: 77 6e 3d 3d 30 20 26 26 20 6a 75 6d 70 4f 6e 45  wn==0 && jumpOnE
d500: 6f 66 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74  of==0 );.    ret
d510: 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66  urn 0;.  }..  if
d520: 28 20 72 65 67 43 6f 75 6e 74 64 6f 77 6e 3e 30  ( regCountdown>0
d530: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 57 69   ){.    if( pMWi
d540: 6e 2d 3e 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e  n->eType==TK_RAN
d550: 47 45 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72  GE ){.      addr
d560: 4e 65 78 74 52 61 6e 67 65 20 3d 20 73 71 6c 69  NextRange = sqli
d570: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
d580: 64 72 28 76 29 3b 0a 0a 20 20 20 20 20 20 73 77  dr(v);..      sw
d590: 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
d5a0: 20 20 20 20 63 61 73 65 20 57 49 4e 44 4f 57 5f      case WINDOW_
d5b0: 52 45 54 55 52 4e 5f 52 4f 57 3a 20 7b 0a 20 20  RETURN_ROW: {.  
d5c0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
d5d0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  0 );.          b
d5e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
d5f0: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 57 49  .        case WI
d600: 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 3a  NDOW_AGGINVERSE:
d610: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   {.          if(
d620: 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d   pMWin->eStart==
d630: 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a  TK_FOLLOWING ){.
d640: 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 64              wind
d650: 6f 77 43 6f 64 65 52 61 6e 67 65 54 65 73 74 28  owCodeRangeTest(
d660: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d670: 20 70 2c 20 4f 50 5f 4c 65 2c 20 70 2d 3e 63 75   p, OP_Le, p->cu
d680: 72 72 65 6e 74 2e 63 73 72 2c 20 72 65 67 43 6f  rrent.csr, regCo
d690: 75 6e 74 64 6f 77 6e 2c 20 70 2d 3e 73 74 61 72  untdown, p->star
d6a0: 74 2e 63 73 72 2c 20 6c 62 6c 44 6f 6e 65 0a 20  t.csr, lblDone. 
d6b0: 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20             );.  
d6c0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
d6d0: 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 64 6f             windo
d6e0: 77 43 6f 64 65 52 61 6e 67 65 54 65 73 74 28 0a  wCodeRangeTest(.
d6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d700: 70 2c 20 4f 50 5f 47 65 2c 20 70 2d 3e 73 74 61  p, OP_Ge, p->sta
d710: 72 74 2e 63 73 72 2c 20 72 65 67 43 6f 75 6e 74  rt.csr, regCount
d720: 64 6f 77 6e 2c 20 70 2d 3e 63 75 72 72 65 6e 74  down, p->current
d730: 2e 63 73 72 2c 20 6c 62 6c 44 6f 6e 65 0a 20 20  .csr, lblDone.  
d740: 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
d750: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d760: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
d770: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 61 73    }..        cas
d780: 65 20 57 49 4e 44 4f 57 5f 41 47 47 53 54 45 50  e WINDOW_AGGSTEP
d790: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 77 69  : {.          wi
d7a0: 6e 64 6f 77 43 6f 64 65 52 61 6e 67 65 54 65 73  ndowCodeRangeTes
d7b0: 74 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  t(.            p
d7c0: 2c 20 4f 50 5f 47 74 2c 20 70 2d 3e 65 6e 64 2e  , OP_Gt, p->end.
d7d0: 63 73 72 2c 20 72 65 67 43 6f 75 6e 74 64 6f 77  csr, regCountdow
d7e0: 6e 2c 20 70 2d 3e 63 75 72 72 65 6e 74 2e 63 73  n, p->current.cs
d7f0: 72 2c 20 6c 62 6c 44 6f 6e 65 0a 20 20 20 20 20  r, lblDone.     
d800: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
d810: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
d820: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
d830: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64  }else{.      add
d840: 72 49 66 20 3d 20 73 71 6c 69 74 65 33 56 64 62  rIf = sqlite3Vdb
d850: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
d860: 50 6f 73 2c 20 72 65 67 43 6f 75 6e 74 64 6f 77  Pos, regCountdow
d870: 6e 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  n, 0, 1);.    }.
d880: 20 20 7d 0a 0a 20 20 69 66 28 20 6f 70 3d 3d 57    }..  if( op==W
d890: 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57  INDOW_RETURN_ROW
d8a0: 20 29 7b 0a 20 20 20 20 77 69 6e 64 6f 77 41 67   ){.    windowAg
d8b0: 67 46 69 6e 61 6c 28 70 50 61 72 73 65 2c 20 70  gFinal(pParse, p
d8c0: 4d 57 69 6e 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  MWin, 0);.  }.  
d8d0: 61 64 64 72 43 6f 6e 74 69 6e 75 65 20 3d 20 73  addrContinue = s
d8e0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
d8f0: 74 41 64 64 72 28 76 29 3b 0a 20 20 73 77 69 74  tAddr(v);.  swit
d900: 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
d910: 73 65 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e  se WINDOW_RETURN
d920: 5f 52 4f 57 3a 0a 20 20 20 20 20 20 63 73 72 20  _ROW:.      csr 
d930: 3d 20 70 2d 3e 63 75 72 72 65 6e 74 2e 63 73 72  = p->current.csr
d940: 3b 0a 20 20 20 20 20 20 72 65 67 20 3d 20 70 2d  ;.      reg = p-
d950: 3e 63 75 72 72 65 6e 74 2e 72 65 67 3b 0a 20 20  >current.reg;.  
d960: 20 20 20 20 77 69 6e 64 6f 77 52 65 74 75 72 6e      windowReturn
d970: 4f 6e 65 52 6f 77 28 70 50 61 72 73 65 2c 20 70  OneRow(pParse, p
d980: 4d 57 69 6e 2c 20 70 2d 3e 72 65 67 47 6f 73 75  MWin, p->regGosu
d990: 62 2c 20 70 2d 3e 61 64 64 72 47 6f 73 75 62 29  b, p->addrGosub)
d9a0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
d9b0: 20 20 20 20 63 61 73 65 20 57 49 4e 44 4f 57 5f      case WINDOW_
d9c0: 41 47 47 49 4e 56 45 52 53 45 3a 0a 20 20 20 20  AGGINVERSE:.    
d9d0: 20 20 63 73 72 20 3d 20 70 2d 3e 73 74 61 72 74    csr = p->start
d9e0: 2e 63 73 72 3b 0a 20 20 20 20 20 20 72 65 67 20  .csr;.      reg 
d9f0: 3d 20 70 2d 3e 73 74 61 72 74 2e 72 65 67 3b 0a  = p->start.reg;.
da00: 20 20 20 20 20 20 77 69 6e 64 6f 77 41 67 67 53        windowAggS
da10: 74 65 70 28 70 50 61 72 73 65 2c 20 70 4d 57 69  tep(pParse, pMWi
da20: 6e 2c 20 63 73 72 2c 20 31 2c 20 70 2d 3e 72 65  n, csr, 1, p->re
da30: 67 41 72 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  gArg, 0);.      
da40: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
da50: 20 57 49 4e 44 4f 57 5f 41 47 47 53 54 45 50 3a   WINDOW_AGGSTEP:
da60: 0a 20 20 20 20 20 20 63 73 72 20 3d 20 70 2d 3e  .      csr = p->
da70: 65 6e 64 2e 63 73 72 3b 0a 20 20 20 20 20 20 72  end.csr;.      r
da80: 65 67 20 3d 20 70 2d 3e 65 6e 64 2e 72 65 67 3b  eg = p->end.reg;
da90: 0a 20 20 20 20 20 20 77 69 6e 64 6f 77 41 67 67  .      windowAgg
daa0: 53 74 65 70 28 70 50 61 72 73 65 2c 20 70 4d 57  Step(pParse, pMW
dab0: 69 6e 2c 20 63 73 72 2c 20 30 2c 20 70 2d 3e 72  in, csr, 0, p->r
dac0: 65 67 41 72 67 2c 20 30 29 3b 0a 20 20 20 20 20  egArg, 0);.     
dad0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69   break;.  }..  i
dae0: 66 28 20 6a 75 6d 70 4f 6e 45 6f 66 20 29 7b 0a  f( jumpOnEof ){.
daf0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
db00: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
db10: 2c 20 63 73 72 2c 20 73 71 6c 69 74 65 33 56 64  , csr, sqlite3Vd
db20: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
db30: 2b 32 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 73  +2);.    ret = s
db40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
db50: 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20  (v, OP_Goto);.  
db60: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
db70: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
db80: 4f 50 5f 4e 65 78 74 2c 20 63 73 72 2c 20 73 71  OP_Next, csr, sq
db90: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
dba0: 41 64 64 72 28 76 29 2b 31 2b 62 50 65 65 72 29  Addr(v)+1+bPeer)
dbb0: 3b 0a 20 20 20 20 69 66 28 20 62 50 65 65 72 20  ;.    if( bPeer 
dbc0: 29 7b 0a 20 20 20 20 20 20 61 64 64 72 47 6f 74  ){.      addrGot
dbd0: 6f 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  o = sqlite3VdbeA
dbe0: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp0(v, OP_Goto
dbf0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
dc00: 69 66 28 20 62 50 65 65 72 20 29 7b 0a 20 20 20  if( bPeer ){.   
dc10: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 69   int addr;.    i
dc20: 6e 74 20 6e 52 65 67 20 3d 20 28 70 4d 57 69 6e  nt nReg = (pMWin
dc30: 2d 3e 70 4f 72 64 65 72 42 79 20 3f 20 70 4d 57  ->pOrderBy ? pMW
dc40: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  in->pOrderBy->nE
dc50: 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 69 6e  xpr : 0);.    in
dc60: 74 20 72 65 67 54 6d 70 20 3d 20 28 6e 52 65 67  t regTmp = (nReg
dc70: 20 3f 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   ? sqlite3GetTem
dc80: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
dc90: 52 65 67 29 20 3a 20 30 29 3b 0a 20 20 20 20 77  Reg) : 0);.    w
dca0: 69 6e 64 6f 77 52 65 61 64 50 65 65 72 56 61 6c  indowReadPeerVal
dcb0: 75 65 73 28 70 2c 20 63 73 72 2c 20 72 65 67 54  ues(p, csr, regT
dcc0: 6d 70 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 49  mp);.    windowI
dcd0: 66 4e 65 77 50 65 65 72 28 70 50 61 72 73 65 2c  fNewPeer(pParse,
dce0: 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79   pMWin->pOrderBy
dcf0: 2c 20 72 65 67 54 6d 70 2c 20 72 65 67 2c 20 61  , regTmp, reg, a
dd00: 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  ddrContinue);.  
dd10: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
dd20: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
dd30: 2c 20 72 65 67 54 6d 70 2c 20 6e 52 65 67 29 3b  , regTmp, nReg);
dd40: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 61 64 64 72  .  }..  if( addr
dd50: 4e 65 78 74 52 61 6e 67 65 20 29 7b 0a 20 20 20  NextRange ){.   
dd60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
dd70: 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
dd80: 2c 20 61 64 64 72 4e 65 78 74 52 61 6e 67 65 29  , addrNextRange)
dd90: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
dda0: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
ddb0: 76 2c 20 6c 62 6c 44 6f 6e 65 29 3b 0a 20 20 69  v, lblDone);.  i
ddc0: 66 28 20 61 64 64 72 47 6f 74 6f 20 29 20 73 71  f( addrGoto ) sq
ddd0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
dde0: 65 28 76 2c 20 61 64 64 72 47 6f 74 6f 29 3b 0a  e(v, addrGoto);.
ddf0: 20 20 69 66 28 20 61 64 64 72 49 66 20 29 20 73    if( addrIf ) s
de00: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
de10: 72 65 28 76 2c 20 61 64 64 72 49 66 29 3b 0a 20  re(v, addrIf);. 
de20: 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a   return ret;.}..
de30: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
de40: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64 75 70  and return a dup
de50: 6c 69 63 61 74 65 20 6f 66 20 74 68 65 20 57 69  licate of the Wi
de60: 6e 64 6f 77 20 6f 62 6a 65 63 74 20 69 6e 64 69  ndow object indi
de70: 63 61 74 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  cated by the.** 
de80: 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 2e 20  third argument. 
de90: 53 65 74 20 74 68 65 20 57 69 6e 64 6f 77 2e 70  Set the Window.p
dea0: 4f 77 6e 65 72 20 66 69 65 6c 64 20 6f 66 20 74  Owner field of t
deb0: 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 74 6f  he new object to
dec0: 0a 2a 2a 20 70 4f 77 6e 65 72 2e 0a 2a 2f 0a 57  .** pOwner..*/.W
ded0: 69 6e 64 6f 77 20 2a 73 71 6c 69 74 65 33 57 69  indow *sqlite3Wi
dee0: 6e 64 6f 77 44 75 70 28 73 71 6c 69 74 65 33 20  ndowDup(sqlite3 
def0: 2a 64 62 2c 20 45 78 70 72 20 2a 70 4f 77 6e 65  *db, Expr *pOwne
df00: 72 2c 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20  r, Window *p){. 
df10: 20 57 69 6e 64 6f 77 20 2a 70 4e 65 77 20 3d 20   Window *pNew = 
df20: 30 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  0;.  if( ALWAYS(
df30: 70 29 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d  p) ){.    pNew =
df40: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
df50: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
df60: 57 69 6e 64 6f 77 29 29 3b 0a 20 20 20 20 69 66  Window));.    if
df70: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
df80: 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  pNew->zName = sq
df90: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
dfa0: 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  , p->zName);.   
dfb0: 20 20 20 70 4e 65 77 2d 3e 70 46 69 6c 74 65 72     pNew->pFilter
dfc0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
dfd0: 70 28 64 62 2c 20 70 2d 3e 70 46 69 6c 74 65 72  p(db, p->pFilter
dfe0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  , 0);.      pNew
dff0: 2d 3e 70 46 75 6e 63 20 3d 20 70 2d 3e 70 46 75  ->pFunc = p->pFu
e000: 6e 63 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  nc;.      pNew->
e010: 70 50 61 72 74 69 74 69 6f 6e 20 3d 20 73 71 6c  pPartition = sql
e020: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
e030: 64 62 2c 20 70 2d 3e 70 50 61 72 74 69 74 69 6f  db, p->pPartitio
e040: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65  n, 0);.      pNe
e050: 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71  w->pOrderBy = sq
e060: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
e070: 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
e080: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  , 0);.      pNew
e090: 2d 3e 65 54 79 70 65 20 3d 20 70 2d 3e 65 54 79  ->eType = p->eTy
e0a0: 70 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  pe;.      pNew->
e0b0: 65 45 6e 64 20 3d 20 70 2d 3e 65 45 6e 64 3b 0a  eEnd = p->eEnd;.
e0c0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 65 53 74 61        pNew->eSta
e0d0: 72 74 20 3d 20 70 2d 3e 65 53 74 61 72 74 3b 0a  rt = p->eStart;.
e0e0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 53 74 61        pNew->pSta
e0f0: 72 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  rt = sqlite3Expr
e100: 44 75 70 28 64 62 2c 20 70 2d 3e 70 53 74 61 72  Dup(db, p->pStar
e110: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65  t, 0);.      pNe
e120: 77 2d 3e 70 45 6e 64 20 3d 20 73 71 6c 69 74 65  w->pEnd = sqlite
e130: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
e140: 70 45 6e 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  pEnd, 0);.      
e150: 70 4e 65 77 2d 3e 70 4f 77 6e 65 72 20 3d 20 70  pNew->pOwner = p
e160: 4f 77 6e 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  Owner;.    }.  }
e170: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
e180: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
e190: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6c 69  a copy of the li
e1a0: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 57 69 6e  nked list of Win
e1b0: 64 6f 77 20 6f 62 6a 65 63 74 73 20 70 61 73 73  dow objects pass
e1c0: 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 73 65 63  ed as the.** sec
e1d0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
e1e0: 0a 57 69 6e 64 6f 77 20 2a 73 71 6c 69 74 65 33  .Window *sqlite3
e1f0: 57 69 6e 64 6f 77 4c 69 73 74 44 75 70 28 73 71  WindowListDup(sq
e200: 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 6e 64 6f  lite3 *db, Windo
e210: 77 20 2a 70 29 7b 0a 20 20 57 69 6e 64 6f 77 20  w *p){.  Window 
e220: 2a 70 57 69 6e 3b 0a 20 20 57 69 6e 64 6f 77 20  *pWin;.  Window 
e230: 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 57 69 6e  *pRet = 0;.  Win
e240: 64 6f 77 20 2a 2a 70 70 20 3d 20 26 70 52 65 74  dow **pp = &pRet
e250: 3b 0a 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70 3b  ;..  for(pWin=p;
e260: 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e   pWin; pWin=pWin
e270: 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20  ->pNextWin){.   
e280: 20 2a 70 70 20 3d 20 73 71 6c 69 74 65 33 57 69   *pp = sqlite3Wi
e290: 6e 64 6f 77 44 75 70 28 64 62 2c 20 30 2c 20 70  ndowDup(db, 0, p
e2a0: 57 69 6e 29 3b 0a 20 20 20 20 69 66 28 20 2a 70  Win);.    if( *p
e2b0: 70 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  p==0 ) break;.  
e2c0: 20 20 70 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e    pp = &((*pp)->
e2d0: 70 4e 65 78 74 57 69 6e 29 3b 0a 20 20 7d 0a 0a  pNextWin);.  }..
e2e0: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
e2f0: 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 57  ../*.** sqlite3W
e300: 68 65 72 65 42 65 67 69 6e 28 29 20 68 61 73 20  hereBegin() has 
e310: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
e320: 6c 65 64 20 66 6f 72 20 74 68 65 20 53 45 4c 45  led for the SELE
e330: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a  CT statement .**
e340: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
e350: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 77  econd argument w
e360: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
e370: 6e 20 69 73 20 69 6e 76 6f 6b 65 64 2e 20 49 74  n is invoked. It
e380: 20 67 65 6e 65 72 61 74 65 73 0a 2a 2a 20 63 6f   generates.** co
e390: 64 65 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74  de to populate t
e3a0: 68 65 20 57 69 6e 64 6f 77 2e 72 65 67 52 65 73  he Window.regRes
e3b0: 75 6c 74 20 72 65 67 69 73 74 65 72 20 66 6f 72  ult register for
e3c0: 20 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e   each window fun
e3d0: 63 74 69 6f 6e 20 0a 2a 2a 20 61 6e 64 20 69 6e  ction .** and in
e3e0: 76 6f 6b 65 20 74 68 65 20 73 75 62 2d 72 6f 75  voke the sub-rou
e3f0: 74 69 6e 65 20 61 74 20 69 6e 73 74 72 75 63 74  tine at instruct
e400: 69 6f 6e 20 61 64 64 72 47 6f 73 75 62 20 6f 6e  ion addrGosub on
e410: 63 65 20 66 6f 72 20 65 61 63 68 20 72 6f 77 2e  ce for each row.
e420: 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65  .** sqlite3Where
e430: 45 6e 64 28 29 20 69 73 20 61 6c 77 61 79 73 20  End() is always 
e440: 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 72 65  called before re
e450: 74 75 72 6e 69 6e 67 2e 20 0a 2a 2a 0a 2a 2a 20  turning. .**.** 
e460: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61  This function ha
e470: 6e 64 6c 65 73 20 73 65 76 65 72 61 6c 20 64 69  ndles several di
e480: 66 66 65 72 65 6e 74 20 74 79 70 65 73 20 6f 66  fferent types of
e490: 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 73 2c 20   window frames, 
e4a0: 77 68 69 63 68 0a 2a 2a 20 72 65 71 75 69 72 65  which.** require
e4b0: 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72   slightly differ
e4c0: 65 6e 74 20 70 72 6f 63 65 73 73 69 6e 67 2e 20  ent processing. 
e4d0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 73  The following ps
e4e0: 65 75 64 6f 20 63 6f 64 65 20 69 73 0a 2a 2a 20  eudo code is.** 
e4f0: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
e500: 74 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 73 20  t window frames 
e510: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
e520: 2a 2a 20 20 20 52 4f 57 53 20 42 45 54 57 45 45  **   ROWS BETWEE
e530: 4e 20 3c 65 78 70 72 31 3e 20 50 52 45 43 45 44  N <expr1> PRECED
e540: 49 4e 47 20 41 4e 44 20 3c 65 78 70 72 32 3e 20  ING AND <expr2> 
e550: 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20  FOLLOWING.**.** 
e560: 4f 74 68 65 72 20 77 69 6e 64 6f 77 20 66 72 61  Other window fra
e570: 6d 65 20 74 79 70 65 73 20 75 73 65 20 76 61 72  me types use var
e580: 69 61 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 6c  iants of the fol
e590: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
e5a0: 20 20 2e 2e 2e 20 6c 6f 6f 70 20 73 74 61 72 74    ... loop start
e5b0: 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  ed by sqlite3Whe
e5c0: 72 65 42 65 67 69 6e 28 29 20 2e 2e 2e 0a 2a 2a  reBegin() ....**
e5d0: 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 20 70         if( new p
e5e0: 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20  artition ){.**  
e5f0: 20 20 20 20 20 20 20 47 6f 73 75 62 20 66 6c 75         Gosub flu
e600: 73 68 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a  sh.**       }.**
e610: 20 20 20 20 20 20 20 49 6e 73 65 72 74 20 6e 65         Insert ne
e620: 77 20 72 6f 77 20 69 6e 74 6f 20 65 70 68 20 74  w row into eph t
e630: 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 20 20 0a  able..**       .
e640: 2a 2a 20 20 20 20 20 20 20 69 66 28 20 66 69 72  **       if( fir
e650: 73 74 20 72 6f 77 20 6f 66 20 70 61 72 74 69 74  st row of partit
e660: 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  ion ){.**       
e670: 20 20 2f 2f 20 52 65 77 69 6e 64 20 74 68 72 65    // Rewind thre
e680: 65 20 63 75 72 73 6f 72 73 2c 20 61 6c 6c 20 6f  e cursors, all o
e690: 70 65 6e 20 6f 6e 20 74 68 65 20 65 70 68 20 74  pen on the eph t
e6a0: 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20  able..**        
e6b0: 20 52 65 77 69 6e 64 28 63 73 72 45 6e 64 29 3b   Rewind(csrEnd);
e6c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 65 77 69  .**         Rewi
e6d0: 6e 64 28 63 73 72 53 74 61 72 74 29 3b 0a 2a 2a  nd(csrStart);.**
e6e0: 20 20 20 20 20 20 20 20 20 52 65 77 69 6e 64 28           Rewind(
e6f0: 63 73 72 43 75 72 72 65 6e 74 29 3b 0a 2a 2a 20  csrCurrent);.** 
e700: 20 20 20 20 20 20 0a 2a 2a 20 20 20 20 20 20 20        .**       
e710: 20 20 72 65 67 45 6e 64 20 3d 20 3c 65 78 70 72    regEnd = <expr
e720: 32 3e 20 20 20 20 20 20 20 20 20 20 2f 2f 20 46  2>          // F
e730: 4f 4c 4c 4f 57 49 4e 47 20 65 78 70 72 65 73 73  OLLOWING express
e740: 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 72  ion.**         r
e750: 65 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72 31  egStart = <expr1
e760: 3e 20 20 20 20 20 20 20 20 2f 2f 20 50 52 45 43  >        // PREC
e770: 45 44 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e  EDING expression
e780: 0a 2a 2a 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  .**       }else{
e790: 0a 2a 2a 20 20 20 20 20 20 20 20 20 2f 2f 20 46  .**         // F
e7a0: 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 62  irst time this b
e7b0: 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 2c 20  ranch is taken, 
e7c0: 74 68 65 20 65 70 68 20 74 61 62 6c 65 20 63 6f  the eph table co
e7d0: 6e 74 61 69 6e 73 20 74 77 6f 20 0a 2a 2a 20 20  ntains two .**  
e7e0: 20 20 20 20 20 20 20 2f 2f 20 72 6f 77 73 2e 20         // rows. 
e7f0: 54 68 65 20 66 69 72 73 74 20 72 6f 77 20 69 6e  The first row in
e800: 20 74 68 65 20 70 61 72 74 69 74 69 6f 6e 2c 20   the partition, 
e810: 77 68 69 63 68 20 61 6c 6c 20 74 68 72 65 65 20  which all three 
e820: 63 75 72 73 6f 72 73 0a 2a 2a 20 20 20 20 20 20  cursors.**      
e830: 20 20 20 2f 2f 20 63 75 72 72 65 6e 74 6c 79 20     // currently 
e840: 70 6f 69 6e 74 20 74 6f 2c 20 61 6e 64 20 74 68  point to, and th
e850: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 77 2e  e following row.
e860: 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 47 47 53  .**         AGGS
e870: 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 20 20 69  TEP.**         i
e880: 66 28 20 28 72 65 67 45 6e 64 2d 2d 29 3c 3d 30  f( (regEnd--)<=0
e890: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   ){.**          
e8a0: 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20   RETURN_ROW.**  
e8b0: 20 20 20 20 20 20 20 20 20 69 66 28 20 28 72 65           if( (re
e8c0: 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a  gStart--)<=0 ){.
e8d0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 41  **             A
e8e0: 47 47 49 4e 56 45 52 53 45 0a 2a 2a 20 20 20 20  GGINVERSE.**    
e8f0: 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
e900: 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 7d      }.**       }
e910: 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  .**     }.**    
e920: 20 66 6c 75 73 68 3a 0a 2a 2a 20 20 20 20 20 20   flush:.**      
e930: 20 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20 20   AGGSTEP.**     
e940: 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 2a 2a    while( 1 ){.**
e950: 20 20 20 20 20 20 20 20 20 52 45 54 55 52 4e 20           RETURN 
e960: 52 4f 57 0a 2a 2a 20 20 20 20 20 20 20 20 20 69  ROW.**         i
e970: 66 28 20 63 73 72 43 75 72 72 65 6e 74 20 69 73  f( csrCurrent is
e980: 20 45 4f 46 20 29 20 62 72 65 61 6b 3b 0a 2a 2a   EOF ) break;.**
e990: 20 20 20 20 20 20 20 20 20 69 66 28 20 28 72 65           if( (re
e9a0: 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a  gStart--)<=0 ){.
e9b0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 67 67  **           Agg
e9c0: 49 6e 76 65 72 73 65 28 63 73 72 53 74 61 72 74  Inverse(csrStart
e9d0: 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 4e  ).**           N
e9e0: 65 78 74 28 63 73 72 53 74 61 72 74 29 0a 2a 2a  ext(csrStart).**
e9f0: 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20           }.**   
ea00: 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 54 68 65 20      }.**.** The 
ea10: 70 73 65 75 64 6f 2d 63 6f 64 65 20 61 62 6f 76  pseudo-code abov
ea20: 65 20 75 73 65 73 20 74 68 65 20 66 6f 6c 6c 6f  e uses the follo
ea30: 77 69 6e 67 20 73 68 6f 72 74 68 61 6e 64 3a 0a  wing shorthand:.
ea40: 2a 2a 0a 2a 2a 20 20 20 41 47 47 53 54 45 50 3a  **.**   AGGSTEP:
ea50: 20 20 20 20 69 6e 76 6f 6b 65 20 74 68 65 20 61      invoke the a
ea60: 67 67 72 65 67 61 74 65 20 78 53 74 65 70 28 29  ggregate xStep()
ea70: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65 61   function for ea
ea80: 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  ch window functi
ea90: 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  on.**           
eaa0: 20 20 20 20 77 69 74 68 20 61 72 67 75 6d 65 6e      with argumen
eab0: 74 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ts read from the
eac0: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
ead0: 63 75 72 73 6f 72 20 63 73 72 45 6e 64 2c 20 74  cursor csrEnd, t
eae0: 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hen.**          
eaf0: 20 20 20 20 20 73 74 65 70 20 63 75 72 73 6f 72       step cursor
eb00: 20 63 73 72 45 6e 64 20 66 6f 72 77 61 72 64 20   csrEnd forward 
eb10: 6f 6e 65 20 72 6f 77 20 28 69 2e 65 2e 20 73 71  one row (i.e. sq
eb20: 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29  lite3BtreeNext()
eb30: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 52 45 54 55 52  )..**.**   RETUR
eb40: 4e 5f 52 4f 57 3a 20 72 65 74 75 72 6e 20 61 20  N_ROW: return a 
eb50: 72 6f 77 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  row to the calle
eb60: 72 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63  r based on the c
eb70: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a  ontents of the .
eb80: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
eb90: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
eba0: 63 73 72 43 75 72 72 65 6e 74 20 61 6e 64 20 74  csrCurrent and t
ebb0: 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
ebc0: 20 6f 66 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 20   of all .**     
ebd0: 20 20 20 20 20 20 20 20 20 20 61 67 67 72 65 67            aggreg
ebe0: 61 74 65 73 2e 20 54 68 65 6e 20 73 74 65 70 20  ates. Then step 
ebf0: 63 75 72 73 6f 72 20 63 73 72 43 75 72 72 65 6e  cursor csrCurren
ec00: 74 20 66 6f 72 77 61 72 64 20 6f 6e 65 20 72 6f  t forward one ro
ec10: 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 41 47 47 49 4e  w..**.**   AGGIN
ec20: 56 45 52 53 45 3a 20 69 6e 76 6f 6b 65 20 74 68  VERSE: invoke th
ec30: 65 20 61 67 67 72 65 67 61 74 65 20 78 49 6e 76  e aggregate xInv
ec40: 65 72 73 65 28 29 20 66 75 6e 63 74 69 6f 6e 20  erse() function 
ec50: 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77 20  for each window 
ec60: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
ec70: 20 20 66 75 6e 63 74 69 6f 6e 73 20 77 69 74 68    functions with
ec80: 20 61 72 67 75 6d 65 6e 74 73 20 72 65 61 64 20   arguments read 
ec90: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
eca0: 20 72 6f 77 20 6f 66 20 63 75 72 73 6f 72 0a 2a   row of cursor.*
ecb0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
ecc0: 63 73 72 53 74 61 72 74 2e 20 54 68 65 6e 20 73  csrStart. Then s
ecd0: 74 65 70 20 63 73 72 53 74 61 72 74 20 66 6f 72  tep csrStart for
ece0: 77 61 72 64 20 6f 6e 65 20 72 6f 77 2e 0a 2a 2a  ward one row..**
ecf0: 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 74 77  .** There are tw
ed00: 6f 20 6f 74 68 65 72 20 52 4f 57 53 20 77 69 6e  o other ROWS win
ed10: 64 6f 77 20 66 72 61 6d 65 73 20 74 68 61 74 20  dow frames that 
ed20: 61 72 65 20 68 61 6e 64 6c 65 64 20 73 69 67 6e  are handled sign
ed30: 69 66 69 63 61 6e 74 6c 79 0a 2a 2a 20 64 69 66  ificantly.** dif
ed40: 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d 20 74 68  ferently from th
ed50: 65 20 61 62 6f 76 65 20 2d 20 22 42 45 54 57 45  e above - "BETWE
ed60: 45 4e 20 3c 65 78 70 72 3e 20 50 52 45 43 45 44  EN <expr> PRECED
ed70: 49 4e 47 20 41 4e 44 20 3c 65 78 70 72 3e 20 50  ING AND <expr> P
ed80: 52 45 43 45 44 49 4e 47 22 0a 2a 2a 20 61 6e 64  RECEDING".** and
ed90: 20 22 42 45 54 57 45 45 4e 20 3c 65 78 70 72 3e   "BETWEEN <expr>
eda0: 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e 44 20 3c   FOLLOWING AND <
edb0: 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 22  expr> FOLLOWING"
edc0: 2e 20 54 68 65 73 65 20 61 72 65 20 73 70 65 63  . These are spec
edd0: 69 61 6c 20 0a 2a 2a 20 63 61 73 65 73 20 62 65  ial .** cases be
ede0: 63 61 75 73 65 20 74 68 65 79 20 63 68 61 6e 67  cause they chang
edf0: 65 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77  e the order in w
ee00: 68 69 63 68 20 74 68 65 20 74 68 72 65 65 20 63  hich the three c
ee10: 75 72 73 6f 72 73 20 28 63 73 72 53 74 61 72 74  ursors (csrStart
ee20: 2c 0a 2a 2a 20 63 73 72 43 75 72 72 65 6e 74 20  ,.** csrCurrent 
ee30: 61 6e 64 20 63 73 72 45 6e 64 29 20 69 74 65 72  and csrEnd) iter
ee40: 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20  ate through the 
ee50: 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e  ephemeral table.
ee60: 20 43 61 73 65 73 20 74 68 61 74 0a 2a 2a 20 75   Cases that.** u
ee70: 73 65 20 55 4e 42 4f 55 4e 44 45 44 20 6f 72 20  se UNBOUNDED or 
ee80: 43 55 52 52 45 4e 54 20 52 4f 57 20 61 72 65 20  CURRENT ROW are 
ee90: 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 76 61 72  much simpler var
eea0: 69 61 74 69 6f 6e 73 20 6f 6e 20 6f 6e 65 20 6f  iations on one o
eeb0: 66 20 74 68 65 73 65 0a 2a 2a 20 74 68 72 65 65  f these.** three
eec0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57 53 20 42  ..**.**   ROWS B
eed0: 45 54 57 45 45 4e 20 3c 65 78 70 72 31 3e 20 50  ETWEEN <expr1> P
eee0: 52 45 43 45 44 49 4e 47 20 41 4e 44 20 3c 65 78  RECEDING AND <ex
eef0: 70 72 32 3e 20 50 52 45 43 45 44 49 4e 47 0a 2a  pr2> PRECEDING.*
ef00: 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 6c 6f 6f  *.**     ... loo
ef10: 70 20 73 74 61 72 74 65 64 20 62 79 20 73 71 6c  p started by sql
ef20: 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
ef30: 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 69 66   ....**       if
ef40: 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 20  ( new partition 
ef50: 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 47 6f  ){.**         Go
ef60: 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20 20 20  sub flush.**    
ef70: 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 49 6e     }.**       In
ef80: 73 65 72 74 20 6e 65 77 20 72 6f 77 20 69 6e 74  sert new row int
ef90: 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a 2a 2a 20  o eph table..** 
efa0: 20 20 20 20 20 20 69 66 28 20 66 69 72 73 74 20        if( first 
efb0: 72 6f 77 20 6f 66 20 70 61 72 74 69 74 69 6f 6e  row of partition
efc0: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 52   ){.**         R
efd0: 65 77 69 6e 64 28 63 73 72 45 6e 64 29 20 3b 20  ewind(csrEnd) ; 
efe0: 52 65 77 69 6e 64 28 63 73 72 53 74 61 72 74 29  Rewind(csrStart)
eff0: 20 3b 20 52 65 77 69 6e 64 28 63 73 72 43 75 72   ; Rewind(csrCur
f000: 72 65 6e 74 29 0a 2a 2a 20 20 20 20 20 20 20 20  rent).**        
f010: 20 72 65 67 45 6e 64 20 3d 20 3c 65 78 70 72 32   regEnd = <expr2
f020: 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20 72 65 67  >.**         reg
f030: 53 74 61 72 74 20 3d 20 3c 65 78 70 72 31 3e 0a  Start = <expr1>.
f040: 2a 2a 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  **       }else{.
f050: 2a 2a 20 20 20 20 20 20 20 20 20 69 66 28 20 28  **         if( (
f060: 72 65 67 45 6e 64 2d 2d 29 3c 3d 30 20 29 7b 0a  regEnd--)<=0 ){.
f070: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 47 47  **           AGG
f080: 53 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 20 20  STEP.**         
f090: 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 45 54  }.**         RET
f0a0: 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 20  URN_ROW.**      
f0b0: 20 20 20 69 66 28 20 28 72 65 67 53 74 61 72 74     if( (regStart
f0c0: 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20  --)<=0 ){.**    
f0d0: 20 20 20 20 20 20 20 41 47 47 49 4e 56 45 52 53         AGGINVERS
f0e0: 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a  E.**         }.*
f0f0: 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  *       }.**    
f100: 20 7d 0a 2a 2a 20 20 20 20 20 66 6c 75 73 68 3a   }.**     flush:
f110: 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 28 72  .**       if( (r
f120: 65 67 45 6e 64 2d 2d 29 3c 3d 30 20 29 7b 0a 2a  egEnd--)<=0 ){.*
f130: 2a 20 20 20 20 20 20 20 20 20 41 47 47 53 54 45  *         AGGSTE
f140: 50 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20  P.**       }.** 
f150: 20 20 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57        RETURN_ROW
f160: 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57 53  .**.**.**   ROWS
f170: 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31 3e   BETWEEN <expr1>
f180: 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e 44 20 3c   FOLLOWING AND <
f190: 65 78 70 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47  expr2> FOLLOWING
f1a0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 6c  .**.**     ... l
f1b0: 6f 6f 70 20 73 74 61 72 74 65 64 20 62 79 20 73  oop started by s
f1c0: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
f1d0: 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 69 66  () ....**     if
f1e0: 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 20  ( new partition 
f1f0: 29 7b 0a 2a 2a 20 20 20 20 20 20 20 47 6f 73 75  ){.**       Gosu
f200: 62 20 66 6c 75 73 68 0a 2a 2a 20 20 20 20 20 7d  b flush.**     }
f210: 0a 2a 2a 20 20 20 20 20 49 6e 73 65 72 74 20 6e  .**     Insert n
f220: 65 77 20 72 6f 77 20 69 6e 74 6f 20 65 70 68 20  ew row into eph 
f230: 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 69 66  table..**     if
f240: 28 20 66 69 72 73 74 20 72 6f 77 20 6f 66 20 70  ( first row of p
f250: 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20  artition ){.**  
f260: 20 20 20 20 20 52 65 77 69 6e 64 28 63 73 72 45       Rewind(csrE
f270: 6e 64 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72  nd) ; Rewind(csr
f280: 53 74 61 72 74 29 20 3b 20 52 65 77 69 6e 64 28  Start) ; Rewind(
f290: 63 73 72 43 75 72 72 65 6e 74 29 0a 2a 2a 20 20  csrCurrent).**  
f2a0: 20 20 20 20 20 72 65 67 45 6e 64 20 3d 20 3c 65       regEnd = <e
f2b0: 78 70 72 32 3e 0a 2a 2a 20 20 20 20 20 20 20 72  xpr2>.**       r
f2c0: 65 67 53 74 61 72 74 20 3d 20 72 65 67 45 6e 64  egStart = regEnd
f2d0: 20 2d 20 3c 65 78 70 72 31 3e 0a 2a 2a 20 20 20   - <expr1>.**   
f2e0: 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20 20 20    }else{.**     
f2f0: 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20    AGGSTEP.**    
f300: 20 20 20 69 66 28 20 28 72 65 67 45 6e 64 2d 2d     if( (regEnd--
f310: 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20  )<=0 ){.**      
f320: 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a     RETURN_ROW.**
f330: 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
f340: 20 20 69 66 28 20 28 72 65 67 53 74 61 72 74 2d    if( (regStart-
f350: 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20  -)<=0 ){.**     
f360: 20 20 20 20 41 47 47 49 4e 56 45 52 53 45 0a 2a      AGGINVERSE.*
f370: 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  *       }.**    
f380: 20 7d 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20 66   }.**   }.**   f
f390: 6c 75 73 68 3a 0a 2a 2a 20 20 20 20 20 41 47 47  lush:.**     AGG
f3a0: 53 54 45 50 0a 2a 2a 20 20 20 20 20 77 68 69 6c  STEP.**     whil
f3b0: 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20 20  e( 1 ){.**      
f3c0: 20 69 66 28 20 28 72 65 67 45 6e 64 2d 2d 29 3c   if( (regEnd--)<
f3d0: 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  =0 ){.**        
f3e0: 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20   RETURN_ROW.**  
f3f0: 20 20 20 20 20 20 20 69 66 28 20 65 6f 66 20 29         if( eof )
f400: 20 62 72 65 61 6b 3b 0a 2a 2a 20 20 20 20 20 20   break;.**      
f410: 20 7d 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20   }.**       if( 
f420: 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20  (regStart--)<=0 
f430: 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 47  ){.**         AG
f440: 47 49 4e 56 45 52 53 45 0a 2a 2a 20 20 20 20 20  GINVERSE.**     
f450: 20 20 20 20 69 66 28 20 65 6f 66 20 29 20 62 72      if( eof ) br
f460: 65 61 6b 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a  eak.**       }.*
f470: 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 77  *     }.**     w
f480: 68 69 6c 65 28 20 21 65 6f 66 20 63 73 72 43 75  hile( !eof csrCu
f490: 72 72 65 6e 74 20 29 7b 0a 2a 2a 20 20 20 20 20  rrent ){.**     
f4a0: 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20    RETURN_ROW.** 
f4b0: 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 46 6f 72 20      }.**.** For 
f4c0: 74 68 65 20 6d 6f 73 74 20 70 61 72 74 2c 20 74  the most part, t
f4d0: 68 65 20 70 61 74 74 65 72 6e 73 20 61 62 6f 76  he patterns abov
f4e0: 65 20 61 72 65 20 61 64 61 70 74 65 64 20 74 6f  e are adapted to
f4f0: 20 73 75 70 70 6f 72 74 20 55 4e 42 4f 55 4e 44   support UNBOUND
f500: 45 44 20 62 79 0a 2a 2a 20 61 73 73 75 6d 69 6e  ED by.** assumin
f510: 67 20 74 68 61 74 20 69 74 20 69 73 20 65 71 75  g that it is equ
f520: 69 76 61 6c 65 6e 74 20 74 6f 20 22 69 6e 66 69  ivalent to "infi
f530: 6e 69 74 79 20 50 52 45 43 45 44 49 4e 47 2f 46  nity PRECEDING/F
f540: 4f 4c 4c 4f 57 49 4e 47 22 20 61 6e 64 0a 2a 2a  OLLOWING" and.**
f550: 20 43 55 52 52 45 4e 54 20 52 4f 57 20 62 79 20   CURRENT ROW by 
f560: 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 69 74  assuming that it
f570: 20 69 73 20 65 71 75 69 76 69 6c 65 6e 74 20 74   is equivilent t
f580: 6f 20 22 30 20 50 52 45 43 45 44 49 4e 47 2f 46  o "0 PRECEDING/F
f590: 4f 4c 4c 4f 57 49 4e 47 22 2e 0a 2a 2a 20 54 68  OLLOWING"..** Th
f5a0: 69 73 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20  is is optimized 
f5b0: 6f 66 20 63 6f 75 72 73 65 20 2d 20 62 72 61 6e  of course - bran
f5c0: 63 68 65 73 20 74 68 61 74 20 77 69 6c 6c 20 6e  ches that will n
f5d0: 65 76 65 72 20 62 65 20 74 61 6b 65 6e 20 61 6e  ever be taken an
f5e0: 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20  d.** conditions 
f5f0: 74 68 61 74 20 61 72 65 20 61 6c 77 61 79 73 20  that are always 
f600: 74 72 75 65 20 61 72 65 20 6f 6d 69 74 74 65 64  true are omitted
f610: 20 66 72 6f 6d 20 74 68 65 20 56 4d 20 63 6f 64   from the VM cod
f620: 65 2e 20 54 68 65 20 6f 6e 6c 79 0a 2a 2a 20 65  e. The only.** e
f630: 78 63 65 70 74 69 6f 6e 61 6c 20 63 61 73 65 20  xceptional case 
f640: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57 53  is:.**.**   ROWS
f650: 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31 3e   BETWEEN <expr1>
f660: 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e 44 20 55   FOLLOWING AND U
f670: 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49  NBOUNDED FOLLOWI
f680: 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e  NG.**.**     ...
f690: 20 6c 6f 6f 70 20 73 74 61 72 74 65 64 20 62 79   loop started by
f6a0: 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
f6b0: 69 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20  in() ....**     
f6c0: 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f  if( new partitio
f6d0: 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 47 6f  n ){.**       Go
f6e0: 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20 20 20  sub flush.**    
f6f0: 20 7d 0a 2a 2a 20 20 20 20 20 49 6e 73 65 72 74   }.**     Insert
f700: 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20 65 70   new row into ep
f710: 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20  h table..**     
f720: 69 66 28 20 66 69 72 73 74 20 72 6f 77 20 6f 66  if( first row of
f730: 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a   partition ){.**
f740: 20 20 20 20 20 20 20 52 65 77 69 6e 64 28 63 73         Rewind(cs
f750: 72 45 6e 64 29 20 3b 20 52 65 77 69 6e 64 28 63  rEnd) ; Rewind(c
f760: 73 72 53 74 61 72 74 29 20 3b 20 52 65 77 69 6e  srStart) ; Rewin
f770: 64 28 63 73 72 43 75 72 72 65 6e 74 29 0a 2a 2a  d(csrCurrent).**
f780: 20 20 20 20 20 20 20 72 65 67 53 74 61 72 74 20         regStart 
f790: 3d 20 3c 65 78 70 72 31 3e 0a 2a 2a 20 20 20 20  = <expr1>.**    
f7a0: 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20 20 20 20   }else{.**      
f7b0: 20 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20 20   AGGSTEP.**     
f7c0: 7d 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20 66 6c  }.**   }.**   fl
f7d0: 75 73 68 3a 0a 2a 2a 20 20 20 20 20 41 47 47 53  ush:.**     AGGS
f7e0: 54 45 50 0a 2a 2a 20 20 20 20 20 77 68 69 6c 65  TEP.**     while
f7f0: 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  ( 1 ){.**       
f800: 69 66 28 20 28 72 65 67 53 74 61 72 74 2d 2d 29  if( (regStart--)
f810: 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  <=0 ){.**       
f820: 20 20 41 47 47 49 4e 56 45 52 53 45 0a 2a 2a 20    AGGINVERSE.** 
f830: 20 20 20 20 20 20 20 20 69 66 28 20 65 6f 66 20          if( eof 
f840: 29 20 62 72 65 61 6b 0a 2a 2a 20 20 20 20 20 20  ) break.**      
f850: 20 7d 0a 2a 2a 20 20 20 20 20 20 20 52 45 54 55   }.**       RETU
f860: 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 7d 0a  RN_ROW.**     }.
f870: 2a 2a 20 20 20 20 20 77 68 69 6c 65 28 20 21 65  **     while( !e
f880: 6f 66 20 63 73 72 43 75 72 72 65 6e 74 20 29 7b  of csrCurrent ){
f890: 0a 2a 2a 20 20 20 20 20 20 20 52 45 54 55 52 4e  .**       RETURN
f8a0: 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a  _ROW.**     }.**
f8b0: 0a 2a 2a 20 41 6c 73 6f 20 72 65 71 75 69 72 69  .** Also requiri
f8c0: 6e 67 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c  ng special handl
f8d0: 69 6e 67 20 61 72 65 20 74 68 65 20 63 61 73 65  ing are the case
f8e0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57 53 20  s:.**.**   ROWS 
f8f0: 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31 3e 20  BETWEEN <expr1> 
f900: 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 3c 65  PRECEDING AND <e
f910: 78 70 72 32 3e 20 50 52 45 43 45 44 49 4e 47 0a  xpr2> PRECEDING.
f920: 2a 2a 20 20 20 52 4f 57 53 20 42 45 54 57 45 45  **   ROWS BETWEE
f930: 4e 20 3c 65 78 70 72 31 3e 20 46 4f 4c 4c 4f 57  N <expr1> FOLLOW
f940: 49 4e 47 20 41 4e 44 20 3c 65 78 70 72 32 3e 20  ING AND <expr2> 
f950: 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20  FOLLOWING.**.** 
f960: 77 68 65 6e 20 28 65 78 70 72 31 20 3c 20 65 78  when (expr1 < ex
f970: 70 72 32 29 2e 20 54 68 69 73 20 69 73 20 64 65  pr2). This is de
f980: 74 65 63 74 65 64 20 61 74 20 72 75 6e 74 69 6d  tected at runtim
f990: 65 2c 20 6e 6f 74 20 62 79 20 74 68 69 73 20 66  e, not by this f
f9a0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 54 6f 20 68  unction..** To h
f9b0: 61 6e 64 6c 65 20 74 68 69 73 20 63 61 73 65 2c  andle this case,
f9c0: 20 74 68 65 20 70 73 65 75 64 6f 2d 63 6f 64 65   the pseudo-code
f9d0: 20 70 72 6f 67 72 61 6d 73 20 64 65 70 69 63 74   programs depict
f9e0: 65 64 20 61 62 6f 76 65 20 61 72 65 20 6d 6f 64  ed above are mod
f9f0: 69 66 69 65 64 0a 2a 2a 20 73 6c 69 67 68 74 6c  ified.** slightl
fa00: 79 20 74 6f 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20  y to be:.**.**  
fa10: 20 20 20 2e 2e 2e 20 6c 6f 6f 70 20 73 74 61 72     ... loop star
fa20: 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 68  ted by sqlite3Wh
fa30: 65 72 65 42 65 67 69 6e 28 29 20 2e 2e 2e 0a 2a  ereBegin() ....*
fa40: 2a 20 20 20 20 20 69 66 28 20 6e 65 77 20 70 61  *     if( new pa
fa50: 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20  rtition ){.**   
fa60: 20 20 20 20 47 6f 73 75 62 20 66 6c 75 73 68 0a      Gosub flush.
fa70: 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20  **     }.**     
fa80: 49 6e 73 65 72 74 20 6e 65 77 20 72 6f 77 20 69  Insert new row i
fa90: 6e 74 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a 2a  nto eph table..*
faa0: 2a 20 20 20 20 20 69 66 28 20 66 69 72 73 74 20  *     if( first 
fab0: 72 6f 77 20 6f 66 20 70 61 72 74 69 74 69 6f 6e  row of partition
fac0: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 52 65 77   ){.**       Rew
fad0: 69 6e 64 28 63 73 72 45 6e 64 29 20 3b 20 52 65  ind(csrEnd) ; Re
fae0: 77 69 6e 64 28 63 73 72 53 74 61 72 74 29 20 3b  wind(csrStart) ;
faf0: 20 52 65 77 69 6e 64 28 63 73 72 43 75 72 72 65   Rewind(csrCurre
fb00: 6e 74 29 0a 2a 2a 20 20 20 20 20 20 20 72 65 67  nt).**       reg
fb10: 45 6e 64 20 3d 20 3c 65 78 70 72 32 3e 0a 2a 2a  End = <expr2>.**
fb20: 20 20 20 20 20 20 20 72 65 67 53 74 61 72 74 20         regStart 
fb30: 3d 20 3c 65 78 70 72 31 3e 0a 2a 2a 20 20 20 20  = <expr1>.**    
fb40: 20 20 20 69 66 28 20 72 65 67 45 6e 64 20 3c 20     if( regEnd < 
fb50: 72 65 67 53 74 61 72 74 20 29 7b 0a 2a 2a 20 20  regStart ){.**  
fb60: 20 20 20 20 20 20 20 52 45 54 55 52 4e 5f 52 4f         RETURN_RO
fb70: 57 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 6c  W.**         del
fb80: 65 74 65 20 65 70 68 20 74 61 62 6c 65 20 63 6f  ete eph table co
fb90: 6e 74 65 6e 74 73 0a 2a 2a 20 20 20 20 20 20 20  ntents.**       
fba0: 20 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 20 20    continue.**   
fbb0: 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 2e 2e 2e      }.**     ...
fbc0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 22  .**.** The new "
fbd0: 63 6f 6e 74 69 6e 75 65 22 20 73 74 61 74 65 6d  continue" statem
fbe0: 65 6e 74 20 69 6e 20 74 68 65 20 61 62 6f 76 65  ent in the above
fbf0: 20 6a 75 6d 70 73 20 74 6f 20 74 68 65 20 6e 65   jumps to the ne
fc00: 78 74 20 69 74 65 72 61 74 69 6f 6e 0a 2a 2a 20  xt iteration.** 
fc10: 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f  of the outer loo
fc20: 70 20 2d 20 74 68 65 20 6f 6e 65 20 73 74 61 72  p - the one star
fc30: 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 68  ted by sqlite3Wh
fc40: 65 72 65 42 65 67 69 6e 28 29 2e 0a 2a 2a 0a 2a  ereBegin()..**.*
fc50: 2a 20 54 68 65 20 76 61 72 69 6f 75 73 20 47 52  * The various GR
fc60: 4f 55 50 53 20 63 61 73 65 73 20 61 72 65 20 69  OUPS cases are i
fc70: 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67  mplemented using
fc80: 20 74 68 65 20 73 61 6d 65 20 70 61 74 74 65 72   the same patter
fc90: 6e 73 20 61 73 0a 2a 2a 20 52 4f 57 53 2e 20 54  ns as.** ROWS. T
fca0: 68 65 20 56 4d 20 63 6f 64 65 20 69 73 20 6d 6f  he VM code is mo
fcb0: 64 69 66 69 65 64 20 73 6c 69 67 68 74 6c 79 20  dified slightly 
fcc0: 73 6f 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20  so that:.**.**  
fcd0: 20 31 2e 20 54 68 65 20 65 6c 73 65 20 62 72 61   1. The else bra
fce0: 6e 63 68 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  nch in the main 
fcf0: 6c 6f 6f 70 20 69 73 20 6f 6e 6c 79 20 74 61 6b  loop is only tak
fd00: 65 6e 20 69 66 20 74 68 65 20 72 6f 77 20 6a 75  en if the row ju
fd10: 73 74 0a 2a 2a 20 20 20 20 20 20 61 64 64 65 64  st.**      added
fd20: 20 74 6f 20 74 68 65 20 65 70 68 65 6d 65 72 61   to the ephemera
fd30: 6c 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 73  l table is the s
fd40: 74 61 72 74 20 6f 66 20 61 20 6e 65 77 20 67 72  tart of a new gr
fd50: 6f 75 70 2e 20 49 6e 0a 2a 2a 20 20 20 20 20 20  oup. In.**      
fd60: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 74 20  other words, it 
fd70: 62 65 63 6f 6d 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  becomes:.**.**  
fd80: 20 20 20 20 20 20 20 2e 2e 2e 20 6c 6f 6f 70 20         ... loop 
fd90: 73 74 61 72 74 65 64 20 62 79 20 73 71 6c 69 74  started by sqlit
fda0: 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2e  e3WhereBegin() .
fdb0: 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 66  ...**         if
fdc0: 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 20  ( new partition 
fdd0: 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ){.**           
fde0: 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20  Gosub flush.**  
fdf0: 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
fe00: 20 20 20 20 49 6e 73 65 72 74 20 6e 65 77 20 72      Insert new r
fe10: 6f 77 20 69 6e 74 6f 20 65 70 68 20 74 61 62 6c  ow into eph tabl
fe20: 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 66  e..**         if
fe30: 28 20 66 69 72 73 74 20 72 6f 77 20 6f 66 20 70  ( first row of p
fe40: 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20  artition ){.**  
fe50: 20 20 20 20 20 20 20 20 20 52 65 77 69 6e 64 28           Rewind(
fe60: 63 73 72 45 6e 64 29 20 3b 20 52 65 77 69 6e 64  csrEnd) ; Rewind
fe70: 28 63 73 72 53 74 61 72 74 29 20 3b 20 52 65 77  (csrStart) ; Rew
fe80: 69 6e 64 28 63 73 72 43 75 72 72 65 6e 74 29 0a  ind(csrCurrent).
fe90: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 72 65 67  **           reg
fea0: 45 6e 64 20 3d 20 3c 65 78 70 72 32 3e 0a 2a 2a  End = <expr2>.**
feb0: 20 20 20 20 20 20 20 20 20 20 20 72 65 67 53 74             regSt
fec0: 61 72 74 20 3d 20 3c 65 78 70 72 31 3e 0a 2a 2a  art = <expr1>.**
fed0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
fee0: 66 28 20 6e 65 77 20 67 72 6f 75 70 20 29 7b 0a  f( new group ){.
fef0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e  **           ...
ff00: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a   .**         }.*
ff10: 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20  *       }.**.** 
ff20: 20 20 32 2e 20 49 6e 73 74 65 61 64 20 6f 66 20    2. Instead of 
ff30: 70 72 6f 63 65 73 73 69 6e 67 20 61 20 73 69 6e  processing a sin
ff40: 67 6c 65 20 72 6f 77 2c 20 65 61 63 68 20 52 45  gle row, each RE
ff50: 54 55 52 4e 5f 52 4f 57 2c 20 41 47 47 53 54 45  TURN_ROW, AGGSTE
ff60: 50 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 41 47  P or .**      AG
ff70: 47 49 4e 56 45 52 53 45 20 73 74 65 70 20 70 72  GINVERSE step pr
ff80: 6f 63 65 73 73 65 73 20 74 68 65 20 63 75 72 72  ocesses the curr
ff90: 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 72  ent row of the r
ffa0: 65 6c 65 76 61 6e 74 20 63 75 72 73 6f 72 20 61  elevant cursor a
ffb0: 6e 64 0a 2a 2a 20 20 20 20 20 20 61 6c 6c 20 73  nd.**      all s
ffc0: 75 62 73 65 71 75 65 6e 74 20 72 6f 77 73 20 62  ubsequent rows b
ffd0: 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20  elonging to the 
ffe0: 73 61 6d 65 20 67 72 6f 75 70 2e 0a 2a 2a 0a 2a  same group..**.*
fff0: 2a 20 52 41 4e 47 45 20 77 69 6e 64 6f 77 20 66  * RANGE window f
10000 72 61 6d 65 73 20 61 72 65 20 61 20 6c 69 74 74  rames are a litt
10010 6c 65 20 64 69 66 66 65 72 65 6e 74 20 61 67 61  le different aga
10020 69 6e 2e 20 41 73 20 66 6f 72 20 47 52 4f 55 50  in. As for GROUP
10030 53 2c 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20  S, the .** main 
10040 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20 70  loop runs once p
10050 65 72 20 67 72 6f 75 70 20 6f 6e 6c 79 2e 20 41  er group only. A
10060 6e 64 20 52 45 54 55 52 4e 5f 52 4f 57 2c 20 41  nd RETURN_ROW, A
10070 47 47 53 54 45 50 20 61 6e 64 20 41 47 47 49 4e  GGSTEP and AGGIN
10080 56 45 52 53 45 0a 2a 2a 20 64 65 61 6c 20 69 6e  VERSE.** deal in
10090 20 67 72 6f 75 70 73 20 69 6e 73 74 65 61 64 20   groups instead 
100a0 6f 66 20 72 6f 77 73 2e 20 41 73 20 66 6f 72 20  of rows. As for 
100b0 52 4f 57 53 20 61 6e 64 20 47 52 4f 55 50 53 2c  ROWS and GROUPS,
100c0 20 74 68 65 72 65 20 61 72 65 20 74 68 72 65 65   there are three
100d0 0a 2a 2a 20 62 61 73 69 63 20 63 61 73 65 73 3a  .** basic cases:
100e0 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e 47 45 20 42  .**.**   RANGE B
100f0 45 54 57 45 45 4e 20 3c 65 78 70 72 31 3e 20 50  ETWEEN <expr1> P
10100 52 45 43 45 44 49 4e 47 20 41 4e 44 20 3c 65 78  RECEDING AND <ex
10110 70 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a  pr2> FOLLOWING.*
10120 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 6c 6f 6f  *.**     ... loo
10130 70 20 73 74 61 72 74 65 64 20 62 79 20 73 71 6c  p started by sql
10140 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
10150 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 69 66   ....**       if
10160 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 20  ( new partition 
10170 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 47 6f  ){.**         Go
10180 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20 20 20  sub flush.**    
10190 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 49 6e     }.**       In
101a0 73 65 72 74 20 6e 65 77 20 72 6f 77 20 69 6e 74  sert new row int
101b0 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a 2a 2a 20  o eph table..** 
101c0 20 20 20 20 20 20 69 66 28 20 66 69 72 73 74 20        if( first 
101d0 72 6f 77 20 6f 66 20 70 61 72 74 69 74 69 6f 6e  row of partition
101e0 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 52   ){.**         R
101f0 65 77 69 6e 64 28 63 73 72 45 6e 64 29 20 3b 20  ewind(csrEnd) ; 
10200 52 65 77 69 6e 64 28 63 73 72 53 74 61 72 74 29  Rewind(csrStart)
10210 20 3b 20 52 65 77 69 6e 64 28 63 73 72 43 75 72   ; Rewind(csrCur
10220 72 65 6e 74 29 0a 2a 2a 20 20 20 20 20 20 20 20  rent).**        
10230 20 72 65 67 45 6e 64 20 3d 20 3c 65 78 70 72 32   regEnd = <expr2
10240 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20 72 65 67  >.**         reg
10250 53 74 61 72 74 20 3d 20 3c 65 78 70 72 31 3e 0a  Start = <expr1>.
10260 2a 2a 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  **       }else{.
10270 2a 2a 20 20 20 20 20 20 20 20 20 41 47 47 53 54  **         AGGST
10280 45 50 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 68  EP.**         wh
10290 69 6c 65 28 20 28 63 73 72 43 75 72 72 65 6e 74  ile( (csrCurrent
102a0 2e 6b 65 79 20 2b 20 72 65 67 45 6e 64 29 20 3c  .key + regEnd) <
102b0 20 63 73 72 45 6e 64 2e 6b 65 79 20 29 7b 0a 2a   csrEnd.key ){.*
102c0 2a 20 20 20 20 20 20 20 20 20 20 20 52 45 54 55  *           RETU
102d0 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 20 20  RN_ROW.**       
102e0 20 20 20 20 77 68 69 6c 65 28 20 63 73 72 53 74      while( csrSt
102f0 61 72 74 2e 6b 65 79 20 2b 20 72 65 67 53 74 61  art.key + regSta
10300 72 74 29 20 3c 20 63 73 72 43 75 72 72 65 6e 74  rt) < csrCurrent
10310 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20 20 20  .key ){.**      
10320 20 20 20 20 20 20 20 41 47 47 49 4e 56 45 52 53         AGGINVERS
10330 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 7d  E.**           }
10340 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a  .**         }.**
10350 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
10360 7d 0a 2a 2a 20 20 20 20 20 66 6c 75 73 68 3a 0a  }.**     flush:.
10370 2a 2a 20 20 20 20 20 20 20 41 47 47 53 54 45 50  **       AGGSTEP
10380 0a 2a 2a 20 20 20 20 20 20 20 77 68 69 6c 65 28  .**       while(
10390 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20   1 ){.**        
103a0 20 52 45 54 55 52 4e 20 52 4f 57 0a 2a 2a 20 20   RETURN ROW.**  
103b0 20 20 20 20 20 20 20 69 66 28 20 63 73 72 43 75         if( csrCu
103c0 72 72 65 6e 74 20 69 73 20 45 4f 46 20 29 20 62  rrent is EOF ) b
103d0 72 65 61 6b 3b 0a 2a 2a 20 20 20 20 20 20 20 20  reak;.**        
103e0 20 20 20 77 68 69 6c 65 28 20 63 73 72 53 74 61     while( csrSta
103f0 72 74 2e 6b 65 79 20 2b 20 72 65 67 53 74 61 72  rt.key + regStar
10400 74 29 20 3c 20 63 73 72 43 75 72 72 65 6e 74 2e  t) < csrCurrent.
10410 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  key ){.**       
10420 20 20 20 20 20 20 41 47 47 49 4e 56 45 52 53 45        AGGINVERSE
10430 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 7d 0a  .**           }.
10440 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20  **         }.** 
10450 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 6e        }.**.** In
10460 20 74 68 65 20 61 62 6f 76 65 20 6e 6f 74 61 74   the above notat
10470 69 6f 6e 2c 20 22 63 73 72 2e 6b 65 79 22 20 6d  ion, "csr.key" m
10480 65 61 6e 73 20 74 68 65 20 63 75 72 72 65 6e 74  eans the current
10490 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 4f 52   value of the OR
104a0 44 45 52 20 42 59 20 0a 2a 2a 20 65 78 70 72 65  DER BY .** expre
104b0 73 73 69 6f 6e 20 28 74 68 65 72 65 20 69 73 20  ssion (there is 
104c0 6f 6e 6c 79 20 65 76 65 72 20 31 20 66 6f 72 20  only ever 1 for 
104d0 61 20 52 41 4e 47 45 20 74 68 61 74 20 75 73 65  a RANGE that use
104e0 73 20 61 6e 20 3c 65 78 70 72 3e 20 46 4f 4c 4c  s an <expr> FOLL
104f0 4f 57 49 4e 47 0a 2a 2a 20 6f 72 20 3c 65 78 70  OWING.** or <exp
10500 72 20 50 52 45 43 45 44 49 4e 47 29 20 72 65 61  r PRECEDING) rea
10510 64 20 66 72 6f 6d 20 63 75 72 73 6f 72 20 63 73  d from cursor cs
10520 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e 47 45  r..**.**   RANGE
10530 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31 3e   BETWEEN <expr1>
10540 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 3c   PRECEDING AND <
10550 65 78 70 72 32 3e 20 50 52 45 43 45 44 49 4e 47  expr2> PRECEDING
10560 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 6c  .**.**     ... l
10570 6f 6f 70 20 73 74 61 72 74 65 64 20 62 79 20 73  oop started by s
10580 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
10590 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20  () ....**       
105a0 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f  if( new partitio
105b0 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  n ){.**         
105c0 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20  Gosub flush.**  
105d0 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20       }.**       
105e0 49 6e 73 65 72 74 20 6e 65 77 20 72 6f 77 20 69  Insert new row i
105f0 6e 74 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a 2a  nto eph table..*
10600 2a 20 20 20 20 20 20 20 69 66 28 20 66 69 72 73  *       if( firs
10610 74 20 72 6f 77 20 6f 66 20 70 61 72 74 69 74 69  t row of partiti
10620 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  on ){.**        
10630 20 52 65 77 69 6e 64 28 63 73 72 45 6e 64 29 20   Rewind(csrEnd) 
10640 3b 20 52 65 77 69 6e 64 28 63 73 72 53 74 61 72  ; Rewind(csrStar
10650 74 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72 43  t) ; Rewind(csrC
10660 75 72 72 65 6e 74 29 0a 2a 2a 20 20 20 20 20 20  urrent).**      
10670 20 20 20 72 65 67 45 6e 64 20 3d 20 3c 65 78 70     regEnd = <exp
10680 72 32 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20 72  r2>.**         r
10690 65 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72 31  egStart = <expr1
106a0 3e 0a 2a 2a 20 20 20 20 20 20 20 7d 65 6c 73 65  >.**       }else
106b0 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 68 69  {.**         whi
106c0 6c 65 28 20 28 63 73 72 45 6e 64 2e 6b 65 79 20  le( (csrEnd.key 
106d0 2b 20 72 65 67 45 6e 64 29 20 3c 3d 20 63 73 72  + regEnd) <= csr
106e0 43 75 72 72 65 6e 74 2e 6b 65 79 20 29 7b 0a 2a  Current.key ){.*
106f0 2a 20 20 20 20 20 20 20 20 20 20 20 41 47 47 53  *           AGGS
10700 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d  TEP.**         }
10710 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 45 54 55  .**         RETU
10720 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 20 20  RN_ROW.**       
10730 20 20 77 68 69 6c 65 28 20 28 63 73 72 53 74 61    while( (csrSta
10740 72 74 2e 6b 65 79 20 2b 20 72 65 67 53 74 61 72  rt.key + regStar
10750 74 29 20 3c 20 63 73 72 43 75 72 72 65 6e 74 2e  t) < csrCurrent.
10760 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  key ){.**       
10770 20 20 20 20 41 47 47 49 4e 56 45 52 53 45 0a 2a      AGGINVERSE.*
10780 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  *         }.**  
10790 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a       }.**     }.
107a0 2a 2a 20 20 20 20 20 66 6c 75 73 68 3a 0a 2a 2a  **     flush:.**
107b0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63         while( (c
107c0 73 72 45 6e 64 2e 6b 65 79 20 2b 20 72 65 67 45  srEnd.key + regE
107d0 6e 64 29 20 3c 3d 20 63 73 72 43 75 72 72 65 6e  nd) <= csrCurren
107e0 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20 20  t.key ){.**     
107f0 20 20 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20      AGGSTEP.**  
10800 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20       }.**       
10810 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 0a 2a 2a  RETURN_ROW.**.**
10820 20 20 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e     RANGE BETWEEN
10830 20 3c 65 78 70 72 31 3e 20 46 4f 4c 4c 4f 57 49   <expr1> FOLLOWI
10840 4e 47 20 41 4e 44 20 3c 65 78 70 72 32 3e 20 46  NG AND <expr2> F
10850 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20  OLLOWING.**.**  
10860 20 20 20 2e 2e 2e 20 6c 6f 6f 70 20 73 74 61 72     ... loop star
10870 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 68  ted by sqlite3Wh
10880 65 72 65 42 65 67 69 6e 28 29 20 2e 2e 2e 0a 2a  ereBegin() ....*
10890 2a 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 20  *       if( new 
108a0 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20  partition ){.** 
108b0 20 20 20 20 20 20 20 20 47 6f 73 75 62 20 66 6c          Gosub fl
108c0 75 73 68 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a  ush.**       }.*
108d0 2a 20 20 20 20 20 20 20 49 6e 73 65 72 74 20 6e  *       Insert n
108e0 65 77 20 72 6f 77 20 69 6e 74 6f 20 65 70 68 20  ew row into eph 
108f0 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 20 20  table..**       
10900 69 66 28 20 66 69 72 73 74 20 72 6f 77 20 6f 66  if( first row of
10910 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a   partition ){.**
10920 20 20 20 20 20 20 20 20 20 52 65 77 69 6e 64 28           Rewind(
10930 63 73 72 45 6e 64 29 20 3b 20 52 65 77 69 6e 64  csrEnd) ; Rewind
10940 28 63 73 72 53 74 61 72 74 29 20 3b 20 52 65 77  (csrStart) ; Rew
10950 69 6e 64 28 63 73 72 43 75 72 72 65 6e 74 29 0a  ind(csrCurrent).
10960 2a 2a 20 20 20 20 20 20 20 20 20 72 65 67 45 6e  **         regEn
10970 64 20 3d 20 3c 65 78 70 72 32 3e 0a 2a 2a 20 20  d = <expr2>.**  
10980 20 20 20 20 20 20 20 72 65 67 53 74 61 72 74 20         regStart 
10990 3d 20 3c 65 78 70 72 31 3e 0a 2a 2a 20 20 20 20  = <expr1>.**    
109a0 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20 20     }else{.**    
109b0 20 20 20 20 20 41 47 47 53 54 45 50 0a 2a 2a 20       AGGSTEP.** 
109c0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28          while( (
109d0 63 73 72 43 75 72 72 65 6e 74 2e 6b 65 79 20 2b  csrCurrent.key +
109e0 20 72 65 67 45 6e 64 29 20 3c 20 63 73 72 45 6e   regEnd) < csrEn
109f0 64 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20 20  d.key ){.**     
10a00 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 73        while( (cs
10a10 72 43 75 72 72 65 6e 74 2e 6b 65 79 20 2b 20 72  rCurrent.key + r
10a20 65 67 53 74 61 72 74 29 20 3e 20 63 73 72 53 74  egStart) > csrSt
10a30 61 72 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20  art.key ){.**   
10a40 20 20 20 20 20 20 20 20 20 20 41 47 47 49 4e 56            AGGINV
10a50 45 52 53 45 0a 2a 2a 20 20 20 20 20 20 20 20 20  ERSE.**         
10a60 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    }.**          
10a70 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20   RETURN_ROW.**  
10a80 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
10a90 20 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20    }.**     }.** 
10aa0 20 20 20 20 66 6c 75 73 68 3a 0a 2a 2a 20 20 20      flush:.**   
10ab0 20 20 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20      AGGSTEP.**  
10ac0 20 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b       while( 1 ){
10ad0 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 68 69 6c  .**         whil
10ae0 65 28 20 28 63 73 72 43 75 72 72 65 6e 74 2e 6b  e( (csrCurrent.k
10af0 65 79 20 2b 20 72 65 67 53 74 61 72 74 29 20 3e  ey + regStart) >
10b00 20 63 73 72 53 74 61 72 74 2e 6b 65 79 20 29 7b   csrStart.key ){
10b10 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 47  .**           AG
10b20 47 49 4e 56 45 52 53 45 0a 2a 2a 20 20 20 20 20  GINVERSE.**     
10b30 20 20 20 20 20 20 69 66 28 20 65 6f 66 20 29 20        if( eof ) 
10b40 62 72 65 61 6b 20 22 77 68 69 6c 65 28 20 31 20  break "while( 1 
10b50 29 22 20 6c 6f 6f 70 2e 0a 2a 2a 20 20 20 20 20  )" loop..**     
10b60 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20      }.**        
10b70 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20   RETURN_ROW.**  
10b80 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20       }.**       
10b90 77 68 69 6c 65 28 20 21 65 6f 66 20 63 73 72 43  while( !eof csrC
10ba0 75 72 72 65 6e 74 20 29 7b 0a 2a 2a 20 20 20 20  urrent ){.**    
10bb0 20 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a       RETURN_ROW.
10bc0 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2f  **       }.**.*/
10bd0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 6e  .void sqlite3Win
10be0 64 6f 77 43 6f 64 65 53 74 65 70 28 0a 20 20 50  dowCodeStep(.  P
10bf0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
10c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10c10 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
10c20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
10c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c40 20 20 20 20 20 2f 2a 20 52 65 77 72 69 74 74 65       /* Rewritte
10c50 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  n SELECT stateme
10c60 6e 74 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66  nt */.  WhereInf
10c70 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 20 20  o *pWInfo,      
10c80 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
10c90 78 74 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  xt returned by s
10ca0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
10cb0 28 29 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 47  () */.  int regG
10cc0 6f 73 75 62 2c 20 20 20 20 20 20 20 20 20 20 20  osub,           
10cd0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
10ce0 74 65 72 20 66 6f 72 20 4f 50 5f 47 6f 73 75 62  ter for OP_Gosub
10cf0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 47 6f   */.  int addrGo
10d00 73 75 62 20 20 20 20 20 20 20 20 20 20 20 20 20  sub             
10d10 20 20 20 20 20 20 2f 2a 20 4f 50 5f 47 6f 73 75        /* OP_Gosu
10d20 62 20 68 65 72 65 20 74 6f 20 72 65 74 75 72 6e  b here to return
10d30 20 65 61 63 68 20 72 6f 77 20 2a 2f 0a 29 7b 0a   each row */.){.
10d40 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20    Window *pMWin 
10d50 3d 20 70 2d 3e 70 57 69 6e 3b 0a 20 20 45 78 70  = p->pWin;.  Exp
10d60 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
10d70 3d 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42  = pMWin->pOrderB
10d80 79 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  y;.  Vdbe *v = s
10d90 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
10da0 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 63 73 72  arse);.  int csr
10db0 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20  Write;          
10dc0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
10dd0 6f 72 20 75 73 65 64 20 74 6f 20 77 72 69 74 65  or used to write
10de0 20 74 6f 20 65 70 68 2e 20 74 61 62 6c 65 20 2a   to eph. table *
10df0 2f 0a 20 20 69 6e 74 20 63 73 72 49 6e 70 75 74  /.  int csrInput
10e00 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d   = p->pSrc->a[0]
10e10 2e 69 43 75 72 73 6f 72 3b 20 20 20 20 20 2f 2a  .iCursor;     /*
10e20 20 43 75 72 73 6f 72 20 6f 66 20 73 75 62 2d 73   Cursor of sub-s
10e30 65 6c 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  elect */.  int n
10e40 49 6e 70 75 74 20 3d 20 70 2d 3e 70 53 72 63 2d  Input = p->pSrc-
10e50 3e 61 5b 30 5d 2e 70 54 61 62 2d 3e 6e 43 6f 6c  >a[0].pTab->nCol
10e60 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
10e70 66 20 63 6f 6c 73 20 72 65 74 75 72 6e 65 64 20  f cols returned 
10e80 62 79 20 73 75 62 20 2a 2f 0a 20 20 69 6e 74 20  by sub */.  int 
10e90 69 49 6e 70 75 74 3b 20 20 20 20 20 20 20 20 20  iInput;         
10ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10eb0 20 20 20 20 20 20 2f 2a 20 54 6f 20 69 74 65 72        /* To iter
10ec0 61 74 65 20 74 68 72 6f 75 67 68 20 73 75 62 20  ate through sub 
10ed0 63 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64  cols */.  int ad
10ee0 64 72 49 66 4e 6f 74 3b 20 20 20 20 20 20 20 20  drIfNot;        
10ef0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
10f00 72 65 73 73 20 6f 66 20 4f 50 5f 49 66 4e 6f 74  ress of OP_IfNot
10f10 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 47 6f   */.  int addrGo
10f20 73 75 62 46 6c 75 73 68 3b 20 20 20 20 20 20 20  subFlush;       
10f30 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
10f40 20 6f 66 20 4f 50 5f 47 6f 73 75 62 20 74 6f 20   of OP_Gosub to 
10f50 66 6c 75 73 68 3a 20 2a 2f 0a 20 20 69 6e 74 20  flush: */.  int 
10f60 61 64 64 72 49 6e 74 65 67 65 72 3b 20 20 20 20  addrInteger;    
10f70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
10f80 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 49 6e 74  ddress of OP_Int
10f90 65 67 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 64  eger */.  int ad
10fa0 64 72 45 6d 70 74 79 3b 20 20 20 20 20 20 20 20  drEmpty;        
10fb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
10fc0 72 65 73 73 20 6f 66 20 4f 50 5f 52 65 77 69 6e  ress of OP_Rewin
10fd0 64 20 69 6e 20 66 6c 75 73 68 3a 20 2a 2f 0a 20  d in flush: */. 
10fe0 20 69 6e 74 20 72 65 67 53 74 61 72 74 20 3d 20   int regStart = 
10ff0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
11000 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 3c 65 78   /* Value of <ex
11010 70 72 3e 20 50 52 45 43 45 44 49 4e 47 20 2a 2f  pr> PRECEDING */
11020 0a 20 20 69 6e 74 20 72 65 67 45 6e 64 20 3d 20  .  int regEnd = 
11030 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
11040 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 3c     /* Value of <
11050 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20  expr> FOLLOWING 
11060 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4e 65 77 3b  */.  int regNew;
11070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11080 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
11090 20 72 65 67 69 73 74 65 72 73 20 68 6f 6c 64 69   registers holdi
110a0 6e 67 20 6e 65 77 20 69 6e 70 75 74 20 72 6f 77  ng new input row
110b0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63   */.  int regRec
110c0 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ord;            
110d0 20 20 20 20 20 20 2f 2a 20 72 65 67 4e 65 77 20        /* regNew 
110e0 61 72 72 61 79 20 69 6e 20 72 65 63 6f 72 64 20  array in record 
110f0 66 6f 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 72 65  form */.  int re
11100 67 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20  gRowid;         
11110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77            /* Row
11120 69 64 20 66 6f 72 20 72 65 67 52 65 63 6f 72 64  id for regRecord
11130 20 69 6e 20 65 70 68 20 74 61 62 6c 65 20 2a 2f   in eph table */
11140 0a 20 20 69 6e 74 20 72 65 67 4e 65 77 50 65 65  .  int regNewPee
11150 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
11160 20 20 20 2f 2a 20 50 65 65 72 20 76 61 6c 75 65     /* Peer value
11170 73 20 66 6f 72 20 6e 65 77 20 72 6f 77 20 28 70  s for new row (p
11180 61 72 74 20 6f 66 20 72 65 67 4e 65 77 29 20 2a  art of regNew) *
11190 2f 0a 20 20 69 6e 74 20 72 65 67 50 65 65 72 20  /.  int regPeer 
111a0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
111b0 20 20 20 20 2f 2a 20 50 65 65 72 20 76 61 6c 75      /* Peer valu
111c0 65 73 20 66 6f 72 20 63 75 72 72 65 6e 74 20 72  es for current r
111d0 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46  ow */.  int regF
111e0 6c 75 73 68 50 61 72 74 20 3d 20 30 3b 20 20 20  lushPart = 0;   
111f0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
11200 74 65 72 20 66 6f 72 20 22 47 6f 73 75 62 20 66  ter for "Gosub f
11210 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 20  lush_partition" 
11220 2a 2f 0a 20 20 57 69 6e 64 6f 77 43 6f 64 65 41  */.  WindowCodeA
11230 72 67 20 73 3b 20 20 20 20 20 20 20 20 20 20 20  rg s;           
11240 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20       /* Context 
11250 6f 62 6a 65 63 74 20 66 6f 72 20 73 75 62 2d 72  object for sub-r
11260 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20 69 6e 74  outines */.  int
11270 20 6c 62 6c 57 68 65 72 65 45 6e 64 3b 20 20 20   lblWhereEnd;   
11280 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11290 4c 61 62 65 6c 20 6a 75 73 74 20 62 65 66 6f 72  Label just befor
112a0 65 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  e sqlite3WhereEn
112b0 64 28 29 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61  d() code */..  a
112c0 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 53  ssert( pMWin->eS
112d0 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49  tart==TK_PRECEDI
112e0 4e 47 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74  NG || pMWin->eSt
112f0 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20  art==TK_CURRENT 
11300 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e  .       || pMWin
11310 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c  ->eStart==TK_FOL
11320 4c 4f 57 49 4e 47 20 7c 7c 20 70 4d 57 69 6e 2d  LOWING || pMWin-
11330 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f  >eStart==TK_UNBO
11340 55 4e 44 45 44 20 0a 20 20 29 3b 0a 20 20 61 73  UNDED .  );.  as
11350 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 45 6e  sert( pMWin->eEn
11360 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  d==TK_FOLLOWING 
11370 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  || pMWin->eEnd==
11380 54 4b 5f 43 55 52 52 45 4e 54 20 0a 20 20 20 20  TK_CURRENT .    
11390 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e     || pMWin->eEn
113a0 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20  d==TK_UNBOUNDED 
113b0 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  || pMWin->eEnd==
113c0 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 0a 20 20  TK_PRECEDING .  
113d0 29 3b 0a 0a 20 20 6c 62 6c 57 68 65 72 65 45 6e  );..  lblWhereEn
113e0 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
113f0 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
11400 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20  ;..  /* Fill in 
11410 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 62 6a 65  the context obje
11420 63 74 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  ct */.  memset(&
11430 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57 69 6e  s, 0, sizeof(Win
11440 64 6f 77 43 6f 64 65 41 72 67 29 29 3b 0a 20 20  dowCodeArg));.  
11450 73 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  s.pParse = pPars
11460 65 3b 0a 20 20 73 2e 70 4d 57 69 6e 20 3d 20 70  e;.  s.pMWin = p
11470 4d 57 69 6e 3b 0a 20 20 73 2e 70 56 64 62 65 20  MWin;.  s.pVdbe 
11480 3d 20 76 3b 0a 20 20 73 2e 72 65 67 47 6f 73 75  = v;.  s.regGosu
11490 62 20 3d 20 72 65 67 47 6f 73 75 62 3b 0a 20 20  b = regGosub;.  
114a0 73 2e 61 64 64 72 47 6f 73 75 62 20 3d 20 61 64  s.addrGosub = ad
114b0 64 72 47 6f 73 75 62 3b 0a 20 20 73 2e 63 75 72  drGosub;.  s.cur
114c0 72 65 6e 74 2e 63 73 72 20 3d 20 70 4d 57 69 6e  rent.csr = pMWin
114d0 2d 3e 69 45 70 68 43 73 72 3b 0a 20 20 63 73 72  ->iEphCsr;.  csr
114e0 57 72 69 74 65 20 3d 20 73 2e 63 75 72 72 65 6e  Write = s.curren
114f0 74 2e 63 73 72 2b 31 3b 0a 20 20 73 2e 73 74 61  t.csr+1;.  s.sta
11500 72 74 2e 63 73 72 20 3d 20 73 2e 63 75 72 72 65  rt.csr = s.curre
11510 6e 74 2e 63 73 72 2b 32 3b 0a 20 20 73 2e 65 6e  nt.csr+2;.  s.en
11520 64 2e 63 73 72 20 3d 20 73 2e 63 75 72 72 65 6e  d.csr = s.curren
11530 74 2e 63 73 72 2b 33 3b 0a 0a 20 20 2f 2a 20 41  t.csr+3;..  /* A
11540 6c 6c 6f 63 61 74 65 20 72 65 67 69 73 74 65 72  llocate register
11550 73 20 66 6f 72 20 74 68 65 20 61 72 72 61 79 20  s for the array 
11560 6f 66 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 74  of values from t
11570 68 65 20 73 75 62 2d 71 75 65 72 79 2c 20 74 68  he sub-query, th
11580 65 0a 20 20 2a 2a 20 73 61 6d 76 65 20 76 61 6c  e.  ** samve val
11590 75 65 73 20 69 6e 20 72 65 63 6f 72 64 20 66 6f  ues in record fo
115a0 72 6d 2c 20 61 6e 64 20 74 68 65 20 72 6f 77 69  rm, and the rowi
115b0 64 20 75 73 65 64 20 74 6f 20 69 6e 73 65 72 74  d used to insert
115c0 20 73 61 69 64 20 72 65 63 6f 72 64 0a 20 20 2a   said record.  *
115d0 2a 20 69 6e 74 6f 20 74 68 65 20 65 70 68 65 6d  * into the ephem
115e0 65 72 61 6c 20 74 61 62 6c 65 2e 20 20 2a 2f 0a  eral table.  */.
115f0 20 20 72 65 67 4e 65 77 20 3d 20 70 50 61 72 73    regNew = pPars
11600 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 70 50 61  e->nMem+1;.  pPa
11610 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 49 6e  rse->nMem += nIn
11620 70 75 74 3b 0a 20 20 72 65 67 52 65 63 6f 72 64  put;.  regRecord
11630 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
11640 6d 3b 0a 20 20 72 65 67 52 6f 77 69 64 20 3d 20  m;.  regRowid = 
11650 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
11660 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 77 69 6e  .  /* If the win
11670 64 6f 77 20 66 72 61 6d 65 20 63 6f 6e 74 61 69  dow frame contai
11680 6e 73 20 61 6e 20 22 3c 65 78 70 72 3e 20 50 52  ns an "<expr> PR
11690 45 43 45 44 49 4e 47 22 20 6f 72 20 22 3c 65 78  ECEDING" or "<ex
116a0 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 22 0a 20  pr> FOLLOWING". 
116b0 20 2a 2a 20 63 6c 61 75 73 65 2c 20 61 6c 6c 6f   ** clause, allo
116c0 63 61 74 65 20 72 65 67 69 73 74 65 72 73 20 74  cate registers t
116d0 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  o store the resu
116e0 6c 74 73 20 6f 66 20 65 76 61 6c 75 61 74 69 6e  lts of evaluatin
116f0 67 20 65 61 63 68 0a 20 20 2a 2a 20 3c 65 78 70  g each.  ** <exp
11700 72 3e 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 4d  r>.  */.  if( pM
11710 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
11720 50 52 45 43 45 44 49 4e 47 20 7c 7c 20 70 4d 57  PRECEDING || pMW
11730 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46  in->eStart==TK_F
11740 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20  OLLOWING ){.    
11750 72 65 67 53 74 61 72 74 20 3d 20 2b 2b 70 50 61  regStart = ++pPa
11760 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20  rse->nMem;.  }. 
11770 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64   if( pMWin->eEnd
11780 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 7c  ==TK_PRECEDING |
11790 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54  | pMWin->eEnd==T
117a0 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20  K_FOLLOWING ){. 
117b0 20 20 20 72 65 67 45 6e 64 20 3d 20 2b 2b 70 50     regEnd = ++pP
117c0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a  arse->nMem;.  }.
117d0 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
117e0 20 6e 6f 74 20 61 20 22 52 4f 57 53 20 42 45 54   not a "ROWS BET
117f0 57 45 45 4e 20 2e 2e 2e 22 20 66 72 61 6d 65 2c  WEEN ..." frame,
11800 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61   then allocate a
11810 72 72 61 79 73 20 6f 66 0a 20 20 2a 2a 20 72 65  rrays of.  ** re
11820 67 69 73 74 65 72 73 20 74 6f 20 73 74 6f 72 65  gisters to store
11830 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 4f   copies of the O
11840 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69  RDER BY expressi
11850 6f 6e 73 20 28 70 65 65 72 20 76 61 6c 75 65 73  ons (peer values
11860 29 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  ) .  ** for the 
11870 6d 61 69 6e 20 6c 6f 6f 70 2c 20 61 6e 64 20 66  main loop, and f
11880 6f 72 20 65 61 63 68 20 63 75 72 73 6f 72 20 28  or each cursor (
11890 73 74 61 72 74 2c 20 63 75 72 72 65 6e 74 20 61  start, current a
118a0 6e 64 20 65 6e 64 29 2e 20 2a 2f 0a 20 20 69 66  nd end). */.  if
118b0 28 20 70 4d 57 69 6e 2d 3e 65 54 79 70 65 21 3d  ( pMWin->eType!=
118c0 54 4b 5f 52 4f 57 53 20 29 7b 0a 20 20 20 20 69  TK_ROWS ){.    i
118d0 6e 74 20 6e 50 65 65 72 20 3d 20 28 70 4f 72 64  nt nPeer = (pOrd
118e0 65 72 42 79 20 3f 20 70 4f 72 64 65 72 42 79 2d  erBy ? pOrderBy-
118f0 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20  >nExpr : 0);.   
11900 20 72 65 67 4e 65 77 50 65 65 72 20 3d 20 72 65   regNewPeer = re
11910 67 4e 65 77 20 2b 20 70 4d 57 69 6e 2d 3e 6e 42  gNew + pMWin->nB
11920 75 66 66 65 72 43 6f 6c 3b 0a 20 20 20 20 69 66  ufferCol;.    if
11930 28 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74  ( pMWin->pPartit
11940 69 6f 6e 20 29 20 72 65 67 4e 65 77 50 65 65 72  ion ) regNewPeer
11950 20 2b 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74   += pMWin->pPart
11960 69 74 69 6f 6e 2d 3e 6e 45 78 70 72 3b 0a 20 20  ition->nExpr;.  
11970 20 20 72 65 67 50 65 65 72 20 3d 20 70 50 61 72    regPeer = pPar
11980 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 20 20 20 20 20  se->nMem+1;     
11990 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
119a0 3d 20 6e 50 65 65 72 3b 0a 20 20 20 20 73 2e 73  = nPeer;.    s.s
119b0 74 61 72 74 2e 72 65 67 20 3d 20 70 50 61 72 73  tart.reg = pPars
119c0 65 2d 3e 6e 4d 65 6d 2b 31 3b 20 20 20 70 50 61  e->nMem+1;   pPa
119d0 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 65  rse->nMem += nPe
119e0 65 72 3b 0a 20 20 20 20 73 2e 63 75 72 72 65 6e  er;.    s.curren
119f0 74 2e 72 65 67 20 3d 20 70 50 61 72 73 65 2d 3e  t.reg = pParse->
11a00 6e 4d 65 6d 2b 31 3b 20 70 50 61 72 73 65 2d 3e  nMem+1; pParse->
11a10 6e 4d 65 6d 20 2b 3d 20 6e 50 65 65 72 3b 0a 20  nMem += nPeer;. 
11a20 20 20 20 73 2e 65 6e 64 2e 72 65 67 20 3d 20 70     s.end.reg = p
11a30 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 20 20  Parse->nMem+1;  
11a40 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
11a50 2b 3d 20 6e 50 65 65 72 3b 0a 20 20 7d 0a 0a 20  += nPeer;.  }.. 
11a60 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 63 6f 6c   /* Load the col
11a70 75 6d 6e 20 76 61 6c 75 65 73 20 66 6f 72 20 74  umn values for t
11a80 68 65 20 72 6f 77 20 72 65 74 75 72 6e 65 64 20  he row returned 
11a90 62 79 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63  by the sub-selec
11aa0 74 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 61  t.  ** into an a
11ab0 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
11ac0 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 72 65  s starting at re
11ad0 67 4e 65 77 2e 20 41 73 73 65 6d 62 6c 65 20 74  gNew. Assemble t
11ae0 68 65 6d 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 20  hem into.  ** a 
11af0 72 65 63 6f 72 64 20 69 6e 20 72 65 67 69 73 74  record in regist
11b00 65 72 20 72 65 67 52 65 63 6f 72 64 2e 20 2a 2f  er regRecord. */
11b10 0a 20 20 66 6f 72 28 69 49 6e 70 75 74 3d 30 3b  .  for(iInput=0;
11b20 20 69 49 6e 70 75 74 3c 6e 49 6e 70 75 74 3b 20   iInput<nInput; 
11b30 69 49 6e 70 75 74 2b 2b 29 7b 0a 20 20 20 20 73  iInput++){.    s
11b40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
11b50 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63  (v, OP_Column, c
11b60 73 72 49 6e 70 75 74 2c 20 69 49 6e 70 75 74 2c  srInput, iInput,
11b70 20 72 65 67 4e 65 77 2b 69 49 6e 70 75 74 29 3b   regNew+iInput);
11b80 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
11b90 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
11ba0 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 4e 65  akeRecord, regNe
11bb0 77 2c 20 6e 49 6e 70 75 74 2c 20 72 65 67 52 65  w, nInput, regRe
11bc0 63 6f 72 64 29 3b 0a 0a 20 20 2f 2a 20 41 6e 20  cord);..  /* An 
11bd0 69 6e 70 75 74 20 72 6f 77 20 68 61 73 20 6a 75  input row has ju
11be0 73 74 20 62 65 65 6e 20 72 65 61 64 20 69 6e 74  st been read int
11bf0 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65  o an array of re
11c00 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
11c10 0a 20 20 2a 2a 20 61 74 20 72 65 67 4e 65 77 2e  .  ** at regNew.
11c20 20 49 66 20 74 68 65 20 77 69 6e 64 6f 77 20 68   If the window h
11c30 61 73 20 61 20 50 41 52 54 49 54 49 4f 4e 20 63  as a PARTITION c
11c40 6c 61 75 73 65 2c 20 74 68 69 73 20 62 6c 6f 63  lause, this bloc
11c50 6b 20 67 65 6e 65 72 61 74 65 73 20 0a 20 20 2a  k generates .  *
11c60 2a 20 56 4d 20 63 6f 64 65 20 74 6f 20 63 68 65  * VM code to che
11c70 63 6b 20 69 66 20 74 68 65 20 69 6e 70 75 74 20  ck if the input 
11c80 72 6f 77 20 69 73 20 74 68 65 20 73 74 61 72 74  row is the start
11c90 20 6f 66 20 61 20 6e 65 77 20 70 61 72 74 69 74   of a new partit
11ca0 69 6f 6e 2e 0a 20 20 2a 2a 20 49 66 20 73 6f 2c  ion..  ** If so,
11cb0 20 69 74 20 64 6f 65 73 20 61 6e 20 4f 50 5f 47   it does an OP_G
11cc0 6f 73 75 62 20 74 6f 20 61 6e 20 61 64 64 72 65  osub to an addre
11cd0 73 73 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20  ss to be filled 
11ce0 69 6e 20 6c 61 74 65 72 2e 20 54 68 65 0a 20 20  in later. The.  
11cf0 2a 2a 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  ** address of th
11d00 65 20 4f 50 5f 47 6f 73 75 62 20 69 73 20 73 74  e OP_Gosub is st
11d10 6f 72 65 64 20 69 6e 20 6c 6f 63 61 6c 20 76 61  ored in local va
11d20 72 69 61 62 6c 65 20 61 64 64 72 47 6f 73 75 62  riable addrGosub
11d30 46 6c 75 73 68 2e 20 2a 2f 0a 20 20 69 66 28 20  Flush. */.  if( 
11d40 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f  pMWin->pPartitio
11d50 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  n ){.    int add
11d60 72 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  r;.    ExprList 
11d70 2a 70 50 61 72 74 20 3d 20 70 4d 57 69 6e 2d 3e  *pPart = pMWin->
11d80 70 50 61 72 74 69 74 69 6f 6e 3b 0a 20 20 20 20  pPartition;.    
11d90 69 6e 74 20 6e 50 61 72 74 20 3d 20 70 50 61 72  int nPart = pPar
11da0 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69 6e  t->nExpr;.    in
11db0 74 20 72 65 67 4e 65 77 50 61 72 74 20 3d 20 72  t regNewPart = r
11dc0 65 67 4e 65 77 20 2b 20 70 4d 57 69 6e 2d 3e 6e  egNew + pMWin->n
11dd0 42 75 66 66 65 72 43 6f 6c 3b 0a 20 20 20 20 4b  BufferCol;.    K
11de0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
11df0 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
11e00 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
11e10 61 72 73 65 2c 20 70 50 61 72 74 2c 20 30 2c 20  arse, pPart, 0, 
11e20 30 29 3b 0a 0a 20 20 20 20 72 65 67 46 6c 75 73  0);..    regFlus
11e30 68 50 61 72 74 20 3d 20 2b 2b 70 50 61 72 73 65  hPart = ++pParse
11e40 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 61 64 64 72  ->nMem;.    addr
11e50 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
11e60 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp3(v, OP_Compa
11e70 72 65 2c 20 72 65 67 4e 65 77 50 61 72 74 2c 20  re, regNewPart, 
11e80 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c 20  pMWin->regPart, 
11e90 6e 50 61 72 74 29 3b 0a 20 20 20 20 73 71 6c 69  nPart);.    sqli
11ea0 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
11eb0 76 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e  v, (void*)pKeyIn
11ec0 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
11ed0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
11ee0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
11ef0 70 2c 20 61 64 64 72 2b 32 2c 20 61 64 64 72 2b  p, addr+2, addr+
11f00 34 2c 20 61 64 64 72 2b 32 29 3b 0a 20 20 20 20  4, addr+2);.    
11f10 56 64 62 65 43 6f 76 65 72 61 67 65 45 71 4e 65  VdbeCoverageEqNe
11f20 28 76 29 3b 0a 20 20 20 20 61 64 64 72 47 6f 73  (v);.    addrGos
11f30 75 62 46 6c 75 73 68 20 3d 20 73 71 6c 69 74 65  ubFlush = sqlite
11f40 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
11f50 50 5f 47 6f 73 75 62 2c 20 72 65 67 46 6c 75 73  P_Gosub, regFlus
11f60 68 50 61 72 74 29 3b 0a 20 20 20 20 56 64 62 65  hPart);.    Vdbe
11f70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 61 6c  Comment((v, "cal
11f80 6c 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f  l flush_partitio
11f90 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  n"));.    sqlite
11fa0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
11fb0 50 5f 43 6f 70 79 2c 20 72 65 67 4e 65 77 50 61  P_Copy, regNewPa
11fc0 72 74 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61  rt, pMWin->regPa
11fd0 72 74 2c 20 6e 50 61 72 74 2d 31 29 3b 0a 20 20  rt, nPart-1);.  
11fe0 7d 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74  }..  /* Insert t
11ff0 68 65 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20  he new row into 
12000 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61  the ephemeral ta
12010 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ble */.  sqlite3
12020 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12030 5f 4e 65 77 52 6f 77 69 64 2c 20 63 73 72 57 72  _NewRowid, csrWr
12040 69 74 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  ite, regRowid);.
12050 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12060 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
12070 2c 20 63 73 72 57 72 69 74 65 2c 20 72 65 67 52  , csrWrite, regR
12080 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 69 64 29  ecord, regRowid)
12090 3b 0a 0a 20 20 61 64 64 72 49 66 4e 6f 74 20 3d  ;..  addrIfNot =
120a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
120b0 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p1(v, OP_IfNot, 
120c0 70 4d 57 69 6e 2d 3e 72 65 67 46 69 72 73 74 29  pMWin->regFirst)
120d0 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f  ;..  /* This blo
120e0 63 6b 20 69 73 20 72 75 6e 20 66 6f 72 20 74 68  ck is run for th
120f0 65 20 66 69 72 73 74 20 72 6f 77 20 6f 66 20 65  e first row of e
12100 61 63 68 20 70 61 72 74 69 74 69 6f 6e 20 2a 2f  ach partition */
12110 0a 20 20 73 2e 72 65 67 41 72 67 20 3d 20 77 69  .  s.regArg = wi
12120 6e 64 6f 77 49 6e 69 74 41 63 63 75 6d 28 70 50  ndowInitAccum(pP
12130 61 72 73 65 2c 20 70 4d 57 69 6e 29 3b 0a 0a 20  arse, pMWin);.. 
12140 20 69 66 28 20 72 65 67 53 74 61 72 74 20 29 7b   if( regStart ){
12150 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
12160 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4d 57  Code(pParse, pMW
12170 69 6e 2d 3e 70 53 74 61 72 74 2c 20 72 65 67 53  in->pStart, regS
12180 74 61 72 74 29 3b 0a 20 20 20 20 77 69 6e 64 6f  tart);.    windo
12190 77 43 68 65 63 6b 56 61 6c 75 65 28 70 50 61 72  wCheckValue(pPar
121a0 73 65 2c 20 72 65 67 53 74 61 72 74 2c 20 30 20  se, regStart, 0 
121b0 2b 20 28 70 4d 57 69 6e 2d 3e 65 54 79 70 65 3d  + (pMWin->eType=
121c0 3d 54 4b 5f 52 41 4e 47 45 20 3f 20 33 20 3a 20  =TK_RANGE ? 3 : 
121d0 30 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  0));.  }.  if( r
121e0 65 67 45 6e 64 20 29 7b 0a 20 20 20 20 73 71 6c  egEnd ){.    sql
121f0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
12200 72 73 65 2c 20 70 4d 57 69 6e 2d 3e 70 45 6e 64  rse, pMWin->pEnd
12210 2c 20 72 65 67 45 6e 64 29 3b 0a 20 20 20 20 77  , regEnd);.    w
12220 69 6e 64 6f 77 43 68 65 63 6b 56 61 6c 75 65 28  indowCheckValue(
12230 70 50 61 72 73 65 2c 20 72 65 67 45 6e 64 2c 20  pParse, regEnd, 
12240 31 20 2b 20 28 70 4d 57 69 6e 2d 3e 65 54 79 70  1 + (pMWin->eTyp
12250 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 3f 20 33 20  e==TK_RANGE ? 3 
12260 3a 20 30 29 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  : 0));.  }..  if
12270 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d  ( pMWin->eStart=
12280 3d 70 4d 57 69 6e 2d 3e 65 45 6e 64 20 26 26 20  =pMWin->eEnd && 
12290 72 65 67 53 74 61 72 74 20 26 26 20 72 65 67 45  regStart && regE
122a0 6e 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70  nd ){.    int op
122b0 20 3d 20 28 28 70 4d 57 69 6e 2d 3e 65 53 74 61   = ((pMWin->eSta
122c0 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  rt==TK_FOLLOWING
122d0 29 20 3f 20 4f 50 5f 47 65 20 3a 20 4f 50 5f 4c  ) ? OP_Ge : OP_L
122e0 65 29 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72  e);.    int addr
122f0 47 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Ge = sqlite3Vdbe
12300 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72 65  AddOp3(v, op, re
12310 67 53 74 61 72 74 2c 20 30 2c 20 72 65 67 45 6e  gStart, 0, regEn
12320 64 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 41 67  d);.    windowAg
12330 67 46 69 6e 61 6c 28 70 50 61 72 73 65 2c 20 70  gFinal(pParse, p
12340 4d 57 69 6e 2c 20 30 29 3b 0a 20 20 20 20 73 71  MWin, 0);.    sq
12350 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12360 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 73 2e  v, OP_Rewind, s.
12370 63 75 72 72 65 6e 74 2e 63 73 72 2c 20 31 29 3b  current.csr, 1);
12380 0a 20 20 20 20 77 69 6e 64 6f 77 52 65 74 75 72  .    windowRetur
12390 6e 4f 6e 65 52 6f 77 28 70 50 61 72 73 65 2c 20  nOneRow(pParse, 
123a0 70 4d 57 69 6e 2c 20 72 65 67 47 6f 73 75 62 2c  pMWin, regGosub,
123b0 20 61 64 64 72 47 6f 73 75 62 29 3b 0a 20 20 20   addrGosub);.   
123c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
123d0 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f  p1(v, OP_ResetSo
123e0 72 74 65 72 2c 20 73 2e 63 75 72 72 65 6e 74 2e  rter, s.current.
123f0 63 73 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  csr);.    sqlite
12400 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12410 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 62 6c 57 68  P_Goto, 0, lblWh
12420 65 72 65 45 6e 64 29 3b 0a 20 20 20 20 73 71 6c  ereEnd);.    sql
12430 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
12440 28 76 2c 20 61 64 64 72 47 65 29 3b 0a 20 20 7d  (v, addrGe);.  }
12450 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53  .  if( pMWin->eS
12460 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49  tart==TK_FOLLOWI
12470 4e 47 20 26 26 20 70 4d 57 69 6e 2d 3e 65 54 79  NG && pMWin->eTy
12480 70 65 21 3d 54 4b 5f 52 41 4e 47 45 20 26 26 20  pe!=TK_RANGE && 
12490 72 65 67 45 6e 64 20 29 7b 0a 20 20 20 20 61 73  regEnd ){.    as
124a0 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 45 6e  sert( pMWin->eEn
124b0 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  d==TK_FOLLOWING 
124c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
124d0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
124e0 75 62 74 72 61 63 74 2c 20 72 65 67 53 74 61 72  ubtract, regStar
124f0 74 2c 20 72 65 67 45 6e 64 2c 20 72 65 67 53 74  t, regEnd, regSt
12500 61 72 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  art);.  }..  if(
12510 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 21 3d   pMWin->eStart!=
12520 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a  TK_UNBOUNDED ){.
12530 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12540 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
12550 6e 64 2c 20 73 2e 73 74 61 72 74 2e 63 73 72 2c  nd, s.start.csr,
12560 20 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   1);.  }.  sqlit
12570 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
12580 4f 50 5f 52 65 77 69 6e 64 2c 20 73 2e 63 75 72  OP_Rewind, s.cur
12590 72 65 6e 74 2e 63 73 72 2c 20 31 29 3b 0a 20 20  rent.csr, 1);.  
125a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
125b0 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
125c0 73 2e 65 6e 64 2e 63 73 72 2c 20 31 29 3b 0a 20  s.end.csr, 1);. 
125d0 20 69 66 28 20 72 65 67 50 65 65 72 20 26 26 20   if( regPeer && 
125e0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
125f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12600 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65  3(v, OP_Copy, re
12610 67 4e 65 77 50 65 65 72 2c 20 72 65 67 50 65 65  gNewPeer, regPee
12620 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  r, pOrderBy->nEx
12630 70 72 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  pr-1);.    sqlit
12640 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
12650 4f 50 5f 43 6f 70 79 2c 20 72 65 67 50 65 65 72  OP_Copy, regPeer
12660 2c 20 73 2e 73 74 61 72 74 2e 72 65 67 2c 20 70  , s.start.reg, p
12670 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31  OrderBy->nExpr-1
12680 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
12690 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
126a0 6f 70 79 2c 20 72 65 67 50 65 65 72 2c 20 73 2e  opy, regPeer, s.
126b0 63 75 72 72 65 6e 74 2e 72 65 67 2c 20 70 4f 72  current.reg, pOr
126c0 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b  derBy->nExpr-1);
126d0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
126e0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70  AddOp3(v, OP_Cop
126f0 79 2c 20 72 65 67 50 65 65 72 2c 20 73 2e 65 6e  y, regPeer, s.en
12700 64 2e 72 65 67 2c 20 70 4f 72 64 65 72 42 79 2d  d.reg, pOrderBy-
12710 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 7d 0a 0a  >nExpr-1);.  }..
12720 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12730 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
12740 72 2c 20 30 2c 20 70 4d 57 69 6e 2d 3e 72 65 67  r, 0, pMWin->reg
12750 46 69 72 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  First);.  sqlite
12760 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12770 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 62 6c 57 68  P_Goto, 0, lblWh
12780 65 72 65 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 42  ereEnd);..  /* B
12790 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20  egin generating 
127a0 53 45 43 4f 4e 44 5f 52 4f 57 5f 43 4f 44 45 20  SECOND_ROW_CODE 
127b0 2a 2f 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43  */.  VdbeModuleC
127c0 6f 6d 6d 65 6e 74 28 28 70 50 61 72 73 65 2d 3e  omment((pParse->
127d0 70 56 64 62 65 2c 20 22 42 65 67 69 6e 20 57 69  pVdbe, "Begin Wi
127e0 6e 64 6f 77 43 6f 64 65 53 74 65 70 2e 53 45 43  ndowCodeStep.SEC
127f0 4f 4e 44 5f 52 4f 57 22 29 29 3b 0a 20 20 73 71  OND_ROW"));.  sq
12800 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
12810 65 28 76 2c 20 61 64 64 72 49 66 4e 6f 74 29 3b  e(v, addrIfNot);
12820 0a 20 20 69 66 28 20 72 65 67 50 65 65 72 20 29  .  if( regPeer )
12830 7b 0a 20 20 20 20 77 69 6e 64 6f 77 49 66 4e 65  {.    windowIfNe
12840 77 50 65 65 72 28 70 50 61 72 73 65 2c 20 70 4f  wPeer(pParse, pO
12850 72 64 65 72 42 79 2c 20 72 65 67 4e 65 77 50 65  rderBy, regNewPe
12860 65 72 2c 20 72 65 67 50 65 65 72 2c 20 6c 62 6c  er, regPeer, lbl
12870 57 68 65 72 65 45 6e 64 29 3b 0a 20 20 7d 0a 20  WhereEnd);.  }. 
12880 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61   if( pMWin->eSta
12890 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  rt==TK_FOLLOWING
128a0 20 29 7b 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f   ){.    windowCo
128b0 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f  deOp(&s, WINDOW_
128c0 41 47 47 53 54 45 50 2c 20 30 2c 20 30 29 3b 0a  AGGSTEP, 0, 0);.
128d0 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65      if( pMWin->e
128e0 45 6e 64 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  End!=TK_UNBOUNDE
128f0 44 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  D ){.      if( p
12900 4d 57 69 6e 2d 3e 65 54 79 70 65 3d 3d 54 4b 5f  MWin->eType==TK_
12910 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 20  RANGE ){.       
12920 20 69 6e 74 20 6c 62 6c 20 3d 20 73 71 6c 69 74   int lbl = sqlit
12930 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
12940 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
12950 20 69 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20   int addrNext = 
12960 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
12970 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
12980 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 52 61 6e     windowCodeRan
12990 67 65 54 65 73 74 28 26 73 2c 20 4f 50 5f 47 65  geTest(&s, OP_Ge
129a0 2c 20 73 2e 63 75 72 72 65 6e 74 2e 63 73 72 2c  , s.current.csr,
129b0 20 72 65 67 45 6e 64 2c 20 73 2e 65 6e 64 2e 63   regEnd, s.end.c
129c0 73 72 2c 20 6c 62 6c 29 3b 0a 20 20 20 20 20 20  sr, lbl);.      
129d0 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26    windowCodeOp(&
129e0 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56  s, WINDOW_AGGINV
129f0 45 52 53 45 2c 20 72 65 67 53 74 61 72 74 2c 20  ERSE, regStart, 
12a00 30 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 64  0);.        wind
12a10 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e  owCodeOp(&s, WIN
12a20 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20  DOW_RETURN_ROW, 
12a30 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  0, 0);.        s
12a40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12a50 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
12a60 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 20  addrNext);.     
12a70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
12a80 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62  solveLabel(v, lb
12a90 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  l);.      }else{
12aa0 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43  .        windowC
12ab0 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57  odeOp(&s, WINDOW
12ac0 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 72 65 67  _RETURN_ROW, reg
12ad0 45 6e 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  End, 0);.       
12ae0 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73   windowCodeOp(&s
12af0 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45  , WINDOW_AGGINVE
12b00 52 53 45 2c 20 72 65 67 53 74 61 72 74 2c 20 30  RSE, regStart, 0
12b10 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
12b20 0a 20 20 7d 65 6c 73 65 0a 20 20 69 66 28 20 70  .  }else.  if( p
12b30 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50  MWin->eEnd==TK_P
12b40 52 45 43 45 44 49 4e 47 20 29 7b 0a 20 20 20 20  RECEDING ){.    
12b50 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c  windowCodeOp(&s,
12b60 20 57 49 4e 44 4f 57 5f 41 47 47 53 54 45 50 2c   WINDOW_AGGSTEP,
12b70 20 72 65 67 45 6e 64 2c 20 30 29 3b 0a 20 20 20   regEnd, 0);.   
12b80 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73   windowCodeOp(&s
12b90 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f  , WINDOW_RETURN_
12ba0 52 4f 57 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ROW, 0, 0);.    
12bb0 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c  windowCodeOp(&s,
12bc0 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52   WINDOW_AGGINVER
12bd0 53 45 2c 20 72 65 67 53 74 61 72 74 2c 20 30 29  SE, regStart, 0)
12be0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
12bf0 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 77 69 6e  nt addr;.    win
12c00 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49  dowCodeOp(&s, WI
12c10 4e 44 4f 57 5f 41 47 47 53 54 45 50 2c 20 30 2c  NDOW_AGGSTEP, 0,
12c20 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 57   0);.    if( pMW
12c30 69 6e 2d 3e 65 45 6e 64 21 3d 54 4b 5f 55 4e 42  in->eEnd!=TK_UNB
12c40 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20 20 20 20  OUNDED ){.      
12c50 69 66 28 20 70 4d 57 69 6e 2d 3e 65 54 79 70 65  if( pMWin->eType
12c60 3d 3d 54 4b 5f 52 41 4e 47 45 20 29 7b 0a 20 20  ==TK_RANGE ){.  
12c70 20 20 20 20 20 20 69 6e 74 20 6c 62 6c 3b 0a 20        int lbl;. 
12c80 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71         addr = sq
12c90 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
12ca0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20  Addr(v);.       
12cb0 20 69 66 28 20 72 65 67 45 6e 64 20 29 7b 0a 20   if( regEnd ){. 
12cc0 20 20 20 20 20 20 20 20 20 6c 62 6c 20 3d 20 73           lbl = s
12cd0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
12ce0 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20  bel(pParse);.   
12cf0 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64         windowCod
12d00 65 52 61 6e 67 65 54 65 73 74 28 26 73 2c 20 4f  eRangeTest(&s, O
12d10 50 5f 47 65 2c 20 73 2e 63 75 72 72 65 6e 74 2e  P_Ge, s.current.
12d20 63 73 72 2c 20 72 65 67 45 6e 64 2c 20 73 2e 65  csr, regEnd, s.e
12d30 6e 64 2e 63 73 72 2c 20 6c 62 6c 29 3b 0a 20 20  nd.csr, lbl);.  
12d40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12d50 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c  windowCodeOp(&s,
12d60 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52   WINDOW_RETURN_R
12d70 4f 57 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  OW, 0, 0);.     
12d80 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28     windowCodeOp(
12d90 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e  &s, WINDOW_AGGIN
12da0 56 45 52 53 45 2c 20 72 65 67 53 74 61 72 74 2c  VERSE, regStart,
12db0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
12dc0 20 72 65 67 45 6e 64 20 29 7b 0a 20 20 20 20 20   regEnd ){.     
12dd0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12de0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
12df0 6f 2c 20 30 2c 20 61 64 64 72 29 3b 0a 20 20 20  o, 0, addr);.   
12e00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
12e10 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
12e20 2c 20 6c 62 6c 29 3b 0a 20 20 20 20 20 20 20 20  , lbl);.        
12e30 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
12e40 20 20 20 20 20 20 20 69 66 28 20 72 65 67 45 6e         if( regEn
12e50 64 20 29 20 61 64 64 72 20 3d 20 73 71 6c 69 74  d ) addr = sqlit
12e60 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
12e70 4f 50 5f 49 66 50 6f 73 2c 20 72 65 67 45 6e 64  OP_IfPos, regEnd
12e80 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  , 0, 1);.       
12e90 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73   windowCodeOp(&s
12ea0 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f  , WINDOW_RETURN_
12eb0 52 4f 57 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ROW, 0, 0);.    
12ec0 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70      windowCodeOp
12ed0 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49  (&s, WINDOW_AGGI
12ee0 4e 56 45 52 53 45 2c 20 72 65 67 53 74 61 72 74  NVERSE, regStart
12ef0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
12f00 28 20 72 65 67 45 6e 64 20 29 20 73 71 6c 69 74  ( regEnd ) sqlit
12f10 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
12f20 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 7d  , addr);.      }
12f30 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 56 64 62  .    }.  }.  Vdb
12f40 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28  eModuleComment((
12f50 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 22  pParse->pVdbe, "
12f60 45 6e 64 20 57 69 6e 64 6f 77 43 6f 64 65 53 74  End WindowCodeSt
12f70 65 70 2e 53 45 43 4f 4e 44 5f 52 4f 57 22 29 29  ep.SECOND_ROW"))
12f80 3b 0a 0a 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74  ;..  /* End of t
12f90 68 65 20 6d 61 69 6e 20 69 6e 70 75 74 20 6c 6f  he main input lo
12fa0 6f 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  op */.  sqlite3V
12fb0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
12fc0 76 2c 20 6c 62 6c 57 68 65 72 65 45 6e 64 29 3b  v, lblWhereEnd);
12fd0 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  .  sqlite3WhereE
12fe0 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a 20 20 2f  nd(pWInfo);..  /
12ff0 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a  * Fall through *
13000 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70  /.  if( pMWin->p
13010 50 61 72 74 69 74 69 6f 6e 20 29 7b 0a 20 20 20  Partition ){.   
13020 20 61 64 64 72 49 6e 74 65 67 65 72 20 3d 20 73   addrInteger = s
13030 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13040 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
13050 30 2c 20 72 65 67 46 6c 75 73 68 50 61 72 74 29  0, regFlushPart)
13060 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
13070 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
13080 72 47 6f 73 75 62 46 6c 75 73 68 29 3b 0a 20 20  rGosubFlush);.  
13090 7d 0a 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43  }..  VdbeModuleC
130a0 6f 6d 6d 65 6e 74 28 28 70 50 61 72 73 65 2d 3e  omment((pParse->
130b0 70 56 64 62 65 2c 20 22 42 65 67 69 6e 20 57 69  pVdbe, "Begin Wi
130c0 6e 64 6f 77 43 6f 64 65 53 74 65 70 2e 46 4c 55  ndowCodeStep.FLU
130d0 53 48 22 29 29 3b 0a 20 20 61 64 64 72 45 6d 70  SH"));.  addrEmp
130e0 74 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ty = sqlite3Vdbe
130f0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77  AddOp1(v, OP_Rew
13100 69 6e 64 2c 20 63 73 72 57 72 69 74 65 29 3b 0a  ind, csrWrite);.
13110 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e    if( pMWin->eEn
13120 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20  d==TK_PRECEDING 
13130 29 7b 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f 64  ){.    windowCod
13140 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41  eOp(&s, WINDOW_A
13150 47 47 53 54 45 50 2c 20 72 65 67 45 6e 64 2c 20  GGSTEP, regEnd, 
13160 30 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f  0);.    windowCo
13170 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f  deOp(&s, WINDOW_
13180 52 45 54 55 52 4e 5f 52 4f 57 2c 20 30 2c 20 30  RETURN_ROW, 0, 0
13190 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
131a0 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
131b0 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20  _FOLLOWING ){.  
131c0 20 20 69 6e 74 20 61 64 64 72 53 74 61 72 74 3b    int addrStart;
131d0 0a 20 20 20 20 69 6e 74 20 61 64 64 72 42 72 65  .    int addrBre
131e0 61 6b 31 3b 0a 20 20 20 20 69 6e 74 20 61 64 64  ak1;.    int add
131f0 72 42 72 65 61 6b 32 3b 0a 20 20 20 20 69 6e 74  rBreak2;.    int
13200 20 61 64 64 72 42 72 65 61 6b 33 3b 0a 20 20 20   addrBreak3;.   
13210 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73   windowCodeOp(&s
13220 2c 20 57 49 4e 44 4f 57 5f 41 47 47 53 54 45 50  , WINDOW_AGGSTEP
13230 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
13240 20 70 4d 57 69 6e 2d 3e 65 54 79 70 65 3d 3d 54   pMWin->eType==T
13250 4b 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20  K_RANGE ){.     
13260 20 61 64 64 72 53 74 61 72 74 20 3d 20 73 71 6c   addrStart = sql
13270 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
13280 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 61 64  ddr(v);.      ad
13290 64 72 42 72 65 61 6b 32 20 3d 20 77 69 6e 64 6f  drBreak2 = windo
132a0 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44  wCodeOp(&s, WIND
132b0 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 2c 20 72  OW_AGGINVERSE, r
132c0 65 67 53 74 61 72 74 2c 20 31 29 3b 0a 20 20 20  egStart, 1);.   
132d0 20 20 20 61 64 64 72 42 72 65 61 6b 31 20 3d 20     addrBreak1 = 
132e0 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c  windowCodeOp(&s,
132f0 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52   WINDOW_RETURN_R
13300 4f 57 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d  OW, 0, 1);.    }
13310 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 4d 57  else.    if( pMW
13320 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42  in->eEnd==TK_UNB
13330 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20 20 20 20  OUNDED ){.      
13340 61 64 64 72 53 74 61 72 74 20 3d 20 73 71 6c 69  addrStart = sqli
13350 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
13360 64 72 28 76 29 3b 0a 20 20 20 20 20 20 61 64 64  dr(v);.      add
13370 72 42 72 65 61 6b 31 20 3d 20 77 69 6e 64 6f 77  rBreak1 = window
13380 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f  CodeOp(&s, WINDO
13390 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 72 65  W_RETURN_ROW, re
133a0 67 53 74 61 72 74 2c 20 31 29 3b 0a 20 20 20 20  gStart, 1);.    
133b0 20 20 61 64 64 72 42 72 65 61 6b 32 20 3d 20 77    addrBreak2 = w
133c0 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20  indowCodeOp(&s, 
133d0 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53  WINDOW_AGGINVERS
133e0 45 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d 65  E, 0, 1);.    }e
133f0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
13400 74 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  t( pMWin->eEnd==
13410 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 3b 0a  TK_FOLLOWING );.
13420 20 20 20 20 20 20 61 64 64 72 53 74 61 72 74 20        addrStart 
13430 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
13440 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
13450 20 20 20 61 64 64 72 42 72 65 61 6b 31 20 3d 20     addrBreak1 = 
13460 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c  windowCodeOp(&s,
13470 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52   WINDOW_RETURN_R
13480 4f 57 2c 20 72 65 67 45 6e 64 2c 20 31 29 3b 0a  OW, regEnd, 1);.
13490 20 20 20 20 20 20 61 64 64 72 42 72 65 61 6b 32        addrBreak2
134a0 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28   = windowCodeOp(
134b0 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e  &s, WINDOW_AGGIN
134c0 56 45 52 53 45 2c 20 72 65 67 53 74 61 72 74 2c  VERSE, regStart,
134d0 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   1);.    }.    s
134e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
134f0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
13500 61 64 64 72 53 74 61 72 74 29 3b 0a 20 20 20 20  addrStart);.    
13510 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
13520 65 72 65 28 76 2c 20 61 64 64 72 42 72 65 61 6b  ere(v, addrBreak
13530 32 29 3b 0a 20 20 20 20 61 64 64 72 53 74 61 72  2);.    addrStar
13540 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
13550 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
13560 20 20 20 61 64 64 72 42 72 65 61 6b 33 20 3d 20     addrBreak3 = 
13570 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c  windowCodeOp(&s,
13580 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52   WINDOW_RETURN_R
13590 4f 57 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 73  OW, 0, 1);.    s
135a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
135b0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
135c0 61 64 64 72 53 74 61 72 74 29 3b 0a 20 20 20 20  addrStart);.    
135d0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
135e0 65 72 65 28 76 2c 20 61 64 64 72 42 72 65 61 6b  ere(v, addrBreak
135f0 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
13600 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
13610 64 64 72 42 72 65 61 6b 33 29 3b 0a 20 20 7d 65  ddrBreak3);.  }e
13620 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  lse{.    int add
13630 72 42 72 65 61 6b 3b 0a 20 20 20 20 69 6e 74 20  rBreak;.    int 
13640 61 64 64 72 53 74 61 72 74 3b 0a 20 20 20 20 77  addrStart;.    w
13650 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20  indowCodeOp(&s, 
13660 57 49 4e 44 4f 57 5f 41 47 47 53 54 45 50 2c 20  WINDOW_AGGSTEP, 
13670 30 2c 20 30 29 3b 0a 20 20 20 20 61 64 64 72 53  0, 0);.    addrS
13680 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
13690 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
136a0 3b 0a 20 20 20 20 61 64 64 72 42 72 65 61 6b 20  ;.    addrBreak 
136b0 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26  = windowCodeOp(&
136c0 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e  s, WINDOW_RETURN
136d0 5f 52 4f 57 2c 20 30 2c 20 31 29 3b 0a 20 20 20  _ROW, 0, 1);.   
136e0 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73   windowCodeOp(&s
136f0 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45  , WINDOW_AGGINVE
13700 52 53 45 2c 20 72 65 67 53 74 61 72 74 2c 20 30  RSE, regStart, 0
13710 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
13720 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
13730 6f 74 6f 2c 20 30 2c 20 61 64 64 72 53 74 61 72  oto, 0, addrStar
13740 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
13750 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
13760 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 7d 0a 20  ddrBreak);.  }. 
13770 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
13780 48 65 72 65 28 76 2c 20 61 64 64 72 45 6d 70 74  Here(v, addrEmpt
13790 79 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56 64  y);..  sqlite3Vd
137a0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
137b0 65 73 65 74 53 6f 72 74 65 72 2c 20 73 2e 63 75  esetSorter, s.cu
137c0 72 72 65 6e 74 2e 63 73 72 29 3b 0a 20 20 73 71  rrent.csr);.  sq
137d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
137e0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
137f0 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 46 69 72 73  , pMWin->regFirs
13800 74 29 3b 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65  t);.  VdbeModule
13810 43 6f 6d 6d 65 6e 74 28 28 70 50 61 72 73 65 2d  Comment((pParse-
13820 3e 70 56 64 62 65 2c 20 22 45 6e 64 20 57 69 6e  >pVdbe, "End Win
13830 64 6f 77 43 6f 64 65 53 74 65 70 2e 46 4c 55 53  dowCodeStep.FLUS
13840 48 22 29 29 3b 0a 20 20 69 66 28 20 70 4d 57 69  H"));.  if( pMWi
13850 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 29 7b  n->pPartition ){
13860 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13870 43 68 61 6e 67 65 50 31 28 76 2c 20 61 64 64 72  ChangeP1(v, addr
13880 49 6e 74 65 67 65 72 2c 20 73 71 6c 69 74 65 33  Integer, sqlite3
13890 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
138a0 76 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  v));.    sqlite3
138b0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
138c0 5f 52 65 74 75 72 6e 2c 20 72 65 67 46 6c 75 73  _Return, regFlus
138d0 68 50 61 72 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  hPart);.  }.}..#
138e0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
138f0 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20  OMIT_WINDOWFUNC 
13900 2a 2f 0a                                         */.