/ Hex Artifact Content
Login

Artifact 76d83479ab5d0379c1641e3e342f25c6e9f12987e59ce72d1ddcf3220bbad818:


0000: 2f 2a 0a 2a 2a 20 32 30 31 38 20 4d 61 79 20 30  /*.** 2018 May 0
0010: 38 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  8.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
0180: 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 6e  liteInt.h"..#ifn
0190: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
01a0: 57 49 4e 44 4f 57 46 55 4e 43 0a 0a 2f 2a 0a 2a  WINDOWFUNC../*.*
01b0: 2a 20 53 45 4c 45 43 54 20 52 45 57 52 49 54 49  * SELECT REWRITI
01c0: 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 41 6e 79 20 53  NG.**.**   Any S
01d0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
01e0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  that contains on
01f0: 65 20 6f 72 20 6d 6f 72 65 20 77 69 6e 64 6f 77  e or more window
0200: 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 0a 2a 2a   functions in.**
0210: 20 20 20 65 69 74 68 65 72 20 74 68 65 20 73 65     either the se
0220: 6c 65 63 74 20 6c 69 73 74 20 6f 72 20 4f 52 44  lect list or ORD
0230: 45 52 20 42 59 20 63 6c 61 75 73 65 20 28 74 68  ER BY clause (th
0240: 65 20 6f 6e 6c 79 20 74 77 6f 20 70 6c 61 63 65  e only two place
0250: 73 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20 66 75  s window.**   fu
0260: 6e 63 74 69 6f 6e 73 20 6d 61 79 20 62 65 20 75  nctions may be u
0270: 73 65 64 29 20 69 73 20 74 72 61 6e 73 66 6f 72  sed) is transfor
0280: 6d 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20  med by function 
0290: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 52 65 77  sqlite3WindowRew
02a0: 72 69 74 65 28 29 0a 2a 2a 20 20 20 69 6e 20 6f  rite().**   in o
02b0: 72 64 65 72 20 74 6f 20 73 75 70 70 6f 72 74 20  rder to support 
02c0: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
02d0: 70 72 6f 63 65 73 73 69 6e 67 2e 20 46 6f 72 20  processing. For 
02e0: 65 78 61 6d 70 6c 65 2c 20 77 69 74 68 20 74 68  example, with th
02f0: 65 0a 2a 2a 20 20 20 73 63 68 65 6d 61 3a 0a 2a  e.**   schema:.*
0300: 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20  *.**     CREATE 
0310: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63  TABLE t1(a, b, c
0320: 2c 20 64 2c 20 65 2c 20 66 2c 20 67 29 3b 0a 2a  , d, e, f, g);.*
0330: 2a 0a 2a 2a 20 20 20 74 68 65 20 73 74 61 74 65  *.**   the state
0340: 6d 65 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment:.**.**     
0350: 53 45 4c 45 43 54 20 61 2b 31 2c 20 6d 61 78 28  SELECT a+1, max(
0360: 62 29 20 4f 56 45 52 20 28 50 41 52 54 49 54 49  b) OVER (PARTITI
0370: 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20 42 59  ON BY c ORDER BY
0380: 20 64 29 20 46 52 4f 4d 20 74 31 20 4f 52 44 45   d) FROM t1 ORDE
0390: 52 20 42 59 20 65 3b 0a 2a 2a 0a 2a 2a 20 20 20  R BY e;.**.**   
03a0: 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74  is transformed t
03b0: 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  o:.**.**     SEL
03c0: 45 43 54 20 61 2b 31 2c 20 6d 61 78 28 62 29 20  ECT a+1, max(b) 
03d0: 4f 56 45 52 20 28 50 41 52 54 49 54 49 4f 4e 20  OVER (PARTITION 
03e0: 42 59 20 63 20 4f 52 44 45 52 20 42 59 20 64 29  BY c ORDER BY d)
03f0: 20 46 52 4f 4d 20 28 0a 2a 2a 20 20 20 20 20 20   FROM (.**      
0400: 20 20 20 53 45 4c 45 43 54 20 61 2c 20 65 2c 20     SELECT a, e, 
0410: 63 2c 20 64 2c 20 62 20 46 52 4f 4d 20 74 31 20  c, d, b FROM t1 
0420: 4f 52 44 45 52 20 42 59 20 63 2c 20 64 0a 2a 2a  ORDER BY c, d.**
0430: 20 20 20 20 20 29 20 4f 52 44 45 52 20 42 59 20       ) ORDER BY 
0440: 65 3b 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66  e;.**.**   The f
0450: 6c 61 74 74 65 6e 69 6e 67 20 6f 70 74 69 6d 69  lattening optimi
0460: 7a 61 74 69 6f 6e 20 69 73 20 64 69 73 61 62 6c  zation is disabl
0470: 65 64 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69  ed when processi
0480: 6e 67 20 74 68 69 73 20 74 72 61 6e 73 66 6f 72  ng this transfor
0490: 6d 65 64 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  med.**   SELECT 
04a0: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
04b0: 61 6c 6c 6f 77 73 20 74 68 65 20 69 6d 70 6c 65  allows the imple
04c0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
04d0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
04e0: 0a 2a 2a 20 20 20 28 69 6e 20 74 68 69 73 20 63  .**   (in this c
04f0: 61 73 65 20 6d 61 78 28 29 29 20 74 6f 20 70 72  ase max()) to pr
0500: 6f 63 65 73 73 20 72 6f 77 73 20 73 6f 72 74 65  ocess rows sorte
0510: 64 20 69 6e 20 6f 72 64 65 72 20 6f 66 20 28 63  d in order of (c
0520: 2c 20 64 29 2c 20 77 68 69 63 68 0a 2a 2a 20 20  , d), which.**  
0530: 20 6d 61 6b 65 73 20 74 68 69 6e 67 73 20 65 61   makes things ea
0540: 73 69 65 72 20 66 6f 72 20 6f 62 76 69 6f 75 73  sier for obvious
0550: 20 72 65 61 73 6f 6e 73 2e 20 4d 6f 72 65 20 67   reasons. More g
0560: 65 6e 65 72 61 6c 6c 79 3a 0a 2a 2a 0a 2a 2a 20  enerally:.**.** 
0570: 20 20 20 20 2a 20 46 52 4f 4d 2c 20 57 48 45 52      * FROM, WHER
0580: 45 2c 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20  E, GROUP BY and 
0590: 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73 20 61  HAVING clauses a
05a0: 72 65 20 61 6c 6c 20 6d 6f 76 65 64 20 74 6f 20  re all moved to 
05b0: 0a 2a 2a 20 20 20 20 20 20 20 74 68 65 20 73 75  .**       the su
05c0: 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  b-query..**.**  
05d0: 20 20 20 2a 20 4f 52 44 45 52 20 42 59 2c 20 4c     * ORDER BY, L
05e0: 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
05f0: 72 65 6d 61 69 6e 20 70 61 72 74 20 6f 66 20 74  remain part of t
0600: 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 2e  he parent query.
0610: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 65 72  .**.**     * Ter
0620: 6d 69 6e 61 6c 73 20 66 72 6f 6d 20 65 61 63 68  minals from each
0630: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
0640: 6f 6e 20 74 72 65 65 73 20 74 68 61 74 20 6d 61  on trees that ma
0650: 6b 65 20 75 70 20 74 68 65 20 0a 2a 2a 20 20 20  ke up the .**   
0660: 20 20 20 20 73 65 6c 65 63 74 2d 6c 69 73 74 20      select-list 
0670: 61 6e 64 20 4f 52 44 45 52 20 42 59 20 65 78 70  and ORDER BY exp
0680: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20  ressions in the 
0690: 70 61 72 65 6e 74 20 71 75 65 72 79 20 61 72 65  parent query are
06a0: 0a 2a 2a 20 20 20 20 20 20 20 73 65 6c 65 63 74  .**       select
06b0: 65 64 20 62 79 20 74 68 65 20 73 75 62 2d 71 75  ed by the sub-qu
06c0: 65 72 79 2e 20 46 6f 72 20 74 68 65 20 70 75 72  ery. For the pur
06d0: 70 6f 73 65 73 20 6f 66 20 74 68 65 20 74 72 61  poses of the tra
06e0: 6e 73 66 6f 72 6d 61 74 69 6f 6e 2c 0a 2a 2a 20  nsformation,.** 
06f0: 20 20 20 20 20 20 74 65 72 6d 69 6e 61 6c 73 20        terminals 
0700: 61 72 65 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72  are column refer
0710: 65 6e 63 65 73 20 61 6e 64 20 61 67 67 72 65 67  ences and aggreg
0720: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  ate functions..*
0730: 2a 0a 2a 2a 20 20 20 49 66 20 74 68 65 72 65 20  *.**   If there 
0740: 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  is more than one
0750: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
0760: 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 74   in the SELECT t
0770: 68 61 74 20 75 73 65 73 0a 2a 2a 20 20 20 74 68  hat uses.**   th
0780: 65 20 73 61 6d 65 20 77 69 6e 64 6f 77 20 64 65  e same window de
0790: 63 6c 61 72 61 74 69 6f 6e 20 28 74 68 65 20 4f  claration (the O
07a0: 56 45 52 20 62 69 74 29 2c 20 74 68 65 6e 20 61  VER bit), then a
07b0: 20 73 69 6e 67 6c 65 20 73 63 61 6e 20 6d 61 79   single scan may
07c0: 0a 2a 2a 20 20 20 62 65 20 75 73 65 64 20 74 6f  .**   be used to
07d0: 20 70 72 6f 63 65 73 73 20 6d 6f 72 65 20 74 68   process more th
07e0: 61 6e 20 6f 6e 65 20 77 69 6e 64 6f 77 20 66 75  an one window fu
07f0: 6e 63 74 69 6f 6e 2e 20 46 6f 72 20 65 78 61 6d  nction. For exam
0800: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ple:.**.**     S
0810: 45 4c 45 43 54 20 6d 61 78 28 62 29 20 4f 56 45  ELECT max(b) OVE
0820: 52 20 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20  R (PARTITION BY 
0830: 63 20 4f 52 44 45 52 20 42 59 20 64 29 2c 20 0a  c ORDER BY d), .
0840: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 6d 69  **            mi
0850: 6e 28 65 29 20 4f 56 45 52 20 28 50 41 52 54 49  n(e) OVER (PARTI
0860: 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20  TION BY c ORDER 
0870: 42 59 20 64 29 20 0a 2a 2a 20 20 20 20 20 46 52  BY d) .**     FR
0880: 4f 4d 20 74 31 3b 0a 2a 2a 0a 2a 2a 20 20 20 69  OM t1;.**.**   i
0890: 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  s transformed in
08a0: 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73   the same way as
08b0: 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f   the example abo
08c0: 76 65 2e 20 48 6f 77 65 76 65 72 3a 0a 2a 2a 0a  ve. However:.**.
08d0: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 6d 61  **     SELECT ma
08e0: 78 28 62 29 20 4f 56 45 52 20 28 50 41 52 54 49  x(b) OVER (PARTI
08f0: 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20  TION BY c ORDER 
0900: 42 59 20 64 29 2c 20 0a 2a 2a 20 20 20 20 20 20  BY d), .**      
0910: 20 20 20 20 20 20 6d 69 6e 28 65 29 20 4f 56 45        min(e) OVE
0920: 52 20 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20  R (PARTITION BY 
0930: 61 20 4f 52 44 45 52 20 42 59 20 62 29 20 0a 2a  a ORDER BY b) .*
0940: 2a 20 20 20 20 20 46 52 4f 4d 20 74 31 3b 0a 2a  *     FROM t1;.*
0950: 2a 0a 2a 2a 20 20 20 4d 75 73 74 20 62 65 20 74  *.**   Must be t
0960: 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 2a  ransformed to:.*
0970: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
0980: 6d 61 78 28 62 29 20 4f 56 45 52 20 28 50 41 52  max(b) OVER (PAR
0990: 54 49 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45  TITION BY c ORDE
09a0: 52 20 42 59 20 64 29 20 46 52 4f 4d 20 28 0a 2a  R BY d) FROM (.*
09b0: 2a 20 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  *         SELECT
09c0: 20 65 2c 20 6d 69 6e 28 65 29 20 4f 56 45 52 20   e, min(e) OVER 
09d0: 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20 61 20  (PARTITION BY a 
09e0: 4f 52 44 45 52 20 42 59 20 62 29 2c 20 63 2c 20  ORDER BY b), c, 
09f0: 64 2c 20 62 20 46 52 4f 4d 0a 2a 2a 20 20 20 20  d, b FROM.**    
0a00: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 2c         SELECT a,
0a10: 20 65 2c 20 63 2c 20 64 2c 20 62 20 46 52 4f 4d   e, c, d, b FROM
0a20: 20 74 31 20 4f 52 44 45 52 20 42 59 20 61 2c 20   t1 ORDER BY a, 
0a30: 62 0a 2a 2a 20 20 20 20 20 20 20 20 20 29 20 4f  b.**         ) O
0a40: 52 44 45 52 20 42 59 20 63 2c 20 64 0a 2a 2a 20  RDER BY c, d.** 
0a50: 20 20 20 20 29 20 4f 52 44 45 52 20 42 59 20 65      ) ORDER BY e
0a60: 3b 0a 2a 2a 0a 2a 2a 20 20 20 73 6f 20 74 68 61  ;.**.**   so tha
0a70: 74 20 62 6f 74 68 20 6d 69 6e 28 29 20 61 6e 64  t both min() and
0a80: 20 6d 61 78 28 29 20 6d 61 79 20 70 72 6f 63 65   max() may proce
0a90: 73 73 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6f  ss rows in the o
0aa0: 72 64 65 72 20 64 65 66 69 6e 65 64 20 62 79 0a  rder defined by.
0ab0: 2a 2a 20 20 20 74 68 65 69 72 20 72 65 73 70 65  **   their respe
0ac0: 63 74 69 76 65 20 77 69 6e 64 6f 77 20 64 65 63  ctive window dec
0ad0: 6c 61 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  larations..**.**
0ae0: 20 49 4e 54 45 52 46 41 43 45 20 57 49 54 48 20   INTERFACE WITH 
0af0: 53 45 4c 45 43 54 2e 43 0a 2a 2a 0a 2a 2a 20 20  SELECT.C.**.**  
0b00: 20 57 68 65 6e 20 70 72 6f 63 65 73 73 69 6e 67   When processing
0b10: 20 74 68 65 20 72 65 77 72 69 74 74 65 6e 20 53   the rewritten S
0b20: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
0b30: 20 63 6f 64 65 20 69 6e 20 73 65 6c 65 63 74 2e   code in select.
0b40: 63 20 63 61 6c 6c 73 0a 2a 2a 20 20 20 73 71 6c  c calls.**   sql
0b50: 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
0b60: 20 74 6f 20 62 65 67 69 6e 20 69 74 65 72 61 74   to begin iterat
0b70: 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68 65 20  ing through the 
0b80: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 0a 2a  results of the.*
0b90: 2a 20 20 20 73 75 62 2d 71 75 65 72 79 2c 20 77  *   sub-query, w
0ba0: 68 69 63 68 20 69 73 20 61 6c 77 61 79 73 20 69  hich is always i
0bb0: 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
0bc0: 63 6f 2d 72 6f 75 74 69 6e 65 2e 20 49 74 20 74  co-routine. It t
0bd0: 68 65 6e 20 63 61 6c 6c 73 0a 2a 2a 20 20 20 73  hen calls.**   s
0be0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65  qlite3WindowCode
0bf0: 53 74 65 70 28 29 20 74 6f 20 70 72 6f 63 65 73  Step() to proces
0c00: 73 20 72 6f 77 73 20 61 6e 64 20 66 69 6e 69 73  s rows and finis
0c10: 68 20 74 68 65 20 73 63 61 6e 20 62 79 20 63 61  h the scan by ca
0c20: 6c 6c 69 6e 67 0a 2a 2a 20 20 20 73 71 6c 69 74  lling.**   sqlit
0c30: 65 33 57 68 65 72 65 45 6e 64 28 29 2e 0a 2a 2a  e3WhereEnd()..**
0c40: 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 57 69 6e  .**   sqlite3Win
0c50: 64 6f 77 43 6f 64 65 53 74 65 70 28 29 20 67 65  dowCodeStep() ge
0c60: 6e 65 72 61 74 65 73 20 56 4d 20 63 6f 64 65 20  nerates VM code 
0c70: 73 6f 20 74 68 61 74 2c 20 66 6f 72 20 65 61 63  so that, for eac
0c80: 68 20 72 6f 77 20 72 65 74 75 72 6e 65 64 0a 2a  h row returned.*
0c90: 2a 20 20 20 62 79 20 74 68 65 20 73 75 62 2d 71  *   by the sub-q
0ca0: 75 65 72 79 20 61 20 73 75 62 2d 72 6f 75 74 69  uery a sub-routi
0cb0: 6e 65 20 28 4f 50 5f 47 6f 73 75 62 29 20 63 6f  ne (OP_Gosub) co
0cc0: 64 65 64 20 62 79 20 73 65 6c 65 63 74 2e 63 20  ded by select.c 
0cd0: 69 73 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2a 20 20  is invoked..**  
0ce0: 20 57 68 65 6e 20 74 68 65 20 73 75 62 2d 72 6f   When the sub-ro
0cf0: 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64  utine is invoked
0d00: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 68  :.**.**     * Th
0d10: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 61 6c 6c  e results of all
0d20: 20 77 69 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e   window-function
0d30: 73 20 66 6f 72 20 74 68 65 20 72 6f 77 20 61 72  s for the row ar
0d40: 65 20 73 74 6f 72 65 64 0a 2a 2a 20 20 20 20 20  e stored.**     
0d50: 20 20 69 6e 20 74 68 65 20 61 73 73 6f 63 69 61    in the associa
0d60: 74 65 64 20 57 69 6e 64 6f 77 2e 72 65 67 52 65  ted Window.regRe
0d70: 73 75 6c 74 20 72 65 67 69 73 74 65 72 73 2e 0a  sult registers..
0d80: 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 68 65 20  **.**     * The 
0d90: 72 65 71 75 69 72 65 64 20 74 65 72 6d 69 6e 61  required termina
0da0: 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f  l values are sto
0db0: 72 65 64 20 69 6e 20 74 68 65 20 63 75 72 72 65  red in the curre
0dc0: 6e 74 20 72 6f 77 20 6f 66 0a 2a 2a 20 20 20 20  nt row of.**    
0dd0: 20 20 20 74 65 6d 70 20 74 61 62 6c 65 20 57 69     temp table Wi
0de0: 6e 64 6f 77 2e 69 45 70 68 43 73 72 2e 0a 2a 2a  ndow.iEphCsr..**
0df0: 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 63 61  .**   In some ca
0e00: 73 65 73 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  ses, depending o
0e10: 6e 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61  n the window fra
0e20: 6d 65 20 61 6e 64 20 74 68 65 20 73 70 65 63 69  me and the speci
0e30: 66 69 63 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20  fic window.**   
0e40: 66 75 6e 63 74 69 6f 6e 73 20 69 6e 76 6f 6b 65  functions invoke
0e50: 64 2c 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  d, sqlite3Window
0e60: 43 6f 64 65 53 74 65 70 28 29 20 63 61 63 68 65  CodeStep() cache
0e70: 73 20 65 61 63 68 20 65 6e 74 69 72 65 20 70 61  s each entire pa
0e80: 72 74 69 74 69 6f 6e 0a 2a 2a 20 20 20 69 6e 20  rtition.**   in 
0e90: 61 20 74 65 6d 70 20 74 61 62 6c 65 20 62 65 66  a temp table bef
0ea0: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 61 6e  ore returning an
0eb0: 79 20 72 6f 77 73 2e 20 49 6e 20 6f 74 68 65 72  y rows. In other
0ec0: 20 63 61 73 65 73 20 69 74 20 64 6f 65 73 20 6e   cases it does n
0ed0: 6f 74 2e 0a 2a 2a 20 20 20 54 68 69 73 20 64 65  ot..**   This de
0ee0: 74 61 69 6c 20 69 73 20 65 6e 63 61 70 73 75 6c  tail is encapsul
0ef0: 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 69 73  ated within this
0f00: 20 66 69 6c 65 2c 20 74 68 65 20 63 6f 64 65 20   file, the code 
0f10: 67 65 6e 65 72 61 74 65 64 20 62 79 0a 2a 2a 20  generated by.** 
0f20: 20 20 73 65 6c 65 63 74 2e 63 20 69 73 20 74 68    select.c is th
0f30: 65 20 73 61 6d 65 20 69 6e 20 65 69 74 68 65 72  e same in either
0f40: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 55 49   case..**.** BUI
0f50: 4c 54 2d 49 4e 20 57 49 4e 44 4f 57 20 46 55 4e  LT-IN WINDOW FUN
0f60: 43 54 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 54  CTIONS.**.**   T
0f70: 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  his implementati
0f80: 6f 6e 20 66 65 61 74 75 72 65 73 20 74 68 65 20  on features the 
0f90: 66 6f 6c 6c 6f 77 69 6e 67 20 62 75 69 6c 74 2d  following built-
0fa0: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
0fb0: 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72  ons:.**.**     r
0fc0: 6f 77 5f 6e 75 6d 62 65 72 28 29 0a 2a 2a 20 20  ow_number().**  
0fd0: 20 20 20 72 61 6e 6b 28 29 0a 2a 2a 20 20 20 20     rank().**    
0fe0: 20 64 65 6e 73 65 5f 72 61 6e 6b 28 29 0a 2a 2a   dense_rank().**
0ff0: 20 20 20 20 20 70 65 72 63 65 6e 74 5f 72 61 6e       percent_ran
1000: 6b 28 29 0a 2a 2a 20 20 20 20 20 63 75 6d 65 5f  k().**     cume_
1010: 64 69 73 74 28 29 0a 2a 2a 20 20 20 20 20 6e 74  dist().**     nt
1020: 69 6c 65 28 4e 29 0a 2a 2a 20 20 20 20 20 6c 65  ile(N).**     le
1030: 61 64 28 65 78 70 72 20 5b 2c 20 6f 66 66 73 65  ad(expr [, offse
1040: 74 20 5b 2c 20 64 65 66 61 75 6c 74 5d 5d 29 0a  t [, default]]).
1050: 2a 2a 20 20 20 20 20 6c 61 67 28 65 78 70 72 20  **     lag(expr 
1060: 5b 2c 20 6f 66 66 73 65 74 20 5b 2c 20 64 65 66  [, offset [, def
1070: 61 75 6c 74 5d 5d 29 0a 2a 2a 20 20 20 20 20 66  ault]]).**     f
1080: 69 72 73 74 5f 76 61 6c 75 65 28 65 78 70 72 29  irst_value(expr)
1090: 0a 2a 2a 20 20 20 20 20 6c 61 73 74 5f 76 61 6c  .**     last_val
10a0: 75 65 28 65 78 70 72 29 0a 2a 2a 20 20 20 20 20  ue(expr).**     
10b0: 6e 74 68 5f 76 61 6c 75 65 28 65 78 70 72 2c 20  nth_value(expr, 
10c0: 4e 29 0a 2a 2a 20 20 20 0a 2a 2a 20 20 20 54 68  N).**   .**   Th
10d0: 65 73 65 20 61 72 65 20 74 68 65 20 73 61 6d 65  ese are the same
10e0: 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77   built-in window
10f0: 20 66 75 6e 63 74 69 6f 6e 73 20 73 75 70 70 6f   functions suppo
1100: 72 74 65 64 20 62 79 20 50 6f 73 74 67 72 65 73  rted by Postgres
1110: 2e 20 0a 2a 2a 20 20 20 41 6c 74 68 6f 75 67 68  . .**   Although
1120: 20 74 68 65 20 62 65 68 61 76 69 6f 75 72 20 6f   the behaviour o
1130: 66 20 61 67 67 72 65 67 61 74 65 20 77 69 6e 64  f aggregate wind
1140: 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 28 66 75  ow functions (fu
1150: 6e 63 74 69 6f 6e 73 20 74 68 61 74 0a 2a 2a 20  nctions that.** 
1160: 20 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 73    can be used as
1170: 20 65 69 74 68 65 72 20 61 67 67 72 65 67 61 74   either aggregat
1180: 65 73 20 6f 72 20 77 69 6e 64 6f 77 20 66 75 6e  es or window fun
1190: 74 69 6f 6e 73 29 20 61 6c 6c 6f 77 73 20 74 68  tions) allows th
11a0: 65 6d 20 74 6f 0a 2a 2a 20 20 20 62 65 20 69 6d  em to.**   be im
11b0: 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20  plemented using 
11c0: 61 6e 20 41 50 49 2c 20 62 75 69 6c 74 2d 69 6e  an API, built-in
11d0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
11e0: 73 20 61 72 65 20 6d 75 63 68 20 6d 6f 72 65 0a  s are much more.
11f0: 2a 2a 20 20 20 65 73 6f 74 65 72 69 63 2e 20 41  **   esoteric. A
1200: 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 73 6f 6d  dditionally, som
1210: 65 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  e window functio
1220: 6e 73 20 28 65 2e 67 2e 20 6e 74 68 5f 76 61 6c  ns (e.g. nth_val
1230: 75 65 28 29 29 20 0a 2a 2a 20 20 20 6d 61 79 20  ue()) .**   may 
1240: 6f 6e 6c 79 20 62 65 20 69 6d 70 6c 65 6d 65 6e  only be implemen
1250: 74 65 64 20 62 79 20 63 61 63 68 69 6e 67 20 74  ted by caching t
1260: 68 65 20 65 6e 74 69 72 65 20 70 61 72 74 69 74  he entire partit
1270: 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a  ion in memory..*
1280: 2a 20 20 20 41 73 20 73 75 63 68 2c 20 73 6f 6d  *   As such, som
1290: 65 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  e built-in windo
12a0: 77 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 20  w functions use 
12b0: 74 68 65 20 73 61 6d 65 20 41 50 49 20 61 73 20  the same API as 
12c0: 61 67 67 72 65 67 61 74 65 0a 2a 2a 20 20 20 77  aggregate.**   w
12d0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
12e0: 61 6e 64 20 73 6f 6d 65 20 61 72 65 20 69 6d 70  and some are imp
12f0: 6c 65 6d 65 6e 74 65 64 20 64 69 72 65 63 74 6c  lemented directl
1300: 79 20 75 73 69 6e 67 20 56 44 42 45 20 0a 2a 2a  y using VDBE .**
1310: 20 20 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e     instructions.
1320: 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 66   Additionally, f
1330: 6f 72 20 74 68 6f 73 65 20 66 75 6e 63 74 69 6f  or those functio
1340: 6e 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20  ns that use the 
1350: 41 50 49 2c 20 74 68 65 0a 2a 2a 20 20 20 77 69  API, the.**   wi
1360: 6e 64 6f 77 20 66 72 61 6d 65 20 69 73 20 73 6f  ndow frame is so
1370: 6d 65 74 69 6d 65 73 20 6d 6f 64 69 66 69 65 64  metimes modified
1380: 20 62 65 66 6f 72 65 20 74 68 65 20 53 45 4c 45   before the SELE
1390: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a  CT statement is.
13a0: 2a 2a 20 20 20 72 65 77 72 69 74 74 65 6e 2e 20  **   rewritten. 
13b0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 72 65 67  For example, reg
13c0: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 73  ardless of the s
13d0: 70 65 63 69 66 69 65 64 20 77 69 6e 64 6f 77 20  pecified window 
13e0: 66 72 61 6d 65 2c 20 74 68 65 0a 2a 2a 20 20 20  frame, the.**   
13f0: 72 6f 77 5f 6e 75 6d 62 65 72 28 29 20 66 75 6e  row_number() fun
1400: 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 75 73 65  ction always use
1410: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 4f 57  s:.**.**     ROW
1420: 53 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e  S BETWEEN UNBOUN
1430: 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e  DED PRECEDING AN
1440: 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a  D CURRENT ROW.**
1450: 0a 2a 2a 20 20 20 53 65 65 20 73 71 6c 69 74 65  .**   See sqlite
1460: 33 57 69 6e 64 6f 77 55 70 64 61 74 65 28 29 20  3WindowUpdate() 
1470: 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  for details..**.
1480: 2a 2a 20 20 20 41 73 20 77 65 6c 6c 20 61 73 20  **   As well as 
1490: 73 6f 6d 65 20 6f 66 20 74 68 65 20 62 75 69 6c  some of the buil
14a0: 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63  t-in window func
14b0: 74 69 6f 6e 73 2c 20 61 67 67 72 65 67 61 74 65  tions, aggregate
14c0: 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20 66 75 6e   window.**   fun
14d0: 63 74 69 6f 6e 73 20 6d 69 6e 28 29 20 61 6e 64  ctions min() and
14e0: 20 6d 61 78 28 29 20 61 72 65 20 69 6d 70 6c 65   max() are imple
14f0: 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 56 44 42  mented using VDB
1500: 45 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 69  E instructions i
1510: 66 0a 2a 2a 20 20 20 74 68 65 20 73 74 61 72 74  f.**   the start
1520: 20 6f 66 20 74 68 65 20 77 69 6e 64 6f 77 20 66   of the window f
1530: 72 61 6d 65 20 69 73 20 64 65 63 6c 61 72 65 64  rame is declared
1540: 20 61 73 20 61 6e 79 74 68 69 6e 67 20 6f 74 68   as anything oth
1550: 65 72 20 74 68 61 6e 20 0a 2a 2a 20 20 20 55 4e  er than .**   UN
1560: 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e  BOUNDED PRECEDIN
1570: 47 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  G..*/../*.** Imp
1580: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 62  lementation of b
1590: 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66  uilt-in window f
15a0: 75 6e 63 74 69 6f 6e 20 72 6f 77 5f 6e 75 6d 62  unction row_numb
15b0: 65 72 28 29 2e 20 41 73 73 75 6d 65 73 20 74 68  er(). Assumes th
15c0: 61 74 20 74 68 65 0a 2a 2a 20 77 69 6e 64 6f 77  at the.** window
15d0: 20 66 72 61 6d 65 20 68 61 73 20 62 65 65 6e 20   frame has been 
15e0: 63 6f 65 72 63 65 64 20 74 6f 3a 0a 2a 2a 0a 2a  coerced to:.**.*
15f0: 2a 20 20 20 52 4f 57 53 20 42 45 54 57 45 45 4e  *   ROWS BETWEEN
1600: 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45   UNBOUNDED PRECE
1610: 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54  DING AND CURRENT
1620: 20 52 4f 57 0a 2a 2f 0a 73 74 61 74 69 63 20 76   ROW.*/.static v
1630: 6f 69 64 20 72 6f 77 5f 6e 75 6d 62 65 72 53 74  oid row_numberSt
1640: 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  epFunc(.  sqlite
1650: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
1660: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
1670: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
1680: 61 70 41 72 67 0a 29 7b 0a 20 20 69 36 34 20 2a  apArg.){.  i64 *
1690: 70 20 3d 20 28 69 36 34 2a 29 73 71 6c 69 74 65  p = (i64*)sqlite
16a0: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
16b0: 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66  ext(pCtx, sizeof
16c0: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29  (*p));.  if( p )
16d0: 20 28 2a 70 29 2b 2b 3b 0a 20 20 55 4e 55 53 45   (*p)++;.  UNUSE
16e0: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72 67  D_PARAMETER(nArg
16f0: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1700: 4d 45 54 45 52 28 61 70 41 72 67 29 3b 0a 7d 0a  METER(apArg);.}.
1710: 73 74 61 74 69 63 20 76 6f 69 64 20 72 6f 77 5f  static void row_
1720: 6e 75 6d 62 65 72 56 61 6c 75 65 46 75 6e 63 28  numberValueFunc(
1730: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1740: 2a 70 43 74 78 29 7b 0a 20 20 69 36 34 20 2a 70  *pCtx){.  i64 *p
1750: 20 3d 20 28 69 36 34 2a 29 73 71 6c 69 74 65 33   = (i64*)sqlite3
1760: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
1770: 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28  xt(pCtx, sizeof(
1780: 2a 70 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  *p));.  sqlite3_
1790: 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74  result_int64(pCt
17a0: 78 2c 20 28 70 20 3f 20 2a 70 20 3a 20 30 29 29  x, (p ? *p : 0))
17b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65  ;.}../*.** Conte
17c0: 78 74 20 6f 62 6a 65 63 74 20 74 79 70 65 20 75  xt object type u
17d0: 73 65 64 20 62 79 20 72 61 6e 6b 28 29 2c 20 64  sed by rank(), d
17e0: 65 6e 73 65 5f 72 61 6e 6b 28 29 2c 20 70 65 72  ense_rank(), per
17f0: 63 65 6e 74 5f 72 61 6e 6b 28 29 20 61 6e 64 0a  cent_rank() and.
1800: 2a 2a 20 63 75 6d 65 5f 64 69 73 74 28 29 2e 0a  ** cume_dist()..
1810: 2a 2f 0a 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  */.struct CallCo
1820: 75 6e 74 20 7b 0a 20 20 69 36 34 20 6e 56 61 6c  unt {.  i64 nVal
1830: 75 65 3b 0a 20 20 69 36 34 20 6e 53 74 65 70 3b  ue;.  i64 nStep;
1840: 0a 20 20 69 36 34 20 6e 54 6f 74 61 6c 3b 0a 7d  .  i64 nTotal;.}
1850: 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  ;../*.** Impleme
1860: 6e 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74  ntation of built
1870: 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  -in window funct
1880: 69 6f 6e 20 64 65 6e 73 65 5f 72 61 6e 6b 28 29  ion dense_rank()
1890: 2e 20 41 73 73 75 6d 65 73 20 74 68 61 74 0a 2a  . Assumes that.*
18a0: 2a 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61  * the window fra
18b0: 6d 65 20 68 61 73 20 62 65 65 6e 20 73 65 74 20  me has been set 
18c0: 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e 47  to:.**.**   RANG
18d0: 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e  E BETWEEN UNBOUN
18e0: 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e  DED PRECEDING AN
18f0: 44 20 43 55 52 52 45 4e 54 20 52 4f 57 20 0a 2a  D CURRENT ROW .*
1900: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65  /.static void de
1910: 6e 73 65 5f 72 61 6e 6b 53 74 65 70 46 75 6e 63  nse_rankStepFunc
1920: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
1930: 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e  ext *pCtx, .  in
1940: 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65  t nArg,.  sqlite
1950: 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a  3_value **apArg.
1960: 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61 6c 6c  ){.  struct Call
1970: 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70 20 3d 20  Count *p;.  p = 
1980: 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e  (struct CallCoun
1990: 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65  t*)sqlite3_aggre
19a0: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74  gate_context(pCt
19b0: 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  x, sizeof(*p));.
19c0: 20 20 69 66 28 20 70 20 29 20 70 2d 3e 6e 53 74    if( p ) p->nSt
19d0: 65 70 20 3d 20 31 3b 0a 20 20 55 4e 55 53 45 44  ep = 1;.  UNUSED
19e0: 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72 67 29  _PARAMETER(nArg)
19f0: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1a00: 45 54 45 52 28 61 70 41 72 67 29 3b 0a 7d 0a 73  ETER(apArg);.}.s
1a10: 74 61 74 69 63 20 76 6f 69 64 20 64 65 6e 73 65  tatic void dense
1a20: 5f 72 61 6e 6b 56 61 6c 75 65 46 75 6e 63 28 73  _rankValueFunc(s
1a30: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1a40: 70 43 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20  pCtx){.  struct 
1a50: 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20  CallCount *p;.  
1a60: 70 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c  p = (struct Call
1a70: 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61  Count*)sqlite3_a
1a80: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
1a90: 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70  (pCtx, sizeof(*p
1aa0: 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ));.  if( p ){. 
1ab0: 20 20 20 69 66 28 20 70 2d 3e 6e 53 74 65 70 20     if( p->nStep 
1ac0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61 6c  ){.      p->nVal
1ad0: 75 65 2b 2b 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  ue++;.      p->n
1ae0: 53 74 65 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Step = 0;.    }.
1af0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
1b00: 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 70  lt_int64(pCtx, p
1b10: 2d 3e 6e 56 61 6c 75 65 29 3b 0a 20 20 7d 0a 7d  ->nValue);.  }.}
1b20: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
1b30: 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74 2d  tation of built-
1b40: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
1b50: 6f 6e 20 6e 74 68 5f 76 61 6c 75 65 28 29 2e 20  on nth_value(). 
1b60: 54 68 69 73 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  This.** implemen
1b70: 74 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 69  tation is used i
1b80: 6e 20 22 73 6c 6f 77 20 6d 6f 64 65 22 20 6f 6e  n "slow mode" on
1b90: 6c 79 20 2d 20 77 68 65 6e 20 74 68 65 20 45 58  ly - when the EX
1ba0: 43 4c 55 44 45 20 63 6c 61 75 73 65 0a 2a 2a 20  CLUDE clause.** 
1bb0: 69 73 20 6e 6f 74 20 73 65 74 20 74 6f 20 74 68  is not set to th
1bc0: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
1bd0: 22 4e 4f 20 4f 54 48 45 52 53 22 2e 0a 2a 2f 0a  "NO OTHERS"..*/.
1be0: 73 74 72 75 63 74 20 4e 74 68 56 61 6c 75 65 43  struct NthValueC
1bf0: 74 78 20 7b 0a 20 20 69 36 34 20 6e 53 74 65 70  tx {.  i64 nStep
1c00: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ;.  sqlite3_valu
1c10: 65 20 2a 70 56 61 6c 75 65 3b 0a 7d 3b 0a 73 74  e *pValue;.};.st
1c20: 61 74 69 63 20 76 6f 69 64 20 6e 74 68 5f 76 61  atic void nth_va
1c30: 6c 75 65 53 74 65 70 46 75 6e 63 28 0a 20 20 73  lueStepFunc(.  s
1c40: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1c50: 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72  pCtx, .  int nAr
1c60: 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  g,.  sqlite3_val
1c70: 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20  ue **apArg.){.  
1c80: 73 74 72 75 63 74 20 4e 74 68 56 61 6c 75 65 43  struct NthValueC
1c90: 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74  tx *p;.  p = (st
1ca0: 72 75 63 74 20 4e 74 68 56 61 6c 75 65 43 74 78  ruct NthValueCtx
1cb0: 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  *)sqlite3_aggreg
1cc0: 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78  ate_context(pCtx
1cd0: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
1ce0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 36   if( p ){.    i6
1cf0: 34 20 69 56 61 6c 3b 0a 20 20 20 20 73 77 69 74  4 iVal;.    swit
1d00: 63 68 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ch( sqlite3_valu
1d10: 65 5f 6e 75 6d 65 72 69 63 5f 74 79 70 65 28 61  e_numeric_type(a
1d20: 70 41 72 67 5b 31 5d 29 20 29 7b 0a 20 20 20 20  pArg[1]) ){.    
1d30: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
1d40: 54 45 47 45 52 3a 0a 20 20 20 20 20 20 20 20 69  TEGER:.        i
1d50: 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  Val = sqlite3_va
1d60: 6c 75 65 5f 69 6e 74 36 34 28 61 70 41 72 67 5b  lue_int64(apArg[
1d70: 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  1]);.        bre
1d80: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
1d90: 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20  QLITE_FLOAT: {. 
1da0: 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 66 56         double fV
1db0: 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  al = sqlite3_val
1dc0: 75 65 5f 64 6f 75 62 6c 65 28 61 70 41 72 67 5b  ue_double(apArg[
1dd0: 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  1]);.        if(
1de0: 20 28 28 69 36 34 29 66 56 61 6c 29 21 3d 66 56   ((i64)fVal)!=fV
1df0: 61 6c 20 29 20 67 6f 74 6f 20 65 72 72 6f 72 5f  al ) goto error_
1e00: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 69 56 61  out;.        iVa
1e10: 6c 20 3d 20 28 69 36 34 29 66 56 61 6c 3b 0a 20  l = (i64)fVal;. 
1e20: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1e30: 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66 61      }.      defa
1e40: 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 67 6f 74  ult:.        got
1e50: 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20  o error_out;.   
1e60: 20 7d 0a 20 20 20 20 69 66 28 20 69 56 61 6c 3c   }.    if( iVal<
1e70: 3d 30 20 29 20 67 6f 74 6f 20 65 72 72 6f 72 5f  =0 ) goto error_
1e80: 6f 75 74 3b 0a 0a 20 20 20 20 70 2d 3e 6e 53 74  out;..    p->nSt
1e90: 65 70 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69 56  ep++;.    if( iV
1ea0: 61 6c 3d 3d 70 2d 3e 6e 53 74 65 70 20 29 7b 0a  al==p->nStep ){.
1eb0: 20 20 20 20 20 20 70 2d 3e 70 56 61 6c 75 65 20        p->pValue 
1ec0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
1ed0: 64 75 70 28 61 70 41 72 67 5b 30 5d 29 3b 0a 20  dup(apArg[0]);. 
1ee0: 20 20 20 20 20 69 66 28 20 21 70 2d 3e 70 56 61       if( !p->pVa
1ef0: 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  lue ){.        s
1f00: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
1f10: 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29 3b  ror_nomem(pCtx);
1f20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1f30: 20 7d 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41   }.  UNUSED_PARA
1f40: 4d 45 54 45 52 28 6e 41 72 67 29 3b 0a 20 20 55  METER(nArg);.  U
1f50: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1f60: 61 70 41 72 67 29 3b 0a 20 20 72 65 74 75 72 6e  apArg);.  return
1f70: 3b 0a 0a 20 65 72 72 6f 72 5f 6f 75 74 3a 0a 20  ;.. error_out:. 
1f80: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1f90: 65 72 72 6f 72 28 0a 20 20 20 20 20 20 70 43 74  error(.      pCt
1fa0: 78 2c 20 22 73 65 63 6f 6e 64 20 61 72 67 75 6d  x, "second argum
1fb0: 65 6e 74 20 74 6f 20 6e 74 68 5f 76 61 6c 75 65  ent to nth_value
1fc0: 20 6d 75 73 74 20 62 65 20 61 20 70 6f 73 69 74   must be a posit
1fd0: 69 76 65 20 69 6e 74 65 67 65 72 22 2c 20 2d 31  ive integer", -1
1fe0: 0a 20 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  .  );.}.static v
1ff0: 6f 69 64 20 6e 74 68 5f 76 61 6c 75 65 46 69 6e  oid nth_valueFin
2000: 61 6c 69 7a 65 46 75 6e 63 28 73 71 6c 69 74 65  alizeFunc(sqlite
2010: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29  3_context *pCtx)
2020: 7b 0a 20 20 73 74 72 75 63 74 20 4e 74 68 56 61  {.  struct NthVa
2030: 6c 75 65 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d  lueCtx *p;.  p =
2040: 20 28 73 74 72 75 63 74 20 4e 74 68 56 61 6c 75   (struct NthValu
2050: 65 43 74 78 2a 29 73 71 6c 69 74 65 33 5f 61 67  eCtx*)sqlite3_ag
2060: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
2070: 70 43 74 78 2c 20 30 29 3b 0a 20 20 69 66 28 20  pCtx, 0);.  if( 
2080: 70 20 26 26 20 70 2d 3e 70 56 61 6c 75 65 20 29  p && p->pValue )
2090: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
20a0: 73 75 6c 74 5f 76 61 6c 75 65 28 70 43 74 78 2c  sult_value(pCtx,
20b0: 20 70 2d 3e 70 56 61 6c 75 65 29 3b 0a 20 20 20   p->pValue);.   
20c0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 66   sqlite3_value_f
20d0: 72 65 65 28 70 2d 3e 70 56 61 6c 75 65 29 3b 0a  ree(p->pValue);.
20e0: 20 20 20 20 70 2d 3e 70 56 61 6c 75 65 20 3d 20      p->pValue = 
20f0: 30 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65  0;.  }.}.#define
2100: 20 6e 74 68 5f 76 61 6c 75 65 49 6e 76 46 75 6e   nth_valueInvFun
2110: 63 20 6e 6f 6f 70 53 74 65 70 46 75 6e 63 0a 23  c noopStepFunc.#
2120: 64 65 66 69 6e 65 20 6e 74 68 5f 76 61 6c 75 65  define nth_value
2130: 56 61 6c 75 65 46 75 6e 63 20 6e 6f 6f 70 56 61  ValueFunc noopVa
2140: 6c 75 65 46 75 6e 63 0a 0a 73 74 61 74 69 63 20  lueFunc..static 
2150: 76 6f 69 64 20 66 69 72 73 74 5f 76 61 6c 75 65  void first_value
2160: 53 74 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69  StepFunc(.  sqli
2170: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
2180: 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  x, .  int nArg,.
2190: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
21a0: 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72  **apArg.){.  str
21b0: 75 63 74 20 4e 74 68 56 61 6c 75 65 43 74 78 20  uct NthValueCtx 
21c0: 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63  *p;.  p = (struc
21d0: 74 20 4e 74 68 56 61 6c 75 65 43 74 78 2a 29 73  t NthValueCtx*)s
21e0: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
21f0: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
2200: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
2210: 28 20 70 20 26 26 20 70 2d 3e 70 56 61 6c 75 65  ( p && p->pValue
2220: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 56  ==0 ){.    p->pV
2230: 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 76  alue = sqlite3_v
2240: 61 6c 75 65 5f 64 75 70 28 61 70 41 72 67 5b 30  alue_dup(apArg[0
2250: 5d 29 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e  ]);.    if( !p->
2260: 70 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20  pValue ){.      
2270: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
2280: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29  rror_nomem(pCtx)
2290: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 55 4e  ;.    }.  }.  UN
22a0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
22b0: 41 72 67 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  Arg);.  UNUSED_P
22c0: 41 52 41 4d 45 54 45 52 28 61 70 41 72 67 29 3b  ARAMETER(apArg);
22d0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  .}.static void f
22e0: 69 72 73 74 5f 76 61 6c 75 65 46 69 6e 61 6c 69  irst_valueFinali
22f0: 7a 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  zeFunc(sqlite3_c
2300: 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20  ontext *pCtx){. 
2310: 20 73 74 72 75 63 74 20 4e 74 68 56 61 6c 75 65   struct NthValue
2320: 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73  Ctx *p;.  p = (s
2330: 74 72 75 63 74 20 4e 74 68 56 61 6c 75 65 43 74  truct NthValueCt
2340: 78 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65  x*)sqlite3_aggre
2350: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74  gate_context(pCt
2360: 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  x, sizeof(*p));.
2370: 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 70 56    if( p && p->pV
2380: 61 6c 75 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  alue ){.    sqli
2390: 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65  te3_result_value
23a0: 28 70 43 74 78 2c 20 70 2d 3e 70 56 61 6c 75 65  (pCtx, p->pValue
23b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  );.    sqlite3_v
23c0: 61 6c 75 65 5f 66 72 65 65 28 70 2d 3e 70 56 61  alue_free(p->pVa
23d0: 6c 75 65 29 3b 0a 20 20 20 20 70 2d 3e 70 56 61  lue);.    p->pVa
23e0: 6c 75 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23  lue = 0;.  }.}.#
23f0: 64 65 66 69 6e 65 20 66 69 72 73 74 5f 76 61 6c  define first_val
2400: 75 65 49 6e 76 46 75 6e 63 20 6e 6f 6f 70 53 74  ueInvFunc noopSt
2410: 65 70 46 75 6e 63 0a 23 64 65 66 69 6e 65 20 66  epFunc.#define f
2420: 69 72 73 74 5f 76 61 6c 75 65 56 61 6c 75 65 46  irst_valueValueF
2430: 75 6e 63 20 6e 6f 6f 70 56 61 6c 75 65 46 75 6e  unc noopValueFun
2440: 63 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  c../*.** Impleme
2450: 6e 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74  ntation of built
2460: 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  -in window funct
2470: 69 6f 6e 20 72 61 6e 6b 28 29 2e 20 41 73 73 75  ion rank(). Assu
2480: 6d 65 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  mes that.** the 
2490: 77 69 6e 64 6f 77 20 66 72 61 6d 65 20 68 61 73  window frame has
24a0: 20 62 65 65 6e 20 73 65 74 20 74 6f 3a 0a 2a 2a   been set to:.**
24b0: 0a 2a 2a 20 20 20 52 41 4e 47 45 20 42 45 54 57  .**   RANGE BETW
24c0: 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52  EEN UNBOUNDED PR
24d0: 45 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52  ECEDING AND CURR
24e0: 45 4e 54 20 52 4f 57 20 0a 2a 2f 0a 73 74 61 74  ENT ROW .*/.stat
24f0: 69 63 20 76 6f 69 64 20 72 61 6e 6b 53 74 65 70  ic void rankStep
2500: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
2510: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
2520: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
2530: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
2540: 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20  Arg.){.  struct 
2550: 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20  CallCount *p;.  
2560: 70 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c  p = (struct Call
2570: 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61  Count*)sqlite3_a
2580: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
2590: 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70  (pCtx, sizeof(*p
25a0: 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ));.  if( p ){. 
25b0: 20 20 20 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 20     p->nStep++;. 
25c0: 20 20 20 69 66 28 20 70 2d 3e 6e 56 61 6c 75 65     if( p->nValue
25d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
25e0: 6e 56 61 6c 75 65 20 3d 20 70 2d 3e 6e 53 74 65  nValue = p->nSte
25f0: 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 55  p;.    }.  }.  U
2600: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2610: 6e 41 72 67 29 3b 0a 20 20 55 4e 55 53 45 44 5f  nArg);.  UNUSED_
2620: 50 41 52 41 4d 45 54 45 52 28 61 70 41 72 67 29  PARAMETER(apArg)
2630: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
2640: 72 61 6e 6b 56 61 6c 75 65 46 75 6e 63 28 73 71  rankValueFunc(sq
2650: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
2660: 43 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20 43  Ctx){.  struct C
2670: 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70  allCount *p;.  p
2680: 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43   = (struct CallC
2690: 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67  ount*)sqlite3_ag
26a0: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
26b0: 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29  pCtx, sizeof(*p)
26c0: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
26d0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
26e0: 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 70 2d 3e  _int64(pCtx, p->
26f0: 6e 56 61 6c 75 65 29 3b 0a 20 20 20 20 70 2d 3e  nValue);.    p->
2700: 6e 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 7d 0a  nValue = 0;.  }.
2710: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
2720: 6e 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74  ntation of built
2730: 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  -in window funct
2740: 69 6f 6e 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b  ion percent_rank
2750: 28 29 2e 20 41 73 73 75 6d 65 73 20 74 68 61 74  (). Assumes that
2760: 0a 2a 2a 20 74 68 65 20 77 69 6e 64 6f 77 20 66  .** the window f
2770: 72 61 6d 65 20 68 61 73 20 62 65 65 6e 20 73 65  rame has been se
2780: 74 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 47 52  t to:.**.**   GR
2790: 4f 55 50 53 20 42 45 54 57 45 45 4e 20 43 55 52  OUPS BETWEEN CUR
27a0: 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 55 4e 42  RENT ROW AND UNB
27b0: 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47  OUNDED FOLLOWING
27c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
27d0: 70 65 72 63 65 6e 74 5f 72 61 6e 6b 53 74 65 70  percent_rankStep
27e0: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
27f0: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
2800: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
2810: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
2820: 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20  Arg.){.  struct 
2830: 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20  CallCount *p;.  
2840: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2850: 28 6e 41 72 67 29 3b 20 61 73 73 65 72 74 28 20  (nArg); assert( 
2860: 6e 41 72 67 3d 3d 30 20 29 3b 0a 20 20 70 20 3d  nArg==0 );.  p =
2870: 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75   (struct CallCou
2880: 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72  nt*)sqlite3_aggr
2890: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43  egate_context(pC
28a0: 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b  tx, sizeof(*p));
28b0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
28c0: 70 2d 3e 6e 54 6f 74 61 6c 2b 2b 3b 0a 20 20 7d  p->nTotal++;.  }
28d0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  .}.static void p
28e0: 65 72 63 65 6e 74 5f 72 61 6e 6b 49 6e 76 46 75  ercent_rankInvFu
28f0: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
2900: 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20  ntext *pCtx, .  
2910: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69  int nArg,.  sqli
2920: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72  te3_value **apAr
2930: 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61  g.){.  struct Ca
2940: 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 55 4e  llCount *p;.  UN
2950: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
2960: 41 72 67 29 3b 20 61 73 73 65 72 74 28 20 6e 41  Arg); assert( nA
2970: 72 67 3d 3d 30 20 29 3b 0a 20 20 70 20 3d 20 28  rg==0 );.  p = (
2980: 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74  struct CallCount
2990: 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  *)sqlite3_aggreg
29a0: 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78  ate_context(pCtx
29b0: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
29c0: 20 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 7d 0a 73   p->nStep++;.}.s
29d0: 74 61 74 69 63 20 76 6f 69 64 20 70 65 72 63 65  tatic void perce
29e0: 6e 74 5f 72 61 6e 6b 56 61 6c 75 65 46 75 6e 63  nt_rankValueFunc
29f0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
2a00: 20 2a 70 43 74 78 29 7b 0a 20 20 73 74 72 75 63   *pCtx){.  struc
2a10: 74 20 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a  t CallCount *p;.
2a20: 20 20 70 20 3d 20 28 73 74 72 75 63 74 20 43 61    p = (struct Ca
2a30: 6c 6c 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33  llCount*)sqlite3
2a40: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
2a50: 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28  xt(pCtx, sizeof(
2a60: 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b  *p));.  if( p ){
2a70: 0a 20 20 20 20 70 2d 3e 6e 56 61 6c 75 65 20 3d  .    p->nValue =
2a80: 20 70 2d 3e 6e 53 74 65 70 3b 0a 20 20 20 20 69   p->nStep;.    i
2a90: 66 28 20 70 2d 3e 6e 54 6f 74 61 6c 3e 31 20 29  f( p->nTotal>1 )
2aa0: 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72  {.      double r
2ab0: 20 3d 20 28 64 6f 75 62 6c 65 29 70 2d 3e 6e 56   = (double)p->nV
2ac0: 61 6c 75 65 20 2f 20 28 64 6f 75 62 6c 65 29 28  alue / (double)(
2ad0: 70 2d 3e 6e 54 6f 74 61 6c 2d 31 29 3b 0a 20 20  p->nTotal-1);.  
2ae0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
2af0: 6c 74 5f 64 6f 75 62 6c 65 28 70 43 74 78 2c 20  lt_double(pCtx, 
2b00: 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r);.    }else{. 
2b10: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
2b20: 75 6c 74 5f 64 6f 75 62 6c 65 28 70 43 74 78 2c  ult_double(pCtx,
2b30: 20 30 2e 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   0.0);.    }.  }
2b40: 0a 7d 0a 23 64 65 66 69 6e 65 20 70 65 72 63 65  .}.#define perce
2b50: 6e 74 5f 72 61 6e 6b 46 69 6e 61 6c 69 7a 65 46  nt_rankFinalizeF
2b60: 75 6e 63 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b  unc percent_rank
2b70: 56 61 6c 75 65 46 75 6e 63 0a 0a 2f 2a 0a 2a 2a  ValueFunc../*.**
2b80: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
2b90: 6f 66 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64  of built-in wind
2ba0: 6f 77 20 66 75 6e 63 74 69 6f 6e 20 63 75 6d 65  ow function cume
2bb0: 5f 64 69 73 74 28 29 2e 20 41 73 73 75 6d 65 73  _dist(). Assumes
2bc0: 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 77 69 6e   that.** the win
2bd0: 64 6f 77 20 66 72 61 6d 65 20 68 61 73 20 62 65  dow frame has be
2be0: 65 6e 20 73 65 74 20 74 6f 3a 0a 2a 2a 0a 2a 2a  en set to:.**.**
2bf0: 20 20 20 47 52 4f 55 50 53 20 42 45 54 57 45 45     GROUPS BETWEE
2c00: 4e 20 31 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e  N 1 FOLLOWING AN
2c10: 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c  D UNBOUNDED FOLL
2c20: 4f 57 49 4e 47 0a 2a 2f 0a 73 74 61 74 69 63 20  OWING.*/.static 
2c30: 76 6f 69 64 20 63 75 6d 65 5f 64 69 73 74 53 74  void cume_distSt
2c40: 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  epFunc(.  sqlite
2c50: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
2c60: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
2c70: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
2c80: 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63  apArg.){.  struc
2c90: 74 20 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a  t CallCount *p;.
2ca0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2cb0: 45 52 28 6e 41 72 67 29 3b 20 61 73 73 65 72 74  ER(nArg); assert
2cc0: 28 20 6e 41 72 67 3d 3d 30 20 29 3b 0a 20 20 70  ( nArg==0 );.  p
2cd0: 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43   = (struct CallC
2ce0: 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67  ount*)sqlite3_ag
2cf0: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
2d00: 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29  pCtx, sizeof(*p)
2d10: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
2d20: 20 20 70 2d 3e 6e 54 6f 74 61 6c 2b 2b 3b 0a 20    p->nTotal++;. 
2d30: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
2d40: 20 63 75 6d 65 5f 64 69 73 74 49 6e 76 46 75 6e   cume_distInvFun
2d50: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
2d60: 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69  text *pCtx, .  i
2d70: 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74  nt nArg,.  sqlit
2d80: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72 67  e3_value **apArg
2d90: 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61 6c  .){.  struct Cal
2da0: 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 55 4e 55  lCount *p;.  UNU
2db0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 41  SED_PARAMETER(nA
2dc0: 72 67 29 3b 20 61 73 73 65 72 74 28 20 6e 41 72  rg); assert( nAr
2dd0: 67 3d 3d 30 20 29 3b 0a 20 20 70 20 3d 20 28 73  g==0 );.  p = (s
2de0: 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a  truct CallCount*
2df0: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
2e00: 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c  te_context(pCtx,
2e10: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
2e20: 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 7d 0a 73 74  p->nStep++;.}.st
2e30: 61 74 69 63 20 76 6f 69 64 20 63 75 6d 65 5f 64  atic void cume_d
2e40: 69 73 74 56 61 6c 75 65 46 75 6e 63 28 73 71 6c  istValueFunc(sql
2e50: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
2e60: 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61  tx){.  struct Ca
2e70: 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70 20  llCount *p;.  p 
2e80: 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  = (struct CallCo
2e90: 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67  unt*)sqlite3_agg
2ea0: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70  regate_context(p
2eb0: 43 74 78 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  Ctx, 0);.  if( p
2ec0: 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72   ){.    double r
2ed0: 20 3d 20 28 64 6f 75 62 6c 65 29 28 70 2d 3e 6e   = (double)(p->n
2ee0: 53 74 65 70 29 20 2f 20 28 64 6f 75 62 6c 65 29  Step) / (double)
2ef0: 28 70 2d 3e 6e 54 6f 74 61 6c 29 3b 0a 20 20 20  (p->nTotal);.   
2f00: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2f10: 64 6f 75 62 6c 65 28 70 43 74 78 2c 20 72 29 3b  double(pCtx, r);
2f20: 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 63  .  }.}.#define c
2f30: 75 6d 65 5f 64 69 73 74 46 69 6e 61 6c 69 7a 65  ume_distFinalize
2f40: 46 75 6e 63 20 63 75 6d 65 5f 64 69 73 74 56 61  Func cume_distVa
2f50: 6c 75 65 46 75 6e 63 0a 0a 2f 2a 0a 2a 2a 20 43  lueFunc../*.** C
2f60: 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 66 6f  ontext object fo
2f70: 72 20 6e 74 69 6c 65 28 29 20 77 69 6e 64 6f 77  r ntile() window
2f80: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
2f90: 72 75 63 74 20 4e 74 69 6c 65 43 74 78 20 7b 0a  ruct NtileCtx {.
2fa0: 20 20 69 36 34 20 6e 54 6f 74 61 6c 3b 20 20 20    i64 nTotal;   
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc0: 20 20 2f 2a 20 54 6f 74 61 6c 20 72 6f 77 73 20    /* Total rows 
2fd0: 69 6e 20 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a  in partition */.
2fe0: 20 20 69 36 34 20 6e 50 61 72 61 6d 3b 20 20 20    i64 nParam;   
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3000: 20 20 2f 2a 20 50 61 72 61 6d 65 74 65 72 20 70    /* Parameter p
3010: 61 73 73 65 64 20 74 6f 20 6e 74 69 6c 65 28 4e  assed to ntile(N
3020: 29 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 3b  ) */.  i64 iRow;
3030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3040: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
3050: 74 20 72 6f 77 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  t row */.};../*.
3060: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
3070: 6e 20 6f 66 20 6e 74 69 6c 65 28 29 2e 20 54 68  n of ntile(). Th
3080: 69 73 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  is assumes that 
3090: 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61 6d 65  the window frame
30a0: 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 63 6f 65   has.** been coe
30b0: 72 63 65 64 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20  rced to:.**.**  
30c0: 20 52 4f 57 53 20 43 55 52 52 45 4e 54 20 52 4f   ROWS CURRENT RO
30d0: 57 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20  W AND UNBOUNDED 
30e0: 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2f 0a 73 74 61  FOLLOWING.*/.sta
30f0: 74 69 63 20 76 6f 69 64 20 6e 74 69 6c 65 53 74  tic void ntileSt
3100: 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  epFunc(.  sqlite
3110: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
3120: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
3130: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
3140: 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63  apArg.){.  struc
3150: 74 20 4e 74 69 6c 65 43 74 78 20 2a 70 3b 0a 20  t NtileCtx *p;. 
3160: 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31   assert( nArg==1
3170: 20 29 3b 20 55 4e 55 53 45 44 5f 50 41 52 41 4d   ); UNUSED_PARAM
3180: 45 54 45 52 28 6e 41 72 67 29 3b 0a 20 20 70 20  ETER(nArg);.  p 
3190: 3d 20 28 73 74 72 75 63 74 20 4e 74 69 6c 65 43  = (struct NtileC
31a0: 74 78 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72  tx*)sqlite3_aggr
31b0: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43  egate_context(pC
31c0: 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b  tx, sizeof(*p));
31d0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
31e0: 69 66 28 20 70 2d 3e 6e 54 6f 74 61 6c 3d 3d 30  if( p->nTotal==0
31f0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 50 61   ){.      p->nPa
3200: 72 61 6d 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ram = sqlite3_va
3210: 6c 75 65 5f 69 6e 74 36 34 28 61 70 41 72 67 5b  lue_int64(apArg[
3220: 30 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0]);.      if( p
3230: 2d 3e 6e 50 61 72 61 6d 3c 3d 30 20 29 7b 0a 20  ->nParam<=0 ){. 
3240: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
3250: 65 73 75 6c 74 5f 65 72 72 6f 72 28 0a 20 20 20  esult_error(.   
3260: 20 20 20 20 20 20 20 20 20 70 43 74 78 2c 20 22           pCtx, "
3270: 61 72 67 75 6d 65 6e 74 20 6f 66 20 6e 74 69 6c  argument of ntil
3280: 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 73 69  e must be a posi
3290: 74 69 76 65 20 69 6e 74 65 67 65 72 22 2c 20 2d  tive integer", -
32a0: 31 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  1.        );.   
32b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
32c0: 2d 3e 6e 54 6f 74 61 6c 2b 2b 3b 0a 20 20 7d 0a  ->nTotal++;.  }.
32d0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e 74  }.static void nt
32e0: 69 6c 65 49 6e 76 46 75 6e 63 28 0a 20 20 73 71  ileInvFunc(.  sq
32f0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
3300: 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67  Ctx, .  int nArg
3310: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
3320: 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20 73  e **apArg.){.  s
3330: 74 72 75 63 74 20 4e 74 69 6c 65 43 74 78 20 2a  truct NtileCtx *
3340: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 41 72  p;.  assert( nAr
3350: 67 3d 3d 31 20 29 3b 20 55 4e 55 53 45 44 5f 50  g==1 ); UNUSED_P
3360: 41 52 41 4d 45 54 45 52 28 6e 41 72 67 29 3b 0a  ARAMETER(nArg);.
3370: 20 20 70 20 3d 20 28 73 74 72 75 63 74 20 4e 74    p = (struct Nt
3380: 69 6c 65 43 74 78 2a 29 73 71 6c 69 74 65 33 5f  ileCtx*)sqlite3_
3390: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
33a0: 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a  t(pCtx, sizeof(*
33b0: 70 29 29 3b 0a 20 20 70 2d 3e 69 52 6f 77 2b 2b  p));.  p->iRow++
33c0: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
33d0: 6e 74 69 6c 65 56 61 6c 75 65 46 75 6e 63 28 73  ntileValueFunc(s
33e0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
33f0: 70 43 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20  pCtx){.  struct 
3400: 4e 74 69 6c 65 43 74 78 20 2a 70 3b 0a 20 20 70  NtileCtx *p;.  p
3410: 20 3d 20 28 73 74 72 75 63 74 20 4e 74 69 6c 65   = (struct Ntile
3420: 43 74 78 2a 29 73 71 6c 69 74 65 33 5f 61 67 67  Ctx*)sqlite3_agg
3430: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70  regate_context(p
3440: 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  Ctx, sizeof(*p))
3450: 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e  ;.  if( p && p->
3460: 6e 50 61 72 61 6d 3e 30 20 29 7b 0a 20 20 20 20  nParam>0 ){.    
3470: 69 6e 74 20 6e 53 69 7a 65 20 3d 20 28 70 2d 3e  int nSize = (p->
3480: 6e 54 6f 74 61 6c 20 2f 20 70 2d 3e 6e 50 61 72  nTotal / p->nPar
3490: 61 6d 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69  am);.    if( nSi
34a0: 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ze==0 ){.      s
34b0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
34c0: 74 36 34 28 70 43 74 78 2c 20 70 2d 3e 69 52 6f  t64(pCtx, p->iRo
34d0: 77 2b 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  w+1);.    }else{
34e0: 0a 20 20 20 20 20 20 69 36 34 20 6e 4c 61 72 67  .      i64 nLarg
34f0: 65 20 3d 20 70 2d 3e 6e 54 6f 74 61 6c 20 2d 20  e = p->nTotal - 
3500: 70 2d 3e 6e 50 61 72 61 6d 2a 6e 53 69 7a 65 3b  p->nParam*nSize;
3510: 0a 20 20 20 20 20 20 69 36 34 20 69 53 6d 61 6c  .      i64 iSmal
3520: 6c 20 3d 20 6e 4c 61 72 67 65 2a 28 6e 53 69 7a  l = nLarge*(nSiz
3530: 65 2b 31 29 3b 0a 20 20 20 20 20 20 69 36 34 20  e+1);.      i64 
3540: 69 52 6f 77 20 3d 20 70 2d 3e 69 52 6f 77 3b 0a  iRow = p->iRow;.
3550: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
3560: 6e 4c 61 72 67 65 2a 28 6e 53 69 7a 65 2b 31 29  nLarge*(nSize+1)
3570: 20 2b 20 28 70 2d 3e 6e 50 61 72 61 6d 2d 6e 4c   + (p->nParam-nL
3580: 61 72 67 65 29 2a 6e 53 69 7a 65 29 3d 3d 70 2d  arge)*nSize)==p-
3590: 3e 6e 54 6f 74 61 6c 20 29 3b 0a 0a 20 20 20 20  >nTotal );..    
35a0: 20 20 69 66 28 20 69 52 6f 77 3c 69 53 6d 61 6c    if( iRow<iSmal
35b0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l ){.        sql
35c0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
35d0: 34 28 70 43 74 78 2c 20 31 20 2b 20 69 52 6f 77  4(pCtx, 1 + iRow
35e0: 2f 28 6e 53 69 7a 65 2b 31 29 29 3b 0a 20 20 20  /(nSize+1));.   
35f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3600: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
3610: 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 31 20 2b  _int64(pCtx, 1 +
3620: 20 6e 4c 61 72 67 65 20 2b 20 28 69 52 6f 77 2d   nLarge + (iRow-
3630: 69 53 6d 61 6c 6c 29 2f 6e 53 69 7a 65 29 3b 0a  iSmall)/nSize);.
3640: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3650: 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 6e 74 69 6c  }.}.#define ntil
3660: 65 46 69 6e 61 6c 69 7a 65 46 75 6e 63 20 6e 74  eFinalizeFunc nt
3670: 69 6c 65 56 61 6c 75 65 46 75 6e 63 0a 0a 2f 2a  ileValueFunc../*
3680: 0a 2a 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65  .** Context obje
3690: 63 74 20 66 6f 72 20 6c 61 73 74 5f 76 61 6c 75  ct for last_valu
36a0: 65 28 29 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  e() window funct
36b0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 4c  ion..*/.struct L
36c0: 61 73 74 56 61 6c 75 65 43 74 78 20 7b 0a 20 20  astValueCtx {.  
36d0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
36e0: 56 61 6c 3b 0a 20 20 69 6e 74 20 6e 56 61 6c 3b  Val;.  int nVal;
36f0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  .};../*.** Imple
3700: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6c 61 73  mentation of las
3710: 74 5f 76 61 6c 75 65 28 29 2e 0a 2a 2f 0a 73 74  t_value()..*/.st
3720: 61 74 69 63 20 76 6f 69 64 20 6c 61 73 74 5f 76  atic void last_v
3730: 61 6c 75 65 53 74 65 70 46 75 6e 63 28 0a 20 20  alueStepFunc(.  
3740: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
3750: 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41  *pCtx, .  int nA
3760: 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  rg,.  sqlite3_va
3770: 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 20  lue **apArg.){. 
3780: 20 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75   struct LastValu
3790: 65 43 74 78 20 2a 70 3b 0a 20 20 55 4e 55 53 45  eCtx *p;.  UNUSE
37a0: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72 67  D_PARAMETER(nArg
37b0: 29 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74  );.  p = (struct
37c0: 20 4c 61 73 74 56 61 6c 75 65 43 74 78 2a 29 73   LastValueCtx*)s
37d0: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
37e0: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
37f0: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
3800: 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( p ){.    sqlit
3810: 65 33 5f 76 61 6c 75 65 5f 66 72 65 65 28 70 2d  e3_value_free(p-
3820: 3e 70 56 61 6c 29 3b 0a 20 20 20 20 70 2d 3e 70  >pVal);.    p->p
3830: 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  Val = sqlite3_va
3840: 6c 75 65 5f 64 75 70 28 61 70 41 72 67 5b 30 5d  lue_dup(apArg[0]
3850: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 56  );.    if( p->pV
3860: 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  al==0 ){.      s
3870: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
3880: 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29 3b  ror_nomem(pCtx);
3890: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
38a0: 20 20 70 2d 3e 6e 56 61 6c 2b 2b 3b 0a 20 20 20    p->nVal++;.   
38b0: 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20   }.  }.}.static 
38c0: 76 6f 69 64 20 6c 61 73 74 5f 76 61 6c 75 65 49  void last_valueI
38d0: 6e 76 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  nvFunc(.  sqlite
38e0: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
38f0: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
3900: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
3910: 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63  apArg.){.  struc
3920: 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 20 2a  t LastValueCtx *
3930: 70 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  p;.  UNUSED_PARA
3940: 4d 45 54 45 52 28 6e 41 72 67 29 3b 0a 20 20 55  METER(nArg);.  U
3950: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
3960: 61 70 41 72 67 29 3b 0a 20 20 70 20 3d 20 28 73  apArg);.  p = (s
3970: 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75 65 43  truct LastValueC
3980: 74 78 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72  tx*)sqlite3_aggr
3990: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43  egate_context(pC
39a0: 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b  tx, sizeof(*p));
39b0: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 29  .  if( ALWAYS(p)
39c0: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 6c 2d   ){.    p->nVal-
39d0: 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 56  -;.    if( p->nV
39e0: 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  al==0 ){.      s
39f0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 66 72 65  qlite3_value_fre
3a00: 65 28 70 2d 3e 70 56 61 6c 29 3b 0a 20 20 20 20  e(p->pVal);.    
3a10: 20 20 70 2d 3e 70 56 61 6c 20 3d 20 30 3b 0a 20    p->pVal = 0;. 
3a20: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69     }.  }.}.stati
3a30: 63 20 76 6f 69 64 20 6c 61 73 74 5f 76 61 6c 75  c void last_valu
3a40: 65 56 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74  eValueFunc(sqlit
3a50: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
3a60: 29 7b 0a 20 20 73 74 72 75 63 74 20 4c 61 73 74  ){.  struct Last
3a70: 56 61 6c 75 65 43 74 78 20 2a 70 3b 0a 20 20 70  ValueCtx *p;.  p
3a80: 20 3d 20 28 73 74 72 75 63 74 20 4c 61 73 74 56   = (struct LastV
3a90: 61 6c 75 65 43 74 78 2a 29 73 71 6c 69 74 65 33  alueCtx*)sqlite3
3aa0: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
3ab0: 78 74 28 70 43 74 78 2c 20 30 29 3b 0a 20 20 69  xt(pCtx, 0);.  i
3ac0: 66 28 20 70 20 26 26 20 70 2d 3e 70 56 61 6c 20  f( p && p->pVal 
3ad0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
3ae0: 65 73 75 6c 74 5f 76 61 6c 75 65 28 70 43 74 78  esult_value(pCtx
3af0: 2c 20 70 2d 3e 70 56 61 6c 29 3b 0a 20 20 7d 0a  , p->pVal);.  }.
3b00: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 61  }.static void la
3b10: 73 74 5f 76 61 6c 75 65 46 69 6e 61 6c 69 7a 65  st_valueFinalize
3b20: 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Func(sqlite3_con
3b30: 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20 20 73  text *pCtx){.  s
3b40: 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75 65 43  truct LastValueC
3b50: 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74  tx *p;.  p = (st
3b60: 72 75 63 74 20 4c 61 73 74 56 61 6c 75 65 43 74  ruct LastValueCt
3b70: 78 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65  x*)sqlite3_aggre
3b80: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74  gate_context(pCt
3b90: 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  x, sizeof(*p));.
3ba0: 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 70 56    if( p && p->pV
3bb0: 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  al ){.    sqlite
3bc0: 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 70  3_result_value(p
3bd0: 43 74 78 2c 20 70 2d 3e 70 56 61 6c 29 3b 0a 20  Ctx, p->pVal);. 
3be0: 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
3bf0: 5f 66 72 65 65 28 70 2d 3e 70 56 61 6c 29 3b 0a  _free(p->pVal);.
3c00: 20 20 20 20 70 2d 3e 70 56 61 6c 20 3d 20 30 3b      p->pVal = 0;
3c10: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74  .  }.}../*.** St
3c20: 61 74 69 63 20 6e 61 6d 65 73 20 66 6f 72 20 74  atic names for t
3c30: 68 65 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64  he built-in wind
3c40: 6f 77 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  ow function name
3c50: 73 2e 20 20 54 68 65 73 65 20 73 74 61 74 69 63  s.  These static
3c60: 0a 2a 2a 20 6e 61 6d 65 73 20 61 72 65 20 75 73  .** names are us
3c70: 65 64 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20  ed, rather than 
3c80: 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 73 2c  string literals,
3c90: 20 73 6f 20 74 68 61 74 20 46 75 6e 63 44 65 66   so that FuncDef
3ca0: 20 6f 62 6a 65 63 74 73 0a 2a 2a 20 63 61 6e 20   objects.** can 
3cb0: 62 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  be associated wi
3cc0: 74 68 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  th a particular 
3cd0: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
3ce0: 62 79 20 64 69 72 65 63 74 0a 2a 2a 20 63 6f 6d  by direct.** com
3cf0: 70 61 72 69 73 6f 6e 20 6f 66 20 74 68 65 20 7a  parison of the z
3d00: 4e 61 6d 65 20 70 6f 69 6e 74 65 72 2e 20 20 45  Name pointer.  E
3d10: 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
3d20: 20 20 20 20 69 66 28 20 70 46 75 6e 63 44 65 66      if( pFuncDef
3d30: 2d 3e 7a 4e 61 6d 65 3d 3d 72 6f 77 5f 76 61 6c  ->zName==row_val
3d40: 75 65 4e 61 6d 65 20 29 7b 20 2e 2e 2e 20 7d 0a  ueName ){ ... }.
3d50: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
3d60: 63 68 61 72 20 72 6f 77 5f 6e 75 6d 62 65 72 4e  char row_numberN
3d70: 61 6d 65 5b 5d 20 3d 20 20 20 22 72 6f 77 5f 6e  ame[] =   "row_n
3d80: 75 6d 62 65 72 22 3b 0a 73 74 61 74 69 63 20 63  umber";.static c
3d90: 6f 6e 73 74 20 63 68 61 72 20 64 65 6e 73 65 5f  onst char dense_
3da0: 72 61 6e 6b 4e 61 6d 65 5b 5d 20 3d 20 20 20 22  rankName[] =   "
3db0: 64 65 6e 73 65 5f 72 61 6e 6b 22 3b 0a 73 74 61  dense_rank";.sta
3dc0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 72  tic const char r
3dd0: 61 6e 6b 4e 61 6d 65 5b 5d 20 3d 20 20 20 20 20  ankName[] =     
3de0: 20 20 20 20 22 72 61 6e 6b 22 3b 0a 73 74 61 74      "rank";.stat
3df0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 70 65  ic const char pe
3e00: 72 63 65 6e 74 5f 72 61 6e 6b 4e 61 6d 65 5b 5d  rcent_rankName[]
3e10: 20 3d 20 22 70 65 72 63 65 6e 74 5f 72 61 6e 6b   = "percent_rank
3e20: 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  ";.static const 
3e30: 63 68 61 72 20 63 75 6d 65 5f 64 69 73 74 4e 61  char cume_distNa
3e40: 6d 65 5b 5d 20 3d 20 20 20 20 22 63 75 6d 65 5f  me[] =    "cume_
3e50: 64 69 73 74 22 3b 0a 73 74 61 74 69 63 20 63 6f  dist";.static co
3e60: 6e 73 74 20 63 68 61 72 20 6e 74 69 6c 65 4e 61  nst char ntileNa
3e70: 6d 65 5b 5d 20 3d 20 20 20 20 20 20 20 20 22 6e  me[] =        "n
3e80: 74 69 6c 65 22 3b 0a 73 74 61 74 69 63 20 63 6f  tile";.static co
3e90: 6e 73 74 20 63 68 61 72 20 6c 61 73 74 5f 76 61  nst char last_va
3ea0: 6c 75 65 4e 61 6d 65 5b 5d 20 3d 20 20 20 22 6c  lueName[] =   "l
3eb0: 61 73 74 5f 76 61 6c 75 65 22 3b 0a 73 74 61 74  ast_value";.stat
3ec0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6e 74  ic const char nt
3ed0: 68 5f 76 61 6c 75 65 4e 61 6d 65 5b 5d 20 3d 20  h_valueName[] = 
3ee0: 20 20 20 22 6e 74 68 5f 76 61 6c 75 65 22 3b 0a     "nth_value";.
3ef0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
3f00: 72 20 66 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d  r first_valueNam
3f10: 65 5b 5d 20 3d 20 20 22 66 69 72 73 74 5f 76 61  e[] =  "first_va
3f20: 6c 75 65 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e  lue";.static con
3f30: 73 74 20 63 68 61 72 20 6c 65 61 64 4e 61 6d 65  st char leadName
3f40: 5b 5d 20 3d 20 20 20 20 20 20 20 20 20 22 6c 65  [] =         "le
3f50: 61 64 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73  ad";.static cons
3f60: 74 20 63 68 61 72 20 6c 61 67 4e 61 6d 65 5b 5d  t char lagName[]
3f70: 20 3d 20 20 20 20 20 20 20 20 20 20 22 6c 61 67   =          "lag
3f80: 22 3b 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20  ";../*.** No-op 
3f90: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
3fa0: 6f 66 20 78 53 74 65 70 28 29 20 61 6e 64 20 78  of xStep() and x
3fb0: 46 69 6e 61 6c 69 7a 65 28 29 2e 20 20 55 73 65  Finalize().  Use
3fc0: 64 20 61 73 20 70 6c 61 63 65 2d 68 6f 6c 64 65  d as place-holde
3fd0: 72 73 0a 2a 2a 20 66 6f 72 20 62 75 69 6c 74 2d  rs.** for built-
3fe0: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
3ff0: 6f 6e 73 20 74 68 61 74 20 6e 65 76 65 72 20 63  ons that never c
4000: 61 6c 6c 20 74 68 6f 73 65 20 69 6e 74 65 72 66  all those interf
4010: 61 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  aces..**.** The 
4020: 6e 6f 6f 70 56 61 6c 75 65 46 75 6e 63 28 29 20  noopValueFunc() 
4030: 69 73 20 63 61 6c 6c 65 64 20 62 75 74 20 69 73  is called but is
4040: 20 65 78 70 65 63 74 65 64 20 74 6f 20 64 6f 20   expected to do 
4050: 6e 6f 74 68 69 6e 67 2e 20 20 54 68 65 0a 2a 2a  nothing.  The.**
4060: 20 6e 6f 6f 70 53 74 65 70 46 75 6e 63 28 29 20   noopStepFunc() 
4070: 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2c  is never called,
4080: 20 61 6e 64 20 73 6f 20 69 74 20 69 73 20 6d 61   and so it is ma
4090: 72 6b 65 64 20 77 69 74 68 20 4e 4f 5f 54 45 53  rked with NO_TES
40a0: 54 20 74 6f 0a 2a 2a 20 6c 65 74 20 74 68 65 20  T to.** let the 
40b0: 74 65 73 74 20 63 6f 76 65 72 61 67 65 20 72 6f  test coverage ro
40c0: 75 74 69 6e 65 20 6b 6e 6f 77 20 6e 6f 74 20 74  utine know not t
40d0: 6f 20 65 78 70 65 63 74 20 74 68 69 73 20 66 75  o expect this fu
40e0: 6e 63 74 69 6f 6e 20 74 6f 20 62 65 0a 2a 2a 20  nction to be.** 
40f0: 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74  invoked..*/.stat
4100: 69 63 20 76 6f 69 64 20 6e 6f 6f 70 53 74 65 70  ic void noopStep
4110: 46 75 6e 63 28 20 20 20 20 2f 2a 4e 4f 5f 54 45  Func(    /*NO_TE
4120: 53 54 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 63  ST*/.  sqlite3_c
4130: 6f 6e 74 65 78 74 20 2a 70 2c 20 20 20 20 20 20  ontext *p,      
4140: 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20    /*NO_TEST*/.  
4150: 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20  int n,          
4160: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f             /*NO_
4170: 54 45 53 54 2a 2f 0a 20 20 73 71 6c 69 74 65 33  TEST*/.  sqlite3
4180: 5f 76 61 6c 75 65 20 2a 2a 61 20 20 20 20 20 20  _value **a      
4190: 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a      /*NO_TEST*/.
41a0: 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ){              
41b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4e               /*N
41c0: 4f 5f 54 45 53 54 2a 2f 0a 20 20 55 4e 55 53 45  O_TEST*/.  UNUSE
41d0: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 20  D_PARAMETER(p); 
41e0: 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a        /*NO_TEST*
41f0: 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  /.  UNUSED_PARAM
4200: 45 54 45 52 28 6e 29 3b 20 20 20 20 20 20 20 2f  ETER(n);       /
4210: 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 55 4e 55  *NO_TEST*/.  UNU
4220: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 29  SED_PARAMETER(a)
4230: 3b 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53  ;       /*NO_TES
4240: 54 2a 2f 0a 20 20 61 73 73 65 72 74 28 30 29 3b  T*/.  assert(0);
4250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4260: 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 7d 20 20   /*NO_TEST*/.}  
4270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4280: 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54            /*NO_T
4290: 45 53 54 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  EST*/.static voi
42a0: 64 20 6e 6f 6f 70 56 61 6c 75 65 46 75 6e 63 28  d noopValueFunc(
42b0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
42c0: 2a 70 29 7b 20 55 4e 55 53 45 44 5f 50 41 52 41  *p){ UNUSED_PARA
42d0: 4d 45 54 45 52 28 70 29 3b 20 2f 2a 6e 6f 2d 6f  METER(p); /*no-o
42e0: 70 2a 2f 20 7d 0a 0a 2f 2a 20 57 69 6e 64 6f 77  p*/ }../* Window
42f0: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
4300: 75 73 65 20 61 6c 6c 20 77 69 6e 64 6f 77 20 69  use all window i
4310: 6e 74 65 72 66 61 63 65 73 3a 20 78 53 74 65 70  nterfaces: xStep
4320: 2c 20 78 46 69 6e 61 6c 2c 0a 2a 2a 20 78 56 61  , xFinal,.** xVa
4330: 6c 75 65 2c 20 61 6e 64 20 78 49 6e 76 65 72 73  lue, and xInvers
4340: 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e  e */.#define WIN
4350: 44 4f 57 46 55 4e 43 41 4c 4c 28 6e 61 6d 65 2c  DOWFUNCALL(name,
4360: 6e 41 72 67 2c 65 78 74 72 61 29 20 7b 20 20 20  nArg,extra) {   
4370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4390: 5c 0a 20 20 6e 41 72 67 2c 20 28 53 51 4c 49 54  \.  nArg, (SQLIT
43a0: 45 5f 55 54 46 38 7c 53 51 4c 49 54 45 5f 46 55  E_UTF8|SQLITE_FU
43b0: 4e 43 5f 57 49 4e 44 4f 57 7c 65 78 74 72 61 29  NC_WINDOW|extra)
43c0: 2c 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 20  , 0, 0,         
43d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
43e0: 20 6e 61 6d 65 20 23 23 20 53 74 65 70 46 75 6e   name ## StepFun
43f0: 63 2c 20 6e 61 6d 65 20 23 23 20 46 69 6e 61 6c  c, name ## Final
4400: 69 7a 65 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23  izeFunc, name ##
4410: 20 56 61 6c 75 65 46 75 6e 63 2c 20 20 20 20 20   ValueFunc,     
4420: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6e 61            \.  na
4430: 6d 65 20 23 23 20 49 6e 76 46 75 6e 63 2c 20 6e  me ## InvFunc, n
4440: 61 6d 65 20 23 23 20 4e 61 6d 65 2c 20 7b 30 7d  ame ## Name, {0}
4450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4470: 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 20 57         \.}../* W
4480: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
4490: 74 68 61 74 20 61 72 65 20 69 6d 70 6c 65 6d 65  that are impleme
44a0: 6e 74 65 64 20 75 73 69 6e 67 20 62 79 74 65 63  nted using bytec
44b0: 6f 64 65 20 61 6e 64 20 74 68 75 73 20 68 61 76  ode and thus hav
44c0: 65 0a 2a 2a 20 6e 6f 2d 6f 70 20 72 6f 75 74 69  e.** no-op routi
44d0: 6e 65 73 20 66 6f 72 20 74 68 65 69 72 20 6d 65  nes for their me
44e0: 74 68 6f 64 73 20 2a 2f 0a 23 64 65 66 69 6e 65  thods */.#define
44f0: 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f 4f 50 28   WINDOWFUNCNOOP(
4500: 6e 61 6d 65 2c 6e 41 72 67 2c 65 78 74 72 61 29  name,nArg,extra)
4510: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
4520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4530: 20 20 20 20 5c 0a 20 20 6e 41 72 67 2c 20 28 53      \.  nArg, (S
4540: 51 4c 49 54 45 5f 55 54 46 38 7c 53 51 4c 49 54  QLITE_UTF8|SQLIT
4550: 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 7c 65 78  E_FUNC_WINDOW|ex
4560: 74 72 61 29 2c 20 30 2c 20 30 2c 20 20 20 20 20  tra), 0, 0,     
4570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4580: 20 5c 0a 20 20 6e 6f 6f 70 53 74 65 70 46 75 6e   \.  noopStepFun
4590: 63 2c 20 6e 6f 6f 70 56 61 6c 75 65 46 75 6e 63  c, noopValueFunc
45a0: 2c 20 6e 6f 6f 70 56 61 6c 75 65 46 75 6e 63 2c  , noopValueFunc,
45b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
45d0: 20 20 6e 6f 6f 70 53 74 65 70 46 75 6e 63 2c 20    noopStepFunc, 
45e0: 6e 61 6d 65 20 23 23 20 4e 61 6d 65 2c 20 7b 30  name ## Name, {0
45f0: 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }               
4600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4610: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a             \.}..
4620: 2f 2a 20 57 69 6e 64 6f 77 20 66 75 6e 63 74 69  /* Window functi
4630: 6f 6e 73 20 74 68 61 74 20 75 73 65 20 61 6c 6c  ons that use all
4640: 20 77 69 6e 64 6f 77 20 69 6e 74 65 72 66 61 63   window interfac
4650: 65 73 3a 20 78 53 74 65 70 2c 20 74 68 65 0a 2a  es: xStep, the.*
4660: 2a 20 73 61 6d 65 20 72 6f 75 74 69 6e 65 20 66  * same routine f
4670: 6f 72 20 78 46 69 6e 61 6c 69 7a 65 20 61 6e 64  or xFinalize and
4680: 20 78 56 61 6c 75 65 20 61 6e 64 20 77 68 69 63   xValue and whic
4690: 68 20 6e 65 76 65 72 20 63 61 6c 6c 0a 2a 2a 20  h never call.** 
46a0: 78 49 6e 76 65 72 73 65 2e 20 2a 2f 0a 23 64 65  xInverse. */.#de
46b0: 66 69 6e 65 20 57 49 4e 44 4f 57 46 55 4e 43 58  fine WINDOWFUNCX
46c0: 28 6e 61 6d 65 2c 6e 41 72 67 2c 65 78 74 72 61  (name,nArg,extra
46d0: 29 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  ) {             
46e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46f0: 20 20 20 20 20 20 20 20 5c 0a 20 20 6e 41 72 67          \.  nArg
4700: 2c 20 28 53 51 4c 49 54 45 5f 55 54 46 38 7c 53  , (SQLITE_UTF8|S
4710: 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f  QLITE_FUNC_WINDO
4720: 57 7c 65 78 74 72 61 29 2c 20 30 2c 20 30 2c 20  W|extra), 0, 0, 
4730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4740: 20 20 20 20 20 5c 0a 20 20 6e 61 6d 65 20 23 23       \.  name ##
4750: 20 53 74 65 70 46 75 6e 63 2c 20 6e 61 6d 65 20   StepFunc, name 
4760: 23 23 20 56 61 6c 75 65 46 75 6e 63 2c 20 6e 61  ## ValueFunc, na
4770: 6d 65 20 23 23 20 56 61 6c 75 65 46 75 6e 63 2c  me ## ValueFunc,
4780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4790: 20 20 5c 0a 20 20 6e 6f 6f 70 53 74 65 70 46 75    \.  noopStepFu
47a0: 6e 63 2c 20 6e 61 6d 65 20 23 23 20 4e 61 6d 65  nc, name ## Name
47b0: 2c 20 7b 30 7d 20 20 20 20 20 20 20 20 20 20 20  , {0}           
47c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
47e0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  .}.../*.** Regis
47f0: 74 65 72 20 74 68 6f 73 65 20 62 75 69 6c 74 2d  ter those built-
4800: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
4810: 6f 6e 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74  ons that are not
4820: 20 61 6c 73 6f 20 61 67 67 72 65 67 61 74 65 73   also aggregates
4830: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4840: 33 57 69 6e 64 6f 77 46 75 6e 63 74 69 6f 6e 73  3WindowFunctions
4850: 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
4860: 20 46 75 6e 63 44 65 66 20 61 57 69 6e 64 6f 77   FuncDef aWindow
4870: 46 75 6e 63 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  Funcs[] = {.    
4880: 57 49 4e 44 4f 57 46 55 4e 43 58 28 72 6f 77 5f  WINDOWFUNCX(row_
4890: 6e 75 6d 62 65 72 2c 20 30 2c 20 30 29 2c 0a 20  number, 0, 0),. 
48a0: 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 58 28 64     WINDOWFUNCX(d
48b0: 65 6e 73 65 5f 72 61 6e 6b 2c 20 30 2c 20 30 29  ense_rank, 0, 0)
48c0: 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43  ,.    WINDOWFUNC
48d0: 58 28 72 61 6e 6b 2c 20 30 2c 20 30 29 2c 0a 20  X(rank, 0, 0),. 
48e0: 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 41 4c 4c     WINDOWFUNCALL
48f0: 28 70 65 72 63 65 6e 74 5f 72 61 6e 6b 2c 20 30  (percent_rank, 0
4900: 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57  , 0),.    WINDOW
4910: 46 55 4e 43 41 4c 4c 28 63 75 6d 65 5f 64 69 73  FUNCALL(cume_dis
4920: 74 2c 20 30 2c 20 30 29 2c 0a 20 20 20 20 57 49  t, 0, 0),.    WI
4930: 4e 44 4f 57 46 55 4e 43 41 4c 4c 28 6e 74 69 6c  NDOWFUNCALL(ntil
4940: 65 2c 20 31 2c 20 30 29 2c 0a 20 20 20 20 57 49  e, 1, 0),.    WI
4950: 4e 44 4f 57 46 55 4e 43 41 4c 4c 28 6c 61 73 74  NDOWFUNCALL(last
4960: 5f 76 61 6c 75 65 2c 20 31 2c 20 30 29 2c 0a 20  _value, 1, 0),. 
4970: 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 41 4c 4c     WINDOWFUNCALL
4980: 28 6e 74 68 5f 76 61 6c 75 65 2c 20 32 2c 20 30  (nth_value, 2, 0
4990: 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e  ),.    WINDOWFUN
49a0: 43 41 4c 4c 28 66 69 72 73 74 5f 76 61 6c 75 65  CALL(first_value
49b0: 2c 20 31 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e  , 1, 0),.    WIN
49c0: 44 4f 57 46 55 4e 43 4e 4f 4f 50 28 6c 65 61 64  DOWFUNCNOOP(lead
49d0: 2c 20 31 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e  , 1, 0),.    WIN
49e0: 44 4f 57 46 55 4e 43 4e 4f 4f 50 28 6c 65 61 64  DOWFUNCNOOP(lead
49f0: 2c 20 32 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e  , 2, 0),.    WIN
4a00: 44 4f 57 46 55 4e 43 4e 4f 4f 50 28 6c 65 61 64  DOWFUNCNOOP(lead
4a10: 2c 20 33 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e  , 3, 0),.    WIN
4a20: 44 4f 57 46 55 4e 43 4e 4f 4f 50 28 6c 61 67 2c  DOWFUNCNOOP(lag,
4a30: 20 31 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44   1, 0),.    WIND
4a40: 4f 57 46 55 4e 43 4e 4f 4f 50 28 6c 61 67 2c 20  OWFUNCNOOP(lag, 
4a50: 32 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f  2, 0),.    WINDO
4a60: 57 46 55 4e 43 4e 4f 4f 50 28 6c 61 67 2c 20 33  WFUNCNOOP(lag, 3
4a70: 2c 20 30 29 2c 0a 20 20 7d 3b 0a 20 20 73 71 6c  , 0),.  };.  sql
4a80: 69 74 65 33 49 6e 73 65 72 74 42 75 69 6c 74 69  ite3InsertBuilti
4a90: 6e 46 75 6e 63 73 28 61 57 69 6e 64 6f 77 46 75  nFuncs(aWindowFu
4aa0: 6e 63 73 2c 20 41 72 72 61 79 53 69 7a 65 28 61  ncs, ArraySize(a
4ab0: 57 69 6e 64 6f 77 46 75 6e 63 73 29 29 3b 0a 7d  WindowFuncs));.}
4ac0: 0a 0a 73 74 61 74 69 63 20 57 69 6e 64 6f 77 20  ..static Window 
4ad0: 2a 77 69 6e 64 6f 77 46 69 6e 64 28 50 61 72 73  *windowFind(Pars
4ae0: 65 20 2a 70 50 61 72 73 65 2c 20 57 69 6e 64 6f  e *pParse, Windo
4af0: 77 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20  w *pList, const 
4b00: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
4b10: 57 69 6e 64 6f 77 20 2a 70 3b 0a 20 20 66 6f 72  Window *p;.  for
4b20: 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70  (p=pList; p; p=p
4b30: 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20  ->pNextWin){.   
4b40: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
4b50: 43 6d 70 28 70 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e  Cmp(p->zName, zN
4b60: 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ame)==0 ) break;
4b70: 0a 20 20 7d 0a 20 20 69 66 28 20 70 3d 3d 30 20  .  }.  if( p==0 
4b80: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
4b90: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
4ba0: 6e 6f 20 73 75 63 68 20 77 69 6e 64 6f 77 3a 20  no such window: 
4bb0: 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d  %s", zName);.  }
4bc0: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
4bd0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
4be0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 69 6d  ion is called im
4bf0: 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
4c00: 72 65 73 6f 6c 76 69 6e 67 20 74 68 65 20 66 75  resolving the fu
4c10: 6e 63 74 69 6f 6e 20 6e 61 6d 65 0a 2a 2a 20 66  nction name.** f
4c20: 6f 72 20 61 20 77 69 6e 64 6f 77 20 66 75 6e 63  or a window func
4c30: 74 69 6f 6e 20 77 69 74 68 69 6e 20 61 20 53 45  tion within a SE
4c40: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
4c50: 41 72 67 75 6d 65 6e 74 20 70 4c 69 73 74 20 69  Argument pList i
4c60: 73 20 61 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69  s a.** linked li
4c70: 73 74 20 6f 66 20 57 49 4e 44 4f 57 20 64 65 66  st of WINDOW def
4c80: 69 6e 69 74 69 6f 6e 73 20 66 6f 72 20 74 68 65  initions for the
4c90: 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
4ca0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 41 72  statement..** Ar
4cb0: 67 75 6d 65 6e 74 20 70 46 75 6e 63 20 69 73 20  gument pFunc is 
4cc0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 65 66  the function def
4cd0: 69 6e 69 74 69 6f 6e 20 6a 75 73 74 20 72 65 73  inition just res
4ce0: 6f 6c 76 65 64 20 61 6e 64 20 70 57 69 6e 0a 2a  olved and pWin.*
4cf0: 2a 20 69 73 20 74 68 65 20 57 69 6e 64 6f 77 20  * is the Window 
4d00: 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74  object represent
4d10: 69 6e 67 20 74 68 65 20 61 73 73 6f 63 69 61 74  ing the associat
4d20: 65 64 20 4f 56 45 52 20 63 6c 61 75 73 65 2e 20  ed OVER clause. 
4d30: 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
4d40: 20 75 70 64 61 74 65 73 20 74 68 65 20 63 6f 6e   updates the con
4d50: 74 65 6e 74 73 20 6f 66 20 70 57 69 6e 20 61 73  tents of pWin as
4d60: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
4d70: 20 20 2a 20 49 66 20 74 68 65 20 4f 56 45 52 20    * If the OVER 
4d80: 63 6c 61 75 73 65 20 72 65 66 65 72 65 64 20 74  clause refered t
4d90: 6f 20 61 20 6e 61 6d 65 64 20 77 69 6e 64 6f 77  o a named window
4da0: 20 28 61 73 20 69 6e 20 22 6d 61 78 28 78 29 20   (as in "max(x) 
4db0: 4f 56 45 52 20 77 69 6e 22 29 2c 0a 2a 2a 20 20  OVER win"),.**  
4dc0: 20 20 20 73 65 61 72 63 68 20 6c 69 73 74 20 70     search list p
4dd0: 4c 69 73 74 20 66 6f 72 20 61 20 6d 61 74 63 68  List for a match
4de0: 69 6e 67 20 57 49 4e 44 4f 57 20 64 65 66 69 6e  ing WINDOW defin
4df0: 69 74 69 6f 6e 2c 20 61 6e 64 20 75 70 64 61 74  ition, and updat
4e00: 65 20 70 57 69 6e 0a 2a 2a 20 20 20 20 20 61 63  e pWin.**     ac
4e10: 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20 6e 6f  cordingly. If no
4e20: 20 73 75 63 68 20 57 49 4e 44 4f 57 20 63 6c 61   such WINDOW cla
4e30: 75 73 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  use can be found
4e40: 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
4e50: 0a 2a 2a 20 20 20 20 20 69 6e 20 70 50 61 72 73  .**     in pPars
4e60: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20  e..**.**   * If 
4e70: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  the function is 
4e80: 61 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  a built-in windo
4e90: 77 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  w function that 
4ea0: 72 65 71 75 69 72 65 73 20 74 68 65 0a 2a 2a 20  requires the.** 
4eb0: 20 20 20 20 77 69 6e 64 6f 77 20 74 6f 20 62 65      window to be
4ec0: 20 63 6f 65 72 63 65 64 20 28 73 65 65 20 22 42   coerced (see "B
4ed0: 55 49 4c 54 2d 49 4e 20 57 49 4e 44 4f 57 20 46  UILT-IN WINDOW F
4ee0: 55 4e 43 54 49 4f 4e 53 22 20 61 74 20 74 68 65  UNCTIONS" at the
4ef0: 20 74 6f 70 0a 2a 2a 20 20 20 20 20 6f 66 20 74   top.**     of t
4f00: 68 69 73 20 66 69 6c 65 29 2c 20 70 57 69 6e 20  his file), pWin 
4f10: 69 73 20 75 70 64 61 74 65 64 20 68 65 72 65 2e  is updated here.
4f20: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4f30: 57 69 6e 64 6f 77 55 70 64 61 74 65 28 0a 20 20  WindowUpdate(.  
4f40: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a  Parse *pParse, .
4f50: 20 20 57 69 6e 64 6f 77 20 2a 70 4c 69 73 74 2c    Window *pList,
4f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f70: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6e 61 6d    /* List of nam
4f80: 65 64 20 77 69 6e 64 6f 77 73 20 66 6f 72 20 74  ed windows for t
4f90: 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  his SELECT */.  
4fa0: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 2c 20 20 20  Window *pWin,   
4fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fc0: 2f 2a 20 57 69 6e 64 6f 77 20 66 72 61 6d 65 20  /* Window frame 
4fd0: 74 6f 20 75 70 64 61 74 65 20 2a 2f 0a 20 20 46  to update */.  F
4fe0: 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20 20 20  uncDef *pFunc   
4ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5000: 2a 20 57 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  * Window functio
5010: 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 2a 2f 0a  n definition */.
5020: 29 7b 0a 20 20 69 66 28 20 70 57 69 6e 2d 3e 7a  ){.  if( pWin->z
5030: 4e 61 6d 65 20 26 26 20 70 57 69 6e 2d 3e 65 54  Name && pWin->eT
5040: 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 57 69  ype==0 ){.    Wi
5050: 6e 64 6f 77 20 2a 70 20 3d 20 77 69 6e 64 6f 77  ndow *p = window
5060: 46 69 6e 64 28 70 50 61 72 73 65 2c 20 70 4c 69  Find(pParse, pLi
5070: 73 74 2c 20 70 57 69 6e 2d 3e 7a 4e 61 6d 65 29  st, pWin->zName)
5080: 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29  ;.    if( p==0 )
5090: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 57 69   return;.    pWi
50a0: 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 3d 20  n->pPartition = 
50b0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
50c0: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
50d0: 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20 30 29  ->pPartition, 0)
50e0: 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70 4f 72 64  ;.    pWin->pOrd
50f0: 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
5100: 70 72 4c 69 73 74 44 75 70 28 70 50 61 72 73 65  prListDup(pParse
5110: 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  ->db, p->pOrderB
5120: 79 2c 20 30 29 3b 0a 20 20 20 20 70 57 69 6e 2d  y, 0);.    pWin-
5130: 3e 70 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65  >pStart = sqlite
5140: 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d  3ExprDup(pParse-
5150: 3e 64 62 2c 20 70 2d 3e 70 53 74 61 72 74 2c 20  >db, p->pStart, 
5160: 30 29 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70 45  0);.    pWin->pE
5170: 6e 64 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  nd = sqlite3Expr
5180: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
5190: 70 2d 3e 70 45 6e 64 2c 20 30 29 3b 0a 20 20 20  p->pEnd, 0);.   
51a0: 20 70 57 69 6e 2d 3e 65 53 74 61 72 74 20 3d 20   pWin->eStart = 
51b0: 70 2d 3e 65 53 74 61 72 74 3b 0a 20 20 20 20 70  p->eStart;.    p
51c0: 57 69 6e 2d 3e 65 45 6e 64 20 3d 20 70 2d 3e 65  Win->eEnd = p->e
51d0: 45 6e 64 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 65  End;.    pWin->e
51e0: 54 79 70 65 20 3d 20 70 2d 3e 65 54 79 70 65 3b  Type = p->eType;
51f0: 0a 20 20 20 20 70 57 69 6e 2d 3e 65 45 78 63 6c  .    pWin->eExcl
5200: 75 64 65 20 3d 20 70 2d 3e 65 45 78 63 6c 75 64  ude = p->eExclud
5210: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
5220: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 68 61  sqlite3WindowCha
5230: 69 6e 28 70 50 61 72 73 65 2c 20 70 57 69 6e 2c  in(pParse, pWin,
5240: 20 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 69   pList);.  }.  i
5250: 66 28 20 28 70 57 69 6e 2d 3e 65 54 79 70 65 3d  f( (pWin->eType=
5260: 3d 54 4b 5f 52 41 4e 47 45 29 0a 20 20 20 26 26  =TK_RANGE).   &&
5270: 20 28 70 57 69 6e 2d 3e 70 53 74 61 72 74 20 7c   (pWin->pStart |
5280: 7c 20 70 57 69 6e 2d 3e 70 45 6e 64 29 20 0a 20  | pWin->pEnd) . 
5290: 20 20 26 26 20 28 70 57 69 6e 2d 3e 70 4f 72 64    && (pWin->pOrd
52a0: 65 72 42 79 3d 3d 30 20 7c 7c 20 70 57 69 6e 2d  erBy==0 || pWin-
52b0: 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
52c0: 21 3d 31 29 0a 20 20 29 7b 0a 20 20 20 20 73 71  !=1).  ){.    sq
52d0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
52e0: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52 41  arse, .      "RA
52f0: 4e 47 45 20 77 69 74 68 20 6f 66 66 73 65 74 20  NGE with offset 
5300: 50 52 45 43 45 44 49 4e 47 2f 46 4f 4c 4c 4f 57  PRECEDING/FOLLOW
5310: 49 4e 47 20 72 65 71 75 69 72 65 73 20 6f 6e 65  ING requires one
5320: 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73   ORDER BY expres
5330: 73 69 6f 6e 22 0a 20 20 20 20 29 3b 0a 20 20 7d  sion".    );.  }
5340: 65 6c 73 65 0a 20 20 69 66 28 20 70 46 75 6e 63  else.  if( pFunc
5350: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
5360: 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57  LITE_FUNC_WINDOW
5370: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20   ){.    sqlite3 
5380: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
5390: 3b 0a 20 20 20 20 69 66 28 20 70 57 69 6e 2d 3e  ;.    if( pWin->
53a0: 70 46 69 6c 74 65 72 20 29 7b 0a 20 20 20 20 20  pFilter ){.     
53b0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
53c0: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
53d0: 20 20 20 20 22 46 49 4c 54 45 52 20 63 6c 61 75      "FILTER clau
53e0: 73 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75  se may only be u
53f0: 73 65 64 20 77 69 74 68 20 61 67 67 72 65 67 61  sed with aggrega
5400: 74 65 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  te window functi
5410: 6f 6e 73 22 0a 20 20 20 20 20 20 29 3b 0a 20 20  ons".      );.  
5420: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
5430: 74 72 75 63 74 20 57 69 6e 64 6f 77 55 70 64 61  truct WindowUpda
5440: 74 65 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  te {.        con
5450: 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 3b 0a  st char *zFunc;.
5460: 20 20 20 20 20 20 20 20 69 6e 74 20 65 54 79 70          int eTyp
5470: 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65  e;.        int e
5480: 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 69  Start;.        i
5490: 6e 74 20 65 45 6e 64 3b 0a 20 20 20 20 20 20 7d  nt eEnd;.      }
54a0: 20 61 55 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20   aUp[] = {.     
54b0: 20 20 20 7b 20 72 6f 77 5f 6e 75 6d 62 65 72 4e     { row_numberN
54c0: 61 6d 65 2c 20 20 20 54 4b 5f 52 4f 57 53 2c 20  ame,   TK_ROWS, 
54d0: 20 20 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 2c 20    TK_UNBOUNDED, 
54e0: 54 4b 5f 43 55 52 52 45 4e 54 20 7d 2c 20 0a 20  TK_CURRENT }, . 
54f0: 20 20 20 20 20 20 20 7b 20 64 65 6e 73 65 5f 72         { dense_r
5500: 61 6e 6b 4e 61 6d 65 2c 20 20 20 54 4b 5f 52 41  ankName,   TK_RA
5510: 4e 47 45 2c 20 20 54 4b 5f 55 4e 42 4f 55 4e 44  NGE,  TK_UNBOUND
5520: 45 44 2c 20 54 4b 5f 43 55 52 52 45 4e 54 20 7d  ED, TK_CURRENT }
5530: 2c 20 0a 20 20 20 20 20 20 20 20 7b 20 72 61 6e  , .        { ran
5540: 6b 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 54  kName,         T
5550: 4b 5f 52 41 4e 47 45 2c 20 20 54 4b 5f 55 4e 42  K_RANGE,  TK_UNB
5560: 4f 55 4e 44 45 44 2c 20 54 4b 5f 43 55 52 52 45  OUNDED, TK_CURRE
5570: 4e 54 20 7d 2c 20 0a 20 20 20 20 20 20 20 20 7b  NT }, .        {
5580: 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b 4e 61 6d   percent_rankNam
5590: 65 2c 20 54 4b 5f 47 52 4f 55 50 53 2c 20 54 4b  e, TK_GROUPS, TK
55a0: 5f 43 55 52 52 45 4e 54 2c 20 20 20 54 4b 5f 55  _CURRENT,   TK_U
55b0: 4e 42 4f 55 4e 44 45 44 20 7d 2c 20 0a 20 20 20  NBOUNDED }, .   
55c0: 20 20 20 20 20 7b 20 63 75 6d 65 5f 64 69 73 74       { cume_dist
55d0: 4e 61 6d 65 2c 20 20 20 20 54 4b 5f 47 52 4f 55  Name,    TK_GROU
55e0: 50 53 2c 20 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  PS, TK_FOLLOWING
55f0: 2c 20 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 7d  , TK_UNBOUNDED }
5600: 2c 20 0a 20 20 20 20 20 20 20 20 7b 20 6e 74 69  , .        { nti
5610: 6c 65 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 54  leName,        T
5620: 4b 5f 52 4f 57 53 2c 20 20 20 54 4b 5f 43 55 52  K_ROWS,   TK_CUR
5630: 52 45 4e 54 2c 20 20 20 54 4b 5f 55 4e 42 4f 55  RENT,   TK_UNBOU
5640: 4e 44 45 44 20 7d 2c 20 0a 20 20 20 20 20 20 20  NDED }, .       
5650: 20 7b 20 6c 65 61 64 4e 61 6d 65 2c 20 20 20 20   { leadName,    
5660: 20 20 20 20 20 54 4b 5f 52 4f 57 53 2c 20 20 20       TK_ROWS,   
5670: 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 2c 20 54 4b  TK_UNBOUNDED, TK
5680: 5f 55 4e 42 4f 55 4e 44 45 44 20 7d 2c 20 0a 20  _UNBOUNDED }, . 
5690: 20 20 20 20 20 20 20 7b 20 6c 61 67 4e 61 6d 65         { lagName
56a0: 2c 20 20 20 20 20 20 20 20 20 20 54 4b 5f 52 4f  ,          TK_RO
56b0: 57 53 2c 20 20 20 54 4b 5f 55 4e 42 4f 55 4e 44  WS,   TK_UNBOUND
56c0: 45 44 2c 20 54 4b 5f 43 55 52 52 45 4e 54 20 7d  ED, TK_CURRENT }
56d0: 2c 20 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  , .      };.    
56e0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
56f0: 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
5700: 69 7a 65 28 61 55 70 29 3b 20 69 2b 2b 29 7b 0a  ize(aUp); i++){.
5710: 20 20 20 20 20 20 20 20 69 66 28 20 70 46 75 6e          if( pFun
5720: 63 2d 3e 7a 4e 61 6d 65 3d 3d 61 55 70 5b 69 5d  c->zName==aUp[i]
5730: 2e 7a 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20  .zFunc ){.      
5740: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
5750: 65 6c 65 74 65 28 64 62 2c 20 70 57 69 6e 2d 3e  elete(db, pWin->
5760: 70 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20  pStart);.       
5770: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
5780: 6c 65 74 65 28 64 62 2c 20 70 57 69 6e 2d 3e 70  lete(db, pWin->p
5790: 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  End);.          
57a0: 70 57 69 6e 2d 3e 70 45 6e 64 20 3d 20 70 57 69  pWin->pEnd = pWi
57b0: 6e 2d 3e 70 53 74 61 72 74 20 3d 20 30 3b 0a 20  n->pStart = 0;. 
57c0: 20 20 20 20 20 20 20 20 20 70 57 69 6e 2d 3e 65           pWin->e
57d0: 54 79 70 65 20 3d 20 61 55 70 5b 69 5d 2e 65 54  Type = aUp[i].eT
57e0: 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ype;.          p
57f0: 57 69 6e 2d 3e 65 53 74 61 72 74 20 3d 20 61 55  Win->eStart = aU
5800: 70 5b 69 5d 2e 65 53 74 61 72 74 3b 0a 20 20 20  p[i].eStart;.   
5810: 20 20 20 20 20 20 20 70 57 69 6e 2d 3e 65 45 6e         pWin->eEn
5820: 64 20 3d 20 61 55 70 5b 69 5d 2e 65 45 6e 64 3b  d = aUp[i].eEnd;
5830: 0a 20 20 20 20 20 20 20 20 20 20 70 57 69 6e 2d  .          pWin-
5840: 3e 65 45 78 63 6c 75 64 65 20 3d 20 30 3b 0a 20  >eExclude = 0;. 
5850: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 57 69           if( pWi
5860: 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f  n->eStart==TK_FO
5870: 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 20  LLOWING ){.     
5880: 20 20 20 20 20 20 20 70 57 69 6e 2d 3e 70 53 74         pWin->pSt
5890: 61 72 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  art = sqlite3Exp
58a0: 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52  r(db, TK_INTEGER
58b0: 2c 20 22 31 22 29 3b 0a 20 20 20 20 20 20 20 20  , "1");.        
58c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72    }.          br
58d0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
58e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
58f0: 0a 20 20 70 57 69 6e 2d 3e 70 46 75 6e 63 20 3d  .  pWin->pFunc =
5900: 20 70 46 75 6e 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pFunc;.}../*.**
5910: 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20   Context object 
5920: 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 73  passed through s
5930: 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69  qlite3WalkExprLi
5940: 73 74 28 29 20 74 6f 0a 2a 2a 20 73 65 6c 65 63  st() to.** selec
5950: 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65 45 78  tWindowRewriteEx
5960: 70 72 43 62 28 29 20 62 79 20 73 65 6c 65 63 74  prCb() by select
5970: 57 69 6e 64 6f 77 52 65 77 72 69 74 65 45 4c 69  WindowRewriteELi
5980: 73 74 28 29 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  st()..*/.typedef
5990: 20 73 74 72 75 63 74 20 57 69 6e 64 6f 77 52 65   struct WindowRe
59a0: 77 72 69 74 65 20 57 69 6e 64 6f 77 52 65 77 72  write WindowRewr
59b0: 69 74 65 3b 0a 73 74 72 75 63 74 20 57 69 6e 64  ite;.struct Wind
59c0: 6f 77 52 65 77 72 69 74 65 20 7b 0a 20 20 57 69  owRewrite {.  Wi
59d0: 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 53 72  ndow *pWin;.  Sr
59e0: 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 45  cList *pSrc;.  E
59f0: 78 70 72 4c 69 73 74 20 2a 70 53 75 62 3b 0a 20  xprList *pSub;. 
5a00: 20 53 65 6c 65 63 74 20 2a 70 53 75 62 53 65 6c   Select *pSubSel
5a10: 65 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ect;            
5a20: 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 75 62 2d   /* Current sub-
5a30: 73 65 6c 65 63 74 2c 20 69 66 20 61 6e 79 20 2a  select, if any *
5a40: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  /.};../*.** Call
5a50: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 75 73  back function us
5a60: 65 64 20 62 79 20 73 65 6c 65 63 74 57 69 6e 64  ed by selectWind
5a70: 6f 77 52 65 77 72 69 74 65 45 4c 69 73 74 28 29  owRewriteEList()
5a80: 2e 20 49 66 20 6e 65 63 65 73 73 61 72 79 2c 0a  . If necessary,.
5a90: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
5aa0: 20 61 70 70 65 6e 64 73 20 74 6f 20 74 68 65 20   appends to the 
5ab0: 6f 75 74 70 75 74 20 65 78 70 72 65 73 73 69 6f  output expressio
5ac0: 6e 2d 6c 69 73 74 20 61 6e 64 20 75 70 64 61 74  n-list and updat
5ad0: 65 73 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  es .** expressio
5ae0: 6e 20 28 2a 70 70 45 78 70 72 29 20 69 6e 20 70  n (*ppExpr) in p
5af0: 6c 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lace..*/.static 
5b00: 69 6e 74 20 73 65 6c 65 63 74 57 69 6e 64 6f 77  int selectWindow
5b10: 52 65 77 72 69 74 65 45 78 70 72 43 62 28 57 61  RewriteExprCb(Wa
5b20: 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
5b30: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 73  xpr *pExpr){.  s
5b40: 74 72 75 63 74 20 57 69 6e 64 6f 77 52 65 77 72  truct WindowRewr
5b50: 69 74 65 20 2a 70 20 3d 20 70 57 61 6c 6b 65 72  ite *p = pWalker
5b60: 2d 3e 75 2e 70 52 65 77 72 69 74 65 3b 0a 20 20  ->u.pRewrite;.  
5b70: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
5b80: 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
5b90: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 66  ..  /* If this f
5ba0: 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  unction is being
5bb0: 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74   called from wit
5bc0: 68 69 6e 20 61 20 73 63 61 6c 61 72 20 73 75 62  hin a scalar sub
5bd0: 2d 73 65 6c 65 63 74 0a 20 20 2a 2a 20 74 68 61  -select.  ** tha
5be0: 74 20 75 73 65 64 20 62 79 20 74 68 65 20 53 45  t used by the SE
5bf0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62  LECT statement b
5c00: 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2c 20  eing processed, 
5c10: 6f 6e 6c 79 20 70 72 6f 63 65 73 73 0a 20 20 2a  only process.  *
5c20: 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 20 65 78 70 72  * TK_COLUMN expr
5c30: 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72 65 66  essions that ref
5c40: 65 72 20 74 6f 20 69 74 20 28 74 68 65 20 6f 75  er to it (the ou
5c50: 74 65 72 20 53 45 4c 45 43 54 29 2e 20 44 6f 0a  ter SELECT). Do.
5c60: 20 20 2a 2a 20 6e 6f 74 20 70 72 6f 63 65 73 73    ** not process
5c70: 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 77   aggregates or w
5c80: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
5c90: 61 74 20 61 6c 6c 2c 20 61 73 20 74 68 65 79 20  at all, as they 
5ca0: 62 65 6c 6f 6e 67 0a 20 20 2a 2a 20 74 6f 20 74  belong.  ** to t
5cb0: 68 65 20 73 63 61 6c 61 72 20 73 75 62 2d 73 65  he scalar sub-se
5cc0: 6c 65 63 74 2e 20 20 2a 2f 0a 20 20 69 66 28 20  lect.  */.  if( 
5cd0: 70 2d 3e 70 53 75 62 53 65 6c 65 63 74 20 29 7b  p->pSubSelect ){
5ce0: 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
5cf0: 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op!=TK_COLUMN ){
5d00: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
5d10: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  C_Continue;.    
5d20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
5d30: 20 6e 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 2d   nSrc = p->pSrc-
5d40: 3e 6e 53 72 63 3b 0a 20 20 20 20 20 20 69 6e 74  >nSrc;.      int
5d50: 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
5d60: 30 3b 20 69 3c 6e 53 72 63 3b 20 69 2b 2b 29 7b  0; i<nSrc; i++){
5d70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78  .        if( pEx
5d80: 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 2d 3e 70  pr->iTable==p->p
5d90: 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  Src->a[i].iCurso
5da0: 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  r ) break;.     
5db0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d   }.      if( i==
5dc0: 6e 53 72 63 20 29 20 72 65 74 75 72 6e 20 57 52  nSrc ) return WR
5dd0: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  C_Continue;.    
5de0: 7d 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28  }.  }..  switch(
5df0: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 0a 20   pExpr->op ){.. 
5e00: 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
5e10: 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 21  ION:.      if( !
5e20: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
5e30: 70 45 78 70 72 2c 20 45 50 5f 57 69 6e 46 75 6e  pExpr, EP_WinFun
5e40: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  c) ){.        br
5e50: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eak;.      }else
5e60: 7b 0a 20 20 20 20 20 20 20 20 57 69 6e 64 6f 77  {.        Window
5e70: 20 2a 70 57 69 6e 3b 0a 20 20 20 20 20 20 20 20   *pWin;.        
5e80: 66 6f 72 28 70 57 69 6e 3d 70 2d 3e 70 57 69 6e  for(pWin=p->pWin
5e90: 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69  ; pWin; pWin=pWi
5ea0: 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20  n->pNextWin){.  
5eb0: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
5ec0: 72 2d 3e 79 2e 70 57 69 6e 3d 3d 70 57 69 6e 20  r->y.pWin==pWin 
5ed0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
5ee0: 73 73 65 72 74 28 20 70 57 69 6e 2d 3e 70 4f 77  ssert( pWin->pOw
5ef0: 6e 65 72 3d 3d 70 45 78 70 72 20 29 3b 0a 20 20  ner==pExpr );.  
5f00: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
5f10: 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
5f20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5f30: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
5f40: 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 2e  /* Fall through.
5f50: 20 20 2a 2f 0a 0a 20 20 20 20 63 61 73 65 20 54    */..    case T
5f60: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a  K_AGG_FUNCTION:.
5f70: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
5f80: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  MN: {.      Expr
5f90: 20 2a 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33   *pDup = sqlite3
5fa0: 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e  ExprDup(pParse->
5fb0: 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  db, pExpr, 0);. 
5fc0: 20 20 20 20 20 70 2d 3e 70 53 75 62 20 3d 20 73       p->pSub = s
5fd0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
5fe0: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 2d 3e  pend(pParse, p->
5ff0: 70 53 75 62 2c 20 70 44 75 70 29 3b 0a 20 20 20  pSub, pDup);.   
6000: 20 20 20 69 66 28 20 70 2d 3e 70 53 75 62 20 29     if( p->pSub )
6010: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
6020: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
6030: 79 28 70 45 78 70 72 2c 20 45 50 5f 53 74 61 74  y(pExpr, EP_Stat
6040: 69 63 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ic)==0 );.      
6050: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
6060: 79 28 70 45 78 70 72 2c 20 45 50 5f 53 74 61 74  y(pExpr, EP_Stat
6070: 69 63 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ic);.        sql
6080: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
6090: 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72  Parse->db, pExpr
60a0: 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 43  );.        ExprC
60b0: 6c 65 61 72 50 72 6f 70 65 72 74 79 28 70 45 78  learProperty(pEx
60c0: 70 72 2c 20 45 50 5f 53 74 61 74 69 63 29 3b 0a  pr, EP_Static);.
60d0: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
60e0: 45 78 70 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Expr, 0, sizeof(
60f0: 45 78 70 72 29 29 3b 0a 0a 20 20 20 20 20 20 20  Expr));..       
6100: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
6110: 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20  COLUMN;.        
6120: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
6130: 20 70 2d 3e 70 53 75 62 2d 3e 6e 45 78 70 72 2d   p->pSub->nExpr-
6140: 31 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  1;.        pExpr
6150: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 2d 3e 70 57  ->iTable = p->pW
6160: 69 6e 2d 3e 69 45 70 68 43 73 72 3b 0a 20 20 20  in->iEphCsr;.   
6170: 20 20 20 7d 0a 0a 20 20 20 20 20 20 62 72 65 61     }..      brea
6180: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 65  k;.    }..    de
6190: 66 61 75 6c 74 3a 20 2f 2a 20 6e 6f 2d 6f 70 20  fault: /* no-op 
61a0: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
61b0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 57 52    }..  return WR
61c0: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74  C_Continue;.}.st
61d0: 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 57  atic int selectW
61e0: 69 6e 64 6f 77 52 65 77 72 69 74 65 53 65 6c 65  indowRewriteSele
61f0: 63 74 43 62 28 57 61 6c 6b 65 72 20 2a 70 57 61  ctCb(Walker *pWa
6200: 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53  lker, Select *pS
6210: 65 6c 65 63 74 29 7b 0a 20 20 73 74 72 75 63 74  elect){.  struct
6220: 20 57 69 6e 64 6f 77 52 65 77 72 69 74 65 20 2a   WindowRewrite *
6230: 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  p = pWalker->u.p
6240: 52 65 77 72 69 74 65 3b 0a 20 20 53 65 6c 65 63  Rewrite;.  Selec
6250: 74 20 2a 70 53 61 76 65 20 3d 20 70 2d 3e 70 53  t *pSave = p->pS
6260: 75 62 53 65 6c 65 63 74 3b 0a 20 20 69 66 28 20  ubSelect;.  if( 
6270: 70 53 61 76 65 3d 3d 70 53 65 6c 65 63 74 20 29  pSave==pSelect )
6280: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
6290: 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 65 6c  _Continue;.  }el
62a0: 73 65 7b 0a 20 20 20 20 70 2d 3e 70 53 75 62 53  se{.    p->pSubS
62b0: 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 3b  elect = pSelect;
62c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  .    sqlite3Walk
62d0: 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
62e0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 70 2d  pSelect);.    p-
62f0: 3e 70 53 75 62 53 65 6c 65 63 74 20 3d 20 70 53  >pSubSelect = pS
6300: 61 76 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ave;.  }.  retur
6310: 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 7d 0a 0a  n WRC_Prune;.}..
6320: 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 65 20 74  ./*.** Iterate t
6330: 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72  hrough each expr
6340: 65 73 73 69 6f 6e 20 69 6e 20 65 78 70 72 65 73  ession in expres
6350: 73 69 6f 6e 2d 6c 69 73 74 20 70 45 4c 69 73 74  sion-list pEList
6360: 2e 20 46 6f 72 20 65 61 63 68 3a 0a 2a 2a 0a 2a  . For each:.**.*
6370: 2a 20 20 20 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 2c  *   * TK_COLUMN,
6380: 0a 2a 2a 20 20 20 2a 20 61 67 67 72 65 67 61 74  .**   * aggregat
6390: 65 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 72 0a 2a  e function, or.*
63a0: 2a 20 20 20 2a 20 77 69 6e 64 6f 77 20 66 75 6e  *   * window fun
63b0: 63 74 69 6f 6e 20 77 69 74 68 20 61 20 57 69 6e  ction with a Win
63c0: 64 6f 77 20 6f 62 6a 65 63 74 20 74 68 61 74 20  dow object that 
63d0: 69 73 20 6e 6f 74 20 61 20 6d 65 6d 62 65 72 20  is not a member 
63e0: 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 57  of the .**     W
63f0: 69 6e 64 6f 77 20 6c 69 73 74 20 70 61 73 73 65  indow list passe
6400: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
6410: 61 72 67 75 6d 65 6e 74 20 28 70 57 69 6e 29 2e  argument (pWin).
6420: 0a 2a 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74 68  .**.** Append th
6430: 65 20 6e 6f 64 65 20 74 6f 20 6f 75 74 70 75 74  e node to output
6440: 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74   expression-list
6450: 20 28 2a 70 70 53 75 62 29 2e 20 41 6e 64 20 72   (*ppSub). And r
6460: 65 70 6c 61 63 65 20 69 74 0a 2a 2a 20 77 69 74  eplace it.** wit
6470: 68 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 74 68  h a TK_COLUMN th
6480: 61 74 20 72 65 61 64 73 20 74 68 65 20 28 4e 2d  at reads the (N-
6490: 31 29 74 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20  1)th element of 
64a0: 74 61 62 6c 65 20 0a 2a 2a 20 70 57 69 6e 2d 3e  table .** pWin->
64b0: 69 45 70 68 43 73 72 2c 20 77 68 65 72 65 20 4e  iEphCsr, where N
64c0: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
64d0: 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 28 2a  f elements in (*
64e0: 70 70 53 75 62 29 20 61 66 74 65 72 0a 2a 2a 20  ppSub) after.** 
64f0: 61 70 70 65 6e 64 69 6e 67 20 74 68 65 20 6e 65  appending the ne
6500: 77 20 6f 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  w one..*/.static
6510: 20 76 6f 69 64 20 73 65 6c 65 63 74 57 69 6e 64   void selectWind
6520: 6f 77 52 65 77 72 69 74 65 45 4c 69 73 74 28 0a  owRewriteEList(.
6530: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
6540: 20 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e   .  Window *pWin
6550: 2c 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  ,.  SrcList *pSr
6560: 63 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  c,.  ExprList *p
6570: 45 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  EList,          
6580: 20 20 20 20 20 2f 2a 20 52 65 77 72 69 74 65 20       /* Rewrite 
6590: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
65a0: 68 69 73 20 6c 69 73 74 20 2a 2f 0a 20 20 45 78  his list */.  Ex
65b0: 70 72 4c 69 73 74 20 2a 2a 70 70 53 75 62 20 20  prList **ppSub  
65c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
65d0: 20 49 4e 2f 4f 55 54 3a 20 53 75 62 2d 73 65 6c   IN/OUT: Sub-sel
65e0: 65 63 74 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c  ect expression-l
65f0: 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b  ist */.){.  Walk
6600: 65 72 20 73 57 61 6c 6b 65 72 3b 0a 20 20 57 69  er sWalker;.  Wi
6610: 6e 64 6f 77 52 65 77 72 69 74 65 20 73 52 65 77  ndowRewrite sRew
6620: 72 69 74 65 3b 0a 0a 20 20 6d 65 6d 73 65 74 28  rite;..  memset(
6630: 26 73 57 61 6c 6b 65 72 2c 20 30 2c 20 73 69 7a  &sWalker, 0, siz
6640: 65 6f 66 28 57 61 6c 6b 65 72 29 29 3b 0a 20 20  eof(Walker));.  
6650: 6d 65 6d 73 65 74 28 26 73 52 65 77 72 69 74 65  memset(&sRewrite
6660: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57 69 6e 64  , 0, sizeof(Wind
6670: 6f 77 52 65 77 72 69 74 65 29 29 3b 0a 0a 20 20  owRewrite));..  
6680: 73 52 65 77 72 69 74 65 2e 70 53 75 62 20 3d 20  sRewrite.pSub = 
6690: 2a 70 70 53 75 62 3b 0a 20 20 73 52 65 77 72 69  *ppSub;.  sRewri
66a0: 74 65 2e 70 57 69 6e 20 3d 20 70 57 69 6e 3b 0a  te.pWin = pWin;.
66b0: 20 20 73 52 65 77 72 69 74 65 2e 70 53 72 63 20    sRewrite.pSrc 
66c0: 3d 20 70 53 72 63 3b 0a 0a 20 20 73 57 61 6c 6b  = pSrc;..  sWalk
66d0: 65 72 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  er.pParse = pPar
66e0: 73 65 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 78 45  se;.  sWalker.xE
66f0: 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65  xprCallback = se
6700: 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74  lectWindowRewrit
6710: 65 45 78 70 72 43 62 3b 0a 20 20 73 57 61 6c 6b  eExprCb;.  sWalk
6720: 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61  er.xSelectCallba
6730: 63 6b 20 3d 20 73 65 6c 65 63 74 57 69 6e 64 6f  ck = selectWindo
6740: 77 52 65 77 72 69 74 65 53 65 6c 65 63 74 43 62  wRewriteSelectCb
6750: 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 75 2e 70 52  ;.  sWalker.u.pR
6760: 65 77 72 69 74 65 20 3d 20 26 73 52 65 77 72 69  ewrite = &sRewri
6770: 74 65 3b 0a 0a 20 20 28 76 6f 69 64 29 73 71 6c  te;..  (void)sql
6780: 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74  ite3WalkExprList
6790: 28 26 73 57 61 6c 6b 65 72 2c 20 70 45 4c 69 73  (&sWalker, pELis
67a0: 74 29 3b 0a 0a 20 20 2a 70 70 53 75 62 20 3d 20  t);..  *ppSub = 
67b0: 73 52 65 77 72 69 74 65 2e 70 53 75 62 3b 0a 7d  sRewrite.pSub;.}
67c0: 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
67d0: 20 63 6f 70 79 20 6f 66 20 65 61 63 68 20 65 78   copy of each ex
67e0: 70 72 65 73 73 69 6f 6e 20 69 6e 20 65 78 70 72  pression in expr
67f0: 65 73 73 69 6f 6e 2d 6c 69 73 74 20 70 41 70 70  ession-list pApp
6800: 65 6e 64 20 74 6f 0a 2a 2a 20 65 78 70 72 65 73  end to.** expres
6810: 73 69 6f 6e 20 6c 69 73 74 20 70 4c 69 73 74 2e  sion list pList.
6820: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
6830: 72 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20  r to the result 
6840: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
6850: 45 78 70 72 4c 69 73 74 20 2a 65 78 70 72 4c 69  ExprList *exprLi
6860: 73 74 41 70 70 65 6e 64 4c 69 73 74 28 0a 20 20  stAppendList(.  
6870: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
6880: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
6890: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
68a0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
68b0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
68c0: 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70 65  to which to appe
68d0: 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  nd. Might be NUL
68e0: 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
68f0: 2a 70 41 70 70 65 6e 64 20 20 20 20 20 20 20 2f  *pAppend       /
6900: 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73  * List of values
6910: 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68   to append. Migh
6920: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  t be NULL */.){.
6930: 20 20 69 66 28 20 70 41 70 70 65 6e 64 20 29 7b    if( pAppend ){
6940: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
6950: 69 6e 74 20 6e 49 6e 69 74 20 3d 20 70 4c 69 73  int nInit = pLis
6960: 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  t ? pList->nExpr
6970: 20 3a 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   : 0;.    for(i=
6980: 30 3b 20 69 3c 70 41 70 70 65 6e 64 2d 3e 6e 45  0; i<pAppend->nE
6990: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
69a0: 20 45 78 70 72 20 2a 70 44 75 70 20 3d 20 73 71   Expr *pDup = sq
69b0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61  lite3ExprDup(pPa
69c0: 72 73 65 2d 3e 64 62 2c 20 70 41 70 70 65 6e 64  rse->db, pAppend
69d0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 30 29  ->a[i].pExpr, 0)
69e0: 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20  ;.      pList = 
69f0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
6a00: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4c  ppend(pParse, pL
6a10: 69 73 74 2c 20 70 44 75 70 29 3b 0a 20 20 20 20  ist, pDup);.    
6a20: 20 20 69 66 28 20 70 4c 69 73 74 20 29 20 70 4c    if( pList ) pL
6a30: 69 73 74 2d 3e 61 5b 6e 49 6e 69 74 2b 69 5d 2e  ist->a[nInit+i].
6a40: 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 41 70 70  sortOrder = pApp
6a50: 65 6e 64 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  end->a[i].sortOr
6a60: 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  der;.    }.  }. 
6a70: 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d   return pList;.}
6a80: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53  ../*.** If the S
6a90: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
6aa0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
6ab0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 64 6f  cond argument do
6ac0: 65 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 0a 2a 2a  es not invoke.**
6ad0: 20 61 6e 79 20 53 51 4c 20 77 69 6e 64 6f 77 20   any SQL window 
6ae0: 66 75 6e 63 74 69 6f 6e 73 2c 20 74 68 69 73 20  functions, this 
6af0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
6b00: 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  -op. Otherwise, 
6b10: 69 74 20 0a 2a 2a 20 72 65 77 72 69 74 65 73 20  it .** rewrites 
6b20: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
6b30: 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77 69 6e  ment so that win
6b40: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 78 53 74  dow function xSt
6b50: 65 70 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20  ep functions.** 
6b60: 61 72 65 20 69 6e 76 6f 6b 65 64 20 69 6e 20 74  are invoked in t
6b70: 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72  he correct order
6b80: 20 61 73 20 64 65 73 63 72 69 62 65 64 20 75 6e   as described un
6b90: 64 65 72 20 22 53 45 4c 45 43 54 20 52 45 57 52  der "SELECT REWR
6ba0: 49 54 49 4e 47 22 0a 2a 2a 20 61 74 20 74 68 65  ITING".** at the
6bb0: 20 74 6f 70 20 6f 66 20 74 68 69 73 20 66 69 6c   top of this fil
6bc0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
6bd0: 33 57 69 6e 64 6f 77 52 65 77 72 69 74 65 28 50  3WindowRewrite(P
6be0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
6bf0: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20  lect *p){.  int 
6c00: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
6c10: 20 20 69 66 28 20 70 2d 3e 70 57 69 6e 20 26 26    if( p->pWin &&
6c20: 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b   p->pPrior==0 ){
6c30: 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73  .    Vdbe *v = s
6c40: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
6c50: 61 72 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  arse);.    sqlit
6c60: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
6c70: 3e 64 62 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  >db;.    Select 
6c80: 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20  *pSub = 0;      
6c90: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75         /* The su
6ca0: 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 53 72  bquery */.    Sr
6cb0: 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d  cList *pSrc = p-
6cc0: 3e 70 53 72 63 3b 0a 20 20 20 20 45 78 70 72 20  >pSrc;.    Expr 
6cd0: 2a 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68  *pWhere = p->pWh
6ce0: 65 72 65 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  ere;.    ExprLis
6cf0: 74 20 2a 70 47 72 6f 75 70 42 79 20 3d 20 70 2d  t *pGroupBy = p-
6d00: 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 45  >pGroupBy;.    E
6d10: 78 70 72 20 2a 70 48 61 76 69 6e 67 20 3d 20 70  xpr *pHaving = p
6d20: 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 20 20 45  ->pHaving;.    E
6d30: 78 70 72 4c 69 73 74 20 2a 70 53 6f 72 74 20 3d  xprList *pSort =
6d40: 20 30 3b 0a 0a 20 20 20 20 45 78 70 72 4c 69 73   0;..    ExprLis
6d50: 74 20 2a 70 53 75 62 6c 69 73 74 20 3d 20 30 3b  t *pSublist = 0;
6d60: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
6d70: 73 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20 73 75  sion list for su
6d80: 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 57  b-query */.    W
6d90: 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70  indow *pMWin = p
6da0: 2d 3e 70 57 69 6e 3b 20 20 20 20 20 20 2f 2a 20  ->pWin;      /* 
6db0: 4d 61 73 74 65 72 20 77 69 6e 64 6f 77 20 6f 62  Master window ob
6dc0: 6a 65 63 74 20 2a 2f 0a 20 20 20 20 57 69 6e 64  ject */.    Wind
6dd0: 6f 77 20 2a 70 57 69 6e 3b 20 20 20 20 20 20 20  ow *pWin;       
6de0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6e            /* Win
6df0: 64 6f 77 20 6f 62 6a 65 63 74 20 69 74 65 72 61  dow object itera
6e00: 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 70 2d 3e 70  tor */..    p->p
6e10: 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  Src = 0;.    p->
6e20: 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 20 20  pWhere = 0;.    
6e30: 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 30 3b  p->pGroupBy = 0;
6e40: 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20  .    p->pHaving 
6e50: 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65  = 0;..    /* Cre
6e60: 61 74 65 20 74 68 65 20 4f 52 44 45 52 20 42 59  ate the ORDER BY
6e70: 20 63 6c 61 75 73 65 20 66 6f 72 20 74 68 65 20   clause for the 
6e80: 73 75 62 2d 73 65 6c 65 63 74 2e 20 54 68 69 73  sub-select. This
6e90: 20 69 73 20 74 68 65 20 63 6f 6e 63 61 74 65 6e   is the concaten
6ea0: 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6f 66 20  ation.    ** of 
6eb0: 74 68 65 20 77 69 6e 64 6f 77 20 50 41 52 54 49  the window PARTI
6ec0: 54 49 4f 4e 20 61 6e 64 20 4f 52 44 45 52 20 42  TION and ORDER B
6ed0: 59 20 63 6c 61 75 73 65 73 2e 20 54 68 65 6e 2c  Y clauses. Then,
6ee0: 20 69 66 20 74 68 69 73 20 6d 61 6b 65 73 20 69   if this makes i
6ef0: 74 0a 20 20 20 20 2a 2a 20 72 65 64 75 6e 64 61  t.    ** redunda
6f00: 6e 74 2c 20 72 65 6d 6f 76 65 20 74 68 65 20 4f  nt, remove the O
6f10: 52 44 45 52 20 42 59 20 66 72 6f 6d 20 74 68 65  RDER BY from the
6f20: 20 70 61 72 65 6e 74 20 53 45 4c 45 43 54 2e 20   parent SELECT. 
6f30: 20 2a 2f 0a 20 20 20 20 70 53 6f 72 74 20 3d 20   */.    pSort = 
6f40: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
6f50: 75 70 28 64 62 2c 20 70 4d 57 69 6e 2d 3e 70 50  up(db, pMWin->pP
6f60: 61 72 74 69 74 69 6f 6e 2c 20 30 29 3b 0a 20 20  artition, 0);.  
6f70: 20 20 70 53 6f 72 74 20 3d 20 65 78 70 72 4c 69    pSort = exprLi
6f80: 73 74 41 70 70 65 6e 64 4c 69 73 74 28 70 50 61  stAppendList(pPa
6f90: 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 4d 57 69  rse, pSort, pMWi
6fa0: 6e 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  n->pOrderBy);.  
6fb0: 20 20 69 66 28 20 70 53 6f 72 74 20 26 26 20 70    if( pSort && p
6fc0: 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
6fd0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
6fe0: 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70  xprListCompare(p
6ff0: 53 6f 72 74 2c 20 70 2d 3e 70 4f 72 64 65 72 42  Sort, p->pOrderB
7000: 79 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20  y, -1)==0 ){.   
7010: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
7020: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
7030: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
7040: 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79       p->pOrderBy
7050: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
7060: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 73 73 69    }..    /* Assi
7070: 67 6e 20 61 20 63 75 72 73 6f 72 20 6e 75 6d 62  gn a cursor numb
7080: 65 72 20 66 6f 72 20 74 68 65 20 65 70 68 65 6d  er for the ephem
7090: 65 72 61 6c 20 74 61 62 6c 65 20 75 73 65 64 20  eral table used 
70a0: 74 6f 20 62 75 66 66 65 72 20 72 6f 77 73 2e 0a  to buffer rows..
70b0: 20 20 20 20 2a 2a 20 54 68 65 20 4f 70 65 6e 45      ** The OpenE
70c0: 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63  phemeral instruc
70d0: 74 69 6f 6e 20 69 73 20 63 6f 64 65 64 20 6c 61  tion is coded la
70e0: 74 65 72 2c 20 61 66 74 65 72 20 69 74 20 69 73  ter, after it is
70f0: 20 6b 6e 6f 77 6e 20 68 6f 77 0a 20 20 20 20 2a   known how.    *
7100: 2a 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 74  * many columns t
7110: 68 65 20 74 61 62 6c 65 20 77 69 6c 6c 20 68 61  he table will ha
7120: 76 65 2e 20 20 2a 2f 0a 20 20 20 20 70 4d 57 69  ve.  */.    pMWi
7130: 6e 2d 3e 69 45 70 68 43 73 72 20 3d 20 70 50 61  n->iEphCsr = pPa
7140: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
7150: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 2b 3d   pParse->nTab +=
7160: 20 33 3b 0a 0a 20 20 20 20 73 65 6c 65 63 74 57   3;..    selectW
7170: 69 6e 64 6f 77 52 65 77 72 69 74 65 45 4c 69 73  indowRewriteELis
7180: 74 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c  t(pParse, pMWin,
7190: 20 70 53 72 63 2c 20 70 2d 3e 70 45 4c 69 73 74   pSrc, p->pEList
71a0: 2c 20 26 70 53 75 62 6c 69 73 74 29 3b 0a 20 20  , &pSublist);.  
71b0: 20 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65    selectWindowRe
71c0: 77 72 69 74 65 45 4c 69 73 74 28 70 50 61 72 73  writeEList(pPars
71d0: 65 2c 20 70 4d 57 69 6e 2c 20 70 53 72 63 2c 20  e, pMWin, pSrc, 
71e0: 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 26 70 53  p->pOrderBy, &pS
71f0: 75 62 6c 69 73 74 29 3b 0a 20 20 20 20 70 4d 57  ublist);.    pMW
7200: 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 20 3d  in->nBufferCol =
7210: 20 28 70 53 75 62 6c 69 73 74 20 3f 20 70 53 75   (pSublist ? pSu
7220: 62 6c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  blist->nExpr : 0
7230: 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e  );..    /* Appen
7240: 64 20 74 68 65 20 50 41 52 54 49 54 49 4f 4e 20  d the PARTITION 
7250: 42 59 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20  BY and ORDER BY 
7260: 65 78 70 72 65 73 73 69 6f 6e 73 20 74 6f 20 74  expressions to t
7270: 68 65 20 74 6f 20 74 68 65 20 0a 20 20 20 20 2a  he to the .    *
7280: 2a 20 73 75 62 2d 73 65 6c 65 63 74 20 65 78 70  * sub-select exp
7290: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 54 68  ression list. Th
72a0: 65 79 20 61 72 65 20 72 65 71 75 69 72 65 64 20  ey are required 
72b0: 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20 77 68  to figure out wh
72c0: 65 72 65 20 0a 20 20 20 20 2a 2a 20 62 6f 75 6e  ere .    ** boun
72d0: 64 61 72 69 65 73 20 66 6f 72 20 70 61 72 74 69  daries for parti
72e0: 74 69 6f 6e 73 20 61 6e 64 20 73 65 74 73 20 6f  tions and sets o
72f0: 66 20 70 65 65 72 20 72 6f 77 73 20 6c 69 65 2e  f peer rows lie.
7300: 20 20 2a 2f 0a 20 20 20 20 70 53 75 62 6c 69 73    */.    pSublis
7310: 74 20 3d 20 65 78 70 72 4c 69 73 74 41 70 70 65  t = exprListAppe
7320: 6e 64 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  ndList(pParse, p
7330: 53 75 62 6c 69 73 74 2c 20 70 4d 57 69 6e 2d 3e  Sublist, pMWin->
7340: 70 50 61 72 74 69 74 69 6f 6e 29 3b 0a 20 20 20  pPartition);.   
7350: 20 70 53 75 62 6c 69 73 74 20 3d 20 65 78 70 72   pSublist = expr
7360: 4c 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28 70  ListAppendList(p
7370: 50 61 72 73 65 2c 20 70 53 75 62 6c 69 73 74 2c  Parse, pSublist,
7380: 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79   pMWin->pOrderBy
7390: 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e  );..    /* Appen
73a0: 64 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20  d the arguments 
73b0: 70 61 73 73 65 64 20 74 6f 20 65 61 63 68 20 77  passed to each w
73c0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 74  indow function t
73d0: 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 75 62  o the.    ** sub
73e0: 2d 73 65 6c 65 63 74 20 65 78 70 72 65 73 73 69  -select expressi
73f0: 6f 6e 20 6c 69 73 74 2e 20 41 6c 73 6f 20 61 6c  on list. Also al
7400: 6c 6f 63 61 74 65 20 74 77 6f 20 72 65 67 69 73  locate two regis
7410: 74 65 72 73 20 66 6f 72 20 65 61 63 68 0a 20 20  ters for each.  
7420: 20 20 2a 2a 20 77 69 6e 64 6f 77 20 66 75 6e 63    ** window func
7430: 74 69 6f 6e 20 2d 20 6f 6e 65 20 66 6f 72 20 74  tion - one for t
7440: 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2c 20  he accumulator, 
7450: 61 6e 6f 74 68 65 72 20 66 6f 72 20 69 6e 74 65  another for inte
7460: 72 69 6d 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c  rim.    ** resul
7470: 74 73 2e 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  ts.  */.    for(
7480: 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e  pWin=pMWin; pWin
7490: 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65  ; pWin=pWin->pNe
74a0: 78 74 57 69 6e 29 7b 0a 20 20 20 20 20 20 70 57  xtWin){.      pW
74b0: 69 6e 2d 3e 69 41 72 67 43 6f 6c 20 3d 20 28 70  in->iArgCol = (p
74c0: 53 75 62 6c 69 73 74 20 3f 20 70 53 75 62 6c 69  Sublist ? pSubli
74d0: 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a  st->nExpr : 0);.
74e0: 20 20 20 20 20 20 70 53 75 62 6c 69 73 74 20 3d        pSublist =
74f0: 20 65 78 70 72 4c 69 73 74 41 70 70 65 6e 64 4c   exprListAppendL
7500: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 75 62  ist(pParse, pSub
7510: 6c 69 73 74 2c 20 70 57 69 6e 2d 3e 70 4f 77 6e  list, pWin->pOwn
7520: 65 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  er->x.pList);.  
7530: 20 20 20 20 69 66 28 20 70 57 69 6e 2d 3e 70 46      if( pWin->pF
7540: 69 6c 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20  ilter ){.       
7550: 20 45 78 70 72 20 2a 70 46 69 6c 74 65 72 20 3d   Expr *pFilter =
7560: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
7570: 64 62 2c 20 70 57 69 6e 2d 3e 70 46 69 6c 74 65  db, pWin->pFilte
7580: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  r, 0);.        p
7590: 53 75 62 6c 69 73 74 20 3d 20 73 71 6c 69 74 65  Sublist = sqlite
75a0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
75b0: 70 50 61 72 73 65 2c 20 70 53 75 62 6c 69 73 74  pParse, pSublist
75c0: 2c 20 70 46 69 6c 74 65 72 29 3b 0a 20 20 20 20  , pFilter);.    
75d0: 20 20 7d 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e    }.      pWin->
75e0: 72 65 67 41 63 63 75 6d 20 3d 20 2b 2b 70 50 61  regAccum = ++pPa
75f0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
7600: 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74   pWin->regResult
7610: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
7620: 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
7630: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7640: 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e  _Null, 0, pWin->
7650: 72 65 67 41 63 63 75 6d 29 3b 0a 20 20 20 20 7d  regAccum);.    }
7660: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
7670: 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59  e is no ORDER BY
7680: 20 6f 72 20 50 41 52 54 49 54 49 4f 4e 20 42 59   or PARTITION BY
7690: 20 63 6c 61 75 73 65 2c 20 61 6e 64 20 74 68 65   clause, and the
76a0: 20 77 69 6e 64 6f 77 0a 20 20 20 20 2a 2a 20 66   window.    ** f
76b0: 75 6e 63 74 69 6f 6e 20 61 63 63 65 70 74 73 20  unction accepts 
76c0: 7a 65 72 6f 20 61 72 67 75 6d 65 6e 74 73 2c 20  zero arguments, 
76d0: 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f  and there are no
76e0: 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 73 0a 20   other columns. 
76f0: 20 20 20 2a 2a 20 73 65 6c 65 63 74 65 64 20 28     ** selected (
7700: 65 2e 67 2e 20 22 53 45 4c 45 43 54 20 72 6f 77  e.g. "SELECT row
7710: 5f 6e 75 6d 62 65 72 28 29 20 4f 56 45 52 20 28  _number() OVER (
7720: 29 20 46 52 4f 4d 20 74 31 22 29 2c 20 69 74 20  ) FROM t1"), it 
7730: 69 73 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20  is possible.    
7740: 2a 2a 20 74 68 61 74 20 70 53 75 62 6c 69 73 74  ** that pSublist
7750: 20 69 73 20 73 74 69 6c 6c 20 4e 55 4c 4c 20 68   is still NULL h
7760: 65 72 65 2e 20 41 64 64 20 61 20 63 6f 6e 73 74  ere. Add a const
7770: 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 68  ant expression h
7780: 65 72 65 20 74 6f 20 0a 20 20 20 20 2a 2a 20 6b  ere to .    ** k
7790: 65 65 70 20 65 76 65 72 79 74 68 69 6e 67 20 6c  eep everything l
77a0: 65 67 61 6c 20 69 6e 20 74 68 69 73 20 63 61 73  egal in this cas
77b0: 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  e. .    */.    i
77c0: 66 28 20 70 53 75 62 6c 69 73 74 3d 3d 30 20 29  f( pSublist==0 )
77d0: 7b 0a 20 20 20 20 20 20 70 53 75 62 6c 69 73 74  {.      pSublist
77e0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
77f0: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
7800: 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73   0, .          s
7810: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
7820: 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20  db, TK_INTEGER, 
7830: 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e  &sqlite3IntToken
7840: 73 5b 30 5d 2c 20 30 29 0a 20 20 20 20 20 20 29  s[0], 0).      )
7850: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 53 75  ;.    }..    pSu
7860: 62 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  b = sqlite3Selec
7870: 74 4e 65 77 28 0a 20 20 20 20 20 20 20 20 70 50  tNew(.        pP
7880: 61 72 73 65 2c 20 70 53 75 62 6c 69 73 74 2c 20  arse, pSublist, 
7890: 70 53 72 63 2c 20 70 57 68 65 72 65 2c 20 70 47  pSrc, pWhere, pG
78a0: 72 6f 75 70 42 79 2c 20 70 48 61 76 69 6e 67 2c  roupBy, pHaving,
78b0: 20 70 53 6f 72 74 2c 20 30 2c 20 30 0a 20 20 20   pSort, 0, 0.   
78c0: 20 29 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20   );.    p->pSrc 
78d0: 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
78e0: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
78f0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
7900: 20 70 2d 3e 70 53 72 63 20 29 7b 0a 20 20 20 20   p->pSrc ){.    
7910: 20 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e    p->pSrc->a[0].
7920: 70 53 65 6c 65 63 74 20 3d 20 70 53 75 62 3b 0a  pSelect = pSub;.
7930: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
7940: 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
7950: 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 53 72  s(pParse, p->pSr
7960: 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  c);.      if( sq
7970: 6c 69 74 65 33 45 78 70 61 6e 64 53 75 62 71 75  lite3ExpandSubqu
7980: 65 72 79 28 70 50 61 72 73 65 2c 20 26 70 2d 3e  ery(pParse, &p->
7990: 70 53 72 63 2d 3e 61 5b 30 5d 29 20 29 7b 0a 20  pSrc->a[0]) ){. 
79a0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
79b0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
79c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
79d0: 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  Sub->selFlags |=
79e0: 20 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20   SF_Expanded;.  
79f0: 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67        p->selFlag
7a00: 73 20 26 3d 20 7e 53 46 5f 41 67 67 72 65 67 61  s &= ~SF_Aggrega
7a10: 74 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  te;.        sqli
7a20: 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50  te3SelectPrep(pP
7a30: 61 72 73 65 2c 20 70 53 75 62 2c 20 30 29 3b 0a  arse, pSub, 0);.
7a40: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73        }..      s
7a50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
7a60: 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
7a70: 65 72 61 6c 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  eral, pMWin->iEp
7a80: 68 43 73 72 2c 20 70 53 75 62 6c 69 73 74 2d 3e  hCsr, pSublist->
7a90: 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71  nExpr);.      sq
7aa0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7ab0: 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70  v, OP_OpenDup, p
7ac0: 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2b 31 2c  MWin->iEphCsr+1,
7ad0: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29   pMWin->iEphCsr)
7ae0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
7af0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7b00: 4f 70 65 6e 44 75 70 2c 20 70 4d 57 69 6e 2d 3e  OpenDup, pMWin->
7b10: 69 45 70 68 43 73 72 2b 32 2c 20 70 4d 57 69 6e  iEphCsr+2, pMWin
7b20: 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 20 20  ->iEphCsr);.    
7b30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7b40: 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75  Op2(v, OP_OpenDu
7b50: 70 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  p, pMWin->iEphCs
7b60: 72 2b 33 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  r+3, pMWin->iEph
7b70: 43 73 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Csr);.    }else{
7b80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
7b90: 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
7ba0: 53 75 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sub);.    }.    
7bb0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
7bc0: 69 6c 65 64 20 29 20 72 63 20 3d 20 53 51 4c 49  iled ) rc = SQLI
7bd0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
7be0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
7bf0: 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 57 69  *.** Free the Wi
7c00: 6e 64 6f 77 20 6f 62 6a 65 63 74 20 70 61 73 73  ndow object pass
7c10: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
7c20: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f   argument..*/.vo
7c30: 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  id sqlite3Window
7c40: 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
7c50: 64 62 2c 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a  db, Window *p){.
7c60: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73    if( p ){.    s
7c70: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
7c80: 28 64 62 2c 20 70 2d 3e 70 46 69 6c 74 65 72 29  (db, p->pFilter)
7c90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
7ca0: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
7cb0: 70 2d 3e 70 50 61 72 74 69 74 69 6f 6e 29 3b 0a  p->pPartition);.
7cc0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
7cd0: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
7ce0: 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
7cf0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
7d00: 65 28 64 62 2c 20 70 2d 3e 70 45 6e 64 29 3b 0a  e(db, p->pEnd);.
7d10: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
7d20: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 53 74  elete(db, p->pSt
7d30: 61 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  art);.    sqlite
7d40: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
7d50: 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
7d60: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
7d70: 7a 42 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69  zBase);.    sqli
7d80: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
7d90: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ;.  }.}../*.** F
7da0: 72 65 65 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c  ree the linked l
7db0: 69 73 74 20 6f 66 20 57 69 6e 64 6f 77 20 6f 62  ist of Window ob
7dc0: 6a 65 63 74 73 20 73 74 61 72 74 69 6e 67 20 61  jects starting a
7dd0: 74 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  t the second arg
7de0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ument..*/.void s
7df0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 4c 69 73 74  qlite3WindowList
7e00: 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
7e10: 64 62 2c 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a  db, Window *p){.
7e20: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
7e30: 20 20 57 69 6e 64 6f 77 20 2a 70 4e 65 78 74 20    Window *pNext 
7e40: 3d 20 70 2d 3e 70 4e 65 78 74 57 69 6e 3b 0a 20  = p->pNextWin;. 
7e50: 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77     sqlite3Window
7e60: 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20  Delete(db, p);. 
7e70: 20 20 20 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20     p = pNext;.  
7e80: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  }.}../*.** The a
7e90: 72 67 75 6d 65 6e 74 20 65 78 70 72 65 73 73 69  rgument expressi
7ea0: 6f 6e 20 69 73 20 61 6e 20 50 52 45 43 45 44 49  on is an PRECEDI
7eb0: 4e 47 20 6f 72 20 46 4f 4c 4c 4f 57 49 4e 47 20  NG or FOLLOWING 
7ec0: 6f 66 66 73 65 74 2e 20 20 54 68 65 0a 2a 2a 20  offset.  The.** 
7ed0: 76 61 6c 75 65 20 73 68 6f 75 6c 64 20 62 65 20  value should be 
7ee0: 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69  a non-negative i
7ef0: 6e 74 65 67 65 72 2e 20 20 49 66 20 74 68 65 20  nteger.  If the 
7f00: 76 61 6c 75 65 20 69 73 20 6e 6f 74 20 61 0a 2a  value is not a.*
7f10: 2a 20 63 6f 6e 73 74 61 6e 74 2c 20 63 68 61 6e  * constant, chan
7f20: 67 65 20 69 74 20 74 6f 20 4e 55 4c 4c 2e 20 20  ge it to NULL.  
7f30: 54 68 65 20 66 61 63 74 20 74 68 61 74 20 69 74  The fact that it
7f40: 20 69 73 20 74 68 65 6e 20 61 20 6e 6f 6e 2d 6e   is then a non-n
7f50: 65 67 61 74 69 76 65 0a 2a 2a 20 69 6e 74 65 67  egative.** integ
7f60: 65 72 20 77 69 6c 6c 20 62 65 20 63 61 75 67 68  er will be caugh
7f70: 74 20 6c 61 74 65 72 2e 20 20 42 75 74 20 69 74  t later.  But it
7f80: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 6e 6f   is important no
7f90: 74 20 74 6f 20 6c 65 61 76 65 0a 2a 2a 20 76 61  t to leave.** va
7fa0: 72 69 61 62 6c 65 20 76 61 6c 75 65 73 20 69 6e  riable values in
7fb0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
7fc0: 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
7fd0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 57 69 6e  Expr *sqlite3Win
7fe0: 64 6f 77 4f 66 66 73 65 74 45 78 70 72 28 50 61  dowOffsetExpr(Pa
7ff0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
8000: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 66 28  r *pExpr){.  if(
8010: 20 30 3d 3d 73 71 6c 69 74 65 33 45 78 70 72 49   0==sqlite3ExprI
8020: 73 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72 29  sConstant(pExpr)
8030: 20 29 7b 0a 20 20 20 20 69 66 28 20 49 4e 5f 52   ){.    if( IN_R
8040: 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 20 73  ENAME_OBJECT ) s
8050: 71 6c 69 74 65 33 52 65 6e 61 6d 65 45 78 70 72  qlite3RenameExpr
8060: 55 6e 6d 61 70 28 70 50 61 72 73 65 2c 20 70 45  Unmap(pParse, pE
8070: 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  xpr);.    sqlite
8080: 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
8090: 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 29 3b 0a  se->db, pExpr);.
80a0: 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69      pExpr = sqli
80b0: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61  te3ExprAlloc(pPa
80c0: 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 4e 55 4c 4c  rse->db, TK_NULL
80d0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  , 0, 0);.  }.  r
80e0: 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a  eturn pExpr;.}..
80f0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
8100: 6e 64 20 72 65 74 75 72 6e 20 61 20 6e 65 77 20  nd return a new 
8110: 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 64 65  Window object de
8120: 73 63 72 69 62 69 6e 67 20 61 20 57 69 6e 64 6f  scribing a Windo
8130: 77 20 44 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f  w Definition..*/
8140: 0a 57 69 6e 64 6f 77 20 2a 73 71 6c 69 74 65 33  .Window *sqlite3
8150: 57 69 6e 64 6f 77 41 6c 6c 6f 63 28 0a 20 20 50  WindowAlloc(.  P
8160: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
8170: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
8180: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79  ext */.  int eTy
8190: 70 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 46 72  pe,        /* Fr
81a0: 61 6d 65 20 74 79 70 65 2e 20 54 4b 5f 52 41 4e  ame type. TK_RAN
81b0: 47 45 20 6f 72 20 54 4b 5f 52 4f 57 53 20 2a 2f  GE or TK_ROWS */
81c0: 0a 20 20 69 6e 74 20 65 53 74 61 72 74 2c 20 20  .  int eStart,  
81d0: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 74 79       /* Start ty
81e0: 70 65 3a 20 43 55 52 52 45 4e 54 2c 20 50 52 45  pe: CURRENT, PRE
81f0: 43 45 44 49 4e 47 2c 20 46 4f 4c 4c 4f 57 49 4e  CEDING, FOLLOWIN
8200: 47 2c 20 55 4e 42 4f 55 4e 44 45 44 20 2a 2f 0a  G, UNBOUNDED */.
8210: 20 20 45 78 70 72 20 2a 70 53 74 61 72 74 2c 20    Expr *pStart, 
8220: 20 20 20 20 2f 2a 20 53 74 61 72 74 20 77 69 6e      /* Start win
8230: 64 6f 77 20 73 69 7a 65 20 69 66 20 54 4b 5f 50  dow size if TK_P
8240: 52 45 43 45 44 49 4e 47 20 6f 72 20 46 4f 4c 4c  RECEDING or FOLL
8250: 4f 57 49 4e 47 20 2a 2f 0a 20 20 69 6e 74 20 65  OWING */.  int e
8260: 45 6e 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  End,         /* 
8270: 45 6e 64 20 74 79 70 65 3a 20 43 55 52 52 45 4e  End type: CURREN
8280: 54 2c 20 46 4f 4c 4c 4f 57 49 4e 47 2c 20 54 4b  T, FOLLOWING, TK
8290: 5f 55 4e 42 4f 55 4e 44 45 44 2c 20 50 52 45 43  _UNBOUNDED, PREC
82a0: 45 44 49 4e 47 20 2a 2f 0a 20 20 45 78 70 72 20  EDING */.  Expr 
82b0: 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 2f 2a 20  *pEnd,       /* 
82c0: 45 6e 64 20 77 69 6e 64 6f 77 20 73 69 7a 65 20  End window size 
82d0: 69 66 20 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  if TK_FOLLOWING 
82e0: 6f 72 20 50 52 45 43 45 44 49 4e 47 20 2a 2f 0a  or PRECEDING */.
82f0: 20 20 75 38 20 65 45 78 63 6c 75 64 65 20 20 20    u8 eExclude   
8300: 20 20 20 20 2f 2a 20 45 58 43 4c 55 44 45 20 63      /* EXCLUDE c
8310: 6c 61 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 57 69  lause */.){.  Wi
8320: 6e 64 6f 77 20 2a 70 57 69 6e 20 3d 20 30 3b 0a  ndow *pWin = 0;.
8330: 20 20 69 6e 74 20 62 49 6d 70 6c 69 63 69 74 46    int bImplicitF
8340: 72 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  rame = 0;..  /* 
8350: 50 61 72 73 65 72 20 61 73 73 75 72 65 73 20 74  Parser assures t
8360: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20 2a 2f  he following: */
8370: 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65  .  assert( eType
8380: 3d 3d 30 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b  ==0 || eType==TK
8390: 5f 52 41 4e 47 45 20 7c 7c 20 65 54 79 70 65 3d  _RANGE || eType=
83a0: 3d 54 4b 5f 52 4f 57 53 20 7c 7c 20 65 54 79 70  =TK_ROWS || eTyp
83b0: 65 3d 3d 54 4b 5f 47 52 4f 55 50 53 20 29 3b 0a  e==TK_GROUPS );.
83c0: 20 20 61 73 73 65 72 74 28 20 65 53 74 61 72 74    assert( eStart
83d0: 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 7c 7c 20  ==TK_CURRENT || 
83e0: 65 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45  eStart==TK_PRECE
83f0: 44 49 4e 47 0a 20 20 20 20 20 20 20 20 20 20 20  DING.           
8400: 7c 7c 20 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e  || eStart==TK_UN
8410: 42 4f 55 4e 44 45 44 20 7c 7c 20 65 53 74 61 72  BOUNDED || eStar
8420: 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  t==TK_FOLLOWING 
8430: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 45 6e  );.  assert( eEn
8440: 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 7c 7c  d==TK_CURRENT ||
8450: 20 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57   eEnd==TK_FOLLOW
8460: 49 4e 47 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ING.           |
8470: 7c 20 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55  | eEnd==TK_UNBOU
8480: 4e 44 45 44 20 7c 7c 20 65 45 6e 64 3d 3d 54 4b  NDED || eEnd==TK
8490: 5f 50 52 45 43 45 44 49 4e 47 20 29 3b 0a 20 20  _PRECEDING );.  
84a0: 61 73 73 65 72 74 28 20 28 65 53 74 61 72 74 3d  assert( (eStart=
84b0: 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 7c 7c  =TK_PRECEDING ||
84c0: 20 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c   eStart==TK_FOLL
84d0: 4f 57 49 4e 47 29 3d 3d 28 70 53 74 61 72 74 21  OWING)==(pStart!
84e0: 3d 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  =0) );.  assert(
84f0: 20 28 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f   (eEnd==TK_FOLLO
8500: 57 49 4e 47 20 7c 7c 20 65 45 6e 64 3d 3d 54 4b  WING || eEnd==TK
8510: 5f 50 52 45 43 45 44 49 4e 47 29 3d 3d 28 70 45  _PRECEDING)==(pE
8520: 6e 64 21 3d 30 29 20 29 3b 0a 0a 20 20 69 66 28  nd!=0) );..  if(
8530: 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20   eType==0 ){.   
8540: 20 62 49 6d 70 6c 69 63 69 74 46 72 61 6d 65 20   bImplicitFrame 
8550: 3d 20 31 3b 0a 20 20 20 20 65 54 79 70 65 20 3d  = 1;.    eType =
8560: 20 54 4b 5f 52 41 4e 47 45 3b 0a 20 20 7d 0a 0a   TK_RANGE;.  }..
8570: 20 20 2f 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c    /* Additionall
8580: 79 2c 20 74 68 65 0a 20 20 2a 2a 20 73 74 61 72  y, the.  ** star
8590: 74 69 6e 67 20 62 6f 75 6e 64 61 72 79 20 74 79  ting boundary ty
85a0: 70 65 20 6d 61 79 20 6e 6f 74 20 6f 63 63 75 72  pe may not occur
85b0: 20 65 61 72 6c 69 65 72 20 69 6e 20 74 68 65 20   earlier in the 
85c0: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 69 73 74 20 74  following list t
85d0: 68 61 6e 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64  han.  ** the end
85e0: 69 6e 67 20 62 6f 75 6e 64 61 72 79 20 74 79 70  ing boundary typ
85f0: 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 55  e:.  **.  **   U
8600: 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49  NBOUNDED PRECEDI
8610: 4e 47 0a 20 20 2a 2a 20 20 20 3c 65 78 70 72 3e  NG.  **   <expr>
8620: 20 50 52 45 43 45 44 49 4e 47 0a 20 20 2a 2a 20   PRECEDING.  ** 
8630: 20 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 20 20    CURRENT ROW.  
8640: 2a 2a 20 20 20 3c 65 78 70 72 3e 20 46 4f 4c 4c  **   <expr> FOLL
8650: 4f 57 49 4e 47 0a 20 20 2a 2a 20 20 20 55 4e 42  OWING.  **   UNB
8660: 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47  OUNDED FOLLOWING
8670: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 70  .  **.  ** The p
8680: 61 72 73 65 72 20 65 6e 73 75 72 65 73 20 74 68  arser ensures th
8690: 61 74 20 22 55 4e 42 4f 55 4e 44 45 44 20 50 52  at "UNBOUNDED PR
86a0: 45 43 45 44 49 4e 47 22 20 63 61 6e 6e 6f 74 20  ECEDING" cannot 
86b0: 62 65 20 75 73 65 64 20 61 73 20 61 6e 20 65 6e  be used as an en
86c0: 64 69 6e 67 0a 20 20 2a 2a 20 62 6f 75 6e 64 61  ding.  ** bounda
86d0: 72 79 2c 20 61 6e 64 20 74 68 61 6e 20 22 55 4e  ry, and than "UN
86e0: 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e  BOUNDED FOLLOWIN
86f0: 47 22 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  G" cannot be use
8700: 64 20 61 73 20 61 20 73 74 61 72 74 69 6e 67 0a  d as a starting.
8710: 20 20 2a 2a 20 66 72 61 6d 65 20 62 6f 75 6e 64    ** frame bound
8720: 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ary..  */.  if( 
8730: 28 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52  (eStart==TK_CURR
8740: 45 4e 54 20 26 26 20 65 45 6e 64 3d 3d 54 4b 5f  ENT && eEnd==TK_
8750: 50 52 45 43 45 44 49 4e 47 29 0a 20 20 20 7c 7c  PRECEDING).   ||
8760: 20 28 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c   (eStart==TK_FOL
8770: 4c 4f 57 49 4e 47 20 26 26 20 28 65 45 6e 64 3d  LOWING && (eEnd=
8780: 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 7c 7c  =TK_PRECEDING ||
8790: 20 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e   eEnd==TK_CURREN
87a0: 54 29 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c  T)).  ){.    sql
87b0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
87c0: 72 73 65 2c 20 22 75 6e 73 75 70 70 6f 72 74 65  rse, "unsupporte
87d0: 64 20 66 72 61 6d 65 20 73 70 65 63 69 66 69 63  d frame specific
87e0: 61 74 69 6f 6e 22 29 3b 0a 20 20 20 20 67 6f 74  ation");.    got
87f0: 6f 20 77 69 6e 64 6f 77 41 6c 6c 6f 63 45 72 72  o windowAllocErr
8800: 3b 0a 20 20 7d 0a 0a 20 20 70 57 69 6e 20 3d 20  ;.  }..  pWin = 
8810: 28 57 69 6e 64 6f 77 2a 29 73 71 6c 69 74 65 33  (Window*)sqlite3
8820: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61  DbMallocZero(pPa
8830: 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28  rse->db, sizeof(
8840: 57 69 6e 64 6f 77 29 29 3b 0a 20 20 69 66 28 20  Window));.  if( 
8850: 70 57 69 6e 3d 3d 30 20 29 20 67 6f 74 6f 20 77  pWin==0 ) goto w
8860: 69 6e 64 6f 77 41 6c 6c 6f 63 45 72 72 3b 0a 20  indowAllocErr;. 
8870: 20 70 57 69 6e 2d 3e 65 54 79 70 65 20 3d 20 65   pWin->eType = e
8880: 54 79 70 65 3b 0a 20 20 70 57 69 6e 2d 3e 65 53  Type;.  pWin->eS
8890: 74 61 72 74 20 3d 20 65 53 74 61 72 74 3b 0a 20  tart = eStart;. 
88a0: 20 70 57 69 6e 2d 3e 65 45 6e 64 20 3d 20 65 45   pWin->eEnd = eE
88b0: 6e 64 3b 0a 20 20 69 66 28 20 65 45 78 63 6c 75  nd;.  if( eExclu
88c0: 64 65 3d 3d 30 20 26 26 20 4f 70 74 69 6d 69 7a  de==0 && Optimiz
88d0: 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 70 50  ationDisabled(pP
88e0: 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45  arse->db, SQLITE
88f0: 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72 29  _QueryFlattener)
8900: 20 29 7b 0a 20 20 20 20 65 45 78 63 6c 75 64 65   ){.    eExclude
8910: 20 3d 20 54 4b 5f 4e 4f 3b 0a 20 20 7d 0a 20 20   = TK_NO;.  }.  
8920: 70 57 69 6e 2d 3e 65 45 78 63 6c 75 64 65 20 3d  pWin->eExclude =
8930: 20 65 45 78 63 6c 75 64 65 3b 0a 20 20 70 57 69   eExclude;.  pWi
8940: 6e 2d 3e 62 49 6d 70 6c 69 63 69 74 46 72 61 6d  n->bImplicitFram
8950: 65 20 3d 20 62 49 6d 70 6c 69 63 69 74 46 72 61  e = bImplicitFra
8960: 6d 65 3b 0a 20 20 70 57 69 6e 2d 3e 70 45 6e 64  me;.  pWin->pEnd
8970: 20 3d 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77   = sqlite3Window
8980: 4f 66 66 73 65 74 45 78 70 72 28 70 50 61 72 73  OffsetExpr(pPars
8990: 65 2c 20 70 45 6e 64 29 3b 0a 20 20 70 57 69 6e  e, pEnd);.  pWin
89a0: 2d 3e 70 53 74 61 72 74 20 3d 20 73 71 6c 69 74  ->pStart = sqlit
89b0: 65 33 57 69 6e 64 6f 77 4f 66 66 73 65 74 45 78  e3WindowOffsetEx
89c0: 70 72 28 70 50 61 72 73 65 2c 20 70 53 74 61 72  pr(pParse, pStar
89d0: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 69  t);.  return pWi
89e0: 6e 3b 0a 0a 77 69 6e 64 6f 77 41 6c 6c 6f 63 45  n;..windowAllocE
89f0: 72 72 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70  rr:.  sqlite3Exp
8a00: 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
8a10: 64 62 2c 20 70 45 6e 64 29 3b 0a 20 20 73 71 6c  db, pEnd);.  sql
8a20: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
8a30: 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 74 61 72  Parse->db, pStar
8a40: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  t);.  return 0;.
8a50: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20  }../*.** Attach 
8a60: 50 41 52 54 49 54 49 4f 4e 20 61 6e 64 20 4f 52  PARTITION and OR
8a70: 44 45 52 20 42 59 20 63 6c 61 75 73 65 73 20 70  DER BY clauses p
8a80: 50 61 72 74 69 74 69 6f 6e 20 61 6e 64 20 70 4f  Partition and pO
8a90: 72 64 65 72 42 79 20 74 6f 20 77 69 6e 64 6f 77  rderBy to window
8aa0: 0a 2a 2a 20 70 57 69 6e 2e 20 41 6c 73 6f 2c 20  .** pWin. Also, 
8ab0: 69 66 20 70 61 72 61 6d 65 74 65 72 20 70 42 61  if parameter pBa
8ac0: 73 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  se is not NULL, 
8ad0: 73 65 74 20 70 57 69 6e 2d 3e 7a 42 61 73 65 20  set pWin->zBase 
8ae0: 74 6f 20 74 68 65 0a 2a 2a 20 65 71 75 69 76 61  to the.** equiva
8af0: 6c 65 6e 74 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  lent nul-termina
8b00: 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 57  ted string..*/.W
8b10: 69 6e 64 6f 77 20 2a 73 71 6c 69 74 65 33 57 69  indow *sqlite3Wi
8b20: 6e 64 6f 77 41 73 73 65 6d 62 6c 65 28 0a 20 20  ndowAssemble(.  
8b30: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a  Parse *pParse, .
8b40: 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 2c 20    Window *pWin, 
8b50: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 50 61  .  ExprList *pPa
8b60: 72 74 69 74 69 6f 6e 2c 20 0a 20 20 45 78 70 72  rtition, .  Expr
8b70: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
8b80: 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 61 73 65 0a  .  Token *pBase.
8b90: 29 7b 0a 20 20 69 66 28 20 70 57 69 6e 20 29 7b  ){.  if( pWin ){
8ba0: 0a 20 20 20 20 70 57 69 6e 2d 3e 70 50 61 72 74  .    pWin->pPart
8bb0: 69 74 69 6f 6e 20 3d 20 70 50 61 72 74 69 74 69  ition = pPartiti
8bc0: 6f 6e 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70 4f  on;.    pWin->pO
8bd0: 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
8be0: 79 3b 0a 20 20 20 20 69 66 28 20 70 42 61 73 65  y;.    if( pBase
8bf0: 20 29 7b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e   ){.      pWin->
8c00: 7a 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 44  zBase = sqlite3D
8c10: 62 53 74 72 4e 44 75 70 28 70 50 61 72 73 65 2d  bStrNDup(pParse-
8c20: 3e 64 62 2c 20 70 42 61 73 65 2d 3e 7a 2c 20 70  >db, pBase->z, p
8c30: 42 61 73 65 2d 3e 6e 29 3b 0a 20 20 20 20 7d 0a  Base->n);.    }.
8c40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
8c50: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
8c60: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
8c70: 50 61 72 74 69 74 69 6f 6e 29 3b 0a 20 20 20 20  Partition);.    
8c80: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
8c90: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
8ca0: 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d  , pOrderBy);.  }
8cb0: 0a 20 20 72 65 74 75 72 6e 20 70 57 69 6e 3b 0a  .  return pWin;.
8cc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e 64 6f 77 20  }../*.** Window 
8cd0: 2a 70 57 69 6e 20 68 61 73 20 6a 75 73 74 20 62  *pWin has just b
8ce0: 65 65 6e 20 63 72 65 61 74 65 64 20 66 72 6f 6d  een created from
8cf0: 20 61 20 57 49 4e 44 4f 57 20 63 6c 61 75 73 65   a WINDOW clause
8d00: 2e 20 54 6f 6b 6e 65 20 70 42 61 73 65 0a 2a 2a  . Tokne pBase.**
8d10: 20 69 73 20 74 68 65 20 62 61 73 65 20 77 69 6e   is the base win
8d20: 64 6f 77 2e 20 45 61 72 6c 69 65 72 20 77 69 6e  dow. Earlier win
8d30: 64 6f 77 73 20 66 72 6f 6d 20 74 68 65 20 73 61  dows from the sa
8d40: 6d 65 20 57 49 4e 44 4f 57 20 63 6c 61 75 73 65  me WINDOW clause
8d50: 20 61 72 65 0a 2a 2a 20 73 74 6f 72 65 64 20 69   are.** stored i
8d60: 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  n the linked lis
8d70: 74 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 57  t starting at pW
8d80: 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 2e 20 54 68  in->pNextWin. Th
8d90: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 65  is function.** e
8da0: 69 74 68 65 72 20 75 70 64 61 74 65 73 20 2a 70  ither updates *p
8db0: 57 69 6e 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  Win according to
8dc0: 20 74 68 65 20 62 61 73 65 20 73 70 65 63 69 66   the base specif
8dd0: 69 63 61 74 69 6f 6e 2c 20 6f 72 20 65 6c 73 65  ication, or else
8de0: 0a 2a 2a 20 6c 65 61 76 65 73 20 61 6e 20 65 72  .** leaves an er
8df0: 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  ror in pParse..*
8e00: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69  /.void sqlite3Wi
8e10: 6e 64 6f 77 43 68 61 69 6e 28 50 61 72 73 65 20  ndowChain(Parse 
8e20: 2a 70 50 61 72 73 65 2c 20 57 69 6e 64 6f 77 20  *pParse, Window 
8e30: 2a 70 57 69 6e 2c 20 57 69 6e 64 6f 77 20 2a 70  *pWin, Window *p
8e40: 4c 69 73 74 29 7b 0a 20 20 69 66 28 20 70 57 69  List){.  if( pWi
8e50: 6e 2d 3e 7a 42 61 73 65 20 29 7b 0a 20 20 20 20  n->zBase ){.    
8e60: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
8e70: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 57 69  arse->db;.    Wi
8e80: 6e 64 6f 77 20 2a 70 45 78 69 73 74 20 3d 20 77  ndow *pExist = w
8e90: 69 6e 64 6f 77 46 69 6e 64 28 70 50 61 72 73 65  indowFind(pParse
8ea0: 2c 20 70 4c 69 73 74 2c 20 70 57 69 6e 2d 3e 7a  , pList, pWin->z
8eb0: 42 61 73 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Base);.    if( p
8ec0: 45 78 69 73 74 20 29 7b 0a 20 20 20 20 20 20 63  Exist ){.      c
8ed0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20  onst char *zErr 
8ee0: 3d 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68  = 0;.      /* Ch
8ef0: 65 63 6b 20 66 6f 72 20 65 72 72 6f 72 73 20 2a  eck for errors *
8f00: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 57 69 6e  /.      if( pWin
8f10: 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 29 7b 0a  ->pPartition ){.
8f20: 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 22          zErr = "
8f30: 50 41 52 54 49 54 49 4f 4e 20 63 6c 61 75 73 65  PARTITION clause
8f40: 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ";.      }else i
8f50: 66 28 20 70 45 78 69 73 74 2d 3e 70 4f 72 64 65  f( pExist->pOrde
8f60: 72 42 79 20 26 26 20 70 57 69 6e 2d 3e 70 4f 72  rBy && pWin->pOr
8f70: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
8f80: 20 7a 45 72 72 20 3d 20 22 4f 52 44 45 52 20 42   zErr = "ORDER B
8f90: 59 20 63 6c 61 75 73 65 22 3b 0a 20 20 20 20 20  Y clause";.     
8fa0: 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 69 73   }else if( pExis
8fb0: 74 2d 3e 62 49 6d 70 6c 69 63 69 74 46 72 61 6d  t->bImplicitFram
8fc0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
8fd0: 7a 45 72 72 20 3d 20 22 66 72 61 6d 65 20 73 70  zErr = "frame sp
8fe0: 65 63 69 66 69 63 61 74 69 6f 6e 22 3b 0a 20 20  ecification";.  
8ff0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
9000: 7a 45 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20  zErr ){.        
9010: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
9020: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
9030: 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 6f 76 65       "cannot ove
9040: 72 72 69 64 65 20 25 73 20 6f 66 20 77 69 6e 64  rride %s of wind
9050: 6f 77 3a 20 25 73 22 2c 20 7a 45 72 72 2c 20 70  ow: %s", zErr, p
9060: 57 69 6e 2d 3e 7a 42 61 73 65 0a 20 20 20 20 20  Win->zBase.     
9070: 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73     );.      }els
9080: 65 7b 0a 20 20 20 20 20 20 20 20 70 57 69 6e 2d  e{.        pWin-
9090: 3e 70 50 61 72 74 69 74 69 6f 6e 20 3d 20 73 71  >pPartition = sq
90a0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
90b0: 28 64 62 2c 20 70 45 78 69 73 74 2d 3e 70 50 61  (db, pExist->pPa
90c0: 72 74 69 74 69 6f 6e 2c 20 30 29 3b 0a 20 20 20  rtition, 0);.   
90d0: 20 20 20 20 20 69 66 28 20 70 45 78 69 73 74 2d       if( pExist-
90e0: 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
90f0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
9100: 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  Win->pOrderBy==0
9110: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 57   );.          pW
9120: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73  in->pOrderBy = s
9130: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
9140: 70 28 64 62 2c 20 70 45 78 69 73 74 2d 3e 70 4f  p(db, pExist->pO
9150: 72 64 65 72 42 79 2c 20 30 29 3b 0a 20 20 20 20  rderBy, 0);.    
9160: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
9170: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
9180: 70 57 69 6e 2d 3e 7a 42 61 73 65 29 3b 0a 20 20  pWin->zBase);.  
9190: 20 20 20 20 20 20 70 57 69 6e 2d 3e 7a 42 61 73        pWin->zBas
91a0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
91b0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
91c0: 2a 20 41 74 74 61 63 68 20 77 69 6e 64 6f 77 20  * Attach window 
91d0: 6f 62 6a 65 63 74 20 70 57 69 6e 20 74 6f 20 65  object pWin to e
91e0: 78 70 72 65 73 73 69 6f 6e 20 70 2e 0a 2a 2f 0a  xpression p..*/.
91f0: 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64  void sqlite3Wind
9200: 6f 77 41 74 74 61 63 68 28 50 61 72 73 65 20 2a  owAttach(Parse *
9210: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 2c  pParse, Expr *p,
9220: 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 29 7b 0a   Window *pWin){.
9230: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61    if( p ){.    a
9240: 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b  ssert( p->op==TK
9250: 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20  _FUNCTION );.   
9260: 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
9270: 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
9280: 66 6f 72 20 74 68 65 20 70 61 72 73 65 72 2e 20  for the parser. 
9290: 20 49 66 20 70 57 69 6e 20 77 61 73 20 6e 6f 74   If pWin was not
92a0: 0a 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  .    ** allocate
92b0: 64 20 64 75 65 20 74 6f 20 61 6e 20 4f 4f 4d 2c  d due to an OOM,
92c0: 20 74 68 65 6e 20 74 68 65 20 70 61 72 73 65 72   then the parser
92d0: 20 77 6f 75 6c 64 20 66 61 69 6c 20 62 65 66 6f   would fail befo
92e0: 72 65 20 65 76 65 72 0a 20 20 20 20 2a 2a 20 69  re ever.    ** i
92f0: 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75  nvoking this rou
9300: 74 69 6e 65 20 2a 2f 0a 20 20 20 20 69 66 28 20  tine */.    if( 
9310: 41 4c 57 41 59 53 28 70 57 69 6e 29 20 29 7b 0a  ALWAYS(pWin) ){.
9320: 20 20 20 20 20 20 70 2d 3e 79 2e 70 57 69 6e 20        p->y.pWin 
9330: 3d 20 70 57 69 6e 3b 0a 20 20 20 20 20 20 45 78  = pWin;.      Ex
9340: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c  prSetProperty(p,
9350: 20 45 50 5f 57 69 6e 46 75 6e 63 29 3b 0a 20 20   EP_WinFunc);.  
9360: 20 20 20 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72      pWin->pOwner
9370: 20 3d 20 70 3b 0a 20 20 20 20 20 20 69 66 28 20   = p;.      if( 
9380: 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69  p->flags & EP_Di
9390: 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20  stinct ){.      
93a0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
93b0: 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
93c0: 20 20 20 20 20 22 44 49 53 54 49 4e 43 54 20 69       "DISTINCT i
93d0: 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20  s not supported 
93e0: 66 6f 72 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  for window funct
93f0: 69 6f 6e 73 22 29 3b 0a 20 20 20 20 20 20 7d 0a  ions");.      }.
9400: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
9410: 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77     sqlite3Window
9420: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
9430: 62 2c 20 70 57 69 6e 29 3b 0a 20 20 7d 0a 7d 0a  b, pWin);.  }.}.
9440: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  ./*.** Return 0 
9450: 69 66 20 74 68 65 20 74 77 6f 20 77 69 6e 64 6f  if the two windo
9460: 77 20 6f 62 6a 65 63 74 73 20 61 72 65 20 69 64  w objects are id
9470: 65 6e 74 69 63 61 6c 2c 20 6f 72 20 6e 6f 6e 2d  entical, or non-
9480: 7a 65 72 6f 20 6f 74 68 65 72 77 69 73 65 2e 0a  zero otherwise..
9490: 2a 2a 20 49 64 65 6e 74 69 63 61 6c 20 77 69 6e  ** Identical win
94a0: 64 6f 77 20 6f 62 6a 65 63 74 73 20 63 61 6e 20  dow objects can 
94b0: 62 65 20 70 72 6f 63 65 73 73 65 64 20 69 6e 20  be processed in 
94c0: 61 20 73 69 6e 67 6c 65 20 73 63 61 6e 2e 0a 2a  a single scan..*
94d0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 69 6e  /.int sqlite3Win
94e0: 64 6f 77 43 6f 6d 70 61 72 65 28 50 61 72 73 65  dowCompare(Parse
94f0: 20 2a 70 50 61 72 73 65 2c 20 57 69 6e 64 6f 77   *pParse, Window
9500: 20 2a 70 31 2c 20 57 69 6e 64 6f 77 20 2a 70 32   *p1, Window *p2
9510: 29 7b 0a 20 20 69 66 28 20 70 31 2d 3e 65 54 79  ){.  if( p1->eTy
9520: 70 65 21 3d 70 32 2d 3e 65 54 79 70 65 20 29 20  pe!=p2->eType ) 
9530: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
9540: 70 31 2d 3e 65 53 74 61 72 74 21 3d 70 32 2d 3e  p1->eStart!=p2->
9550: 65 53 74 61 72 74 20 29 20 72 65 74 75 72 6e 20  eStart ) return 
9560: 31 3b 0a 20 20 69 66 28 20 70 31 2d 3e 65 45 6e  1;.  if( p1->eEn
9570: 64 21 3d 70 32 2d 3e 65 45 6e 64 20 29 20 72 65  d!=p2->eEnd ) re
9580: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 31  turn 1;.  if( p1
9590: 2d 3e 65 45 78 63 6c 75 64 65 21 3d 70 32 2d 3e  ->eExclude!=p2->
95a0: 65 45 78 63 6c 75 64 65 20 29 20 72 65 74 75 72  eExclude ) retur
95b0: 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
95c0: 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50  e3ExprCompare(pP
95d0: 61 72 73 65 2c 20 70 31 2d 3e 70 53 74 61 72 74  arse, p1->pStart
95e0: 2c 20 70 32 2d 3e 70 53 74 61 72 74 2c 20 2d 31  , p2->pStart, -1
95f0: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
9600: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
9610: 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
9620: 31 2d 3e 70 45 6e 64 2c 20 70 32 2d 3e 70 45 6e  1->pEnd, p2->pEn
9630: 64 2c 20 2d 31 29 20 29 20 72 65 74 75 72 6e 20  d, -1) ) return 
9640: 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
9650: 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
9660: 70 31 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20  p1->pPartition, 
9670: 70 32 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20  p2->pPartition, 
9680: 2d 31 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  -1) ) return 1;.
9690: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
96a0: 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 31 2d  rListCompare(p1-
96b0: 3e 70 4f 72 64 65 72 42 79 2c 20 70 32 2d 3e 70  >pOrderBy, p2->p
96c0: 4f 72 64 65 72 42 79 2c 20 2d 31 29 20 29 20 72  OrderBy, -1) ) r
96d0: 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
96e0: 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  n 0;.}.../*.** T
96f0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 62 79  his is called by
9700: 20 63 6f 64 65 20 69 6e 20 73 65 6c 65 63 74 2e   code in select.
9710: 63 20 62 65 66 6f 72 65 20 69 74 20 63 61 6c 6c  c before it call
9720: 73 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  s sqlite3WhereBe
9730: 67 69 6e 28 29 0a 2a 2a 20 74 6f 20 62 65 67 69  gin().** to begi
9740: 6e 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  n iterating thro
9750: 75 67 68 20 74 68 65 20 73 75 62 2d 71 75 65 72  ugh the sub-quer
9760: 79 20 72 65 73 75 6c 74 73 2e 20 49 74 20 69 73  y results. It is
9770: 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74   used to allocat
9780: 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c  e.** and initial
9790: 69 7a 65 20 72 65 67 69 73 74 65 72 73 20 61 6e  ize registers an
97a0: 64 20 63 75 72 73 6f 72 73 20 75 73 65 64 20 62  d cursors used b
97b0: 79 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43  y sqlite3WindowC
97c0: 6f 64 65 53 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f  odeStep()..*/.vo
97d0: 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  id sqlite3Window
97e0: 43 6f 64 65 49 6e 69 74 28 50 61 72 73 65 20 2a  CodeInit(Parse *
97f0: 70 50 61 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a  pParse, Window *
9800: 70 4d 57 69 6e 29 7b 0a 20 20 57 69 6e 64 6f 77  pMWin){.  Window
9810: 20 2a 70 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a   *pWin;.  Vdbe *
9820: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
9830: 62 65 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f  be(pParse);..  /
9840: 2a 20 41 6c 6c 6f 63 61 74 65 20 72 65 67 69 73  * Allocate regis
9850: 74 65 72 73 20 74 6f 20 75 73 65 20 66 6f 72 20  ters to use for 
9860: 50 41 52 54 49 54 49 4f 4e 20 42 59 20 76 61 6c  PARTITION BY val
9870: 75 65 73 2c 20 69 66 20 61 6e 79 2e 20 49 6e 69  ues, if any. Ini
9880: 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 73 61 69  tialize.  ** sai
9890: 64 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 4e  d registers to N
98a0: 55 4c 4c 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ULL.  */.  if( p
98b0: 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e  MWin->pPartition
98c0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70   ){.    int nExp
98d0: 72 20 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74  r = pMWin->pPart
98e0: 69 74 69 6f 6e 2d 3e 6e 45 78 70 72 3b 0a 20 20  ition->nExpr;.  
98f0: 20 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74    pMWin->regPart
9900: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
9910: 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
9920: 4d 65 6d 20 2b 3d 20 6e 45 78 70 72 3b 0a 20 20  Mem += nExpr;.  
9930: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9940: 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op3(v, OP_Null, 
9950: 30 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72  0, pMWin->regPar
9960: 74 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72  t, pMWin->regPar
9970: 74 2b 6e 45 78 70 72 2d 31 29 3b 0a 20 20 7d 0a  t+nExpr-1);.  }.
9980: 0a 20 20 70 4d 57 69 6e 2d 3e 72 65 67 4f 6e 65  .  pMWin->regOne
9990: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
99a0: 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  m;.  sqlite3Vdbe
99b0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
99c0: 65 67 65 72 2c 20 31 2c 20 70 4d 57 69 6e 2d 3e  eger, 1, pMWin->
99d0: 72 65 67 4f 6e 65 29 3b 0a 0a 20 20 69 66 28 20  regOne);..  if( 
99e0: 70 4d 57 69 6e 2d 3e 65 45 78 63 6c 75 64 65 20  pMWin->eExclude 
99f0: 29 7b 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 72 65  ){.    pMWin->re
9a00: 67 53 74 61 72 74 52 6f 77 69 64 20 3d 20 2b 2b  gStartRowid = ++
9a10: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
9a20: 20 20 70 4d 57 69 6e 2d 3e 72 65 67 45 6e 64 52    pMWin->regEndR
9a30: 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d  owid = ++pParse-
9a40: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 70 4d 57 69 6e  >nMem;.    pMWin
9a50: 2d 3e 63 73 72 41 70 70 20 3d 20 70 50 61 72 73  ->csrApp = pPars
9a60: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73  e->nTab++;.    s
9a70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
9a80: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
9a90: 31 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61  1, pMWin->regSta
9aa0: 72 74 52 6f 77 69 64 29 3b 0a 20 20 20 20 73 71  rtRowid);.    sq
9ab0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
9ac0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
9ad0: 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 45 6e 64 52  , pMWin->regEndR
9ae0: 6f 77 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  owid);.    sqlit
9af0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
9b00: 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70 4d 57 69  OP_OpenDup, pMWi
9b10: 6e 2d 3e 63 73 72 41 70 70 2c 20 70 4d 57 69 6e  n->csrApp, pMWin
9b20: 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 20 20  ->iEphCsr);.    
9b30: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66  return;.  }..  f
9b40: 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70  or(pWin=pMWin; p
9b50: 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e  Win; pWin=pWin->
9b60: 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 46  pNextWin){.    F
9b70: 75 6e 63 44 65 66 20 2a 70 20 3d 20 70 57 69 6e  uncDef *p = pWin
9b80: 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 69 66 28  ->pFunc;.    if(
9b90: 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26   (p->funcFlags &
9ba0: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e   SQLITE_FUNC_MIN
9bb0: 4d 41 58 29 20 26 26 20 70 57 69 6e 2d 3e 65 53  MAX) && pWin->eS
9bc0: 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44  tart!=TK_UNBOUND
9bd0: 45 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  ED ){.      /* T
9be0: 68 65 20 69 6e 6c 69 6e 65 20 76 65 72 73 69 6f  he inline versio
9bf0: 6e 73 20 6f 66 20 6d 69 6e 28 29 20 61 6e 64 20  ns of min() and 
9c00: 6d 61 78 28 29 20 72 65 71 75 69 72 65 20 61 20  max() require a 
9c10: 73 69 6e 67 6c 65 20 65 70 68 65 6d 65 72 61 6c  single ephemeral
9c20: 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20  .      ** table 
9c30: 61 6e 64 20 33 20 72 65 67 69 73 74 65 72 73 2e  and 3 registers.
9c40: 20 54 68 65 20 72 65 67 69 73 74 65 72 73 20 61   The registers a
9c50: 72 65 20 75 73 65 64 20 61 73 20 66 6f 6c 6c 6f  re used as follo
9c60: 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ws:.      **.   
9c70: 20 20 20 2a 2a 20 20 20 72 65 67 41 70 70 2b 30     **   regApp+0
9c80: 3a 20 73 6c 6f 74 20 74 6f 20 63 6f 70 79 20 6d  : slot to copy m
9c90: 69 6e 28 29 2f 6d 61 78 28 29 20 61 72 67 75 6d  in()/max() argum
9ca0: 65 6e 74 20 74 6f 20 66 6f 72 20 4d 61 6b 65 52  ent to for MakeR
9cb0: 65 63 6f 72 64 0a 20 20 20 20 20 20 2a 2a 20 20  ecord.      **  
9cc0: 20 72 65 67 41 70 70 2b 31 3a 20 69 6e 74 65 67   regApp+1: integ
9cd0: 65 72 20 76 61 6c 75 65 20 75 73 65 64 20 74 6f  er value used to
9ce0: 20 65 6e 73 75 72 65 20 6b 65 79 73 20 61 72 65   ensure keys are
9cf0: 20 75 6e 69 71 75 65 0a 20 20 20 20 20 20 2a 2a   unique.      **
9d00: 20 20 20 72 65 67 41 70 70 2b 32 3a 20 6f 75 74     regApp+2: out
9d10: 70 75 74 20 6f 66 20 4d 61 6b 65 52 65 63 6f 72  put of MakeRecor
9d20: 64 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  d.      */.     
9d30: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
9d40: 20 3d 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d   = pWin->pOwner-
9d50: 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  >x.pList;.      
9d60: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
9d70: 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
9d80: 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
9d90: 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 30 2c  Parse, pList, 0,
9da0: 20 30 29 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d   0);.      pWin-
9db0: 3e 63 73 72 41 70 70 20 3d 20 70 50 61 72 73 65  >csrApp = pParse
9dc0: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
9dd0: 70 57 69 6e 2d 3e 72 65 67 41 70 70 20 3d 20 70  pWin->regApp = p
9de0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
9df0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
9e00: 6d 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20 69 66  m += 3;.      if
9e10: 28 20 70 4b 65 79 49 6e 66 6f 20 26 26 20 70 57  ( pKeyInfo && pW
9e20: 69 6e 2d 3e 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65  in->pFunc->zName
9e30: 5b 31 5d 3d 3d 27 69 27 20 29 7b 0a 20 20 20 20  [1]=='i' ){.    
9e40: 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79      assert( pKey
9e50: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
9e60: 5b 30 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  [0]==0 );.      
9e70: 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72    pKeyInfo->aSor
9e80: 74 4f 72 64 65 72 5b 30 5d 20 3d 20 31 3b 0a 20  tOrder[0] = 1;. 
9e90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
9ea0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
9eb0: 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
9ec0: 61 6c 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70  al, pWin->csrApp
9ed0: 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 2);.      sqli
9ee0: 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
9ef0: 76 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  v, pKeyInfo, P4_
9f00: 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
9f10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9f20: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
9f30: 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70   0, pWin->regApp
9f40: 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65  +1);.    }.    e
9f50: 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4e 61 6d 65  lse if( p->zName
9f60: 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 20  ==nth_valueName 
9f70: 7c 7c 20 70 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72  || p->zName==fir
9f80: 73 74 5f 76 61 6c 75 65 4e 61 6d 65 20 29 7b 0a  st_valueName ){.
9f90: 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
9fa0: 65 20 74 77 6f 20 72 65 67 69 73 74 65 72 73 20  e two registers 
9fb0: 61 74 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2e  at pWin->regApp.
9fc0: 20 54 68 65 73 65 20 77 69 6c 6c 20 62 65 20 75   These will be u
9fd0: 73 65 64 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  sed to.      ** 
9fe0: 73 74 6f 72 65 20 74 68 65 20 73 74 61 72 74 20  store the start 
9ff0: 61 6e 64 20 65 6e 64 20 69 6e 64 65 78 20 6f 66  and end index of
a000: 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 61   the current fra
a010: 6d 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 61 73  me.  */.      as
a020: 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 69 45 70  sert( pMWin->iEp
a030: 68 43 73 72 20 29 3b 0a 20 20 20 20 20 20 70 57  hCsr );.      pW
a040: 69 6e 2d 3e 72 65 67 41 70 70 20 3d 20 70 50 61  in->regApp = pPa
a050: 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
a060: 20 20 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 20     pWin->csrApp 
a070: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
a080: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
a090: 6e 4d 65 6d 20 2b 3d 20 32 3b 0a 20 20 20 20 20  nMem += 2;.     
a0a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a0b0: 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70  p2(v, OP_OpenDup
a0c0: 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20  , pWin->csrApp, 
a0d0: 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b  pMWin->iEphCsr);
a0e0: 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20  .    }.    else 
a0f0: 69 66 28 20 70 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65  if( p->zName==le
a100: 61 64 4e 61 6d 65 20 7c 7c 20 70 2d 3e 7a 4e 61  adName || p->zNa
a110: 6d 65 3d 3d 6c 61 67 4e 61 6d 65 20 29 7b 0a 20  me==lagName ){. 
a120: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 57       assert( pMW
a130: 69 6e 2d 3e 69 45 70 68 43 73 72 20 29 3b 0a 20  in->iEphCsr );. 
a140: 20 20 20 20 20 70 57 69 6e 2d 3e 63 73 72 41 70       pWin->csrAp
a150: 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  p = pParse->nTab
a160: 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
a170: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a180: 50 5f 4f 70 65 6e 44 75 70 2c 20 70 57 69 6e 2d  P_OpenDup, pWin-
a190: 3e 63 73 72 41 70 70 2c 20 70 4d 57 69 6e 2d 3e  >csrApp, pMWin->
a1a0: 69 45 70 68 43 73 72 29 3b 0a 20 20 20 20 7d 0a  iEphCsr);.    }.
a1b0: 20 20 7d 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 57    }.}..#define W
a1c0: 49 4e 44 4f 57 5f 53 54 41 52 54 49 4e 47 5f 49  INDOW_STARTING_I
a1d0: 4e 54 20 20 30 0a 23 64 65 66 69 6e 65 20 57 49  NT  0.#define WI
a1e0: 4e 44 4f 57 5f 45 4e 44 49 4e 47 5f 49 4e 54 20  NDOW_ENDING_INT 
a1f0: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 57 49 4e     1.#define WIN
a200: 44 4f 57 5f 4e 54 48 5f 56 41 4c 55 45 5f 49 4e  DOW_NTH_VALUE_IN
a210: 54 20 32 0a 23 64 65 66 69 6e 65 20 57 49 4e 44  T 2.#define WIND
a220: 4f 57 5f 53 54 41 52 54 49 4e 47 5f 4e 55 4d 20  OW_STARTING_NUM 
a230: 20 33 0a 23 64 65 66 69 6e 65 20 57 49 4e 44 4f   3.#define WINDO
a240: 57 5f 45 4e 44 49 4e 47 5f 4e 55 4d 20 20 20 20  W_ENDING_NUM    
a250: 34 0a 0a 2f 2a 0a 2a 2a 20 41 20 22 50 52 45 43  4../*.** A "PREC
a260: 45 44 49 4e 47 20 3c 65 78 70 72 3e 22 20 28 65  EDING <expr>" (e
a270: 43 6f 6e 64 3d 3d 30 29 20 6f 72 20 22 46 4f 4c  Cond==0) or "FOL
a280: 4c 4f 57 49 4e 47 20 3c 65 78 70 72 3e 22 20 28  LOWING <expr>" (
a290: 65 43 6f 6e 64 3d 3d 31 29 20 6f 72 20 74 68 65  eCond==1) or the
a2a0: 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65  .** value of the
a2b0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
a2c0: 20 74 6f 20 6e 74 68 5f 76 61 6c 75 65 28 29 20   to nth_value() 
a2d0: 28 65 43 6f 6e 64 3d 3d 32 29 20 68 61 73 20 6a  (eCond==2) has j
a2e0: 75 73 74 20 62 65 65 6e 0a 2a 2a 20 65 76 61 6c  ust been.** eval
a2f0: 75 61 74 65 64 20 61 6e 64 20 74 68 65 20 72 65  uated and the re
a300: 73 75 6c 74 20 6c 65 66 74 20 69 6e 20 72 65 67  sult left in reg
a310: 69 73 74 65 72 20 72 65 67 2e 20 54 68 69 73 20  ister reg. This 
a320: 66 75 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61 74  function generat
a330: 65 73 20 56 4d 0a 2a 2a 20 63 6f 64 65 20 74 6f  es VM.** code to
a340: 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   check that the 
a350: 76 61 6c 75 65 20 69 73 20 61 20 6e 6f 6e 2d 6e  value is a non-n
a360: 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72 20  egative integer 
a370: 61 6e 64 20 74 68 72 6f 77 73 20 61 6e 0a 2a 2a  and throws an.**
a380: 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20 69 74   exception if it
a390: 20 69 73 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74   is not..*/.stat
a3a0: 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 43 68  ic void windowCh
a3b0: 65 63 6b 56 61 6c 75 65 28 50 61 72 73 65 20 2a  eckValue(Parse *
a3c0: 70 50 61 72 73 65 2c 20 69 6e 74 20 72 65 67 2c  pParse, int reg,
a3d0: 20 69 6e 74 20 65 43 6f 6e 64 29 7b 0a 20 20 73   int eCond){.  s
a3e0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
a3f0: 20 2a 61 7a 45 72 72 5b 5d 20 3d 20 7b 0a 20 20   *azErr[] = {.  
a400: 20 20 22 66 72 61 6d 65 20 73 74 61 72 74 69 6e    "frame startin
a410: 67 20 6f 66 66 73 65 74 20 6d 75 73 74 20 62 65  g offset must be
a420: 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20   a non-negative 
a430: 69 6e 74 65 67 65 72 22 2c 0a 20 20 20 20 22 66  integer",.    "f
a440: 72 61 6d 65 20 65 6e 64 69 6e 67 20 6f 66 66 73  rame ending offs
a450: 65 74 20 6d 75 73 74 20 62 65 20 61 20 6e 6f 6e  et must be a non
a460: 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67 65  -negative intege
a470: 72 22 2c 0a 20 20 20 20 22 73 65 63 6f 6e 64 20  r",.    "second 
a480: 61 72 67 75 6d 65 6e 74 20 74 6f 20 6e 74 68 5f  argument to nth_
a490: 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20 61 20  value must be a 
a4a0: 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72  positive integer
a4b0: 22 2c 0a 20 20 20 20 22 66 72 61 6d 65 20 73 74  ",.    "frame st
a4c0: 61 72 74 69 6e 67 20 6f 66 66 73 65 74 20 6d 75  arting offset mu
a4d0: 73 74 20 62 65 20 61 20 6e 6f 6e 2d 6e 65 67 61  st be a non-nega
a4e0: 74 69 76 65 20 6e 75 6d 62 65 72 22 2c 0a 20 20  tive number",.  
a4f0: 20 20 22 66 72 61 6d 65 20 65 6e 64 69 6e 67 20    "frame ending 
a500: 6f 66 66 73 65 74 20 6d 75 73 74 20 62 65 20 61  offset must be a
a510: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 6e 75   non-negative nu
a520: 6d 62 65 72 22 2c 0a 20 20 7d 3b 0a 20 20 73 74  mber",.  };.  st
a530: 61 74 69 63 20 69 6e 74 20 61 4f 70 5b 5d 20 3d  atic int aOp[] =
a540: 20 7b 20 4f 50 5f 47 65 2c 20 4f 50 5f 47 65 2c   { OP_Ge, OP_Ge,
a550: 20 4f 50 5f 47 74 2c 20 4f 50 5f 47 65 2c 20 4f   OP_Gt, OP_Ge, O
a560: 50 5f 47 65 20 7d 3b 0a 20 20 56 64 62 65 20 2a  P_Ge };.  Vdbe *
a570: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
a580: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e  be(pParse);.  in
a590: 74 20 72 65 67 5a 65 72 6f 20 3d 20 73 71 6c 69  t regZero = sqli
a5a0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
a5b0: 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
a5c0: 20 65 43 6f 6e 64 3e 3d 30 20 26 26 20 65 43 6f   eCond>=0 && eCo
a5d0: 6e 64 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 45  nd<ArraySize(azE
a5e0: 72 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  rr) );.  sqlite3
a5f0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
a600: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
a610: 5a 65 72 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33  Zero);.  sqlite3
a620: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
a630: 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 65 67 2c  _MustBeInt, reg,
a640: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
a650: 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20  entAddr(v)+2);. 
a660: 20 69 66 28 20 65 43 6f 6e 64 3e 3d 57 49 4e 44   if( eCond>=WIND
a670: 4f 57 5f 53 54 41 52 54 49 4e 47 5f 4e 55 4d 20  OW_STARTING_NUM 
a680: 29 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  ) sqlite3VdbeCha
a690: 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a 20 20 56  ngeP5(v, 1);.  V
a6a0: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
a6b0: 20 65 43 6f 6e 64 3d 3d 30 29 3b 0a 20 20 56 64   eCond==0);.  Vd
a6c0: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
a6d0: 65 43 6f 6e 64 3d 3d 31 29 3b 0a 20 20 56 64 62  eCond==1);.  Vdb
a6e0: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 65  eCoverageIf(v, e
a6f0: 43 6f 6e 64 3d 3d 32 29 3b 0a 20 20 73 71 6c 69  Cond==2);.  sqli
a700: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
a710: 20 61 4f 70 5b 65 43 6f 6e 64 5d 2c 20 72 65 67   aOp[eCond], reg
a720: 5a 65 72 6f 2c 20 73 71 6c 69 74 65 33 56 64 62  Zero, sqlite3Vdb
a730: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
a740: 32 2c 20 72 65 67 29 3b 0a 20 20 56 64 62 65 43  2, reg);.  VdbeC
a750: 6f 76 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c  overageNeverNull
a760: 49 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 30 29 3b  If(v, eCond==0);
a770: 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e  .  VdbeCoverageN
a780: 65 76 65 72 4e 75 6c 6c 49 66 28 76 2c 20 65 43  everNullIf(v, eC
a790: 6f 6e 64 3d 3d 31 29 3b 0a 20 20 56 64 62 65 43  ond==1);.  VdbeC
a7a0: 6f 76 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c  overageNeverNull
a7b0: 49 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 32 29 3b  If(v, eCond==2);
a7c0: 0a 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f  .  sqlite3MayAbo
a7d0: 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  rt(pParse);.  sq
a7e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
a7f0: 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49  v, OP_Halt, SQLI
a800: 54 45 5f 45 52 52 4f 52 2c 20 4f 45 5f 41 62 6f  TE_ERROR, OE_Abo
a810: 72 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rt);.  sqlite3Vd
a820: 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28 76  beAppendP4(v, (v
a830: 6f 69 64 2a 29 61 7a 45 72 72 5b 65 43 6f 6e 64  oid*)azErr[eCond
a840: 5d 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20  ], P4_STATIC);. 
a850: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
a860: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
a870: 65 67 5a 65 72 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  egZero);.}../*.*
a880: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
a890: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
a8a0: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 77   passed to the w
a8b0: 69 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e 20 61  indow-function a
a8c0: 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
a8d0: 68 20 74 68 65 20 6f 62 6a 65 63 74 20 70 61 73  h the object pas
a8e0: 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
a8f0: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
a900: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
a910: 61 74 69 63 20 69 6e 74 20 77 69 6e 64 6f 77 41  atic int windowA
a920: 72 67 43 6f 75 6e 74 28 57 69 6e 64 6f 77 20 2a  rgCount(Window *
a930: 70 57 69 6e 29 7b 0a 20 20 45 78 70 72 4c 69 73  pWin){.  ExprLis
a940: 74 20 2a 70 4c 69 73 74 20 3d 20 70 57 69 6e 2d  t *pList = pWin-
a950: 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74  >pOwner->x.pList
a960: 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 4c 69 73  ;.  return (pLis
a970: 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  t ? pList->nExpr
a980: 20 3a 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   : 0);.}../*.** 
a990: 47 65 6e 65 72 61 74 65 20 56 4d 20 63 6f 64 65  Generate VM code
a9a0: 20 74 6f 20 69 6e 76 6f 6b 65 20 65 69 74 68 65   to invoke eithe
a9b0: 72 20 78 53 74 65 70 28 29 20 28 69 66 20 62 49  r xStep() (if bI
a9c0: 6e 76 65 72 73 65 20 69 73 20 30 29 20 6f 72 20  nverse is 0) or 
a9d0: 0a 2a 2a 20 78 49 6e 76 65 72 73 65 20 28 69 66  .** xInverse (if
a9e0: 20 62 49 6e 76 65 72 73 65 20 69 73 20 6e 6f 6e   bInverse is non
a9f0: 2d 7a 65 72 6f 29 20 66 6f 72 20 65 61 63 68 20  -zero) for each 
aa00: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
aa10: 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65  in the .** linke
aa20: 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67 20  d list starting 
aa30: 61 74 20 70 4d 57 69 6e 2e 20 4f 72 2c 20 66 6f  at pMWin. Or, fo
aa40: 72 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  r built-in windo
aa50: 77 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 74  w functions.** t
aa60: 68 61 74 20 64 6f 20 6e 6f 74 20 75 73 65 20 74  hat do not use t
aa70: 68 65 20 73 74 61 6e 64 61 72 64 20 66 75 6e 63  he standard func
aa80: 74 69 6f 6e 20 41 50 49 2c 20 67 65 6e 65 72 61  tion API, genera
aa90: 74 65 20 74 68 65 20 72 65 71 75 69 72 65 64 0a  te the required.
aaa0: 2a 2a 20 69 6e 6c 69 6e 65 20 56 4d 20 63 6f 64  ** inline VM cod
aab0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75  e..**.** If argu
aac0: 6d 65 6e 74 20 63 73 72 20 69 73 20 67 72 65 61  ment csr is grea
aad0: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
aae0: 6c 20 74 6f 20 30 2c 20 74 68 65 6e 20 61 72 67  l to 0, then arg
aaf0: 75 6d 65 6e 74 20 72 65 67 20 69 73 0a 2a 2a 20  ument reg is.** 
ab00: 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74  the first regist
ab10: 65 72 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f  er in an array o
ab20: 66 20 72 65 67 69 73 74 65 72 73 20 67 75 61 72  f registers guar
ab30: 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 61 72  anteed to be lar
ab40: 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 20 74 6f 20  ge.** enough to 
ab50: 68 6f 6c 64 20 74 68 65 20 61 72 72 61 79 20 6f  hold the array o
ab60: 66 20 61 72 67 75 6d 65 6e 74 73 20 66 6f 72 20  f arguments for 
ab70: 65 61 63 68 20 66 75 6e 63 74 69 6f 6e 2e 20 49  each function. I
ab80: 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20 74  n this case.** t
ab90: 68 65 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  he arguments are
aba0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
abb0: 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
abc0: 6f 66 20 63 73 72 20 69 6e 74 6f 20 74 68 65 0a  of csr into the.
abd0: 2a 2a 20 61 72 72 61 79 20 6f 66 20 72 65 67 69  ** array of regi
abe0: 73 74 65 72 73 20 62 65 66 6f 72 65 20 69 6e 76  sters before inv
abf0: 6f 6b 69 6e 67 20 4f 50 5f 41 67 67 53 74 65 70  oking OP_AggStep
ac00: 20 6f 72 20 4f 50 5f 41 67 67 49 6e 76 65 72 73   or OP_AggInvers
ac10: 65 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 63  e.**.** Or, if c
ac20: 73 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  sr is less than 
ac30: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 61  zero, then the a
ac40: 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
ac50: 73 20 61 74 20 72 65 67 20 69 73 0a 2a 2a 20 61  s at reg is.** a
ac60: 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64  lready populated
ac70: 20 77 69 74 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e   with all column
ac80: 73 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65  s from the curre
ac90: 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 73 75  nt row of the su
aca0: 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49  b-query..**.** I
acb0: 66 20 61 72 67 75 6d 65 6e 74 20 72 65 67 50 61  f argument regPa
acc0: 72 74 53 69 7a 65 20 69 73 20 6e 6f 6e 2d 7a 65  rtSize is non-ze
acd0: 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61  ro, then it is a
ace0: 20 72 65 67 69 73 74 65 72 20 63 6f 6e 74 61 69   register contai
acf0: 6e 69 6e 67 20 74 68 65 0a 2a 2a 20 6e 75 6d 62  ning the.** numb
ad00: 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
ad10: 65 20 63 75 72 72 65 6e 74 20 70 61 72 74 69 74  e current partit
ad20: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
ad30: 6f 69 64 20 77 69 6e 64 6f 77 41 67 67 53 74 65  oid windowAggSte
ad40: 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  p(.  Parse *pPar
ad50: 73 65 2c 20 0a 20 20 57 69 6e 64 6f 77 20 2a 70  se, .  Window *p
ad60: 4d 57 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20  MWin,           
ad70: 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 65 64         /* Linked
ad80: 20 6c 69 73 74 20 6f 66 20 77 69 6e 64 6f 77 20   list of window 
ad90: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  functions */.  i
ada0: 6e 74 20 63 73 72 2c 20 20 20 20 20 20 20 20 20  nt csr,         
adb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
adc0: 2a 20 52 65 61 64 20 61 72 67 75 6d 65 6e 74 73  * Read arguments
add0: 20 66 72 6f 6d 20 74 68 69 73 20 63 75 72 73 6f   from this curso
ade0: 72 20 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 76 65  r */.  int bInve
adf0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
ae00: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
ae10: 6f 20 69 6e 76 6f 6b 65 20 78 49 6e 76 65 72 73  o invoke xInvers
ae20: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 78 53 74  e instead of xSt
ae30: 65 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 20  ep */.  int reg 
ae40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae50: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
ae60: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 2a 2f   of registers */
ae70: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
ae80: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
ae90: 50 61 72 73 65 29 3b 0a 20 20 57 69 6e 64 6f 77  Parse);.  Window
aea0: 20 2a 70 57 69 6e 3b 0a 20 20 66 6f 72 28 70 57   *pWin;.  for(pW
aeb0: 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20  in=pMWin; pWin; 
aec0: 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74  pWin=pWin->pNext
aed0: 57 69 6e 29 7b 0a 20 20 20 20 46 75 6e 63 44 65  Win){.    FuncDe
aee0: 66 20 2a 70 46 75 6e 63 20 3d 20 70 57 69 6e 2d  f *pFunc = pWin-
aef0: 3e 70 46 75 6e 63 3b 0a 20 20 20 20 69 6e 74 20  >pFunc;.    int 
af00: 72 65 67 41 72 67 3b 0a 20 20 20 20 69 6e 74 20  regArg;.    int 
af10: 6e 41 72 67 20 3d 20 77 69 6e 64 6f 77 41 72 67  nArg = windowArg
af20: 43 6f 75 6e 74 28 70 57 69 6e 29 3b 0a 20 20 20  Count(pWin);.   
af30: 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 66 6f 72   int i;..    for
af40: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
af50: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 21  +){.      if( i!
af60: 3d 31 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61  =1 || pFunc->zNa
af70: 6d 65 21 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d  me!=nth_valueNam
af80: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
af90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
afa0: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72  , OP_Column, csr
afb0: 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b  , pWin->iArgCol+
afc0: 69 2c 20 72 65 67 2b 69 29 3b 0a 20 20 20 20 20  i, reg+i);.     
afd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
afe0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
aff0: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
b000: 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20  pMWin->iEphCsr, 
b010: 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 69 2c  pWin->iArgCol+i,
b020: 20 72 65 67 2b 69 29 3b 0a 20 20 20 20 20 20 7d   reg+i);.      }
b030: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 67 41 72  .    }.    regAr
b040: 67 20 3d 20 72 65 67 3b 0a 0a 20 20 20 20 69 66  g = reg;..    if
b050: 28 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72  ( pMWin->regStar
b060: 74 52 6f 77 69 64 3d 3d 30 0a 20 20 20 20 20 26  tRowid==0.     &
b070: 26 20 28 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c  & (pFunc->funcFl
b080: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
b090: 43 5f 4d 49 4e 4d 41 58 29 20 0a 20 20 20 20 20  C_MINMAX) .     
b0a0: 26 26 20 28 70 57 69 6e 2d 3e 65 53 74 61 72 74  && (pWin->eStart
b0b0: 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 29 0a  !=TK_UNBOUNDED).
b0c0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74      ){.      int
b0d0: 20 61 64 64 72 49 73 4e 75 6c 6c 20 3d 20 73 71   addrIsNull = sq
b0e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
b0f0: 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65  v, OP_IsNull, re
b100: 67 41 72 67 29 3b 0a 20 20 20 20 20 20 56 64 62  gArg);.      Vdb
b110: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
b120: 20 20 20 20 69 66 28 20 62 49 6e 76 65 72 73 65      if( bInverse
b130: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
b140: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
b150: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70  (v, OP_AddImm, p
b160: 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31 2c 20 31  Win->regApp+1, 1
b170: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
b180: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b190: 4f 50 5f 53 43 6f 70 79 2c 20 72 65 67 41 72 67  OP_SCopy, regArg
b1a0: 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 29 3b  , pWin->regApp);
b1b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b1c0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
b1d0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 57 69  _MakeRecord, pWi
b1e0: 6e 2d 3e 72 65 67 41 70 70 2c 20 32 2c 20 70 57  n->regApp, 2, pW
b1f0: 69 6e 2d 3e 72 65 67 41 70 70 2b 32 29 3b 0a 20  in->regApp+2);. 
b200: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b210: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
b220: 64 78 49 6e 73 65 72 74 2c 20 70 57 69 6e 2d 3e  dxInsert, pWin->
b230: 63 73 72 41 70 70 2c 20 70 57 69 6e 2d 3e 72 65  csrApp, pWin->re
b240: 67 41 70 70 2b 32 29 3b 0a 20 20 20 20 20 20 7d  gApp+2);.      }
b250: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
b260: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
b270: 6e 74 28 76 2c 20 4f 50 5f 53 65 65 6b 47 45 2c  nt(v, OP_SeekGE,
b280: 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20 30   pWin->csrApp, 0
b290: 2c 20 72 65 67 41 72 67 2c 20 31 29 3b 0a 20 20  , regArg, 1);.  
b2a0: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
b2b0: 67 65 4e 65 76 65 72 54 61 6b 65 6e 28 76 29 3b  geNeverTaken(v);
b2c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b2d0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
b2e0: 5f 44 65 6c 65 74 65 2c 20 70 57 69 6e 2d 3e 63  _Delete, pWin->c
b2f0: 73 72 41 70 70 29 3b 0a 20 20 20 20 20 20 20 20  srApp);.        
b300: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
b310: 65 72 65 28 76 2c 20 73 71 6c 69 74 65 33 56 64  ere(v, sqlite3Vd
b320: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
b330: 2d 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  -2);.      }.   
b340: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
b350: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 73  mpHere(v, addrIs
b360: 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Null);.    }else
b370: 20 69 66 28 20 70 57 69 6e 2d 3e 72 65 67 41 70   if( pWin->regAp
b380: 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  p ){.      asser
b390: 74 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d  t( pFunc->zName=
b3a0: 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 0a 20  =nth_valueName. 
b3b0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 75            || pFu
b3c0: 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72 73 74  nc->zName==first
b3d0: 5f 76 61 6c 75 65 4e 61 6d 65 0a 20 20 20 20 20  _valueName.     
b3e0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
b3f0: 28 20 62 49 6e 76 65 72 73 65 3d 3d 30 20 7c 7c  ( bInverse==0 ||
b400: 20 62 49 6e 76 65 72 73 65 3d 3d 31 20 29 3b 0a   bInverse==1 );.
b410: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b420: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
b430: 64 49 6d 6d 2c 20 70 57 69 6e 2d 3e 72 65 67 41  dImm, pWin->regA
b440: 70 70 2b 31 2d 62 49 6e 76 65 72 73 65 2c 20 31  pp+1-bInverse, 1
b450: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
b460: 20 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63 21 3d   pFunc->xSFunc!=
b470: 6e 6f 6f 70 53 74 65 70 46 75 6e 63 20 29 7b 0a  noopStepFunc ){.
b480: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 49 66        int addrIf
b490: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
b4a0: 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72 20 29 7b  pWin->pFilter ){
b4b0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67  .        int reg
b4c0: 54 6d 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Tmp;.        ass
b4d0: 65 72 74 28 20 6e 41 72 67 3d 3d 30 20 7c 7c 20  ert( nArg==0 || 
b4e0: 6e 41 72 67 3d 3d 70 57 69 6e 2d 3e 70 4f 77 6e  nArg==pWin->pOwn
b4f0: 65 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  er->x.pList->nEx
b500: 70 72 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  pr );.        as
b510: 73 65 72 74 28 20 6e 41 72 67 20 7c 7c 20 70 57  sert( nArg || pW
b520: 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c  in->pOwner->x.pL
b530: 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ist==0 );.      
b540: 20 20 72 65 67 54 6d 70 20 3d 20 73 71 6c 69 74    regTmp = sqlit
b550: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
b560: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
b570: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
b580: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73  v, OP_Column, cs
b590: 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c  r, pWin->iArgCol
b5a0: 2b 6e 41 72 67 2c 72 65 67 54 6d 70 29 3b 0a 20  +nArg,regTmp);. 
b5b0: 20 20 20 20 20 20 20 61 64 64 72 49 66 20 3d 20         addrIf = 
b5c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b5d0: 33 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72  3(v, OP_IfNot, r
b5e0: 65 67 54 6d 70 2c 20 30 2c 20 31 29 3b 0a 20 20  egTmp, 0, 1);.  
b5f0: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
b600: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  ge(v);.        s
b610: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
b620: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
b630: 54 6d 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Tmp);.      }.  
b640: 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 66      if( pFunc->f
b650: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
b660: 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20  E_FUNC_NEEDCOLL 
b670: 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  ){.        CollS
b680: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  eq *pColl;.     
b690: 20 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3e     assert( nArg>
b6a0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  0 );.        pCo
b6b0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
b6c0: 4e 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  NNCollSeq(pParse
b6d0: 2c 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e  , pWin->pOwner->
b6e0: 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  x.pList->a[0].pE
b6f0: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  xpr);.        sq
b700: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
b710: 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30  v, OP_CollSeq, 0
b720: 2c 30 2c 30 2c 20 28 63 6f 6e 73 74 20 63 68 61  ,0,0, (const cha
b730: 72 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c  r*)pColl, P4_COL
b740: 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LSEQ);.      }. 
b750: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b760: 41 64 64 4f 70 33 28 76 2c 20 62 49 6e 76 65 72  AddOp3(v, bInver
b770: 73 65 3f 20 4f 50 5f 41 67 67 49 6e 76 65 72 73  se? OP_AggInvers
b780: 65 20 3a 20 4f 50 5f 41 67 67 53 74 65 70 2c 20  e : OP_AggStep, 
b790: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b7a0: 20 20 20 20 20 20 20 20 20 62 49 6e 76 65 72 73           bInvers
b7b0: 65 2c 20 72 65 67 41 72 67 2c 20 70 57 69 6e 2d  e, regArg, pWin-
b7c0: 3e 72 65 67 41 63 63 75 6d 29 3b 0a 20 20 20 20  >regAccum);.    
b7d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70    sqlite3VdbeApp
b7e0: 65 6e 64 50 34 28 76 2c 20 70 46 75 6e 63 2c 20  endP4(v, pFunc, 
b7f0: 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P4_FUNCDEF);.   
b800: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
b810: 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 41  angeP5(v, (u8)nA
b820: 72 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  rg);.      if( a
b830: 64 64 72 49 66 20 29 20 73 71 6c 69 74 65 33 56  ddrIf ) sqlite3V
b840: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
b850: 64 64 72 49 66 29 3b 0a 20 20 20 20 7d 0a 20 20  ddrIf);.    }.  
b860: 7d 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74 72  }.}..typedef str
b870: 75 63 74 20 57 69 6e 64 6f 77 43 6f 64 65 41 72  uct WindowCodeAr
b880: 67 20 57 69 6e 64 6f 77 43 6f 64 65 41 72 67 3b  g WindowCodeArg;
b890: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
b8a0: 57 69 6e 64 6f 77 43 73 72 41 6e 64 52 65 67 20  WindowCsrAndReg 
b8b0: 57 69 6e 64 6f 77 43 73 72 41 6e 64 52 65 67 3b  WindowCsrAndReg;
b8c0: 0a 73 74 72 75 63 74 20 57 69 6e 64 6f 77 43 73  .struct WindowCs
b8d0: 72 41 6e 64 52 65 67 20 7b 0a 20 20 69 6e 74 20  rAndReg {.  int 
b8e0: 63 73 72 3b 0a 20 20 69 6e 74 20 72 65 67 3b 0a  csr;.  int reg;.
b8f0: 7d 3b 0a 0a 73 74 72 75 63 74 20 57 69 6e 64 6f  };..struct Windo
b900: 77 43 6f 64 65 41 72 67 20 7b 0a 20 20 50 61 72  wCodeArg {.  Par
b910: 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 57 69  se *pParse;.  Wi
b920: 6e 64 6f 77 20 2a 70 4d 57 69 6e 3b 0a 20 20 56  ndow *pMWin;.  V
b930: 64 62 65 20 2a 70 56 64 62 65 3b 0a 20 20 69 6e  dbe *pVdbe;.  in
b940: 74 20 72 65 67 47 6f 73 75 62 3b 0a 20 20 69 6e  t regGosub;.  in
b950: 74 20 61 64 64 72 47 6f 73 75 62 3b 0a 20 20 69  t addrGosub;.  i
b960: 6e 74 20 72 65 67 41 72 67 3b 0a 20 20 69 6e 74  nt regArg;.  int
b970: 20 65 44 65 6c 65 74 65 3b 0a 0a 20 20 57 69 6e   eDelete;..  Win
b980: 64 6f 77 43 73 72 41 6e 64 52 65 67 20 73 74 61  dowCsrAndReg sta
b990: 72 74 3b 0a 20 20 57 69 6e 64 6f 77 43 73 72 41  rt;.  WindowCsrA
b9a0: 6e 64 52 65 67 20 63 75 72 72 65 6e 74 3b 0a 20  ndReg current;. 
b9b0: 20 57 69 6e 64 6f 77 43 73 72 41 6e 64 52 65 67   WindowCsrAndReg
b9c0: 20 65 6e 64 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20   end;.};../*.** 
b9d0: 56 61 6c 75 65 73 20 74 68 61 74 20 6d 61 79 20  Values that may 
b9e0: 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  be passed as the
b9f0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
ba00: 20 74 6f 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70   to windowCodeOp
ba10: 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ()..*/.#define W
ba20: 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57  INDOW_RETURN_ROW
ba30: 20 31 0a 23 64 65 66 69 6e 65 20 57 49 4e 44 4f   1.#define WINDO
ba40: 57 5f 41 47 47 49 4e 56 45 52 53 45 20 32 0a 23  W_AGGINVERSE 2.#
ba50: 64 65 66 69 6e 65 20 57 49 4e 44 4f 57 5f 41 47  define WINDOW_AG
ba60: 47 53 54 45 50 20 20 20 20 33 0a 0a 2f 2a 0a 2a  GSTEP    3../*.*
ba70: 2a 20 47 65 6e 65 72 61 74 65 20 56 4d 20 63 6f  * Generate VM co
ba80: 64 65 20 74 6f 20 72 65 61 64 20 74 68 65 20 77  de to read the w
ba90: 69 6e 64 6f 77 20 66 72 61 6d 65 73 20 70 65 65  indow frames pee
baa0: 72 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 63 75  r values from cu
bab0: 72 73 6f 72 20 63 73 72 20 69 6e 74 6f 0a 2a 2a  rsor csr into.**
bac0: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67   an array of reg
bad0: 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20  isters starting 
bae0: 61 74 20 72 65 67 2e 0a 2a 2f 0a 73 74 61 74 69  at reg..*/.stati
baf0: 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 52 65 61  c void windowRea
bb00: 64 50 65 65 72 56 61 6c 75 65 73 28 0a 20 20 57  dPeerValues(.  W
bb10: 69 6e 64 6f 77 43 6f 64 65 41 72 67 20 2a 70 2c  indowCodeArg *p,
bb20: 0a 20 20 69 6e 74 20 63 73 72 2c 0a 20 20 69 6e  .  int csr,.  in
bb30: 74 20 72 65 67 0a 29 7b 0a 20 20 57 69 6e 64 6f  t reg.){.  Windo
bb40: 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 4d  w *pMWin = p->pM
bb50: 57 69 6e 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  Win;.  ExprList 
bb60: 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 4d 57 69  *pOrderBy = pMWi
bb70: 6e 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69  n->pOrderBy;.  i
bb80: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
bb90: 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c     Vdbe *v = sql
bba0: 69 74 65 33 47 65 74 56 64 62 65 28 70 2d 3e 70  ite3GetVdbe(p->p
bbb0: 50 61 72 73 65 29 3b 0a 20 20 20 20 45 78 70 72  Parse);.    Expr
bbc0: 4c 69 73 74 20 2a 70 50 61 72 74 20 3d 20 70 4d  List *pPart = pM
bbd0: 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 3b  Win->pPartition;
bbe0: 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 4f 66 66  .    int iColOff
bbf0: 20 3d 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65   = pMWin->nBuffe
bc00: 72 43 6f 6c 20 2b 20 28 70 50 61 72 74 20 3f 20  rCol + (pPart ? 
bc10: 70 50 61 72 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pPart->nExpr : 0
bc20: 29 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  );.    int i;.  
bc30: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
bc40: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
bc50: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
bc60: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
bc70: 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20 69  P_Column, csr, i
bc80: 43 6f 6c 4f 66 66 2b 69 2c 20 72 65 67 2b 69 29  ColOff+i, reg+i)
bc90: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
bca0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 4d  *.** Generate VM
bcb0: 20 63 6f 64 65 20 74 6f 20 69 6e 76 6f 6b 65 20   code to invoke 
bcc0: 65 69 74 68 65 72 20 78 56 61 6c 75 65 28 29 20  either xValue() 
bcd0: 28 62 46 69 6e 3d 3d 30 29 20 6f 72 20 78 46 69  (bFin==0) or xFi
bce0: 6e 61 6c 69 7a 65 28 29 0a 2a 2a 20 28 62 46 69  nalize().** (bFi
bcf0: 6e 3d 3d 31 29 20 66 6f 72 20 65 61 63 68 20 77  n==1) for each w
bd00: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 69  indow function i
bd10: 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  n the linked lis
bd20: 74 20 73 74 61 72 74 69 6e 67 20 61 74 0a 2a 2a  t starting at.**
bd30: 20 70 4d 57 69 6e 2e 20 4f 72 2c 20 66 6f 72 20   pMWin. Or, for 
bd40: 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 2d  built-in window-
bd50: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 64  functions that d
bd60: 6f 20 6e 6f 74 20 75 73 65 20 74 68 65 20 73 74  o not use the st
bd70: 61 6e 64 61 72 64 0a 2a 2a 20 41 50 49 2c 20 67  andard.** API, g
bd80: 65 6e 65 72 61 74 65 20 74 68 65 20 65 71 75 69  enerate the equi
bd90: 76 61 6c 65 6e 74 20 56 4d 20 63 6f 64 65 2e 0a  valent VM code..
bda0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
bdb0: 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 57 69  indowAggFinal(Wi
bdc0: 6e 64 6f 77 43 6f 64 65 41 72 67 20 2a 70 2c 20  ndowCodeArg *p, 
bdd0: 69 6e 74 20 62 46 69 6e 29 7b 0a 20 20 50 61 72  int bFin){.  Par
bde0: 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e  se *pParse = p->
bdf0: 70 50 61 72 73 65 3b 0a 20 20 57 69 6e 64 6f 77  pParse;.  Window
be00: 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 4d 57   *pMWin = p->pMW
be10: 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  in;.  Vdbe *v = 
be20: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
be30: 50 61 72 73 65 29 3b 0a 20 20 57 69 6e 64 6f 77  Parse);.  Window
be40: 20 2a 70 57 69 6e 3b 0a 0a 20 20 66 6f 72 28 70   *pWin;..  for(p
be50: 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b  Win=pMWin; pWin;
be60: 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78   pWin=pWin->pNex
be70: 74 57 69 6e 29 7b 0a 20 20 20 20 69 66 28 20 70  tWin){.    if( p
be80: 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f  MWin->regStartRo
be90: 77 69 64 3d 3d 30 0a 20 20 20 20 20 26 26 20 28  wid==0.     && (
bea0: 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e  pWin->pFunc->fun
beb0: 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
bec0: 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 20 0a 20 20  FUNC_MINMAX) .  
bed0: 20 20 20 26 26 20 28 70 57 69 6e 2d 3e 65 53 74     && (pWin->eSt
bee0: 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  art!=TK_UNBOUNDE
bef0: 44 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  D).    ){.      
bf00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
bf10: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
bf20: 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74   pWin->regResult
bf30: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
bf40: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
bf50: 5f 4c 61 73 74 2c 20 70 57 69 6e 2d 3e 63 73 72  _Last, pWin->csr
bf60: 41 70 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65  App);.      Vdbe
bf70: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
bf80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
bf90: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
bfa0: 6e 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c  n, pWin->csrApp,
bfb0: 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73   0, pWin->regRes
bfc0: 75 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ult);.      sqli
bfd0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
bfe0: 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  v, sqlite3VdbeCu
bff0: 72 72 65 6e 74 41 64 64 72 28 76 29 2d 32 29 3b  rrentAddr(v)-2);
c000: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
c010: 57 69 6e 2d 3e 72 65 67 41 70 70 20 29 7b 0a 20  Win->regApp ){. 
c020: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 57       assert( pMW
c030: 69 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f 77 69  in->regStartRowi
c040: 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 65 6c 73  d==0 );.    }els
c050: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 41 72  e{.      int nAr
c060: 67 20 3d 20 77 69 6e 64 6f 77 41 72 67 43 6f 75  g = windowArgCou
c070: 6e 74 28 70 57 69 6e 29 3b 0a 20 20 20 20 20 20  nt(pWin);.      
c080: 69 66 28 20 62 46 69 6e 20 29 7b 0a 20 20 20 20  if( bFin ){.    
c090: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c0a0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 67 67 46  ddOp2(v, OP_AggF
c0b0: 69 6e 61 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 41  inal, pWin->regA
c0c0: 63 63 75 6d 2c 20 6e 41 72 67 29 3b 0a 20 20 20  ccum, nArg);.   
c0d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c0e0: 41 70 70 65 6e 64 50 34 28 76 2c 20 70 57 69 6e  AppendP4(v, pWin
c0f0: 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43  ->pFunc, P4_FUNC
c100: 44 45 46 29 3b 0a 20 20 20 20 20 20 20 20 73 71  DEF);.        sq
c110: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
c120: 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 57 69 6e  v, OP_Copy, pWin
c130: 2d 3e 72 65 67 41 63 63 75 6d 2c 20 70 57 69 6e  ->regAccum, pWin
c140: 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20  ->regResult);.  
c150: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c160: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
c170: 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67  ll, 0, pWin->reg
c180: 41 63 63 75 6d 29 3b 0a 20 20 20 20 20 20 7d 65  Accum);.      }e
c190: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
c1a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
c1b0: 2c 20 4f 50 5f 41 67 67 56 61 6c 75 65 2c 70 57  , OP_AggValue,pW
c1c0: 69 6e 2d 3e 72 65 67 41 63 63 75 6d 2c 6e 41 72  in->regAccum,nAr
c1d0: 67 2c 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c  g,pWin->regResul
c1e0: 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
c1f0: 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
c200: 76 2c 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2c 20  v, pWin->pFunc, 
c210: 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P4_FUNCDEF);.   
c220: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
c230: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
c240: 20 63 6f 64 65 20 74 6f 20 63 61 6c 63 75 6c 61   code to calcula
c250: 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  te the current v
c260: 61 6c 75 65 73 20 6f 66 20 61 6c 6c 20 77 69 6e  alues of all win
c270: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e  dow functions in
c280: 20 74 68 65 0a 2a 2a 20 70 2d 3e 70 4d 57 69 6e   the.** p->pMWin
c290: 20 6c 69 73 74 20 62 79 20 64 6f 69 6e 67 20 61   list by doing a
c2a0: 20 66 75 6c 6c 20 73 63 61 6e 20 6f 66 20 74 68   full scan of th
c2b0: 65 20 63 75 72 72 65 6e 74 20 77 69 6e 64 6f 77  e current window
c2c0: 20 66 72 61 6d 65 2e 20 53 74 6f 72 65 20 74 68   frame. Store th
c2d0: 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20  e.** results in 
c2e0: 74 68 65 20 57 69 6e 64 6f 77 2e 72 65 67 52 65  the Window.regRe
c2f0: 73 75 6c 74 20 72 65 67 69 73 74 65 72 73 2c 20  sult registers, 
c300: 72 65 61 64 79 20 74 6f 20 72 65 74 75 72 6e 20  ready to return 
c310: 74 68 65 20 75 70 70 65 72 0a 2a 2a 20 6c 61 79  the upper.** lay
c320: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
c330: 69 64 20 77 69 6e 64 6f 77 46 75 6c 6c 53 63 61  id windowFullSca
c340: 6e 28 57 69 6e 64 6f 77 43 6f 64 65 41 72 67 20  n(WindowCodeArg 
c350: 2a 70 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70  *p){.  Window *p
c360: 57 69 6e 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  Win;.  Parse *pP
c370: 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65  arse = p->pParse
c380: 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69  ;.  Window *pMWi
c390: 6e 20 3d 20 70 2d 3e 70 4d 57 69 6e 3b 0a 20 20  n = p->pMWin;.  
c3a0: 56 64 62 65 20 2a 76 20 3d 20 70 2d 3e 70 56 64  Vdbe *v = p->pVd
c3b0: 62 65 3b 0a 0a 20 20 69 6e 74 20 72 65 67 43 52  be;..  int regCR
c3c0: 6f 77 69 64 20 3d 20 30 3b 20 20 20 20 20 20 20  owid = 0;       
c3d0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
c3e0: 74 20 72 6f 77 69 64 20 76 61 6c 75 65 20 2a 2f  t rowid value */
c3f0: 0a 20 20 69 6e 74 20 72 65 67 43 50 65 65 72 20  .  int regCPeer 
c400: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
c410: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 70 65     /* Current pe
c420: 65 72 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69  er values */.  i
c430: 6e 74 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b  nt regRowid = 0;
c440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c450: 2a 20 41 67 67 53 74 65 70 20 72 6f 77 69 64 20  * AggStep rowid 
c460: 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 72  value */.  int r
c470: 65 67 50 65 65 72 20 3d 20 30 3b 20 20 20 20 20  egPeer = 0;     
c480: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 67             /* Ag
c490: 67 53 74 65 70 20 70 65 65 72 20 76 61 6c 75 65  gStep peer value
c4a0: 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 50 65 65  s */..  int nPee
c4b0: 72 3b 0a 20 20 69 6e 74 20 6c 62 6c 4e 65 78 74  r;.  int lblNext
c4c0: 3b 0a 20 20 69 6e 74 20 6c 62 6c 42 72 6b 3b 0a  ;.  int lblBrk;.
c4d0: 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 3b 0a    int addrNext;.
c4e0: 20 20 69 6e 74 20 63 73 72 20 3d 20 70 4d 57 69    int csr = pMWi
c4f0: 6e 2d 3e 63 73 72 41 70 70 3b 0a 0a 20 20 6e 50  n->csrApp;..  nP
c500: 65 65 72 20 3d 20 28 70 4d 57 69 6e 2d 3e 70 4f  eer = (pMWin->pO
c510: 72 64 65 72 42 79 20 3f 20 70 4d 57 69 6e 2d 3e  rderBy ? pMWin->
c520: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
c530: 3a 20 30 29 3b 0a 0a 20 20 6c 62 6c 4e 65 78 74  : 0);..  lblNext
c540: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
c550: 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
c560: 0a 20 20 6c 62 6c 42 72 6b 20 3d 20 73 71 6c 69  .  lblBrk = sqli
c570: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
c580: 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 72 65 67  (pParse);..  reg
c590: 43 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  CRowid = sqlite3
c5a0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
c5b0: 65 29 3b 0a 20 20 72 65 67 52 6f 77 69 64 20 3d  e);.  regRowid =
c5c0: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
c5d0: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  eg(pParse);.  if
c5e0: 28 20 6e 50 65 65 72 20 29 7b 0a 20 20 20 20 72  ( nPeer ){.    r
c5f0: 65 67 43 50 65 65 72 20 3d 20 73 71 6c 69 74 65  egCPeer = sqlite
c600: 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
c610: 61 72 73 65 2c 20 6e 50 65 65 72 29 3b 0a 20 20  arse, nPeer);.  
c620: 20 20 72 65 67 50 65 65 72 20 3d 20 73 71 6c 69    regPeer = sqli
c630: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
c640: 70 50 61 72 73 65 2c 20 6e 50 65 65 72 29 3b 0a  pParse, nPeer);.
c650: 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 64    }..  sqlite3Vd
c660: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
c670: 6f 77 69 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  owid, pMWin->iEp
c680: 68 43 73 72 2c 20 72 65 67 43 52 6f 77 69 64 29  hCsr, regCRowid)
c690: 3b 0a 20 20 77 69 6e 64 6f 77 52 65 61 64 50 65  ;.  windowReadPe
c6a0: 65 72 56 61 6c 75 65 73 28 70 2c 20 70 4d 57 69  erValues(p, pMWi
c6b0: 6e 2d 3e 69 45 70 68 43 73 72 2c 20 72 65 67 43  n->iEphCsr, regC
c6c0: 50 65 65 72 29 3b 0a 0a 20 20 66 6f 72 28 70 57  Peer);..  for(pW
c6d0: 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20  in=pMWin; pWin; 
c6e0: 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74  pWin=pWin->pNext
c6f0: 57 69 6e 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Win){.    sqlite
c700: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
c710: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d  P_Null, 0, pWin-
c720: 3e 72 65 67 41 63 63 75 6d 29 3b 0a 20 20 7d 0a  >regAccum);.  }.
c730: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
c740: 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 47  dOp3(v, OP_SeekG
c750: 45 2c 20 63 73 72 2c 20 6c 62 6c 42 72 6b 2c 20  E, csr, lblBrk, 
c760: 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72 74 52  pMWin->regStartR
c770: 6f 77 69 64 29 3b 0a 20 20 61 64 64 72 4e 65 78  owid);.  addrNex
c780: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
c790: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
c7a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c7b0: 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20  p2(v, OP_Rowid, 
c7c0: 63 73 72 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  csr, regRowid);.
c7d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c7e0: 4f 70 33 28 76 2c 20 4f 50 5f 47 74 2c 20 70 4d  Op3(v, OP_Gt, pM
c7f0: 57 69 6e 2d 3e 72 65 67 45 6e 64 52 6f 77 69 64  Win->regEndRowid
c800: 2c 20 6c 62 6c 42 72 6b 2c 20 72 65 67 52 6f 77  , lblBrk, regRow
c810: 69 64 29 3b 0a 0a 20 20 69 66 28 20 70 4d 57 69  id);..  if( pMWi
c820: 6e 2d 3e 65 45 78 63 6c 75 64 65 3d 3d 54 4b 5f  n->eExclude==TK_
c830: 43 55 52 52 45 4e 54 20 29 7b 0a 20 20 20 20 73  CURRENT ){.    s
c840: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
c850: 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65 67 43 52  (v, OP_Eq, regCR
c860: 6f 77 69 64 2c 20 6c 62 6c 4e 65 78 74 2c 20 72  owid, lblNext, r
c870: 65 67 52 6f 77 69 64 29 3b 0a 20 20 7d 65 6c 73  egRowid);.  }els
c880: 65 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 78  e if( pMWin->eEx
c890: 63 6c 75 64 65 21 3d 54 4b 5f 4e 4f 20 29 7b 0a  clude!=TK_NO ){.
c8a0: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
c8b0: 20 20 69 6e 74 20 61 64 64 72 45 71 20 3d 20 30    int addrEq = 0
c8c0: 3b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  ;.    KeyInfo *p
c8d0: 4b 65 79 49 6e 66 6f 3b 0a 0a 20 20 20 20 70 4b  KeyInfo;..    pK
c8e0: 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
c8f0: 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  KeyInfoFromExprL
c900: 69 73 74 28 70 50 61 72 73 65 2c 20 70 4d 57 69  ist(pParse, pMWi
c910: 6e 2d 3e 70 4f 72 64 65 72 42 79 2c 20 30 2c 20  n->pOrderBy, 0, 
c920: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 57 69  0);.    if( pMWi
c930: 6e 2d 3e 65 45 78 63 6c 75 64 65 3d 3d 54 4b 5f  n->eExclude==TK_
c940: 54 49 45 53 20 29 7b 0a 20 20 20 20 20 20 61 64  TIES ){.      ad
c950: 64 72 45 71 20 3d 20 73 71 6c 69 74 65 33 56 64  drEq = sqlite3Vd
c960: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45  beAddOp3(v, OP_E
c970: 71 2c 20 72 65 67 43 52 6f 77 69 64 2c 20 6c 62  q, regCRowid, lb
c980: 6c 4e 65 78 74 2c 20 72 65 67 52 6f 77 69 64 29  lNext, regRowid)
c990: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 69 6e 64  ;.    }.    wind
c9a0: 6f 77 52 65 61 64 50 65 65 72 56 61 6c 75 65 73  owReadPeerValues
c9b0: 28 70 2c 20 63 73 72 2c 20 72 65 67 50 65 65 72  (p, csr, regPeer
c9c0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
c9d0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
c9e0: 6f 6d 70 61 72 65 2c 20 72 65 67 50 65 65 72 2c  ompare, regPeer,
c9f0: 20 72 65 67 43 50 65 65 72 2c 20 6e 50 65 65 72   regCPeer, nPeer
ca00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
ca10: 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28 76  beAppendP4(v, (v
ca20: 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  oid*)pKeyInfo, P
ca30: 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
ca40: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
ca50: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
ca60: 2b 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +1;.    sqlite3V
ca70: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
ca80: 4a 75 6d 70 2c 20 61 64 64 72 2c 20 6c 62 6c 4e  Jump, addr, lblN
ca90: 65 78 74 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  ext, addr);.    
caa0: 56 64 62 65 43 6f 76 65 72 61 67 65 45 71 4e 65  VdbeCoverageEqNe
cab0: 28 76 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64  (v);.    if( add
cac0: 72 45 71 20 29 20 73 71 6c 69 74 65 33 56 64 62  rEq ) sqlite3Vdb
cad0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
cae0: 72 45 71 29 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e  rEq);.  }..  win
caf0: 64 6f 77 41 67 67 53 74 65 70 28 70 50 61 72 73  dowAggStep(pPars
cb00: 65 2c 20 70 4d 57 69 6e 2c 20 63 73 72 2c 20 30  e, pMWin, csr, 0
cb10: 2c 20 70 2d 3e 72 65 67 41 72 67 29 3b 0a 0a 20  , p->regArg);.. 
cb20: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
cb30: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 4e  lveLabel(v, lblN
cb40: 65 78 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ext);.  sqlite3V
cb50: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
cb60: 4e 65 78 74 2c 20 63 73 72 2c 20 61 64 64 72 4e  Next, csr, addrN
cb70: 65 78 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ext);.  sqlite3V
cb80: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
cb90: 64 64 72 4e 65 78 74 2d 31 29 3b 0a 20 20 73 71  ddrNext-1);.  sq
cba0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
cbb0: 65 28 76 2c 20 61 64 64 72 4e 65 78 74 2b 31 29  e(v, addrNext+1)
cbc0: 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
cbd0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
cbe0: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 73  , regRowid);.  s
cbf0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
cc00: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
cc10: 43 52 6f 77 69 64 29 3b 0a 20 20 69 66 28 20 6e  CRowid);.  if( n
cc20: 50 65 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  Peer ){.    sqli
cc30: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
cc40: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 50  nge(pParse, regP
cc50: 65 65 72 2c 20 6e 50 65 65 72 29 3b 0a 20 20 20  eer, nPeer);.   
cc60: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
cc70: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
cc80: 20 72 65 67 43 50 65 65 72 2c 20 6e 50 65 65 72   regCPeer, nPeer
cc90: 29 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 64 6f 77  );.  }..  window
cca0: 41 67 67 46 69 6e 61 6c 28 70 2c 20 31 29 3b 0a  AggFinal(p, 1);.
ccb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
ccc0: 74 68 65 20 73 75 62 2d 72 6f 75 74 69 6e 65 20  the sub-routine 
ccd0: 61 74 20 72 65 67 47 6f 73 75 62 20 28 67 65 6e  at regGosub (gen
cce0: 65 72 61 74 65 64 20 62 79 20 63 6f 64 65 20 69  erated by code i
ccf0: 6e 20 73 65 6c 65 63 74 2e 63 29 20 74 6f 0a 2a  n select.c) to.*
cd00: 2a 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72  * return the cur
cd10: 72 65 6e 74 20 72 6f 77 20 6f 66 20 57 69 6e 64  rent row of Wind
cd20: 6f 77 2e 69 45 70 68 43 73 72 2e 20 49 66 20 61  ow.iEphCsr. If a
cd30: 6c 6c 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  ll window functi
cd40: 6f 6e 73 20 61 72 65 0a 2a 2a 20 61 67 67 72 65  ons are.** aggre
cd50: 67 61 74 65 20 77 69 6e 64 6f 77 20 66 75 6e 63  gate window func
cd60: 74 69 6f 6e 73 20 74 68 61 74 20 75 73 65 20 74  tions that use t
cd70: 68 65 20 73 74 61 6e 64 61 72 64 20 41 50 49 2c  he standard API,
cd80: 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 4f 50 5f   a single.** OP_
cd90: 47 6f 73 75 62 20 69 6e 73 74 72 75 63 74 69 6f  Gosub instructio
cda0: 6e 20 69 73 20 61 6c 6c 20 74 68 61 74 20 74 68  n is all that th
cdb0: 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
cdc0: 61 74 65 73 2e 20 45 78 74 72 61 20 56 4d 20 63  ates. Extra VM c
cdd0: 6f 64 65 0a 2a 2a 20 66 6f 72 20 70 65 72 2d 72  ode.** for per-r
cde0: 6f 77 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73  ow processing is
cdf0: 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65 64 20   only generated 
ce00: 66 6f 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  for the followin
ce10: 67 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  g built-in windo
ce20: 77 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 3a 0a  w.** functions:.
ce30: 2a 2a 0a 2a 2a 20 20 20 6e 74 68 5f 76 61 6c 75  **.**   nth_valu
ce40: 65 28 29 0a 2a 2a 20 20 20 66 69 72 73 74 5f 76  e().**   first_v
ce50: 61 6c 75 65 28 29 0a 2a 2a 20 20 20 6c 61 67 28  alue().**   lag(
ce60: 29 0a 2a 2a 20 20 20 6c 65 61 64 28 29 0a 2a 2f  ).**   lead().*/
ce70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
ce80: 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52 6f 77 28  dowReturnOneRow(
ce90: 57 69 6e 64 6f 77 43 6f 64 65 41 72 67 20 2a 70  WindowCodeArg *p
cea0: 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57  ){.  Window *pMW
ceb0: 69 6e 20 3d 20 70 2d 3e 70 4d 57 69 6e 3b 0a 20  in = p->pMWin;. 
cec0: 20 56 64 62 65 20 2a 76 20 3d 20 70 2d 3e 70 56   Vdbe *v = p->pV
ced0: 64 62 65 3b 0a 0a 20 20 69 66 28 20 70 4d 57 69  dbe;..  if( pMWi
cee0: 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f 77 69 64  n->regStartRowid
cef0: 20 29 7b 0a 20 20 20 20 77 69 6e 64 6f 77 46 75   ){.    windowFu
cf00: 6c 6c 53 63 61 6e 28 70 29 3b 0a 20 20 7d 65 6c  llScan(p);.  }el
cf10: 73 65 7b 0a 20 20 20 20 50 61 72 73 65 20 2a 70  se{.    Parse *p
cf20: 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73  Parse = p->pPars
cf30: 65 3b 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a 70  e;.    Window *p
cf40: 57 69 6e 3b 0a 0a 20 20 20 20 66 6f 72 28 70 57  Win;..    for(pW
cf50: 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20  in=pMWin; pWin; 
cf60: 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74  pWin=pWin->pNext
cf70: 57 69 6e 29 7b 0a 20 20 20 20 20 20 46 75 6e 63  Win){.      Func
cf80: 44 65 66 20 2a 70 46 75 6e 63 20 3d 20 70 57 69  Def *pFunc = pWi
cf90: 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20  n->pFunc;.      
cfa0: 69 66 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65  if( pFunc->zName
cfb0: 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 0a  ==nth_valueName.
cfc0: 20 20 20 20 20 20 20 7c 7c 20 70 46 75 6e 63 2d         || pFunc-
cfd0: 3e 7a 4e 61 6d 65 3d 3d 66 69 72 73 74 5f 76 61  >zName==first_va
cfe0: 6c 75 65 4e 61 6d 65 0a 20 20 20 20 20 20 29 7b  lueName.      ){
cff0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 73 72  .        int csr
d000: 20 3d 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 3b   = pWin->csrApp;
d010: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 62 6c  .        int lbl
d020: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
d030: 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
d040: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 6d 70  .        int tmp
d050: 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Reg = sqlite3Get
d060: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
d070: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d080: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
d090: 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e  _Null, 0, pWin->
d0a0: 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 0a 20  regResult);.  . 
d0b0: 20 20 20 20 20 20 20 69 66 28 20 70 46 75 6e 63         if( pFunc
d0c0: 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c  ->zName==nth_val
d0d0: 75 65 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  ueName ){.      
d0e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d0f0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
d100: 6d 6e 2c 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  mn,pMWin->iEphCs
d110: 72 2c 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b  r,pWin->iArgCol+
d120: 31 2c 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20  1,tmpReg);.     
d130: 20 20 20 20 20 77 69 6e 64 6f 77 43 68 65 63 6b       windowCheck
d140: 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 74 6d  Value(pParse, tm
d150: 70 52 65 67 2c 20 32 29 3b 0a 20 20 20 20 20 20  pReg, 2);.      
d160: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d170: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d180: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
d190: 65 72 2c 20 31 2c 20 74 6d 70 52 65 67 29 3b 0a  er, 1, tmpReg);.
d1a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d1b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d1c0: 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20 74  Op3(v, OP_Add, t
d1d0: 6d 70 52 65 67 2c 20 70 57 69 6e 2d 3e 72 65 67  mpReg, pWin->reg
d1e0: 41 70 70 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20  App, tmpReg);.  
d1f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d200: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 47 74  eAddOp3(v, OP_Gt
d210: 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31  , pWin->regApp+1
d220: 2c 20 6c 62 6c 2c 20 74 6d 70 52 65 67 29 3b 0a  , lbl, tmpReg);.
d230: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
d240: 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c 28 76 29  rageNeverNull(v)
d250: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
d260: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
d270: 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 63 73 72  P_SeekRowid, csr
d280: 2c 20 30 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20  , 0, tmpReg);.  
d290: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
d2a0: 67 65 4e 65 76 65 72 54 61 6b 65 6e 28 76 29 3b  geNeverTaken(v);
d2b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d2c0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
d2d0: 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20 70 57  _Column, csr, pW
d2e0: 69 6e 2d 3e 69 41 72 67 43 6f 6c 2c 20 70 57 69  in->iArgCol, pWi
d2f0: 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20  n->regResult);. 
d300: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d310: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
d320: 2c 20 6c 62 6c 29 3b 0a 20 20 20 20 20 20 20 20  , lbl);.        
d330: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
d340: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 74 6d  mpReg(pParse, tm
d350: 70 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pReg);.      }. 
d360: 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 46       else if( pF
d370: 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64  unc->zName==lead
d380: 4e 61 6d 65 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a  Name || pFunc->z
d390: 4e 61 6d 65 3d 3d 6c 61 67 4e 61 6d 65 20 29 7b  Name==lagName ){
d3a0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 41 72  .        int nAr
d3b0: 67 20 3d 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72  g = pWin->pOwner
d3c0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
d3d0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 73  ;.        int cs
d3e0: 72 20 3d 20 70 57 69 6e 2d 3e 63 73 72 41 70 70  r = pWin->csrApp
d3f0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 62  ;.        int lb
d400: 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  l = sqlite3VdbeM
d410: 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
d420: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 6d  ;.        int tm
d430: 70 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65  pReg = sqlite3Ge
d440: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
d450: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 45  ;.        int iE
d460: 70 68 20 3d 20 70 4d 57 69 6e 2d 3e 69 45 70 68  ph = pMWin->iEph
d470: 43 73 72 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  Csr;.  .        
d480: 69 66 28 20 6e 41 72 67 3c 33 20 29 7b 0a 20 20  if( nArg<3 ){.  
d490: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d4a0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
d4b0: 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72  Null, 0, pWin->r
d4c0: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
d4d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d4e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d4f0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
d500: 6d 6e 2c 20 69 45 70 68 2c 70 57 69 6e 2d 3e 69  mn, iEph,pWin->i
d510: 41 72 67 43 6f 6c 2b 32 2c 70 57 69 6e 2d 3e 72  ArgCol+2,pWin->r
d520: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
d530: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
d540: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
d550: 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 45 70 68  , OP_Rowid, iEph
d560: 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20  , tmpReg);.     
d570: 20 20 20 69 66 28 20 6e 41 72 67 3c 32 20 29 7b     if( nArg<2 ){
d580: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 76  .          int v
d590: 61 6c 20 3d 20 28 70 46 75 6e 63 2d 3e 7a 4e 61  al = (pFunc->zNa
d5a0: 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65 20 3f 20 31  me==leadName ? 1
d5b0: 20 3a 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20   : -1);.        
d5c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d5d0: 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
d5e0: 2c 20 74 6d 70 52 65 67 2c 20 76 61 6c 29 3b 0a  , tmpReg, val);.
d5f0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
d600: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70 20           int op 
d610: 3d 20 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d  = (pFunc->zName=
d620: 3d 6c 65 61 64 4e 61 6d 65 20 3f 20 4f 50 5f 41  =leadName ? OP_A
d630: 64 64 20 3a 20 4f 50 5f 53 75 62 74 72 61 63 74  dd : OP_Subtract
d640: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  );.          int
d650: 20 74 6d 70 52 65 67 32 20 3d 20 73 71 6c 69 74   tmpReg2 = sqlit
d660: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
d670: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rse);.          
d680: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d690: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
d6a0: 69 45 70 68 2c 20 70 57 69 6e 2d 3e 69 41 72 67  iEph, pWin->iArg
d6b0: 43 6f 6c 2b 31 2c 20 74 6d 70 52 65 67 32 29 3b  Col+1, tmpReg2);
d6c0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
d6d0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
d6e0: 6f 70 2c 20 74 6d 70 52 65 67 32 2c 20 74 6d 70  op, tmpReg2, tmp
d6f0: 52 65 67 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20  Reg, tmpReg);.  
d700: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
d710: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
d720: 61 72 73 65 2c 20 74 6d 70 52 65 67 32 29 3b 0a  arse, tmpReg2);.
d730: 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20          }.  .   
d740: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d750: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65  AddOp3(v, OP_See
d760: 6b 52 6f 77 69 64 2c 20 63 73 72 2c 20 6c 62 6c  kRowid, csr, lbl
d770: 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20  , tmpReg);.     
d780: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
d790: 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
d7a0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
d7b0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c   OP_Column, csr,
d7c0: 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2c 20   pWin->iArgCol, 
d7d0: 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29  pWin->regResult)
d7e0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
d7f0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
d800: 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20 20 20 20 20  l(v, lbl);.     
d810: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
d820: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
d830: 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20 20   tmpReg);.      
d840: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  }.    }.  }.  sq
d850: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
d860: 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 2d 3e  v, OP_Gosub, p->
d870: 72 65 67 47 6f 73 75 62 2c 20 70 2d 3e 61 64 64  regGosub, p->add
d880: 72 47 6f 73 75 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rGosub);.}../*.*
d890: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
d8a0: 74 6f 20 73 65 74 20 74 68 65 20 61 63 63 75 6d  to set the accum
d8b0: 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 20  ulator register 
d8c0: 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77 20  for each window 
d8d0: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74  function.** in t
d8e0: 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 70  he linked list p
d8f0: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
d900: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
d910: 4e 55 4c 4c 2e 20 41 6e 64 20 70 65 72 66 6f 72  NULL. And perfor
d920: 6d 0a 2a 2a 20 61 6e 79 20 65 71 75 69 76 61 6c  m.** any equival
d930: 65 6e 74 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  ent initializati
d940: 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 61  on required by a
d950: 6e 79 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64  ny built-in wind
d960: 6f 77 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20  ow functions.** 
d970: 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a  in the list..*/.
d980: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 64 6f  static int windo
d990: 77 49 6e 69 74 41 63 63 75 6d 28 50 61 72 73 65  wInitAccum(Parse
d9a0: 20 2a 70 50 61 72 73 65 2c 20 57 69 6e 64 6f 77   *pParse, Window
d9b0: 20 2a 70 4d 57 69 6e 29 7b 0a 20 20 56 64 62 65   *pMWin){.  Vdbe
d9c0: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
d9d0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
d9e0: 69 6e 74 20 72 65 67 41 72 67 3b 0a 20 20 69 6e  int regArg;.  in
d9f0: 74 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 57 69  t nArg = 0;.  Wi
da00: 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 66 6f  ndow *pWin;.  fo
da10: 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57  r(pWin=pMWin; pW
da20: 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70  in; pWin=pWin->p
da30: 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 46 75  NextWin){.    Fu
da40: 6e 63 44 65 66 20 2a 70 46 75 6e 63 20 3d 20 70  ncDef *pFunc = p
da50: 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20  Win->pFunc;.    
da60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
da70: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
da80: 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 29   pWin->regAccum)
da90: 3b 0a 20 20 20 20 6e 41 72 67 20 3d 20 4d 41 58  ;.    nArg = MAX
daa0: 28 6e 41 72 67 2c 20 77 69 6e 64 6f 77 41 72 67  (nArg, windowArg
dab0: 43 6f 75 6e 74 28 70 57 69 6e 29 29 3b 0a 20 20  Count(pWin));.  
dac0: 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 72 65 67    if( pMWin->reg
dad0: 53 74 61 72 74 52 6f 77 69 64 3d 3d 30 20 29 7b  StartRowid==0 ){
dae0: 0a 20 20 20 20 20 20 69 66 28 20 70 46 75 6e 63  .      if( pFunc
daf0: 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c  ->zName==nth_val
db00: 75 65 4e 61 6d 65 20 7c 7c 20 70 46 75 6e 63 2d  ueName || pFunc-
db10: 3e 7a 4e 61 6d 65 3d 3d 66 69 72 73 74 5f 76 61  >zName==first_va
db20: 6c 75 65 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  lueName ){.     
db30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
db40: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
db50: 65 72 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67  er, 0, pWin->reg
db60: 41 70 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71  App);.        sq
db70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
db80: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
db90: 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31  , pWin->regApp+1
dba0: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
dbb0: 20 20 69 66 28 20 28 70 46 75 6e 63 2d 3e 66 75    if( (pFunc->fu
dbc0: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
dbd0: 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 20 26 26  _FUNC_MINMAX) &&
dbe0: 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 20 29 7b   pWin->csrApp ){
dbf0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
dc00: 20 70 57 69 6e 2d 3e 65 53 74 61 72 74 21 3d 54   pWin->eStart!=T
dc10: 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 3b 0a 20  K_UNBOUNDED );. 
dc20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
dc30: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
dc40: 65 73 65 74 53 6f 72 74 65 72 2c 20 70 57 69 6e  esetSorter, pWin
dc50: 2d 3e 63 73 72 41 70 70 29 3b 0a 20 20 20 20 20  ->csrApp);.     
dc60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
dc70: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
dc80: 65 72 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67  er, 0, pWin->reg
dc90: 41 70 70 2b 31 29 3b 0a 20 20 20 20 20 20 7d 0a  App+1);.      }.
dca0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 67 41      }.  }.  regA
dcb0: 72 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  rg = pParse->nMe
dcc0: 6d 2b 31 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  m+1;.  pParse->n
dcd0: 4d 65 6d 20 2b 3d 20 6e 41 72 67 3b 0a 20 20 72  Mem += nArg;.  r
dce0: 65 74 75 72 6e 20 72 65 67 41 72 67 3b 0a 7d 0a  eturn regArg;.}.
dcf0: 0a 2f 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ./* .** Return t
dd00: 72 75 65 20 69 66 20 74 68 65 20 63 75 72 72 65  rue if the curre
dd10: 6e 74 20 66 72 61 6d 65 20 73 68 6f 75 6c 64 20  nt frame should 
dd20: 62 65 20 63 61 63 68 65 64 20 69 6e 20 74 68 65  be cached in the
dd30: 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
dd40: 2c 0a 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 65  ,.** even if the
dd50: 72 65 20 61 72 65 20 6e 6f 20 78 49 6e 76 65 72  re are no xInver
dd60: 73 65 28 29 20 63 61 6c 6c 73 20 72 65 71 75 69  se() calls requi
dd70: 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
dd80: 6e 74 20 77 69 6e 64 6f 77 43 61 63 68 65 46 72  nt windowCacheFr
dd90: 61 6d 65 28 57 69 6e 64 6f 77 20 2a 70 4d 57 69  ame(Window *pMWi
dda0: 6e 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57  n){.  Window *pW
ddb0: 69 6e 3b 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d  in;.  if( pMWin-
ddc0: 3e 72 65 67 53 74 61 72 74 52 6f 77 69 64 20 29  >regStartRowid )
ddd0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72   return 1;.  for
dde0: 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69  (pWin=pMWin; pWi
ddf0: 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e  n; pWin=pWin->pN
de00: 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 46 75 6e  extWin){.    Fun
de10: 63 44 65 66 20 2a 70 46 75 6e 63 20 3d 20 70 57  cDef *pFunc = pW
de20: 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 69  in->pFunc;.    i
de30: 66 28 20 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65  f( (pFunc->zName
de40: 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 29  ==nth_valueName)
de50: 0a 20 20 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d  .     || (pFunc-
de60: 3e 7a 4e 61 6d 65 3d 3d 66 69 72 73 74 5f 76 61  >zName==first_va
de70: 6c 75 65 4e 61 6d 65 29 0a 20 20 20 20 20 7c 7c  lueName).     ||
de80: 20 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d   (pFunc->zName==
de90: 6c 65 61 64 4e 61 6d 65 29 0a 20 20 20 20 20 7c  leadName).     |
dea0: 7c 20 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d  | (pFunc->zName=
deb0: 3d 6c 61 67 4e 61 6d 65 29 0a 20 20 20 20 29 7b  =lagName).    ){
dec0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
ded0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
dee0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
def0: 72 65 67 4f 6c 64 20 61 6e 64 20 72 65 67 4e 65  regOld and regNe
df00: 77 20 61 72 65 20 65 61 63 68 20 74 68 65 20 66  w are each the f
df10: 69 72 73 74 20 72 65 67 69 73 74 65 72 20 69 6e  irst register in
df20: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 73 69 7a   an array of siz
df30: 65 0a 2a 2a 20 70 4f 72 64 65 72 42 79 2d 3e 6e  e.** pOrderBy->n
df40: 45 78 70 72 2e 20 54 68 69 73 20 66 75 6e 63 74  Expr. This funct
df50: 69 6f 6e 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ion generates co
df60: 64 65 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 68  de to compare th
df70: 65 20 74 77 6f 0a 2a 2a 20 61 72 72 61 79 73 20  e two.** arrays 
df80: 6f 66 20 72 65 67 69 73 74 65 72 73 20 75 73 69  of registers usi
df90: 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  ng the collation
dfa0: 20 73 65 71 75 65 6e 63 65 73 20 61 6e 64 20 6f   sequences and o
dfb0: 74 68 65 72 20 63 6f 6d 70 61 72 69 73 6f 6e 0a  ther comparison.
dfc0: 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 20 73 70  ** parameters sp
dfd0: 65 63 69 66 69 65 64 20 62 79 20 70 4f 72 64 65  ecified by pOrde
dfe0: 72 42 79 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rBy. .**.** If t
dff0: 68 65 20 74 77 6f 20 61 72 72 61 79 73 20 61 72  he two arrays ar
e000: 65 20 6e 6f 74 20 65 71 75 61 6c 2c 20 74 68 65  e not equal, the
e010: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 72 65 67   contents of reg
e020: 4e 65 77 20 69 73 20 63 6f 70 69 65 64 20 74 6f  New is copied to
e030: 20 0a 2a 2a 20 72 65 67 4f 6c 64 20 61 6e 64 20   .** regOld and 
e040: 63 6f 6e 74 72 6f 6c 20 66 61 6c 6c 73 20 74 68  control falls th
e050: 72 6f 75 67 68 2e 20 4f 74 68 65 72 77 69 73 65  rough. Otherwise
e060: 2c 20 69 66 20 74 68 65 20 63 6f 6e 74 65 6e 74  , if the content
e070: 73 20 6f 66 20 74 68 65 20 61 72 72 61 79 73 0a  s of the arrays.
e080: 2a 2a 20 61 72 65 20 65 71 75 61 6c 2c 20 61 6e  ** are equal, an
e090: 20 4f 50 5f 47 6f 74 6f 20 69 73 20 65 78 65 63   OP_Goto is exec
e0a0: 75 74 65 64 2e 20 54 68 65 20 61 64 64 72 65 73  uted. The addres
e0b0: 73 20 6f 66 20 74 68 65 20 4f 50 5f 47 6f 74 6f  s of the OP_Goto
e0c0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
e0d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
e0e0: 64 6f 77 49 66 4e 65 77 50 65 65 72 28 0a 20 20  dowIfNewPeer(.  
e0f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20  Parse *pParse,. 
e100: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
e110: 72 42 79 2c 0a 20 20 69 6e 74 20 72 65 67 4e 65  rBy,.  int regNe
e120: 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w,              
e130: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
e140: 69 6e 20 61 72 72 61 79 20 6f 66 20 6e 65 77 20  in array of new 
e150: 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20  values */.  int 
e160: 72 65 67 4f 6c 64 2c 20 20 20 20 20 20 20 20 20  regOld,         
e170: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
e180: 69 72 73 74 20 69 6e 20 61 72 72 61 79 20 6f 66  irst in array of
e190: 20 6f 6c 64 20 76 61 6c 75 65 73 20 2a 2f 0a 20   old values */. 
e1a0: 20 69 6e 74 20 61 64 64 72 20 20 20 20 20 20 20   int addr       
e1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1c0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 2a 2f   /* Jump here */
e1d0: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
e1e0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
e1f0: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 70 4f  Parse);.  if( pO
e200: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69 6e  rderBy ){.    in
e210: 74 20 6e 56 61 6c 20 3d 20 70 4f 72 64 65 72 42  t nVal = pOrderB
e220: 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 4b 65  y->nExpr;.    Ke
e230: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
e240: 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
e250: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
e260: 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 30  rse, pOrderBy, 0
e270: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
e280: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
e290: 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67 4f 6c  P_Compare, regOl
e2a0: 64 2c 20 72 65 67 4e 65 77 2c 20 6e 56 61 6c 29  d, regNew, nVal)
e2b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
e2c0: 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28 76 6f  eAppendP4(v, (vo
e2d0: 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  id*)pKeyInfo, P4
e2e0: 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73  _KEYINFO);.    s
e2f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
e300: 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 0a 20 20  (v, OP_Jump, .  
e310: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
e320: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31 2c  urrentAddr(v)+1,
e330: 20 61 64 64 72 2c 20 73 71 6c 69 74 65 33 56 64   addr, sqlite3Vd
e340: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
e350: 2b 31 0a 20 20 20 20 29 3b 0a 20 20 20 20 56 64  +1.    );.    Vd
e360: 62 65 43 6f 76 65 72 61 67 65 45 71 4e 65 28 76  beCoverageEqNe(v
e370: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
e380: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
e390: 6f 70 79 2c 20 72 65 67 4e 65 77 2c 20 72 65 67  opy, regNew, reg
e3a0: 4f 6c 64 2c 20 6e 56 61 6c 2d 31 29 3b 0a 20 20  Old, nVal-1);.  
e3b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
e3c0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
e3d0: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
e3e0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
e3f0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
e400: 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20   called as part 
e410: 6f 66 20 67 65 6e 65 72 61 74 69 6e 67 20 56 4d  of generating VM
e420: 20 70 72 6f 67 72 61 6d 73 20 66 6f 72 20 52 41   programs for RA
e430: 4e 47 45 0a 2a 2a 20 6f 66 66 73 65 74 20 50 52  NGE.** offset PR
e440: 45 43 45 44 49 4e 47 2f 46 4f 4c 4c 4f 57 49 4e  ECEDING/FOLLOWIN
e450: 47 20 66 72 61 6d 65 20 62 6f 75 6e 64 61 72 69  G frame boundari
e460: 65 73 2e 20 41 73 73 75 6d 69 6e 67 20 22 41 53  es. Assuming "AS
e470: 43 22 20 6f 72 64 65 72 20 66 6f 72 0a 2a 2a 20  C" order for.** 
e480: 74 68 65 20 4f 52 44 45 52 20 42 59 20 74 65 72  the ORDER BY ter
e490: 6d 20 69 6e 20 74 68 65 20 77 69 6e 64 6f 77 2c  m in the window,
e4a0: 20 69 74 20 67 65 6e 65 72 61 74 65 73 20 63 6f   it generates co
e4b0: 64 65 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  de equivalent to
e4c0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 63 73  :.**.**   if( cs
e4d0: 72 31 2e 70 65 65 72 56 61 6c 20 2b 20 72 65 67  r1.peerVal + reg
e4e0: 56 61 6c 20 3e 3d 20 63 73 72 32 2e 70 65 65 72  Val >= csr2.peer
e4f0: 56 61 6c 20 29 20 67 6f 74 6f 20 6c 62 6c 3b 0a  Val ) goto lbl;.
e500: 2a 2a 0a 2a 2a 20 41 20 73 70 65 63 69 61 6c 20  **.** A special 
e510: 74 79 70 65 20 6f 66 20 61 72 69 74 68 6d 65 74  type of arithmet
e520: 69 63 20 69 73 20 75 73 65 64 20 73 75 63 68 20  ic is used such 
e530: 74 68 61 74 20 69 66 20 63 73 72 2e 70 65 65 72  that if csr.peer
e540: 56 61 6c 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20  Val is not.** a 
e550: 6e 75 6d 65 72 69 63 20 74 79 70 65 20 28 72 65  numeric type (re
e560: 61 6c 20 6f 72 20 69 6e 74 65 67 65 72 29 2c 20  al or integer), 
e570: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
e580: 6f 66 20 74 68 65 20 61 64 64 69 74 69 6f 6e 20  of the addition 
e590: 69 73 0a 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20  is.** a copy of 
e5a0: 63 73 72 31 2e 70 65 65 72 56 61 6c 2e 0a 2a 2f  csr1.peerVal..*/
e5b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
e5c0: 64 6f 77 43 6f 64 65 52 61 6e 67 65 54 65 73 74  dowCodeRangeTest
e5d0: 28 0a 20 20 57 69 6e 64 6f 77 43 6f 64 65 41 72  (.  WindowCodeAr
e5e0: 67 20 2a 70 2c 20 0a 20 20 69 6e 74 20 6f 70 2c  g *p, .  int op,
e5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 50 5f            /* OP_
e610: 47 65 20 6f 72 20 4f 50 5f 47 74 20 2a 2f 0a 20  Ge or OP_Gt */. 
e620: 20 69 6e 74 20 63 73 72 31 2c 20 0a 20 20 69 6e   int csr1, .  in
e630: 74 20 72 65 67 56 61 6c 2c 20 0a 20 20 69 6e 74  t regVal, .  int
e640: 20 63 73 72 32 2c 0a 20 20 69 6e 74 20 6c 62 6c   csr2,.  int lbl
e650: 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  .){.  Parse *pPa
e660: 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b  rse = p->pParse;
e670: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
e680: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
e690: 73 65 29 3b 0a 20 20 69 6e 74 20 72 65 67 31 20  se);.  int reg1 
e6a0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
e6b0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69  Reg(pParse);.  i
e6c0: 6e 74 20 72 65 67 32 20 3d 20 73 71 6c 69 74 65  nt reg2 = sqlite
e6d0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
e6e0: 73 65 29 3b 0a 20 20 69 6e 74 20 61 72 69 74 68  se);.  int arith
e6f0: 20 3d 20 4f 50 5f 41 64 64 3b 0a 20 20 69 6e 74   = OP_Add;.  int
e700: 20 61 64 64 72 47 65 3b 0a 0a 20 20 69 6e 74 20   addrGe;..  int 
e710: 72 65 67 53 74 72 69 6e 67 20 3d 20 2b 2b 70 50  regString = ++pP
e720: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 61  arse->nMem;..  a
e730: 73 73 65 72 74 28 20 6f 70 3d 3d 4f 50 5f 47 65  ssert( op==OP_Ge
e740: 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 7c 7c   || op==OP_Gt ||
e750: 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20   op==OP_Le );.  
e760: 61 73 73 65 72 74 28 20 70 2d 3e 70 4d 57 69 6e  assert( p->pMWin
e770: 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70 2d  ->pOrderBy && p-
e780: 3e 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79  >pMWin->pOrderBy
e790: 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20  ->nExpr==1 );.  
e7a0: 69 66 28 20 70 2d 3e 70 4d 57 69 6e 2d 3e 70 4f  if( p->pMWin->pO
e7b0: 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 73 6f 72  rderBy->a[0].sor
e7c0: 74 4f 72 64 65 72 20 29 7b 0a 20 20 20 20 73 77  tOrder ){.    sw
e7d0: 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
e7e0: 20 20 63 61 73 65 20 4f 50 5f 47 65 3a 20 6f 70    case OP_Ge: op
e7f0: 20 3d 20 4f 50 5f 4c 65 3b 20 62 72 65 61 6b 3b   = OP_Le; break;
e800: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 47  .      case OP_G
e810: 74 3a 20 6f 70 20 3d 20 4f 50 5f 4c 74 3b 20 62  t: op = OP_Lt; b
e820: 72 65 61 6b 3b 0a 20 20 20 20 20 20 64 65 66 61  reak;.      defa
e830: 75 6c 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d  ult: assert( op=
e840: 3d 4f 50 5f 4c 65 20 29 3b 20 6f 70 20 3d 20 4f  =OP_Le ); op = O
e850: 50 5f 47 65 3b 20 62 72 65 61 6b 3b 0a 20 20 20  P_Ge; break;.   
e860: 20 7d 0a 20 20 20 20 61 72 69 74 68 20 3d 20 4f   }.    arith = O
e870: 50 5f 53 75 62 74 72 61 63 74 3b 0a 20 20 7d 0a  P_Subtract;.  }.
e880: 0a 20 20 77 69 6e 64 6f 77 52 65 61 64 50 65 65  .  windowReadPee
e890: 72 56 61 6c 75 65 73 28 70 2c 20 63 73 72 31 2c  rValues(p, csr1,
e8a0: 20 72 65 67 31 29 3b 0a 20 20 77 69 6e 64 6f 77   reg1);.  window
e8b0: 52 65 61 64 50 65 65 72 56 61 6c 75 65 73 28 70  ReadPeerValues(p
e8c0: 2c 20 63 73 72 32 2c 20 72 65 67 32 29 3b 0a 0a  , csr2, reg2);..
e8d0: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
e8e0: 65 20 70 65 65 72 20 76 61 6c 75 65 20 66 6f 72  e peer value for
e8f0: 20 63 73 72 31 20 76 61 6c 75 65 20 69 73 20 61   csr1 value is a
e900: 20 74 65 78 74 20 6f 72 20 62 6c 6f 62 20 62 79   text or blob by
e910: 20 63 6f 6d 70 61 72 69 6e 67 0a 20 20 2a 2a 20   comparing.  ** 
e920: 69 74 20 74 6f 20 74 68 65 20 73 6d 61 6c 6c 65  it to the smalle
e930: 73 74 20 70 6f 73 73 69 62 6c 65 20 73 74 72 69  st possible stri
e940: 6e 67 20 2d 20 27 27 2e 20 49 66 20 69 74 20 69  ng - ''. If it i
e950: 73 2c 20 6a 75 6d 70 20 6f 76 65 72 20 74 68 65  s, jump over the
e960: 0a 20 20 2a 2a 20 4f 50 5f 41 64 64 20 6f 72 20  .  ** OP_Add or 
e970: 4f 50 5f 53 75 62 74 72 61 63 74 20 6f 70 65 72  OP_Subtract oper
e980: 61 74 69 6f 6e 20 61 6e 64 20 70 72 6f 63 65 65  ation and procee
e990: 64 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68  d directly to th
e9a0: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 2a 2f  e comparison. */
e9b0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
e9c0: 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e  dOp4(v, OP_Strin
e9d0: 67 38 2c 20 30 2c 20 72 65 67 53 74 72 69 6e 67  g8, 0, regString
e9e0: 2c 20 30 2c 20 22 22 2c 20 50 34 5f 53 54 41 54  , 0, "", P4_STAT
e9f0: 49 43 29 3b 0a 20 20 61 64 64 72 47 65 20 3d 20  IC);.  addrGe = 
ea00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ea10: 33 28 76 2c 20 4f 50 5f 47 65 2c 20 72 65 67 53  3(v, OP_Ge, regS
ea20: 74 72 69 6e 67 2c 20 30 2c 20 72 65 67 31 29 3b  tring, 0, reg1);
ea30: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
ea40: 64 4f 70 33 28 76 2c 20 61 72 69 74 68 2c 20 72  dOp3(v, arith, r
ea50: 65 67 56 61 6c 2c 20 72 65 67 31 2c 20 72 65 67  egVal, reg1, reg
ea60: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
ea70: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
ea80: 72 47 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  rGe);.  sqlite3V
ea90: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c  dbeAddOp3(v, op,
eaa0: 20 72 65 67 32 2c 20 6c 62 6c 2c 20 72 65 67 31   reg2, lbl, reg1
eab0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
eac0: 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49  ChangeP5(v, SQLI
ead0: 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 0a 20 20 73  TE_NULLEQ);..  s
eae0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
eaf0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
eb00: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  1);.  sqlite3Rel
eb10: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
eb20: 73 65 2c 20 72 65 67 32 29 3b 0a 7d 0a 0a 2f 2a  se, reg2);.}../*
eb30: 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74  .** Helper funct
eb40: 69 6f 6e 20 66 6f 72 20 73 71 6c 69 74 65 33 57  ion for sqlite3W
eb50: 69 6e 64 6f 77 43 6f 64 65 53 74 65 70 28 29 2e  indowCodeStep().
eb60: 20 45 61 63 68 20 63 61 6c 6c 20 74 6f 20 74 68   Each call to th
eb70: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 67  is function.** g
eb80: 65 6e 65 72 61 74 65 73 20 56 4d 20 63 6f 64 65  enerates VM code
eb90: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 52 45   for a single RE
eba0: 54 55 52 4e 5f 52 4f 57 2c 20 41 47 47 53 54 45  TURN_ROW, AGGSTE
ebb0: 50 20 6f 72 20 41 47 47 49 4e 56 45 52 53 45 20  P or AGGINVERSE 
ebc0: 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 52  .** operation. R
ebd0: 65 66 65 72 20 74 6f 20 74 68 65 20 68 65 61 64  efer to the head
ebe0: 65 72 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 20 73  er comment for s
ebf0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65  qlite3WindowCode
ec00: 53 74 65 70 28 29 20 66 6f 72 0a 2a 2a 20 64 65  Step() for.** de
ec10: 74 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  tails..*/.static
ec20: 20 69 6e 74 20 77 69 6e 64 6f 77 43 6f 64 65 4f   int windowCodeO
ec30: 70 28 0a 20 57 69 6e 64 6f 77 43 6f 64 65 41 72  p(. WindowCodeAr
ec40: 67 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  g *p,           
ec50: 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20       /* Context 
ec60: 6f 62 6a 65 63 74 20 2a 2f 0a 20 69 6e 74 20 6f  object */. int o
ec70: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
ec80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
ec90: 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57  INDOW_RETURN_ROW
eca0: 2c 20 41 47 47 53 54 45 50 20 6f 72 20 41 47 47  , AGGSTEP or AGG
ecb0: 49 4e 56 45 52 53 45 20 2a 2f 0a 20 69 6e 74 20  INVERSE */. int 
ecc0: 72 65 67 43 6f 75 6e 74 64 6f 77 6e 2c 20 20 20  regCountdown,   
ecd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ece0: 52 65 67 69 73 74 65 72 20 66 6f 72 20 4f 50 5f  Register for OP_
ecf0: 49 66 50 6f 73 20 63 6f 75 6e 74 64 6f 77 6e 20  IfPos countdown 
ed00: 2a 2f 0a 20 69 6e 74 20 6a 75 6d 70 4f 6e 45 6f  */. int jumpOnEo
ed10: 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f               
ed20: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
ed30: 65 20 69 66 20 73 74 65 70 70 65 64 20 63 75 72  e if stepped cur
ed40: 73 6f 72 20 72 65 61 63 68 65 73 20 45 4f 46 20  sor reaches EOF 
ed50: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 63 73 72 2c  */.){.  int csr,
ed60: 20 72 65 67 3b 0a 20 20 50 61 72 73 65 20 2a 70   reg;.  Parse *p
ed70: 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73  Parse = p->pPars
ed80: 65 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57  e;.  Window *pMW
ed90: 69 6e 20 3d 20 70 2d 3e 70 4d 57 69 6e 3b 0a 20  in = p->pMWin;. 
eda0: 20 69 6e 74 20 72 65 74 20 3d 20 30 3b 0a 20 20   int ret = 0;.  
edb0: 56 64 62 65 20 2a 76 20 3d 20 70 2d 3e 70 56 64  Vdbe *v = p->pVd
edc0: 62 65 3b 0a 20 20 69 6e 74 20 61 64 64 72 49 66  be;.  int addrIf
edd0: 20 3d 20 30 3b 20 0a 20 20 69 6e 74 20 61 64 64   = 0; .  int add
ede0: 72 43 6f 6e 74 69 6e 75 65 20 3d 20 30 3b 0a 20  rContinue = 0;. 
edf0: 20 69 6e 74 20 61 64 64 72 47 6f 74 6f 20 3d 20   int addrGoto = 
ee00: 30 3b 0a 20 20 69 6e 74 20 62 50 65 65 72 20 3d  0;.  int bPeer =
ee10: 20 28 70 4d 57 69 6e 2d 3e 65 54 79 70 65 21 3d   (pMWin->eType!=
ee20: 54 4b 5f 52 4f 57 53 29 3b 0a 0a 20 20 69 6e 74  TK_ROWS);..  int
ee30: 20 6c 62 6c 44 6f 6e 65 20 3d 20 73 71 6c 69 74   lblDone = sqlit
ee40: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
ee50: 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 61  pParse);.  int a
ee60: 64 64 72 4e 65 78 74 52 61 6e 67 65 20 3d 20 30  ddrNextRange = 0
ee70: 3b 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20  ;..  /* Special 
ee80: 63 61 73 65 20 2d 20 57 49 4e 44 4f 57 5f 41 47  case - WINDOW_AG
ee90: 47 49 4e 56 45 52 53 45 20 69 73 20 61 6c 77 61  GINVERSE is alwa
eea0: 79 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  ys a no-op if th
eeb0: 65 20 66 72 61 6d 65 0a 20 20 2a 2a 20 73 74 61  e frame.  ** sta
eec0: 72 74 73 20 77 69 74 68 20 55 4e 42 4f 55 4e 44  rts with UNBOUND
eed0: 45 44 20 50 52 45 43 45 44 49 4e 47 2e 20 2a 2f  ED PRECEDING. */
eee0: 0a 20 20 69 66 28 20 6f 70 3d 3d 57 49 4e 44 4f  .  if( op==WINDO
eef0: 57 5f 41 47 47 49 4e 56 45 52 53 45 20 26 26 20  W_AGGINVERSE && 
ef00: 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
ef10: 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20  K_UNBOUNDED ){. 
ef20: 20 20 20 61 73 73 65 72 74 28 20 72 65 67 43 6f     assert( regCo
ef30: 75 6e 74 64 6f 77 6e 3d 3d 30 20 26 26 20 6a 75  untdown==0 && ju
ef40: 6d 70 4f 6e 45 6f 66 3d 3d 30 20 29 3b 0a 20 20  mpOnEof==0 );.  
ef50: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
ef60: 0a 20 20 69 66 28 20 72 65 67 43 6f 75 6e 74 64  .  if( regCountd
ef70: 6f 77 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  own>0 ){.    if(
ef80: 20 70 4d 57 69 6e 2d 3e 65 54 79 70 65 3d 3d 54   pMWin->eType==T
ef90: 4b 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20  K_RANGE ){.     
efa0: 20 61 64 64 72 4e 65 78 74 52 61 6e 67 65 20 3d   addrNextRange =
efb0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
efc0: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
efd0: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 57 49    assert( op==WI
efe0: 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 20  NDOW_AGGINVERSE 
eff0: 7c 7c 20 6f 70 3d 3d 57 49 4e 44 4f 57 5f 41 47  || op==WINDOW_AG
f000: 47 53 54 45 50 20 29 3b 0a 20 20 20 20 20 20 69  GSTEP );.      i
f010: 66 28 20 6f 70 3d 3d 57 49 4e 44 4f 57 5f 41 47  f( op==WINDOW_AG
f020: 47 49 4e 56 45 52 53 45 20 29 7b 0a 20 20 20 20  GINVERSE ){.    
f030: 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65      if( pMWin->e
f040: 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57  Start==TK_FOLLOW
f050: 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ING ){.         
f060: 20 77 69 6e 64 6f 77 43 6f 64 65 52 61 6e 67 65   windowCodeRange
f070: 54 65 73 74 28 0a 20 20 20 20 20 20 20 20 20 20  Test(.          
f080: 20 20 20 20 70 2c 20 4f 50 5f 4c 65 2c 20 70 2d      p, OP_Le, p-
f090: 3e 63 75 72 72 65 6e 74 2e 63 73 72 2c 20 72 65  >current.csr, re
f0a0: 67 43 6f 75 6e 74 64 6f 77 6e 2c 20 70 2d 3e 73  gCountdown, p->s
f0b0: 74 61 72 74 2e 63 73 72 2c 20 6c 62 6c 44 6f 6e  tart.csr, lblDon
f0c0: 65 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  e.          );. 
f0d0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
f0e0: 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f          windowCo
f0f0: 64 65 52 61 6e 67 65 54 65 73 74 28 0a 20 20 20  deRangeTest(.   
f100: 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 4f 50             p, OP
f110: 5f 47 65 2c 20 70 2d 3e 73 74 61 72 74 2e 63 73  _Ge, p->start.cs
f120: 72 2c 20 72 65 67 43 6f 75 6e 74 64 6f 77 6e 2c  r, regCountdown,
f130: 20 70 2d 3e 63 75 72 72 65 6e 74 2e 63 73 72 2c   p->current.csr,
f140: 20 6c 62 6c 44 6f 6e 65 0a 20 20 20 20 20 20 20   lblDone.       
f150: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a     );.        }.
f160: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f170: 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 52       windowCodeR
f180: 61 6e 67 65 54 65 73 74 28 0a 20 20 20 20 20 20  angeTest(.      
f190: 20 20 20 20 20 20 70 2c 20 4f 50 5f 47 74 2c 20        p, OP_Gt, 
f1a0: 70 2d 3e 65 6e 64 2e 63 73 72 2c 20 72 65 67 43  p->end.csr, regC
f1b0: 6f 75 6e 74 64 6f 77 6e 2c 20 70 2d 3e 63 75 72  ountdown, p->cur
f1c0: 72 65 6e 74 2e 63 73 72 2c 20 6c 62 6c 44 6f 6e  rent.csr, lblDon
f1d0: 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  e.        );.   
f1e0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
f1f0: 20 20 20 20 20 20 61 64 64 72 49 66 20 3d 20 73        addrIf = s
f200: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
f210: 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 72 65  (v, OP_IfPos, re
f220: 67 43 6f 75 6e 74 64 6f 77 6e 2c 20 30 2c 20 31  gCountdown, 0, 1
f230: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
f240: 69 66 28 20 6f 70 3d 3d 57 49 4e 44 4f 57 5f 52  if( op==WINDOW_R
f250: 45 54 55 52 4e 5f 52 4f 57 20 26 26 20 70 4d 57  ETURN_ROW && pMW
f260: 69 6e 2d 3e 72 65 67 53 74 61 72 74 52 6f 77 69  in->regStartRowi
f270: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 77 69 6e 64  d==0 ){.    wind
f280: 6f 77 41 67 67 46 69 6e 61 6c 28 70 2c 20 30 29  owAggFinal(p, 0)
f290: 3b 0a 20 20 7d 0a 20 20 61 64 64 72 43 6f 6e 74  ;.  }.  addrCont
f2a0: 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64  inue = sqlite3Vd
f2b0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
f2c0: 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
f2d0: 7b 0a 20 20 20 20 63 61 73 65 20 57 49 4e 44 4f  {.    case WINDO
f2e0: 57 5f 52 45 54 55 52 4e 5f 52 4f 57 3a 0a 20 20  W_RETURN_ROW:.  
f2f0: 20 20 20 20 63 73 72 20 3d 20 70 2d 3e 63 75 72      csr = p->cur
f300: 72 65 6e 74 2e 63 73 72 3b 0a 20 20 20 20 20 20  rent.csr;.      
f310: 72 65 67 20 3d 20 70 2d 3e 63 75 72 72 65 6e 74  reg = p->current
f320: 2e 72 65 67 3b 0a 20 20 20 20 20 20 77 69 6e 64  .reg;.      wind
f330: 6f 77 52 65 74 75 72 6e 4f 6e 65 52 6f 77 28 70  owReturnOneRow(p
f340: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
f350: 0a 20 20 20 20 63 61 73 65 20 57 49 4e 44 4f 57  .    case WINDOW
f360: 5f 41 47 47 49 4e 56 45 52 53 45 3a 0a 20 20 20  _AGGINVERSE:.   
f370: 20 20 20 63 73 72 20 3d 20 70 2d 3e 73 74 61 72     csr = p->star
f380: 74 2e 63 73 72 3b 0a 20 20 20 20 20 20 72 65 67  t.csr;.      reg
f390: 20 3d 20 70 2d 3e 73 74 61 72 74 2e 72 65 67 3b   = p->start.reg;
f3a0: 0a 20 20 20 20 20 20 69 66 28 20 70 4d 57 69 6e  .      if( pMWin
f3b0: 2d 3e 72 65 67 53 74 61 72 74 52 6f 77 69 64 20  ->regStartRowid 
f3c0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
f3d0: 74 28 20 70 4d 57 69 6e 2d 3e 72 65 67 45 6e 64  t( pMWin->regEnd
f3e0: 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20  Rowid );.       
f3f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f400: 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
f410: 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72 74   pMWin->regStart
f420: 52 6f 77 69 64 2c 20 31 29 3b 0a 20 20 20 20 20  Rowid, 1);.     
f430: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f440: 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28 70 50  windowAggStep(pP
f450: 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 63 73 72  arse, pMWin, csr
f460: 2c 20 31 2c 20 70 2d 3e 72 65 67 41 72 67 29 3b  , 1, p->regArg);
f470: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
f480: 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75  reak;..    defau
f490: 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  lt:.      assert
f4a0: 28 20 6f 70 3d 3d 57 49 4e 44 4f 57 5f 41 47 47  ( op==WINDOW_AGG
f4b0: 53 54 45 50 20 29 3b 0a 20 20 20 20 20 20 63 73  STEP );.      cs
f4c0: 72 20 3d 20 70 2d 3e 65 6e 64 2e 63 73 72 3b 0a  r = p->end.csr;.
f4d0: 20 20 20 20 20 20 72 65 67 20 3d 20 70 2d 3e 65        reg = p->e
f4e0: 6e 64 2e 72 65 67 3b 0a 20 20 20 20 20 20 69 66  nd.reg;.      if
f4f0: 28 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61 72  ( pMWin->regStar
f500: 74 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  tRowid ){.      
f510: 20 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d    assert( pMWin-
f520: 3e 72 65 67 45 6e 64 52 6f 77 69 64 20 29 3b 0a  >regEndRowid );.
f530: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
f540: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f550: 41 64 64 49 6d 6d 2c 20 70 4d 57 69 6e 2d 3e 72  AddImm, pMWin->r
f560: 65 67 45 6e 64 52 6f 77 69 64 2c 20 31 29 3b 0a  egEndRowid, 1);.
f570: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f580: 20 20 20 20 20 77 69 6e 64 6f 77 41 67 67 53 74       windowAggSt
f590: 65 70 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  ep(pParse, pMWin
f5a0: 2c 20 63 73 72 2c 20 30 2c 20 70 2d 3e 72 65 67  , csr, 0, p->reg
f5b0: 41 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Arg);.      }.  
f5c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
f5d0: 20 20 69 66 28 20 6f 70 3d 3d 70 2d 3e 65 44 65    if( op==p->eDe
f5e0: 6c 65 74 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  lete ){.    sqli
f5f0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
f600: 20 4f 50 5f 44 65 6c 65 74 65 2c 20 63 73 72 29   OP_Delete, csr)
f610: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
f620: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
f630: 4c 41 47 5f 53 41 56 45 50 4f 53 49 54 49 4f 4e  LAG_SAVEPOSITION
f640: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6a 75  );.  }..  if( ju
f650: 6d 70 4f 6e 45 6f 66 20 29 7b 0a 20 20 20 20 73  mpOnEof ){.    s
f660: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
f670: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 63 73 72  (v, OP_Next, csr
f680: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
f690: 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a  rentAddr(v)+2);.
f6a0: 20 20 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65      ret = sqlite
f6b0: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
f6c0: 50 5f 47 6f 74 6f 29 3b 0a 20 20 7d 65 6c 73 65  P_Goto);.  }else
f6d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
f6e0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
f6f0: 78 74 2c 20 63 73 72 2c 20 73 71 6c 69 74 65 33  xt, csr, sqlite3
f700: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
f710: 76 29 2b 31 2b 62 50 65 65 72 29 3b 0a 20 20 20  v)+1+bPeer);.   
f720: 20 69 66 28 20 62 50 65 65 72 20 29 7b 0a 20 20   if( bPeer ){.  
f730: 20 20 20 20 61 64 64 72 47 6f 74 6f 20 3d 20 73      addrGoto = s
f740: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
f750: 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20  (v, OP_Goto);.  
f760: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62    }.  }..  if( b
f770: 50 65 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20  Peer ){.    int 
f780: 6e 52 65 67 20 3d 20 28 70 4d 57 69 6e 2d 3e 70  nReg = (pMWin->p
f790: 4f 72 64 65 72 42 79 20 3f 20 70 4d 57 69 6e 2d  OrderBy ? pMWin-
f7a0: 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
f7b0: 20 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74 20 72   : 0);.    int r
f7c0: 65 67 54 6d 70 20 3d 20 28 6e 52 65 67 20 3f 20  egTmp = (nReg ? 
f7d0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
f7e0: 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 52 65 67  nge(pParse, nReg
f7f0: 29 20 3a 20 30 29 3b 0a 20 20 20 20 77 69 6e 64  ) : 0);.    wind
f800: 6f 77 52 65 61 64 50 65 65 72 56 61 6c 75 65 73  owReadPeerValues
f810: 28 70 2c 20 63 73 72 2c 20 72 65 67 54 6d 70 29  (p, csr, regTmp)
f820: 3b 0a 20 20 20 20 77 69 6e 64 6f 77 49 66 4e 65  ;.    windowIfNe
f830: 77 50 65 65 72 28 70 50 61 72 73 65 2c 20 70 4d  wPeer(pParse, pM
f840: 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 2c 20 72  Win->pOrderBy, r
f850: 65 67 54 6d 70 2c 20 72 65 67 2c 20 61 64 64 72  egTmp, reg, addr
f860: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 73  Continue);.    s
f870: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
f880: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
f890: 65 67 54 6d 70 2c 20 6e 52 65 67 29 3b 0a 20 20  egTmp, nReg);.  
f8a0: 7d 0a 0a 20 20 69 66 28 20 61 64 64 72 4e 65 78  }..  if( addrNex
f8b0: 74 52 61 6e 67 65 20 29 7b 0a 20 20 20 20 73 71  tRange ){.    sq
f8c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
f8d0: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
f8e0: 64 64 72 4e 65 78 74 52 61 6e 67 65 29 3b 0a 20  ddrNextRange);. 
f8f0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
f900: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
f910: 6c 62 6c 44 6f 6e 65 29 3b 0a 20 20 69 66 28 20  lblDone);.  if( 
f920: 61 64 64 72 47 6f 74 6f 20 29 20 73 71 6c 69 74  addrGoto ) sqlit
f930: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
f940: 2c 20 61 64 64 72 47 6f 74 6f 29 3b 0a 20 20 69  , addrGoto);.  i
f950: 66 28 20 61 64 64 72 49 66 20 29 20 73 71 6c 69  f( addrIf ) sqli
f960: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
f970: 76 2c 20 61 64 64 72 49 66 29 3b 0a 20 20 72 65  v, addrIf);.  re
f980: 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 0a 2f 2a  turn ret;.}.../*
f990: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
f9a0: 20 72 65 74 75 72 6e 20 61 20 64 75 70 6c 69 63   return a duplic
f9b0: 61 74 65 20 6f 66 20 74 68 65 20 57 69 6e 64 6f  ate of the Windo
f9c0: 77 20 6f 62 6a 65 63 74 20 69 6e 64 69 63 61 74  w object indicat
f9d0: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 74 68 69  ed by the.** thi
f9e0: 72 64 20 61 72 67 75 6d 65 6e 74 2e 20 53 65 74  rd argument. Set
f9f0: 20 74 68 65 20 57 69 6e 64 6f 77 2e 70 4f 77 6e   the Window.pOwn
fa00: 65 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  er field of the 
fa10: 6e 65 77 20 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a  new object to.**
fa20: 20 70 4f 77 6e 65 72 2e 0a 2a 2f 0a 57 69 6e 64   pOwner..*/.Wind
fa30: 6f 77 20 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f  ow *sqlite3Windo
fa40: 77 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  wDup(sqlite3 *db
fa50: 2c 20 45 78 70 72 20 2a 70 4f 77 6e 65 72 2c 20  , Expr *pOwner, 
fa60: 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 57 69  Window *p){.  Wi
fa70: 6e 64 6f 77 20 2a 70 4e 65 77 20 3d 20 30 3b 0a  ndow *pNew = 0;.
fa80: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 29 20    if( ALWAYS(p) 
fa90: 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  ){.    pNew = sq
faa0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
fab0: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 57 69 6e  o(db, sizeof(Win
fac0: 64 6f 77 29 29 3b 0a 20 20 20 20 69 66 28 20 70  dow));.    if( p
fad0: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  New ){.      pNe
fae0: 77 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  w->zName = sqlit
faf0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
fb00: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
fb10: 70 4e 65 77 2d 3e 70 46 69 6c 74 65 72 20 3d 20  pNew->pFilter = 
fb20: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
fb30: 62 2c 20 70 2d 3e 70 46 69 6c 74 65 72 2c 20 30  b, p->pFilter, 0
fb40: 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  );.      pNew->p
fb50: 46 75 6e 63 20 3d 20 70 2d 3e 70 46 75 6e 63 3b  Func = p->pFunc;
fb60: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50 61  .      pNew->pPa
fb70: 72 74 69 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65  rtition = sqlite
fb80: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
fb90: 20 70 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20   p->pPartition, 
fba0: 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  0);.      pNew->
fbb0: 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74  pOrderBy = sqlit
fbc0: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
fbd0: 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 30  , p->pOrderBy, 0
fbe0: 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 65  );.      pNew->e
fbf0: 54 79 70 65 20 3d 20 70 2d 3e 65 54 79 70 65 3b  Type = p->eType;
fc00: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 65 45 6e  .      pNew->eEn
fc10: 64 20 3d 20 70 2d 3e 65 45 6e 64 3b 0a 20 20 20  d = p->eEnd;.   
fc20: 20 20 20 70 4e 65 77 2d 3e 65 53 74 61 72 74 20     pNew->eStart 
fc30: 3d 20 70 2d 3e 65 53 74 61 72 74 3b 0a 20 20 20  = p->eStart;.   
fc40: 20 20 20 70 4e 65 77 2d 3e 65 45 78 63 6c 75 64     pNew->eExclud
fc50: 65 20 3d 20 70 2d 3e 65 45 78 63 6c 75 64 65 3b  e = p->eExclude;
fc60: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 53 74  .      pNew->pSt
fc70: 61 72 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  art = sqlite3Exp
fc80: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 53 74 61  rDup(db, p->pSta
fc90: 72 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e  rt, 0);.      pN
fca0: 65 77 2d 3e 70 45 6e 64 20 3d 20 73 71 6c 69 74  ew->pEnd = sqlit
fcb0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
fcc0: 3e 70 45 6e 64 2c 20 30 29 3b 0a 20 20 20 20 20  >pEnd, 0);.     
fcd0: 20 70 4e 65 77 2d 3e 70 4f 77 6e 65 72 20 3d 20   pNew->pOwner = 
fce0: 70 4f 77 6e 65 72 3b 0a 20 20 20 20 7d 0a 20 20  pOwner;.    }.  
fcf0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
fd00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
fd10: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6c   a copy of the l
fd20: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 57 69  inked list of Wi
fd30: 6e 64 6f 77 20 6f 62 6a 65 63 74 73 20 70 61 73  ndow objects pas
fd40: 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 73 65  sed as the.** se
fd50: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
fd60: 2f 0a 57 69 6e 64 6f 77 20 2a 73 71 6c 69 74 65  /.Window *sqlite
fd70: 33 57 69 6e 64 6f 77 4c 69 73 74 44 75 70 28 73  3WindowListDup(s
fd80: 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 6e 64  qlite3 *db, Wind
fd90: 6f 77 20 2a 70 29 7b 0a 20 20 57 69 6e 64 6f 77  ow *p){.  Window
fda0: 20 2a 70 57 69 6e 3b 0a 20 20 57 69 6e 64 6f 77   *pWin;.  Window
fdb0: 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 57 69   *pRet = 0;.  Wi
fdc0: 6e 64 6f 77 20 2a 2a 70 70 20 3d 20 26 70 52 65  ndow **pp = &pRe
fdd0: 74 3b 0a 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70  t;..  for(pWin=p
fde0: 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69  ; pWin; pWin=pWi
fdf0: 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20  n->pNextWin){.  
fe00: 20 20 2a 70 70 20 3d 20 73 71 6c 69 74 65 33 57    *pp = sqlite3W
fe10: 69 6e 64 6f 77 44 75 70 28 64 62 2c 20 30 2c 20  indowDup(db, 0, 
fe20: 70 57 69 6e 29 3b 0a 20 20 20 20 69 66 28 20 2a  pWin);.    if( *
fe30: 70 70 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  pp==0 ) break;. 
fe40: 20 20 20 70 70 20 3d 20 26 28 28 2a 70 70 29 2d     pp = &((*pp)-
fe50: 3e 70 4e 65 78 74 57 69 6e 29 3b 0a 20 20 7d 0a  >pNextWin);.  }.
fe60: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
fe70: 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33  }../*.** sqlite3
fe80: 57 68 65 72 65 42 65 67 69 6e 28 29 20 68 61 73  WhereBegin() has
fe90: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
fea0: 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 53 45 4c  lled for the SEL
feb0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a  ECT statement .*
fec0: 2a 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  * passed as the 
fed0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
fee0: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
fef0: 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 2e 20 49  on is invoked. I
ff00: 74 20 67 65 6e 65 72 61 74 65 73 0a 2a 2a 20 63  t generates.** c
ff10: 6f 64 65 20 74 6f 20 70 6f 70 75 6c 61 74 65 20  ode to populate 
ff20: 74 68 65 20 57 69 6e 64 6f 77 2e 72 65 67 52 65  the Window.regRe
ff30: 73 75 6c 74 20 72 65 67 69 73 74 65 72 20 66 6f  sult register fo
ff40: 72 20 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75  r each window fu
ff50: 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 6e 64 20 69  nction .** and i
ff60: 6e 76 6f 6b 65 20 74 68 65 20 73 75 62 2d 72 6f  nvoke the sub-ro
ff70: 75 74 69 6e 65 20 61 74 20 69 6e 73 74 72 75 63  utine at instruc
ff80: 74 69 6f 6e 20 61 64 64 72 47 6f 73 75 62 20 6f  tion addrGosub o
ff90: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 72 6f 77  nce for each row
ffa0: 2e 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72  ..** sqlite3Wher
ffb0: 65 45 6e 64 28 29 20 69 73 20 61 6c 77 61 79 73  eEnd() is always
ffc0: 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 72   called before r
ffd0: 65 74 75 72 6e 69 6e 67 2e 20 0a 2a 2a 0a 2a 2a  eturning. .**.**
ffe0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68   This function h
fff0: 61 6e 64 6c 65 73 20 73 65 76 65 72 61 6c 20 64  andles several d
10000 69 66 66 65 72 65 6e 74 20 74 79 70 65 73 20 6f  ifferent types o
10010 66 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 73 2c  f window frames,
10020 20 77 68 69 63 68 0a 2a 2a 20 72 65 71 75 69 72   which.** requir
10030 65 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65  e slightly diffe
10040 72 65 6e 74 20 70 72 6f 63 65 73 73 69 6e 67 2e  rent processing.
10050 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   The following p
10060 73 65 75 64 6f 20 63 6f 64 65 20 69 73 0a 2a 2a  seudo code is.**
10070 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
10080 6e 74 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 73  nt window frames
10090 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
100a0 0a 2a 2a 20 20 20 52 4f 57 53 20 42 45 54 57 45  .**   ROWS BETWE
100b0 45 4e 20 3c 65 78 70 72 31 3e 20 50 52 45 43 45  EN <expr1> PRECE
100c0 44 49 4e 47 20 41 4e 44 20 3c 65 78 70 72 32 3e  DING AND <expr2>
100d0 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a   FOLLOWING.**.**
100e0 20 4f 74 68 65 72 20 77 69 6e 64 6f 77 20 66 72   Other window fr
100f0 61 6d 65 20 74 79 70 65 73 20 75 73 65 20 76 61  ame types use va
10100 72 69 61 6e 74 73 20 6f 66 20 74 68 65 20 66 6f  riants of the fo
10110 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
10120 20 20 20 2e 2e 2e 20 6c 6f 6f 70 20 73 74 61 72     ... loop star
10130 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 68  ted by sqlite3Wh
10140 65 72 65 42 65 67 69 6e 28 29 20 2e 2e 2e 0a 2a  ereBegin() ....*
10150 2a 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 20  *       if( new 
10160 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20  partition ){.** 
10170 20 20 20 20 20 20 20 20 47 6f 73 75 62 20 66 6c          Gosub fl
10180 75 73 68 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a  ush.**       }.*
10190 2a 20 20 20 20 20 20 20 49 6e 73 65 72 74 20 6e  *       Insert n
101a0 65 77 20 72 6f 77 20 69 6e 74 6f 20 65 70 68 20  ew row into eph 
101b0 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 20 20  table..**       
101c0 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 66 69  .**       if( fi
101d0 72 73 74 20 72 6f 77 20 6f 66 20 70 61 72 74 69  rst row of parti
101e0 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20  tion ){.**      
101f0 20 20 20 2f 2f 20 52 65 77 69 6e 64 20 74 68 72     // Rewind thr
10200 65 65 20 63 75 72 73 6f 72 73 2c 20 61 6c 6c 20  ee cursors, all 
10210 6f 70 65 6e 20 6f 6e 20 74 68 65 20 65 70 68 20  open on the eph 
10220 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 20 20  table..**       
10230 20 20 52 65 77 69 6e 64 28 63 73 72 45 6e 64 29    Rewind(csrEnd)
10240 3b 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 65 77  ;.**         Rew
10250 69 6e 64 28 63 73 72 53 74 61 72 74 29 3b 0a 2a  ind(csrStart);.*
10260 2a 20 20 20 20 20 20 20 20 20 52 65 77 69 6e 64  *         Rewind
10270 28 63 73 72 43 75 72 72 65 6e 74 29 3b 0a 2a 2a  (csrCurrent);.**
10280 20 20 20 20 20 20 20 0a 2a 2a 20 20 20 20 20 20         .**      
10290 20 20 20 72 65 67 45 6e 64 20 3d 20 3c 65 78 70     regEnd = <exp
102a0 72 32 3e 20 20 20 20 20 20 20 20 20 20 2f 2f 20  r2>          // 
102b0 46 4f 4c 4c 4f 57 49 4e 47 20 65 78 70 72 65 73  FOLLOWING expres
102c0 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  sion.**         
102d0 72 65 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72  regStart = <expr
102e0 31 3e 20 20 20 20 20 20 20 20 2f 2f 20 50 52 45  1>        // PRE
102f0 43 45 44 49 4e 47 20 65 78 70 72 65 73 73 69 6f  CEDING expressio
10300 6e 0a 2a 2a 20 20 20 20 20 20 20 7d 65 6c 73 65  n.**       }else
10310 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 2f 2f 20  {.**         // 
10320 46 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20  First time this 
10330 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 2c  branch is taken,
10340 20 74 68 65 20 65 70 68 20 74 61 62 6c 65 20 63   the eph table c
10350 6f 6e 74 61 69 6e 73 20 74 77 6f 20 0a 2a 2a 20  ontains two .** 
10360 20 20 20 20 20 20 20 20 2f 2f 20 72 6f 77 73 2e          // rows.
10370 20 54 68 65 20 66 69 72 73 74 20 72 6f 77 20 69   The first row i
10380 6e 20 74 68 65 20 70 61 72 74 69 74 69 6f 6e 2c  n the partition,
10390 20 77 68 69 63 68 20 61 6c 6c 20 74 68 72 65 65   which all three
103a0 20 63 75 72 73 6f 72 73 0a 2a 2a 20 20 20 20 20   cursors.**     
103b0 20 20 20 20 2f 2f 20 63 75 72 72 65 6e 74 6c 79      // currently
103c0 20 70 6f 69 6e 74 20 74 6f 2c 20 61 6e 64 20 74   point to, and t
103d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 77  he following row
103e0 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 47 47  ..**         AGG
103f0 53 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 20 20  STEP.**         
10400 69 66 28 20 28 72 65 67 45 6e 64 2d 2d 29 3c 3d  if( (regEnd--)<=
10410 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  0 ){.**         
10420 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20    RETURN_ROW.** 
10430 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 72            if( (r
10440 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20 29 7b  egStart--)<=0 ){
10450 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
10460 41 47 47 49 4e 56 45 52 53 45 0a 2a 2a 20 20 20  AGGINVERSE.**   
10470 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20          }.**    
10480 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20       }.**       
10490 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20  }.**     }.**   
104a0 20 20 66 6c 75 73 68 3a 0a 2a 2a 20 20 20 20 20    flush:.**     
104b0 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20    AGGSTEP.**    
104c0 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 2a     while( 1 ){.*
104d0 2a 20 20 20 20 20 20 20 20 20 52 45 54 55 52 4e  *         RETURN
104e0 20 52 4f 57 0a 2a 2a 20 20 20 20 20 20 20 20 20   ROW.**         
104f0 69 66 28 20 63 73 72 43 75 72 72 65 6e 74 20 69  if( csrCurrent i
10500 73 20 45 4f 46 20 29 20 62 72 65 61 6b 3b 0a 2a  s EOF ) break;.*
10510 2a 20 20 20 20 20 20 20 20 20 69 66 28 20 28 72  *         if( (r
10520 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20 29 7b  egStart--)<=0 ){
10530 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 67  .**           Ag
10540 67 49 6e 76 65 72 73 65 28 63 73 72 53 74 61 72  gInverse(csrStar
10550 74 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  t).**           
10560 4e 65 78 74 28 63 73 72 53 74 61 72 74 29 0a 2a  Next(csrStart).*
10570 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  *         }.**  
10580 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 54 68 65       }.**.** The
10590 20 70 73 65 75 64 6f 2d 63 6f 64 65 20 61 62 6f   pseudo-code abo
105a0 76 65 20 75 73 65 73 20 74 68 65 20 66 6f 6c 6c  ve uses the foll
105b0 6f 77 69 6e 67 20 73 68 6f 72 74 68 61 6e 64 3a  owing shorthand:
105c0 0a 2a 2a 0a 2a 2a 20 20 20 41 47 47 53 54 45 50  .**.**   AGGSTEP
105d0 3a 20 20 20 20 69 6e 76 6f 6b 65 20 74 68 65 20  :    invoke the 
105e0 61 67 67 72 65 67 61 74 65 20 78 53 74 65 70 28  aggregate xStep(
105f0 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65  ) function for e
10600 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  ach window funct
10610 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ion.**          
10620 20 20 20 20 20 77 69 74 68 20 61 72 67 75 6d 65       with argume
10630 6e 74 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68  nts read from th
10640 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66  e current row of
10650 20 63 75 72 73 6f 72 20 63 73 72 45 6e 64 2c 20   cursor csrEnd, 
10660 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  then.**         
10670 20 20 20 20 20 20 73 74 65 70 20 63 75 72 73 6f        step curso
10680 72 20 63 73 72 45 6e 64 20 66 6f 72 77 61 72 64  r csrEnd forward
10690 20 6f 6e 65 20 72 6f 77 20 28 69 2e 65 2e 20 73   one row (i.e. s
106a0 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
106b0 29 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 52 45 54 55  ))..**.**   RETU
106c0 52 4e 5f 52 4f 57 3a 20 72 65 74 75 72 6e 20 61  RN_ROW: return a
106d0 20 72 6f 77 20 74 6f 20 74 68 65 20 63 61 6c 6c   row to the call
106e0 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  er based on the 
106f0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
10700 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
10710 20 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66    current row of
10720 20 63 73 72 43 75 72 72 65 6e 74 20 61 6e 64 20   csrCurrent and 
10730 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
10740 65 20 6f 66 20 61 6c 6c 20 0a 2a 2a 20 20 20 20  e of all .**    
10750 20 20 20 20 20 20 20 20 20 20 20 61 67 67 72 65             aggre
10760 67 61 74 65 73 2e 20 54 68 65 6e 20 73 74 65 70  gates. Then step
10770 20 63 75 72 73 6f 72 20 63 73 72 43 75 72 72 65   cursor csrCurre
10780 6e 74 20 66 6f 72 77 61 72 64 20 6f 6e 65 20 72  nt forward one r
10790 6f 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 41 47 47 49  ow..**.**   AGGI
107a0 4e 56 45 52 53 45 3a 20 69 6e 76 6f 6b 65 20 74  NVERSE: invoke t
107b0 68 65 20 61 67 67 72 65 67 61 74 65 20 78 49 6e  he aggregate xIn
107c0 76 65 72 73 65 28 29 20 66 75 6e 63 74 69 6f 6e  verse() function
107d0 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77   for each window
107e0 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
107f0 20 20 20 66 75 6e 63 74 69 6f 6e 73 20 77 69 74     functions wit
10800 68 20 61 72 67 75 6d 65 6e 74 73 20 72 65 61 64  h arguments read
10810 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
10820 74 20 72 6f 77 20 6f 66 20 63 75 72 73 6f 72 0a  t row of cursor.
10830 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
10840 20 63 73 72 53 74 61 72 74 2e 20 54 68 65 6e 20   csrStart. Then 
10850 73 74 65 70 20 63 73 72 53 74 61 72 74 20 66 6f  step csrStart fo
10860 72 77 61 72 64 20 6f 6e 65 20 72 6f 77 2e 0a 2a  rward one row..*
10870 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 74  *.** There are t
10880 77 6f 20 6f 74 68 65 72 20 52 4f 57 53 20 77 69  wo other ROWS wi
10890 6e 64 6f 77 20 66 72 61 6d 65 73 20 74 68 61 74  ndow frames that
108a0 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 69 67   are handled sig
108b0 6e 69 66 69 63 61 6e 74 6c 79 0a 2a 2a 20 64 69  nificantly.** di
108c0 66 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d 20 74  fferently from t
108d0 68 65 20 61 62 6f 76 65 20 2d 20 22 42 45 54 57  he above - "BETW
108e0 45 45 4e 20 3c 65 78 70 72 3e 20 50 52 45 43 45  EEN <expr> PRECE
108f0 44 49 4e 47 20 41 4e 44 20 3c 65 78 70 72 3e 20  DING AND <expr> 
10900 50 52 45 43 45 44 49 4e 47 22 0a 2a 2a 20 61 6e  PRECEDING".** an
10910 64 20 22 42 45 54 57 45 45 4e 20 3c 65 78 70 72  d "BETWEEN <expr
10920 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e 44 20  > FOLLOWING AND 
10930 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47  <expr> FOLLOWING
10940 22 2e 20 54 68 65 73 65 20 61 72 65 20 73 70 65  ". These are spe
10950 63 69 61 6c 20 0a 2a 2a 20 63 61 73 65 73 20 62  cial .** cases b
10960 65 63 61 75 73 65 20 74 68 65 79 20 63 68 61 6e  ecause they chan
10970 67 65 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20  ge the order in 
10980 77 68 69 63 68 20 74 68 65 20 74 68 72 65 65 20  which the three 
10990 63 75 72 73 6f 72 73 20 28 63 73 72 53 74 61 72  cursors (csrStar
109a0 74 2c 0a 2a 2a 20 63 73 72 43 75 72 72 65 6e 74  t,.** csrCurrent
109b0 20 61 6e 64 20 63 73 72 45 6e 64 29 20 69 74 65   and csrEnd) ite
109c0 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65  rate through the
109d0 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
109e0 2e 20 43 61 73 65 73 20 74 68 61 74 0a 2a 2a 20  . Cases that.** 
109f0 75 73 65 20 55 4e 42 4f 55 4e 44 45 44 20 6f 72  use UNBOUNDED or
10a00 20 43 55 52 52 45 4e 54 20 52 4f 57 20 61 72 65   CURRENT ROW are
10a10 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 76 61   much simpler va
10a20 72 69 61 74 69 6f 6e 73 20 6f 6e 20 6f 6e 65 20  riations on one 
10a30 6f 66 20 74 68 65 73 65 0a 2a 2a 20 74 68 72 65  of these.** thre
10a40 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57 53 20  e..**.**   ROWS 
10a50 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31 3e 20  BETWEEN <expr1> 
10a60 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 3c 65  PRECEDING AND <e
10a70 78 70 72 32 3e 20 50 52 45 43 45 44 49 4e 47 0a  xpr2> PRECEDING.
10a80 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 6c 6f  **.**     ... lo
10a90 6f 70 20 73 74 61 72 74 65 64 20 62 79 20 73 71  op started by sq
10aa0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
10ab0 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 69  ) ....**       i
10ac0 66 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e  f( new partition
10ad0 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 47   ){.**         G
10ae0 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20 20  osub flush.**   
10af0 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 49      }.**       I
10b00 6e 73 65 72 74 20 6e 65 77 20 72 6f 77 20 69 6e  nsert new row in
10b10 74 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a 2a 2a  to eph table..**
10b20 20 20 20 20 20 20 20 69 66 28 20 66 69 72 73 74         if( first
10b30 20 72 6f 77 20 6f 66 20 70 61 72 74 69 74 69 6f   row of partitio
10b40 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  n ){.**         
10b50 52 65 77 69 6e 64 28 63 73 72 45 6e 64 29 20 3b  Rewind(csrEnd) ;
10b60 20 52 65 77 69 6e 64 28 63 73 72 53 74 61 72 74   Rewind(csrStart
10b70 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72 43 75  ) ; Rewind(csrCu
10b80 72 72 65 6e 74 29 0a 2a 2a 20 20 20 20 20 20 20  rrent).**       
10b90 20 20 72 65 67 45 6e 64 20 3d 20 3c 65 78 70 72    regEnd = <expr
10ba0 32 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20 72 65  2>.**         re
10bb0 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72 31 3e  gStart = <expr1>
10bc0 0a 2a 2a 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  .**       }else{
10bd0 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 66 28 20  .**         if( 
10be0 28 72 65 67 45 6e 64 2d 2d 29 3c 3d 30 20 29 7b  (regEnd--)<=0 ){
10bf0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 47  .**           AG
10c00 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 20  GSTEP.**        
10c10 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 45   }.**         RE
10c20 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20  TURN_ROW.**     
10c30 20 20 20 20 69 66 28 20 28 72 65 67 53 74 61 72      if( (regStar
10c40 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20  t--)<=0 ){.**   
10c50 20 20 20 20 20 20 20 20 41 47 47 49 4e 56 45 52          AGGINVER
10c60 53 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a  SE.**         }.
10c70 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20  **       }.**   
10c80 20 20 7d 0a 2a 2a 20 20 20 20 20 66 6c 75 73 68    }.**     flush
10c90 3a 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 28  :.**       if( (
10ca0 72 65 67 45 6e 64 2d 2d 29 3c 3d 30 20 29 7b 0a  regEnd--)<=0 ){.
10cb0 2a 2a 20 20 20 20 20 20 20 20 20 41 47 47 53 54  **         AGGST
10cc0 45 50 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a  EP.**       }.**
10cd0 20 20 20 20 20 20 20 52 45 54 55 52 4e 5f 52 4f         RETURN_RO
10ce0 57 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57  W.**.**.**   ROW
10cf0 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31  S BETWEEN <expr1
10d00 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e 44 20  > FOLLOWING AND 
10d10 3c 65 78 70 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e  <expr2> FOLLOWIN
10d20 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20  G.**.**     ... 
10d30 6c 6f 6f 70 20 73 74 61 72 74 65 64 20 62 79 20  loop started by 
10d40 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
10d50 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 69  n() ....**     i
10d60 66 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e  f( new partition
10d70 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 47 6f 73   ){.**       Gos
10d80 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20 20 20 20  ub flush.**     
10d90 7d 0a 2a 2a 20 20 20 20 20 49 6e 73 65 72 74 20  }.**     Insert 
10da0 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20 65 70 68  new row into eph
10db0 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 69   table..**     i
10dc0 66 28 20 66 69 72 73 74 20 72 6f 77 20 6f 66 20  f( first row of 
10dd0 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20  partition ){.** 
10de0 20 20 20 20 20 20 52 65 77 69 6e 64 28 63 73 72        Rewind(csr
10df0 45 6e 64 29 20 3b 20 52 65 77 69 6e 64 28 63 73  End) ; Rewind(cs
10e00 72 53 74 61 72 74 29 20 3b 20 52 65 77 69 6e 64  rStart) ; Rewind
10e10 28 63 73 72 43 75 72 72 65 6e 74 29 0a 2a 2a 20  (csrCurrent).** 
10e20 20 20 20 20 20 20 72 65 67 45 6e 64 20 3d 20 3c        regEnd = <
10e30 65 78 70 72 32 3e 0a 2a 2a 20 20 20 20 20 20 20  expr2>.**       
10e40 72 65 67 53 74 61 72 74 20 3d 20 72 65 67 45 6e  regStart = regEn
10e50 64 20 2d 20 3c 65 78 70 72 31 3e 0a 2a 2a 20 20  d - <expr1>.**  
10e60 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20 20     }else{.**    
10e70 20 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20 20     AGGSTEP.**   
10e80 20 20 20 20 69 66 28 20 28 72 65 67 45 6e 64 2d      if( (regEnd-
10e90 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20  -)<=0 ){.**     
10ea0 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a      RETURN_ROW.*
10eb0 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  *       }.**    
10ec0 20 20 20 69 66 28 20 28 72 65 67 53 74 61 72 74     if( (regStart
10ed0 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20  --)<=0 ){.**    
10ee0 20 20 20 20 20 41 47 47 49 4e 56 45 52 53 45 0a       AGGINVERSE.
10ef0 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20  **       }.**   
10f00 20 20 7d 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20    }.**   }.**   
10f10 66 6c 75 73 68 3a 0a 2a 2a 20 20 20 20 20 41 47  flush:.**     AG
10f20 47 53 54 45 50 0a 2a 2a 20 20 20 20 20 77 68 69  GSTEP.**     whi
10f30 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20  le( 1 ){.**     
10f40 20 20 69 66 28 20 28 72 65 67 45 6e 64 2d 2d 29    if( (regEnd--)
10f50 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  <=0 ){.**       
10f60 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20    RETURN_ROW.** 
10f70 20 20 20 20 20 20 20 20 69 66 28 20 65 6f 66 20          if( eof 
10f80 29 20 62 72 65 61 6b 3b 0a 2a 2a 20 20 20 20 20  ) break;.**     
10f90 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 69 66 28    }.**       if(
10fa0 20 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30   (regStart--)<=0
10fb0 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41   ){.**         A
10fc0 47 47 49 4e 56 45 52 53 45 0a 2a 2a 20 20 20 20  GGINVERSE.**    
10fd0 20 20 20 20 20 69 66 28 20 65 6f 66 20 29 20 62       if( eof ) b
10fe0 72 65 61 6b 0a 2a 2a 20 20 20 20 20 20 20 7d 0a  reak.**       }.
10ff0 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20  **     }.**     
11000 77 68 69 6c 65 28 20 21 65 6f 66 20 63 73 72 43  while( !eof csrC
11010 75 72 72 65 6e 74 20 29 7b 0a 2a 2a 20 20 20 20  urrent ){.**    
11020 20 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a     RETURN_ROW.**
11030 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 46 6f 72       }.**.** For
11040 20 74 68 65 20 6d 6f 73 74 20 70 61 72 74 2c 20   the most part, 
11050 74 68 65 20 70 61 74 74 65 72 6e 73 20 61 62 6f  the patterns abo
11060 76 65 20 61 72 65 20 61 64 61 70 74 65 64 20 74  ve are adapted t
11070 6f 20 73 75 70 70 6f 72 74 20 55 4e 42 4f 55 4e  o support UNBOUN
11080 44 45 44 20 62 79 0a 2a 2a 20 61 73 73 75 6d 69  DED by.** assumi
11090 6e 67 20 74 68 61 74 20 69 74 20 69 73 20 65 71  ng that it is eq
110a0 75 69 76 61 6c 65 6e 74 20 74 6f 20 22 69 6e 66  uivalent to "inf
110b0 69 6e 69 74 79 20 50 52 45 43 45 44 49 4e 47 2f  inity PRECEDING/
110c0 46 4f 4c 4c 4f 57 49 4e 47 22 20 61 6e 64 0a 2a  FOLLOWING" and.*
110d0 2a 20 43 55 52 52 45 4e 54 20 52 4f 57 20 62 79  * CURRENT ROW by
110e0 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 69   assuming that i
110f0 74 20 69 73 20 65 71 75 69 76 69 6c 65 6e 74 20  t is equivilent 
11100 74 6f 20 22 30 20 50 52 45 43 45 44 49 4e 47 2f  to "0 PRECEDING/
11110 46 4f 4c 4c 4f 57 49 4e 47 22 2e 0a 2a 2a 20 54  FOLLOWING"..** T
11120 68 69 73 20 69 73 20 6f 70 74 69 6d 69 7a 65 64  his is optimized
11130 20 6f 66 20 63 6f 75 72 73 65 20 2d 20 62 72 61   of course - bra
11140 6e 63 68 65 73 20 74 68 61 74 20 77 69 6c 6c 20  nches that will 
11150 6e 65 76 65 72 20 62 65 20 74 61 6b 65 6e 20 61  never be taken a
11160 6e 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73  nd.** conditions
11170 20 74 68 61 74 20 61 72 65 20 61 6c 77 61 79 73   that are always
11180 20 74 72 75 65 20 61 72 65 20 6f 6d 69 74 74 65   true are omitte
11190 64 20 66 72 6f 6d 20 74 68 65 20 56 4d 20 63 6f  d from the VM co
111a0 64 65 2e 20 54 68 65 20 6f 6e 6c 79 0a 2a 2a 20  de. The only.** 
111b0 65 78 63 65 70 74 69 6f 6e 61 6c 20 63 61 73 65  exceptional case
111c0 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57   is:.**.**   ROW
111d0 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31  S BETWEEN <expr1
111e0 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e 44 20  > FOLLOWING AND 
111f0 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57  UNBOUNDED FOLLOW
11200 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e  ING.**.**     ..
11210 2e 20 6c 6f 6f 70 20 73 74 61 72 74 65 64 20 62  . loop started b
11220 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
11230 67 69 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20  gin() ....**    
11240 20 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69   if( new partiti
11250 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 47  on ){.**       G
11260 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20 20  osub flush.**   
11270 20 20 7d 0a 2a 2a 20 20 20 20 20 49 6e 73 65 72    }.**     Inser
11280 74 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20 65  t new row into e
11290 70 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20  ph table..**    
112a0 20 69 66 28 20 66 69 72 73 74 20 72 6f 77 20 6f   if( first row o
112b0 66 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a  f partition ){.*
112c0 2a 20 20 20 20 20 20 20 52 65 77 69 6e 64 28 63  *       Rewind(c
112d0 73 72 45 6e 64 29 20 3b 20 52 65 77 69 6e 64 28  srEnd) ; Rewind(
112e0 63 73 72 53 74 61 72 74 29 20 3b 20 52 65 77 69  csrStart) ; Rewi
112f0 6e 64 28 63 73 72 43 75 72 72 65 6e 74 29 0a 2a  nd(csrCurrent).*
11300 2a 20 20 20 20 20 20 20 72 65 67 53 74 61 72 74  *       regStart
11310 20 3d 20 3c 65 78 70 72 31 3e 0a 2a 2a 20 20 20   = <expr1>.**   
11320 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20 20 20    }else{.**     
11330 20 20 41 47 47 53 54 45 50 0a 2a 2a 20 20 20 20    AGGSTEP.**    
11340 20 7d 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20 66   }.**   }.**   f
11350 6c 75 73 68 3a 0a 2a 2a 20 20 20 20 20 41 47 47  lush:.**     AGG
11360 53 54 45 50 0a 2a 2a 20 20 20 20 20 77 68 69 6c  STEP.**     whil
11370 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20 20  e( 1 ){.**      
11380 20 69 66 28 20 28 72 65 67 53 74 61 72 74 2d 2d   if( (regStart--
11390 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20  )<=0 ){.**      
113a0 20 20 20 41 47 47 49 4e 56 45 52 53 45 0a 2a 2a     AGGINVERSE.**
113b0 20 20 20 20 20 20 20 20 20 69 66 28 20 65 6f 66           if( eof
113c0 20 29 20 62 72 65 61 6b 0a 2a 2a 20 20 20 20 20   ) break.**     
113d0 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 52 45 54    }.**       RET
113e0 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 7d  URN_ROW.**     }
113f0 0a 2a 2a 20 20 20 20 20 77 68 69 6c 65 28 20 21  .**     while( !
11400 65 6f 66 20 63 73 72 43 75 72 72 65 6e 74 20 29  eof csrCurrent )
11410 7b 0a 2a 2a 20 20 20 20 20 20 20 52 45 54 55 52  {.**       RETUR
11420 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 7d 0a 2a  N_ROW.**     }.*
11430 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 71 75 69 72  *.** Also requir
11440 69 6e 67 20 73 70 65 63 69 61 6c 20 68 61 6e 64  ing special hand
11450 6c 69 6e 67 20 61 72 65 20 74 68 65 20 63 61 73  ling are the cas
11460 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 4f 57 53  es:.**.**   ROWS
11470 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31 3e   BETWEEN <expr1>
11480 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 3c   PRECEDING AND <
11490 65 78 70 72 32 3e 20 50 52 45 43 45 44 49 4e 47  expr2> PRECEDING
114a0 0a 2a 2a 20 20 20 52 4f 57 53 20 42 45 54 57 45  .**   ROWS BETWE
114b0 45 4e 20 3c 65 78 70 72 31 3e 20 46 4f 4c 4c 4f  EN <expr1> FOLLO
114c0 57 49 4e 47 20 41 4e 44 20 3c 65 78 70 72 32 3e  WING AND <expr2>
114d0 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a   FOLLOWING.**.**
114e0 20 77 68 65 6e 20 28 65 78 70 72 31 20 3c 20 65   when (expr1 < e
114f0 78 70 72 32 29 2e 20 54 68 69 73 20 69 73 20 64  xpr2). This is d
11500 65 74 65 63 74 65 64 20 61 74 20 72 75 6e 74 69  etected at runti
11510 6d 65 2c 20 6e 6f 74 20 62 79 20 74 68 69 73 20  me, not by this 
11520 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 54 6f 20  function..** To 
11530 68 61 6e 64 6c 65 20 74 68 69 73 20 63 61 73 65  handle this case
11540 2c 20 74 68 65 20 70 73 65 75 64 6f 2d 63 6f 64  , the pseudo-cod
11550 65 20 70 72 6f 67 72 61 6d 73 20 64 65 70 69 63  e programs depic
11560 74 65 64 20 61 62 6f 76 65 20 61 72 65 20 6d 6f  ted above are mo
11570 64 69 66 69 65 64 0a 2a 2a 20 73 6c 69 67 68 74  dified.** slight
11580 6c 79 20 74 6f 20 62 65 3a 0a 2a 2a 0a 2a 2a 20  ly to be:.**.** 
11590 20 20 20 20 2e 2e 2e 20 6c 6f 6f 70 20 73 74 61      ... loop sta
115a0 72 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 57  rted by sqlite3W
115b0 68 65 72 65 42 65 67 69 6e 28 29 20 2e 2e 2e 0a  hereBegin() ....
115c0 2a 2a 20 20 20 20 20 69 66 28 20 6e 65 77 20 70  **     if( new p
115d0 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20  artition ){.**  
115e0 20 20 20 20 20 47 6f 73 75 62 20 66 6c 75 73 68       Gosub flush
115f0 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  .**     }.**    
11600 20 49 6e 73 65 72 74 20 6e 65 77 20 72 6f 77 20   Insert new row 
11610 69 6e 74 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a  into eph table..
11620 2a 2a 20 20 20 20 20 69 66 28 20 66 69 72 73 74  **     if( first
11630 20 72 6f 77 20 6f 66 20 70 61 72 74 69 74 69 6f   row of partitio
11640 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 52 65  n ){.**       Re
11650 77 69 6e 64 28 63 73 72 45 6e 64 29 20 3b 20 52  wind(csrEnd) ; R
11660 65 77 69 6e 64 28 63 73 72 53 74 61 72 74 29 20  ewind(csrStart) 
11670 3b 20 52 65 77 69 6e 64 28 63 73 72 43 75 72 72  ; Rewind(csrCurr
11680 65 6e 74 29 0a 2a 2a 20 20 20 20 20 20 20 72 65  ent).**       re
11690 67 45 6e 64 20 3d 20 3c 65 78 70 72 32 3e 0a 2a  gEnd = <expr2>.*
116a0 2a 20 20 20 20 20 20 20 72 65 67 53 74 61 72 74  *       regStart
116b0 20 3d 20 3c 65 78 70 72 31 3e 0a 2a 2a 20 20 20   = <expr1>.**   
116c0 20 20 20 20 69 66 28 20 72 65 67 45 6e 64 20 3c      if( regEnd <
116d0 20 72 65 67 53 74 61 72 74 20 29 7b 0a 2a 2a 20   regStart ){.** 
116e0 20 20 20 20 20 20 20 20 52 45 54 55 52 4e 5f 52          RETURN_R
116f0 4f 57 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65  OW.**         de
11700 6c 65 74 65 20 65 70 68 20 74 61 62 6c 65 20 63  lete eph table c
11710 6f 6e 74 65 6e 74 73 0a 2a 2a 20 20 20 20 20 20  ontents.**      
11720 20 20 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 20     continue.**  
11730 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 2e 2e       }.**     ..
11740 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20  ..**.** The new 
11750 22 63 6f 6e 74 69 6e 75 65 22 20 73 74 61 74 65  "continue" state
11760 6d 65 6e 74 20 69 6e 20 74 68 65 20 61 62 6f 76  ment in the abov
11770 65 20 6a 75 6d 70 73 20 74 6f 20 74 68 65 20 6e  e jumps to the n
11780 65 78 74 20 69 74 65 72 61 74 69 6f 6e 0a 2a 2a  ext iteration.**
11790 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f   of the outer lo
117a0 6f 70 20 2d 20 74 68 65 20 6f 6e 65 20 73 74 61  op - the one sta
117b0 72 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 57  rted by sqlite3W
117c0 68 65 72 65 42 65 67 69 6e 28 29 2e 0a 2a 2a 0a  hereBegin()..**.
117d0 2a 2a 20 54 68 65 20 76 61 72 69 6f 75 73 20 47  ** The various G
117e0 52 4f 55 50 53 20 63 61 73 65 73 20 61 72 65 20  ROUPS cases are 
117f0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e  implemented usin
11800 67 20 74 68 65 20 73 61 6d 65 20 70 61 74 74 65  g the same patte
11810 72 6e 73 20 61 73 0a 2a 2a 20 52 4f 57 53 2e 20  rns as.** ROWS. 
11820 54 68 65 20 56 4d 20 63 6f 64 65 20 69 73 20 6d  The VM code is m
11830 6f 64 69 66 69 65 64 20 73 6c 69 67 68 74 6c 79  odified slightly
11840 20 73 6f 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20   so that:.**.** 
11850 20 20 31 2e 20 54 68 65 20 65 6c 73 65 20 62 72    1. The else br
11860 61 6e 63 68 20 69 6e 20 74 68 65 20 6d 61 69 6e  anch in the main
11870 20 6c 6f 6f 70 20 69 73 20 6f 6e 6c 79 20 74 61   loop is only ta
11880 6b 65 6e 20 69 66 20 74 68 65 20 72 6f 77 20 6a  ken if the row j
11890 75 73 74 0a 2a 2a 20 20 20 20 20 20 61 64 64 65  ust.**      adde
118a0 64 20 74 6f 20 74 68 65 20 65 70 68 65 6d 65 72  d to the ephemer
118b0 61 6c 20 74 61 62 6c 65 20 69 73 20 74 68 65 20  al table is the 
118c0 73 74 61 72 74 20 6f 66 20 61 20 6e 65 77 20 67  start of a new g
118d0 72 6f 75 70 2e 20 49 6e 0a 2a 2a 20 20 20 20 20  roup. In.**     
118e0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 74   other words, it
118f0 20 62 65 63 6f 6d 65 73 3a 0a 2a 2a 0a 2a 2a 20   becomes:.**.** 
11900 20 20 20 20 20 20 20 20 2e 2e 2e 20 6c 6f 6f 70          ... loop
11910 20 73 74 61 72 74 65 64 20 62 79 20 73 71 6c 69   started by sqli
11920 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
11930 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 69  ....**         i
11940 66 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e  f( new partition
11950 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   ){.**          
11960 20 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20   Gosub flush.** 
11970 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20          }.**    
11980 20 20 20 20 20 49 6e 73 65 72 74 20 6e 65 77 20       Insert new 
11990 72 6f 77 20 69 6e 74 6f 20 65 70 68 20 74 61 62  row into eph tab
119a0 6c 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 69  le..**         i
119b0 66 28 20 66 69 72 73 74 20 72 6f 77 20 6f 66 20  f( first row of 
119c0 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20  partition ){.** 
119d0 20 20 20 20 20 20 20 20 20 20 52 65 77 69 6e 64            Rewind
119e0 28 63 73 72 45 6e 64 29 20 3b 20 52 65 77 69 6e  (csrEnd) ; Rewin
119f0 64 28 63 73 72 53 74 61 72 74 29 20 3b 20 52 65  d(csrStart) ; Re
11a00 77 69 6e 64 28 63 73 72 43 75 72 72 65 6e 74 29  wind(csrCurrent)
11a10 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 72 65  .**           re
11a20 67 45 6e 64 20 3d 20 3c 65 78 70 72 32 3e 0a 2a  gEnd = <expr2>.*
11a30 2a 20 20 20 20 20 20 20 20 20 20 20 72 65 67 53  *           regS
11a40 74 61 72 74 20 3d 20 3c 65 78 70 72 31 3e 0a 2a  tart = <expr1>.*
11a50 2a 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  *         }else 
11a60 69 66 28 20 6e 65 77 20 67 72 6f 75 70 20 29 7b  if( new group ){
11a70 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 2e 2e  .**           ..
11a80 2e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a  . .**         }.
11a90 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a  **       }.**.**
11aa0 20 20 20 32 2e 20 49 6e 73 74 65 61 64 20 6f 66     2. Instead of
11ab0 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20 73 69   processing a si
11ac0 6e 67 6c 65 20 72 6f 77 2c 20 65 61 63 68 20 52  ngle row, each R
11ad0 45 54 55 52 4e 5f 52 4f 57 2c 20 41 47 47 53 54  ETURN_ROW, AGGST
11ae0 45 50 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 41  EP or .**      A
11af0 47 47 49 4e 56 45 52 53 45 20 73 74 65 70 20 70  GGINVERSE step p
11b00 72 6f 63 65 73 73 65 73 20 74 68 65 20 63 75 72  rocesses the cur
11b10 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20  rent row of the 
11b20 72 65 6c 65 76 61 6e 74 20 63 75 72 73 6f 72 20  relevant cursor 
11b30 61 6e 64 0a 2a 2a 20 20 20 20 20 20 61 6c 6c 20  and.**      all 
11b40 73 75 62 73 65 71 75 65 6e 74 20 72 6f 77 73 20  subsequent rows 
11b50 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65  belonging to the
11b60 20 73 61 6d 65 20 67 72 6f 75 70 2e 0a 2a 2a 0a   same group..**.
11b70 2a 2a 20 52 41 4e 47 45 20 77 69 6e 64 6f 77 20  ** RANGE window 
11b80 66 72 61 6d 65 73 20 61 72 65 20 61 20 6c 69 74  frames are a lit
11b90 74 6c 65 20 64 69 66 66 65 72 65 6e 74 20 61 67  tle different ag
11ba0 61 69 6e 2e 20 41 73 20 66 6f 72 20 47 52 4f 55  ain. As for GROU
11bb0 50 53 2c 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e  PS, the .** main
11bc0 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20   loop runs once 
11bd0 70 65 72 20 67 72 6f 75 70 20 6f 6e 6c 79 2e 20  per group only. 
11be0 41 6e 64 20 52 45 54 55 52 4e 5f 52 4f 57 2c 20  And RETURN_ROW, 
11bf0 41 47 47 53 54 45 50 20 61 6e 64 20 41 47 47 49  AGGSTEP and AGGI
11c00 4e 56 45 52 53 45 0a 2a 2a 20 64 65 61 6c 20 69  NVERSE.** deal i
11c10 6e 20 67 72 6f 75 70 73 20 69 6e 73 74 65 61 64  n groups instead
11c20 20 6f 66 20 72 6f 77 73 2e 20 41 73 20 66 6f 72   of rows. As for
11c30 20 52 4f 57 53 20 61 6e 64 20 47 52 4f 55 50 53   ROWS and GROUPS
11c40 2c 20 74 68 65 72 65 20 61 72 65 20 74 68 72 65  , there are thre
11c50 65 0a 2a 2a 20 62 61 73 69 63 20 63 61 73 65 73  e.** basic cases
11c60 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e 47 45 20  :.**.**   RANGE 
11c70 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31 3e 20  BETWEEN <expr1> 
11c80 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 3c 65  PRECEDING AND <e
11c90 78 70 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a  xpr2> FOLLOWING.
11ca0 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20 6c 6f  **.**     ... lo
11cb0 6f 70 20 73 74 61 72 74 65 64 20 62 79 20 73 71  op started by sq
11cc0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
11cd0 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 69  ) ....**       i
11ce0 66 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e  f( new partition
11cf0 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 47   ){.**         G
11d00 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20 20  osub flush.**   
11d10 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 49      }.**       I
11d20 6e 73 65 72 74 20 6e 65 77 20 72 6f 77 20 69 6e  nsert new row in
11d30 74 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a 2a 2a  to eph table..**
11d40 20 20 20 20 20 20 20 69 66 28 20 66 69 72 73 74         if( first
11d50 20 72 6f 77 20 6f 66 20 70 61 72 74 69 74 69 6f   row of partitio
11d60 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  n ){.**         
11d70 52 65 77 69 6e 64 28 63 73 72 45 6e 64 29 20 3b  Rewind(csrEnd) ;
11d80 20 52 65 77 69 6e 64 28 63 73 72 53 74 61 72 74   Rewind(csrStart
11d90 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72 43 75  ) ; Rewind(csrCu
11da0 72 72 65 6e 74 29 0a 2a 2a 20 20 20 20 20 20 20  rrent).**       
11db0 20 20 72 65 67 45 6e 64 20 3d 20 3c 65 78 70 72    regEnd = <expr
11dc0 32 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20 72 65  2>.**         re
11dd0 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72 31 3e  gStart = <expr1>
11de0 0a 2a 2a 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  .**       }else{
11df0 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 47 47 53  .**         AGGS
11e00 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 20 20 77  TEP.**         w
11e10 68 69 6c 65 28 20 28 63 73 72 43 75 72 72 65 6e  hile( (csrCurren
11e20 74 2e 6b 65 79 20 2b 20 72 65 67 45 6e 64 29 20  t.key + regEnd) 
11e30 3c 20 63 73 72 45 6e 64 2e 6b 65 79 20 29 7b 0a  < csrEnd.key ){.
11e40 2a 2a 20 20 20 20 20 20 20 20 20 20 20 52 45 54  **           RET
11e50 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 20  URN_ROW.**      
11e60 20 20 20 20 20 77 68 69 6c 65 28 20 63 73 72 53       while( csrS
11e70 74 61 72 74 2e 6b 65 79 20 2b 20 72 65 67 53 74  tart.key + regSt
11e80 61 72 74 29 20 3c 20 63 73 72 43 75 72 72 65 6e  art) < csrCurren
11e90 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20 20  t.key ){.**     
11ea0 20 20 20 20 20 20 20 20 41 47 47 49 4e 56 45 52          AGGINVER
11eb0 53 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  SE.**           
11ec0 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a  }.**         }.*
11ed0 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  *       }.**    
11ee0 20 7d 0a 2a 2a 20 20 20 20 20 66 6c 75 73 68 3a   }.**     flush:
11ef0 0a 2a 2a 20 20 20 20 20 20 20 41 47 47 53 54 45  .**       AGGSTE
11f00 50 0a 2a 2a 20 20 20 20 20 20 20 77 68 69 6c 65  P.**       while
11f10 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  ( 1 ){.**       
11f20 20 20 52 45 54 55 52 4e 20 52 4f 57 0a 2a 2a 20    RETURN ROW.** 
11f30 20 20 20 20 20 20 20 20 69 66 28 20 63 73 72 43          if( csrC
11f40 75 72 72 65 6e 74 20 69 73 20 45 4f 46 20 29 20  urrent is EOF ) 
11f50 62 72 65 61 6b 3b 0a 2a 2a 20 20 20 20 20 20 20  break;.**       
11f60 20 20 20 20 77 68 69 6c 65 28 20 63 73 72 53 74      while( csrSt
11f70 61 72 74 2e 6b 65 79 20 2b 20 72 65 67 53 74 61  art.key + regSta
11f80 72 74 29 20 3c 20 63 73 72 43 75 72 72 65 6e 74  rt) < csrCurrent
11f90 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20 20 20  .key ){.**      
11fa0 20 20 20 20 20 20 20 41 47 47 49 4e 56 45 52 53         AGGINVERS
11fb0 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 7d  E.**           }
11fc0 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a  .**         }.**
11fd0 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49         }.**.** I
11fe0 6e 20 74 68 65 20 61 62 6f 76 65 20 6e 6f 74 61  n the above nota
11ff0 74 69 6f 6e 2c 20 22 63 73 72 2e 6b 65 79 22 20  tion, "csr.key" 
12000 6d 65 61 6e 73 20 74 68 65 20 63 75 72 72 65 6e  means the curren
12010 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 4f  t value of the O
12020 52 44 45 52 20 42 59 20 0a 2a 2a 20 65 78 70 72  RDER BY .** expr
12030 65 73 73 69 6f 6e 20 28 74 68 65 72 65 20 69 73  ession (there is
12040 20 6f 6e 6c 79 20 65 76 65 72 20 31 20 66 6f 72   only ever 1 for
12050 20 61 20 52 41 4e 47 45 20 74 68 61 74 20 75 73   a RANGE that us
12060 65 73 20 61 6e 20 3c 65 78 70 72 3e 20 46 4f 4c  es an <expr> FOL
12070 4c 4f 57 49 4e 47 0a 2a 2a 20 6f 72 20 3c 65 78  LOWING.** or <ex
12080 70 72 20 50 52 45 43 45 44 49 4e 47 29 20 72 65  pr PRECEDING) re
12090 61 64 20 66 72 6f 6d 20 63 75 72 73 6f 72 20 63  ad from cursor c
120a0 73 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e 47  sr..**.**   RANG
120b0 45 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31  E BETWEEN <expr1
120c0 3e 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20  > PRECEDING AND 
120d0 3c 65 78 70 72 32 3e 20 50 52 45 43 45 44 49 4e  <expr2> PRECEDIN
120e0 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20  G.**.**     ... 
120f0 6c 6f 6f 70 20 73 74 61 72 74 65 64 20 62 79 20  loop started by 
12100 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
12110 6e 28 29 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20  n() ....**      
12120 20 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69   if( new partiti
12130 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  on ){.**        
12140 20 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20   Gosub flush.** 
12150 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20        }.**      
12160 20 49 6e 73 65 72 74 20 6e 65 77 20 72 6f 77 20   Insert new row 
12170 69 6e 74 6f 20 65 70 68 20 74 61 62 6c 65 2e 0a  into eph table..
12180 2a 2a 20 20 20 20 20 20 20 69 66 28 20 66 69 72  **       if( fir
12190 73 74 20 72 6f 77 20 6f 66 20 70 61 72 74 69 74  st row of partit
121a0 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  ion ){.**       
121b0 20 20 52 65 77 69 6e 64 28 63 73 72 45 6e 64 29    Rewind(csrEnd)
121c0 20 3b 20 52 65 77 69 6e 64 28 63 73 72 53 74 61   ; Rewind(csrSta
121d0 72 74 29 20 3b 20 52 65 77 69 6e 64 28 63 73 72  rt) ; Rewind(csr
121e0 43 75 72 72 65 6e 74 29 0a 2a 2a 20 20 20 20 20  Current).**     
121f0 20 20 20 20 72 65 67 45 6e 64 20 3d 20 3c 65 78      regEnd = <ex
12200 70 72 32 3e 0a 2a 2a 20 20 20 20 20 20 20 20 20  pr2>.**         
12210 72 65 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72  regStart = <expr
12220 31 3e 0a 2a 2a 20 20 20 20 20 20 20 7d 65 6c 73  1>.**       }els
12230 65 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 68  e{.**         wh
12240 69 6c 65 28 20 28 63 73 72 45 6e 64 2e 6b 65 79  ile( (csrEnd.key
12250 20 2b 20 72 65 67 45 6e 64 29 20 3c 3d 20 63 73   + regEnd) <= cs
12260 72 43 75 72 72 65 6e 74 2e 6b 65 79 20 29 7b 0a  rCurrent.key ){.
12270 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 47 47  **           AGG
12280 53 54 45 50 0a 2a 2a 20 20 20 20 20 20 20 20 20  STEP.**         
12290 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 45 54  }.**         RET
122a0 55 52 4e 5f 52 4f 57 0a 2a 2a 20 20 20 20 20 20  URN_ROW.**      
122b0 20 20 20 77 68 69 6c 65 28 20 28 63 73 72 53 74     while( (csrSt
122c0 61 72 74 2e 6b 65 79 20 2b 20 72 65 67 53 74 61  art.key + regSta
122d0 72 74 29 20 3c 20 63 73 72 43 75 72 72 65 6e 74  rt) < csrCurrent
122e0 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20 20 20  .key ){.**      
122f0 20 20 20 20 20 41 47 47 49 4e 56 45 52 53 45 0a       AGGINVERSE.
12300 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20  **         }.** 
12310 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 7d        }.**     }
12320 0a 2a 2a 20 20 20 20 20 66 6c 75 73 68 3a 0a 2a  .**     flush:.*
12330 2a 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28  *       while( (
12340 63 73 72 45 6e 64 2e 6b 65 79 20 2b 20 72 65 67  csrEnd.key + reg
12350 45 6e 64 29 20 3c 3d 20 63 73 72 43 75 72 72 65  End) <= csrCurre
12360 6e 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20  nt.key ){.**    
12370 20 20 20 20 20 41 47 47 53 54 45 50 0a 2a 2a 20       AGGSTEP.** 
12380 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20        }.**      
12390 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 0a 2a   RETURN_ROW.**.*
123a0 2a 20 20 20 52 41 4e 47 45 20 42 45 54 57 45 45  *   RANGE BETWEE
123b0 4e 20 3c 65 78 70 72 31 3e 20 46 4f 4c 4c 4f 57  N <expr1> FOLLOW
123c0 49 4e 47 20 41 4e 44 20 3c 65 78 70 72 32 3e 20  ING AND <expr2> 
123d0 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20  FOLLOWING.**.** 
123e0 20 20 20 20 2e 2e 2e 20 6c 6f 6f 70 20 73 74 61      ... loop sta
123f0 72 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 57  rted by sqlite3W
12400 68 65 72 65 42 65 67 69 6e 28 29 20 2e 2e 2e 0a  hereBegin() ....
12410 2a 2a 20 20 20 20 20 20 20 69 66 28 20 6e 65 77  **       if( new
12420 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a   partition ){.**
12430 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20 66           Gosub f
12440 6c 75 73 68 0a 2a 2a 20 20 20 20 20 20 20 7d 0a  lush.**       }.
12450 2a 2a 20 20 20 20 20 20 20 49 6e 73 65 72 74 20  **       Insert 
12460 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20 65 70 68  new row into eph
12470 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 20   table..**      
12480 20 69 66 28 20 66 69 72 73 74 20 72 6f 77 20 6f   if( first row o
12490 66 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a  f partition ){.*
124a0 2a 20 20 20 20 20 20 20 20 20 52 65 77 69 6e 64  *         Rewind
124b0 28 63 73 72 45 6e 64 29 20 3b 20 52 65 77 69 6e  (csrEnd) ; Rewin
124c0 64 28 63 73 72 53 74 61 72 74 29 20 3b 20 52 65  d(csrStart) ; Re
124d0 77 69 6e 64 28 63 73 72 43 75 72 72 65 6e 74 29  wind(csrCurrent)
124e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 72 65 67 45  .**         regE
124f0 6e 64 20 3d 20 3c 65 78 70 72 32 3e 0a 2a 2a 20  nd = <expr2>.** 
12500 20 20 20 20 20 20 20 20 72 65 67 53 74 61 72 74          regStart
12510 20 3d 20 3c 65 78 70 72 31 3e 0a 2a 2a 20 20 20   = <expr1>.**   
12520 20 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20 20      }else{.**   
12530 20 20 20 20 20 20 41 47 47 53 54 45 50 0a 2a 2a        AGGSTEP.**
12540 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
12550 28 63 73 72 43 75 72 72 65 6e 74 2e 6b 65 79 20  (csrCurrent.key 
12560 2b 20 72 65 67 45 6e 64 29 20 3c 20 63 73 72 45  + regEnd) < csrE
12570 6e 64 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20 20 20  nd.key ){.**    
12580 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63         while( (c
12590 73 72 43 75 72 72 65 6e 74 2e 6b 65 79 20 2b 20  srCurrent.key + 
125a0 72 65 67 53 74 61 72 74 29 20 3e 20 63 73 72 53  regStart) > csrS
125b0 74 61 72 74 2e 6b 65 79 20 29 7b 0a 2a 2a 20 20  tart.key ){.**  
125c0 20 20 20 20 20 20 20 20 20 20 20 41 47 47 49 4e             AGGIN
125d0 56 45 52 53 45 0a 2a 2a 20 20 20 20 20 20 20 20  VERSE.**        
125e0 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20     }.**         
125f0 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20    RETURN_ROW.** 
12600 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20          }.**    
12610 20 20 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a     }.**     }.**
12620 20 20 20 20 20 66 6c 75 73 68 3a 0a 2a 2a 20 20       flush:.**  
12630 20 20 20 20 20 41 47 47 53 54 45 50 0a 2a 2a 20       AGGSTEP.** 
12640 20 20 20 20 20 20 77 68 69 6c 65 28 20 31 20 29        while( 1 )
12650 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 68 69  {.**         whi
12660 6c 65 28 20 28 63 73 72 43 75 72 72 65 6e 74 2e  le( (csrCurrent.
12670 6b 65 79 20 2b 20 72 65 67 53 74 61 72 74 29 20  key + regStart) 
12680 3e 20 63 73 72 53 74 61 72 74 2e 6b 65 79 20 29  > csrStart.key )
12690 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41  {.**           A
126a0 47 47 49 4e 56 45 52 53 45 0a 2a 2a 20 20 20 20  GGINVERSE.**    
126b0 20 20 20 20 20 20 20 69 66 28 20 65 6f 66 20 29         if( eof )
126c0 20 62 72 65 61 6b 20 22 77 68 69 6c 65 28 20 31   break "while( 1
126d0 20 29 22 20 6c 6f 6f 70 2e 0a 2a 2a 20 20 20 20   )" loop..**    
126e0 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20       }.**       
126f0 20 20 52 45 54 55 52 4e 5f 52 4f 57 0a 2a 2a 20    RETURN_ROW.** 
12700 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20        }.**      
12710 20 77 68 69 6c 65 28 20 21 65 6f 66 20 63 73 72   while( !eof csr
12720 43 75 72 72 65 6e 74 20 29 7b 0a 2a 2a 20 20 20  Current ){.**   
12730 20 20 20 20 20 20 52 45 54 55 52 4e 5f 52 4f 57        RETURN_ROW
12740 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a  .**       }.**.*
12750 2a 20 54 68 65 20 74 65 78 74 20 61 62 6f 76 65  * The text above
12760 20 6c 65 61 76 65 73 20 6f 75 74 20 6d 61 6e 79   leaves out many
12770 20 64 65 74 61 69 6c 73 2e 20 52 65 66 65 72 20   details. Refer 
12780 74 6f 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20  to the code and 
12790 63 6f 6d 6d 65 6e 74 73 0a 2a 2a 20 62 65 6c 6f  comments.** belo
127a0 77 20 66 6f 72 20 61 20 6d 6f 72 65 20 63 6f 6d  w for a more com
127b0 70 6c 65 74 65 20 70 69 63 74 75 72 65 2e 0a 2a  plete picture..*
127c0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69  /.void sqlite3Wi
127d0 6e 64 6f 77 43 6f 64 65 53 74 65 70 28 0a 20 20  ndowCodeStep(.  
127e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
127f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12800 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
12810 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
12820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12830 20 20 20 20 20 20 2f 2a 20 52 65 77 72 69 74 74        /* Rewritt
12840 65 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  en SELECT statem
12850 65 6e 74 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ent */.  WhereIn
12860 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 20  fo *pWInfo,     
12870 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74           /* Cont
12880 65 78 74 20 72 65 74 75 72 6e 65 64 20 62 79 20  ext returned by 
12890 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
128a0 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  n() */.  int reg
128b0 47 6f 73 75 62 2c 20 20 20 20 20 20 20 20 20 20  Gosub,          
128c0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
128d0 73 74 65 72 20 66 6f 72 20 4f 50 5f 47 6f 73 75  ster for OP_Gosu
128e0 62 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 47  b */.  int addrG
128f0 6f 73 75 62 20 20 20 20 20 20 20 20 20 20 20 20  osub            
12900 20 20 20 20 20 20 20 2f 2a 20 4f 50 5f 47 6f 73         /* OP_Gos
12910 75 62 20 68 65 72 65 20 74 6f 20 72 65 74 75 72  ub here to retur
12920 6e 20 65 61 63 68 20 72 6f 77 20 2a 2f 0a 29 7b  n each row */.){
12930 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e  .  Window *pMWin
12940 20 3d 20 70 2d 3e 70 57 69 6e 3b 0a 20 20 45 78   = p->pWin;.  Ex
12950 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
12960 20 3d 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72   = pMWin->pOrder
12970 42 79 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  By;.  Vdbe *v = 
12980 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
12990 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 63 73  Parse);.  int cs
129a0 72 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20  rWrite;         
129b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
129c0 73 6f 72 20 75 73 65 64 20 74 6f 20 77 72 69 74  sor used to writ
129d0 65 20 74 6f 20 65 70 68 2e 20 74 61 62 6c 65 20  e to eph. table 
129e0 2a 2f 0a 20 20 69 6e 74 20 63 73 72 49 6e 70 75  */.  int csrInpu
129f0 74 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  t = p->pSrc->a[0
12a00 5d 2e 69 43 75 72 73 6f 72 3b 20 20 20 20 20 2f  ].iCursor;     /
12a10 2a 20 43 75 72 73 6f 72 20 6f 66 20 73 75 62 2d  * Cursor of sub-
12a20 73 65 6c 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  select */.  int 
12a30 6e 49 6e 70 75 74 20 3d 20 70 2d 3e 70 53 72 63  nInput = p->pSrc
12a40 2d 3e 61 5b 30 5d 2e 70 54 61 62 2d 3e 6e 43 6f  ->a[0].pTab->nCo
12a50 6c 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  l;    /* Number 
12a60 6f 66 20 63 6f 6c 73 20 72 65 74 75 72 6e 65 64  of cols returned
12a70 20 62 79 20 73 75 62 20 2a 2f 0a 20 20 69 6e 74   by sub */.  int
12a80 20 69 49 6e 70 75 74 3b 20 20 20 20 20 20 20 20   iInput;        
12a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12aa0 20 20 20 20 20 20 20 2f 2a 20 54 6f 20 69 74 65         /* To ite
12ab0 72 61 74 65 20 74 68 72 6f 75 67 68 20 73 75 62  rate through sub
12ac0 20 63 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 61   cols */.  int a
12ad0 64 64 72 4e 65 3b 20 20 20 20 20 20 20 20 20 20  ddrNe;          
12ae0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
12af0 64 72 65 73 73 20 6f 66 20 4f 50 5f 4e 65 20 2a  dress of OP_Ne *
12b00 2f 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75  /.  int addrGosu
12b10 62 46 6c 75 73 68 3b 20 20 20 20 20 20 20 20 20  bFlush;         
12b20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
12b30 66 20 4f 50 5f 47 6f 73 75 62 20 74 6f 20 66 6c  f OP_Gosub to fl
12b40 75 73 68 3a 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ush: */.  int ad
12b50 64 72 49 6e 74 65 67 65 72 3b 20 20 20 20 20 20  drInteger;      
12b60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
12b70 72 65 73 73 20 6f 66 20 4f 50 5f 49 6e 74 65 67  ress of OP_Integ
12b80 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  er */.  int addr
12b90 45 6d 70 74 79 3b 20 20 20 20 20 20 20 20 20 20  Empty;          
12ba0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
12bb0 73 73 20 6f 66 20 4f 50 5f 52 65 77 69 6e 64 20  ss of OP_Rewind 
12bc0 69 6e 20 66 6c 75 73 68 3a 20 2a 2f 0a 20 20 69  in flush: */.  i
12bd0 6e 74 20 72 65 67 53 74 61 72 74 20 3d 20 30 3b  nt regStart = 0;
12be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12bf0 2a 20 56 61 6c 75 65 20 6f 66 20 3c 65 78 70 72  * Value of <expr
12c00 3e 20 50 52 45 43 45 44 49 4e 47 20 2a 2f 0a 20  > PRECEDING */. 
12c10 20 69 6e 74 20 72 65 67 45 6e 64 20 3d 20 30 3b   int regEnd = 0;
12c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c30 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 3c 65 78   /* Value of <ex
12c40 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 2a 2f  pr> FOLLOWING */
12c50 0a 20 20 69 6e 74 20 72 65 67 4e 65 77 3b 20 20  .  int regNew;  
12c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c70 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 72     /* Array of r
12c80 65 67 69 73 74 65 72 73 20 68 6f 6c 64 69 6e 67  egisters holding
12c90 20 6e 65 77 20 69 6e 70 75 74 20 72 6f 77 20 2a   new input row *
12ca0 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72  /.  int regRecor
12cb0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
12cc0 20 20 20 20 2f 2a 20 72 65 67 4e 65 77 20 61 72      /* regNew ar
12cd0 72 61 79 20 69 6e 20 72 65 63 6f 72 64 20 66 6f  ray in record fo
12ce0 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52  rm */.  int regR
12cf0 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  owid;           
12d00 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64          /* Rowid
12d10 20 66 6f 72 20 72 65 67 52 65 63 6f 72 64 20 69   for regRecord i
12d20 6e 20 65 70 68 20 74 61 62 6c 65 20 2a 2f 0a 20  n eph table */. 
12d30 20 69 6e 74 20 72 65 67 4e 65 77 50 65 65 72 20   int regNewPeer 
12d40 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
12d50 20 2f 2a 20 50 65 65 72 20 76 61 6c 75 65 73 20   /* Peer values 
12d60 66 6f 72 20 6e 65 77 20 72 6f 77 20 28 70 61 72  for new row (par
12d70 74 20 6f 66 20 72 65 67 4e 65 77 29 20 2a 2f 0a  t of regNew) */.
12d80 20 20 69 6e 74 20 72 65 67 50 65 65 72 20 3d 20    int regPeer = 
12d90 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
12da0 20 20 2f 2a 20 50 65 65 72 20 76 61 6c 75 65 73    /* Peer values
12db0 20 66 6f 72 20 63 75 72 72 65 6e 74 20 72 6f 77   for current row
12dc0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 6c 75   */.  int regFlu
12dd0 73 68 50 61 72 74 20 3d 20 30 3b 20 20 20 20 20  shPart = 0;     
12de0 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
12df0 72 20 66 6f 72 20 22 47 6f 73 75 62 20 66 6c 75  r for "Gosub flu
12e00 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 20 2a 2f  sh_partition" */
12e10 0a 20 20 57 69 6e 64 6f 77 43 6f 64 65 41 72 67  .  WindowCodeArg
12e20 20 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   s;             
12e30 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 6f 62     /* Context ob
12e40 6a 65 63 74 20 66 6f 72 20 73 75 62 2d 72 6f 75  ject for sub-rou
12e50 74 69 6e 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6c  tines */.  int l
12e60 62 6c 57 68 65 72 65 45 6e 64 3b 20 20 20 20 20  blWhereEnd;     
12e70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
12e80 62 65 6c 20 6a 75 73 74 20 62 65 66 6f 72 65 20  bel just before 
12e90 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
12ea0 29 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73  ) code */..  ass
12eb0 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61  ert( pMWin->eSta
12ec0 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47  rt==TK_PRECEDING
12ed0 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72   || pMWin->eStar
12ee0 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 0a 20  t==TK_CURRENT . 
12ef0 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e        || pMWin->
12f00 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f  eStart==TK_FOLLO
12f10 57 49 4e 47 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65  WING || pMWin->e
12f20 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e  Start==TK_UNBOUN
12f30 44 45 44 20 0a 20 20 29 3b 0a 20 20 61 73 73 65  DED .  );.  asse
12f40 72 74 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d  rt( pMWin->eEnd=
12f50 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 7c 7c  =TK_FOLLOWING ||
12f60 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b   pMWin->eEnd==TK
12f70 5f 43 55 52 52 45 4e 54 20 0a 20 20 20 20 20 20  _CURRENT .      
12f80 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d   || pMWin->eEnd=
12f90 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 7c 7c  =TK_UNBOUNDED ||
12fa0 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b   pMWin->eEnd==TK
12fb0 5f 50 52 45 43 45 44 49 4e 47 20 0a 20 20 29 3b  _PRECEDING .  );
12fc0 0a 20 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e  .  assert( pMWin
12fd0 2d 3e 65 45 78 63 6c 75 64 65 3d 3d 30 20 7c 7c  ->eExclude==0 ||
12fe0 20 70 4d 57 69 6e 2d 3e 65 45 78 63 6c 75 64 65   pMWin->eExclude
12ff0 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 0a 20 20 20  ==TK_CURRENT.   
13000 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45      || pMWin->eE
13010 78 63 6c 75 64 65 3d 3d 54 4b 5f 47 52 4f 55 50  xclude==TK_GROUP
13020 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 78 63 6c   || pMWin->eExcl
13030 75 64 65 3d 3d 54 4b 5f 54 49 45 53 0a 20 20 20  ude==TK_TIES.   
13040 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45      || pMWin->eE
13050 78 63 6c 75 64 65 3d 3d 54 4b 5f 4e 4f 0a 20 20  xclude==TK_NO.  
13060 29 3b 0a 0a 20 20 6c 62 6c 57 68 65 72 65 45 6e  );..  lblWhereEn
13070 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
13080 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29  akeLabel(pParse)
13090 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20  ;..  /* Fill in 
130a0 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 62 6a 65  the context obje
130b0 63 74 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  ct */.  memset(&
130c0 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57 69 6e  s, 0, sizeof(Win
130d0 64 6f 77 43 6f 64 65 41 72 67 29 29 3b 0a 20 20  dowCodeArg));.  
130e0 73 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  s.pParse = pPars
130f0 65 3b 0a 20 20 73 2e 70 4d 57 69 6e 20 3d 20 70  e;.  s.pMWin = p
13100 4d 57 69 6e 3b 0a 20 20 73 2e 70 56 64 62 65 20  MWin;.  s.pVdbe 
13110 3d 20 76 3b 0a 20 20 73 2e 72 65 67 47 6f 73 75  = v;.  s.regGosu
13120 62 20 3d 20 72 65 67 47 6f 73 75 62 3b 0a 20 20  b = regGosub;.  
13130 73 2e 61 64 64 72 47 6f 73 75 62 20 3d 20 61 64  s.addrGosub = ad
13140 64 72 47 6f 73 75 62 3b 0a 20 20 73 2e 63 75 72  drGosub;.  s.cur
13150 72 65 6e 74 2e 63 73 72 20 3d 20 70 4d 57 69 6e  rent.csr = pMWin
13160 2d 3e 69 45 70 68 43 73 72 3b 0a 20 20 63 73 72  ->iEphCsr;.  csr
13170 57 72 69 74 65 20 3d 20 73 2e 63 75 72 72 65 6e  Write = s.curren
13180 74 2e 63 73 72 2b 31 3b 0a 20 20 73 2e 73 74 61  t.csr+1;.  s.sta
13190 72 74 2e 63 73 72 20 3d 20 73 2e 63 75 72 72 65  rt.csr = s.curre
131a0 6e 74 2e 63 73 72 2b 32 3b 0a 20 20 73 2e 65 6e  nt.csr+2;.  s.en
131b0 64 2e 63 73 72 20 3d 20 73 2e 63 75 72 72 65 6e  d.csr = s.curren
131c0 74 2e 63 73 72 2b 33 3b 0a 0a 20 20 2f 2a 20 46  t.csr+3;..  /* F
131d0 69 67 75 72 65 20 6f 75 74 20 77 68 65 6e 20 72  igure out when r
131e0 6f 77 73 20 6d 61 79 20 62 65 20 64 65 6c 65 74  ows may be delet
131f0 65 64 20 66 72 6f 6d 20 74 68 65 20 65 70 68 65  ed from the ephe
13200 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20 54 68 65  meral table. The
13210 72 65 0a 20 20 2a 2a 20 61 72 65 20 66 6f 75 72  re.  ** are four
13220 20 6f 70 74 69 6f 6e 73 20 2d 20 74 68 65 79 20   options - they 
13230 6d 61 79 20 6e 65 76 65 72 20 62 65 20 64 65 6c  may never be del
13240 65 74 65 64 20 28 65 44 65 6c 65 74 65 3d 3d 30  eted (eDelete==0
13250 29 2c 20 74 68 65 79 20 6d 61 79 20 0a 20 20 2a  ), they may .  *
13260 2a 20 62 65 20 64 65 6c 65 74 65 64 20 61 73 20  * be deleted as 
13270 73 6f 6f 6e 20 61 73 20 74 68 65 79 20 61 72 65  soon as they are
13280 20 6e 6f 20 6c 6f 6e 67 65 72 20 70 61 72 74 20   no longer part 
13290 6f 66 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72  of the window fr
132a0 61 6d 65 0a 20 20 2a 2a 20 28 65 44 65 6c 65 74  ame.  ** (eDelet
132b0 65 3d 3d 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56  e==WINDOW_AGGINV
132c0 45 52 53 45 29 2c 20 74 68 65 79 20 6d 61 79 20  ERSE), they may 
132d0 62 65 20 64 65 6c 65 74 65 64 20 61 73 20 61 66  be deleted as af
132e0 74 65 72 20 74 68 65 20 72 6f 77 20 0a 20 20 2a  ter the row .  *
132f0 2a 20 68 61 73 20 62 65 65 6e 20 72 65 74 75 72  * has been retur
13300 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ned to the calle
13310 72 20 28 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e  r (WINDOW_RETURN
13320 5f 52 4f 57 29 2c 20 6f 72 20 74 68 65 79 20 6d  _ROW), or they m
13330 61 79 0a 20 20 2a 2a 20 62 65 20 64 65 6c 65 74  ay.  ** be delet
13340 65 64 20 61 66 74 65 72 20 74 68 65 79 20 65 6e  ed after they en
13350 74 65 72 20 74 68 65 20 66 72 61 6d 65 20 28 57  ter the frame (W
13360 49 4e 44 4f 57 5f 41 47 47 53 54 45 50 29 2e 20  INDOW_AGGSTEP). 
13370 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70 4d 57  */.  switch( pMW
13380 69 6e 2d 3e 65 53 74 61 72 74 20 29 7b 0a 20 20  in->eStart ){.  
13390 20 20 63 61 73 65 20 54 4b 5f 46 4f 4c 4c 4f 57    case TK_FOLLOW
133a0 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ING: {.      if(
133b0 20 70 4d 57 69 6e 2d 3e 65 54 79 70 65 21 3d 54   pMWin->eType!=T
133c0 4b 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20  K_RANGE ){.     
133d0 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
133e0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20   pParse->db;.   
133f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
13400 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20 20  ue *pVal = 0;.  
13410 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c        sqlite3Val
13420 75 65 46 72 6f 6d 45 78 70 72 28 64 62 2c 70 4d  ueFromExpr(db,pM
13430 57 69 6e 2d 3e 70 53 74 61 72 74 2c 64 62 2d 3e  Win->pStart,db->
13440 65 6e 63 2c 53 51 4c 49 54 45 5f 41 46 46 5f 4e  enc,SQLITE_AFF_N
13450 55 4d 45 52 49 43 2c 26 70 56 61 6c 29 3b 0a 20  UMERIC,&pVal);. 
13460 20 20 20 20 20 20 20 69 66 28 20 70 56 61 6c 20         if( pVal 
13470 26 26 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  && sqlite3_value
13480 5f 69 6e 74 28 70 56 61 6c 29 3e 30 20 29 7b 0a  _int(pVal)>0 ){.
13490 20 20 20 20 20 20 20 20 20 20 73 2e 65 44 65 6c            s.eDel
134a0 65 74 65 20 3d 20 57 49 4e 44 4f 57 5f 52 45 54  ete = WINDOW_RET
134b0 55 52 4e 5f 52 4f 57 3b 0a 20 20 20 20 20 20 20  URN_ROW;.       
134c0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
134d0 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c  e3ValueFree(pVal
134e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
134f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
13500 20 20 63 61 73 65 20 54 4b 5f 55 4e 42 4f 55 4e    case TK_UNBOUN
13510 44 45 44 3a 0a 20 20 20 20 20 20 69 66 28 20 77  DED:.      if( w
13520 69 6e 64 6f 77 43 61 63 68 65 46 72 61 6d 65 28  indowCacheFrame(
13530 70 4d 57 69 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  pMWin)==0 ){.   
13540 20 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e       if( pMWin->
13550 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49  eEnd==TK_PRECEDI
13560 4e 47 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NG ){.          
13570 73 2e 65 44 65 6c 65 74 65 20 3d 20 57 49 4e 44  s.eDelete = WIND
13580 4f 57 5f 41 47 47 53 54 45 50 3b 0a 20 20 20 20  OW_AGGSTEP;.    
13590 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
135a0 20 20 20 20 20 73 2e 65 44 65 6c 65 74 65 20 3d       s.eDelete =
135b0 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52   WINDOW_RETURN_R
135c0 4f 57 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OW;.        }.  
135d0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
135e0 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  k;.    default:.
135f0 20 20 20 20 20 20 73 2e 65 44 65 6c 65 74 65 20        s.eDelete 
13600 3d 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45  = WINDOW_AGGINVE
13610 52 53 45 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  RSE;.      break
13620 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  ;.  }..  /* Allo
13630 63 61 74 65 20 72 65 67 69 73 74 65 72 73 20 66  cate registers f
13640 6f 72 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  or the array of 
13650 76 61 6c 75 65 73 20 66 72 6f 6d 20 74 68 65 20  values from the 
13660 73 75 62 2d 71 75 65 72 79 2c 20 74 68 65 0a 20  sub-query, the. 
13670 20 2a 2a 20 73 61 6d 76 65 20 76 61 6c 75 65 73   ** samve values
13680 20 69 6e 20 72 65 63 6f 72 64 20 66 6f 72 6d 2c   in record form,
13690 20 61 6e 64 20 74 68 65 20 72 6f 77 69 64 20 75   and the rowid u
136a0 73 65 64 20 74 6f 20 69 6e 73 65 72 74 20 73 61  sed to insert sa
136b0 69 64 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 69  id record.  ** i
136c0 6e 74 6f 20 74 68 65 20 65 70 68 65 6d 65 72 61  nto the ephemera
136d0 6c 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 72  l table.  */.  r
136e0 65 67 4e 65 77 20 3d 20 70 50 61 72 73 65 2d 3e  egNew = pParse->
136f0 6e 4d 65 6d 2b 31 3b 0a 20 20 70 50 61 72 73 65  nMem+1;.  pParse
13700 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 49 6e 70 75 74  ->nMem += nInput
13710 3b 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20  ;.  regRecord = 
13720 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
13730 20 20 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70    regRowid = ++p
13740 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20  Parse->nMem;..  
13750 2f 2a 20 49 66 20 74 68 65 20 77 69 6e 64 6f 77  /* If the window
13760 20 66 72 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20   frame contains 
13770 61 6e 20 22 3c 65 78 70 72 3e 20 50 52 45 43 45  an "<expr> PRECE
13780 44 49 4e 47 22 20 6f 72 20 22 3c 65 78 70 72 3e  DING" or "<expr>
13790 20 46 4f 4c 4c 4f 57 49 4e 47 22 0a 20 20 2a 2a   FOLLOWING".  **
137a0 20 63 6c 61 75 73 65 2c 20 61 6c 6c 6f 63 61 74   clause, allocat
137b0 65 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 73  e registers to s
137c0 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
137d0 20 6f 66 20 65 76 61 6c 75 61 74 69 6e 67 20 65   of evaluating e
137e0 61 63 68 0a 20 20 2a 2a 20 3c 65 78 70 72 3e 2e  ach.  ** <expr>.
137f0 20 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e    */.  if( pMWin
13800 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45  ->eStart==TK_PRE
13810 43 45 44 49 4e 47 20 7c 7c 20 70 4d 57 69 6e 2d  CEDING || pMWin-
13820 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c  >eStart==TK_FOLL
13830 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 72 65 67  OWING ){.    reg
13840 53 74 61 72 74 20 3d 20 2b 2b 70 50 61 72 73 65  Start = ++pParse
13850 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66  ->nMem;.  }.  if
13860 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54  ( pMWin->eEnd==T
13870 4b 5f 50 52 45 43 45 44 49 4e 47 20 7c 7c 20 70  K_PRECEDING || p
13880 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46  MWin->eEnd==TK_F
13890 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20  OLLOWING ){.    
138a0 72 65 67 45 6e 64 20 3d 20 2b 2b 70 50 61 72 73  regEnd = ++pPars
138b0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 0a 20 20  e->nMem;.  }..  
138c0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  /* If this is no
138d0 74 20 61 20 22 52 4f 57 53 20 42 45 54 57 45 45  t a "ROWS BETWEE
138e0 4e 20 2e 2e 2e 22 20 66 72 61 6d 65 2c 20 74 68  N ..." frame, th
138f0 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 72 72 61  en allocate arra
13900 79 73 20 6f 66 0a 20 20 2a 2a 20 72 65 67 69 73  ys of.  ** regis
13910 74 65 72 73 20 74 6f 20 73 74 6f 72 65 20 63 6f  ters to store co
13920 70 69 65 73 20 6f 66 20 74 68 65 20 4f 52 44 45  pies of the ORDE
13930 52 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 73  R BY expressions
13940 20 28 70 65 65 72 20 76 61 6c 75 65 73 29 20 0a   (peer values) .
13950 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6d 61 69    ** for the mai
13960 6e 20 6c 6f 6f 70 2c 20 61 6e 64 20 66 6f 72 20  n loop, and for 
13970 65 61 63 68 20 63 75 72 73 6f 72 20 28 73 74 61  each cursor (sta
13980 72 74 2c 20 63 75 72 72 65 6e 74 20 61 6e 64 20  rt, current and 
13990 65 6e 64 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70  end). */.  if( p
139a0 4d 57 69 6e 2d 3e 65 54 79 70 65 21 3d 54 4b 5f  MWin->eType!=TK_
139b0 52 4f 57 53 20 29 7b 0a 20 20 20 20 69 6e 74 20  ROWS ){.    int 
139c0 6e 50 65 65 72 20 3d 20 28 70 4f 72 64 65 72 42  nPeer = (pOrderB
139d0 79 20 3f 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  y ? pOrderBy->nE
139e0 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 72 65  xpr : 0);.    re
139f0 67 4e 65 77 50 65 65 72 20 3d 20 72 65 67 4e 65  gNewPeer = regNe
13a00 77 20 2b 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66  w + pMWin->nBuff
13a10 65 72 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 70  erCol;.    if( p
13a20 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e  MWin->pPartition
13a30 20 29 20 72 65 67 4e 65 77 50 65 65 72 20 2b 3d   ) regNewPeer +=
13a40 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69   pMWin->pPartiti
13a50 6f 6e 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 72  on->nExpr;.    r
13a60 65 67 50 65 65 72 20 3d 20 70 50 61 72 73 65 2d  egPeer = pParse-
13a70 3e 6e 4d 65 6d 2b 31 3b 20 20 20 20 20 20 20 70  >nMem+1;       p
13a80 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
13a90 50 65 65 72 3b 0a 20 20 20 20 73 2e 73 74 61 72  Peer;.    s.star
13aa0 74 2e 72 65 67 20 3d 20 70 50 61 72 73 65 2d 3e  t.reg = pParse->
13ab0 6e 4d 65 6d 2b 31 3b 20 20 20 70 50 61 72 73 65  nMem+1;   pParse
13ac0 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 65 65 72 3b  ->nMem += nPeer;
13ad0 0a 20 20 20 20 73 2e 63 75 72 72 65 6e 74 2e 72  .    s.current.r
13ae0 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  eg = pParse->nMe
13af0 6d 2b 31 3b 20 70 50 61 72 73 65 2d 3e 6e 4d 65  m+1; pParse->nMe
13b00 6d 20 2b 3d 20 6e 50 65 65 72 3b 0a 20 20 20 20  m += nPeer;.    
13b10 73 2e 65 6e 64 2e 72 65 67 20 3d 20 70 50 61 72  s.end.reg = pPar
13b20 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 20 20 20 20 20  se->nMem+1;     
13b30 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
13b40 6e 50 65 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  nPeer;.  }..  /*
13b50 20 4c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e   Load the column
13b60 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20   values for the 
13b70 72 6f 77 20 72 65 74 75 72 6e 65 64 20 62 79 20  row returned by 
13b80 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 0a 20  the sub-select. 
13b90 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 61 72 72 61   ** into an arra
13ba0 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 73  y of registers s
13bb0 74 61 72 74 69 6e 67 20 61 74 20 72 65 67 4e 65  tarting at regNe
13bc0 77 2e 20 41 73 73 65 6d 62 6c 65 20 74 68 65 6d  w. Assemble them
13bd0 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 72 65 63   into.  ** a rec
13be0 6f 72 64 20 69 6e 20 72 65 67 69 73 74 65 72 20  ord in register 
13bf0 72 65 67 52 65 63 6f 72 64 2e 20 2a 2f 0a 20 20  regRecord. */.  
13c00 66 6f 72 28 69 49 6e 70 75 74 3d 30 3b 20 69 49  for(iInput=0; iI
13c10 6e 70 75 74 3c 6e 49 6e 70 75 74 3b 20 69 49 6e  nput<nInput; iIn
13c20 70 75 74 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  put++){.    sqli
13c30 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
13c40 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 49   OP_Column, csrI
13c50 6e 70 75 74 2c 20 69 49 6e 70 75 74 2c 20 72 65  nput, iInput, re
13c60 67 4e 65 77 2b 69 49 6e 70 75 74 29 3b 0a 20 20  gNew+iInput);.  
13c70 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
13c80 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
13c90 52 65 63 6f 72 64 2c 20 72 65 67 4e 65 77 2c 20  Record, regNew, 
13ca0 6e 49 6e 70 75 74 2c 20 72 65 67 52 65 63 6f 72  nInput, regRecor
13cb0 64 29 3b 0a 0a 20 20 2f 2a 20 41 6e 20 69 6e 70  d);..  /* An inp
13cc0 75 74 20 72 6f 77 20 68 61 73 20 6a 75 73 74 20  ut row has just 
13cd0 62 65 65 6e 20 72 65 61 64 20 69 6e 74 6f 20 61  been read into a
13ce0 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73  n array of regis
13cf0 74 65 72 73 20 73 74 61 72 74 69 6e 67 0a 20 20  ters starting.  
13d00 2a 2a 20 61 74 20 72 65 67 4e 65 77 2e 20 49 66  ** at regNew. If
13d10 20 74 68 65 20 77 69 6e 64 6f 77 20 68 61 73 20   the window has 
13d20 61 20 50 41 52 54 49 54 49 4f 4e 20 63 6c 61 75  a PARTITION clau
13d30 73 65 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20 67  se, this block g
13d40 65 6e 65 72 61 74 65 73 20 0a 20 20 2a 2a 20 56  enerates .  ** V
13d50 4d 20 63 6f 64 65 20 74 6f 20 63 68 65 63 6b 20  M code to check 
13d60 69 66 20 74 68 65 20 69 6e 70 75 74 20 72 6f 77  if the input row
13d70 20 69 73 20 74 68 65 20 73 74 61 72 74 20 6f 66   is the start of
13d80 20 61 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e   a new partition
13d90 2e 0a 20 20 2a 2a 20 49 66 20 73 6f 2c 20 69 74  ..  ** If so, it
13da0 20 64 6f 65 73 20 61 6e 20 4f 50 5f 47 6f 73 75   does an OP_Gosu
13db0 62 20 74 6f 20 61 6e 20 61 64 64 72 65 73 73 20  b to an address 
13dc0 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 69 6e 20  to be filled in 
13dd0 6c 61 74 65 72 2e 20 54 68 65 0a 20 20 2a 2a 20  later. The.  ** 
13de0 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f  address of the O
13df0 50 5f 47 6f 73 75 62 20 69 73 20 73 74 6f 72 65  P_Gosub is store
13e00 64 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61  d in local varia
13e10 62 6c 65 20 61 64 64 72 47 6f 73 75 62 46 6c 75  ble addrGosubFlu
13e20 73 68 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57  sh. */.  if( pMW
13e30 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 29  in->pPartition )
13e40 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a  {.    int addr;.
13e50 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 50      ExprList *pP
13e60 61 72 74 20 3d 20 70 4d 57 69 6e 2d 3e 70 50 61  art = pMWin->pPa
13e70 72 74 69 74 69 6f 6e 3b 0a 20 20 20 20 69 6e 74  rtition;.    int
13e80 20 6e 50 61 72 74 20 3d 20 70 50 61 72 74 2d 3e   nPart = pPart->
13e90 6e 45 78 70 72 3b 0a 20 20 20 20 69 6e 74 20 72  nExpr;.    int r
13ea0 65 67 4e 65 77 50 61 72 74 20 3d 20 72 65 67 4e  egNewPart = regN
13eb0 65 77 20 2b 20 70 4d 57 69 6e 2d 3e 6e 42 75 66  ew + pMWin->nBuf
13ec0 66 65 72 43 6f 6c 3b 0a 20 20 20 20 4b 65 79 49  ferCol;.    KeyI
13ed0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
13ee0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72  sqlite3KeyInfoFr
13ef0 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
13f00 65 2c 20 70 50 61 72 74 2c 20 30 2c 20 30 29 3b  e, pPart, 0, 0);
13f10 0a 0a 20 20 20 20 72 65 67 46 6c 75 73 68 50 61  ..    regFlushPa
13f20 72 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rt = ++pParse->n
13f30 4d 65 6d 3b 0a 20 20 20 20 61 64 64 72 20 3d 20  Mem;.    addr = 
13f40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13f50 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  3(v, OP_Compare,
13f60 20 72 65 67 4e 65 77 50 61 72 74 2c 20 70 4d 57   regNewPart, pMW
13f70 69 6e 2d 3e 72 65 67 50 61 72 74 2c 20 6e 50 61  in->regPart, nPa
13f80 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rt);.    sqlite3
13f90 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20  VdbeAppendP4(v, 
13fa0 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2c  (void*)pKeyInfo,
13fb0 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
13fc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13fd0 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
13fe0 61 64 64 72 2b 32 2c 20 61 64 64 72 2b 34 2c 20  addr+2, addr+4, 
13ff0 61 64 64 72 2b 32 29 3b 0a 20 20 20 20 56 64 62  addr+2);.    Vdb
14000 65 43 6f 76 65 72 61 67 65 45 71 4e 65 28 76 29  eCoverageEqNe(v)
14010 3b 0a 20 20 20 20 61 64 64 72 47 6f 73 75 62 46  ;.    addrGosubF
14020 6c 75 73 68 20 3d 20 73 71 6c 69 74 65 33 56 64  lush = sqlite3Vd
14030 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 47  beAddOp1(v, OP_G
14040 6f 73 75 62 2c 20 72 65 67 46 6c 75 73 68 50 61  osub, regFlushPa
14050 72 74 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  rt);.    VdbeCom
14060 6d 65 6e 74 28 28 76 2c 20 22 63 61 6c 6c 20 66  ment((v, "call f
14070 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 29  lush_partition")
14080 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
14090 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
140a0 6f 70 79 2c 20 72 65 67 4e 65 77 50 61 72 74 2c  opy, regNewPart,
140b0 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c   pMWin->regPart,
140c0 20 6e 50 61 72 74 2d 31 29 3b 0a 20 20 7d 0a 0a   nPart-1);.  }..
140d0 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20    /* Insert the 
140e0 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20 74 68 65  new row into the
140f0 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
14100 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
14110 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
14120 77 52 6f 77 69 64 2c 20 63 73 72 57 72 69 74 65  wRowid, csrWrite
14130 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 73  , regRowid);.  s
14140 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
14150 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 63  (v, OP_Insert, c
14160 73 72 57 72 69 74 65 2c 20 72 65 67 52 65 63 6f  srWrite, regReco
14170 72 64 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  rd, regRowid);. 
14180 20 61 64 64 72 4e 65 20 3d 20 73 71 6c 69 74 65   addrNe = sqlite
14190 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
141a0 50 5f 4e 65 2c 20 70 4d 57 69 6e 2d 3e 72 65 67  P_Ne, pMWin->reg
141b0 4f 6e 65 2c 20 30 2c 20 72 65 67 52 6f 77 69 64  One, 0, regRowid
141c0 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c  );..  /* This bl
141d0 6f 63 6b 20 69 73 20 72 75 6e 20 66 6f 72 20 74  ock is run for t
141e0 68 65 20 66 69 72 73 74 20 72 6f 77 20 6f 66 20  he first row of 
141f0 65 61 63 68 20 70 61 72 74 69 74 69 6f 6e 20 2a  each partition *
14200 2f 0a 20 20 73 2e 72 65 67 41 72 67 20 3d 20 77  /.  s.regArg = w
14210 69 6e 64 6f 77 49 6e 69 74 41 63 63 75 6d 28 70  indowInitAccum(p
14220 50 61 72 73 65 2c 20 70 4d 57 69 6e 29 3b 0a 0a  Parse, pMWin);..
14230 20 20 69 66 28 20 72 65 67 53 74 61 72 74 20 29    if( regStart )
14240 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
14250 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4d  rCode(pParse, pM
14260 57 69 6e 2d 3e 70 53 74 61 72 74 2c 20 72 65 67  Win->pStart, reg
14270 53 74 61 72 74 29 3b 0a 20 20 20 20 77 69 6e 64  Start);.    wind
14280 6f 77 43 68 65 63 6b 56 61 6c 75 65 28 70 50 61  owCheckValue(pPa
14290 72 73 65 2c 20 72 65 67 53 74 61 72 74 2c 20 30  rse, regStart, 0
142a0 20 2b 20 28 70 4d 57 69 6e 2d 3e 65 54 79 70 65   + (pMWin->eType
142b0 3d 3d 54 4b 5f 52 41 4e 47 45 20 3f 20 33 20 3a  ==TK_RANGE ? 3 :
142c0 20 30 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20   0));.  }.  if( 
142d0 72 65 67 45 6e 64 20 29 7b 0a 20 20 20 20 73 71  regEnd ){.    sq
142e0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
142f0 61 72 73 65 2c 20 70 4d 57 69 6e 2d 3e 70 45 6e  arse, pMWin->pEn
14300 64 2c 20 72 65 67 45 6e 64 29 3b 0a 20 20 20 20  d, regEnd);.    
14310 77 69 6e 64 6f 77 43 68 65 63 6b 56 61 6c 75 65  windowCheckValue
14320 28 70 50 61 72 73 65 2c 20 72 65 67 45 6e 64 2c  (pParse, regEnd,
14330 20 31 20 2b 20 28 70 4d 57 69 6e 2d 3e 65 54 79   1 + (pMWin->eTy
14340 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 3f 20 33  pe==TK_RANGE ? 3
14350 20 3a 20 30 29 29 3b 0a 20 20 7d 0a 0a 20 20 69   : 0));.  }..  i
14360 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  f( pMWin->eStart
14370 3d 3d 70 4d 57 69 6e 2d 3e 65 45 6e 64 20 26 26  ==pMWin->eEnd &&
14380 20 72 65 67 53 74 61 72 74 20 29 7b 0a 20 20 20   regStart ){.   
14390 20 69 6e 74 20 6f 70 20 3d 20 28 28 70 4d 57 69   int op = ((pMWi
143a0 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f  n->eStart==TK_FO
143b0 4c 4c 4f 57 49 4e 47 29 20 3f 20 4f 50 5f 47 65  LLOWING) ? OP_Ge
143c0 20 3a 20 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 69   : OP_Le);.    i
143d0 6e 74 20 61 64 64 72 47 65 20 3d 20 73 71 6c 69  nt addrGe = sqli
143e0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
143f0 20 6f 70 2c 20 72 65 67 53 74 61 72 74 2c 20 30   op, regStart, 0
14400 2c 20 72 65 67 45 6e 64 29 3b 0a 20 20 20 20 77  , regEnd);.    w
14410 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 26 73  indowAggFinal(&s
14420 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
14430 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14440 50 5f 52 65 77 69 6e 64 2c 20 73 2e 63 75 72 72  P_Rewind, s.curr
14450 65 6e 74 2e 63 73 72 2c 20 31 29 3b 0a 20 20 20  ent.csr, 1);.   
14460 20 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65   windowReturnOne
14470 52 6f 77 28 26 73 29 3b 0a 20 20 20 20 73 71 6c  Row(&s);.    sql
14480 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
14490 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72  , OP_ResetSorter
144a0 2c 20 73 2e 63 75 72 72 65 6e 74 2e 63 73 72 29  , s.current.csr)
144b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
144c0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
144d0 74 6f 2c 20 30 2c 20 6c 62 6c 57 68 65 72 65 45  to, 0, lblWhereE
144e0 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  nd);.    sqlite3
144f0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
14500 61 64 64 72 47 65 29 3b 0a 20 20 7d 0a 20 20 69  addrGe);.  }.  i
14510 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  f( pMWin->eStart
14520 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 26  ==TK_FOLLOWING &
14530 26 20 70 4d 57 69 6e 2d 3e 65 54 79 70 65 21 3d  & pMWin->eType!=
14540 54 4b 5f 52 41 4e 47 45 20 26 26 20 72 65 67 45  TK_RANGE && regE
14550 6e 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  nd ){.    assert
14560 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54  ( pMWin->eEnd==T
14570 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 3b 0a 20  K_FOLLOWING );. 
14580 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14590 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74 72  dOp3(v, OP_Subtr
145a0 61 63 74 2c 20 72 65 67 53 74 61 72 74 2c 20 72  act, regStart, r
145b0 65 67 45 6e 64 2c 20 72 65 67 53 74 61 72 74 29  egEnd, regStart)
145c0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4d 57  ;.  }..  if( pMW
145d0 69 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b 5f 55  in->eStart!=TK_U
145e0 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20 20  NBOUNDED ){.    
145f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14600 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
14610 73 2e 73 74 61 72 74 2e 63 73 72 2c 20 31 29 3b  s.start.csr, 1);
14620 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
14630 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
14640 65 77 69 6e 64 2c 20 73 2e 63 75 72 72 65 6e 74  ewind, s.current
14650 2e 63 73 72 2c 20 31 29 3b 0a 20 20 73 71 6c 69  .csr, 1);.  sqli
14660 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14670 20 4f 50 5f 52 65 77 69 6e 64 2c 20 73 2e 65 6e   OP_Rewind, s.en
14680 64 2e 63 73 72 2c 20 31 29 3b 0a 20 20 69 66 28  d.csr, 1);.  if(
14690 20 72 65 67 50 65 65 72 20 26 26 20 70 4f 72 64   regPeer && pOrd
146a0 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  erBy ){.    sqli
146b0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
146c0 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4e 65 77   OP_Copy, regNew
146d0 50 65 65 72 2c 20 72 65 67 50 65 65 72 2c 20 70  Peer, regPeer, p
146e0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31  OrderBy->nExpr-1
146f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
14700 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
14710 6f 70 79 2c 20 72 65 67 50 65 65 72 2c 20 73 2e  opy, regPeer, s.
14720 73 74 61 72 74 2e 72 65 67 2c 20 70 4f 72 64 65  start.reg, pOrde
14730 72 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20  rBy->nExpr-1);. 
14740 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14750 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp3(v, OP_Copy,
14760 20 72 65 67 50 65 65 72 2c 20 73 2e 63 75 72 72   regPeer, s.curr
14770 65 6e 74 2e 72 65 67 2c 20 70 4f 72 64 65 72 42  ent.reg, pOrderB
14780 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20  y->nExpr-1);.   
14790 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
147a0 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p3(v, OP_Copy, r
147b0 65 67 50 65 65 72 2c 20 73 2e 65 6e 64 2e 72 65  egPeer, s.end.re
147c0 67 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  g, pOrderBy->nEx
147d0 70 72 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  pr-1);.  }..  sq
147e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
147f0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c  v, OP_Goto, 0, l
14800 62 6c 57 68 65 72 65 45 6e 64 29 3b 0a 0a 20 20  blWhereEnd);..  
14810 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
14820 65 72 65 28 76 2c 20 61 64 64 72 4e 65 29 3b 0a  ere(v, addrNe);.
14830 20 20 69 66 28 20 72 65 67 50 65 65 72 20 29 7b    if( regPeer ){
14840 0a 20 20 20 20 77 69 6e 64 6f 77 49 66 4e 65 77  .    windowIfNew
14850 50 65 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72  Peer(pParse, pOr
14860 64 65 72 42 79 2c 20 72 65 67 4e 65 77 50 65 65  derBy, regNewPee
14870 72 2c 20 72 65 67 50 65 65 72 2c 20 6c 62 6c 57  r, regPeer, lblW
14880 68 65 72 65 45 6e 64 29 3b 0a 20 20 7d 0a 20 20  hereEnd);.  }.  
14890 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72  if( pMWin->eStar
148a0 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  t==TK_FOLLOWING 
148b0 29 7b 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f 64  ){.    windowCod
148c0 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41  eOp(&s, WINDOW_A
148d0 47 47 53 54 45 50 2c 20 30 2c 20 30 29 3b 0a 20  GGSTEP, 0, 0);. 
148e0 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45     if( pMWin->eE
148f0 6e 64 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  nd!=TK_UNBOUNDED
14900 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4d   ){.      if( pM
14910 57 69 6e 2d 3e 65 54 79 70 65 3d 3d 54 4b 5f 52  Win->eType==TK_R
14920 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20  ANGE ){.        
14930 69 6e 74 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65  int lbl = sqlite
14940 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70  3VdbeMakeLabel(p
14950 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
14960 69 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20 73  int addrNext = s
14970 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
14980 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
14990 20 20 77 69 6e 64 6f 77 43 6f 64 65 52 61 6e 67    windowCodeRang
149a0 65 54 65 73 74 28 26 73 2c 20 4f 50 5f 47 65 2c  eTest(&s, OP_Ge,
149b0 20 73 2e 63 75 72 72 65 6e 74 2e 63 73 72 2c 20   s.current.csr, 
149c0 72 65 67 45 6e 64 2c 20 73 2e 65 6e 64 2e 63 73  regEnd, s.end.cs
149d0 72 2c 20 6c 62 6c 29 3b 0a 20 20 20 20 20 20 20  r, lbl);.       
149e0 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73   windowCodeOp(&s
149f0 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45  , WINDOW_AGGINVE
14a00 52 53 45 2c 20 72 65 67 53 74 61 72 74 2c 20 30  RSE, regStart, 0
14a10 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f  );.        windo
14a20 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44  wCodeOp(&s, WIND
14a30 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 30  OW_RETURN_ROW, 0
14a40 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
14a50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14a60 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
14a70 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 20 20  ddrNext);.      
14a80 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
14a90 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c  olveLabel(v, lbl
14aa0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
14ab0 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f          windowCo
14ac0 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f  deOp(&s, WINDOW_
14ad0 52 45 54 55 52 4e 5f 52 4f 57 2c 20 72 65 67 45  RETURN_ROW, regE
14ae0 6e 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nd, 0);.        
14af0 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c  windowCodeOp(&s,
14b00 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52   WINDOW_AGGINVER
14b10 53 45 2c 20 72 65 67 53 74 61 72 74 2c 20 30 29  SE, regStart, 0)
14b20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14b30 20 20 7d 65 6c 73 65 0a 20 20 69 66 28 20 70 4d    }else.  if( pM
14b40 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52  Win->eEnd==TK_PR
14b50 45 43 45 44 49 4e 47 20 29 7b 0a 20 20 20 20 77  ECEDING ){.    w
14b60 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20  indowCodeOp(&s, 
14b70 57 49 4e 44 4f 57 5f 41 47 47 53 54 45 50 2c 20  WINDOW_AGGSTEP, 
14b80 72 65 67 45 6e 64 2c 20 30 29 3b 0a 20 20 20 20  regEnd, 0);.    
14b90 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c  windowCodeOp(&s,
14ba0 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52   WINDOW_RETURN_R
14bb0 4f 57 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 77  OW, 0, 0);.    w
14bc0 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20  indowCodeOp(&s, 
14bd0 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53  WINDOW_AGGINVERS
14be0 45 2c 20 72 65 67 53 74 61 72 74 2c 20 30 29 3b  E, regStart, 0);
14bf0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
14c00 74 20 61 64 64 72 3b 0a 20 20 20 20 77 69 6e 64  t addr;.    wind
14c10 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e  owCodeOp(&s, WIN
14c20 44 4f 57 5f 41 47 47 53 54 45 50 2c 20 30 2c 20  DOW_AGGSTEP, 0, 
14c30 30 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 57 69  0);.    if( pMWi
14c40 6e 2d 3e 65 45 6e 64 21 3d 54 4b 5f 55 4e 42 4f  n->eEnd!=TK_UNBO
14c50 55 4e 44 45 44 20 29 7b 0a 20 20 20 20 20 20 69  UNDED ){.      i
14c60 66 28 20 70 4d 57 69 6e 2d 3e 65 54 79 70 65 3d  f( pMWin->eType=
14c70 3d 54 4b 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20  =TK_RANGE ){.   
14c80 20 20 20 20 20 69 6e 74 20 6c 62 6c 3b 0a 20 20       int lbl;.  
14c90 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
14ca0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
14cb0 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20  ddr(v);.        
14cc0 69 66 28 20 72 65 67 45 6e 64 20 29 7b 0a 20 20  if( regEnd ){.  
14cd0 20 20 20 20 20 20 20 20 6c 62 6c 20 3d 20 73 71          lbl = sq
14ce0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
14cf0 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  el(pParse);.    
14d00 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65        windowCode
14d10 52 61 6e 67 65 54 65 73 74 28 26 73 2c 20 4f 50  RangeTest(&s, OP
14d20 5f 47 65 2c 20 73 2e 63 75 72 72 65 6e 74 2e 63  _Ge, s.current.c
14d30 73 72 2c 20 72 65 67 45 6e 64 2c 20 73 2e 65 6e  sr, regEnd, s.en
14d40 64 2e 63 73 72 2c 20 6c 62 6c 29 3b 0a 20 20 20  d.csr, lbl);.   
14d50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 77       }.        w
14d60 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20  indowCodeOp(&s, 
14d70 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f  WINDOW_RETURN_RO
14d80 57 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  W, 0, 0);.      
14d90 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26    windowCodeOp(&
14da0 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56  s, WINDOW_AGGINV
14db0 45 52 53 45 2c 20 72 65 67 53 74 61 72 74 2c 20  ERSE, regStart, 
14dc0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
14dd0 72 65 67 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  regEnd ){.      
14de0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14df0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
14e00 2c 20 30 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  , 0, addr);.    
14e10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14e20 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
14e30 20 6c 62 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d   lbl);.        }
14e40 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
14e50 20 20 20 20 20 20 69 66 28 20 72 65 67 45 6e 64        if( regEnd
14e60 20 29 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65   ) addr = sqlite
14e70 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
14e80 50 5f 49 66 50 6f 73 2c 20 72 65 67 45 6e 64 2c  P_IfPos, regEnd,
14e90 20 30 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20   0, 1);.        
14ea0 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c  windowCodeOp(&s,
14eb0 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52   WINDOW_RETURN_R
14ec0 4f 57 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  OW, 0, 0);.     
14ed0 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28     windowCodeOp(
14ee0 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e  &s, WINDOW_AGGIN
14ef0 56 45 52 53 45 2c 20 72 65 67 53 74 61 72 74 2c  VERSE, regStart,
14f00 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
14f10 20 72 65 67 45 6e 64 20 29 20 73 71 6c 69 74 65   regEnd ) sqlite
14f20 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
14f30 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a   addr);.      }.
14f40 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
14f50 45 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  End of the main 
14f60 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20  input loop */.  
14f70 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
14f80 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 57 68  veLabel(v, lblWh
14f90 65 72 65 45 6e 64 29 3b 0a 20 20 73 71 6c 69 74  ereEnd);.  sqlit
14fa0 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
14fb0 6f 29 3b 0a 0a 20 20 2f 2a 20 46 61 6c 6c 20 74  o);..  /* Fall t
14fc0 68 72 6f 75 67 68 20 2a 2f 0a 20 20 69 66 28 20  hrough */.  if( 
14fd0 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f  pMWin->pPartitio
14fe0 6e 20 29 7b 0a 20 20 20 20 61 64 64 72 49 6e 74  n ){.    addrInt
14ff0 65 67 65 72 20 3d 20 73 71 6c 69 74 65 33 56 64  eger = sqlite3Vd
15000 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
15010 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 46 6c  nteger, 0, regFl
15020 75 73 68 50 61 72 74 29 3b 0a 20 20 20 20 73 71  ushPart);.    sq
15030 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
15040 65 28 76 2c 20 61 64 64 72 47 6f 73 75 62 46 6c  e(v, addrGosubFl
15050 75 73 68 29 3b 0a 20 20 7d 0a 0a 20 20 61 64 64  ush);.  }..  add
15060 72 45 6d 70 74 79 20 3d 20 73 71 6c 69 74 65 33  rEmpty = sqlite3
15070 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
15080 5f 52 65 77 69 6e 64 2c 20 63 73 72 57 72 69 74  _Rewind, csrWrit
15090 65 29 3b 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d  e);.  if( pMWin-
150a0 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44  >eEnd==TK_PRECED
150b0 49 4e 47 20 29 7b 0a 20 20 20 20 77 69 6e 64 6f  ING ){.    windo
150c0 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44  wCodeOp(&s, WIND
150d0 4f 57 5f 41 47 47 53 54 45 50 2c 20 72 65 67 45  OW_AGGSTEP, regE
150e0 6e 64 2c 20 30 29 3b 0a 20 20 20 20 77 69 6e 64  nd, 0);.    wind
150f0 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e  owCodeOp(&s, WIN
15100 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20  DOW_RETURN_ROW, 
15110 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69  0, 0);.  }else i
15120 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  f( pMWin->eStart
15130 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29  ==TK_FOLLOWING )
15140 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 53 74  {.    int addrSt
15150 61 72 74 3b 0a 20 20 20 20 69 6e 74 20 61 64 64  art;.    int add
15160 72 42 72 65 61 6b 31 3b 0a 20 20 20 20 69 6e 74  rBreak1;.    int
15170 20 61 64 64 72 42 72 65 61 6b 32 3b 0a 20 20 20   addrBreak2;.   
15180 20 69 6e 74 20 61 64 64 72 42 72 65 61 6b 33 3b   int addrBreak3;
15190 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f  .    windowCodeO
151a0 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47  p(&s, WINDOW_AGG
151b0 53 54 45 50 2c 20 30 2c 20 30 29 3b 0a 20 20 20  STEP, 0, 0);.   
151c0 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 54 79 70   if( pMWin->eTyp
151d0 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 29 7b 0a 20  e==TK_RANGE ){. 
151e0 20 20 20 20 20 61 64 64 72 53 74 61 72 74 20 3d       addrStart =
151f0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
15200 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
15210 20 20 61 64 64 72 42 72 65 61 6b 32 20 3d 20 77    addrBreak2 = w
15220 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20  indowCodeOp(&s, 
15230 57 49 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53  WINDOW_AGGINVERS
15240 45 2c 20 72 65 67 53 74 61 72 74 2c 20 31 29 3b  E, regStart, 1);
15250 0a 20 20 20 20 20 20 61 64 64 72 42 72 65 61 6b  .      addrBreak
15260 31 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70  1 = windowCodeOp
15270 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55  (&s, WINDOW_RETU
15280 52 4e 5f 52 4f 57 2c 20 30 2c 20 31 29 3b 0a 20  RN_ROW, 0, 1);. 
15290 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 69 66 28     }else.    if(
152a0 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b   pMWin->eEnd==TK
152b0 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20  _UNBOUNDED ){.  
152c0 20 20 20 20 61 64 64 72 53 74 61 72 74 20 3d 20      addrStart = 
152d0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
152e0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
152f0 20 61 64 64 72 42 72 65 61 6b 31 20 3d 20 77 69   addrBreak1 = wi
15300 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57  ndowCodeOp(&s, W
15310 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57  INDOW_RETURN_ROW
15320 2c 20 72 65 67 53 74 61 72 74 2c 20 31 29 3b 0a  , regStart, 1);.
15330 20 20 20 20 20 20 61 64 64 72 42 72 65 61 6b 32        addrBreak2
15340 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28   = windowCodeOp(
15350 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e  &s, WINDOW_AGGIN
15360 56 45 52 53 45 2c 20 30 2c 20 31 29 3b 0a 20 20  VERSE, 0, 1);.  
15370 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
15380 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 45  ssert( pMWin->eE
15390 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  nd==TK_FOLLOWING
153a0 20 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53 74   );.      addrSt
153b0 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
153c0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
153d0 0a 20 20 20 20 20 20 61 64 64 72 42 72 65 61 6b  .      addrBreak
153e0 31 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70  1 = windowCodeOp
153f0 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55  (&s, WINDOW_RETU
15400 52 4e 5f 52 4f 57 2c 20 72 65 67 45 6e 64 2c 20  RN_ROW, regEnd, 
15410 31 29 3b 0a 20 20 20 20 20 20 61 64 64 72 42 72  1);.      addrBr
15420 65 61 6b 32 20 3d 20 77 69 6e 64 6f 77 43 6f 64  eak2 = windowCod
15430 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41  eOp(&s, WINDOW_A
15440 47 47 49 4e 56 45 52 53 45 2c 20 72 65 67 53 74  GGINVERSE, regSt
15450 61 72 74 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  art, 1);.    }. 
15460 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15470 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
15480 20 30 2c 20 61 64 64 72 53 74 61 72 74 29 3b 0a   0, addrStart);.
15490 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
154a0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 42  umpHere(v, addrB
154b0 72 65 61 6b 32 29 3b 0a 20 20 20 20 61 64 64 72  reak2);.    addr
154c0 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
154d0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
154e0 29 3b 0a 20 20 20 20 61 64 64 72 42 72 65 61 6b  );.    addrBreak
154f0 33 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70  3 = windowCodeOp
15500 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45 54 55  (&s, WINDOW_RETU
15510 52 4e 5f 52 4f 57 2c 20 30 2c 20 31 29 3b 0a 20  RN_ROW, 0, 1);. 
15520 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15530 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
15540 20 30 2c 20 61 64 64 72 53 74 61 72 74 29 3b 0a   0, addrStart);.
15550 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
15560 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 42  umpHere(v, addrB
15570 72 65 61 6b 31 29 3b 0a 20 20 20 20 73 71 6c 69  reak1);.    sqli
15580 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
15590 76 2c 20 61 64 64 72 42 72 65 61 6b 33 29 3b 0a  v, addrBreak3);.
155a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
155b0 20 61 64 64 72 42 72 65 61 6b 3b 0a 20 20 20 20   addrBreak;.    
155c0 69 6e 74 20 61 64 64 72 53 74 61 72 74 3b 0a 20  int addrStart;. 
155d0 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28     windowCodeOp(
155e0 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 53 54  &s, WINDOW_AGGST
155f0 45 50 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 61  EP, 0, 0);.    a
15600 64 64 72 53 74 61 72 74 20 3d 20 73 71 6c 69 74  ddrStart = sqlit
15610 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
15620 72 28 76 29 3b 0a 20 20 20 20 61 64 64 72 42 72  r(v);.    addrBr
15630 65 61 6b 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65  eak = windowCode
15640 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45  Op(&s, WINDOW_RE
15650 54 55 52 4e 5f 52 4f 57 2c 20 30 2c 20 31 29 3b  TURN_ROW, 0, 1);
15660 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f  .    windowCodeO
15670 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47  p(&s, WINDOW_AGG
15680 49 4e 56 45 52 53 45 2c 20 72 65 67 53 74 61 72  INVERSE, regStar
15690 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 0);.    sqlit
156a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
156b0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
156c0 53 74 61 72 74 29 3b 0a 20 20 20 20 73 71 6c 69  Start);.    sqli
156d0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
156e0 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20  v, addrBreak);. 
156f0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
15700 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
15710 45 6d 70 74 79 29 3b 0a 0a 20 20 73 71 6c 69 74  Empty);..  sqlit
15720 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
15730 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20  OP_ResetSorter, 
15740 73 2e 63 75 72 72 65 6e 74 2e 63 73 72 29 3b 0a  s.current.csr);.
15750 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70 50 61    if( pMWin->pPa
15760 72 74 69 74 69 6f 6e 20 29 7b 0a 20 20 20 20 69  rtition ){.    i
15770 66 28 20 70 4d 57 69 6e 2d 3e 72 65 67 53 74 61  f( pMWin->regSta
15780 72 74 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  rtRowid ){.     
15790 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
157a0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
157b0 2c 20 31 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 53  , 1, pMWin->regS
157c0 74 61 72 74 52 6f 77 69 64 29 3b 0a 20 20 20 20  tartRowid);.    
157d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
157e0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
157f0 72 2c 20 30 2c 20 70 4d 57 69 6e 2d 3e 72 65 67  r, 0, pMWin->reg
15800 45 6e 64 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d  EndRowid);.    }
15810 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15820 43 68 61 6e 67 65 50 31 28 76 2c 20 61 64 64 72  ChangeP1(v, addr
15830 49 6e 74 65 67 65 72 2c 20 73 71 6c 69 74 65 33  Integer, sqlite3
15840 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
15850 76 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  v));.    sqlite3
15860 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
15870 5f 52 65 74 75 72 6e 2c 20 72 65 67 46 6c 75 73  _Return, regFlus
15880 68 50 61 72 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  hPart);.  }.}..#
15890 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
158a0 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20  OMIT_WINDOWFUNC 
158b0 2a 2f 0a                                         */.